From 3492b328834319c9503c0a34c50fb3f009556443 Mon Sep 17 00:00:00 2001 From: "Ju, Seokmann" Date: Thu, 17 Nov 2005 13:13:31 -0500 Subject: [SCSI] megaraid_legacy: removed PCI ID overlap from the driv er This patch fixes - PCI ID overlap issue - node name changed to 'megaraid_legacy' I hope this patch addresses concerns brought by Daniel Drake. Signed-off by: Seokmann Ju Signed-off-by: James Bottomley --- drivers/scsi/megaraid.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index f9792528e33..9fa41ccadef 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -2,7 +2,7 @@ * * Linux MegaRAID device driver * - * Copyright © 2002 LSI Logic Corporation. + * Copyright (c) 2002 LSI Logic Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -17,7 +17,8 @@ * Copyright (c) 2003 Christoph Hellwig * - new-style, hotplug-aware pci probing and scsi registration * - * Version : v2.00.3 (Feb 19, 2003) - Atul Mukker + * Version : v2.00.4 Mon Nov 14 14:02:43 EST 2005 - Seokmann Ju + * * * Description: Linux device driver for LSI Logic MegaRAID controller * @@ -51,10 +52,10 @@ #include "megaraid.h" -#define MEGARAID_MODULE_VERSION "2.00.3" +#define MEGARAID_MODULE_VERSION "2.00.4" -MODULE_AUTHOR ("LSI Logic Corporation"); -MODULE_DESCRIPTION ("LSI Logic MegaRAID driver"); +MODULE_AUTHOR ("sju@lsil.com"); +MODULE_DESCRIPTION ("LSI Logic MegaRAID legacy driver"); MODULE_LICENSE ("GPL"); MODULE_VERSION(MEGARAID_MODULE_VERSION); @@ -4553,7 +4554,7 @@ mega_internal_done(Scsi_Cmnd *scmd) static struct scsi_host_template megaraid_template = { .module = THIS_MODULE, .name = "MegaRAID", - .proc_name = "megaraid", + .proc_name = "megaraid_legacy", .info = megaraid_info, .queuecommand = megaraid_queue, .bios_param = megaraid_biosparam, @@ -5037,22 +5038,12 @@ megaraid_shutdown(struct pci_dev *pdev) } static struct pci_device_id megaraid_pci_tbl[] = { - {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DISCOVERY, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_PERC4_DI, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT}, - {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_PERC4_QC_VERDE, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, BOARD_64BIT}, {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_AMI_MEGARAID3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, - {PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, {0,} }; MODULE_DEVICE_TABLE(pci, megaraid_pci_tbl); @@ -5095,7 +5086,7 @@ static int __init megaraid_init(void) * First argument (major) to register_chrdev implies a dynamic * major number allocation. */ - major = register_chrdev(0, "megadev", &megadev_fops); + major = register_chrdev(0, "megadev_legacy", &megadev_fops); if (!major) { printk(KERN_WARNING "megaraid: failed to register char device\n"); @@ -5109,7 +5100,7 @@ static void __exit megaraid_exit(void) /* * Unregister the character device interface to the driver. */ - unregister_chrdev(major, "megadev"); + unregister_chrdev(major, "megadev_legacy"); pci_unregister_driver(&megaraid_pci_driver); -- cgit v1.2.3 From ed7e8ef7f12f5c3c8bbb85eeb0a1ded91c7c5dbf Mon Sep 17 00:00:00 2001 From: "Ju, Seokmann" Date: Thu, 17 Nov 2005 13:17:25 -0500 Subject: [SCSI] megaraid_{mbox,mm} : remove PCI Id overlaping between megaraid_legacy and megaraid_{mbox,mm} Signed-off-by: James Bottomley --- drivers/scsi/megaraid/Kconfig.megaraid | 2 - drivers/scsi/megaraid/megaraid_mbox.c | 82 ++++------------------------------ drivers/scsi/megaraid/megaraid_mbox.h | 4 +- 3 files changed, 11 insertions(+), 77 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/megaraid/Kconfig.megaraid b/drivers/scsi/megaraid/Kconfig.megaraid index 7363e12663a..17419e30ffc 100644 --- a/drivers/scsi/megaraid/Kconfig.megaraid +++ b/drivers/scsi/megaraid/Kconfig.megaraid @@ -64,7 +64,6 @@ config MEGARAID_MAILBOX To compile this driver as a module, choose M here: the module will be called megaraid_mbox -if MEGARAID_NEWGEN=n config MEGARAID_LEGACY tristate "LSI Logic Legacy MegaRAID Driver" depends on PCI && SCSI @@ -75,7 +74,6 @@ config MEGARAID_LEGACY To compile this driver as a module, choose M here: the module will be called megaraid -endif config MEGARAID_SAS tristate "LSI Logic MegaRAID SAS RAID Module" diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index 4b5d420d2f4..d18a4bc2498 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c @@ -10,12 +10,13 @@ * 2 of the License, or (at your option) any later version. * * FILE : megaraid_mbox.c - * Version : v2.20.4.6 (Mar 07 2005) + * Version : v2.20.4.7 (Nov 14 2005) * * Authors: * Atul Mukker * Sreenivas Bagalkote * Manoj Jose + * Seokmann Ju * * List of supported controllers * @@ -136,7 +137,7 @@ static int wait_till_fw_empty(adapter_t *); -MODULE_AUTHOR("LSI Logic Corporation"); +MODULE_AUTHOR("sju@lsil.com"); MODULE_DESCRIPTION("LSI Logic MegaRAID Mailbox Driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(MEGARAID_VERSION); @@ -278,68 +279,14 @@ static struct pci_device_id pci_id_table_g[] = { { PCI_VENDOR_ID_AMI, PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_VENDOR_ID_DELL, - PCI_SUBSYS_ID_PERC3_QC, - }, - { - PCI_VENDOR_ID_AMI, - PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_VENDOR_ID_DELL, - PCI_SUBSYS_ID_PERC3_DC, - }, - { - PCI_VENDOR_ID_AMI, - PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_VENDOR_ID_DELL, - PCI_SUBSYS_ID_PERC3_SC, - }, - { - PCI_VENDOR_ID_AMI, - PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_VENDOR_ID_AMI, - PCI_SUBSYS_ID_PERC3_SC, - }, - { - PCI_VENDOR_ID_AMI, - PCI_DEVICE_ID_AMI_MEGARAID3, - PCI_VENDOR_ID_AMI, - PCI_SUBSYS_ID_PERC3_DC, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_SCSI_320_0, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_SCSI_320_0, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_SCSI_320_1, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_SCSI_320_1, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_SCSI_320_2, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_SCSI_320_2, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_I4_133_RAID, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_I4_133_RAID, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_SATA_150_4, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_SATA_150_4, + PCI_ANY_ID, + PCI_ANY_ID, }, { PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_MEGARAID_SATA_150_6, - PCI_VENDOR_ID_LSI_LOGIC, - PCI_SUBSYS_ID_MEGARAID_SATA_150_6, + PCI_DEVICE_ID_AMI_MEGARAID3, + PCI_ANY_ID, + PCI_ANY_ID, }, { PCI_VENDOR_ID_LSI_LOGIC, @@ -347,18 +294,6 @@ static struct pci_device_id pci_id_table_g[] = { PCI_ANY_ID, PCI_ANY_ID, }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_INTEL_RAID_SRCS16, - PCI_VENDOR_ID_INTEL, - PCI_SUBSYS_ID_INTEL_RAID_SRCS16, - }, - { - PCI_VENDOR_ID_LSI_LOGIC, - PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK, - PCI_VENDOR_ID_INTEL, - PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK, - }, {0} /* Terminating entry */ }; MODULE_DEVICE_TABLE(pci, pci_id_table_g); @@ -2985,6 +2920,7 @@ mbox_post_sync_cmd_fast(adapter_t *adapter, uint8_t raw_mbox[]) for (i = 0; i < 0xFFFFF; i++) { if (mbox->numstatus != 0xFF) break; + rmb(); } if (i == 0xFFFFF) { diff --git a/drivers/scsi/megaraid/megaraid_mbox.h b/drivers/scsi/megaraid/megaraid_mbox.h index 644b91bdb02..882fb1a0b57 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.h +++ b/drivers/scsi/megaraid/megaraid_mbox.h @@ -21,8 +21,8 @@ #include "megaraid_ioctl.h" -#define MEGARAID_VERSION "2.20.4.6" -#define MEGARAID_EXT_VERSION "(Release Date: Mon Mar 07 12:27:22 EST 2005)" +#define MEGARAID_VERSION "2.20.4.7" +#define MEGARAID_EXT_VERSION "(Release Date: Mon Nov 14 12:27:22 EST 2005)" /* -- cgit v1.2.3 From ce155ccecd4094e7b5e68058d26db691713240fc Mon Sep 17 00:00:00 2001 From: "brking@us.ibm.com" Date: Thu, 17 Nov 2005 09:35:12 -0600 Subject: [SCSI] ipr: Driver initialization fix for kexec/kdump When kexec booting a kernel when the previous kernel did not call ipr's shutdown method, the ipr adapter does not get properly initialized, which can result in the ipr adapter completing commands issued by the previous kernel. Fix ipr to detect this scenario by reading the adapter's interrupt mask register and the microprocessor interrupt register. If the interrupt mask register indicates that interrupts are enabled or the reset alert bit is set when the card is probed, this means the card is in an unknown state and we hard reset the card. Signed-off-by: Brian King Signed-off-by: James Bottomley --- drivers/scsi/ipr.c | 17 ++++++++++++++++- drivers/scsi/ipr.h | 5 +++-- 2 files changed, 19 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index fa2cb3582cf..b6714da4d6e 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -5887,7 +5887,12 @@ static int __devinit ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg) ENTER; spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags); dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg); - _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, IPR_SHUTDOWN_NONE); + if (ioa_cfg->needs_hard_reset) { + ioa_cfg->needs_hard_reset = 0; + ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE); + } else + _ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa, + IPR_SHUTDOWN_NONE); spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags); wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload); @@ -6264,6 +6269,7 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, unsigned long ipr_regs_pci; void __iomem *ipr_regs; u32 rc = PCIBIOS_SUCCESSFUL; + volatile u32 mask, uproc; ENTER; @@ -6356,6 +6362,15 @@ static int __devinit ipr_probe_ioa(struct pci_dev *pdev, goto cleanup_nomem; } + /* + * If HRRQ updated interrupt is not masked, or reset alert is set, + * the card is in an unknown state and needs a hard reset + */ + mask = readl(ioa_cfg->regs.sense_interrupt_mask_reg); + uproc = readl(ioa_cfg->regs.sense_uproc_interrupt_reg); + if ((mask & IPR_PCII_HRRQ_UPDATED) == 0 || (uproc & IPR_UPROCI_RESET_ALERT)) + ioa_cfg->needs_hard_reset = 1; + ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER); rc = request_irq(pdev->irq, ipr_isr, SA_SHIRQ, IPR_NAME, ioa_cfg); diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index 6bec673c925..b639332131f 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h @@ -36,8 +36,8 @@ /* * Literals */ -#define IPR_DRIVER_VERSION "2.1.0" -#define IPR_DRIVER_DATE "(October 31, 2005)" +#define IPR_DRIVER_VERSION "2.1.1" +#define IPR_DRIVER_DATE "(November 15, 2005)" /* * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding @@ -922,6 +922,7 @@ struct ipr_ioa_cfg { u8 dump_taken:1; u8 allow_cmds:1; u8 allow_ml_add_del:1; + u8 needs_hard_reset:1; enum ipr_cache_state cache_state; u16 type; /* CCIN of the card */ -- cgit v1.2.3 From 0ad78200baf1f85a21e6b26c225717ad80980d8f Mon Sep 17 00:00:00 2001 From: Arjan van de Ven Date: Mon, 28 Nov 2005 16:22:25 +0100 Subject: [SCSI] Mark some core scsi data structures const patch below marks a few scsi core datastructures as const, so that they end up in the .rodata section and don't cacheline share with things that get dirtied Signed-off-by: Arjan van de Ven Signed-off-by: James Bottomley --- drivers/scsi/ch.c | 4 ++-- drivers/scsi/constants.c | 16 ++++++++-------- drivers/scsi/raid_class.c | 2 +- drivers/scsi/scsi_scan.c | 2 +- drivers/scsi/scsi_sysfs.c | 4 ++-- drivers/scsi/scsi_transport_fc.c | 8 ++++---- drivers/scsi/sr.c | 2 +- drivers/scsi/st.c | 4 ++-- 8 files changed, 21 insertions(+), 21 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index ccbbae2bf47..0920220f331 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -75,7 +75,7 @@ static int vendor_counts[CH_TYPES-4]; module_param_array(vendor_firsts, int, NULL, 0444); module_param_array(vendor_counts, int, NULL, 0444); -static char *vendor_labels[CH_TYPES-4] = { +static const char * vendor_labels[CH_TYPES-4] = { "v0", "v1", "v2", "v3" }; // module_param_string_array(vendor_labels, NULL, 0444); @@ -140,7 +140,7 @@ static struct file_operations changer_fops = #endif }; -static struct { +static const struct { unsigned char sense; unsigned char asc; unsigned char ascq; diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index 09bc81557b6..a972c1e89e3 100644 --- a/drivers/scsi/constants.c +++ b/drivers/scsi/constants.c @@ -1065,7 +1065,7 @@ struct error_info2 { const char * fmt; }; -static struct error_info2 additional2[] = +static const struct error_info2 additional2[] = { {0x40,0x00,0x7f,"Ram failure (%x)"}, {0x40,0x80,0xff,"Diagnostic failure on component (%x)"}, @@ -1077,7 +1077,7 @@ static struct error_info2 additional2[] = }; /* description of the sense key values */ -static const char *snstext[] = { +static const char * const snstext[] = { "No Sense", /* 0: There is no sense information */ "Recovered Error", /* 1: The last command completed successfully but used error correction */ @@ -1279,7 +1279,7 @@ void scsi_print_req_sense(const char *devclass, struct scsi_request *sreq) EXPORT_SYMBOL(scsi_print_req_sense); #ifdef CONFIG_SCSI_CONSTANTS -static const char *one_byte_msgs[] = { +static const char * const one_byte_msgs[] = { /* 0x00 */ "Command Complete", NULL, "Save Pointers", /* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", /* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error", @@ -1289,13 +1289,13 @@ static const char *one_byte_msgs[] = { }; #define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs) / sizeof (const char *)) -static const char *two_byte_msgs[] = { +static const char * const two_byte_msgs[] = { /* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag" /* 0x23 */ "Ignore Wide Residue" }; #define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) -static const char *extended_msgs[] = { +static const char * const extended_msgs[] = { /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", /* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" }; @@ -1397,7 +1397,7 @@ EXPORT_SYMBOL(scsi_print_command); #ifdef CONFIG_SCSI_CONSTANTS -static const char * hostbyte_table[]={ +static const char * const hostbyte_table[]={ "DID_OK", "DID_NO_CONNECT", "DID_BUS_BUSY", "DID_TIME_OUT", "DID_BAD_TARGET", "DID_ABORT", "DID_PARITY", "DID_ERROR", "DID_RESET", "DID_BAD_INTR", "DID_PASSTHROUGH", "DID_SOFT_ERROR", "DID_IMM_RETRY"}; @@ -1422,12 +1422,12 @@ void scsi_print_hostbyte(int scsiresult) #ifdef CONFIG_SCSI_CONSTANTS -static const char * driverbyte_table[]={ +static const char * const driverbyte_table[]={ "DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR", "DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD", "DRIVER_SENSE"}; #define NUM_DRIVERBYTE_STRS (sizeof(driverbyte_table) / sizeof(const char *)) -static const char * driversuggest_table[]={"SUGGEST_OK", +static const char * const driversuggest_table[]={"SUGGEST_OK", "SUGGEST_RETRY", "SUGGEST_ABORT", "SUGGEST_REMAP", "SUGGEST_DIE", "SUGGEST_5", "SUGGEST_6", "SUGGEST_7", "SUGGEST_SENSE"}; #define NUM_SUGGEST_STRS (sizeof(driversuggest_table) / sizeof(const char *)) diff --git a/drivers/scsi/raid_class.c b/drivers/scsi/raid_class.c index 5b1c12041a4..5ec5f44602a 100644 --- a/drivers/scsi/raid_class.c +++ b/drivers/scsi/raid_class.c @@ -115,7 +115,7 @@ static DECLARE_TRANSPORT_CLASS(raid_class, raid_remove, NULL); -static struct { +static const struct { enum raid_state value; char *name; } raid_states[] = { diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 94e5167f260..950b087e4ca 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -74,7 +74,7 @@ #define SCSI_SCAN_TARGET_PRESENT 1 #define SCSI_SCAN_LUN_PRESENT 2 -static char *scsi_null_device_strs = "nullnullnullnull"; +static const char *scsi_null_device_strs = "nullnullnullnull"; #define MAX_SCSI_LUNS 512 diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 46349293de0..15842b1f0f4 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -21,7 +21,7 @@ #include "scsi_priv.h" #include "scsi_logging.h" -static struct { +static const struct { enum scsi_device_state value; char *name; } sdev_states[] = { @@ -48,7 +48,7 @@ const char *scsi_device_state_name(enum scsi_device_state state) return name; } -static struct { +static const struct { enum scsi_host_state value; char *name; } shost_states[] = { diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 6cd5931d9a5..cd95d2ae7b7 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -111,7 +111,7 @@ fc_enum_name_search(port_state, fc_port_state, fc_port_state_names) /* Convert fc_tgtid_binding_type values to ascii string name */ -static struct { +static const struct { enum fc_tgtid_binding_type value; char *name; int matchlen; @@ -149,7 +149,7 @@ get_fc_##title##_names(u32 table_key, char *buf) \ /* Convert FC_COS bit values to ascii string name */ -static struct { +static const struct { u32 value; char *name; } fc_cos_names[] = { @@ -163,7 +163,7 @@ fc_bitfield_name_search(cos, fc_cos_names) /* Convert FC_PORTSPEED bit values to ascii string name */ -static struct { +static const struct { u32 value; char *name; } fc_port_speed_names[] = { @@ -189,7 +189,7 @@ show_fc_fc4s (char *buf, u8 *fc4_list) /* Convert FC_RPORT_ROLE bit values to ascii string name */ -static struct { +static const struct { u32 value; char *name; } fc_remote_port_role_names[] = { diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index d68cea753bb..a3fa64cf665 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -730,7 +730,7 @@ static void get_capabilities(struct scsi_cd *cd) unsigned int the_result; int retries, rc, n; - static char *loadmech[] = + static const char *loadmech[] = { "caddy", "tray", diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 7ac6ea141ff..6d9078705c5 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -17,7 +17,7 @@ Last modified: 18-JAN-1998 Richard Gooch Devfs support */ -static char *verstr = "20050830"; +static const char *verstr = "20050830"; #include @@ -134,7 +134,7 @@ static struct st_dev_parm { #endif /* Bit reversed order to get same names for same minors with all mode counts */ -static char *st_formats[] = { +static const char *st_formats[] = { "", "r", "k", "s", "l", "t", "o", "u", "m", "v", "p", "x", "a", "y", "q", "z"}; -- cgit v1.2.3 From 493ff4ee7f93a2b53ed60197e05aa145eec8f8f5 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 17 Nov 2005 11:13:43 -0700 Subject: [SCSI] Delete trailing full stop None of the other domain validation messages have a trailing full stop, so I don't see why this one should. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 38a53b5f9e9..4002a98ab16 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -1041,7 +1041,7 @@ void spi_display_xfer_agreement(struct scsi_target *starget) tp->hold_mcs ? " HMCS" : "", tmp, tp->offset); } else { - dev_info(&starget->dev, "%sasynchronous.\n", + dev_info(&starget->dev, "%sasynchronous\n", tp->width ? "wide " : ""); } } -- cgit v1.2.3 From 26a68019c86e1d1782984a7a5babff762cde1501 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 29 Nov 2005 21:03:34 +0100 Subject: [SCSI] scsi_lib: stricter checks for clearing use_10_for_rw Check the asc and ascq for being "invalid command opcode" as well. Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ce9d73a292e..1f2782767ca 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -884,7 +884,8 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, * system where READ CAPACITY failed, we may have read * past the end of the disk. */ - if (cmd->device->use_10_for_rw && + if ((cmd->device->use_10_for_rw && + sshdr.asc == 0x20 && sshdr.ascq == 0x00) && (cmd->cmnd[0] == READ_10 || cmd->cmnd[0] == WRITE_10)) { cmd->device->use_10_for_rw = 0; -- cgit v1.2.3 From 5433383ef33ed40c9c8a86a4355da344234af2a5 Mon Sep 17 00:00:00 2001 From: Andrew Vasquez Date: Wed, 9 Nov 2005 15:49:04 -0800 Subject: [SCSI] qla2xxx: Add full firmware(-request) hotplug support for all ISPs. Transition driver to exclusively use the request_firmware() interfaces to retrieve firmware-blobs from user-space. This will be the default behaviour going forward until the embedded firmware-binary images are removed from the upstream kernel. Upon request, the driver caches the firmware image until the driver is unloaded. NOTE: The option is present to allow the user to continue to use the firmware-loader modules, but, should be considered deprecated. Signed-off-by: Andrew Vasquez Rejections fixed up and Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/Kconfig | 69 +++++++++------ drivers/scsi/qla2xxx/Makefile | 2 + drivers/scsi/qla2xxx/qla_attr.c | 2 +- drivers/scsi/qla2xxx/qla_def.h | 24 ++++- drivers/scsi/qla2xxx/qla_gbl.h | 4 +- drivers/scsi/qla2xxx/qla_init.c | 189 +++++++++++++++++++++++++++++----------- drivers/scsi/qla2xxx/qla_os.c | 156 +++++++++++++++++++++++++++++---- 7 files changed, 348 insertions(+), 98 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig index c1c1c687bcb..5205c4e7d6f 100644 --- a/drivers/scsi/qla2xxx/Kconfig +++ b/drivers/scsi/qla2xxx/Kconfig @@ -1,55 +1,70 @@ config SCSI_QLA2XXX - tristate - default (SCSI && PCI) - depends on SCSI && PCI + tristate "QLogic QLA2XXX Fibre Channel Support" + depends on PCI && SCSI + select SCSI_FC_ATTRS + select FW_LOADER + ---help--- + This qla2xxx driver supports all QLogic Fibre Channel + PCI and PCIe host adapters. -config SCSI_QLA21XX - tristate "QLogic ISP2100 host adapter family support" + By default, firmware for the ISP parts will be loaded + via the Firmware Loader interface. + + ISP Firmware Filename + ---------- ----------------- + 21xx ql2100_fw.bin + 22xx ql2200_fw.bin + 2300, 2312 ql2300_fw.bin + 2322 ql2322_fw.bin + 6312, 6322 ql6312_fw.bin + 24xx ql2400_fw.bin + + Upon request, the driver caches the firmware image until + the driver is unloaded. + + NOTE: The original method of building firmware-loader + modules has been deprecated as the firmware-images will + be removed from the kernel sources. + +config SCSI_QLA2XXX_EMBEDDED_FIRMWARE + bool " Use firmware-loader modules (DEPRECATED)" depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + +config SCSI_QLA21XX + tristate " Build QLogic ISP2100 firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 21xx (ISP2100) host adapter family. config SCSI_QLA22XX - tristate "QLogic ISP2200 host adapter family support" - depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + tristate " Build QLogic ISP2200 firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 22xx (ISP2200) host adapter family. config SCSI_QLA2300 - tristate "QLogic ISP2300 host adapter family support" - depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + tristate " Build QLogic ISP2300 firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 2300 (ISP2300 and ISP2312) host adapter family. config SCSI_QLA2322 - tristate "QLogic ISP2322 host adapter family support" - depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + tristate " Build QLogic ISP2322 firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 2322 (ISP2322) host adapter family. config SCSI_QLA6312 - tristate "QLogic ISP63xx host adapter family support" - depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + tristate " Build QLogic ISP63xx firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 63xx (ISP6312 and ISP6322) host adapter family. config SCSI_QLA24XX - tristate "QLogic ISP24xx host adapter family support" - depends on SCSI_QLA2XXX - select SCSI_FC_ATTRS - select FW_LOADER + tristate " Build QLogic ISP24xx firmware-module" + depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 24xx (ISP2422 and ISP2432) host adapter family. diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile index b169687d08f..549dfe41020 100644 --- a/drivers/scsi/qla2xxx/Makefile +++ b/drivers/scsi/qla2xxx/Makefile @@ -3,6 +3,8 @@ EXTRA_CFLAGS += -DUNIQUE_FW_NAME qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \ qla_dbg.o qla_sup.o qla_rscn.o qla_attr.o +obj-$(CONFIG_SCSI_QLA2XXX) += qla2xxx.o + qla2100-y := ql2100.o ql2100_fw.o qla2200-y := ql2200.o ql2200_fw.o qla2300-y := ql2300.o ql2300_fw.o diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 48e460eef05..2efca52dff5 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -232,7 +232,7 @@ static ssize_t qla2x00_isp_name_show(struct class_device *cdev, char *buf) { scsi_qla_host_t *ha = to_qla_host(class_to_shost(cdev)); - return snprintf(buf, PAGE_SIZE, "%s\n", ha->brd_info->isp_name); + return snprintf(buf, PAGE_SIZE, "ISP%04X\n", ha->pdev->device); } static ssize_t diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 7096945ea23..ce0d88bbaa0 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,7 @@ #include #include +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) #if defined(CONFIG_SCSI_QLA21XX) || defined(CONFIG_SCSI_QLA21XX_MODULE) #define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100) #else @@ -79,9 +81,23 @@ #define IS_QLA2522(ha) 0 #endif +#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ + +#define IS_QLA2100(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2100) +#define IS_QLA2200(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2200) +#define IS_QLA2300(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2300) +#define IS_QLA2312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2312) +#define IS_QLA2322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2322) +#define IS_QLA6312(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6312) +#define IS_QLA6322(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP6322) +#define IS_QLA2422(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422) +#define IS_QLA2432(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432) +#define IS_QLA2512(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2512) +#define IS_QLA2522(ha) ((ha)->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2522) +#endif + #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ IS_QLA6312(ha) || IS_QLA6322(ha)) - #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) #define IS_QLA25XX(ha) (IS_QLA2512(ha) || IS_QLA2522(ha)) @@ -2124,6 +2140,12 @@ struct qla_board_info { struct scsi_host_template *sht; }; +struct fw_blob { + char *name; + uint32_t segs[4]; + const struct firmware *fw; +}; + /* Return data from MBC_GET_ID_LIST call. */ struct gid_list_info { uint8_t al_pa; diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index fedcb0d3fc7..bec81adcf4f 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -33,8 +33,8 @@ extern int qla24xx_nvram_config(struct scsi_qla_host *); extern void qla2x00_update_fw_options(struct scsi_qla_host *); extern void qla24xx_update_fw_options(scsi_qla_host_t *); extern int qla2x00_load_risc(struct scsi_qla_host *, uint32_t *); +extern int qla24xx_load_risc(scsi_qla_host_t *, uint32_t *); extern int qla24xx_load_risc_flash(scsi_qla_host_t *, uint32_t *); -extern int qla24xx_load_risc_hotplug(scsi_qla_host_t *, uint32_t *); extern fc_port_t *qla2x00_alloc_fcport(scsi_qla_host_t *, gfp_t); @@ -76,6 +76,8 @@ extern void qla2x00_blink_led(scsi_qla_host_t *); extern int qla2x00_down_timeout(struct semaphore *, unsigned long); +extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *); + /* * Global Function Prototypes in qla_iocb.c source file. */ diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 2d720121a0d..13e2aaf5676 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -8,7 +8,6 @@ #include #include -#include #include #include "qla_devtbl.h" @@ -3484,17 +3483,16 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) return (rval); } +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) + int qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) { - int rval; - uint16_t cnt; - uint16_t *risc_code; - unsigned long risc_address; - unsigned long risc_code_size; - int num; - int i; - uint16_t *req_ring; + int rval, num, i; + uint32_t cnt; + uint16_t *risc_code; + uint32_t risc_addr, risc_size; + uint16_t *req_ring; struct qla_fw_info *fw_iter; rval = QLA_SUCCESS; @@ -3504,37 +3502,29 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) *srisc_addr = *ha->brd_info->fw_info->fwstart; while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { risc_code = fw_iter->fwcode; - risc_code_size = *fw_iter->fwlen; - - if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { - risc_address = *fw_iter->fwstart; - } else { - /* Extended address */ - risc_address = *fw_iter->lfwstart; - } + risc_size = *fw_iter->fwlen; + if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) + risc_addr = *fw_iter->fwstart; + else + risc_addr = *fw_iter->lfwstart; num = 0; rval = 0; - while (risc_code_size > 0 && !rval) { + while (risc_size > 0 && !rval) { cnt = (uint16_t)(ha->fw_transfer_size >> 1); - if (cnt > risc_code_size) - cnt = risc_code_size; + if (cnt > risc_size) + cnt = risc_size; DEBUG7(printk("scsi(%ld): Loading risc segment@ " "addr %p, number of bytes 0x%x, offset 0x%lx.\n", - ha->host_no, risc_code, cnt, risc_address)); + ha->host_no, risc_code, cnt, risc_addr)); req_ring = (uint16_t *)ha->request_ring; for (i = 0; i < cnt; i++) req_ring[i] = cpu_to_le16(risc_code[i]); - if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { - rval = qla2x00_load_ram(ha, ha->request_dma, - risc_address, cnt); - } else { - rval = qla2x00_load_ram_ext(ha, - ha->request_dma, risc_address, cnt); - } + rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr, + cnt); if (rval) { DEBUG(printk("scsi(%ld): [ERROR] Failed to " "load segment %d of firmware\n", @@ -3548,16 +3538,15 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) } risc_code += cnt; - risc_address += cnt; - risc_code_size -= cnt; + risc_addr += cnt; + risc_size -= cnt; num++; } /* Next firmware sequence */ fw_iter++; } - - return (rval); + return rval; } int @@ -3642,8 +3631,108 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) return rval; } +#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ + int -qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) +qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) +{ + int rval; + int i, fragment; + uint16_t *wcode, *fwcode; + uint32_t risc_addr, risc_size, fwclen, wlen, *seg; + struct fw_blob *blob; + + /* Load firmware blob. */ + blob = qla2x00_request_firmware(ha); + if (!blob) { + qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n"); + return QLA_FUNCTION_FAILED; + } + + rval = QLA_SUCCESS; + + wcode = (uint16_t *)ha->request_ring; + *srisc_addr = 0; + fwcode = (uint16_t *)blob->fw->data; + fwclen = 0; + + /* Validate firmware image by checking version. */ + if (blob->fw->size < 8 * sizeof(uint16_t)) { + qla_printk(KERN_WARNING, ha, + "Unable to verify integrity of firmware image (%Zd)!\n", + blob->fw->size); + goto fail_fw_integrity; + } + for (i = 0; i < 4; i++) + wcode[i] = be16_to_cpu(fwcode[i + 4]); + if ((wcode[0] == 0xffff && wcode[1] == 0xffff && wcode[2] == 0xffff && + wcode[3] == 0xffff) || (wcode[0] == 0 && wcode[1] == 0 && + wcode[2] == 0 && wcode[3] == 0)) { + qla_printk(KERN_WARNING, ha, + "Unable to verify integrity of firmware image!\n"); + qla_printk(KERN_WARNING, ha, + "Firmware data: %04x %04x %04x %04x!\n", wcode[0], + wcode[1], wcode[2], wcode[3]); + goto fail_fw_integrity; + } + + seg = blob->segs; + while (*seg && rval == QLA_SUCCESS) { + risc_addr = *seg; + *srisc_addr = *srisc_addr == 0 ? *seg : *srisc_addr; + risc_size = be16_to_cpu(fwcode[3]); + + /* Validate firmware image size. */ + fwclen += risc_size * sizeof(uint16_t); + if (blob->fw->size < fwclen) { + qla_printk(KERN_WARNING, ha, + "Unable to verify integrity of firmware image " + "(%Zd)!\n", blob->fw->size); + goto fail_fw_integrity; + } + + fragment = 0; + while (risc_size > 0 && rval == QLA_SUCCESS) { + wlen = (uint16_t)(ha->fw_transfer_size >> 1); + if (wlen > risc_size) + wlen = risc_size; + + DEBUG7(printk("scsi(%ld): Loading risc segment@ risc " + "addr %x, number of words 0x%x.\n", ha->host_no, + risc_addr, wlen)); + + for (i = 0; i < wlen; i++) + wcode[i] = swab16(fwcode[i]); + + rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr, + wlen); + if (rval) { + DEBUG(printk("scsi(%ld):[ERROR] Failed to load " + "segment %d of firmware\n", ha->host_no, + fragment)); + qla_printk(KERN_WARNING, ha, + "[ERROR] Failed to load segment %d of " + "firmware\n", fragment); + break; + } + + fwcode += wlen; + risc_addr += wlen; + risc_size -= wlen; + fragment++; + } + + /* Next segment. */ + seg++; + } + return rval; + +fail_fw_integrity: + return QLA_FUNCTION_FAILED; +} + +int +qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) { int rval; int segments, fragment; @@ -3651,14 +3740,13 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) uint32_t risc_addr; uint32_t risc_size; uint32_t i; - const struct firmware *fw_entry; + struct fw_blob *blob; uint32_t *fwcode, fwclen; - if (request_firmware(&fw_entry, ha->brd_info->fw_fname, - &ha->pdev->dev)) { - qla_printk(KERN_ERR, ha, - "Firmware image file not available: '%s'\n", - ha->brd_info->fw_fname); + /* Load firmware blob. */ + blob = qla2x00_request_firmware(ha); + if (!blob) { + qla_printk(KERN_ERR, ha, "Firmware image unavailable.\n"); return QLA_FUNCTION_FAILED; } @@ -3667,14 +3755,14 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) segments = FA_RISC_CODE_SEGMENTS; dcode = (uint32_t *)ha->request_ring; *srisc_addr = 0; - fwcode = (uint32_t *)fw_entry->data; + fwcode = (uint32_t *)blob->fw->data; fwclen = 0; /* Validate firmware image by checking version. */ - if (fw_entry->size < 8 * sizeof(uint32_t)) { + if (blob->fw->size < 8 * sizeof(uint32_t)) { qla_printk(KERN_WARNING, ha, - "Unable to verify integrity of flash firmware image " - "(%Zd)!\n", fw_entry->size); + "Unable to verify integrity of firmware image (%Zd)!\n", + blob->fw->size); goto fail_fw_integrity; } for (i = 0; i < 4; i++) @@ -3684,7 +3772,7 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) (dcode[0] == 0 && dcode[1] == 0 && dcode[2] == 0 && dcode[3] == 0)) { qla_printk(KERN_WARNING, ha, - "Unable to verify integrity of flash firmware image!\n"); + "Unable to verify integrity of firmware image!\n"); qla_printk(KERN_WARNING, ha, "Firmware data: %08x %08x %08x %08x!\n", dcode[0], dcode[1], dcode[2], dcode[3]); @@ -3698,10 +3786,11 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) /* Validate firmware image size. */ fwclen += risc_size * sizeof(uint32_t); - if (fw_entry->size < fwclen) { + if (blob->fw->size < fwclen) { qla_printk(KERN_WARNING, ha, - "Unable to verify integrity of flash firmware " - "image (%Zd)!\n", fw_entry->size); + "Unable to verify integrity of firmware image " + "(%Zd)!\n", blob->fw->size); + goto fail_fw_integrity; } @@ -3739,13 +3828,9 @@ qla24xx_load_risc_hotplug(scsi_qla_host_t *ha, uint32_t *srisc_addr) /* Next segment. */ segments--; } - - release_firmware(fw_entry); return rval; fail_fw_integrity: - - release_firmware(fw_entry); return QLA_FUNCTION_FAILED; - } +#endif diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index c58c9d97b04..47db029b2fc 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -54,11 +54,6 @@ module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(ql2xloginretrycount, "Specify an alternate value for the NVRAM login retry count."); -int ql2xfwloadbin=1; -module_param(ql2xfwloadbin, int, S_IRUGO|S_IRUSR); -MODULE_PARM_DESC(ql2xfwloadbin, - "Load ISP2xxx firmware image via hotplug."); - static void qla2x00_free_device(scsi_qla_host_t *); static void qla2x00_config_dma_addressing(scsi_qla_host_t *ha); @@ -1261,12 +1256,16 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) char pci_info[20]; char fw_str[30]; fc_port_t *fcport; + struct scsi_host_template *sht; if (pci_enable_device(pdev)) goto probe_out; - host = scsi_host_alloc(brd_info->sht ? brd_info->sht: - &qla2x00_driver_template, sizeof(scsi_qla_host_t)); + sht = &qla2x00_driver_template; + if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 || + pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432) + sht = &qla24xx_driver_template; + host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); if (host == NULL) { printk(KERN_WARNING "qla2xxx: Couldn't allocate host from scsi layer!\n"); @@ -1291,8 +1290,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) goto probe_failed; qla_printk(KERN_INFO, ha, - "Found an %s, irq %d, iobase 0x%p\n", ha->brd_info->isp_name, - pdev->irq, ha->iobase); + "Found an ISP%04X, irq %d, iobase 0x%p\n", pdev->device, pdev->irq, + ha->iobase); spin_lock_init(&ha->hardware_lock); @@ -1368,9 +1367,11 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.reset_adapter = qla24xx_reset_adapter; ha->isp_ops.nvram_config = qla24xx_nvram_config; ha->isp_ops.update_fw_options = qla24xx_update_fw_options; +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) ha->isp_ops.load_risc = qla24xx_load_risc_flash; - if (ql2xfwloadbin) - ha->isp_ops.load_risc = qla24xx_load_risc_hotplug; +#else + ha->isp_ops.load_risc = qla24xx_load_risc; +#endif ha->isp_ops.pci_info_str = qla24xx_pci_info_str; ha->isp_ops.fw_version_str = qla24xx_fw_version_str; ha->isp_ops.intr_handler = qla24xx_intr_handler; @@ -1531,11 +1532,12 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) qla_printk(KERN_INFO, ha, "\n" " QLogic Fibre Channel HBA Driver: %s\n" " QLogic %s - %s\n" - " %s: %s @ %s hdma%c, host#=%ld, fw=%s\n", qla2x00_version_str, - ha->model_number, ha->model_desc ? ha->model_desc: "", - ha->brd_info->isp_name, ha->isp_ops.pci_info_str(ha, pci_info), - pci_name(pdev), ha->flags.enable_64bit_addressing ? '+': '-', - ha->host_no, ha->isp_ops.fw_version_str(ha, fw_str)); + " ISP%04X: %s @ %s hdma%c, host#=%ld, fw=%s\n", + qla2x00_version_str, ha->model_number, + ha->model_desc ? ha->model_desc: "", pdev->device, + ha->isp_ops.pci_info_str(ha, pci_info), pci_name(pdev), + ha->flags.enable_64bit_addressing ? '+': '-', ha->host_no, + ha->isp_ops.fw_version_str(ha, fw_str)); /* Go with fc_rport registration. */ list_for_each_entry(fcport, &ha->fcports, list) @@ -2483,6 +2485,10 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) return -ETIMEDOUT; } +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) + +#define qla2x00_release_firmware() do { } while (0) + static struct qla_board_info qla_board_tbl[] = { { .drv_name = "qla2400", @@ -2530,8 +2536,122 @@ qla2xxx_remove_one(struct pci_dev *pdev) qla2x00_remove_one(pdev); } +#else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ + +/* Firmware interface routines. */ + +#define FW_BLOBS 6 +#define FW_ISP21XX 0 +#define FW_ISP22XX 1 +#define FW_ISP2300 2 +#define FW_ISP2322 3 +#define FW_ISP63XX 4 +#define FW_ISP24XX 5 + +static DECLARE_MUTEX(qla_fw_lock); + +static struct fw_blob qla_fw_blobs[FW_BLOBS] = { + { .name = "ql2100_fw.bin", .segs = { 0x1000, 0 }, }, + { .name = "ql2200_fw.bin", .segs = { 0x1000, 0 }, }, + { .name = "ql2300_fw.bin", .segs = { 0x800, 0 }, }, + { .name = "ql2322_fw.bin", .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, + { .name = "ql6312_fw.bin", .segs = { 0x800, 0 }, }, + { .name = "ql2400_fw.bin", }, +}; + +struct fw_blob * +qla2x00_request_firmware(scsi_qla_host_t *ha) +{ + struct fw_blob *blob; + + blob = NULL; + if (IS_QLA2100(ha)) { + blob = &qla_fw_blobs[FW_ISP21XX]; + } else if (IS_QLA2200(ha)) { + blob = &qla_fw_blobs[FW_ISP22XX]; + } else if (IS_QLA2300(ha) || IS_QLA2312(ha)) { + blob = &qla_fw_blobs[FW_ISP2300]; + } else if (IS_QLA2322(ha)) { + blob = &qla_fw_blobs[FW_ISP2322]; + } else if (IS_QLA6312(ha) || IS_QLA6322(ha)) { + blob = &qla_fw_blobs[FW_ISP63XX]; + } else if (IS_QLA24XX(ha)) { + blob = &qla_fw_blobs[FW_ISP24XX]; + } + + down(&qla_fw_lock); + if (blob->fw) + goto out; + + if (request_firmware(&blob->fw, blob->name, &ha->pdev->dev)) { + DEBUG2(printk("scsi(%ld): Failed to load firmware image " + "(%s).\n", ha->host_no, blob->name)); + blob->fw = NULL; + blob = NULL; + goto out; + } + +out: + up(&qla_fw_lock); + return blob; +} + +static void +qla2x00_release_firmware(void) +{ + int idx; + + down(&qla_fw_lock); + for (idx = 0; idx < FW_BLOBS; idx++) + if (qla_fw_blobs[idx].fw) + release_firmware(qla_fw_blobs[idx].fw); + up(&qla_fw_lock); +} + +static struct qla_board_info qla_board_tbl = { + .drv_name = "qla2xxx", +}; + +static struct pci_device_id qla2xxx_pci_tbl[] = { + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2100, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2200, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2300, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2312, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2322, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6312, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP6322, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2422, + PCI_ANY_ID, PCI_ANY_ID, }, + { PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432, + PCI_ANY_ID, PCI_ANY_ID, }, + { 0 }, +}; +MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); + +static int __devinit +qla2xxx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, &qla_board_tbl); +} + +static void __devexit +qla2xxx_remove_one(struct pci_dev *pdev) +{ + qla2x00_remove_one(pdev); +} + +#endif + static struct pci_driver qla2xxx_pci_driver = { .name = "qla2xxx", + .owner = THIS_MODULE, .id_table = qla2xxx_pci_tbl, .probe = qla2xxx_probe_one, .remove = __devexit_p(qla2xxx_remove_one), @@ -2556,6 +2676,9 @@ qla2x00_module_init(void) /* Derive version string. */ strcpy(qla2x00_version_str, QLA2XXX_VERSION); +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) + strcat(qla2x00_version_str, "-fw"); +#endif #if DEBUG_QLA2100 strcat(qla2x00_version_str, "-debug"); #endif @@ -2580,6 +2703,7 @@ static void __exit qla2x00_module_exit(void) { pci_unregister_driver(&qla2xxx_pci_driver); + qla2x00_release_firmware(); kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); } -- cgit v1.2.3 From 331e34768657ead5a5b169337351e045305cafcb Mon Sep 17 00:00:00 2001 From: Andrew Vasquez Date: Wed, 9 Nov 2005 15:49:19 -0800 Subject: [SCSI] qla2xxx: Add support for embedded ISP24xx firmware. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/Makefile | 3 +- drivers/scsi/qla2xxx/ql2400.c | 111 ++++++++++++++++++++++++++++++++++++++++ drivers/scsi/qla2xxx/qla_init.c | 61 ++++++++++++++++++++++ drivers/scsi/qla2xxx/qla_os.c | 82 ++++++++++------------------- 4 files changed, 202 insertions(+), 55 deletions(-) create mode 100644 drivers/scsi/qla2xxx/ql2400.c (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile index 549dfe41020..40c0de12588 100644 --- a/drivers/scsi/qla2xxx/Makefile +++ b/drivers/scsi/qla2xxx/Makefile @@ -10,10 +10,11 @@ qla2200-y := ql2200.o ql2200_fw.o qla2300-y := ql2300.o ql2300_fw.o qla2322-y := ql2322.o ql2322_fw.o qla6312-y := ql6312.o ql6312_fw.o +qla2400-y := ql2400.o ql2400_fw.o obj-$(CONFIG_SCSI_QLA21XX) += qla2xxx.o qla2100.o obj-$(CONFIG_SCSI_QLA22XX) += qla2xxx.o qla2200.o obj-$(CONFIG_SCSI_QLA2300) += qla2xxx.o qla2300.o obj-$(CONFIG_SCSI_QLA2322) += qla2xxx.o qla2322.o obj-$(CONFIG_SCSI_QLA6312) += qla2xxx.o qla6312.o -obj-$(CONFIG_SCSI_QLA24XX) += qla2xxx.o +obj-$(CONFIG_SCSI_QLA24XX) += qla2xxx.o qla2400.o diff --git a/drivers/scsi/qla2xxx/ql2400.c b/drivers/scsi/qla2xxx/ql2400.c new file mode 100644 index 00000000000..6c7165f47e2 --- /dev/null +++ b/drivers/scsi/qla2xxx/ql2400.c @@ -0,0 +1,111 @@ +/* + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation + * + * See LICENSE.qla2xxx for copyright and licensing details. + */ +#include +#include +#include + +#include "qla_def.h" + +static char qla_driver_name[] = "qla2400"; + +extern uint32_t fw2400_version_str[]; +extern uint32_t fw2400_addr01; +extern uint32_t fw2400_code01[]; +extern uint32_t fw2400_length01; +extern uint32_t fw2400_addr02; +extern uint32_t fw2400_code02[]; +extern uint32_t fw2400_length02; + +static struct qla_fw_info qla_fw_tbl[] = { + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = (unsigned short *)&fw2400_code01[0], + .fwlen = (unsigned short *)&fw2400_length01, + .lfwstart = (unsigned long *)&fw2400_addr01, + }, + { + .addressing = FW_INFO_ADDR_EXTENDED, + .fwcode = (unsigned short *)&fw2400_code02[0], + .fwlen = (unsigned short *)&fw2400_length02, + .lfwstart = (unsigned long *)&fw2400_addr02, + }, + { FW_INFO_ADDR_NOMORE, }, +}; + +static struct qla_board_info qla_board_tbl[] = { + { + .drv_name = qla_driver_name, + .isp_name = "ISP2422", + .fw_info = qla_fw_tbl, + .fw_fname = "ql2400_fw.bin", + }, + { + .drv_name = qla_driver_name, + .isp_name = "ISP2432", + .fw_info = qla_fw_tbl, + .fw_fname = "ql2400_fw.bin", + }, +}; + +static struct pci_device_id qla24xx_pci_tbl[] = { + { + .vendor = PCI_VENDOR_ID_QLOGIC, + .device = PCI_DEVICE_ID_QLOGIC_ISP2422, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (unsigned long)&qla_board_tbl[0], + }, + { + .vendor = PCI_VENDOR_ID_QLOGIC, + .device = PCI_DEVICE_ID_QLOGIC_ISP2432, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + .driver_data = (unsigned long)&qla_board_tbl[1], + }, + {0, 0}, +}; +MODULE_DEVICE_TABLE(pci, qla24xx_pci_tbl); + +static int __devinit +qla24xx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) +{ + return qla2x00_probe_one(pdev, + (struct qla_board_info *)id->driver_data); +} + +static void __devexit +qla24xx_remove_one(struct pci_dev *pdev) +{ + qla2x00_remove_one(pdev); +} + +static struct pci_driver qla24xx_pci_driver = { + .name = "qla2400", + .id_table = qla24xx_pci_tbl, + .probe = qla24xx_probe_one, + .remove = __devexit_p(qla24xx_remove_one), +}; + +static int __init +qla24xx_init(void) +{ + return pci_module_init(&qla24xx_pci_driver); +} + +static void __exit +qla24xx_exit(void) +{ + pci_unregister_driver(&qla24xx_pci_driver); +} + +module_init(qla24xx_init); +module_exit(qla24xx_exit); + +MODULE_AUTHOR("QLogic Corporation"); +MODULE_DESCRIPTION("QLogic ISP24xx FC-SCSI Host Bus Adapter driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION(QLA2XXX_VERSION); diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 13e2aaf5676..dadc91bd0ea 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -3549,6 +3549,67 @@ qla2x00_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) return rval; } +int +qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) +{ + int rval, num, i; + uint32_t cnt; + uint32_t *risc_code; + uint32_t risc_addr, risc_size; + uint32_t *req_ring; + struct qla_fw_info *fw_iter; + + rval = QLA_SUCCESS; + + /* Load firmware sequences */ + fw_iter = ha->brd_info->fw_info; + *srisc_addr = *((uint32_t *)fw_iter->lfwstart); + while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { + risc_code = (uint32_t *)fw_iter->fwcode; + risc_size = *((uint32_t *)fw_iter->fwlen); + risc_addr = *((uint32_t *)fw_iter->lfwstart); + + num = 0; + rval = 0; + while (risc_size > 0 && !rval) { + cnt = (uint32_t)(ha->fw_transfer_size >> 2); + if (cnt > risc_size) + cnt = risc_size; + + DEBUG7(printk("scsi(%ld): Loading risc segment@ " + "addr %p, number of bytes 0x%x, offset 0x%lx.\n", + ha->host_no, risc_code, cnt, risc_addr)); + + req_ring = (uint32_t *)ha->request_ring; + for (i = 0; i < cnt; i++) + req_ring[i] = cpu_to_le32(risc_code[i]); + + rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr, + cnt); + if (rval) { + DEBUG(printk("scsi(%ld): [ERROR] Failed to " + "load segment %d of firmware\n", + ha->host_no, num)); + qla_printk(KERN_WARNING, ha, + "[ERROR] Failed to load segment %d of " + "firmware\n", num); + + qla2x00_dump_regs(ha); + break; + } + + risc_code += cnt; + risc_addr += cnt; + risc_size -= cnt; + num++; + } + + /* Next firmware sequence */ + fw_iter++; + } + return rval; +} + int qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) { diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 47db029b2fc..41d2aeee096 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -54,6 +54,13 @@ module_param(ql2xloginretrycount, int, S_IRUGO|S_IRUSR); MODULE_PARM_DESC(ql2xloginretrycount, "Specify an alternate value for the NVRAM login retry count."); +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) +int ql2xfwloadflash; +module_param(ql2xfwloadflash, int, S_IRUGO|S_IRUSR); +MODULE_PARM_DESC(ql2xfwloadflash, + "Load ISP24xx firmware image from FLASH (onboard memory)."); +#endif + static void qla2x00_free_device(scsi_qla_host_t *); static void qla2x00_config_dma_addressing(scsi_qla_host_t *ha); @@ -1367,10 +1374,10 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info) ha->isp_ops.reset_adapter = qla24xx_reset_adapter; ha->isp_ops.nvram_config = qla24xx_nvram_config; ha->isp_ops.update_fw_options = qla24xx_update_fw_options; -#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) - ha->isp_ops.load_risc = qla24xx_load_risc_flash; -#else ha->isp_ops.load_risc = qla24xx_load_risc; +#if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) + if (ql2xfwloadflash) + ha->isp_ops.load_risc = qla24xx_load_risc_flash; #endif ha->isp_ops.pci_info_str = qla24xx_pci_info_str; ha->isp_ops.fw_version_str = qla24xx_fw_version_str; @@ -2488,53 +2495,8 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) #if defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) #define qla2x00_release_firmware() do { } while (0) - -static struct qla_board_info qla_board_tbl[] = { - { - .drv_name = "qla2400", - .isp_name = "ISP2422", - .fw_fname = "ql2400_fw.bin", - .sht = &qla24xx_driver_template, - }, - { - .drv_name = "qla2400", - .isp_name = "ISP2432", - .fw_fname = "ql2400_fw.bin", - .sht = &qla24xx_driver_template, - }, -}; - -static struct pci_device_id qla2xxx_pci_tbl[] = { - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2422, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[0], - }, - { - .vendor = PCI_VENDOR_ID_QLOGIC, - .device = PCI_DEVICE_ID_QLOGIC_ISP2432, - .subvendor = PCI_ANY_ID, - .subdevice = PCI_ANY_ID, - .driver_data = (unsigned long)&qla_board_tbl[1], - }, - {0, 0}, -}; -MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); - -static int __devinit -qla2xxx_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) -{ - return qla2x00_probe_one(pdev, - (struct qla_board_info *)id->driver_data); -} - -static void __devexit -qla2xxx_remove_one(struct pci_dev *pdev) -{ - qla2x00_remove_one(pdev); -} +#define qla2x00_pci_module_init() (0) +#define qla2x00_pci_module_exit() do { } while (0) #else /* !defined(CONFIG_SCSI_QLA2XXX_EMBEDDED_FIRMWARE) */ @@ -2647,8 +2609,6 @@ qla2xxx_remove_one(struct pci_dev *pdev) qla2x00_remove_one(pdev); } -#endif - static struct pci_driver qla2xxx_pci_driver = { .name = "qla2xxx", .owner = THIS_MODULE, @@ -2657,6 +2617,20 @@ static struct pci_driver qla2xxx_pci_driver = { .remove = __devexit_p(qla2xxx_remove_one), }; +static inline int +qla2x00_pci_module_init(void) +{ + return pci_module_init(&qla2xxx_pci_driver); +} + +static inline void +qla2x00_pci_module_exit(void) +{ + pci_unregister_driver(&qla2xxx_pci_driver); +} + +#endif + /** * qla2x00_module_init - Module initialization. **/ @@ -2688,7 +2662,7 @@ qla2x00_module_init(void) return -ENODEV; printk(KERN_INFO "QLogic Fibre Channel HBA Driver\n"); - ret = pci_module_init(&qla2xxx_pci_driver); + ret = qla2x00_pci_module_init(); if (ret) { kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); @@ -2702,7 +2676,7 @@ qla2x00_module_init(void) static void __exit qla2x00_module_exit(void) { - pci_unregister_driver(&qla2xxx_pci_driver); + qla2x00_pci_module_exit(); qla2x00_release_firmware(); kmem_cache_destroy(srb_cachep); fc_release_transport(qla2xxx_transport_template); -- cgit v1.2.3 From c6ce15d7cdb3f6cb3ff442ac01eb6c5f0fe321af Mon Sep 17 00:00:00 2001 From: Andrew Vasquez Date: Wed, 9 Nov 2005 15:49:33 -0800 Subject: [SCSI] qla2xxx: Resync with latest released ISP24xx firmware -- 4.00.16. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/ql2400_fw.c | 12376 +++++++++++++++++++++++++++++++++++++ 1 file changed, 12376 insertions(+) create mode 100644 drivers/scsi/qla2xxx/ql2400_fw.c (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/ql2400_fw.c b/drivers/scsi/qla2xxx/ql2400_fw.c new file mode 100644 index 00000000000..5977795854f --- /dev/null +++ b/drivers/scsi/qla2xxx/ql2400_fw.c @@ -0,0 +1,12376 @@ +/* + * QLogic Fibre Channel HBA Driver + * Copyright (c) 2003-2005 QLogic Corporation + * + * See LICENSE.qla2xxx for copyright and licensing details. + */ +#include + +/* + * Firmware Version 4.00.16 (08:09 Oct 26, 2005) + */ + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_version = 4*1024+0; +#else +uint32_t risc_code_version = 4*1024+0; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_version_str[] = {4, 0,16}; +#else +uint32_t firmware_version[] = {4, 0,16}; +#endif + +#ifdef UNIQUE_FW_NAME +#define fw2400_VERSION_STRING "4.00.16" +#else +#define FW_VERSION_STRING "4.00.16" +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_addr01 = 0x00100000 ; +#else +uint32_t risc_code_addr01 = 0x00100000 ; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_code01[] = { +#else +uint32_t risc_code01[] = { +#endif + 0x0401f17c, 0x0010e000, 0x00100000, 0x0000ab4a, + 0x00000004, 0x00000000, 0x00000010, 0x00000002, + 0x00000003, 0x00000000, 0x20434f50, 0x59524947, + 0x48542032, 0x30303520, 0x514c4f47, 0x49432043, + 0x4f52504f, 0x52415449, 0x4f4e2020, 0x20495350, + 0x32347878, 0x20466972, 0x6d776172, 0x65202020, + 0x56657273, 0x696f6e20, 0x342e302e, 0x31362020, + 0x20202024, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x42001800, 0x0010014f, 0x42002000, 0x0010b8fe, + 0x500c0800, 0x800c1800, 0x500c1000, 0x800c1800, + 0x54042000, 0x80102000, 0x80040800, 0x80081040, + 0x040207fc, 0x500c0800, 0x800409c0, 0x040207f6, + 0x44002000, 0x80102000, 0x40100000, 0x44040000, + 0x80000000, 0x44080000, 0x80000000, 0x440c0000, + 0x80000000, 0x44100000, 0x80000000, 0x44140000, + 0x80000000, 0x44180000, 0x80000000, 0x441c0000, + 0x80000000, 0x44200000, 0x80000000, 0x44240000, + 0x80000000, 0x44280000, 0x80000000, 0x442c0000, + 0x80000000, 0x44300000, 0x80000000, 0x44340000, + 0x80000000, 0x44380000, 0x80000000, 0x443c0000, + 0x80000000, 0x44400000, 0x80000000, 0x44440000, + 0x80000000, 0x44480000, 0x80000000, 0x444c0000, + 0x80000000, 0x44500000, 0x80000000, 0x44540000, + 0x80000000, 0x44580000, 0x80000000, 0x445c0000, + 0x80000000, 0x44600000, 0x80000000, 0x44640000, + 0x80000000, 0x44680000, 0x80000000, 0x446c0000, + 0x80000000, 0x44700000, 0x80000000, 0x44740000, + 0x80000000, 0x44780000, 0x80000000, 0x447c0000, + 0x80000000, 0x44800000, 0x80000000, 0x44840000, + 0x80000000, 0x44880000, 0x80000000, 0x448c0000, + 0x80000000, 0x44900000, 0x80000000, 0x44940000, + 0x80000000, 0x44980000, 0x80000000, 0x449c0000, + 0x80000000, 0x44a00000, 0x80000000, 0x44a40000, + 0x80000000, 0x44a80000, 0x80000000, 0x44ac0000, + 0x80000000, 0x44b00000, 0x80000000, 0x44b40000, + 0x80000000, 0x44b80000, 0x80000000, 0x44bc0000, + 0x80000000, 0x44c00000, 0x80000000, 0x44c40000, + 0x80000000, 0x44c80000, 0x80000000, 0x44cc0000, + 0x80000000, 0x44d00000, 0x80000000, 0x44d80000, + 0x80000000, 0x44d40000, 0x80000000, 0x44dc0000, + 0x80000000, 0x44e00000, 0x80000000, 0x44e40000, + 0x80000000, 0x44e80000, 0x80000000, 0x44ec0000, + 0x80000000, 0x44f00000, 0x80000000, 0x44f40000, + 0x80000000, 0x44f80000, 0x80000000, 0x44fc0000, + 0x80000000, 0x45000000, 0x80000000, 0x45040000, + 0x80000000, 0x45080000, 0x80000000, 0x450c0000, + 0x80000000, 0x45100000, 0x80000000, 0x45140000, + 0x80000000, 0x45180000, 0x80000000, 0x451c0000, + 0x80000000, 0x45200000, 0x80000000, 0x45240000, + 0x80000000, 0x45280000, 0x80000000, 0x452c0000, + 0x80000000, 0x45300000, 0x80000000, 0x45340000, + 0x80000000, 0x45380000, 0x80000000, 0x453c0000, + 0x80000000, 0x45400000, 0x80000000, 0x45440000, + 0x80000000, 0x45480000, 0x80000000, 0x454c0000, + 0x80000000, 0x45500000, 0x80000000, 0x45540000, + 0x80000000, 0x45580000, 0x80000000, 0x455c0000, + 0x80000000, 0x45600000, 0x80000000, 0x45640000, + 0x80000000, 0x45680000, 0x80000000, 0x456c0000, + 0x80000000, 0x45700000, 0x80000000, 0x45740000, + 0x80000000, 0x45780000, 0x80000000, 0x457c0000, + 0x80000000, 0x45800000, 0x80000000, 0x45840000, + 0x80000000, 0x45880000, 0x80000000, 0x458c0000, + 0x80000000, 0x45900000, 0x80000000, 0x45940000, + 0x80000000, 0x45980000, 0x80000000, 0x459c0000, + 0x80000000, 0x45a00000, 0x80000000, 0x45a40000, + 0x80000000, 0x45a80000, 0x80000000, 0x45ac0000, + 0x80000000, 0x45b00000, 0x80000000, 0x45b40000, + 0x80000000, 0x45b80000, 0x80000000, 0x45bc0000, + 0x80000000, 0x45c00000, 0x80000000, 0x45c40000, + 0x80000000, 0x45c80000, 0x80000000, 0x45cc0000, + 0x80000000, 0x45d00000, 0x80000000, 0x45d40000, + 0x80000000, 0x45d80000, 0x80000000, 0x45dc0000, + 0x80000000, 0x45e00000, 0x80000000, 0x45e40000, + 0x80000000, 0x45e80000, 0x80000000, 0x45ec0000, + 0x80000000, 0x45f00000, 0x80000000, 0x45f40000, + 0x80000000, 0x45f80000, 0x80000000, 0x45fc0000, + 0x4a03c020, 0x00004000, 0x4a03c011, 0x40000010, + 0x04006000, 0x4203e000, 0x40000000, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000000, + 0x4203e000, 0x30000001, 0x0401f000, 0x0000bf00, + 0x00000080, 0x0000bfe0, 0x00000020, 0x0000ff00, + 0x00000080, 0x0000ffd0, 0x00000030, 0x00007100, + 0x00000010, 0x00007200, 0x00000008, 0x00007209, + 0x00000007, 0x00007300, 0x00000008, 0x00007309, + 0x00000007, 0x00007400, 0x00000008, 0x00007409, + 0x00000007, 0x00007600, 0x000000b0, 0x00007700, + 0x00000040, 0x00003000, 0x00000070, 0x00004000, + 0x000000c0, 0x00006000, 0x00000050, 0x00006100, + 0x00000010, 0x00006130, 0x00000010, 0x00006150, + 0x00000010, 0x00006170, 0x00000010, 0x00006190, + 0x00000010, 0x000061b0, 0x00000010, 0x00000000, + 0x42000000, 0x00000100, 0x4202f000, 0x00000000, + 0x42000800, 0x00021f00, 0x45780800, 0x80040800, + 0x80000040, 0x040207fd, 0x4203f000, 0x00021fff, + 0x40000000, 0x4203e000, 0x90000100, 0x40000000, + 0x0201f800, 0x001006fd, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24320002, 0x04020015, + 0x42000800, 0x00000064, 0x80040840, 0x04000007, + 0x4a030000, 0x00000001, 0x40000000, 0x59800000, + 0x8c000500, 0x040007f9, 0x04000008, 0x42000800, + 0x00007a17, 0x50040000, 0x8c00050e, 0x04020003, + 0x8400054e, 0x44000800, 0x4a030000, 0x00000000, + 0x4a03c020, 0x00000004, 0x4203e000, 0x6000000f, + 0x59e00023, 0x8c000500, 0x04020039, 0x42000000, + 0x00100001, 0x50000800, 0x82040c00, 0x00000004, + 0x58042003, 0x42001000, 0xffffffff, 0x0201f800, + 0x001006f4, 0x0402004e, 0x58042003, 0x42001000, + 0xffffffff, 0x0201f800, 0x001006f4, 0x04020048, + 0x58042003, 0x42001000, 0x00ffffff, 0x0201f800, + 0x001006f4, 0x04020042, 0x58042003, 0x42001000, + 0x00ffffff, 0x0201f800, 0x001006f4, 0x0402003c, + 0x42000000, 0x00100001, 0x5000a000, 0x8250a400, + 0x00000004, 0x4200a800, 0x00020000, 0x5850b003, + 0x0201f800, 0x0010ab17, 0x8250a400, 0x00000005, + 0x4a0370e8, 0x00000003, 0x4200a800, 0x0000c000, + 0x5850b003, 0x0201f800, 0x0010ab17, 0x4a0378e8, + 0x00000003, 0x4200a800, 0x00008000, 0x5850b003, + 0x0201f800, 0x0010ab17, 0x0401f02b, 0x42000800, + 0x00020000, 0x58042003, 0x42001000, 0xffffffff, + 0x0201f800, 0x001006f4, 0x04020019, 0x4a0370e8, + 0x00000003, 0x42000800, 0x0000c000, 0x58042003, + 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, + 0x0201f800, 0x001006f4, 0x0402000d, 0x4a0378e8, + 0x00000003, 0x42000800, 0x00008000, 0x58042003, + 0x82102500, 0x00ffffff, 0x42001000, 0x00ffffff, + 0x0201f800, 0x001006f4, 0x0400000b, 0x4a03c020, + 0x00004010, 0x4a03c011, 0x40100011, 0x04006000, + 0x4203e000, 0x40000000, 0x4203e000, 0x30000001, + 0x0401f000, 0x0201f800, 0x00100791, 0x42001000, + 0x0010ab4a, 0x40080000, 0x80140480, 0x82001d00, + 0xffffff00, 0x04020003, 0x40001800, 0x0401f003, + 0x42001800, 0x000000ff, 0x480bc840, 0x480fc842, + 0x04011000, 0x400c0000, 0x80081400, 0x40140000, + 0x80080580, 0x040207f0, 0x4817500d, 0x45782800, + 0x59c40000, 0x82000500, 0xffff0000, 0x80000120, + 0x82000580, 0x00002422, 0x04020005, 0x59a80005, + 0x8400054e, 0x48035005, 0x0401f008, 0x59e00003, + 0x82000500, 0x00030000, 0x04000004, 0x59a80005, + 0x84000554, 0x48035005, 0x42000800, 0x00000040, + 0x59a80005, 0x8c000514, 0x0402000e, 0x42000800, + 0x00001000, 0x82141480, 0x0017ffff, 0x04021009, + 0x80040902, 0x82141480, 0x0013ffff, 0x04021005, + 0x80040902, 0x82141480, 0x0011ffff, 0x04001b8d, + 0x4807500e, 0x42001000, 0x00000024, 0x0201f800, + 0x00106681, 0x82040c00, 0x0010d1c0, 0x4807500b, + 0x4a03c810, 0x00100000, 0x4a03c811, 0x0010ab4a, + 0x4a03c829, 0x00000004, 0x59e40001, 0x82000540, + 0x0003001d, 0x4803c801, 0x4a03c014, 0x001c001c, + 0x42001000, 0x0000001c, 0x0201f800, 0x001006e2, + 0x4202c000, 0x0010d1c0, 0x59aab00b, 0x59aaa00b, + 0x59aaa80b, 0x59aac80e, 0x49675069, 0x59a8000b, + 0x4803500c, 0x0401fbf5, 0x0201f800, 0x00107903, + 0x0201f800, 0x001007be, 0x0201f800, 0x00100807, + 0x0201f800, 0x00101a05, 0x0201f800, 0x00101354, + 0x0201f800, 0x00100969, 0x0201f800, 0x00101354, + 0x0201f800, 0x00100f4c, 0x0201f800, 0x001066c1, + 0x0401fb1a, 0x0201f800, 0x0010220e, 0x0201f800, + 0x001053bb, 0x0201f800, 0x00104c90, 0x0201f800, + 0x00106194, 0x0201f800, 0x00105f28, 0x0201f800, + 0x001013ed, 0x0201f800, 0x0010126f, 0x4203e000, + 0xf0000001, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24220001, 0x04000016, 0x59e00002, + 0x8c00051e, 0x42000000, 0x7ffe00fe, 0x04020003, + 0x42000000, 0x7ffe01fe, 0x50000800, 0x48075058, + 0x80040920, 0x82040580, 0x0000013a, 0x04000004, + 0x82040580, 0x0000013b, 0x04020006, 0x59a80005, + 0x84000552, 0x48035005, 0x4a0378e4, 0x000c0000, + 0x4a03c018, 0x0000000f, 0x4203e000, 0x20000511, + 0x4203e000, 0x50010000, 0x4a03c020, 0x00000000, + 0x04027013, 0x59e00020, 0x82000580, 0x00000002, + 0x0402000f, 0x4a03c020, 0x00004000, 0x4a03c011, + 0x40000010, 0x04006000, 0x4203e000, 0x40000000, + 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, + 0x00000000, 0x4203e000, 0x30000001, 0x4202d800, + 0x00000000, 0x4203e000, 0xb0600000, 0x59a80005, + 0x42000800, 0x00000002, 0x8c000512, 0x04020007, + 0x42000800, 0x0000000f, 0x8c000514, 0x04020003, + 0x42000800, 0x00000001, 0x4007f800, 0x59a80005, + 0x8c000514, 0x02020000, 0x00020004, 0x59e00003, + 0x82000500, 0x00030000, 0x82000580, 0x00000000, + 0x04020af8, 0x0201f000, 0x00020004, 0x4df00000, + 0x4203e000, 0x50000000, 0x416c0000, 0x82000c80, + 0x00000008, 0x04021aef, 0x0c01f804, 0x5c03e000, + 0x0201f000, 0x00020008, 0x001002f7, 0x0010030a, + 0x001003d7, 0x001002f6, 0x00100452, 0x001002f6, + 0x001002f6, 0x00100593, 0x0401fae2, 0x42000800, + 0x0010b4a4, 0x5804001d, 0x4803c857, 0x8c000500, + 0x0400000d, 0x84000500, 0x4800081d, 0x4202d800, + 0x00000004, 0x0401fbd3, 0x49f3c857, 0x5c000800, + 0x5c000000, 0x82000540, 0x00003e00, 0x4c000000, + 0x4c040000, 0x1c01f000, 0x0401fbbd, 0x0201f800, + 0x0010513b, 0x04000009, 0x0201f800, 0x00105151, + 0x0402002e, 0x59c40006, 0x82000540, 0x000000c0, + 0x48038806, 0x0401f029, 0x0201f800, 0x001050a2, + 0x836c0580, 0x00000001, 0x040200bc, 0x59a80017, + 0x82000580, 0x00000009, 0x040200b8, 0x497b5010, + 0x4a038893, 0x00000001, 0x42001000, 0x000000f0, + 0x0201f800, 0x0010193d, 0x0201f800, 0x00105149, + 0x59c41006, 0x04020006, 0x82081540, 0x000000f1, + 0x82081500, 0xbbffffff, 0x0401f003, 0x82081540, + 0x440000f1, 0x480b8806, 0x0201f800, 0x0010609e, + 0x4a0378e4, 0x00002000, 0x42000000, 0x0010b83a, + 0x0201f800, 0x0010aa47, 0x42001000, 0x00008030, + 0x497b5013, 0x0401f035, 0x0201f800, 0x00103b38, + 0x59c400a4, 0x82000500, 0x0000000f, 0x82000480, + 0x00000007, 0x04021091, 0x0201f800, 0x0010609e, + 0x59c400a3, 0x82000500, 0xffefffff, 0x480388a3, + 0x59a8004b, 0x800001c0, 0x04020004, 0x0201f800, + 0x00104139, 0x0401f085, 0x59a80015, 0x84000546, + 0x48035015, 0x0201f800, 0x00105141, 0x59c41006, + 0x04020006, 0x82081540, 0x44000001, 0x82081500, + 0xffffff0f, 0x0401f003, 0x82081540, 0x440000f1, + 0x480b8806, 0x497b9005, 0x4a038802, 0x0000ffff, + 0x4a0378e4, 0x00003000, 0x42000000, 0x0010b80c, + 0x0201f800, 0x0010aa47, 0x59a81010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x42001000, + 0x00008010, 0x59a8180a, 0x0201f800, 0x00103a3e, + 0x0201f800, 0x00101815, 0x59a80805, 0x82040d00, + 0xffffffdf, 0x48075005, 0x0201f800, 0x0010483d, + 0x0201f800, 0x0010513b, 0x0400000a, 0x0201f800, + 0x0010413e, 0x04000007, 0x4a035013, 0x00000001, + 0x497b5021, 0x0201f800, 0x00103c80, 0x0401f04f, + 0x0201f800, 0x001048ec, 0x04000005, 0x59c41002, + 0x8408150c, 0x480b8802, 0x0401f012, 0x0201f800, + 0x0010513b, 0x04020006, 0x59a8001d, 0x80000540, + 0x02000800, 0x0010930f, 0x0401f00a, 0x0201f800, + 0x0010930f, 0x59a80026, 0x8c000506, 0x04020005, + 0x59a8001d, 0x80000540, 0x02020800, 0x00104245, + 0x497b5028, 0x497b5027, 0x497b5018, 0x0201f800, + 0x0010513b, 0x59a81026, 0x0402000a, 0x0201f800, + 0x0010162a, 0x80001580, 0x59a8002a, 0x82000500, + 0xffff0000, 0x80040d40, 0x4807502a, 0x0401f005, + 0x59a8002a, 0x82000500, 0xffff0000, 0x4803502a, + 0x599c0017, 0x8c00050a, 0x04000002, 0x84081544, + 0x480b5026, 0x0201f800, 0x0010513b, 0x04000004, + 0x0201f800, 0x0010162a, 0x48078880, 0x42001000, + 0x00000005, 0x0201f800, 0x001070b0, 0x497b5028, + 0x497b501b, 0x4a03501c, 0x0000ffff, 0x4a0378e4, + 0x000000c0, 0x4202d800, 0x00000002, 0x0201f800, + 0x0010513b, 0x04000007, 0x59a80026, 0x82000500, + 0x0000000c, 0x82000580, 0x00000004, 0x04000003, + 0x0201f800, 0x00101e45, 0x1c01f000, 0x59a8001c, + 0x82000580, 0x0000ffff, 0x04000004, 0x0201f800, + 0x00101e45, 0x0401f074, 0x59a80026, 0x8c00050a, + 0x04020003, 0x8c000506, 0x0400001c, 0x8c000500, + 0x0400001a, 0x4a038802, 0x0000ffbf, 0x8c000502, + 0x04000016, 0x599c0018, 0x8c000516, 0x04020010, + 0x59a80027, 0x82000580, 0x0000ffff, 0x0400000c, + 0x0201f800, 0x00101f9a, 0x59a80026, 0x8c000504, + 0x0402005d, 0x42001000, 0x00000003, 0x417a5800, + 0x0201f800, 0x00101fbf, 0x0401f057, 0x59a80028, + 0x80000540, 0x04020054, 0x59a80026, 0x8c000508, + 0x04020005, 0x59a8001b, 0x80000540, 0x0402004e, + 0x0401f003, 0x8c000516, 0x0400004b, 0x0201f800, + 0x001048ec, 0x04020048, 0x599c0018, 0x8c000516, + 0x04020004, 0x0201f800, 0x00104c51, 0x04020042, + 0x599c0017, 0x8c00050a, 0x0400000d, 0x4200b000, + 0x000007f0, 0x417a8800, 0x0201f800, 0x00020245, + 0x04020004, 0x59340200, 0x8c00051a, 0x04020036, + 0x81468800, 0x8058b040, 0x040207f8, 0x4a038802, + 0x0000ffff, 0x42001800, 0x0010b4eb, 0x0401fb8c, + 0x42001800, 0x0010b4f8, 0x0401fb89, 0x59a80005, + 0x84000502, 0x48035005, 0x4a0378e4, 0x00000080, + 0x4202d800, 0x00000003, 0x4a03501c, 0x0000ffff, + 0x0401fa7f, 0x80000580, 0x0201f800, 0x00101590, + 0x599c0018, 0x8c000516, 0x04000004, 0x0201f800, + 0x00103b10, 0x0401f009, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000006, 0x42003000, 0x00000000, + 0x0201f800, 0x00103aae, 0x0201f800, 0x00105151, + 0x0400000b, 0x59c40006, 0x0201f800, 0x0010513b, + 0x04000004, 0x82000500, 0xffffff0f, 0x0401f003, + 0x82000500, 0xfbffffff, 0x48038806, 0x0201f800, + 0x00106f36, 0x1c01f000, 0x4c040000, 0x4c080000, + 0x4c100000, 0x59a8003e, 0x82000c80, 0x00000004, + 0x04021980, 0x0c01f805, 0x5c002000, 0x5c001000, + 0x5c000800, 0x1c01f000, 0x00100462, 0x001004ea, + 0x00100516, 0x00100577, 0x42000000, 0x00000001, + 0x0201f800, 0x00101590, 0x0201f800, 0x0010609e, + 0x59c408a3, 0x82040d00, 0xfffffff7, 0x480788a3, + 0x0201f800, 0x00105141, 0x0400000e, 0x0201f800, + 0x00105151, 0x0400000b, 0x0201f800, 0x00105149, + 0x04020964, 0x59c400a3, 0x84000532, 0x84000570, + 0x480388a3, 0x4a038808, 0x00000008, 0x0401f010, + 0x59c400a3, 0x84000530, 0x82000500, 0xbf7fffff, + 0x480388a3, 0x42000800, 0x000000f8, 0x0201f800, + 0x00104200, 0x59c400a3, 0x82000540, 0x00018000, + 0x8400051c, 0x480388a3, 0x497b8808, 0x59c40006, + 0x82000500, 0xfbffff0e, 0x48038806, 0x497b2822, + 0x497b2823, 0x42000800, 0x000001f4, 0x42001000, + 0x00100591, 0x0201f800, 0x00105f83, 0x59c40805, + 0x42001000, 0x00000001, 0x0201f800, 0x0010193d, + 0x0201f800, 0x0010163b, 0x0402000a, 0x42000000, + 0x00000001, 0x0201f800, 0x0010188c, 0x42000000, + 0x00000001, 0x0201f800, 0x00101821, 0x0401f022, + 0x0201f800, 0x00101642, 0x04020008, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f018, 0x0201f800, 0x00101649, + 0x0402000a, 0x42000000, 0x00000002, 0x0201f800, + 0x0010188c, 0x42000000, 0x00000002, 0x0201f800, + 0x00101821, 0x0401f00c, 0x0201f800, 0x00101650, + 0x04020918, 0x59a80049, 0x800001c0, 0x04000006, + 0x0201f800, 0x00101656, 0x4a03503e, 0x00000001, + 0x0401f021, 0x0201f800, 0x00101927, 0x4a03503e, + 0x00000001, 0x0201f800, 0x00105141, 0x0400000c, + 0x0201f800, 0x00105151, 0x04000009, 0x0201f800, + 0x00105149, 0x04020903, 0x4a035033, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f00f, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x04000003, 0x4a038805, 0x04000000, 0x59c400a3, + 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, + 0x480388a3, 0x1c01f000, 0x0401f8a3, 0x04020004, + 0x4a03503e, 0x00000003, 0x0401f027, 0x0201f800, + 0x00101650, 0x04020011, 0x59a80049, 0x800001c0, + 0x0400000e, 0x0201f800, 0x00101656, 0x59a80048, + 0x8c00051e, 0x0400001c, 0x0201f800, 0x00105149, + 0x04020009, 0x4a035033, 0x00000001, 0x0201f800, + 0x001050a2, 0x0401f004, 0x0201f800, 0x001018d3, + 0x04020011, 0x0201f800, 0x00101815, 0x4a03503e, + 0x00000002, 0x497b5049, 0x59c400a3, 0x84000520, + 0x480388a3, 0x497b2822, 0x497b2823, 0x42000800, + 0x0000002d, 0x42001000, 0x00100591, 0x0201f800, + 0x00105f83, 0x1c01f000, 0x0401f877, 0x04020004, + 0x4a03503e, 0x00000003, 0x0401f05b, 0x4a038805, + 0x000000f0, 0x0201f800, 0x001018d3, 0x04020050, + 0x0201f800, 0x00105149, 0x04000044, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x04000020, 0x59c40005, 0x8c000534, 0x0402001d, + 0x59940022, 0x82000580, 0x00000001, 0x04020046, + 0x0201f800, 0x00105151, 0x04020043, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00105196, 0x4a035032, + 0x0000aaaa, 0x4a035033, 0x00000000, 0x59c408a3, + 0x82040d40, 0x00000008, 0x480788a3, 0x4202d800, + 0x00000001, 0x4a03503e, 0x00000000, 0x4a038805, + 0x00000001, 0x497b2822, 0x497b2823, 0x0401f01f, + 0x0201f800, 0x00105151, 0x04020007, 0x59a80032, + 0x82000580, 0x0000aaaa, 0x04020003, 0x4a035010, + 0x00ffffff, 0x497b5032, 0x59c40006, 0x82000540, + 0x04000001, 0x48038806, 0x59a80805, 0x8c040d06, + 0x04020005, 0x59c408a3, 0x82040d40, 0x00000008, + 0x480788a3, 0x4202d800, 0x00000001, 0x4a03503e, + 0x00000000, 0x4a038805, 0x00000001, 0x497b2822, + 0x497b2823, 0x0401f010, 0x59c40005, 0x82000500, + 0x000000c0, 0x0400000c, 0x59c40006, 0x82000540, + 0x000000f1, 0x48038806, 0x0401f7ef, 0x0201f800, + 0x00101650, 0x04020004, 0x59a80049, 0x800001c0, + 0x040207a4, 0x497b8885, 0x1c01f000, 0x4803c856, + 0x42000000, 0x00000001, 0x0201f800, 0x00101590, + 0x4a03503e, 0x00000000, 0x0201f800, 0x00101650, + 0x0402000b, 0x59a80052, 0x800001c0, 0x04000004, + 0x80000040, 0x48035052, 0x04020005, 0x4a035052, + 0x0000000a, 0x4a035049, 0x00000001, 0x497b8885, + 0x0401f0ed, 0x59940022, 0x59940823, 0x80040540, + 0x1c01f000, 0x497b2823, 0x1c01f000, 0x4c080000, + 0x42001000, 0x000000f0, 0x0201f800, 0x0010193d, + 0x5c001000, 0x1c01f000, 0x4a03505c, 0x00000004, + 0x4a03505d, 0x00000000, 0x4a03505e, 0x00000010, + 0x4a03505f, 0x00000002, 0x4a035010, 0x00ffffff, + 0x0201f800, 0x0010930f, 0x4a03502a, 0x20200000, + 0x4a03502b, 0x88000200, 0x4a03502c, 0x00ff001f, + 0x4a03502d, 0x000007d0, 0x4a03502e, 0x80000000, + 0x4a03502f, 0x00000200, 0x4a035030, 0x00ff0000, + 0x4a035031, 0x00010000, 0x4a03503a, 0x514c4f47, + 0x4a03503b, 0x49432020, 0x1c01f000, 0x4d440000, + 0x417a8800, 0x41780800, 0x0201f800, 0x00020245, + 0x04020005, 0x0201f800, 0x001049e7, 0x04020002, + 0x80040800, 0x81468800, 0x83440580, 0x000007f0, + 0x040207f6, 0x5c028800, 0x1c01f000, 0x4803c857, + 0x5c000000, 0x4c000000, 0x4803c857, 0x0401f809, + 0x485fc857, 0x4203e000, 0x50000000, 0x5c000000, + 0x4d780000, 0x4200b800, 0x00008002, 0x0401f006, + 0x485fc857, 0x4203e000, 0x50000000, 0x4200b800, + 0x00008002, 0x04006000, 0x4c000000, 0x4c040000, + 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000001, 0x04020005, 0x42000800, 0x00000000, + 0x0201f800, 0x00106c6c, 0x5c000800, 0x4807c025, + 0x80040920, 0x4807c026, 0x5c000000, 0x4803c023, + 0x80000120, 0x4803c024, 0x5c000000, 0x4803c857, + 0x4803c021, 0x80000120, 0x4803c022, 0x41f80000, + 0x4803c027, 0x80000120, 0x4803c028, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320001, + 0x4803c857, 0x0400104f, 0x42000800, 0x00000064, + 0x80040840, 0x04000007, 0x4a030000, 0x00000001, + 0x40000000, 0x59800000, 0x8c000500, 0x040007f9, + 0x04000042, 0x42000800, 0x0010c1a3, 0x46000800, + 0xfaceface, 0x80040800, 0x42001000, 0x00007a00, + 0x58080013, 0x44000800, 0x80040800, 0x58080019, + 0x44000800, 0x80040800, 0x5808001a, 0x44000800, + 0x80040800, 0x5808001b, 0x44000800, 0x80040800, + 0x5808001c, 0x44000800, 0x80040800, 0x5808001f, + 0x44000800, 0x80040800, 0x42001000, 0x00007a40, + 0x42001800, 0x0000000b, 0x50080000, 0x44000800, + 0x80081000, 0x80040800, 0x800c1840, 0x040207fb, + 0x42001800, 0x00000003, 0x42001000, 0x00007b00, + 0x480c1003, 0x58080005, 0x44000800, 0x80040800, + 0x800c1840, 0x040217fb, 0x42001000, 0x00007c00, + 0x58080002, 0x44000800, 0x80040800, 0x58080003, + 0x44000800, 0x80040800, 0x58080020, 0x44000800, + 0x80040800, 0x58080021, 0x44000800, 0x80040800, + 0x58080022, 0x44000800, 0x80040800, 0x58080023, + 0x44000800, 0x80040800, 0x4a030000, 0x00000000, + 0x485fc020, 0x905cb9c0, 0x825cbd40, 0x00000012, + 0x485fc011, 0x4203e000, 0x40000000, 0x4202d800, + 0x00000005, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x00000002, 0x4203e000, 0x30000001, + 0x0401f81a, 0x0401f7ff, 0x4a03c850, 0x0010c1bf, + 0x4a03c851, 0x0010d1be, 0x4a03c853, 0x00000800, + 0x4a03c855, 0x0001eb5a, 0x59e40001, 0x82000540, + 0x00003f00, 0x4803c801, 0x4a03b104, 0x70000002, + 0x4a03a804, 0x70000002, 0x4a03b004, 0x70000002, + 0x42000000, 0x0010b8ec, 0x49780001, 0x49780002, + 0x1c01f000, 0x1c01f000, 0x59a8006b, 0x8c000530, + 0x040207fe, 0x4c080000, 0x42001000, 0x00000004, + 0x0401f862, 0x5c001000, 0x4201d000, 0x00028b0a, + 0x0201f800, 0x0010608e, 0x4c080000, 0x42001000, + 0x00000008, 0x0401f859, 0x5c001000, 0x4201d000, + 0x00028b0a, 0x0201f800, 0x0010608e, 0x4c080000, + 0x42001000, 0x00000010, 0x0401f850, 0x5c001000, + 0x4201d000, 0x00028b0a, 0x0201f800, 0x0010608e, + 0x0401f7e2, 0x8c00050c, 0x59a8086b, 0x04020003, + 0x84040d30, 0x0401f006, 0x84040d70, 0x4807506b, + 0x42001000, 0x00000000, 0x0401f040, 0x4807506b, + 0x836c0500, 0x00000007, 0x0c01f001, 0x001006e1, + 0x001006c7, 0x001006c7, 0x001006af, 0x001006d4, + 0x001006c7, 0x001006c7, 0x001006d4, 0x59a80005, + 0x8c000514, 0x04020013, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00010000, 0x0400000a, + 0x82040580, 0x00008000, 0x04000004, 0x42001000, + 0x42004000, 0x0401f006, 0x42001000, 0x22002000, + 0x0401f003, 0x42001000, 0x12001000, 0x0401f025, + 0x42001000, 0x00001004, 0x0401f022, 0x59a80005, + 0x8c000514, 0x04020008, 0x59a8006b, 0x8c000534, + 0x04020004, 0x42001000, 0x74057005, 0x0401f819, + 0x1c01f000, 0x42001000, 0x00002008, 0x0401f7fc, + 0x59a8006b, 0x8c000534, 0x0402000a, 0x59a80005, + 0x8c000514, 0x04000004, 0x42001000, 0x24052005, + 0x0401f00c, 0x42001000, 0x74057005, 0x0401f009, + 0x1c01f000, 0x1c01f000, 0x82081500, 0x0000001c, + 0x82081540, 0x001c0000, 0x480bc013, 0x1c01f000, + 0x59a8006b, 0x8c000530, 0x04000002, 0x84081570, + 0x480b506b, 0x8c000530, 0x04020005, 0x82081500, + 0x00007000, 0x80081114, 0x0401fff0, 0x1c01f000, + 0x41780000, 0x50041800, 0x800c0400, 0x80040800, + 0x80102040, 0x040207fc, 0x80080500, 0x80000540, + 0x1c01f000, 0x4202f000, 0x00000000, 0x41780000, + 0x41780800, 0x41781000, 0x41781800, 0x41782000, + 0x41782800, 0x41783000, 0x41783800, 0x41784000, + 0x41784800, 0x41785000, 0x41785800, 0x41786000, + 0x41786800, 0x41787000, 0x41787800, 0x41788000, + 0x41788800, 0x41789000, 0x41789800, 0x4178a000, + 0x4178a800, 0x4178b000, 0x4178b800, 0x4178c000, + 0x4178c800, 0x4178d000, 0x4178d800, 0x4178e000, + 0x4178e800, 0x4178f000, 0x4178f800, 0x41790000, + 0x41790800, 0x41791000, 0x41791800, 0x41792000, + 0x41792800, 0x41793000, 0x41793800, 0x41794000, + 0x41794800, 0x41795000, 0x41795800, 0x41796000, + 0x41796800, 0x41797000, 0x41797800, 0x41798000, + 0x41798800, 0x42019000, 0x0010b537, 0x42019800, + 0x0010b50e, 0x4179a000, 0x4179b000, 0x4179a800, + 0x4179b800, 0x4179c800, 0x4179c000, 0x4179d000, + 0x4179d800, 0x4179e000, 0x4179e800, 0x4179f000, + 0x4179f800, 0x417a0000, 0x417a0800, 0x417a1000, + 0x417a1800, 0x417a2000, 0x42022800, 0x00006100, + 0x417a3000, 0x417a3800, 0x417a4000, 0x417a4800, + 0x417a5000, 0x417a5800, 0x417a6000, 0x417a6800, + 0x417a7000, 0x417a7800, 0x417a8000, 0x417a8800, + 0x417a9000, 0x417a9800, 0x417ae800, 0x417af800, + 0x42030000, 0x00007c00, 0x42031000, 0x0010b806, + 0x42031800, 0x0000bf1d, 0x42032000, 0x0000bf32, + 0x42032800, 0x0010b7ce, 0x42033000, 0x0010b46e, + 0x42034000, 0x0010b4a4, 0x42033800, 0x0010b4c3, + 0x42034800, 0x0010b544, 0x42035000, 0x0010b400, + 0x42035800, 0x0010ac00, 0x42030800, 0x0010b505, + 0x417b6000, 0x42036800, 0x00006f00, 0x4203c800, + 0x00003000, 0x42037000, 0x0000ff00, 0x42037800, + 0x0000bf00, 0x42038000, 0x00007700, 0x42038800, + 0x00004000, 0x42039000, 0x00006000, 0x42039800, + 0x0010bedb, 0x4203a000, 0x00007600, 0x4203a800, + 0x00007400, 0x4203b000, 0x00007200, 0x4203b800, + 0x00007100, 0x4203c000, 0x00007000, 0x4203d000, + 0x00000000, 0x4203e800, 0x00101b95, 0x417bd800, + 0x1c01f000, 0x42000800, 0x00100000, 0x50040000, + 0x4c000000, 0x42000000, 0x0000aaaa, 0x44000800, + 0x42001800, 0x00005555, 0x41782000, 0x82102400, + 0x00010000, 0x40100000, 0x80042c00, 0x440c2800, + 0x42003000, 0x0000000a, 0x80183040, 0x040207ff, + 0x50140000, 0x800c0580, 0x04020004, 0x50040000, + 0x800c0580, 0x040207f2, 0x5c000000, 0x44000800, + 0x80142840, 0x4817c861, 0x1c01f000, 0x59a8081f, + 0x800409c0, 0x04020009, 0x49781c0c, 0x4a001a0c, + 0x00000200, 0x4a001804, 0x07000000, 0x59a80010, + 0x9c0001c0, 0x48001805, 0x0401fe01, 0x9c0409c0, + 0x48041806, 0x1c01f000, 0x59a8080c, 0x4006d000, + 0x4202b800, 0x00000001, 0x59a8180d, 0x480fc857, + 0x82041400, 0x00000014, 0x82082400, 0x00000014, + 0x40100000, 0x800c0480, 0x04001006, 0x44080800, + 0x40080800, 0x40101000, 0x815eb800, 0x0401f7f7, + 0x45780800, 0x495f5020, 0x1c01f000, 0x835c0480, + 0x00000020, 0x04001009, 0x496bc857, 0x815eb840, + 0x416a5800, 0x592ed000, 0x497a5800, 0x497a5801, + 0x812e59c0, 0x1c01f000, 0x42000000, 0x0010b853, + 0x0201f800, 0x0010aa47, 0x417a5800, 0x0401f7f9, + 0x815eb840, 0x04001008, 0x416a5800, 0x492fc857, + 0x592ed000, 0x497a5800, 0x497a5801, 0x812e59c0, + 0x1c01f000, 0x42000000, 0x0010b853, 0x0201f800, + 0x0010aa47, 0x417ab800, 0x417a5800, 0x0401f7f8, + 0x492fc857, 0x496a5800, 0x412ed000, 0x815eb800, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x492fc857, 0x812e59c0, 0x04000007, + 0x592c0001, 0x497a5801, 0x4c000000, 0x0401fff1, + 0x5c025800, 0x0401f7f9, 0x1c01f000, 0x4807c856, + 0x42007000, 0x0010b7f8, 0x4a007001, 0x00000000, + 0x59e00003, 0x82000540, 0x00008080, 0x4803c003, + 0x4a03b805, 0x90000001, 0x59dc0006, 0x4a03b805, + 0x70000000, 0x59dc0006, 0x4a03b805, 0x30000000, + 0x4200b000, 0x00000020, 0x497bb807, 0x8058b040, + 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, + 0x4a03b805, 0x60000001, 0x59dc0006, 0x4a03b805, + 0x70000001, 0x59dc0006, 0x4a03b805, 0x30000002, + 0x4200b000, 0x00000020, 0x497bb807, 0x8058b040, + 0x040207fe, 0x4a03b805, 0x30000000, 0x59dc0006, + 0x4a03b805, 0x60000001, 0x0401ffa1, 0x04000da5, + 0x42001000, 0x0010b7f6, 0x452c1000, 0x4a025801, + 0x00000001, 0x4a025802, 0x00000100, 0x4a025809, + 0x00107149, 0x497a580a, 0x497a580b, 0x497a580c, + 0x0401ff93, 0x04000d97, 0x42001000, 0x0010b7f7, + 0x452c1000, 0x4a025801, 0x00000000, 0x4a025802, + 0x00000100, 0x4a025809, 0x001011bc, 0x497a5803, + 0x497a5807, 0x497a5808, 0x497a580a, 0x59a80005, + 0x8c00050e, 0x04000006, 0x4a03b805, 0xe0000001, + 0x59dc0006, 0x8c000522, 0x040007fc, 0x1c01f000, + 0x4df00000, 0x4203e000, 0x50000000, 0x4c380000, + 0x40087000, 0x480bc857, 0x4a007002, 0x00000000, + 0x42007000, 0x0010b7f8, 0x82080400, 0x00000000, + 0x45780000, 0x58380005, 0x48087005, 0x80000540, + 0x04000005, 0x82000400, 0x00000000, 0x44080000, + 0x0401f003, 0x480bc857, 0x48087006, 0x58380001, + 0x80000540, 0x0400080c, 0x5c007000, 0x5c03e000, + 0x1c01f000, 0x4c380000, 0x42007000, 0x0010b7f8, + 0x58380001, 0x80000540, 0x04000803, 0x5c007000, + 0x1c01f000, 0x42007000, 0x0010b7f8, 0x58380001, + 0x82000580, 0x00000000, 0x04020012, 0x58380000, + 0x0c01f001, 0x0010088e, 0x0010088d, 0x0010088d, + 0x0010088d, 0x0010088d, 0x0010088d, 0x0010088d, + 0x0010088d, 0x0401fd4b, 0x58380808, 0x800409c0, + 0x04020024, 0x58380006, 0x80000540, 0x04020002, + 0x1c01f000, 0x4803c857, 0x48007002, 0x40006800, + 0x58340000, 0x80000540, 0x04020002, 0x48007005, + 0x48007006, 0x4a03b805, 0x20000000, 0x59dc0006, + 0x4a03b805, 0x30000000, 0x58340007, 0x4803b800, + 0x58340008, 0x4803b801, 0x58340004, 0x48007003, + 0x58340003, 0x48007004, 0x4803b803, 0x58340001, + 0x8c000500, 0x04000004, 0x4a007001, 0x00000001, + 0x0401f028, 0x4a007001, 0x00000002, 0x0401f03d, + 0x0201f800, 0x001093ea, 0x0201f800, 0x0010a69d, + 0x04000017, 0x4a03b805, 0x20000000, 0x59dc0006, + 0x4a03b805, 0x30000000, 0x4807b800, 0x480bb801, + 0x4a007003, 0x00000010, 0x480c7009, 0x42001000, + 0x00100875, 0x0201f800, 0x00105f9a, 0x58380008, + 0x82000400, 0x00000004, 0x48007004, 0x4803b803, + 0x4a007001, 0x00000007, 0x0401f022, 0x0201f800, + 0x00109402, 0x42000800, 0x00000001, 0x42001000, + 0x00100875, 0x0201f800, 0x00105f76, 0x0401f7ba, + 0x4c040000, 0x4c080000, 0x58380803, 0x42001000, + 0x00003fff, 0x82040480, 0x00003fff, 0x04021003, + 0x40041000, 0x80000580, 0x48007003, 0x800800c4, + 0x4803b802, 0x4a03b805, 0x30000002, 0x59dc0006, + 0x4a03b805, 0x70000001, 0x59dc0006, 0x4a03b805, + 0x10000000, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x483bc857, 0x4c040000, 0x4c080000, 0x58380803, + 0x42001000, 0x00003fff, 0x82040480, 0x00003fff, + 0x04021003, 0x40041000, 0x80000580, 0x48007003, + 0x800800c4, 0x4803b802, 0x4a03b805, 0x10000002, + 0x5c001000, 0x5c000800, 0x1c01f000, 0x4c040000, + 0x4c380000, 0x42007000, 0x0010b7f8, 0x59dc0806, + 0x4807c857, 0x4a03b805, 0x20000000, 0x8c040d3e, + 0x04000007, 0x8c040d08, 0x04020cca, 0x58380001, + 0x82000500, 0x00000007, 0x0c01f804, 0x5c007000, + 0x5c000800, 0x1c01f000, 0x0010087d, 0x0010091e, + 0x0010092e, 0x001005d8, 0x001005d8, 0x001005d8, + 0x001005d8, 0x001011ea, 0x4807c856, 0x82040d00, + 0x43000f80, 0x04020009, 0x58380003, 0x80000540, + 0x0400001c, 0x59dc0000, 0x4803b800, 0x59dc0001, + 0x4803b801, 0x0401f7af, 0x58380802, 0x4a000802, + 0x00000200, 0x0401f01e, 0x4807c856, 0x82040d00, + 0x43000f80, 0x04020009, 0x58380003, 0x80000540, + 0x0400000c, 0x59dc0000, 0x4803b800, 0x59dc0001, + 0x4803b801, 0x0401f7b7, 0x58380002, 0x82000400, + 0x00000002, 0x46000000, 0x00000200, 0x0401f00c, + 0x4c340000, 0x58386802, 0x59dc0000, 0x4803c857, + 0x48006807, 0x59dc0001, 0x4803c857, 0x48006808, + 0x4a006802, 0x00000100, 0x5c006800, 0x4a007001, + 0x00000000, 0x4c300000, 0x58386002, 0x0401f80c, + 0x04000009, 0x58300009, 0x82000c80, 0x0010ab4a, + 0x04021c84, 0x82000c80, 0x00020000, 0x04001c81, + 0x0801f800, 0x5c006000, 0x0401f723, 0x4833c857, + 0x803061c0, 0x04000009, 0x59a8000c, 0x80300480, + 0x04001007, 0x59a8000d, 0x80300480, 0x04021004, + 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, + 0x1c01f000, 0x4803c856, 0x4dc00000, 0x42007000, + 0x0010b803, 0x4a007400, 0x00000000, 0x49787001, + 0x42038000, 0x00007720, 0x4a038006, 0x60000001, + 0x4a038009, 0xf4f60000, 0x42038000, 0x00007700, + 0x4a038006, 0x60000001, 0x4a038009, 0xf4f60000, + 0x4a03c822, 0x00000010, 0x4a0370e8, 0x00000000, + 0x0401f809, 0x4a0370e9, 0x00003a0f, 0x4a0370e8, + 0x00000000, 0x4a0370e8, 0x00000001, 0x5c038000, + 0x1c01f000, 0x4c5c0000, 0x4178b800, 0x0401f80a, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4c5c0000, + 0x825cbd40, 0x00000001, 0x0401f803, 0x5c00b800, + 0x1c01f000, 0x4803c856, 0x4dc00000, 0x4c500000, + 0x4c580000, 0x4c540000, 0x4a0370e8, 0x00000000, + 0x805cb9c0, 0x04000009, 0x4a038807, 0x00000004, + 0x59b800ea, 0x8c000510, 0x04000004, 0x59b800e0, + 0x0401f87b, 0x0401f7fb, 0x42038000, 0x00007720, + 0x0201f800, 0x00100ec1, 0x59c00007, 0x4a038006, + 0x20000000, 0x59c00007, 0x4a038006, 0x8000000a, + 0x59c00007, 0x4a038006, 0x8000000b, 0x59c00007, + 0x4a038006, 0x40000001, 0x83c00580, 0x00007700, + 0x04000004, 0x42038000, 0x00007700, 0x0401f7ed, + 0x42038000, 0x00007720, 0x42000800, 0x00000800, + 0x59c00007, 0x8c00051e, 0x04000006, 0x4a038006, + 0x90000001, 0x80040840, 0x040207fa, 0x0401fc11, + 0x83c00580, 0x00007700, 0x04000004, 0x42038000, + 0x00007700, 0x0401f7f1, 0x805cb9c0, 0x0402001d, + 0x4200b000, 0x00000020, 0x83b8ac00, 0x00000020, + 0x0201f800, 0x0010ab20, 0x4a0370fb, 0x00000001, + 0x4a037020, 0x001010bd, 0x59a80039, 0x82000500, + 0x0000ffff, 0x48037021, 0x4a037035, 0x0010bddb, + 0x4a037030, 0x0010b410, 0x4a037031, 0x0010ac00, + 0x4a037032, 0x0010b519, 0x4a037036, 0x0010b524, + 0x59840002, 0x48037034, 0x4a037038, 0x001010b4, + 0x4a0370fb, 0x00000001, 0x4178a000, 0x4200b000, + 0x00000020, 0x83b8ac00, 0x00000000, 0x0201f800, + 0x0010ab20, 0x4200b000, 0x00000040, 0x83b8ac00, + 0x00000040, 0x0201f800, 0x0010ab20, 0x805cb9c0, + 0x04020004, 0x4a0370e4, 0xaaaaaaaa, 0x0401f003, + 0x4a0370e4, 0xa2aaaa82, 0x4a0370e5, 0xaaaaaaaa, + 0x4a0370e6, 0xaaaaaaaa, 0x4a0370fb, 0x00000000, + 0x4a0370e6, 0xaaaaaaaa, 0x42038000, 0x00007720, + 0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e, + 0x02020800, 0x001005d8, 0x42038000, 0x00007700, + 0x4a038006, 0x90000000, 0x59c00007, 0x8c00051e, + 0x02020800, 0x001005d8, 0x5c00a800, 0x5c00b000, + 0x5c00a000, 0x5c038000, 0x1c01f000, 0x4d300000, + 0x4d380000, 0x40026000, 0x82000500, 0x7f000000, + 0x82000580, 0x00000003, 0x0402000f, 0x83326500, + 0x00ffffff, 0x59300203, 0x82000580, 0x00000004, + 0x04020009, 0x59300c06, 0x82040580, 0x00000009, + 0x04020005, 0x42027000, 0x00000047, 0x0201f800, + 0x000207a1, 0x5c027000, 0x5c026000, 0x1c01f000, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000, + 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, + 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4cc80000, 0x4ccc0000, 0x4cf00000, + 0x4cf40000, 0x4cf80000, 0x4cfc0000, 0x4d000000, + 0x4d040000, 0x0201f800, 0x00020015, 0x5c020800, + 0x5c020000, 0x5c01f800, 0x5c01f000, 0x5c01e800, + 0x5c01e000, 0x5c019800, 0x5c019000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800, + 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, + 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x493bc857, 0x0201f000, 0x00020044, + 0x83300500, 0x1f000000, 0x04000008, 0x81326580, + 0x80000130, 0x82000c80, 0x00000014, 0x02021800, + 0x001005d8, 0x0c01f013, 0x83300500, 0x000000ff, + 0x82000c80, 0x00000007, 0x02021800, 0x001005d8, + 0x0c01f025, 0x1c01f000, 0x82000d00, 0xc0000038, + 0x02020800, 0x001005d0, 0x0201f800, 0x001005d8, + 0x00000000, 0x00000048, 0x00000054, 0x00000053, + 0x00100a9b, 0x00100abf, 0x00100aba, 0x00100adf, + 0x00100aa6, 0x00100ab2, 0x00100a9b, 0x00100ada, + 0x00100b1a, 0x00100a9b, 0x00100a9b, 0x00100a9b, + 0x00100a9b, 0x00100b1d, 0x00100b23, 0x00100b34, + 0x00100b45, 0x00100a9b, 0x00100b4e, 0x00100b5a, + 0x00100a9b, 0x00100a9b, 0x00100a9b, 0x0201f800, + 0x001005d8, 0x00100aa4, 0x00100bff, 0x00100aec, + 0x00100b0f, 0x00100aa4, 0x00100aa4, 0x00100aa4, + 0x0201f800, 0x001005d8, 0x4803c856, 0x59300004, + 0x8c00053e, 0x04020005, 0x42027000, 0x00000055, + 0x0201f000, 0x000207a1, 0x0201f800, 0x00106f60, + 0x040007fa, 0x1c01f000, 0x4803c856, 0x0401f8a9, + 0x40002800, 0x41782000, 0x42027000, 0x00000056, + 0x0201f000, 0x000207a1, 0x4803c856, 0x42027000, + 0x00000057, 0x0201f000, 0x000207a1, 0x4803c856, + 0x59300007, 0x8c00051a, 0x04020010, 0x59325808, + 0x812e59c0, 0x04000014, 0x592c0408, 0x8c00051c, + 0x04020003, 0x4a026011, 0xffffffff, 0x59300004, + 0x8c00053e, 0x04020009, 0x42027000, 0x00000048, + 0x0201f000, 0x000207a1, 0x59325808, 0x4a025a06, + 0x00000007, 0x0401f7f4, 0x0201f800, 0x00106f60, + 0x040007f6, 0x1c01f000, 0x4803c856, 0x83300500, + 0x00ffffff, 0x0201f000, 0x001064d7, 0x1c01f000, + 0x4c040000, 0x59b808ea, 0x82040d00, 0x00000007, + 0x82040580, 0x00000003, 0x04000004, 0x42000000, + 0x60000000, 0x0401f8ab, 0x5c000800, 0x1c01f000, + 0x0401f8f9, 0x59325808, 0x812e59c0, 0x04000018, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000d80, + 0x00000029, 0x04020012, 0x59300203, 0x82000580, + 0x00000003, 0x0400000b, 0x59300807, 0x84040d26, + 0x48066007, 0x0201f800, 0x00020086, 0x4a03900d, + 0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000, + 0x0201f800, 0x00106f60, 0x040007f4, 0x59880052, + 0x80000000, 0x48031052, 0x4a03900d, 0x00000040, + 0x42000000, 0xc0000000, 0x0401f05a, 0x42007800, + 0x0010bde2, 0x42002000, 0x00003000, 0x42003000, + 0x00000105, 0x0201f800, 0x00105e04, 0x4a0370e4, + 0x02000000, 0x1c01f000, 0x4933c857, 0x0201f000, + 0x0002077d, 0x41300800, 0x800409c0, 0x02020800, + 0x001005d8, 0x0201f800, 0x001005d0, 0x4933c857, + 0x813261c0, 0x02000800, 0x001005d8, 0x0401f835, + 0x40002800, 0x0201f800, 0x0010a99c, 0x0401f8ae, + 0x04000007, 0x59326809, 0x59340200, 0x8c00050e, + 0x59300414, 0x02020800, 0x001092ce, 0x1c01f000, + 0x4933c857, 0x813261c0, 0x02000800, 0x001005d8, + 0x0401f8a1, 0x0400000b, 0x59325808, 0x0201f800, + 0x00109037, 0x04000007, 0x592c0208, 0x8400054e, + 0x48025a08, 0x417a7800, 0x0201f800, 0x00108be3, + 0x1c01f000, 0x485fc857, 0x5c000000, 0x4d780000, + 0x4203e000, 0x50000000, 0x4200b800, 0x00008005, + 0x0201f000, 0x001005dd, 0x4933c857, 0x83300480, + 0x00000020, 0x02021800, 0x001005d8, 0x83300c00, + 0x0010b8cc, 0x50040000, 0x80000000, 0x04001002, + 0x44000800, 0x1c01f000, 0x4933c857, 0x0401f7f4, + 0x4807c856, 0x59b800ea, 0x8c000510, 0x040007fd, + 0x59b800e0, 0x4803c857, 0x1c01f000, 0x4803c856, + 0x42000000, 0x10000000, 0x41300800, 0x0401f02d, + 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, + 0x80040d40, 0x4807c857, 0x59b800ea, 0x8c000516, + 0x04020003, 0x480770e1, 0x1c01f000, 0x8c000510, + 0x040007fa, 0x4c040000, 0x0401f809, 0x5c000800, + 0x82100480, 0x00000008, 0x040017f4, 0x4c040000, + 0x0401febc, 0x5c000800, 0x0401f7f0, 0x59b800e2, + 0x59b820e2, 0x80100580, 0x040207fd, 0x80102114, + 0x0401f006, 0x59b800e2, 0x59b820e2, 0x80100580, + 0x040207fd, 0x0401f001, 0x40101800, 0x800c190a, + 0x82100500, 0x0000001f, 0x820c1d00, 0x0000001f, + 0x800c2480, 0x82102500, 0x0000001f, 0x1c01f000, + 0x82000500, 0xf0000000, 0x82040d00, 0x0fffffff, + 0x80040d40, 0x4807c857, 0x42001000, 0x0010b804, + 0x50080000, 0x80000540, 0x04020005, 0x4a0370e5, + 0x00000003, 0x4a0370e4, 0x00000300, 0x80000000, + 0x44001000, 0x42001000, 0x00000400, 0x59b800ea, + 0x8c000510, 0x0400000c, 0x0401ffd5, 0x82100480, + 0x00000008, 0x04001007, 0x4c040000, 0x4c080000, + 0x0401fe88, 0x5c001000, 0x5c000800, 0x0401f020, + 0x59b800ea, 0x8c000516, 0x0402001d, 0x4a0370e4, + 0x00300000, 0x480770e1, 0x42001000, 0x0000ff00, + 0x80081040, 0x04000012, 0x59b808e4, 0x8c040d28, + 0x040207fc, 0x42001000, 0x0010b804, 0x50080000, + 0x80000040, 0x04020005, 0x4a0370e5, 0x00000002, + 0x4a0370e4, 0x00000200, 0x02001800, 0x001005d8, + 0x44001000, 0x8c040d2c, 0x1c01f000, 0x41f80000, + 0x50000000, 0x0201f800, 0x001005d8, 0x80081040, + 0x040207d3, 0x41f80000, 0x50000000, 0x0201f800, + 0x001005d8, 0x4d380000, 0x59300c06, 0x82040580, + 0x00000009, 0x04020006, 0x42027000, 0x00000047, + 0x0201f800, 0x000207a1, 0x80000580, 0x5c027000, + 0x1c01f000, 0x4c500000, 0x4a03900d, 0x00000001, + 0x59c8a020, 0x4a03900d, 0x00000002, 0x59c80820, + 0x8c50a52e, 0x04000002, 0x900409c0, 0x82040d00, + 0x0000ffff, 0x0201f800, 0x00105dd7, 0x02000800, + 0x001005d8, 0x4933c857, 0x8250a500, 0xff000000, + 0x82500580, 0x05000000, 0x04000003, 0x82000540, + 0x00000001, 0x5c00a000, 0x1c01f000, 0x0401ffe6, + 0x4933c857, 0x59300406, 0x82000580, 0x00000000, + 0x04000040, 0x59c82021, 0x4a03900d, 0x00000001, + 0x59c82821, 0x82142d00, 0x0000ffff, 0x59325808, + 0x812e59c0, 0x04000037, 0x59326809, 0x0201f800, + 0x001048d9, 0x02020800, 0x001092b6, 0x599c0019, + 0x8c00050c, 0x04020018, 0x0201f800, 0x001048d9, + 0x04020015, 0x59300811, 0x4807c857, 0x592c0408, + 0x8c00051c, 0x0402000e, 0x8400055c, 0x48025c08, + 0x592c0a04, 0x82040d00, 0x000000ff, 0x82040580, + 0x00000048, 0x04000004, 0x82040580, 0x00000018, + 0x04020003, 0x59300811, 0x48065803, 0x4a026011, + 0x7fffffff, 0x48166013, 0x0201f800, 0x001010dd, + 0x04020014, 0x0401f9fd, 0x40280000, 0x4802600d, + 0x04000005, 0x4832600b, 0x50200000, 0x4802600a, + 0x4822600c, 0x59300414, 0x8c00051c, 0x04020004, + 0x599c0019, 0x8c00050c, 0x0402086e, 0x4a03900d, + 0x00000040, 0x4a0370e5, 0x00000008, 0x1c01f000, + 0x59880052, 0x80000000, 0x48031052, 0x4a03900d, + 0x00000040, 0x42000000, 0xc0000000, 0x0401f71d, + 0x4cf80000, 0x58f40000, 0x8001f540, 0x0401f820, + 0x41781800, 0x0401f8e4, 0x04020014, 0x44140800, + 0x0401f82a, 0x04000011, 0x40043800, 0x42001800, + 0x00000001, 0x40142000, 0x0401f8db, 0x0402000b, + 0x801c3800, 0x501c0000, 0x44000800, 0x0401f810, + 0x801c0580, 0x04000004, 0x44103800, 0x801c3840, + 0x44143800, 0x0401f819, 0x5c01f000, 0x1c01f000, + 0x80f9f1c0, 0x04020003, 0x58f41202, 0x0401f003, + 0x42001000, 0x00000007, 0x1c01f000, 0x80f9f1c0, + 0x04020006, 0x58f40401, 0x82000480, 0x00000002, + 0x80f40400, 0x0401f005, 0x58f80401, 0x82000480, + 0x00000002, 0x80f80400, 0x50002800, 0x80000000, + 0x50002000, 0x1c01f000, 0x80f9f1c0, 0x04020008, + 0x58f40401, 0x82000480, 0x00000002, 0x02001800, + 0x001005d8, 0x4801ec01, 0x0401f00b, 0x58f80401, + 0x82000480, 0x00000002, 0x02001800, 0x001005d8, + 0x4801f401, 0x82000580, 0x00000002, 0x04020002, + 0x0401f809, 0x58f40202, 0x80000040, 0x4801ea02, + 0x02000800, 0x001005d8, 0x82000580, 0x00000001, + 0x1c01f000, 0x4d2c0000, 0x40fa5800, 0x0201f800, + 0x001007f4, 0x4979e800, 0x4179f000, 0x5c025800, + 0x1c01f000, 0x80f5e9c0, 0x04000009, 0x80f9f1c0, + 0x04020ff5, 0x4d2c0000, 0x40f65800, 0x0201f800, + 0x001007f4, 0x4179e800, 0x5c025800, 0x1c01f000, + 0x4cf40000, 0x59300807, 0x82040500, 0x00003100, + 0x04020032, 0x8c040d22, 0x04000032, 0x5930001f, + 0x8001ed40, 0x02000800, 0x001005d8, 0x82000580, + 0xffffffff, 0x04000029, 0x58f40201, 0x82000580, + 0x0000dcb3, 0x02020800, 0x001005d8, 0x58f40a02, + 0x82040500, 0x0000fffe, 0x04000003, 0x0401ff89, + 0x58f40a02, 0x82040480, 0x0000000f, 0x04021059, + 0x80040800, 0x4805ea02, 0x82040580, 0x00000008, + 0x0400005d, 0x82040480, 0x00000008, 0x0400100a, + 0x58f40000, 0x8001ed40, 0x02000800, 0x001005d8, + 0x58f40201, 0x82000580, 0x0000ddb9, 0x02020800, + 0x001005d8, 0x58f40401, 0x82000c00, 0x00000002, + 0x4805ec01, 0x80f40400, 0x59300812, 0x44040000, + 0x80000000, 0x45780000, 0x5c01e800, 0x1c01f000, + 0x42001000, 0x00000400, 0x59b800e4, 0x8c000524, + 0x04020023, 0x4a0370e4, 0x00030000, 0x40000000, + 0x59b800e4, 0x8c000524, 0x0402001b, 0x59300807, + 0x84040d62, 0x48066007, 0x4a0370e4, 0x00020000, + 0x4d2c0000, 0x0201f800, 0x001007d3, 0x04000025, + 0x492e601f, 0x4a025a01, 0x0000dcb3, 0x59300008, + 0x80001d40, 0x02000800, 0x001005d8, 0x580c080f, + 0x48065803, 0x59301811, 0x40040000, 0x800c0580, + 0x0402000d, 0x497a5a02, 0x4a025c01, 0x00000004, + 0x0401f011, 0x4a0370e4, 0x00020000, 0x40000000, + 0x40000000, 0x80081040, 0x02000800, 0x001005d8, + 0x0401f7d6, 0x4a025a02, 0x00000001, 0x4a025c01, + 0x00000006, 0x497a5804, 0x400c0000, 0x80040480, + 0x48025805, 0x412de800, 0x5c025800, 0x0401f7a9, + 0x5c025800, 0x4a02601f, 0xffffffff, 0x0401f7c3, + 0x4d2c0000, 0x58f65800, 0x0201f800, 0x001007f4, + 0x40f65800, 0x0201f800, 0x001007f4, 0x5c025800, + 0x0401f7f5, 0x4d2c0000, 0x0201f800, 0x001007d3, + 0x040007f8, 0x4a025a01, 0x0000ddb9, 0x4a025c01, + 0x00000002, 0x492de800, 0x412de800, 0x5c025800, + 0x0401f7a5, 0x0401ff33, 0x82f40400, 0x00000004, + 0x800c0400, 0x40000800, 0x50040000, 0x80100580, + 0x04000016, 0x82040c00, 0x00000002, 0x80081040, + 0x040207fa, 0x80f9f1c0, 0x04000011, 0x58f41202, + 0x82081480, 0x00000007, 0x82f80400, 0x00000002, + 0x800c0400, 0x40000800, 0x50040000, 0x80100580, + 0x04000006, 0x82040c00, 0x00000002, 0x80081040, + 0x040207fa, 0x0401f002, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fd, 0x4cf40000, 0x4cf80000, + 0x4001e800, 0x592c0a06, 0x800409c0, 0x0402001d, + 0x82f40580, 0xffffffff, 0x04000017, 0x58f40201, + 0x82000580, 0x0000dcb3, 0x02020800, 0x001005d8, + 0x58f40000, 0x8001f540, 0x04000006, 0x58f80201, + 0x82000580, 0x0000ddb9, 0x02020800, 0x001005d8, + 0x41783800, 0x0401f839, 0x04020006, 0x0401ff32, + 0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000, + 0x0401ff2d, 0x4a025a06, 0x00000011, 0x0401f7f9, + 0x82f40580, 0xffffffff, 0x04020f27, 0x0401f7f5, + 0x4cf40000, 0x4cf80000, 0x4001e800, 0x82040580, + 0x00000001, 0x0402001f, 0x82f40580, 0xffffffff, + 0x04000019, 0x58f40201, 0x82000580, 0x0000dcb3, + 0x02020800, 0x001005d8, 0x58f40000, 0x8001f540, + 0x04000006, 0x58f80201, 0x82000580, 0x0000ddb9, + 0x02020800, 0x001005d8, 0x41783800, 0x0401f813, + 0x04020008, 0x0401ff0c, 0x42000800, 0x00000001, + 0x497a601f, 0x5c01f000, 0x5c01e800, 0x1c01f000, + 0x0401ff05, 0x42000800, 0x00000011, 0x0401f7f9, + 0x4c040000, 0x82f40580, 0xffffffff, 0x04020efe, + 0x5c000800, 0x0401f7f3, 0x4803c856, 0x401c2000, + 0x41781800, 0x0401ff8c, 0x0402002c, 0x58f42003, + 0x42001800, 0x00000001, 0x0401ff87, 0x04020027, + 0x0401feb8, 0x40082800, 0x82f40400, 0x00000004, + 0x40003000, 0x50182000, 0x40100000, 0x801c0580, + 0x04000005, 0x42001800, 0x00000001, 0x0401ff7a, + 0x0402001a, 0x82183400, 0x00000002, 0x80142840, + 0x040207f5, 0x80f9f1c0, 0x04000013, 0x58f42a02, + 0x82142c80, 0x00000007, 0x82f80400, 0x00000003, + 0x40003000, 0x50182000, 0x40100000, 0x801c0580, + 0x04000005, 0x42001800, 0x00000001, 0x0401ff66, + 0x04020006, 0x82183400, 0x00000002, 0x80142840, + 0x040207f5, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x0201f800, 0x001005d8, 0x58380207, + 0x8c000502, 0x040007fc, 0x50200000, 0x80387c00, + 0x583c2800, 0x583c2001, 0x58380404, 0x80001540, + 0x04020002, 0x58381407, 0x58c83401, 0x58380c08, + 0x59303807, 0x497a6012, 0x497a6013, 0x0201f000, + 0x000200be, 0x592c0408, 0x8c000502, 0x040007ea, + 0x592c0409, 0x80000540, 0x040007e7, 0x82000c80, + 0x00000002, 0x04001011, 0x58380001, 0x80007540, + 0x02000800, 0x001005d8, 0x58380204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x40040000, 0x800409c0, 0x04000005, 0x82040c80, + 0x00000005, 0x040217f1, 0x80204400, 0x50200000, + 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, + 0x592c0a07, 0x592c4c08, 0x592c300d, 0x59303807, + 0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f, + 0x480a6010, 0x481a6011, 0x80040840, 0x4806600d, + 0x02000000, 0x000200c6, 0x80204000, 0x50201800, + 0x800c19c0, 0x0402000c, 0x58380001, 0x80007540, + 0x02000800, 0x001005d8, 0x58380204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x50201800, 0x483a600b, 0x480e600a, 0x4822600c, + 0x0201f000, 0x000200c6, 0x4803c856, 0x592c0208, + 0x8c00051e, 0x04020017, 0x50200000, 0x80306c00, + 0x40240000, 0x0c01f001, 0x00100e46, 0x00100e46, + 0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e46, + 0x00100e46, 0x00100e46, 0x00100e4f, 0x00100e46, + 0x00100e4f, 0x00100e46, 0x00100e46, 0x00100e4f, + 0x00100e46, 0x00100e46, 0x0201f800, 0x001005d8, + 0x8400051e, 0x48025a08, 0x50200000, 0x80306c00, + 0x58343801, 0x481e600f, 0x0401f007, 0x58341802, + 0x58342800, 0x58343801, 0x480e6010, 0x4816600e, + 0x481e600f, 0x0401f246, 0x4933c857, 0x5931f808, + 0x59300a06, 0x800409c0, 0x04000005, 0x80040906, + 0x04020002, 0x80040800, 0x4805fc06, 0x4a026206, + 0x00000002, 0x592c0409, 0x82000500, 0x00000008, + 0x0400000b, 0x0401f834, 0x59300203, 0x82000580, + 0x00000004, 0x04020005, 0x42027000, 0x00000048, + 0x0201f800, 0x000207a1, 0x1c01f000, 0x4cfc0000, + 0x58fc0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x0402000c, 0x58fc000b, 0x800001c0, + 0x04000009, 0x58fc0407, 0x800001c0, 0x04000006, + 0x58fc080b, 0x8c040d16, 0x04000017, 0x58fc0007, + 0x0401f00a, 0x58fc0408, 0x8c000512, 0x04020014, + 0x58fc0c09, 0x8c040d16, 0x04020003, 0x5c01f800, + 0x1c01f000, 0x58fc000a, 0x59300811, 0x80040580, + 0x04020009, 0x59300007, 0x84000500, 0x48026007, + 0x42027000, 0x00000048, 0x5c01f800, 0x0201f000, + 0x000207a1, 0x5c01f800, 0x1c01f000, 0x58fdf809, + 0x0401f7ec, 0x4933c857, 0x59b808ea, 0x82040d00, + 0x00000007, 0x82040580, 0x00000000, 0x0400001e, + 0x82040580, 0x00000003, 0x0400001b, 0x59300406, + 0x4c000000, 0x4a026406, 0x00000000, 0x42003000, + 0x00000041, 0x42000000, 0x50000000, 0x41300800, + 0x4c180000, 0x0401fce7, 0x5c003000, 0x0400000b, + 0x42000000, 0x0000001e, 0x80000040, 0x040207ff, + 0x80183040, 0x040207f4, 0x42000000, 0x40000000, + 0x41300800, 0x0401fcdb, 0x5c000000, 0x48026406, + 0x1c01f000, 0x59300007, 0x84000500, 0x48026007, + 0x0401f7fc, 0x59c00007, 0x4a038006, 0x30000000, + 0x40000000, 0x59c00007, 0x8c00050a, 0x040207fe, + 0x1c01f000, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4dc00000, 0x4a0370e8, 0x00000000, 0x42038000, + 0x00007720, 0x0401fff0, 0x42038000, 0x00007700, + 0x0401ffed, 0x0201f800, 0x0010513b, 0x04020013, + 0x4a038891, 0x0000ffff, 0x497b8880, 0x497b8892, + 0x42001000, 0x00000190, 0x40000000, 0x40000000, + 0x80081040, 0x040207fd, 0x42000000, 0x0010b8a6, + 0x0201f800, 0x0010aa47, 0x0401f80e, 0x5c038000, + 0x0201f000, 0x00105258, 0x0401f82d, 0x42000000, + 0x0010b8a7, 0x0201f800, 0x0010aa47, 0x0401f805, + 0x48178892, 0x480b8880, 0x5c038000, 0x1c01f000, + 0x496fc857, 0x836c0580, 0x00000003, 0x0402000b, + 0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048, + 0x42001800, 0x0000ffff, 0x0201f800, 0x00103a3e, + 0x5c001800, 0x5c001000, 0x42000800, 0x0000003c, + 0x0201f800, 0x00101345, 0x59a8006c, 0x80000540, + 0x04000006, 0x59a8106d, 0x800811c0, 0x04000003, + 0x0201f800, 0x00101aaf, 0x4a038891, 0x0000ffff, + 0x4a03900d, 0x00000040, 0x0201f800, 0x0010098e, + 0x4a0370e8, 0x00000001, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x59c41080, 0x497b8880, + 0x59c42892, 0x497b8892, 0x0201f800, 0x0010513b, + 0x04020002, 0x1c01f000, 0x42002000, 0x00000260, + 0x59c418a4, 0x820c1d00, 0x0000000f, 0x820c0580, + 0x00000000, 0x04000010, 0x59c41805, 0x820c1d00, + 0x00000001, 0x0402000e, 0x59c418a4, 0x820c1d00, + 0x0000000f, 0x820c0480, 0x00000007, 0x04001004, + 0x820c0480, 0x0000000c, 0x04001003, 0x80102040, + 0x040207ec, 0x497b8891, 0x1c01f000, 0x4c100000, + 0x42002000, 0x00000019, 0x46000000, 0x00000001, + 0x0201f800, 0x00101937, 0x50001800, 0x820c1d00, + 0x00000001, 0x04000005, 0x80102040, 0x040207f7, + 0x5c002000, 0x0401f7f0, 0x5c002000, 0x0401f7ec, + 0x4803c856, 0x1c01f000, 0x4d2c0000, 0x59325808, + 0x592c0a04, 0x4807c857, 0x82040d00, 0x000000ff, + 0x82040500, 0x0000000f, 0x0c01f001, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f7f, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f67, 0x00100f67, + 0x00100f7f, 0x00100f67, 0x00100f69, 0x00100f67, + 0x00100f67, 0x00100f67, 0x00100f67, 0x0201f800, + 0x001005d8, 0x82040580, 0x0000003b, 0x02020800, + 0x001005d8, 0x592c020a, 0x8c000500, 0x0400005f, + 0x592c1a07, 0x82040500, 0x0000000f, 0x82000400, + 0x001010bd, 0x50001000, 0x50080000, 0x59302013, + 0x4802600a, 0x492e600b, 0x480a600c, 0x480e600d, + 0x48126012, 0x5c025800, 0x1c01f000, 0x82040500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50001000, + 0x50080000, 0x592c1a07, 0x4802600a, 0x492e600b, + 0x480a600c, 0x480e600d, 0x497a6012, 0x0401f7f2, + 0x8c040d00, 0x04020041, 0x82040d00, 0x00000080, + 0x0400003e, 0x0201f000, 0x000200cf, 0x59300013, + 0x59301012, 0x80080580, 0x0402000c, 0x42007800, + 0x80000005, 0x592c1208, 0x82080500, 0xffff7fff, + 0x48025a08, 0x8c08151e, 0x0402002d, 0x823c7d40, + 0x00000020, 0x0401f02a, 0x480bc857, 0x42000000, + 0x0010b851, 0x0201f800, 0x0010aa47, 0x59300414, + 0x4803c857, 0x8c000514, 0x04020007, 0x599c1819, + 0x8c0c1d12, 0x04020004, 0x820c1d40, 0x00000001, + 0x0401f01d, 0x59302013, 0x0401f92b, 0x0402001a, + 0x42007800, 0x80000005, 0x5930500d, 0x592c0208, + 0x4803c857, 0x8c00051e, 0x04020005, 0x823c7d40, + 0x00000020, 0x5930400c, 0x0401f004, 0x8400051e, + 0x48025a08, 0x0401f8da, 0x50201800, 0x480e600a, + 0x4832600b, 0x4822600c, 0x482a600d, 0x480fc857, + 0x4833c857, 0x4823c857, 0x482bc857, 0x80000580, + 0x483e6004, 0x1c01f000, 0x0201f800, 0x001005d8, + 0x4933c857, 0x4d2c0000, 0x59900004, 0x81300580, + 0x02020800, 0x001005d8, 0x0201f800, 0x00109037, + 0x02000800, 0x001005d8, 0x59325808, 0x4d3c0000, + 0x4d400000, 0x59300004, 0x4803c857, 0x4c000000, + 0x0201f800, 0x00106dc3, 0x0201f800, 0x00106b8a, + 0x5c000000, 0x8c000516, 0x04000010, 0x592c000f, + 0x4803c857, 0x48025807, 0x41780800, 0x42028000, + 0x00000002, 0x0201f800, 0x00104e70, 0x4a025c06, + 0x0000ffff, 0x0201f800, 0x000202da, 0x0201f800, + 0x00107911, 0x0401f015, 0x4a026203, 0x00000002, + 0x592c0208, 0x8400054e, 0x48025a08, 0x59300406, + 0x82000580, 0x00000006, 0x04020009, 0x811800ca, + 0x81c80c00, 0x58040939, 0x592c000d, 0x80040480, + 0x592c080f, 0x80040480, 0x4802580b, 0x417a7800, + 0x0201f800, 0x00108be3, 0x5c028000, 0x5c027800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59900004, 0x81300580, 0x02020800, 0x001005d8, + 0x0201f800, 0x00109037, 0x02000800, 0x001005d8, + 0x59325808, 0x592c0208, 0x84000540, 0x48025a08, + 0x0401f7bf, 0x491bc857, 0x49d3c857, 0x4dd00000, + 0x41780800, 0x8007a0ca, 0x83d3a400, 0x00007600, + 0x4a03a005, 0x80000002, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020029, + 0x59d01006, 0x82080500, 0x00006000, 0x82000580, + 0x00006000, 0x0400002f, 0x82080500, 0x40008000, + 0x040007f8, 0x800409c0, 0x0402002a, 0x811a31c0, + 0x04000028, 0x42000000, 0x00001002, 0x50001000, + 0x46000000, 0x00000512, 0x42001800, 0x0000000a, + 0x59e00000, 0x8c00051a, 0x040207fc, 0x800c1840, + 0x040207fc, 0x42000000, 0x00001002, 0x46000000, + 0x00000514, 0x42001800, 0x0000000a, 0x59e00000, + 0x8c00053a, 0x040207fc, 0x800c1840, 0x040207fc, + 0x42000000, 0x00001002, 0x44080000, 0x0401f00d, + 0x59d01006, 0x82080500, 0x00006000, 0x82000580, + 0x00006000, 0x04000007, 0x8c08151e, 0x040007f9, + 0x59d01006, 0x82080500, 0x00006000, 0x040207f5, + 0x83d3a400, 0x00000020, 0x80040800, 0x82040480, + 0x00000005, 0x040017bf, 0x5c03a000, 0x1c01f000, + 0x491bc857, 0x49d3c857, 0x4dd00000, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x4a03a005, + 0x80000001, 0x59d00006, 0x83d3a400, 0x00000020, + 0x80040800, 0x82040480, 0x00000005, 0x040017f8, + 0x5c03a000, 0x1c01f000, 0x59d00006, 0x8c00053e, + 0x0400001e, 0x59902804, 0x4817c857, 0x801429c0, + 0x04000013, 0x5990000a, 0x5990080b, 0x5990100c, + 0x5990180d, 0x4800280a, 0x4804280b, 0x4808280c, + 0x480c280d, 0x59d00000, 0x59d00801, 0x59d01002, + 0x59d01803, 0x59d02004, 0x4800280e, 0x4804280f, + 0x48082810, 0x480c2811, 0x48102812, 0x59900006, + 0x82000500, 0xffff0000, 0x48032006, 0x4a03a005, + 0x30000000, 0x59d00006, 0x1c01f000, 0x4803c856, + 0x80204000, 0x50200000, 0x80000540, 0x04000003, + 0x80285040, 0x1c01f000, 0x58300001, 0x80000540, + 0x0400000e, 0x4802600b, 0x40006000, 0x58300204, + 0x82000500, 0x0000000f, 0x82000400, 0x001010bd, + 0x50004000, 0x802041c0, 0x02000800, 0x001005d8, + 0x80285040, 0x1c01f000, 0x40005000, 0x1c01f000, + 0x00000005, 0x00000008, 0x0000000b, 0x0000000e, + 0x00000011, 0x00000000, 0x00000000, 0x0000000b, + 0x00000000, 0x00000000, 0x00000000, 0x001010b8, + 0x001010b7, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x001010b8, 0x001010b7, 0x001010b4, + 0x001010b8, 0x001010b7, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x001010b8, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x001010b8, 0x001010b8, 0x001010b8, + 0x00000000, 0x001010b8, 0x00000000, 0x00000000, + 0x00000000, 0x4813c857, 0x492fc857, 0x4933c857, + 0x48126012, 0x592c5207, 0x802851c0, 0x0400004a, + 0x412c6000, 0x0401f84b, 0x04000009, 0x82240580, + 0x00000002, 0x04020003, 0x5830000d, 0x80102480, + 0x50200000, 0x80004540, 0x0400003f, 0x50200000, + 0x80000540, 0x0400000b, 0x80301400, 0x58080002, + 0x80102480, 0x0400101e, 0x801021c0, 0x04000009, + 0x80285040, 0x04000034, 0x80204000, 0x0401f7f4, + 0x58300001, 0x80006540, 0x0400002f, 0x0401f7e6, + 0x80285040, 0x0400002c, 0x80204000, 0x50200000, + 0x80000540, 0x0402000a, 0x58300001, 0x80006540, + 0x04000025, 0x58300204, 0x82004d00, 0x0000000f, + 0x82244400, 0x001010bd, 0x50204000, 0x592c0208, + 0x8400051e, 0x48025a08, 0x0401f013, 0x80102080, + 0x80102000, 0x48126010, 0x4813c857, 0x58080802, + 0x40100000, 0x80042480, 0x02001800, 0x001005d8, + 0x58080000, 0x58081801, 0x80102400, 0x4812600e, + 0x480e600f, 0x4813c857, 0x592c0208, 0x8400055e, + 0x48025a08, 0x4833c857, 0x4823c857, 0x482bc857, + 0x4832600b, 0x4822600c, 0x482a600d, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, + 0x58300204, 0x82004d00, 0x0000000f, 0x82244400, + 0x001010bd, 0x82000500, 0x000000ff, 0x82000580, + 0x00000029, 0x0402001b, 0x50204000, 0x592c0409, + 0x80000540, 0x02000800, 0x001005d8, 0x82000c80, + 0x00000002, 0x04001011, 0x58300001, 0x80006540, + 0x02000800, 0x001005d8, 0x58300204, 0x82000500, + 0x0000000f, 0x82000400, 0x001010bd, 0x50004000, + 0x40040000, 0x800409c0, 0x04000006, 0x82040c80, + 0x00000005, 0x040217f1, 0x80204400, 0x80000580, + 0x1c01f000, 0x59e00004, 0x8c00050e, 0x02020000, + 0x00100903, 0x1c01f000, 0x4c5c0000, 0x59e4b800, + 0x485fc857, 0x825c0500, 0x0000001f, 0x04000004, + 0x59e40862, 0x0201f800, 0x001005d8, 0x825c0500, + 0x000000e0, 0x02000800, 0x001005d8, 0x8c5cbd0e, + 0x04020807, 0x8c5cbd0c, 0x04020809, 0x8c5cbd0a, + 0x04020878, 0x5c00b800, 0x1c01f000, 0x4803c856, + 0x4a03c800, 0x00000080, 0x1c01f000, 0x4d2c0000, + 0x42007800, 0x0010b8ec, 0x583c0001, 0x583c0802, + 0x80040540, 0x0400003f, 0x42000800, 0x0010b7f7, + 0x50065800, 0x592c0002, 0x82000580, 0x00000000, + 0x0400000e, 0x59e40850, 0x59e41853, 0x400c0000, + 0x80040400, 0x59e40852, 0x4807c857, 0x80041480, + 0x04021008, 0x40001000, 0x480bc857, 0x4a007800, + 0x00000001, 0x0401f006, 0x4803c857, 0x0401f029, + 0x59e41050, 0x480bc857, 0x49787800, 0x480bc857, + 0x480fc857, 0x592c0003, 0x80000540, 0x04000006, + 0x80080580, 0x04020004, 0x592c0003, 0x4803c857, + 0x480bc857, 0x480a5803, 0x592c0007, 0x800001c0, + 0x04000007, 0x592c1007, 0x480bc857, 0x583c0003, + 0x4803c857, 0x80080480, 0x04001003, 0x583c1001, + 0x480bc857, 0x583c0802, 0x480bc857, 0x4807c857, + 0x4a025801, 0x00000000, 0x4a025809, 0x001011bc, + 0x480a5807, 0x48065808, 0x59e40053, 0x48025804, + 0x412c1000, 0x492fc857, 0x0201f800, 0x00100858, + 0x5c025800, 0x4a03c800, 0x00000040, 0x1c01f000, + 0x42007800, 0x0010b7f7, 0x503c7800, 0x4a007802, + 0x00000100, 0x42007800, 0x0010b8ec, 0x583c0000, + 0x4803c857, 0x82000d80, 0x00000001, 0x04000004, + 0x80000000, 0x48007800, 0x0401f019, 0x49787800, + 0x583c1806, 0x583c0005, 0x800c1800, 0x480c7806, + 0x800c0580, 0x04020002, 0x49787806, 0x583c0807, + 0x800409c0, 0x0400000e, 0x583c0008, 0x80000000, + 0x48007808, 0x80040580, 0x04020009, 0x49787808, + 0x583c2006, 0x42001800, 0x00000001, 0x42001000, + 0x00008028, 0x0201f800, 0x00103a3e, 0x1c01f000, + 0x4a03c800, 0x00000020, 0x0201f800, 0x0010aa40, + 0x59e40000, 0x1c01f000, 0x4d2c0000, 0x4a007001, + 0x00000000, 0x82040d00, 0x43000f80, 0x02020800, + 0x001005d8, 0x58380009, 0x4803c00f, 0x0201f800, + 0x00109402, 0x583a5808, 0x592c0000, 0x48007008, + 0x800001c0, 0x04020002, 0x49787007, 0x0201f800, + 0x001007f4, 0x5c025800, 0x0201f000, 0x0010087d, + 0x4803c856, 0x4c3c0000, 0x4d2c0000, 0x4d300000, + 0x5830000a, 0x80025d40, 0x02000800, 0x001005d8, + 0x592e6008, 0x4c300000, 0x0201f800, 0x0010941a, + 0x5c006000, 0x02000800, 0x001005d8, 0x58300002, + 0x82000580, 0x00000100, 0x04020010, 0x5930780b, + 0x583c0001, 0x80000540, 0x0400000e, 0x4802600b, + 0x40007800, 0x82000400, 0x00000002, 0x48006003, + 0x583c0000, 0x48006004, 0x40301000, 0x0201f800, + 0x00100858, 0x0401f00c, 0x4a025a06, 0x00000002, + 0x4c300000, 0x0201f800, 0x000202da, 0x5c006000, + 0x40325800, 0x0201f800, 0x001007f4, 0x0201f800, + 0x0002077d, 0x5c026000, 0x5c025800, 0x5c007800, + 0x1c01f000, 0x4803c856, 0x4d2c0000, 0x4d300000, + 0x42007000, 0x0010b7f8, 0x58380801, 0x82040580, + 0x00000002, 0x04020011, 0x58386002, 0x5830000a, + 0x812c0580, 0x0402000d, 0x59e00004, 0x8c00050e, + 0x040007fe, 0x59dc0006, 0x4803c857, 0x4a03b805, + 0x20000000, 0x8c00053e, 0x040007f8, 0x4a007001, + 0x00000000, 0x0401f019, 0x58386006, 0x40305000, + 0x803061c0, 0x02000800, 0x001005d8, 0x5830000a, + 0x812c0580, 0x04000004, 0x40305000, 0x58306000, + 0x0401f7f8, 0x40280000, 0x80300580, 0x58300000, + 0x04000006, 0x48005000, 0x800001c0, 0x04020007, + 0x48287005, 0x0401f005, 0x800001c0, 0x04020002, + 0x48007005, 0x48007006, 0x40325800, 0x0201f800, + 0x001007f4, 0x42007000, 0x0010b7f8, 0x58380001, + 0x82000580, 0x00000000, 0x02000800, 0x0010087d, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x4803c856, + 0x42000800, 0x0000003c, 0x48079000, 0x59c80000, + 0x80040500, 0x040207fe, 0x497b9005, 0x4a039035, + 0x00880200, 0x59a8000e, 0x800000e0, 0x4803900e, + 0x4a039011, 0x00000024, 0x4a03900f, 0x0010d1c0, + 0x4a039010, 0x0010d1c0, 0x4a039015, 0x0000007f, + 0x4a03900d, 0x00000040, 0x4a039000, 0x00001600, + 0x1c01f000, 0x59c80007, 0x8c000508, 0x040208b7, + 0x59c80800, 0x8c040d16, 0x04020004, 0x82000500, + 0x00000006, 0x0c01f005, 0x4807c857, 0x82000500, + 0x0000000e, 0x0c01f001, 0x001012a8, 0x001012a6, + 0x00105999, 0x001012a6, 0x001012aa, 0x001012a6, + 0x001012aa, 0x001012aa, 0x001012a6, 0x001012a6, + 0x001012a6, 0x001012a6, 0x001012aa, 0x001012a6, + 0x001012aa, 0x001012a6, 0x0201f800, 0x001005d8, + 0x4803c857, 0x1c01f000, 0x59c8080c, 0x4807c857, + 0x82040500, 0x00006000, 0x04000004, 0x0201f800, + 0x0010aa03, 0x0401f006, 0x82040500, 0x007f0000, + 0x04000006, 0x0201f800, 0x0010a9d5, 0x0201f800, + 0x00106eb3, 0x0401f02b, 0x82040500, 0x00000014, + 0x04000014, 0x0201f800, 0x0010aa32, 0x836c0580, + 0x00000003, 0x0400000d, 0x0201f800, 0x0010513b, + 0x04000004, 0x0201f800, 0x0010411d, 0x0401f007, + 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f817, 0x0401f015, + 0x82040500, 0x00001c00, 0x04000005, 0x0201f800, + 0x0010aa11, 0x0401f810, 0x0401f00e, 0x82040500, + 0x00000140, 0x04000005, 0x0201f800, 0x0010aa24, + 0x0401f809, 0x0401f007, 0x82040500, 0x00008000, + 0x04000004, 0x0201f800, 0x0010a9fc, 0x0401f802, + 0x1c01f000, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x0201f800, 0x00100ec9, 0x5c002800, 0x5c002000, + 0x5c001800, 0x1c01f000, 0x4803c856, 0x59a80804, + 0x59a8002b, 0x82000500, 0xfffff000, 0x80040540, + 0x4803502b, 0x59a8002f, 0x82000500, 0xfffff000, + 0x80040540, 0x4803502f, 0x48078882, 0x82041c00, + 0x0000000f, 0x800c1908, 0x820c1c00, 0x00000004, + 0x400c2000, 0x901029c0, 0x82040480, 0x000001e4, + 0x04021005, 0x42001000, 0x00000008, 0x801020c6, + 0x0401f031, 0x82040480, 0x00000230, 0x04021009, + 0x42001000, 0x00000007, 0x801000c2, 0x800000c2, + 0x80100400, 0x80100400, 0x80102400, 0x0401f026, + 0x82040480, 0x00000298, 0x04021008, 0x42001000, + 0x00000006, 0x801000c2, 0x800000c2, 0x80100400, + 0x80102400, 0x0401f01c, 0x82040480, 0x00000328, + 0x04021007, 0x42001000, 0x00000005, 0x801000c2, + 0x800000c2, 0x80102400, 0x0401f013, 0x82040480, + 0x00000404, 0x04021005, 0x42001000, 0x00000004, + 0x801020c4, 0x0401f00c, 0x82040480, 0x0000056c, + 0x04021006, 0x42001000, 0x00000003, 0x801000c2, + 0x80102400, 0x0401f004, 0x42001000, 0x00000002, + 0x801020c2, 0x82100480, 0x00000110, 0x80000080, + 0x80002000, 0x800800d0, 0x80140540, 0x80100540, + 0x48039035, 0x1c01f000, 0x59c80815, 0x0201f800, + 0x001005d0, 0x82040d00, 0x0000007c, 0x48079000, + 0x59c80000, 0x80040500, 0x040207fe, 0x8c040d04, + 0x04000003, 0x59c80035, 0x48039035, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, + 0x4803c856, 0x497b88a9, 0x4a038807, 0x00000001, + 0x497b8807, 0x59c40005, 0x48038805, 0x0201f800, + 0x00101815, 0x4201d000, 0x000001f4, 0x0201f800, + 0x0010608e, 0x497b880e, 0x4200b000, 0x000001f4, + 0x42000000, 0x00000001, 0x42000800, 0x00000014, + 0x0201f800, 0x00101944, 0x42000800, 0x00000014, + 0x0201f800, 0x0010193f, 0x8c040d00, 0x04000005, + 0x8058b040, 0x040207f3, 0x0201f800, 0x001005d8, + 0x4200b000, 0x00000032, 0x42000000, 0x00000001, + 0x42000800, 0x000000b4, 0x0201f800, 0x00101944, + 0x42000800, 0x000000b4, 0x0201f800, 0x0010193f, + 0x8c040d00, 0x04000005, 0x8058b040, 0x040207f3, + 0x0201f800, 0x001005d8, 0x59c40005, 0x48038805, + 0x42000000, 0x00000089, 0x800008d0, 0x48075054, + 0x48075055, 0x48075056, 0x42000800, 0x000000e0, + 0x0201f800, 0x00101944, 0x42000800, 0x000000f4, + 0x0201f800, 0x0010193f, 0x82040500, 0xffffffd1, + 0x82000540, 0x00000002, 0x42000800, 0x000000f4, + 0x0201f800, 0x00101944, 0x42000800, 0x000000a0, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000001, + 0x42000800, 0x000000a0, 0x0201f800, 0x00101944, + 0x42000800, 0x00000000, 0x0201f800, 0x0010193f, + 0x82040540, 0x00000001, 0x42000800, 0x00000000, + 0x0201f800, 0x00101944, 0x4201d000, 0x0001d4c0, + 0x0201f800, 0x0010608e, 0x0401fa2b, 0x4a0388a7, + 0x0000f7f7, 0x4a0388a3, 0x8000403c, 0x4a0388ae, + 0x000061a8, 0x4a038801, 0x00032063, 0x4a038810, + 0x00410108, 0x4a038811, 0x00520608, 0x4a038812, + 0x00450320, 0x4a038813, 0x00440405, 0x4a03881c, + 0x004132e1, 0x4a038850, 0x80000108, 0x4a038860, + 0x00000008, 0x4a038870, 0x00000008, 0x4a038851, + 0x80000508, 0x4a038861, 0x00800000, 0x4a038871, + 0x00800000, 0x4a038852, 0x80000708, 0x4a038862, + 0x00800000, 0x4a038872, 0x00800000, 0x4a038853, + 0x80000608, 0x497b8863, 0x4a038873, 0x00800000, + 0x4a038882, 0x00000840, 0x4a0388a5, 0x0000001e, + 0x4a0388a6, 0x0000001e, 0x4a0388b0, 0x00007530, + 0x4a038802, 0x0000ffff, 0x4a038806, 0xc0e00800, + 0x1c01f000, 0x497b5022, 0x4a035021, 0x00000001, + 0x42000800, 0x00000040, 0x0201f800, 0x0010193f, + 0x82040500, 0xffffffaf, 0x82000540, 0x00000000, + 0x42000800, 0x00000040, 0x0201f800, 0x00101944, + 0x42000800, 0x000000f4, 0x0201f800, 0x0010193f, + 0x4c040000, 0x40040000, 0x84000548, 0x42000800, + 0x000000f4, 0x0201f800, 0x00101944, 0x42000800, + 0x00000000, 0x0201f800, 0x0010193f, 0x82040500, + 0xffffffc1, 0x82000540, 0x00000038, 0x42000800, + 0x00000000, 0x0201f800, 0x00101944, 0x5c000000, + 0x42000800, 0x000000f4, 0x0201f000, 0x00101944, + 0x59c40805, 0x4807c857, 0x59c40006, 0x80040d00, + 0x02000800, 0x001005d8, 0x82040500, 0x00e00800, + 0x04020004, 0x8c040d3e, 0x040208c4, 0x0401f007, + 0x82040500, 0x00800800, 0x02020800, 0x001005d0, + 0x0201f800, 0x001005d8, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x485fc857, 0x59c40006, 0x8c000500, + 0x04000003, 0x8c5cbd00, 0x04020079, 0x0201f800, + 0x0010513b, 0x04000014, 0x59c40005, 0x82000500, + 0x000000c0, 0x04000036, 0x0201f800, 0x00105151, + 0x04020033, 0x4a038805, 0x04000000, 0x59c400a3, + 0x82000500, 0xbf203fff, 0x480388a3, 0x497b5049, + 0x4a038805, 0x000000c0, 0x0201f800, 0x00105065, + 0x0401f063, 0x8c5cbd34, 0x04020025, 0x59c40005, + 0x8c00050c, 0x04020012, 0x8c00050e, 0x04020013, + 0x8c00050a, 0x04020014, 0x8c000508, 0x0400000b, + 0x59a80017, 0x82000580, 0x00000009, 0x04020007, + 0x42000000, 0x0010b844, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00105318, 0x0401f04b, 0x4a035033, + 0x00000000, 0x0401f00b, 0x4a035033, 0x00000002, + 0x0401f008, 0x42000000, 0x0010b846, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x001052c2, 0x0401f03e, + 0x0201f800, 0x00105378, 0x0401f03b, 0x8c5cbd34, + 0x04000037, 0x59c40005, 0x8c00053a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x0010513b, + 0x04020010, 0x4a038805, 0x04000000, 0x0201f800, + 0x00105149, 0x04020008, 0x4a035033, 0x00000001, + 0x4202d800, 0x00000001, 0x0201f800, 0x001050a2, + 0x0401f05b, 0x41780000, 0x0201f800, 0x00105113, + 0x0201f800, 0x001019fe, 0x4000c000, 0x0201f800, + 0x00101963, 0x836c1580, 0x00000004, 0x0402000d, + 0x8c5cbd00, 0x04020012, 0x59a81005, 0x8c081506, + 0x04020005, 0x59c410a3, 0x82081540, 0x00000008, + 0x480b88a3, 0x59c41006, 0x84081540, 0x480b8806, + 0x4a038805, 0x04000000, 0x4202d800, 0x00000001, + 0x497b5014, 0x0201f800, 0x00103b38, 0x8c5cbd3c, + 0x04020858, 0x8c5cbd00, 0x04000036, 0x42000000, + 0x0010b8ca, 0x0201f800, 0x0010aa47, 0x4a038805, + 0x00000001, 0x4200b000, 0x000003e8, 0x4201d000, + 0x00000064, 0x4c580000, 0x0201f800, 0x0010608e, + 0x0201f800, 0x001018d3, 0x5c00b000, 0x04000004, + 0x8058b040, 0x040207f6, 0x0401f004, 0x4a038805, + 0x00000001, 0x0401f01f, 0x59c40006, 0x84000500, + 0x48038806, 0x0201f800, 0x00106ede, 0x497b8880, + 0x0201f800, 0x0010a9c0, 0x59c4000d, 0x8c000500, + 0x02020800, 0x0010a9ce, 0x59c400a3, 0x82000500, + 0xfcf8ffff, 0x480388a3, 0x4a03504c, 0x00000002, + 0x4202d800, 0x00000004, 0x4a038805, 0x00000001, + 0x0201f800, 0x001006d4, 0x0401fb3b, 0x497b5052, + 0x4a035049, 0x00000001, 0x0201f800, 0x00100452, + 0x825cbd00, 0xbbfffffe, 0x485f8805, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59c41004, 0x480bc857, + 0x8c081500, 0x04000006, 0x4803c856, 0x497b2807, + 0x0201f800, 0x00106fa4, 0x0401f00a, 0x82080500, + 0x000001f0, 0x04000007, 0x4803c856, 0x417a3000, + 0x0201f800, 0x00106062, 0x0201f800, 0x00106fc6, + 0x4a038805, 0x80000000, 0x1c01f000, 0x59c408a3, + 0x4807c857, 0x84040d40, 0x480788a3, 0x1c01f000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x4a038805, 0x40000000, 0x42000000, 0x0010b8c6, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00106c55, + 0x59c41004, 0x8c081500, 0x04000054, 0x598e600d, + 0x497b2807, 0x813261c0, 0x04000032, 0x59300403, + 0x82000580, 0x00000032, 0x0402002e, 0x5930001c, + 0x48038833, 0x4a038807, 0x00018000, 0x4201d000, + 0x00000002, 0x0201f800, 0x0010608e, 0x497b8807, + 0x4201d000, 0x00000002, 0x0201f800, 0x0010608e, + 0x0201f800, 0x00106e21, 0x4201d000, 0x00007530, + 0x0201f800, 0x0010608e, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040d80, 0x00000000, 0x04000005, + 0x42000000, 0x00200000, 0x0201f800, 0x00101949, + 0x0201f800, 0x00106bbf, 0x59300008, 0x80000540, + 0x02000800, 0x001005d8, 0x40025800, 0x4a025a04, + 0x00000103, 0x5931d821, 0x58ef400b, 0x58ec0009, + 0x0801f800, 0x0201f800, 0x0002077d, 0x0401f047, + 0x598c000f, 0x82001c80, 0x000000c8, 0x0402100f, + 0x80000000, 0x4803180f, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x04020004, + 0x42000000, 0x00200000, 0x0401fbf7, 0x0201f800, + 0x0010604d, 0x0401f035, 0x4933c857, 0x0201f800, + 0x00106e21, 0x813261c0, 0x04000030, 0x4a026203, + 0x00000001, 0x42027000, 0x00000027, 0x0201f800, + 0x000207a1, 0x0401f029, 0x8c081508, 0x04000027, + 0x417a3000, 0x0201f800, 0x001070d8, 0x42032000, + 0x0000bf32, 0x0201f800, 0x00106062, 0x59926004, + 0x813261c0, 0x04000012, 0x42001800, 0x000000c8, + 0x0201f800, 0x001070a4, 0x0402000d, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000002, + 0x04020004, 0x42000000, 0x00200000, 0x0401fbce, + 0x0201f800, 0x00106052, 0x0401f00c, 0x4933c857, + 0x0201f800, 0x00106dc3, 0x813261c0, 0x04000007, + 0x42027000, 0x0000004f, 0x4a026203, 0x00000003, + 0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x0201f000, 0x00106c4b, + 0x4803c857, 0x59a80821, 0x48035021, 0x80041580, + 0x04000045, 0x800409c0, 0x04000023, 0x497b504c, + 0x42000000, 0x0010b80d, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x0010aaf9, 0x42001000, 0x00008011, + 0x59c40001, 0x82000500, 0x00018000, 0x82001d80, + 0x00000000, 0x04000009, 0x82001d80, 0x00008000, + 0x04000009, 0x82001d80, 0x00010000, 0x04000009, + 0x0201f800, 0x001005d8, 0x42001800, 0x00000000, + 0x0401f006, 0x42001800, 0x00000001, 0x0401f003, + 0x42001800, 0x00000003, 0x0201f800, 0x00103a3e, + 0x0401f021, 0x59a8084c, 0x800409c0, 0x04020007, + 0x59c4000d, 0x8c000520, 0x04000004, 0x42001800, + 0x00000003, 0x0401f002, 0x40041800, 0x0201f800, + 0x0010aadd, 0x42001000, 0x00008012, 0x0201f800, + 0x00103a3e, 0x0201f800, 0x001006d4, 0x0201f800, + 0x0010ab33, 0x0402000c, 0x0401f853, 0x4d400000, + 0x4d3c0000, 0x42028000, 0x00000028, 0x42027800, + 0x00000408, 0x0201f800, 0x00101fe5, 0x5c027800, + 0x5c028000, 0x1c01f000, 0x4803c857, 0x82000400, + 0x0010210e, 0x50000800, 0x82040d00, 0x000000ff, + 0x1c01f000, 0x4803c856, 0x4c580000, 0x4200b000, + 0x00000010, 0x497b88ac, 0x497b88ad, 0x8058b040, + 0x040207fe, 0x5c00b000, 0x1c01f000, 0x4807c857, + 0x48075010, 0x80041108, 0x4200b000, 0x00000010, + 0x497b88ac, 0x80000580, 0x800811c0, 0x04020006, + 0x82040500, 0x0000000f, 0x82000400, 0x0010ab38, + 0x50000000, 0x480388ad, 0x80081040, 0x8058b040, + 0x040207f5, 0x1c01f000, 0x59a80005, 0x04000003, + 0x84000546, 0x0401f002, 0x84000506, 0x48035005, + 0x4803c857, 0x1c01f000, 0x4803c857, 0x4c080000, + 0x4c040000, 0x4c000000, 0x59c40892, 0x4807c857, + 0x80041580, 0x04000010, 0x80041480, 0x04021007, + 0x80081080, 0x80081000, 0x4008b000, 0x42000000, + 0x00000201, 0x0401f004, 0x4008b000, 0x42000000, + 0x00000210, 0x48038886, 0x8058b040, 0x040207fe, + 0x497b8886, 0x5c000000, 0x5c000800, 0x5c001000, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x00103b25, + 0x04000005, 0x42028000, 0x0000002e, 0x0201f000, + 0x0010a449, 0x1c01f000, 0x42000800, 0x00000002, + 0x59a80005, 0x8c000514, 0x0402000b, 0x59c80835, + 0x82040d00, 0x00001f00, 0x80040910, 0x80040800, + 0x59a8006c, 0x80000540, 0x04000003, 0x42000800, + 0x0000025a, 0x4807c857, 0x1c01f000, 0x4c000000, + 0x59a80053, 0x4803c857, 0x82000580, 0x00000000, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59a80053, + 0x4803c857, 0x82000580, 0x00000001, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x59a80053, 0x4803c857, + 0x82000580, 0x00000003, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59a80053, 0x82000580, 0x00000002, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x4c040000, + 0x4c080000, 0x4c380000, 0x59a80040, 0x82000c80, + 0x00000007, 0x02021800, 0x001005d8, 0x0c01f806, + 0x5c007000, 0x5c001000, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x0010166c, 0x0010167f, 0x00101693, + 0x00101695, 0x001016bc, 0x001016be, 0x001016c0, + 0x4803c856, 0x4a035042, 0x00000000, 0x42000000, + 0x00000002, 0x0401fa1b, 0x42000000, 0x00000002, + 0x0401f9ad, 0x0401fab2, 0x4803c856, 0x4a035040, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c1, 0x0201f000, 0x0010606e, 0x497b5045, + 0x4a035050, 0x00000036, 0x4a03504f, 0x0000002a, + 0x4803c856, 0x4a035042, 0x00000001, 0x42000000, + 0x00000002, 0x0401f998, 0x4803c856, 0x4a035040, + 0x00000006, 0x42000800, 0x0000001e, 0x42001000, + 0x001016c1, 0x0201f000, 0x0010606e, 0x0201f800, + 0x001005d8, 0x4a035050, 0x00000036, 0x4803c856, + 0x4a035042, 0x00000003, 0x42000800, 0x00000000, + 0x0401faa3, 0x82040d00, 0x00000090, 0x82040580, + 0x00000090, 0x04000009, 0x82040580, 0x00000010, + 0x04000009, 0x82040580, 0x00000000, 0x04000008, + 0x0201f800, 0x001005d8, 0x42000000, 0x00000001, + 0x0401f005, 0x41780000, 0x0401f003, 0x42000000, + 0x00000002, 0x0401f970, 0x497b5046, 0x4803c856, + 0x4a035040, 0x00000006, 0x42000800, 0x0000001e, + 0x42001000, 0x001016c1, 0x0201f000, 0x0010606e, + 0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8, + 0x1c01f000, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c380000, 0x59a80042, 0x82000c80, 0x00000007, + 0x02021800, 0x001005d8, 0x0c01f806, 0x5c007000, + 0x5c001000, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x001016d7, 0x001016f6, 0x0010174a, 0x00101761, + 0x00101778, 0x00101781, 0x00101783, 0x0401f9fc, + 0x0402001b, 0x59a81048, 0x42000800, 0x00000000, + 0x0401fa63, 0x82040d00, 0x00000090, 0x82040580, + 0x00000090, 0x04000009, 0x82040580, 0x00000010, + 0x04000008, 0x82040580, 0x00000000, 0x04000007, + 0x0201f800, 0x001005d8, 0x84081540, 0x0401f004, + 0x84081542, 0x0401f002, 0x84081544, 0x480b5048, + 0x4a035040, 0x00000001, 0x0401f003, 0x0401f8cb, + 0x0401ff82, 0x1c01f000, 0x0401f88f, 0x04000052, + 0x0401f9db, 0x0402002a, 0x42000800, 0x00000000, + 0x0401fa43, 0x82040d00, 0x00000090, 0x82040580, + 0x00000000, 0x04000044, 0x82040580, 0x00000010, + 0x04000006, 0x82040580, 0x00000090, 0x04000009, + 0x0201f800, 0x001005d8, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000036, + 0x42000800, 0x00000000, 0x0401fa2d, 0x82040d00, + 0x00000090, 0x82040580, 0x00000010, 0x04000006, + 0x82040580, 0x00000090, 0x04000006, 0x02020800, + 0x001005d8, 0x59a80048, 0x84000542, 0x0401f003, + 0x59a80048, 0x84000540, 0x48035048, 0x59a80045, + 0x80000000, 0x48035045, 0x82000580, 0x00000005, + 0x04000003, 0x0401f861, 0x0401f01e, 0x497b5045, + 0x59c40801, 0x82040d00, 0x00018000, 0x82040580, + 0x00000000, 0x04000009, 0x82040580, 0x00008000, + 0x04000009, 0x82040580, 0x00010000, 0x04000008, + 0x0201f800, 0x001005d8, 0x42000000, 0x00000001, + 0x0401f005, 0x41780000, 0x0401f003, 0x42000000, + 0x00000002, 0x0401f94b, 0x4a035042, 0x00000002, + 0x0401f004, 0x4a035040, 0x00000003, 0x0401f002, + 0x0401ff42, 0x1c01f000, 0x0401f83b, 0x04000015, + 0x59a8004f, 0x80000040, 0x4803504f, 0x0401f984, + 0x04020005, 0x4a035040, 0x00000003, 0x497b5041, + 0x0401f00c, 0x59a8004f, 0x80000540, 0x04020003, + 0x0401f89e, 0x0401f002, 0x0401f84b, 0x0401f82f, + 0x497b5045, 0x4a035042, 0x00000001, 0x0401ff2b, + 0x1c01f000, 0x0401f824, 0x04000015, 0x0401f970, + 0x0402000f, 0x59a80046, 0x80000000, 0x48035046, + 0x82000580, 0x00000007, 0x0402000c, 0x4a035052, + 0x0000000a, 0x497b5049, 0x59a80048, 0x8400055e, + 0x48035048, 0x4803c857, 0x0401f005, 0x0401f817, + 0x4a035042, 0x00000004, 0x0401ff3d, 0x1c01f000, + 0x0401f80d, 0x04000007, 0x0401f959, 0x04020003, + 0x0401ff1b, 0x0401f003, 0x0401f80c, 0x0401ff34, + 0x1c01f000, 0x0201f800, 0x001005d8, 0x0201f800, + 0x001005d8, 0x59a80050, 0x80000040, 0x48035050, + 0x0400088d, 0x1c01f000, 0x4c040000, 0x42000800, + 0x00000000, 0x0401f9b2, 0x82040d00, 0x00000090, + 0x82040580, 0x00000090, 0x04000009, 0x82040580, + 0x00000010, 0x04000009, 0x82040580, 0x00000000, + 0x04000009, 0x0201f800, 0x001005d8, 0x42000000, + 0x00000002, 0x0401f005, 0x42000000, 0x00000001, + 0x0401f002, 0x41780000, 0x0401f8ea, 0x5c000800, + 0x1c01f000, 0x4c040000, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000009, 0x82040580, + 0x00010000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f866, + 0x5c000800, 0x1c01f000, 0x4c040000, 0x59a80045, + 0x80000000, 0x48035045, 0x82000580, 0x00000005, + 0x04020018, 0x497b5045, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04000009, + 0x82040580, 0x00008000, 0x04000009, 0x82040580, + 0x00010000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f846, + 0x42000800, 0x00000000, 0x0401f961, 0x82040d00, + 0x00000090, 0x82040580, 0x00000090, 0x04000009, + 0x82040580, 0x00000010, 0x04000009, 0x82040580, + 0x00000000, 0x04000009, 0x0201f800, 0x001005d8, + 0x42000000, 0x00000002, 0x0401f005, 0x42000000, + 0x00000001, 0x0401f002, 0x41780000, 0x0401f899, + 0x5c000800, 0x1c01f000, 0x4c200000, 0x59a80048, + 0x82000500, 0x00007fff, 0x02000800, 0x001005d8, + 0x59a84047, 0x80204102, 0x02001800, 0x001005d8, + 0x48235047, 0x80204500, 0x040007fa, 0x8c000504, + 0x04020007, 0x8c000502, 0x04020008, 0x8c000500, + 0x04020008, 0x0201f800, 0x001005d8, 0x42000000, + 0x00000002, 0x0401f005, 0x41780000, 0x0401f003, + 0x42000000, 0x00000001, 0x0401f80f, 0x5c004000, + 0x1c01f000, 0x04011000, 0x4a03c840, 0x0010b440, + 0x4a03c842, 0x00000009, 0x40000000, 0x040117ff, + 0x4a035047, 0x00000004, 0x4a03503e, 0x00000000, + 0x1c01f000, 0x59a80858, 0x82040d80, 0x01391077, + 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, + 0x82000d80, 0x00000002, 0x04020002, 0x41780000, + 0x4c000000, 0x0401f9b1, 0x5c000000, 0x800001c0, + 0x04000040, 0x82000d80, 0x00000001, 0x0402001d, + 0x42000800, 0x000000a0, 0x0401f909, 0x82040540, + 0x00000004, 0x42000800, 0x000000a0, 0x0401f909, + 0x42000800, 0x000000c0, 0x0401f901, 0x82040540, + 0x00000020, 0x42000800, 0x000000c0, 0x0401f901, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00000000, 0x48038801, 0x59a80054, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8f6, 0x0401f03c, + 0x82000d80, 0x00000002, 0x02020800, 0x001005d8, + 0x42000800, 0x000000a0, 0x0401f8e9, 0x82040500, + 0xfffffffb, 0x42000800, 0x000000a0, 0x0401f8e9, + 0x42000800, 0x000000c0, 0x0401f8e1, 0x82040500, + 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8e1, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00010000, 0x48038801, 0x59a80056, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8d6, 0x0401f01c, + 0x42000800, 0x000000a0, 0x0401f8cd, 0x82040540, + 0x00000004, 0x42000800, 0x000000a0, 0x0401f8cd, + 0x42000800, 0x000000c0, 0x0401f8c5, 0x82040500, + 0xffffffdf, 0x42000800, 0x000000c0, 0x0401f8c5, + 0x59c40001, 0x82000500, 0xfffe7fff, 0x82000540, + 0x00008000, 0x48038801, 0x59a80055, 0x80000110, + 0x42000800, 0x000000e0, 0x0401f8ba, 0x0401f163, + 0x4803c857, 0x59a80858, 0x82040d80, 0x01391077, + 0x04020008, 0x59e00813, 0x8c040d00, 0x04000005, + 0x82000d80, 0x00000002, 0x04020002, 0x41780000, + 0x4c000000, 0x0401f94d, 0x5c000000, 0x800001c0, + 0x04000026, 0x82000d80, 0x00000001, 0x04020010, + 0x59a8006c, 0x80000540, 0x04000004, 0x42001000, + 0x00000000, 0x0401fa0a, 0x42000800, 0x00000000, + 0x0401f897, 0x82040540, 0x00000090, 0x42000800, + 0x00000000, 0x0401f897, 0x0401f024, 0x82000d80, + 0x00000002, 0x02020800, 0x001005d8, 0x59a8006c, + 0x80000540, 0x04000004, 0x42001000, 0x00010000, + 0x0401f9f7, 0x42000800, 0x00000000, 0x0401f884, + 0x82040500, 0xffffff6f, 0x42000800, 0x00000000, + 0x0401f884, 0x0401f011, 0x59a8006c, 0x80000540, + 0x04000004, 0x42001000, 0x00008000, 0x0401f9e8, + 0x42000800, 0x00000000, 0x0401f875, 0x82040500, + 0xffffff6f, 0x82000540, 0x00000010, 0x42000800, + 0x00000000, 0x0401f873, 0x0401f124, 0x4c580000, + 0x4200b000, 0x00000014, 0x8058b040, 0x04000043, + 0x59c4000d, 0x8c000520, 0x040207fc, 0x0401f85c, + 0x59c4000d, 0x8c000520, 0x040207f8, 0x59c40808, + 0x84040d50, 0x48078808, 0x4200b000, 0x000000c8, + 0x8058b040, 0x040207ff, 0x4200b000, 0x00000014, + 0x8058b040, 0x04000031, 0x59c4000d, 0x8c000520, + 0x0402002e, 0x42000800, 0x00001000, 0x50040800, + 0x82040c80, 0x24220001, 0x04020003, 0x8c000504, + 0x040007f4, 0x0401f842, 0x59c4000d, 0x8c000520, + 0x04020022, 0x42000800, 0x00001000, 0x50040800, + 0x82040c80, 0x24220001, 0x04020003, 0x8c000504, + 0x040007e8, 0x4200b000, 0x0000000a, 0x8058b040, + 0x04000003, 0x0401f832, 0x0401f7fd, 0x4200b000, + 0x00000064, 0x59c4000d, 0x8c00051e, 0x0400000f, + 0x8058b040, 0x040207fc, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020004, + 0x59c40808, 0x84040d10, 0x48078808, 0x80000580, + 0x4803c857, 0x0401f00c, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24220001, 0x04020004, + 0x59c40808, 0x84040d10, 0x48078808, 0x82000540, + 0x00000001, 0x5c00b000, 0x1c01f000, 0x42000800, + 0x000000a0, 0x0401f816, 0x82040500, 0xfffffffe, + 0x42000800, 0x000000a0, 0x0401f816, 0x42000800, + 0x00000000, 0x0401f80e, 0x82040500, 0xfffffffe, + 0x42000800, 0x00000000, 0x0401f00e, 0x40000000, + 0x40000000, 0x40000000, 0x40000000, 0x40000000, + 0x1c01f000, 0x480b8805, 0x1c01f000, 0x4807880e, + 0x59c4080f, 0x82040d00, 0x000000ff, 0x1c01f000, + 0x900001c0, 0x80040d40, 0x84040d40, 0x4807880e, + 0x1c01f000, 0x82000d80, 0x00200000, 0x04000009, + 0x82000d80, 0x02000000, 0x04000006, 0x82000d80, + 0x01000000, 0x04000006, 0x59c408a3, 0x0401f006, + 0x59c408a3, 0x84040d30, 0x0401f003, 0x59c408a3, + 0x84040d32, 0x80040540, 0x480388a3, 0x480788a3, + 0x1c01f000, 0x59c400a3, 0x84000556, 0x480388a3, + 0x84000516, 0x480388a3, 0x1c01f000, 0x485fc857, + 0x4863c857, 0x4c640000, 0x4d3c0000, 0x4d400000, + 0x0201f800, 0x00106ede, 0x4863500a, 0x0201f800, + 0x0010ab33, 0x0402006c, 0x82600d00, 0x0000ff00, + 0x800409c0, 0x0400000c, 0x4200c800, 0x00000001, + 0x59a80010, 0x82000500, 0x000000ff, 0x80041110, + 0x80081580, 0x04000021, 0x82041580, 0x0000ff00, + 0x0400000a, 0x59c410a3, 0x82081500, 0x00008000, + 0x04000009, 0x59c410a7, 0x82081500, 0x0000ff00, + 0x82081580, 0x0000ff00, 0x4200c800, 0x00000000, + 0x04000012, 0x59a80005, 0x8c000502, 0x04020008, + 0x8c000500, 0x0402000d, 0x599c1017, 0x8c08151a, + 0x0400003e, 0x84000542, 0x48035005, 0x4200c800, + 0x00000002, 0x42028000, 0x00000004, 0x42027800, + 0x00000008, 0x0401f008, 0x59a80805, 0x84040d40, + 0x48075005, 0x42028000, 0x00000004, 0x42027800, + 0x00000400, 0x59a80006, 0x8c000502, 0x04020006, + 0x59a80805, 0x8c040d0a, 0x04020033, 0x84040d4a, + 0x48075005, 0x42000000, 0x0010b812, 0x0201f800, + 0x0010aa47, 0x59a8180a, 0x42001000, 0x00008013, + 0x0201f800, 0x00103a3e, 0x0201f800, 0x00103b25, + 0x04000015, 0x4d400000, 0x82600500, 0x000000ff, + 0x42028800, 0x0000ffff, 0x40643000, 0x42028000, + 0x0000000e, 0x0201f800, 0x0010a446, 0x42000800, + 0x00000001, 0x42001000, 0x00000100, 0x0201f800, + 0x0010618b, 0x5c028000, 0x599c0817, 0x8c040d0a, + 0x04020011, 0x493fc857, 0x4943c857, 0x0201f800, + 0x00101fe5, 0x0401f00c, 0x0201f800, 0x00103b25, + 0x04000009, 0x42028000, 0x0000000f, 0x42028800, + 0x0000ffff, 0x42003000, 0x00000000, 0x0201f800, + 0x0010a449, 0x497b8880, 0x5c028000, 0x5c027800, + 0x5c00c800, 0x1c01f000, 0x42000800, 0x000000a0, + 0x0401ff5f, 0x82040540, 0x00000002, 0x42000800, + 0x000000a0, 0x0401f75f, 0x42000800, 0x00000000, + 0x0401ff57, 0x82040540, 0x00000002, 0x42000800, + 0x00000000, 0x0401f757, 0x42000800, 0x000000a0, + 0x0401ff4f, 0x82040500, 0xfffffffd, 0x42000800, + 0x000000a0, 0x0401f74f, 0x42000800, 0x00000000, + 0x0401ff47, 0x82040500, 0xfffffffd, 0x42000800, + 0x00000000, 0x0401f747, 0x59c408a8, 0x0401ff38, + 0x0401ff37, 0x59c400a8, 0x80040d80, 0x040207fb, + 0x1c01f000, 0x4803c856, 0x4a038807, 0x00000001, + 0x497b8807, 0x59c40005, 0x48038805, 0x497b506c, + 0x497b506d, 0x41785800, 0x42006000, 0x00000001, + 0x42006800, 0x00000003, 0x0401f824, 0x0401f82f, + 0x40400000, 0x4803c857, 0x82408580, 0x00000000, + 0x0402001d, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401f818, 0x0401f823, + 0x40400000, 0x4803c857, 0x82408580, 0x00000800, + 0x04020011, 0x42005800, 0x00000001, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401f80b, + 0x0401f816, 0x40400000, 0x4803c857, 0x82408580, + 0x0000ffff, 0x04020004, 0x4a03506c, 0x00000001, + 0x4803c856, 0x1c01f000, 0x41785000, 0x0401f812, + 0x0401f838, 0x40347000, 0x40340800, 0x0401f03d, + 0x42005000, 0x00000001, 0x0401f80b, 0x0401f831, + 0x40340800, 0x0401f037, 0x42005000, 0x00000002, + 0x0401f805, 0x0401f81d, 0x0401f835, 0x40048000, + 0x1c01f000, 0x0401f808, 0x0401f814, 0x40280800, + 0x0401f826, 0x402c0800, 0x0401f827, 0x40300800, + 0x0401f025, 0x42000800, 0x0000ffff, 0x42001000, + 0x00000001, 0x0401f829, 0x42001000, 0x00000010, + 0x0401f826, 0x42000800, 0x0000ffff, 0x42001000, + 0x00000010, 0x0401f021, 0x41780800, 0x42001000, + 0x00000002, 0x0401f01d, 0x0401f92e, 0x4a03d000, + 0x00050004, 0x0401f92b, 0x4a03d000, 0x00050005, + 0x0401f928, 0x4a03d000, 0x00050004, 0x42000800, + 0x00000001, 0x42001000, 0x00000001, 0x0401f00f, + 0x42000800, 0x00000002, 0x42001000, 0x00000002, + 0x0401f00a, 0x42001000, 0x00000005, 0x0401f007, + 0x42001000, 0x00000010, 0x0401f004, 0x42001000, + 0x00000010, 0x0401f01b, 0x0401f912, 0x82082c00, + 0x0010ab38, 0x50142800, 0x82081500, 0xffffffff, + 0x04000013, 0x0401f90b, 0x80081040, 0x80142902, + 0x40040000, 0x80140500, 0x04000007, 0x4a03d000, + 0x00070006, 0x0401f903, 0x4a03d000, 0x00070007, + 0x0401f006, 0x4a03d000, 0x00070004, 0x0401f8fd, + 0x4a03d000, 0x00070005, 0x0401f7ec, 0x1c01f000, + 0x41780800, 0x82082c00, 0x0010ab38, 0x50142800, + 0x82081500, 0xffffffff, 0x04000010, 0x0401f8f1, + 0x4a03d000, 0x00050001, 0x0401f8ee, 0x59e81800, + 0x80081040, 0x80142902, 0x8c0c1d06, 0x04000004, + 0x40140000, 0x80040d40, 0x0401f8e6, 0x4a03d000, + 0x00070000, 0x0401f7ef, 0x1c01f000, 0x480bc857, + 0x480b506d, 0x59c40001, 0x82000500, 0xffffefff, + 0x48038801, 0x41781800, 0x0401f8c4, 0x41785800, + 0x42006000, 0x0000001e, 0x42006800, 0x00000004, + 0x0401ff7a, 0x42006800, 0x0000003c, 0x0401ff7d, + 0x41785800, 0x42006000, 0x0000001e, 0x42006800, + 0x00000004, 0x0401ff71, 0x41786800, 0x0401ff75, + 0x41785800, 0x42006000, 0x0000001e, 0x41786800, + 0x0401ff6a, 0x42006800, 0x00000002, 0x0401ff6d, + 0x42006800, 0x00000001, 0x0401ff64, 0x42006800, + 0x000000f5, 0x0401ff67, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000004, 0x0401ff5b, + 0x42006800, 0x00000020, 0x0401ff5e, 0x59a8106d, + 0x0401f865, 0x42001800, 0x000200f5, 0x0401f897, + 0x59a8106d, 0x0401f879, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000004, 0x0401ff4b, + 0x41786800, 0x0401ff4f, 0x59c40001, 0x82000540, + 0x00001000, 0x48038801, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401ff3f, + 0x0401ff4a, 0x40400000, 0x82000540, 0x00000002, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff34, 0x5c000000, + 0x40006800, 0x0401ff37, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000015, 0x0401ff2b, + 0x0401ff36, 0x40400000, 0x82000500, 0x0000fffd, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000015, 0x0401ff20, 0x5c000000, + 0x40006800, 0x0401ff23, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401ff17, + 0x0401ff22, 0x40400000, 0x82000540, 0x00000040, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401ff0c, 0x5c000000, + 0x40006800, 0x0401ff0f, 0x41785800, 0x42006000, + 0x0000001e, 0x42006800, 0x00000014, 0x0401ff03, + 0x0401ff0e, 0x40400000, 0x82000500, 0x0000ffbf, + 0x4c000000, 0x41785800, 0x42006000, 0x0000001e, + 0x42006800, 0x00000014, 0x0401fef8, 0x5c000000, + 0x40006800, 0x0401fefb, 0x4a038886, 0x00002020, + 0x0401f04c, 0x480bc857, 0x82080580, 0x00010000, + 0x04020007, 0x82040d40, 0x00010000, 0x42001800, + 0x00000001, 0x0401f82d, 0x0401f00f, 0x82080580, + 0x00008000, 0x04000007, 0x82040d40, 0x00000000, + 0x42001800, 0x00900001, 0x0401f824, 0x0401f006, + 0x82040d40, 0x00008000, 0x42001800, 0x00100001, + 0x0401f81e, 0x1c01f000, 0x480bc857, 0x82080580, + 0x00010000, 0x04020008, 0x42001800, 0x000000a1, + 0x0401f816, 0x42001800, 0x000000c1, 0x0401f813, + 0x0401f011, 0x82080580, 0x00008000, 0x04000008, + 0x42001800, 0x000400a1, 0x0401f80c, 0x42001800, + 0x002000c1, 0x0401f809, 0x0401f007, 0x42001800, + 0x000400a1, 0x0401f805, 0x42001800, 0x000000c1, + 0x0401f802, 0x1c01f000, 0x480fc857, 0x41785800, + 0x42006000, 0x0000001e, 0x41786800, 0x0401feb7, + 0x400c6800, 0x80346960, 0x0401feba, 0x42006800, + 0x00000001, 0x0401feb1, 0x400c6800, 0x0401feb5, + 0x42006800, 0x00000003, 0x0401feac, 0x0401feb7, + 0x40400000, 0x8c000504, 0x040207fc, 0x1c01f000, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x1c01f000, 0x00020103, 0x00101bd5, 0x00101bdb, + 0x00101be1, 0x00101be9, 0x00101bef, 0x00101bf7, + 0x00101bff, 0x00101c09, 0x00101c0f, 0x00101c17, + 0x00101c1f, 0x00101c29, 0x00101c31, 0x00101c3b, + 0x00101c45, 0x000200f8, 0x00101c51, 0x00101c59, + 0x00101c61, 0x00101c6b, 0x00101c73, 0x00101c7d, + 0x00101c87, 0x00101c93, 0x00101c9b, 0x00101ca5, + 0x00101caf, 0x00101cbb, 0x00101cc5, 0x00101cd1, + 0x00101cdd, 0x000200fd, 0x00101ceb, 0x00101cf3, + 0x00101cfb, 0x00101d05, 0x00101d0d, 0x00101d17, + 0x00101d21, 0x00101d2d, 0x00101d35, 0x00101d3f, + 0x00101d49, 0x00101d55, 0x00101d5f, 0x00101d6b, + 0x00101d77, 0x00101d85, 0x00101d8d, 0x00101d97, + 0x00101da1, 0x00101dad, 0x00101db7, 0x00101dc3, + 0x00101dcf, 0x00101ddd, 0x00101de7, 0x00101df3, + 0x00101dff, 0x00101e0d, 0x00101e19, 0x00101e27, + 0x00101e35, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101155, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f800, + 0x00020104, 0x0201f000, 0x00020101, 0x4c000000, + 0x4df00000, 0x0201f800, 0x00101155, 0x0201f800, + 0x00101418, 0x0201f800, 0x00020729, 0x0201f800, + 0x00020015, 0x0201f800, 0x00101289, 0x0201f000, + 0x00020101, 0x4c000000, 0x4df00000, 0x0201f800, + 0x00101155, 0x0201f800, 0x00101418, 0x0201f800, + 0x00020729, 0x0201f800, 0x00020015, 0x0201f800, + 0x00101289, 0x0201f800, 0x00020104, 0x0201f000, + 0x00020101, 0x4c5c0000, 0x4c600000, 0x4178b800, + 0x0201f800, 0x001048ec, 0x040200fd, 0x59a8c026, + 0x0201f800, 0x0010513b, 0x04000003, 0x8c60c506, + 0x0400000e, 0x8c60c500, 0x04020004, 0x8c60c50e, + 0x040008f6, 0x0401f0f2, 0x0401fab4, 0x040200f0, + 0x0201f800, 0x0010513b, 0x04020004, 0x4a03501c, + 0x0000ffff, 0x0401f0ea, 0x8c60c504, 0x04000004, + 0x4a03501c, 0x0000ffff, 0x0401f0e5, 0x59a8c010, + 0x8260c500, 0x000000ff, 0x59a81013, 0x8c081500, + 0x0400005d, 0x8c081502, 0x0402005b, 0x59a8b81c, + 0x825c0d80, 0x0000ffff, 0x04020003, 0x4200b800, + 0x00000001, 0x805c1104, 0x82086400, 0x0010be21, + 0x50300800, 0x825c0500, 0x00000003, 0x0c01f001, + 0x00101e81, 0x00101e7c, 0x00101e80, 0x00101e7e, + 0x80040910, 0x0401f004, 0x80040930, 0x0401f002, + 0x80040920, 0x82040500, 0x000000ff, 0x82000d80, + 0x000000ff, 0x0400000f, 0x4c000000, 0x82000400, + 0x0010210e, 0x50000800, 0x80040910, 0x82040580, + 0x00000080, 0x5c000000, 0x04000030, 0x80600d80, + 0x0400002e, 0x80000540, 0x0400002c, 0x0401f00b, + 0x59a81005, 0x82081500, 0x00000003, 0x0402002b, + 0x59a81013, 0x84081542, 0x480b5013, 0x4a03501c, + 0x0000ffff, 0x0401f028, 0x4c000000, 0x59a80005, + 0x8c000514, 0x42001000, 0x00000010, 0x02020800, + 0x00104c6d, 0x5c000000, 0x0402001c, 0x417a8800, + 0x0201f800, 0x00105c9a, 0x04020016, 0x0201f800, + 0x001045e5, 0x04000006, 0x0201f800, 0x00104c62, + 0x0401f8b1, 0x0400000f, 0x0401f00c, 0x599c0019, + 0x8c00050e, 0x04020009, 0x0201f800, 0x001045a6, + 0x04020008, 0x0201f800, 0x00104c62, 0x0401f9e1, + 0x0401f8be, 0x04000003, 0x805cb800, 0x0401f7b2, + 0x485f501c, 0x0401f086, 0x4a03501c, 0x0000ffff, + 0x0401f083, 0x42003000, 0x0000007e, 0x59a8001c, + 0x82001580, 0x0000ffff, 0x04020005, 0x80000d80, + 0x4018b000, 0x4803c856, 0x0401f009, 0x8018b480, + 0x04001004, 0x40000800, 0x4803c856, 0x0401f004, + 0x4a03501c, 0x0000ffff, 0x0401f071, 0x4c040000, + 0x4c580000, 0x82040400, 0x0010210e, 0x50000000, + 0x82000500, 0x000000ff, 0x80604580, 0x0400005c, + 0x0201f800, 0x00105c9b, 0x04020061, 0x59a80005, + 0x8c000514, 0x42001000, 0x00000010, 0x02020800, + 0x00104c6d, 0x5c00b000, 0x5c000800, 0x040207d7, + 0x4c040000, 0x4c580000, 0x845cbd00, 0x0201f800, + 0x00020245, 0x04000008, 0x599c0019, 0x8c00050e, + 0x04020047, 0x0201f800, 0x001045ab, 0x0402004c, + 0x0401f002, 0x845cbd40, 0x0201f800, 0x00104c62, + 0x0201f800, 0x001049e7, 0x04020007, 0x59a80005, + 0x8c000502, 0x04000033, 0x59340200, 0x8c00050e, + 0x04020030, 0x59a81013, 0x8c081502, 0x04000025, + 0x0201f800, 0x00104a09, 0x04000031, 0x8c5cbd00, + 0x04020004, 0x0201f800, 0x001045ff, 0x0401f02c, + 0x0401f9cd, 0x0400002a, 0x42026000, 0x0010bde9, + 0x49366009, 0x497a6008, 0x417a7800, 0x0401f925, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00103b25, 0x0400001d, 0x41782800, + 0x42003000, 0x00000008, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x0010a446, 0x5c028800, 0x5c028000, 0x0401f010, + 0x4937c857, 0x599c0019, 0x8c00050e, 0x0402000c, + 0x0401f96c, 0x0401f849, 0x04000011, 0x0401f008, + 0x59a80013, 0x8c000500, 0x04000003, 0x0401f9a6, + 0x04000003, 0x0401f828, 0x04000009, 0x5c00b000, + 0x5c000800, 0x80040800, 0x8058b040, 0x04020798, + 0x4a03501c, 0x0000ffff, 0x0401f005, 0x4937c857, + 0x5c00b000, 0x5c000800, 0x4807501c, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x4803c856, 0x4a03501c, + 0x00000001, 0x42028800, 0x000007fe, 0x42003000, + 0x00fffffe, 0x0201f800, 0x001045a6, 0x0402000c, + 0x0401f948, 0x0401f825, 0x04000009, 0x59a80026, + 0x8400054e, 0x48035026, 0x0201f800, 0x0010930f, + 0x82000540, 0x00000001, 0x1c01f000, 0x80000580, + 0x0401f7fe, 0x4937c857, 0x0201f800, 0x00107942, + 0x04000015, 0x49366009, 0x4a026406, 0x00000001, + 0x417a7800, 0x0201f800, 0x00104567, 0x59a8001b, + 0x80000000, 0x4803501b, 0x42027000, 0x00000004, + 0x599c0019, 0x8c00050e, 0x04000003, 0x42027000, + 0x00000000, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x1c01f000, 0x4937c857, 0x0201f800, + 0x00107942, 0x0400001c, 0x49366009, 0x59340403, + 0x82000580, 0x000007fe, 0x04000005, 0x4d3c0000, + 0x417a7800, 0x0401f8b7, 0x5c027800, 0x4a026406, + 0x00000001, 0x417a7800, 0x0201f800, 0x00104567, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x59a8001b, 0x80000000, 0x4803501b, 0x42027000, + 0x00000002, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x42028800, + 0x000007fc, 0x42003000, 0x00fffffc, 0x0201f800, + 0x001045a6, 0x04020005, 0x0401f805, 0x04000003, + 0x4a035027, 0x0000ffff, 0x1c01f000, 0x4937c857, + 0x0201f800, 0x00107942, 0x04000014, 0x49366009, + 0x4a026406, 0x00000001, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x59a80028, 0x80000000, 0x48035028, + 0x42027000, 0x00000002, 0x0201f800, 0x000207a1, + 0x82000540, 0x00000001, 0x1c01f000, 0x480bc857, + 0x492fc857, 0x4c5c0000, 0x4008b800, 0x42028800, + 0x000007fd, 0x42003000, 0x00fffffd, 0x0201f800, + 0x001045a6, 0x0402001a, 0x0201f800, 0x0002075a, + 0x04000017, 0x49366009, 0x5934000a, 0x84000544, + 0x4802680a, 0x812e59c0, 0x04000005, 0x592c0404, + 0x8c00051e, 0x04000002, 0x48ee6021, 0x492e6008, + 0x4a026406, 0x00000001, 0x485e601c, 0x42027000, + 0x00000022, 0x0201f800, 0x000207a1, 0x82000540, + 0x00000001, 0x5c00b800, 0x1c01f000, 0x80000580, + 0x0401f7fd, 0x5c000000, 0x4c000000, 0x4803c857, + 0x4943c857, 0x493fc857, 0x4d340000, 0x4d440000, + 0x4c580000, 0x4d2c0000, 0x4c5c0000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x0201f800, 0x001069f1, + 0x0201f800, 0x00106aac, 0x0201f800, 0x00106737, + 0x0201f800, 0x0010848a, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x4200b000, 0x000007f0, 0x417a8800, + 0x0201f800, 0x00020245, 0x0402001f, 0x8d3e7d14, + 0x04000005, 0x59340212, 0x82000500, 0x0000ff00, + 0x04000019, 0x8d3e7d06, 0x04000004, 0x59340200, + 0x8c00050e, 0x04020014, 0x8d3e7d18, 0x0400000f, + 0x5934b80f, 0x805cb9c0, 0x04000009, 0x49425a06, + 0x592cb800, 0x0201f800, 0x000202ce, 0x805cb9c0, + 0x040207fb, 0x497a680f, 0x497a6810, 0x4a026c00, + 0x00000707, 0x0401f004, 0x4937c857, 0x0201f800, + 0x001042b4, 0x81468800, 0x8058b040, 0x040207dd, + 0x8d3e7d02, 0x04000011, 0x497b501d, 0x42028800, + 0x000007f0, 0x4200b000, 0x00000010, 0x0201f800, + 0x00020245, 0x04020006, 0x4937c857, 0x4a026c00, + 0x00000707, 0x0201f800, 0x001042b4, 0x81468800, + 0x8058b040, 0x040207f6, 0x5c00b800, 0x5c025800, + 0x5c00b000, 0x5c028800, 0x5c026800, 0x1c01f000, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4933c857, + 0x493fc857, 0x4d340000, 0x4d400000, 0x4d440000, + 0x4d2c0000, 0x4c5c0000, 0x0201f800, 0x00106c55, + 0x4df00000, 0x59326809, 0x813669c0, 0x04000020, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x00106a50, 0x0201f800, 0x00106ab4, 0x0201f800, + 0x001067fd, 0x0201f800, 0x0010a2ff, 0x4937c857, + 0x8d3e7d18, 0x04000010, 0x5934b80f, 0x805cb9c0, + 0x0400000a, 0x405e5800, 0x49425a06, 0x592cb800, + 0x0201f800, 0x000202ce, 0x805cb9c0, 0x040207fa, + 0x497a680f, 0x497a6810, 0x4a026c00, 0x00000707, + 0x0401f003, 0x0201f800, 0x001042b4, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x5c00b800, 0x5c025800, + 0x5c028800, 0x5c028000, 0x5c026800, 0x1c01f000, + 0x4933c857, 0x59a80026, 0x8c000508, 0x04020012, + 0x59305009, 0x482bc857, 0x836c0580, 0x00000002, + 0x0402000d, 0x0401f813, 0x0402000b, 0x58280403, + 0x82000580, 0x000007fc, 0x04000008, 0x59a8001b, + 0x80000040, 0x4803c857, 0x02001800, 0x001005d8, + 0x4803501b, 0x1c01f000, 0x59a80028, 0x80000040, + 0x4803c857, 0x040017fc, 0x48035028, 0x1c01f000, + 0x59300008, 0x800001c0, 0x04020009, 0x59300403, + 0x82000580, 0x00000001, 0x04020004, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, + 0x4937c857, 0x59340200, 0x84000502, 0x48026a00, + 0x1c01f000, 0x4933c857, 0x493fc857, 0x4947c857, + 0x4d3c0000, 0x4d400000, 0x4d340000, 0x4d440000, + 0x4c580000, 0x0201f800, 0x00106c55, 0x4df00000, + 0x813e79c0, 0x04020004, 0x4200b000, 0x00000001, + 0x0401f004, 0x4200b000, 0x000007f0, 0x417a8800, + 0x41440000, 0x81ac0400, 0x50000000, 0x80026d40, + 0x04000019, 0x42027800, 0x00000001, 0x0201f800, + 0x001048f6, 0x42028000, 0x00000029, 0x417a7800, + 0x0201f800, 0x00106a50, 0x0201f800, 0x00106ab4, + 0x0201f800, 0x001067fd, 0x0201f800, 0x001049e7, + 0x04020005, 0x4937c857, 0x4a026c00, 0x00000404, + 0x0401f003, 0x0201f800, 0x00104a14, 0x0201f800, + 0x0010a2ff, 0x81468800, 0x8058b040, 0x040207e1, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x5c00b000, + 0x5c028800, 0x5c026800, 0x5c028000, 0x5c027800, + 0x1c01f000, 0x4937c857, 0x4947c857, 0x4c5c0000, + 0x4c600000, 0x4c640000, 0x59a80013, 0x8c000500, + 0x0400001f, 0x599c0017, 0x8c00050a, 0x0402001c, + 0x5934ba02, 0x825cbd00, 0x000000ff, 0x485fc857, + 0x4178c000, 0x4178c800, 0x82600400, 0x0010be21, + 0x50002000, 0x8060c1c0, 0x04000008, 0x82100500, + 0x000000ff, 0x82002d80, 0x000000ff, 0x0400000c, + 0x805c0580, 0x0400000d, 0x80102110, 0x8064c800, + 0x82640580, 0x00000004, 0x040207f5, 0x8060c000, + 0x82600580, 0x00000020, 0x040207eb, 0x4813c857, + 0x82000540, 0x00000001, 0x5c00c800, 0x5c00c000, + 0x5c00b800, 0x1c01f000, 0x59a80026, 0x4803c857, + 0x8c000512, 0x1c01f000, 0x00007eef, 0x00007de8, + 0x00007ce4, 0x000080e2, 0x00007be1, 0x000080e0, + 0x000080dc, 0x000080da, 0x00007ad9, 0x000080d6, + 0x000080d5, 0x000080d4, 0x000080d3, 0x000080d2, + 0x000080d1, 0x000079ce, 0x000078cd, 0x000080cc, + 0x000080cb, 0x000080ca, 0x000080c9, 0x000080c7, + 0x000080c6, 0x000077c5, 0x000076c3, 0x000080bc, + 0x000080ba, 0x000075b9, 0x000080b6, 0x000074b5, + 0x000073b4, 0x000072b3, 0x000080b2, 0x000080b1, + 0x000080ae, 0x000071ad, 0x000080ac, 0x000070ab, + 0x00006faa, 0x00006ea9, 0x000080a7, 0x00006da6, + 0x00006ca5, 0x00006ba3, 0x00006a9f, 0x0000699e, + 0x0000689d, 0x0000809b, 0x00008098, 0x00006797, + 0x00006690, 0x0000658f, 0x00006488, 0x00006384, + 0x00006282, 0x00008081, 0x00008080, 0x0000617c, + 0x0000607a, 0x00008079, 0x00005f76, 0x00008075, + 0x00008074, 0x00008073, 0x00008072, 0x00008071, + 0x0000806e, 0x00005e6d, 0x0000806c, 0x00005d6b, + 0x00005c6a, 0x00005b69, 0x00008067, 0x00005a66, + 0x00005965, 0x00005863, 0x0000575c, 0x0000565a, + 0x00005559, 0x00008056, 0x00008055, 0x00005454, + 0x00005353, 0x00005252, 0x00005151, 0x0000504e, + 0x00004f4d, 0x0000804c, 0x0000804b, 0x00004e4a, + 0x00004d49, 0x00008047, 0x00004c46, 0x00008045, + 0x00008043, 0x0000803c, 0x0000803a, 0x00008039, + 0x00008036, 0x00004b35, 0x00008034, 0x00004a33, + 0x00004932, 0x00004831, 0x0000802e, 0x0000472d, + 0x0000462c, 0x0000452b, 0x0000442a, 0x00004329, + 0x00004227, 0x00008026, 0x00008025, 0x00004123, + 0x0000401f, 0x00003f1e, 0x00003e1d, 0x00003d1b, + 0x00003c18, 0x00008017, 0x00008010, 0x00003b0f, + 0x00003a08, 0x00008004, 0x00003902, 0x00008001, + 0x00008000, 0x00008000, 0x00003800, 0x00003700, + 0x00003600, 0x00008000, 0x00003500, 0x00008000, + 0x00008000, 0x00008000, 0x00003400, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00003300, 0x00003200, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00003100, 0x00003000, 0x00008000, + 0x00008000, 0x00002f00, 0x00008000, 0x00002e00, + 0x00002d00, 0x00002c00, 0x00008000, 0x00008000, + 0x00008000, 0x00002b00, 0x00008000, 0x00002a00, + 0x00002900, 0x00002800, 0x00008000, 0x00002700, + 0x00002600, 0x00002500, 0x00002400, 0x00002300, + 0x00002200, 0x00008000, 0x00008000, 0x00002100, + 0x00002000, 0x00001f00, 0x00001e00, 0x00001d00, + 0x00001c00, 0x00008000, 0x00008000, 0x00001b00, + 0x00001a00, 0x00008000, 0x00001900, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00001800, 0x00008000, 0x00001700, + 0x00001600, 0x00001500, 0x00008000, 0x00001400, + 0x00001300, 0x00001200, 0x00001100, 0x00001000, + 0x00000f00, 0x00008000, 0x00008000, 0x00000e00, + 0x00000d00, 0x00000c00, 0x00000b00, 0x00000a00, + 0x00000900, 0x00008000, 0x00008000, 0x00000800, + 0x00000700, 0x00008000, 0x00000600, 0x00008000, + 0x00008000, 0x00008000, 0x00000500, 0x00000400, + 0x00000300, 0x00008000, 0x00000200, 0x00008000, + 0x00008000, 0x00008000, 0x00000100, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00000000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x00008000, 0x00008000, + 0x00008000, 0x00008000, 0x0201f800, 0x001007d3, + 0x02000800, 0x001005d8, 0x492f4016, 0x1c01f000, + 0x83a0ac00, 0x00000006, 0x83a00580, 0x0010b4a4, + 0x0400000c, 0x492fc857, 0x812e59c0, 0x02000800, + 0x001005d8, 0x832ca400, 0x00000006, 0x4200b000, + 0x0000000d, 0x0201f800, 0x0010ab17, 0x0401f00f, + 0x4200b000, 0x00000010, 0x83e0a400, 0x00000020, + 0x50500000, 0x8050a000, 0x50500800, 0x900409c0, + 0x80040540, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207f7, 0x1c01f000, 0x59a00206, + 0x4803c857, 0x82000c80, 0x0000007f, 0x040210c9, + 0x59a80821, 0x0c01f001, 0x001022c0, 0x00102300, + 0x00102300, 0x0010234b, 0x0010236d, 0x00102300, + 0x001022c0, 0x0010238f, 0x001023a0, 0x00102300, + 0x00102300, 0x001023ad, 0x001023c5, 0x001023dd, + 0x00102300, 0x001023e7, 0x001023f4, 0x00102300, + 0x0010241d, 0x00102300, 0x0010247a, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102491, 0x00102300, + 0x001024e3, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x001024e8, 0x00102560, 0x00102300, + 0x00102567, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102569, 0x001025ea, + 0x00102727, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102736, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102753, 0x001027a6, + 0x00102802, 0x00102816, 0x00102835, 0x00102a70, + 0x00102dff, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00102300, + 0x00102300, 0x00102fb4, 0x00103028, 0x00102300, + 0x00102300, 0x00103094, 0x00102300, 0x00103126, + 0x001031d8, 0x00102300, 0x00102300, 0x0010320f, + 0x0010326b, 0x00102300, 0x001032bd, 0x00103419, + 0x00102300, 0x0010342d, 0x001034b8, 0x00102300, + 0x00102300, 0x00102300, 0x00102300, 0x00103522, + 0x00103526, 0x00103545, 0x00102300, 0x001035e7, + 0x00102300, 0x00102300, 0x00103615, 0x00102300, + 0x00103643, 0x00102300, 0x00102300, 0x001036aa, + 0x001037b7, 0x00103814, 0x00102300, 0x0010387a, + 0x00102300, 0x00102300, 0x001038d3, 0x00103936, + 0x00102300, 0x48efc857, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x04000045, + 0x48efc857, 0x4a034206, 0x00004000, 0x0201f800, + 0x00103a15, 0x83a00580, 0x0010b4a4, 0x0400000d, + 0x58ee580a, 0x4d2c0000, 0x0401f856, 0x41a25800, + 0x0201f800, 0x001007f4, 0x40ee5800, 0x0201f800, + 0x001007f4, 0x5c025800, 0x0201f000, 0x000202da, + 0x04026007, 0x59a0001d, 0x84000542, 0x4803401d, + 0x4a01d809, 0x001022d4, 0x1c01f000, 0x59a00206, + 0x82000d80, 0x00004000, 0x04000006, 0x900001c0, + 0x82000540, 0x00000011, 0x4803c011, 0x0401f005, + 0x900001c0, 0x82000540, 0x00000010, 0x4803c011, + 0x0401f845, 0x59e00017, 0x8c000508, 0x0402000c, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x40ee5800, 0x0201f800, 0x001007f4, 0x59a0001d, + 0x84000504, 0x4803401d, 0x1c01f000, 0x4a03c017, + 0x00000000, 0x59a00206, 0x82000d80, 0x00004000, + 0x040007f0, 0x4a03c017, 0x00000001, 0x0401f7ed, + 0x4803c856, 0x4a034206, 0x00004001, 0x0401f7c0, + 0x4803c856, 0x4a034206, 0x00004002, 0x0401f7bc, + 0x4803c856, 0x4a034206, 0x00004003, 0x0401f7b8, + 0x4803c856, 0x4a034206, 0x00004005, 0x0401f7b4, + 0x4803c856, 0x4a034206, 0x00004006, 0x0401f7b0, + 0x4803c856, 0x4a034206, 0x0000400b, 0x0401f7ac, + 0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a8, + 0x4803c856, 0x4a034206, 0x0000400c, 0x0401f7a4, + 0x48efc857, 0x58eca80a, 0x8054a9c0, 0x02000800, + 0x001005d8, 0x83a0a400, 0x00000006, 0x8254ac00, + 0x00000006, 0x4200b000, 0x0000000d, 0x0201f000, + 0x0010ab17, 0x59a00206, 0x4803c857, 0x59a00406, + 0x4803c857, 0x59a00207, 0x4803c857, 0x59a00407, + 0x4803c857, 0x59a00208, 0x4803c857, 0x59a00408, + 0x4803c857, 0x59a00209, 0x4803c857, 0x83e0ac00, + 0x00000020, 0x83a0a400, 0x00000006, 0x4200b000, + 0x00000010, 0x50500000, 0x4400a800, 0x8054a800, + 0x900001c0, 0x4400a800, 0x8054a800, 0x8050a000, + 0x8058b040, 0x040207f8, 0x1c01f000, 0x59a00406, + 0x800000c2, 0x59a00a07, 0x900409c0, 0x80040540, + 0x84000540, 0x59a00c07, 0x8c040d00, 0x04000018, + 0x59a80805, 0x8c040d0e, 0x040207ba, 0x42000800, + 0x00000064, 0x80040840, 0x04000007, 0x4a030000, + 0x00000001, 0x40000000, 0x59801000, 0x8c081500, + 0x040007f9, 0x04000005, 0x48030004, 0x4a030000, + 0x00000000, 0x0401f75b, 0x4a030000, 0x00000000, + 0x4a034406, 0x00000004, 0x040007a2, 0x4803880e, + 0x0401f754, 0x59a00406, 0x800000c2, 0x59a00c07, + 0x8c040d00, 0x0400001a, 0x59a80805, 0x8c040d0e, + 0x0402079c, 0x42000800, 0x00000064, 0x80040840, + 0x04000007, 0x4a030000, 0x00000001, 0x40000000, + 0x59801000, 0x8c081500, 0x040007f9, 0x04000007, + 0x48030004, 0x59800805, 0x48074406, 0x4a030000, + 0x00000000, 0x0401f73b, 0x4a030000, 0x00000000, + 0x4a034406, 0x00000004, 0x04000782, 0x4803880e, + 0x59c4080f, 0x48074406, 0x0401f732, 0x59a01c06, + 0x59a00207, 0x900c19c0, 0x800c1d40, 0x580c0803, + 0x80000580, 0x500c1000, 0x80080400, 0x800c1800, + 0x80040840, 0x040207fc, 0x48034406, 0x900001c0, + 0x48034207, 0x800001c0, 0x04000722, 0x0401f769, + 0x4a034406, 0x00000004, 0x4a034207, 0x00000000, + 0x4a034407, 0x00000010, 0x59a8000d, 0x48034208, + 0x900001c0, 0x48034408, 0x4a034209, 0x00000002, + 0x0401f714, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0, + 0x80040d40, 0x59a0020a, 0x82002480, 0x00000010, + 0x04001754, 0x59a02406, 0x900001c0, 0x80100540, + 0x59a8280d, 0x80142480, 0x0400174e, 0x0201f000, + 0x00103a25, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x59a00a08, 0x59a00408, 0x900409c0, + 0x80040d40, 0x59a0020a, 0x82002480, 0x00000010, + 0x0400173c, 0x59a02406, 0x900001c0, 0x80100540, + 0x59a8280d, 0x80142480, 0x04001736, 0x0201f000, + 0x00103a28, 0x59a00a0a, 0x59a00406, 0x900409c0, + 0x80040d40, 0x59a01407, 0x59a00207, 0x900811c0, + 0x80081540, 0x44080800, 0x0401f6da, 0x59a00a0a, + 0x59a00406, 0x900409c0, 0x80040d40, 0x50040000, + 0x82000d00, 0x0000ffff, 0x48074207, 0x82000d00, + 0xffff0000, 0x900409c0, 0x48074407, 0x0401f6cd, + 0x59a00406, 0x8c000500, 0x04000020, 0x59a01207, + 0x59a01c07, 0x59a02208, 0x480b5054, 0x480f5055, + 0x48135056, 0x59c40801, 0x82040d00, 0x00018000, + 0x82040580, 0x00000000, 0x04000009, 0x82040580, + 0x00008000, 0x04000008, 0x82040580, 0x00010000, + 0x04000007, 0x0201f800, 0x001005d8, 0x40080000, + 0x0401f004, 0x400c0000, 0x0401f002, 0x40100000, + 0x80000110, 0x42000800, 0x000000e0, 0x0201f800, + 0x00101944, 0x0401f007, 0x59a81054, 0x59a81855, + 0x59a82056, 0x480b4207, 0x480f4407, 0x48134208, + 0x0401f6a4, 0x4d2c0000, 0x4d340000, 0x4d300000, + 0x4d440000, 0x59a28c06, 0x0201f800, 0x00020245, + 0x04000006, 0x5c028800, 0x5c026000, 0x5c026800, + 0x5c025800, 0x0401f6e7, 0x59a04407, 0x59a00207, + 0x900001c0, 0x80204540, 0x0401f81e, 0x04000009, + 0x4a034208, 0x00000001, 0x4a034406, 0x0000ffff, + 0x4a034207, 0x0000ffff, 0x497b4407, 0x0401f00b, + 0x0401f822, 0x0400000e, 0x4a034208, 0x00000002, + 0x59300402, 0x48034406, 0x59300202, 0x48034207, + 0x59300206, 0x48034407, 0x5c028800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x0401f67a, 0x5c028800, + 0x5c026000, 0x5c026800, 0x5c025800, 0x0401f6c1, + 0x4937c856, 0x4823c856, 0x4d2c0000, 0x5934000f, + 0x80025d40, 0x04000007, 0x592c0005, 0x80200580, + 0x592c0000, 0x040207fb, 0x82000540, 0x00000001, + 0x5c025800, 0x1c01f000, 0x4823c857, 0x4d2c0000, + 0x4d300000, 0x42026000, 0x0010d1c0, 0x59300406, + 0x82000d80, 0x00000003, 0x04000004, 0x82000d80, + 0x00000006, 0x04020007, 0x59325808, 0x812e59c0, + 0x04000004, 0x592c0005, 0x80200580, 0x0400000a, + 0x83326400, 0x00000024, 0x41580000, 0x81300480, + 0x040017ef, 0x80000580, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x82000540, 0x00000001, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x83a00580, 0x0010b4a4, + 0x04020684, 0x59a80005, 0x8c00050e, 0x04020003, + 0x4a030000, 0x00000000, 0x4a034206, 0x00004000, + 0x4a03c011, 0x40000010, 0x0401fea7, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000000, + 0x4203e000, 0x30000001, 0x4203e000, 0x40000000, + 0x0401f000, 0x800409c0, 0x04000004, 0x4a034406, + 0x00000001, 0x0401f677, 0x836c0580, 0x00000003, + 0x04020010, 0x59a80010, 0x497b4406, 0x0201f800, + 0x0010513b, 0x0400000f, 0x82000d00, 0x00ffff00, + 0x0402000c, 0x82000c00, 0x0010210e, 0x50040800, + 0x80040910, 0x82041580, 0x00000080, 0x04020004, + 0x4a034406, 0x00000007, 0x0401f662, 0x48074406, + 0x82000d00, 0x0000ffff, 0x48074207, 0x80000120, + 0x48034407, 0x59a80026, 0x82001500, 0x00000100, + 0x480b4409, 0x8c000502, 0x0400001f, 0x8c000506, + 0x04000009, 0x82000d00, 0x0000000a, 0x82040d80, + 0x0000000a, 0x04020004, 0x4a034209, 0x00000001, + 0x0401f022, 0x8c00050a, 0x04000009, 0x82000d00, + 0x00000022, 0x82040d80, 0x00000022, 0x04020004, + 0x4a034209, 0x00000003, 0x0401f018, 0x8c000508, + 0x04000009, 0x82000d00, 0x00000012, 0x82040d80, + 0x00000012, 0x04020004, 0x4a034209, 0x00000002, + 0x0401f00e, 0x0201f800, 0x0010513b, 0x04020004, + 0x4a034209, 0x00000004, 0x0401f5e6, 0x8c000506, + 0x04000004, 0x4a034406, 0x00000005, 0x0401f62d, + 0x4a034209, 0x00000000, 0x0401f5de, 0x59a80037, + 0x48034407, 0x59a80038, 0x48034209, 0x0401f5d9, + 0x42007800, 0x0010b8ec, 0x59a00406, 0x4803c857, + 0x82000c80, 0x00000006, 0x04021622, 0x0c01f001, + 0x001024f6, 0x001024f7, 0x00102505, 0x00102518, + 0x00102539, 0x001024f6, 0x0401f61a, 0x836c0580, + 0x00000000, 0x04000613, 0x59a00a07, 0x59a00407, + 0x900001c0, 0x80040d40, 0x4807c857, 0x59a00a08, + 0x59a00408, 0x900001c0, 0x80040d40, 0x4807c857, + 0x0401f056, 0x836c0580, 0x00000000, 0x04000605, + 0x59a00407, 0x59a01207, 0x900001c0, 0x80081540, + 0x59a00408, 0x59a01a08, 0x900001c0, 0x800c1d40, + 0x42000000, 0x0010c1bf, 0x480fc857, 0x480bc857, + 0x42000800, 0x00001000, 0x0201f000, 0x00103a28, + 0x59a00a07, 0x59a00407, 0x900001c0, 0x80041d40, + 0x820c0c80, 0x0010ab4a, 0x040215f2, 0x820c0c80, + 0x00100000, 0x040015ef, 0x480fc857, 0x823c7c00, + 0x00000009, 0x503c0800, 0x800409c0, 0x04000006, + 0x823c0580, 0x0000000d, 0x040005e6, 0x803c7800, + 0x0401f7f9, 0x59e41001, 0x82080d00, 0xfffeffcf, + 0x4807c801, 0x440c7800, 0x46001800, 0x0201f800, + 0x800c1800, 0x46001800, 0x001005cb, 0x480bc801, + 0x0401f022, 0x59a01a07, 0x59a00407, 0x900001c0, + 0x800c1d40, 0x480c7801, 0x59a02208, 0x59a00408, + 0x900001c0, 0x80102540, 0x48107802, 0x59a00209, + 0x80000040, 0x040015cb, 0x48007806, 0x80000000, + 0x48007805, 0x42000800, 0x00004000, 0x40001000, + 0x0201f800, 0x00106681, 0x80000540, 0x04000003, + 0x49787801, 0x0401f5bf, 0x40040000, 0x800c1c00, + 0x040015bc, 0x480c7803, 0x48107804, 0x49787808, + 0x59a00409, 0x48007807, 0x59e40001, 0x4803c857, + 0x82000540, 0x00040000, 0x4803c801, 0x0401f561, + 0x59a80006, 0x48034406, 0x59a80007, 0x48034207, + 0x59a80008, 0x48034407, 0x0401f55a, 0x0201f800, + 0x001005d8, 0x4803c856, 0x4a03c013, 0x03800300, + 0x4a03c014, 0x03800380, 0x59a00c06, 0x82040580, + 0x000000a0, 0x04000004, 0x82040580, 0x000000a2, + 0x0402002b, 0x59a0140a, 0x82080480, 0x00000100, + 0x04021027, 0x59a0020b, 0x8c000500, 0x0402002e, + 0x59a00a0a, 0x800409c0, 0x04000021, 0x82040480, + 0x00000041, 0x0402101e, 0x82040c00, 0x00000003, + 0x82040d00, 0x000000fc, 0x80040904, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x0201f800, + 0x00103a00, 0x04020006, 0x4a034406, 0x00000002, + 0x4a03c014, 0x03800000, 0x0401f576, 0x832e5c00, + 0x00000004, 0x412c0000, 0x0201f800, 0x00103a25, + 0x4a01d809, 0x001025a2, 0x1c01f000, 0x4a03c014, + 0x03800000, 0x0401f56f, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x0400055c, 0x59a00c06, 0x59a0140a, 0x59a0020b, + 0x8c000500, 0x04020031, 0x832e5c00, 0x00000004, + 0x41783800, 0x59a04a0a, 0x401c0000, 0x812c0400, + 0x50004000, 0x82201d00, 0x000000ff, 0x4c040000, + 0x0401f8ac, 0x5c000800, 0x0400002d, 0x80244840, + 0x04000028, 0x80081000, 0x82201d00, 0x0000ff00, + 0x800c1910, 0x4c040000, 0x0401f8a2, 0x5c000800, + 0x04000023, 0x80244840, 0x0400001e, 0x80081000, + 0x82201d00, 0x00ff0000, 0x800c1920, 0x4c040000, + 0x0401f898, 0x5c000800, 0x04000019, 0x80244840, + 0x04000014, 0x80081000, 0x82201d00, 0xff000000, + 0x800c1930, 0x4c040000, 0x0401f88e, 0x5c000800, + 0x0400000f, 0x80244840, 0x0400000a, 0x80081000, + 0x801c3800, 0x0401f7d5, 0x59a0020a, 0x82000500, + 0x000000ff, 0x40001800, 0x0401f882, 0x04000004, + 0x4a03c014, 0x03800000, 0x0401f4da, 0x4a03c014, + 0x03800000, 0x0401f523, 0x4803c856, 0x4a03c013, + 0x03800300, 0x4a03c014, 0x03800380, 0x59a00c06, + 0x82040580, 0x000000a0, 0x04000004, 0x82040580, + 0x000000a2, 0x0402006c, 0x59a0140a, 0x82080480, + 0x00000100, 0x04021068, 0x59a0020b, 0x8c000500, + 0x0402005c, 0x59a01a0a, 0x800c19c0, 0x04000062, + 0x820c0480, 0x00000041, 0x0402105f, 0x0201f800, + 0x00103a00, 0x04020006, 0x4a034406, 0x00000002, + 0x4a03c014, 0x03800000, 0x0401f502, 0x832e5c00, + 0x00000004, 0x41783800, 0x59a04a0a, 0x401c0000, + 0x812c0400, 0x40004000, 0x4c040000, 0x4c080000, + 0x0401f874, 0x5c001000, 0x5c000800, 0x04000047, + 0x44144000, 0x80244840, 0x0400002b, 0x80081000, + 0x4c040000, 0x4c080000, 0x0401f86a, 0x5c001000, + 0x5c000800, 0x0400003d, 0x50200000, 0x801428d0, + 0x80140540, 0x44004000, 0x80244840, 0x0400001e, + 0x80081000, 0x4c040000, 0x4c080000, 0x0401f85d, + 0x5c001000, 0x5c000800, 0x04000030, 0x50200000, + 0x801428e0, 0x80140540, 0x44004000, 0x80244840, + 0x04000011, 0x80081000, 0x4c040000, 0x4c080000, + 0x0401f850, 0x5c001000, 0x5c000800, 0x04000023, + 0x50200000, 0x801428f0, 0x80140540, 0x44004000, + 0x80244840, 0x04000004, 0x80081000, 0x801c3800, + 0x0401f7cb, 0x59a00a0a, 0x82040c00, 0x00000003, + 0x82040d00, 0x000000fc, 0x80040904, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x4a03c014, + 0x03800000, 0x412c0000, 0x0201f000, 0x00103a28, + 0x0401f830, 0x04000005, 0x48174406, 0x4a03c014, + 0x03800000, 0x0401f463, 0x4a03c014, 0x03800000, + 0x0401f4ac, 0x4a03c014, 0x03800000, 0x0401f4ad, + 0x0401f836, 0x04000010, 0x0401f862, 0x0402000f, + 0x40080800, 0x0401f85f, 0x0402000c, 0x400c0800, + 0x0401f85c, 0x04020009, 0x0401f84b, 0x42000000, + 0x00030d40, 0x80000040, 0x040207ff, 0x82000540, + 0x00000001, 0x1c01f000, 0x0401f843, 0x80000580, + 0x0401f7fd, 0x0401f821, 0x0400000a, 0x82040d40, + 0x00000001, 0x0401f84b, 0x04020007, 0x0401f87e, + 0x0401f898, 0x0401f838, 0x82000540, 0x00000001, + 0x1c01f000, 0x0401f834, 0x80000580, 0x0401f7fd, + 0x40041800, 0x0401f811, 0x0400000c, 0x0401f83d, + 0x0402000b, 0x40080800, 0x0401f83a, 0x04020008, + 0x400c0800, 0x0401ffe8, 0x04000004, 0x0401f826, + 0x82000540, 0x00000001, 0x1c01f000, 0x0401f822, + 0x80000580, 0x0401f7fd, 0x4c040000, 0x42000800, + 0x00000064, 0x4a03c013, 0x03800300, 0x80040840, + 0x04000016, 0x59e00013, 0x82000500, 0x00000300, + 0x82000580, 0x00000300, 0x040207f7, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x4a03c013, + 0x01000000, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x02000000, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x5c000800, + 0x1c01f000, 0x4a03c013, 0x01000000, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x4a03c013, + 0x02000200, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x01000100, 0x1c01f000, + 0x42002000, 0x00000008, 0x82040500, 0x00000080, + 0x800000c2, 0x82000540, 0x01000000, 0x4803c013, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x4a03c013, 0x02000200, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000000, + 0x800408c2, 0x80102040, 0x040207ec, 0x4a03c013, + 0x01000100, 0x42000000, 0x00000064, 0x80000040, + 0x040207ff, 0x4a03c013, 0x02000200, 0x42000000, + 0x00000064, 0x80000040, 0x040207ff, 0x59e00013, + 0x82000500, 0x00000100, 0x4a03c013, 0x02000000, + 0x4c040000, 0x42000800, 0x00000064, 0x59e00013, + 0x82000500, 0x00000100, 0x80040840, 0x04000003, + 0x80000540, 0x040207fa, 0x80000540, 0x5c000800, + 0x1c01f000, 0x4a03c013, 0x01000100, 0x42001000, + 0x00000008, 0x80000d80, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000200, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x59e00013, 0x82000500, 0x00000100, 0x80000110, + 0x800408c2, 0x80040d40, 0x4a03c013, 0x02000000, + 0x80081040, 0x040207ed, 0x40042800, 0x1c01f000, + 0x4a03c013, 0x01000100, 0x42000000, 0x00000064, + 0x80000040, 0x040207ff, 0x4a03c013, 0x02000200, + 0x42000000, 0x00000064, 0x80000040, 0x040207ff, + 0x4a03c013, 0x02000000, 0x1c01f000, 0x59a00407, + 0x59a80837, 0x48035037, 0x48074407, 0x59a00a09, + 0x82040480, 0x00000014, 0x04021003, 0x42000800, + 0x000007d0, 0x59a80038, 0x48075038, 0x48034209, + 0x0201f000, 0x001022c0, 0x836c0580, 0x00000000, + 0x0400000e, 0x59a80006, 0x59a00c06, 0x80041580, + 0x82081500, 0x00000040, 0x02000000, 0x001022c0, + 0x80080580, 0x48035006, 0x0201f800, 0x00100699, + 0x0201f000, 0x001022c0, 0x59a00406, 0x59a80806, + 0x48035006, 0x80040d80, 0x8c040d0c, 0x02020800, + 0x00100699, 0x59a00207, 0x48035007, 0x59a00407, + 0x48035008, 0x0201f000, 0x001022c0, 0x800409c0, + 0x04000005, 0x4a034406, 0x00000001, 0x0201f000, + 0x0010230c, 0x0201f800, 0x0010513b, 0x04020005, + 0x4a034406, 0x00000016, 0x0201f000, 0x0010230c, + 0x836c0580, 0x00000003, 0x04000005, 0x4a034406, + 0x00000007, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x82040500, 0xffffff00, 0x02020000, 0x00102310, + 0x82041580, 0x000000ff, 0x04020007, 0x59a80010, + 0x82000500, 0x000000ff, 0x82001540, 0x0000ff00, + 0x0401f011, 0x82040400, 0x0010210e, 0x50000000, + 0x80000110, 0x82000580, 0x00000080, 0x02000000, + 0x00102310, 0x59a80010, 0x82000500, 0x000000ff, + 0x80041580, 0x02000000, 0x00102310, 0x840409c0, + 0x80041540, 0x0201f800, 0x0002075a, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x48ee6021, 0x480a621c, 0x4a02641c, 0x0000bc09, + 0x4a026406, 0x00000001, 0x0201f800, 0x00103a00, + 0x04020007, 0x0201f800, 0x0002077d, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x497a5a04, + 0x497a5805, 0x4a025c04, 0x00008000, 0x4a01d809, + 0x001027f9, 0x492e6008, 0x42027000, 0x00000032, + 0x0201f000, 0x000207a1, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x0201f800, 0x0010513b, 0x04020005, 0x4a034406, + 0x00000016, 0x0201f000, 0x0010230c, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00c06, 0x82040500, + 0xffffff00, 0x02020000, 0x00102310, 0x82041580, + 0x000000ff, 0x04020007, 0x59a80010, 0x82000500, + 0x000000ff, 0x82001540, 0x0000ff00, 0x0401f011, + 0x82040400, 0x0010210e, 0x50000000, 0x80000110, + 0x82000580, 0x00000080, 0x02000000, 0x00102310, + 0x59a80010, 0x82000500, 0x000000ff, 0x80041580, + 0x02000000, 0x00102310, 0x840409c0, 0x80041540, + 0x0201f800, 0x0002075a, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x48ee6021, + 0x480a621c, 0x4a02641c, 0x0000bc05, 0x4a026406, + 0x00000001, 0x0201f800, 0x00103a00, 0x04020007, + 0x0201f800, 0x0002077d, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x497a5a04, 0x497a5805, + 0x4a025c04, 0x00008000, 0x4a01d809, 0x001027f9, + 0x492e6008, 0x42027000, 0x00000032, 0x0201f000, + 0x000207a1, 0x592c0005, 0x82000580, 0x01000000, + 0x02020000, 0x001022c0, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x497b4406, 0x497b4207, + 0x0201f800, 0x00103b25, 0x04000008, 0x59a80066, + 0x59a8086a, 0x80040480, 0x59a80867, 0x48074406, + 0x80041480, 0x480b4207, 0x49674407, 0x59a8000e, + 0x48034209, 0x495f4409, 0x59a80020, 0x4803420b, + 0x0201f000, 0x001022c0, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a00406, 0x8c000500, 0x0402000f, 0x59a80069, + 0x81640480, 0x04001008, 0x59a8000b, 0x81500580, + 0x04000009, 0x59a8006a, 0x59a81066, 0x80080580, + 0x04000005, 0x4a034406, 0x00000018, 0x0201f000, + 0x0010230c, 0x82000540, 0x00000001, 0x0201f800, + 0x001015fe, 0x0201f800, 0x00103c80, 0x0201f000, + 0x001022c0, 0x4803c856, 0x800409c0, 0x02020000, + 0x00102314, 0x59a00406, 0x8c00051e, 0x04000008, + 0x4803c856, 0x59a0020b, 0x82000480, 0x00000800, + 0x04001015, 0x0201f000, 0x00102310, 0x4803c856, + 0x59a0020b, 0x599c0a01, 0x80040480, 0x04021003, + 0x0201f000, 0x00102310, 0x59a8000e, 0x81640580, + 0x04000009, 0x4a034406, 0x00000018, 0x0201f000, + 0x0010230c, 0x4a034406, 0x00000005, 0x0201f000, + 0x0010230c, 0x59a80026, 0x8c00050a, 0x040007fa, + 0x59a00406, 0x8c00051e, 0x04000036, 0x0201f800, + 0x0002075a, 0x040007f4, 0x0201f800, 0x00103a00, + 0x040007f1, 0x497a5a04, 0x59a00406, 0x4802620a, + 0x59a00209, 0x4802640a, 0x59a00409, 0x4802620b, + 0x59a0020d, 0x4802620c, 0x59a0040d, 0x4802640c, + 0x59a0020e, 0x4802620d, 0x59a0040e, 0x4802640d, + 0x59a00210, 0x4802620e, 0x59a00410, 0x4802640e, + 0x59a0020b, 0x82000500, 0x0000fffc, 0x80000104, + 0x4802640b, 0x0401f9d9, 0x040007d7, 0x48ee6021, + 0x58ee580d, 0x5930020e, 0x59301c0e, 0x900c19c0, + 0x800c1d40, 0x5930020c, 0x5930140c, 0x900811c0, + 0x80081540, 0x592c0a05, 0x832c0400, 0x00000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5, + 0x4a034000, 0x00000001, 0x49334001, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x0201f800, 0x00100ae0, + 0x0401f86d, 0x497b5057, 0x4201d000, 0x00002710, + 0x0201f800, 0x001060c6, 0x59c40880, 0x4c040000, + 0x59c408a3, 0x4c040000, 0x497b4002, 0x0401f876, + 0x0401f893, 0x4a03a005, 0x10000000, 0x0401f8b4, + 0x0401f901, 0x04000048, 0x59c80001, 0x800001c0, + 0x040007fc, 0x59c80018, 0x82000500, 0xf0000000, + 0x59c00808, 0x82040d00, 0x0fffffff, 0x80040540, + 0x48038008, 0x0201f800, 0x00100ec1, 0x59c00006, + 0x4a038006, 0x10000000, 0x59c00009, 0x82000d00, + 0x00e00000, 0x04020024, 0x4a03900d, 0x00000000, + 0x59c80020, 0x82000500, 0xff000000, 0x82000580, + 0x32000000, 0x0402001c, 0x4a03900d, 0x00000001, + 0x59c80020, 0x82000500, 0xff000000, 0x82000580, + 0xe1000000, 0x04020014, 0x4a03900d, 0x00000000, + 0x59c80020, 0x82000500, 0x00ffffff, 0x4a03900d, + 0x00000000, 0x59c80821, 0x82040d00, 0x00ffffff, + 0x80040580, 0x04020008, 0x59a80010, 0x80040580, + 0x04020005, 0x59c40005, 0x82000500, 0x000000f0, + 0x04000006, 0x4803c856, 0x0401f8d7, 0x4a035057, + 0x00000001, 0x0401f002, 0x0401f8e1, 0x42000000, + 0x00000064, 0x80000040, 0x02000800, 0x001005d8, + 0x59c00807, 0x82040d00, 0x0000000c, 0x040007fa, + 0x0401f003, 0x4a035057, 0x00000001, 0x0401f8da, + 0x0201f800, 0x00106f36, 0x0401f818, 0x4201d000, + 0x000186a0, 0x0201f800, 0x001060c6, 0x5c000800, + 0x480788a3, 0x5c000800, 0x48078880, 0x59a80057, + 0x800001c0, 0x02000000, 0x001022c0, 0x0201f000, + 0x00102318, 0x599c0201, 0x48035059, 0x41780800, + 0x42001000, 0x00003b10, 0x0201f800, 0x001066a0, + 0x480b505a, 0x1c01f000, 0x0201f800, 0x00106c4b, + 0x59b800ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000003, 0x04020003, 0x4a0370e8, 0x00000001, + 0x1c01f000, 0x42038000, 0x00007700, 0x4a038006, + 0x30000000, 0x59c00007, 0x8c00050a, 0x040207fe, + 0x59c00006, 0x59a00209, 0x59a00c09, 0x900409c0, + 0x80040d40, 0x48078001, 0x59a0020e, 0x59a00c0e, + 0x900409c0, 0x80040d40, 0x48078000, 0x59a0020b, + 0x82000500, 0x0000fffc, 0x48038002, 0x48038003, + 0x48038005, 0x497b9009, 0x59e00003, 0x82000540, + 0x00008060, 0x4803c003, 0x1c01f000, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800, + 0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a, + 0x00000001, 0x4a03a005, 0x20000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a, + 0x040207fe, 0x59d00005, 0x59a00210, 0x59a00c10, + 0x900409c0, 0x80040d40, 0x4807a001, 0x59a0020d, + 0x59a00c0d, 0x900409c0, 0x80040d40, 0x4807a000, + 0x59a0020b, 0x82000500, 0x0000fffc, 0x4803a003, + 0x4803a002, 0x4803a008, 0x1c01f000, 0x59a00002, + 0x4803c857, 0x800001c0, 0x0402004a, 0x59a8005a, + 0x48038880, 0x59c400a3, 0x82000540, 0x00002008, + 0x8400053a, 0x480388a3, 0x59c40008, 0x8400054e, + 0x82000500, 0xffffffe1, 0x48038808, 0x59c80040, + 0x84000534, 0x48039040, 0x0401f902, 0x04020013, + 0x59a80010, 0x800000d0, 0x82000540, 0x00000011, + 0x48039120, 0x59a80010, 0x82000500, 0x00ffffff, + 0x82000540, 0x32000000, 0x48039121, 0x4a039123, + 0xe1290008, 0x59a80010, 0x82000500, 0x00ffffff, + 0x48039122, 0x0401f016, 0x59a80010, 0x82000500, + 0x000000ff, 0x900009c0, 0x840001c0, 0x80040540, + 0x82000540, 0x00000000, 0x48039120, 0x59a80010, + 0x82000500, 0x000000ff, 0x82000540, 0x01000000, + 0x48039121, 0x4a039123, 0x08210008, 0x59a80010, + 0x82000500, 0x000000ff, 0x48039122, 0x497b9124, + 0x59a80c5b, 0x80040800, 0x4807545b, 0x900409c0, + 0x82040540, 0x0000aaaa, 0x48039125, 0x497b9126, + 0x497b9127, 0x0401f8cf, 0x04020004, 0x4a039100, + 0x0000e980, 0x0401f003, 0x4a039100, 0x0000e9a0, + 0x1c01f000, 0x82000540, 0x00000001, 0x0402500d, + 0x4203e000, 0x80000000, 0x40e81000, 0x41780800, + 0x42000000, 0x00000064, 0x0201f800, 0x001066a0, + 0x59940024, 0x80080400, 0x48032824, 0x80000580, + 0x1c01f000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x417a3000, 0x0201f800, 0x001070d8, + 0x0201f800, 0x00106dc3, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x1c01f000, 0x59c80007, + 0x8c000500, 0x04000003, 0x4a03900d, 0x00000030, + 0x1c01f000, 0x4a038805, 0x00020000, 0x42000800, + 0x0000003c, 0x0201f800, 0x00101345, 0x4a038891, + 0x0000ffff, 0x59c80035, 0x48039035, 0x4a03900d, + 0x00000040, 0x42038000, 0x00007700, 0x0201f800, + 0x00100ec1, 0x42038000, 0x00007720, 0x0201f800, + 0x00100ec1, 0x4a03a005, 0x20000000, 0x4a03a005, + 0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe, + 0x1c01f000, 0x4d300000, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x5c026000, 0x02000000, 0x00102304, 0x4d300000, + 0x59a26001, 0x59a00000, 0x4000b000, 0x80000000, + 0x48034000, 0x592c0001, 0x80000540, 0x0400001e, + 0x40025800, 0x8058b040, 0x040207fb, 0x58ec1007, + 0x58ec1808, 0x592c0a05, 0x4d2c0000, 0x58ec000d, + 0x40025800, 0x592c0204, 0x5c025800, 0x82000580, + 0x00000103, 0x04000008, 0x832c0400, 0x00000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x001029e5, + 0x0401f007, 0x832c0400, 0x00000006, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x001029e5, 0x5c026000, + 0x1c01f000, 0x58ec000d, 0x40025800, 0x592c0204, + 0x82000580, 0x00000103, 0x04020006, 0x0201f800, + 0x0002077d, 0x5c026000, 0x0201f000, 0x001022c0, + 0x58ec000d, 0x40025800, 0x592c0404, 0x8400055e, + 0x48025c04, 0x42028800, 0x000007fd, 0x42003000, + 0x00fffffd, 0x0201f800, 0x001045a6, 0x04000003, + 0x80000580, 0x0401f004, 0x59a26001, 0x0201f800, + 0x0010937d, 0x5c026000, 0x02000000, 0x0010230c, + 0x4d300000, 0x4a01d809, 0x00102a38, 0x0401f7dc, + 0x592c0005, 0x82000580, 0x01000000, 0x02000000, + 0x00102318, 0x4d300000, 0x59a26001, 0x5930020b, + 0x59301c0a, 0x900001c0, 0x800c1d40, 0x5930040d, + 0x5930120d, 0x900001c0, 0x80081540, 0x592c0a05, + 0x832c0400, 0x00000006, 0x0201f800, 0x00103a28, + 0x4a01d809, 0x001029e5, 0x4a034000, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4c300000, + 0x5930040b, 0x82000c80, 0x0000000e, 0x04001004, + 0x4a025a05, 0x0000000e, 0x0401f003, 0x48025a05, + 0x0401f00c, 0x800409c0, 0x0400000a, 0x4c040000, + 0x0201f800, 0x00103a00, 0x5c000800, 0x04000003, + 0x40040000, 0x0401f7f0, 0x80000580, 0x0401f003, + 0x82000540, 0x00000001, 0x5c006000, 0x1c01f000, + 0x59a00206, 0x82000580, 0x00000044, 0x1c01f000, + 0x4807c857, 0x800409c0, 0x0400000c, 0x0201f800, + 0x00101650, 0x04020009, 0x42000000, 0x00000002, + 0x0201f800, 0x0010188c, 0x42000000, 0x00000002, + 0x0201f800, 0x00101821, 0x59a00406, 0x82000500, + 0x00000007, 0x0c01f001, 0x00102a8c, 0x00102aa1, + 0x00102ab7, 0x00102a8a, 0x00102a8a, 0x00102a8a, + 0x00102a8a, 0x00102a8a, 0x0201f000, 0x00102310, + 0x42000800, 0x000000c0, 0x0201f800, 0x0010193f, + 0x82040540, 0x00000002, 0x42000800, 0x000000c0, + 0x0201f800, 0x00101944, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000008, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x0401f00b, 0x42000800, 0x000000c0, 0x0201f800, + 0x0010193f, 0x82040540, 0x00000001, 0x42000800, + 0x000000c0, 0x0201f800, 0x00101944, 0x59c80040, + 0x4c000000, 0x59a80010, 0x4c000000, 0x59c400a3, + 0x4c000000, 0x59c40008, 0x4c000000, 0x0401f911, + 0x04000021, 0x0201f800, 0x001005d8, 0x59a80821, + 0x800409c0, 0x02020000, 0x00102314, 0x0201f800, + 0x0010513b, 0x04020005, 0x4a034406, 0x00000016, + 0x0201f000, 0x0010230c, 0x836c0580, 0x00000003, + 0x02020000, 0x00102314, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040580, 0x00000000, 0x02020000, + 0x00102314, 0x59c80040, 0x4c000000, 0x59a80010, + 0x4c000000, 0x59c400a3, 0x4c000000, 0x59c40008, + 0x4c000000, 0x59c40080, 0x4c000000, 0x59a0020f, + 0x59a0bc0f, 0x905cb9c0, 0x805cbd40, 0x41784800, + 0x41785000, 0x41785800, 0x41789000, 0x41789800, + 0x0401fe21, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00100ae0, 0x4178c000, 0x497b4002, 0x0401f95c, + 0x0401f9aa, 0x59a0020c, 0x59a00c0c, 0x80040d40, + 0x04000002, 0x0401f9fb, 0x0401f9fa, 0x0401fe68, + 0x8060c1c0, 0x04020014, 0x0401fa98, 0x0401feb2, + 0x0402000e, 0x0201f800, 0x001018d3, 0x04020008, + 0x4a034406, 0x00000017, 0x0201f800, 0x0010230c, + 0x4203e000, 0x50000000, 0x0401f000, 0x42005800, + 0x0000aaaa, 0x0401f058, 0x59c80001, 0x800001c0, + 0x040007ee, 0x59c80801, 0x800409c0, 0x04000006, + 0x0401fa70, 0x40240000, 0x80280540, 0x802c0540, + 0x0402004d, 0x59a00002, 0x82000580, 0xfeedbeef, + 0x04000004, 0x42008800, 0x10000000, 0x0401f003, + 0x42008800, 0x10000004, 0x0401fa19, 0x4a034002, + 0xfeedbeef, 0x0401fa71, 0x0401fa97, 0x0401fea8, + 0x59c40005, 0x8c000534, 0x04000004, 0x42005800, + 0x0000bbbb, 0x0401f038, 0x0401fe83, 0x04020007, + 0x42005800, 0x0000cccc, 0x485f420f, 0x905cb9c0, + 0x485f440f, 0x0401f030, 0x59a0040c, 0x800001c0, + 0x0400000e, 0x59a26000, 0x5930000d, 0x800001c0, + 0x040207be, 0x59a26001, 0x5930080d, 0x800409c0, + 0x040207ba, 0x804891c0, 0x040207b8, 0x804c99c0, + 0x040207b6, 0x0401f87a, 0x805cb840, 0x04000005, + 0x40240000, 0x80280540, 0x802c0540, 0x0402001a, + 0x42000000, 0x00030d40, 0x80000040, 0x04020012, + 0x59c00007, 0x82000500, 0x000501c0, 0x0402000b, + 0x0201f800, 0x001018d3, 0x04020008, 0x4a034406, + 0x00000017, 0x0201f800, 0x0010230c, 0x4203e000, + 0x50000000, 0x0401f000, 0x42005800, 0x0000dddd, + 0x0401f005, 0x59c00807, 0x82040d00, 0x0000000c, + 0x040007ea, 0x0401fe5c, 0x59a0040c, 0x800001c0, + 0x04000002, 0x0401f856, 0x0401fe6b, 0x40240000, + 0x80280540, 0x802c0540, 0x04020003, 0x805cb9c0, + 0x04020781, 0x0201f800, 0x00106f36, 0x0401fda3, + 0x4201d000, 0x000186a0, 0x0201f800, 0x001060c6, + 0x5c000800, 0x48078880, 0x5c000800, 0x48078808, + 0x5c000800, 0x480788a3, 0x5c000800, 0x48075010, + 0x5c000800, 0x48079040, 0x0201f800, 0x00100969, + 0x59a00406, 0x82000500, 0x00000003, 0x82000580, + 0x00000002, 0x0400002c, 0x42000800, 0x000000c0, + 0x0201f800, 0x0010193f, 0x82040500, 0xfffffffc, + 0x42000800, 0x000000c0, 0x0201f800, 0x00101944, + 0x42000800, 0x00000000, 0x0201f800, 0x0010193f, + 0x82040500, 0xfffffff7, 0x42000800, 0x00000000, + 0x0201f800, 0x00101944, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040500, 0xfffffffb, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x4a0388a7, 0x0000f7f7, 0x42006000, 0xbeffffff, + 0x42006800, 0x80018000, 0x0201f800, 0x0010427d, + 0x42006000, 0xfffeffff, 0x41786800, 0x0201f800, + 0x0010427d, 0x402c0000, 0x80280540, 0x80240540, + 0x02000000, 0x001022c0, 0x48274406, 0x482b4207, + 0x482f4407, 0x0201f000, 0x0010231c, 0x59a26000, + 0x813261c0, 0x0400000e, 0x59325808, 0x812e59c0, + 0x0400000b, 0x0201f800, 0x0002077d, 0x0201f800, + 0x001007fd, 0x59a26001, 0x59325808, 0x0201f800, + 0x0002077d, 0x0201f800, 0x001007fd, 0x1c01f000, + 0x42000800, 0x000000ef, 0x0201f800, 0x001015eb, + 0x59c400a3, 0x8400055a, 0x8400053a, 0x480388a3, + 0x0201f800, 0x0010163b, 0x0402000a, 0x42000000, + 0x00000001, 0x0201f800, 0x0010188c, 0x42000000, + 0x00000001, 0x0201f800, 0x00101821, 0x0401f013, + 0x0201f800, 0x00101642, 0x04020008, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f009, 0x42000000, 0x00000002, + 0x0201f800, 0x0010188c, 0x42000000, 0x00000002, + 0x0201f800, 0x00101821, 0x42000800, 0x00000000, + 0x0201f800, 0x0010193f, 0x82040540, 0x00000004, + 0x42000800, 0x00000000, 0x0201f800, 0x00101944, + 0x4201d000, 0x00000014, 0x0201f800, 0x0010608e, + 0x59c40008, 0x8400054e, 0x82000500, 0xffffffe1, + 0x48038808, 0x4a0388a7, 0x0000f7f7, 0x42001000, + 0x04000001, 0x0201f800, 0x0010193d, 0x42006000, + 0xbe20bfff, 0x42006800, 0x80018000, 0x0201f800, + 0x0010427d, 0x42006000, 0xfffeffff, 0x41786800, + 0x0201f800, 0x0010427d, 0x4200b000, 0x00001388, + 0x4201d000, 0x00000014, 0x4c580000, 0x0201f800, + 0x0010608e, 0x0201f800, 0x001018d3, 0x5c00b000, + 0x04000004, 0x8058b040, 0x040207f6, 0x0401f025, + 0x59c40005, 0x8c000534, 0x04020007, 0x59c400a4, + 0x82000500, 0x0000000f, 0x82000580, 0x00000008, + 0x0402001c, 0x42006000, 0x00020000, 0x0201f800, + 0x00104282, 0x4201d000, 0x00000064, 0x0201f800, + 0x0010608e, 0x42006000, 0xfeffffff, 0x42006800, + 0x02000000, 0x0201f800, 0x0010427d, 0x42006000, + 0xfdffffff, 0x41786800, 0x0201f800, 0x0010427d, + 0x4a038805, 0x04000001, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000000, 0x04000003, + 0x82000540, 0x00000001, 0x1c01f000, 0x4803c856, + 0x42038000, 0x00007700, 0x0201f800, 0x00100ec1, + 0x59c00006, 0x59a0040c, 0x800001c0, 0x0400003f, + 0x59a03c0c, 0x59a00209, 0x59a01c09, 0x900c19c0, + 0x800c1d40, 0x59a0020e, 0x59a0240e, 0x901021c0, + 0x80102540, 0x59a0020b, 0x82000500, 0x0000fffc, + 0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003, + 0x0201f800, 0x0002075a, 0x02000800, 0x001005d8, + 0x49334000, 0x0201f800, 0x001007e4, 0x4a025a04, + 0x00000018, 0x4a025805, 0x00abcdef, 0x492e6008, + 0x492e600b, 0x481e600d, 0x4a02600c, 0x00000004, + 0x832c0400, 0x00000011, 0x4802600a, 0x42001000, + 0x0000000c, 0x821c0d80, 0x00000001, 0x04000004, + 0x801c3840, 0x0401f963, 0x0401f004, 0x41783800, + 0x0401f960, 0x0401f011, 0x821c0c80, 0x00000005, + 0x04001005, 0x40043800, 0x42001000, 0x0000003c, + 0x0401f006, 0x80001580, 0x82081400, 0x0000000c, + 0x801c3840, 0x040207fd, 0x832c0400, 0x00000005, + 0x0401f950, 0x040207f1, 0x497b9009, 0x59e00003, + 0x82000540, 0x00008060, 0x4803c003, 0x4a038009, + 0x00e00000, 0x1c01f000, 0x4803c856, 0x41780800, + 0x8007a0ca, 0x83d3a400, 0x00007600, 0x42000800, + 0x00000040, 0x0201f800, 0x00101345, 0x4a03a00a, + 0x00000001, 0x4a03a005, 0x20000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59d00006, 0x8c00050a, + 0x040207fe, 0x59d00005, 0x59a0020c, 0x800001c0, + 0x0400003f, 0x59a03a0c, 0x59a00210, 0x59a01c10, + 0x900c19c0, 0x800c1d40, 0x59a0020d, 0x59a0240d, + 0x901021c0, 0x80102540, 0x59a0120b, 0x82081500, + 0x0000fffc, 0x59a0040b, 0x900001c0, 0x80081540, + 0x480ba003, 0x0201f800, 0x0002075a, 0x02000800, + 0x001005d8, 0x49334001, 0x0201f800, 0x001007e4, + 0x4a025a04, 0x00000018, 0x4a025805, 0x00abcdef, + 0x492e6008, 0x492e600b, 0x481e600d, 0x4a02600c, + 0x00000004, 0x832c0400, 0x00000011, 0x4802600a, + 0x42001000, 0x0000000c, 0x821c0d80, 0x00000001, + 0x04000004, 0x801c3840, 0x0401f906, 0x0401f004, + 0x41783800, 0x0401f903, 0x0401f011, 0x821c0c80, + 0x00000005, 0x04001005, 0x40043800, 0x42001000, + 0x0000003c, 0x0401f006, 0x80001580, 0x82081400, + 0x0000000c, 0x801c3840, 0x040207fd, 0x832c0400, + 0x00000005, 0x0401f8f3, 0x040207f1, 0x1c01f000, + 0x4803c856, 0x59a0020c, 0x800001c0, 0x04000024, + 0x824c0580, 0x00000002, 0x04000040, 0x59a26001, + 0x5930380d, 0x801c39c0, 0x0400003c, 0x801c3840, + 0x481e600d, 0x5932580b, 0x5930080a, 0x50042000, + 0x58041801, 0x58041002, 0x82081500, 0xfffffffc, + 0x5930000c, 0x80000000, 0x82000d80, 0x00000005, + 0x04020009, 0x497a600c, 0x592e5801, 0x812e59c0, + 0x0400001a, 0x492e600b, 0x832c0c00, 0x00000005, + 0x0401f005, 0x4802600c, 0x5930080a, 0x82040c00, + 0x00000003, 0x4806600a, 0x0401f010, 0x59a0120b, + 0x82081500, 0x0000fffc, 0x59a0040b, 0x900001c0, + 0x80081540, 0x480ba003, 0x59a0020d, 0x59a0240d, + 0x901021c0, 0x80102540, 0x59a00210, 0x59a01c10, + 0x900c19c0, 0x800c1d40, 0x4201d000, 0x00003a98, + 0x0201f800, 0x001060c6, 0x480ba002, 0x59a80059, + 0x4803a008, 0x4813a000, 0x480fa001, 0x4a03a005, + 0x10000000, 0x02005800, 0x001005d8, 0x804c9800, + 0x82000540, 0x00000001, 0x1c01f000, 0x4847c857, + 0x59a0040c, 0x800001c0, 0x04000024, 0x82480580, + 0x00000002, 0x04000042, 0x59a26000, 0x5930380d, + 0x801c39c0, 0x0400003e, 0x801c3840, 0x481e600d, + 0x5932580b, 0x5930080a, 0x50042000, 0x58041801, + 0x58041002, 0x82081500, 0xfffffffc, 0x5930000c, + 0x80000000, 0x82000d80, 0x00000005, 0x04020009, + 0x497a600c, 0x592e5801, 0x812e59c0, 0x0400001d, + 0x492e600b, 0x832c0c00, 0x00000005, 0x0401f005, + 0x4802600c, 0x5930080a, 0x82040c00, 0x00000003, + 0x4806600a, 0x0401f013, 0x82440580, 0x10000000, + 0x0402001f, 0x59a0020e, 0x59a0240e, 0x901021c0, + 0x80102540, 0x59a00209, 0x59a01c09, 0x900c19c0, + 0x800c1d40, 0x59a0020b, 0x82000500, 0x0000fffc, + 0x59a0140b, 0x900811c0, 0x80081540, 0x480b8003, + 0x48138000, 0x480f8001, 0x480b8002, 0x59c80018, + 0x82000500, 0xf0000000, 0x59c02008, 0x82102500, + 0x0fffffff, 0x80100540, 0x48038008, 0x48478006, + 0x80489000, 0x8260c540, 0x00000001, 0x1c01f000, + 0x59c00009, 0x4803c857, 0x82000d00, 0x00e00000, + 0x0400000d, 0x485f420f, 0x905cb9c0, 0x485f440f, + 0x8c00052e, 0x04000002, 0x80285000, 0x8c00052c, + 0x04000002, 0x80244800, 0x8c00052a, 0x04000002, + 0x802c5800, 0x1c01f000, 0x59a0020c, 0x800001c0, + 0x04000024, 0x59d00806, 0x4807c857, 0x8c040d3e, + 0x04000020, 0x4a03a005, 0x20000000, 0x4a03a005, + 0x30000000, 0x59d00806, 0x8c040d0a, 0x040207fe, + 0x824c0480, 0x00000003, 0x02021800, 0x001005d8, + 0x404c0000, 0x0c01f001, 0x00102da1, 0x00102da3, + 0x00102da9, 0x0201f800, 0x001005d8, 0x80000040, + 0x40009800, 0x0401ff43, 0x0400000a, 0x0401ff41, + 0x0401f008, 0x80000040, 0x40009800, 0x59d00806, + 0x4807c857, 0x8c040d3e, 0x040207e3, 0x0401ff39, + 0x1c01f000, 0x59a0040c, 0x800001c0, 0x04000024, + 0x59c00807, 0x4807c857, 0x8c040d3e, 0x04000020, + 0x59c00807, 0x4a038006, 0x20000000, 0x82480480, + 0x00000003, 0x02021800, 0x001005d8, 0x40480000, + 0x0c01f001, 0x00102dc4, 0x00102dc6, 0x00102dce, + 0x0201f800, 0x001005d8, 0x80000040, 0x40009000, + 0x42008800, 0x10000004, 0x0401ff65, 0x0400000c, + 0x0401ff63, 0x0401f00a, 0x80000040, 0x40009000, + 0x59c00807, 0x4807c857, 0x8c040d3e, 0x040207e5, + 0x42008800, 0x10000004, 0x0401ff59, 0x1c01f000, + 0x492fc857, 0x4000a800, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x4a03b805, 0x30000000, 0x4813b800, + 0x480fb801, 0x480bb802, 0x4857b803, 0x4a03b805, + 0x30000002, 0x59dc0006, 0x4a03b805, 0x70000001, + 0x59dc0006, 0x4a03b805, 0x10000000, 0x59dc0006, + 0x8c00053e, 0x040007fe, 0x4a03b805, 0x20000000, + 0x59dc0006, 0x59dc2000, 0x59dc1801, 0x801c39c0, + 0x0400000a, 0x4d2c0000, 0x0201f800, 0x001007e4, + 0x5c000800, 0x02000800, 0x001005d8, 0x4a025a04, + 0x0000000a, 0x492c0801, 0x1c01f000, 0x42006000, + 0x00102fb2, 0x0201f800, 0x00101345, 0x4a03902c, + 0x00200000, 0x4200b000, 0x000001f4, 0x59c8002c, + 0x8c00052c, 0x04000007, 0x8058b040, 0x040207fc, + 0x42000000, 0x00004003, 0x41781000, 0x0401f196, + 0x50301000, 0x41784800, 0x4a03902d, 0x00008000, + 0x4200b000, 0x000001f4, 0x59c8002c, 0x8c000534, + 0x04000007, 0x8058b040, 0x040207fc, 0x42000000, + 0x00004003, 0x41781000, 0x0401f187, 0x0401f8f8, + 0x80244800, 0x40240000, 0x82000580, 0x000003b1, + 0x040207fb, 0x0401f988, 0x41784800, 0x0401f920, + 0x80244800, 0x40240000, 0x82000580, 0x000003b1, + 0x040207fb, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207e0, 0x59a80863, 0x800409c0, 0x04000007, + 0x42000000, 0x00004004, 0x42001000, 0x00000002, + 0x59a81862, 0x0401f16c, 0x42006000, 0x00102fb2, + 0x4a035064, 0x00000004, 0x50301000, 0x41784800, + 0x4a03902d, 0x00004000, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x8c000532, 0x04000007, 0x8058b040, + 0x040207fc, 0x42000000, 0x00004003, 0x41781000, + 0x0401f159, 0x0401f8ca, 0x80244800, 0x40240000, + 0x82000580, 0x00000154, 0x040207fb, 0x0401f95a, + 0x41784800, 0x0401f8f2, 0x80244800, 0x40240000, + 0x82000580, 0x00000154, 0x040207fb, 0x80306000, + 0x82300580, 0x00102fb4, 0x040207e0, 0x59a80863, + 0x800409c0, 0x04000007, 0x42000000, 0x00004004, + 0x42001000, 0x00000004, 0x59a81862, 0x0401f13e, + 0x42006000, 0x00102fb2, 0x497b5064, 0x50301000, + 0x41784800, 0x4a03902d, 0x00001000, 0x4200b000, + 0x000001f4, 0x59c8002c, 0x8c00052e, 0x04000007, + 0x8058b040, 0x040207fc, 0x42000000, 0x00004003, + 0x41781000, 0x0401f12c, 0x0401f89d, 0x80244800, + 0x40240000, 0x82000580, 0x00000088, 0x040207fb, + 0x0401f92d, 0x41784800, 0x0401f8c5, 0x80244800, + 0x40240000, 0x82000580, 0x00000088, 0x040207fb, + 0x80306000, 0x82300580, 0x00102fb4, 0x040207e0, + 0x59a80863, 0x800409c0, 0x04000007, 0x42000000, + 0x00004004, 0x42001000, 0x00000001, 0x59a81862, + 0x0401f111, 0x42006000, 0x00102fb2, 0x50301000, + 0x41784800, 0x4a03902d, 0x00000800, 0x0401f87c, + 0x80244800, 0x40240000, 0x82000580, 0x00000018, + 0x040207fb, 0x0401f90c, 0x41784800, 0x0401f8a4, + 0x80244800, 0x40240000, 0x82000580, 0x00000018, + 0x040207fb, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207eb, 0x59a80863, 0x800409c0, 0x04000007, + 0x42000000, 0x00004004, 0x42001000, 0x00000010, + 0x59a81862, 0x0401f0f0, 0x42006000, 0x00102fb2, + 0x50301000, 0x41784800, 0x4a03902d, 0x00000400, + 0x0401f85b, 0x80244800, 0x40240000, 0x82000580, + 0x00000088, 0x040207fb, 0x0401f8eb, 0x41784800, + 0x0401f883, 0x80244800, 0x40240000, 0x82000580, + 0x00000088, 0x040207fb, 0x80306000, 0x82300580, + 0x00102fb4, 0x040207eb, 0x59a80863, 0x800409c0, + 0x04000007, 0x42000000, 0x00004004, 0x42001000, + 0x00000008, 0x59a81862, 0x0401f0cf, 0x42006000, + 0x00102fb2, 0x50301000, 0x41784800, 0x4a03902d, + 0x00002000, 0x4200b000, 0x000001f4, 0x59c8002c, + 0x8c000530, 0x04000007, 0x8058b040, 0x040207fc, + 0x42000000, 0x00004003, 0x41781000, 0x0401f0be, + 0x59c8002c, 0x82000500, 0xffe0ffff, 0x82080d00, + 0x001f0000, 0x80040540, 0x4803902c, 0x0401f828, + 0x80244800, 0x40240000, 0x82000580, 0x00000110, + 0x040207fb, 0x0401f8b8, 0x41784800, 0x0401f850, + 0x59c80034, 0x82080d00, 0x001f0000, 0x82000500, + 0x001f0000, 0x80040580, 0x04000006, 0x59a80063, + 0x80000000, 0x48035063, 0x40240000, 0x48035062, + 0x80244800, 0x40240000, 0x82000580, 0x00000110, + 0x040207ef, 0x80306000, 0x82300580, 0x00102fb4, + 0x040207cd, 0x59a80863, 0x800409c0, 0x04000006, + 0x42000000, 0x00004004, 0x42001000, 0x00000020, + 0x59a81862, 0x0201f000, 0x001022c0, 0x59c8002c, + 0x82000500, 0xffff0000, 0x82080d00, 0x0000ffff, + 0x80040540, 0x4803902c, 0x40080000, 0x48039028, + 0x48039029, 0x59a80064, 0x82000580, 0x00000004, + 0x04000004, 0x40080000, 0x4803902a, 0x4803902b, + 0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000, + 0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, + 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, + 0x41781000, 0x0401f06c, 0x4a03902e, 0x00000001, + 0x4200b000, 0x000001f4, 0x59c8002e, 0x8c000500, + 0x04000006, 0x8058b040, 0x040207fc, 0x42000000, + 0x00004003, 0x0401f060, 0x1c01f000, 0x41783800, + 0x59c8082d, 0x82040d00, 0xfffffc00, 0x40240000, + 0x80040d40, 0x4807902d, 0x4200b000, 0x000001f4, + 0x59c8002c, 0x82000500, 0x18000000, 0x04000007, + 0x8058b040, 0x040207fb, 0x42000000, 0x00004003, + 0x41781000, 0x0401f04c, 0x59c80030, 0x59c80830, + 0x80040580, 0x040207fd, 0x40041800, 0x59c80031, + 0x59c80831, 0x80040580, 0x040207fd, 0x40042000, + 0x59c80032, 0x59c80832, 0x80040580, 0x040207fd, + 0x40042800, 0x59c80033, 0x59c80833, 0x80040580, + 0x040207fd, 0x40043000, 0x400c0000, 0x80080580, + 0x04000002, 0x801c3800, 0x40100000, 0x80080580, + 0x04000002, 0x801c3800, 0x59a80064, 0x82000580, + 0x00000004, 0x04000009, 0x40140000, 0x80080580, + 0x04000002, 0x801c3800, 0x40180000, 0x80080580, + 0x04000002, 0x801c3800, 0x59a80064, 0x82000580, + 0x00000004, 0x0400000d, 0x59c80034, 0x59c80834, + 0x80040580, 0x040207fd, 0x82040500, 0x0000ffff, + 0x82080d00, 0x0000ffff, 0x80040580, 0x0400000e, + 0x801c3800, 0x0401f00c, 0x59c80034, 0x59c80834, + 0x80040580, 0x040207fd, 0x82040500, 0x000000ff, + 0x82080d00, 0x000000ff, 0x80040580, 0x04000002, + 0x801c3800, 0x801c39c0, 0x04000006, 0x59a80063, + 0x801c0400, 0x48035063, 0x40240000, 0x48035062, + 0x1c01f000, 0x48034206, 0x48074406, 0x480b4207, + 0x480f4407, 0x48134208, 0x48174408, 0x0201f000, + 0x001022c3, 0x42000000, 0x00600000, 0x80000040, + 0x040207ff, 0x1c01f000, 0x5a5a5a5a, 0xa5a5a5a5, + 0x59a00c0a, 0x800409c0, 0x02000000, 0x00102310, + 0x82040480, 0x00000021, 0x02021000, 0x00102310, + 0x82040480, 0x00000011, 0x04001003, 0x42000800, + 0x00000010, 0x59a00208, 0x59a01407, 0x900811c0, + 0x80081540, 0x59a00207, 0x59a01c06, 0x900c19c0, + 0x800c1d40, 0x0201f800, 0x00103a00, 0x04000006, + 0x0201f800, 0x00103a25, 0x4a01d809, 0x00102fd5, + 0x1c01f000, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x4031d800, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x59a00c0a, 0x82040480, 0x00000011, 0x04001003, + 0x42000800, 0x00000010, 0x59a0040b, 0x59a0120b, + 0x900811c0, 0x80081540, 0x59a00209, 0x59a01c08, + 0x900c19c0, 0x800c1d40, 0x58ec0003, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x00102ff0, 0x1c01f000, + 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x59a00c0a, + 0x82040480, 0x00000011, 0x02001000, 0x001022c0, + 0x82040c80, 0x00000010, 0x59a00208, 0x59a01407, + 0x900811c0, 0x80081540, 0x59a00207, 0x59a01c06, + 0x900c19c0, 0x800c1d40, 0x82081400, 0x00000040, + 0x58ec0003, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x0010300e, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x59a0040a, 0x82000c80, 0x00000010, + 0x59a0040b, 0x59a0120b, 0x900811c0, 0x80081540, + 0x59a00209, 0x59a01c08, 0x900c19c0, 0x800c1d40, + 0x82081400, 0x00000040, 0x58ec0003, 0x0201f800, + 0x00103a28, 0x4a01d809, 0x001022b9, 0x1c01f000, + 0x48efc857, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x59a00406, 0x48034000, 0x480b4001, + 0x480f4002, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x42000800, 0x00000010, 0x0201f800, 0x00103a25, + 0x4a01d809, 0x00103043, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x592c0a04, 0x80040910, + 0x04020005, 0x4a034406, 0x00000019, 0x0201f000, + 0x0010230c, 0x4805d80c, 0x0401f00a, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x48efc857, 0x49a3c857, + 0x48efc857, 0x49a3c857, 0x58ec000c, 0x80000040, + 0x04000012, 0x4801d80c, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x42000800, 0x00000010, 0x58ec1007, + 0x58ec1808, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x00103057, 0x1c01f000, 0x58ee580d, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x492f3006, 0x592c0404, + 0x8400055e, 0x48025c04, 0x4a01d809, 0x00103081, + 0x1c01f000, 0x58ee580d, 0x48efc857, 0x49a3c857, + 0x492fc857, 0x592c0404, 0x8400051e, 0x48025c04, + 0x59a00000, 0x59a01001, 0x59a01802, 0x80081400, + 0x820c1c40, 0x00000000, 0x832c0400, 0x00000004, + 0x42000800, 0x00000010, 0x0201f000, 0x00103a28, + 0x800409c0, 0x04000005, 0x4a034406, 0x00000001, + 0x0201f000, 0x0010230c, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, + 0x0010230c, 0x59a0320b, 0x82183500, 0x000000ff, + 0x59a28c06, 0x0201f800, 0x00020245, 0x02020000, + 0x00102310, 0x83440580, 0x000007fd, 0x04000008, + 0x0201f800, 0x001049e7, 0x04000005, 0x4a034406, + 0x00000009, 0x0201f000, 0x0010230c, 0x0201f800, + 0x00103a00, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x801831c0, 0x0400000a, + 0x412c0800, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x40065800, 0x4a025c04, 0x00008000, 0x497a5a04, + 0x0201f800, 0x00109100, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x001030d2, 0x1c01f000, 0x592c0005, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x592c0406, 0x82002d00, + 0x0000ff00, 0x82000500, 0x000000ff, 0x80000904, + 0x80040800, 0x82040480, 0x00000006, 0x04001003, + 0x42000800, 0x00000005, 0x832ca400, 0x00000006, + 0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28, + 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, + 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, + 0x832c0400, 0x00000006, 0x4c140000, 0x0201f800, + 0x00103a28, 0x5c002800, 0x801429c0, 0x04000003, + 0x4a01d809, 0x001030ff, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x812e59c0, + 0x02000800, 0x001005d8, 0x592c0006, 0x82000500, + 0xff000000, 0x80000904, 0x800409c0, 0x02000000, + 0x00102304, 0x82040480, 0x0000000e, 0x04001003, + 0x42000800, 0x0000000d, 0x592e5801, 0x812e59c0, + 0x02000800, 0x001005d8, 0x832ca400, 0x00000005, + 0x4050a800, 0x4004b000, 0x0201f800, 0x0010ab28, + 0x58ec1007, 0x58ec1808, 0x832c0400, 0x00000005, + 0x0201f000, 0x00103a28, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x59a00c06, 0x82040500, 0x0000ff00, + 0x840001c0, 0x82001480, 0x00000007, 0x02021000, + 0x00102310, 0x0c01f001, 0x0010313d, 0x00103144, + 0x0010314b, 0x0010314b, 0x0010314b, 0x0010314d, + 0x00103152, 0x42000800, 0x0000000d, 0x42003800, + 0x00103166, 0x4a034000, 0x0010b4eb, 0x0401f013, + 0x42000800, 0x0000000d, 0x42003800, 0x00103166, + 0x4a034000, 0x0010b4f8, 0x0401f00c, 0x0201f000, + 0x00102310, 0x42000800, 0x00000008, 0x42003800, + 0x00103179, 0x0401f005, 0x42000800, 0x00000004, + 0x42003800, 0x001031c3, 0x59a00207, 0x59a01407, + 0x900001c0, 0x80081540, 0x59a00209, 0x59a01c09, + 0x900001c0, 0x800c1d40, 0x832c0400, 0x00000005, + 0x4c1c0000, 0x0201f800, 0x00103a25, 0x5c003800, + 0x481dd809, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ee580d, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x4a03501f, 0x00000001, + 0x4200b000, 0x0000000d, 0x59a0a800, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x0201f000, + 0x001022c0, 0x4031d800, 0x58ef400b, 0x58ee580d, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x832ca400, 0x00000005, 0x50500000, + 0x82001500, 0x000c0016, 0x02020000, 0x00102310, + 0x82500c00, 0x00000003, 0x50040000, 0x82001500, + 0x00000001, 0x02020000, 0x00102310, 0x50500000, + 0x82001500, 0x00000028, 0x0400001d, 0x82081580, + 0x00000028, 0x02020000, 0x00102310, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x82081580, + 0x00000013, 0x02020000, 0x00102310, 0x80040800, + 0x50040000, 0x82001500, 0x00010000, 0x82081580, + 0x00010000, 0x02020000, 0x00102310, 0x836c0580, + 0x00000000, 0x04000012, 0x599c0019, 0x8c00050e, + 0x0402000f, 0x0201f000, 0x00102310, 0x80500800, + 0x50040000, 0x82001500, 0x00000013, 0x02020000, + 0x00102310, 0x80040800, 0x50040000, 0x82001500, + 0x00010000, 0x02020000, 0x00102310, 0x4200b000, + 0x00000008, 0x4200a800, 0x0010b4e3, 0x0201f800, + 0x0010ab17, 0x0201f000, 0x001022c0, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x4200b000, + 0x00000004, 0x4200a800, 0x0010b8fa, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x59a80005, + 0x84000550, 0x48035005, 0x0201f000, 0x001022c0, + 0x0201f800, 0x00103a00, 0x04020005, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x82040500, 0x0000ff00, 0x840001c0, 0x82001480, + 0x00000006, 0x02021000, 0x00102310, 0x0c01f001, + 0x001031ee, 0x001031f3, 0x001031f8, 0x001031f8, + 0x001031f8, 0x001031fa, 0x42000800, 0x0000000d, + 0x4200a000, 0x0010b4eb, 0x0401f00c, 0x42000800, + 0x0000000d, 0x4200a000, 0x0010b4f8, 0x0401f007, + 0x0201f000, 0x00102310, 0x42000800, 0x00000008, + 0x4200a000, 0x0010b4e3, 0x4004b000, 0x832cac00, + 0x00000005, 0x0201f800, 0x0010ab17, 0x59a00207, + 0x59a01407, 0x900001c0, 0x80081540, 0x59a00209, + 0x59a01c09, 0x900001c0, 0x800c1d40, 0x832c0400, + 0x00000005, 0x0201f000, 0x00103a28, 0x836c0580, + 0x00000000, 0x04020005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00406, 0x800001c0, + 0x0400001a, 0x59a80005, 0x8c000514, 0x04000005, + 0x42000000, 0x00000001, 0x40000800, 0x0401f003, + 0x59a00207, 0x59a80853, 0x48035053, 0x0201f800, + 0x0010163b, 0x04000022, 0x0201f800, 0x00101642, + 0x0400001f, 0x0201f800, 0x00101649, 0x0400001c, + 0x0201f800, 0x00101650, 0x04000019, 0x48075053, + 0x0201f000, 0x00102310, 0x59c40801, 0x82040d00, + 0x00018000, 0x82040580, 0x00000000, 0x04020004, + 0x4a034406, 0x00000000, 0x0401f00d, 0x82040580, + 0x00008000, 0x04020004, 0x4a034406, 0x00000001, + 0x0401f007, 0x82040580, 0x00010000, 0x02020800, + 0x001005d8, 0x4a034406, 0x00000003, 0x59a00406, + 0x82000580, 0x00000002, 0x0402001f, 0x59c40006, + 0x84000500, 0x48038806, 0x0201f800, 0x00106ede, + 0x497b8880, 0x0201f800, 0x0010a9c0, 0x0201f800, + 0x0010a9ce, 0x42000000, 0x0010b8ca, 0x0201f800, + 0x0010aa47, 0x82000540, 0x00000001, 0x0201f800, + 0x0010518c, 0x4a038808, 0x00000000, 0x4202d800, + 0x00000004, 0x42001000, 0x00000001, 0x0201f800, + 0x0010193d, 0x4a035049, 0x00000001, 0x0201f800, + 0x001006d4, 0x0201f000, 0x001022c0, 0x800409c0, + 0x04000005, 0x4a034406, 0x00000001, 0x0201f000, + 0x0010230c, 0x836c0580, 0x00000003, 0x04000005, + 0x4a034406, 0x00000007, 0x0201f000, 0x0010230c, + 0x59a28c06, 0x59a0320b, 0x82183500, 0x000000ff, + 0x0201f800, 0x00020245, 0x02020000, 0x00102310, + 0x83440580, 0x000007fd, 0x04000008, 0x0201f800, + 0x001049e7, 0x04000005, 0x42000800, 0x00000009, + 0x0201f000, 0x0010230c, 0x0201f800, 0x00103a00, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000, + 0x0201f800, 0x00109115, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x0010329e, 0x1c01f000, 0x592c0005, 0x82000d00, + 0x0000ffff, 0x82000500, 0xffff0000, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x80040904, 0x832ca400, + 0x00000005, 0x4050a800, 0x4004b000, 0x0201f800, + 0x0010ab28, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0201f000, + 0x00103a28, 0x496fc857, 0x836c0580, 0x00000000, + 0x04000005, 0x4a034406, 0x0000001a, 0x0201f000, + 0x0010230c, 0x0201f800, 0x0010513b, 0x02020800, + 0x00104142, 0x42000800, 0x00000020, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x419c0000, + 0x49a3c857, 0x0201f800, 0x00103a25, 0x4a01d809, + 0x001032da, 0x1c01f000, 0x4833c857, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x599c0200, 0x800001c0, + 0x02000000, 0x00102310, 0x59a80005, 0x8c000512, + 0x04000004, 0x599c0019, 0x8400050c, 0x48033819, + 0x0201f800, 0x001097d7, 0x59a80005, 0x8c000514, + 0x04000004, 0x599c0017, 0x84000508, 0x48033817, + 0x0201f800, 0x00103b25, 0x04020004, 0x8c00050a, + 0x02020000, 0x00102310, 0x4803c857, 0x8c000504, + 0x04020004, 0x59c408a3, 0x84040d7a, 0x480788a3, + 0x8c000502, 0x04020004, 0x59c408a3, 0x84040d08, + 0x480788a3, 0x599c0c02, 0x8c000500, 0x04020004, + 0x8c000516, 0x04000012, 0x0401f001, 0x82041480, + 0x0000007f, 0x02021000, 0x00102310, 0x82041400, + 0x0010210e, 0x50081000, 0x82081500, 0x000000ff, + 0x8c000500, 0x04020006, 0x480b5010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x599c0019, + 0x8c00050e, 0x0402000b, 0x59a80806, 0x8c040d14, + 0x04000008, 0x42000800, 0x0010b4e3, 0x50040800, + 0x82040d00, 0x00000028, 0x02020000, 0x00102310, + 0x82000500, 0x00000030, 0x04000003, 0x80000108, + 0x0401f003, 0x42000000, 0x00000002, 0x48039040, + 0x42000800, 0x00000002, 0x82000400, 0x00103415, + 0x50001000, 0x0201f800, 0x00106c78, 0x599c0201, + 0x82000c80, 0x00000100, 0x02001000, 0x00102310, + 0x82000c80, 0x00000841, 0x02021000, 0x00102310, + 0x82000500, 0x00000007, 0x02020000, 0x00102310, + 0x599c0401, 0x80000540, 0x02000000, 0x00102310, + 0x599c0409, 0x599c0c07, 0x80040c80, 0x02021000, + 0x00102310, 0x80000040, 0x02000000, 0x00102310, + 0x599c0209, 0x599c0a07, 0x80040c80, 0x02021000, + 0x00102310, 0x80000040, 0x02000000, 0x00102310, + 0x0201f800, 0x001053cd, 0x0201f800, 0x00104cb6, + 0x599c0201, 0x48035004, 0x0201f800, 0x001012ee, + 0x599c020a, 0x800001c0, 0x04000003, 0x4803504d, + 0x0401f003, 0x4a03504d, 0x000000c8, 0x0201f800, + 0x00103b25, 0x04000004, 0x0201f800, 0x001060df, + 0x417a5000, 0x836c0580, 0x00000000, 0x04020098, + 0x599c0003, 0x599c0804, 0x9c0001c0, 0x9c0409c0, + 0x48035002, 0x48075003, 0x599c1017, 0x8c08151c, + 0x04000006, 0x599c0005, 0x599c0806, 0x9c0001c0, + 0x9c0409c0, 0x0401f003, 0x82000500, 0xf0ffffff, + 0x48035000, 0x48075001, 0x42001000, 0x0010b4eb, + 0x48001000, 0x48041001, 0x42001000, 0x0010b4f8, + 0x48001000, 0x48041001, 0x59a80005, 0x8c000514, + 0x04020015, 0x599c1019, 0x82081500, 0x0000e000, + 0x82080580, 0x00000000, 0x0402000c, 0x4a035053, + 0x00000000, 0x42000000, 0x00000001, 0x0201f800, + 0x0010188c, 0x42000000, 0x00000001, 0x0201f800, + 0x00101821, 0x0401f02b, 0x82080580, 0x00002000, + 0x0402000a, 0x4a035053, 0x00000001, 0x41780000, + 0x0201f800, 0x0010188c, 0x41780000, 0x0201f800, + 0x00101821, 0x0401f01f, 0x82080580, 0x00004000, + 0x04020006, 0x4a035053, 0x00000002, 0x4a035049, + 0x00000001, 0x0401f017, 0x82080580, 0x00006000, + 0x02020000, 0x00102310, 0x59a80858, 0x82040d80, + 0x01391077, 0x04020005, 0x59e00813, 0x8c040d00, + 0x02020000, 0x00102310, 0x4a035053, 0x00000003, + 0x42000000, 0x00000002, 0x0201f800, 0x0010188c, + 0x42000000, 0x00000002, 0x0201f800, 0x00101821, + 0x599c0019, 0x8c000520, 0x0400000d, 0x42000000, + 0x00000004, 0x42000800, 0x00000040, 0x0201f800, + 0x00101944, 0x42000000, 0x00000010, 0x42000800, + 0x000000c0, 0x0201f800, 0x00101944, 0x4a035032, + 0x0000aaaa, 0x599c1018, 0x82081500, 0x00000030, + 0x59a8006c, 0x80000540, 0x0400000c, 0x82080580, + 0x00000000, 0x02000000, 0x00102310, 0x599c1018, + 0x82081500, 0xffffffcf, 0x82081540, 0x00000010, + 0x480b3818, 0x0401f010, 0x82080d80, 0x00000000, + 0x04000007, 0x82080d80, 0x00000010, 0x0400000a, + 0x82080d80, 0x00000020, 0x04020002, 0x48075032, + 0x0201f800, 0x00103aba, 0x04000008, 0x0201f800, + 0x001015fe, 0x0201f800, 0x0010162a, 0x59a8002a, + 0x80040540, 0x4803502a, 0x49f3c857, 0x42001000, + 0x00105065, 0x0201f800, 0x00105f90, 0x42001000, + 0x00105058, 0x0201f800, 0x00106084, 0x4a038805, + 0xffffffff, 0x4a03c014, 0x00400040, 0x4a03c013, + 0x00400000, 0x0201f800, 0x001048c7, 0x59a0001d, + 0x84000540, 0x4803401d, 0x49f3c857, 0x0201f000, + 0x001022c0, 0x00000018, 0x0000000c, 0x00000018, + 0x00000020, 0x836c0580, 0x00000000, 0x04020005, + 0x42000800, 0x00000007, 0x0201f000, 0x0010230c, + 0x42000800, 0x00000020, 0x59a00407, 0x59a01207, + 0x900811c0, 0x80081540, 0x59a00409, 0x59a01a09, + 0x900c19c0, 0x800c1d40, 0x419c0000, 0x0201f000, + 0x00103a28, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x0201f800, + 0x0010513b, 0x04020005, 0x4a034406, 0x00000016, + 0x0201f000, 0x0010230c, 0x59a80013, 0x8c000500, + 0x04000011, 0x4a034406, 0x00000000, 0x42000800, + 0x00000020, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x42000000, 0x0010be21, 0x0201f000, + 0x00103a28, 0x4a034406, 0x00000001, 0x4200b000, + 0x00000020, 0x4200a800, 0x0010be21, 0x4200a000, + 0xffffffff, 0x4450a800, 0x8054a800, 0x8058b040, + 0x040207fd, 0x4d440000, 0x4d340000, 0x42028800, + 0xffffffff, 0x42002000, 0xffffffff, 0x42003000, + 0x00000001, 0x42003800, 0x00000001, 0x42001800, + 0x0010be21, 0x59a81010, 0x82081500, 0x000000ff, + 0x40180000, 0x0c01f001, 0x0010346e, 0x00103471, + 0x00103475, 0x00103479, 0x82102500, 0xffffff00, + 0x0401f014, 0x82102500, 0xffff00ff, 0x840811c0, + 0x0401f010, 0x82102500, 0xff00ffff, 0x900811c0, + 0x0401f00c, 0x82102500, 0x00ffffff, 0x9c0801c0, + 0x80102540, 0x44101800, 0x42003000, 0xffffffff, + 0x42002000, 0xffffffff, 0x800c1800, 0x0401f003, + 0x40080000, 0x80102540, 0x81468800, 0x83442c80, + 0x0000007f, 0x04021014, 0x4c080000, 0x4c0c0000, + 0x4c180000, 0x4c1c0000, 0x0201f800, 0x00020245, + 0x5c003800, 0x5c003000, 0x5c001800, 0x5c001000, + 0x040207f2, 0x0201f800, 0x001049f3, 0x040207ef, + 0x80183000, 0x801c3800, 0x59341202, 0x40180000, + 0x0c01f7ce, 0x82100580, 0xffffffff, 0x04000002, + 0x44101800, 0x42001800, 0x0010be21, 0x500c0000, + 0x82000500, 0xffffff00, 0x801c0540, 0x44001800, + 0x5c026800, 0x5c028800, 0x42000800, 0x00000020, + 0x59a00407, 0x59a01207, 0x900811c0, 0x80081540, + 0x59a00409, 0x59a01a09, 0x900c19c0, 0x800c1d40, + 0x42000000, 0x0010be21, 0x0201f000, 0x00103a28, + 0x59a28c06, 0x59a0020b, 0x8c000500, 0x0400000e, + 0x59a01208, 0x59a00408, 0x82000500, 0x000000ff, + 0x900001c0, 0x80081540, 0x41784000, 0x0201f800, + 0x00104919, 0x04000008, 0x48034406, 0x0201f000, + 0x00102310, 0x0201f800, 0x00020245, 0x02020000, + 0x00102310, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x59a0020b, 0x8c000500, 0x04000005, 0x0201f800, + 0x001049f3, 0x02020000, 0x00103ac4, 0x59a0020b, + 0x8c000502, 0x04000019, 0x83440480, 0x000007f0, + 0x04021016, 0x0201f800, 0x001049fc, 0x04020013, + 0x497a5a04, 0x4a025c04, 0x00008000, 0x0201f800, + 0x001090e6, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x001034f1, + 0x1c01f000, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x4200b000, 0x0000000a, + 0x4134a000, 0x832e5c00, 0x00000002, 0x412ca800, + 0x0201f800, 0x0010ab17, 0x832cac00, 0x00000006, + 0x4054a000, 0x4200b000, 0x00000004, 0x0201f800, + 0x0010ab28, 0x592c0802, 0x82040500, 0x00ff00ff, + 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, + 0x48025802, 0x592c0801, 0x82040500, 0x00ff00ff, + 0x900001c0, 0x82041500, 0xff00ff00, 0x80080540, + 0x48025801, 0x42000800, 0x0000000a, 0x59a00407, + 0x59a01207, 0x900811c0, 0x80081540, 0x59a00409, + 0x59a01a09, 0x900c19c0, 0x800c1d40, 0x412c0000, + 0x0201f000, 0x00103a28, 0x496fc857, 0x496f4406, + 0x0201f000, 0x001022c0, 0x59a28c06, 0x0201f800, + 0x00020245, 0x02020000, 0x00102310, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x83340c00, 0x00000006, + 0x59a0020b, 0x8c000500, 0x04000003, 0x83340c00, + 0x00000008, 0x58040001, 0x48034409, 0x900001c0, + 0x48034209, 0x50040000, 0x48034407, 0x900001c0, + 0x48034207, 0x59340200, 0x48034406, 0x0201f000, + 0x001022c0, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x59a0220b, + 0x8c102500, 0x0402002e, 0x8c102506, 0x04020006, + 0x59a03208, 0x82180480, 0x00000003, 0x02021000, + 0x00102310, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x0201f800, 0x001049e7, + 0x04000005, 0x4a034406, 0x00000009, 0x0201f000, + 0x0010230c, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x59a0220b, 0x8c102506, 0x04000004, 0x59343002, + 0x82183500, 0x00ffffff, 0x497a5a04, 0x4a025c04, + 0x00008000, 0x0201f800, 0x001090a8, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x4a01d809, 0x001035d1, 0x1c01f000, 0x59a28c06, + 0x0201f800, 0x00020245, 0x02020000, 0x00102310, + 0x0201f800, 0x001049e7, 0x04000005, 0x4a034406, + 0x00000009, 0x0201f000, 0x0010230c, 0x0201f800, + 0x00103a00, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x497a5a04, 0x4a025c04, + 0x00008000, 0x0201f800, 0x00103a00, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x592e5800, 0x0201f800, 0x001090bd, 0x04020005, + 0x4a034406, 0x00000003, 0x0201f000, 0x0010230c, + 0x4a01d809, 0x001035a3, 0x1c01f000, 0x592c2805, + 0x82140d80, 0x01000000, 0x04020005, 0x4a034406, + 0x00000004, 0x0201f000, 0x0010230c, 0x42000800, + 0x00000008, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0201f800, + 0x00103a28, 0x8c142d00, 0x04000003, 0x4a01d809, + 0x001035be, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ee580e, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x812e59c0, 0x02000800, + 0x001005d8, 0x42000800, 0x00000008, 0x832c0400, + 0x00000005, 0x58ec1007, 0x58ec1808, 0x0201f000, + 0x00103a28, 0x592c0005, 0x82000580, 0x01000000, + 0x04020005, 0x4a034406, 0x00000004, 0x0201f000, + 0x0010230c, 0x59a00207, 0x59a01407, 0x900001c0, + 0x80081540, 0x59a00209, 0x59a01c09, 0x900001c0, + 0x800c1d40, 0x42000800, 0x00000006, 0x832c0400, + 0x00000006, 0x0201f000, 0x00103a28, 0x59a00a0a, + 0x800409c0, 0x02000000, 0x00102310, 0x82040480, + 0x000000e7, 0x04001003, 0x42000800, 0x000000e6, + 0x59a00207, 0x59a01407, 0x900001c0, 0x80081540, + 0x59a00209, 0x59a01c09, 0x900001c0, 0x800c1d40, + 0x83880400, 0x00000000, 0x0201f800, 0x00103a28, + 0x4a01d809, 0x001035ff, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ec0002, 0x82000580, 0x00000200, + 0x02000000, 0x00102304, 0x58ef400b, 0x59a0020b, + 0x8c000500, 0x04000008, 0x83880400, 0x00000000, + 0x4803c840, 0x4a03c842, 0x00000006, 0x04011000, + 0x497b8885, 0x4a034207, 0x000000e6, 0x0201f000, + 0x001022c0, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x0401fbe5, + 0x04020005, 0x4a034406, 0x00000002, 0x0201f000, + 0x0010230c, 0x497a5a04, 0x4a025c04, 0x00008000, + 0x59a00406, 0x800001c0, 0x02000000, 0x00102310, + 0x82001580, 0x000000ff, 0x04000005, 0x82001480, + 0x00000004, 0x02021000, 0x00102310, 0x40001000, + 0x0201f800, 0x00101fbf, 0x04020005, 0x4a034406, + 0x00000003, 0x0201f000, 0x0010230c, 0x4a01d809, + 0x0010363a, 0x1c01f000, 0x592c0005, 0x82000580, + 0x01000000, 0x02020000, 0x001022c0, 0x4a034406, + 0x00000004, 0x0201f000, 0x0010230c, 0x59a01406, + 0x8c081508, 0x04020007, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a01c07, 0x820c0480, 0x00001000, 0x02021000, + 0x00102310, 0x497b2804, 0x497b2805, 0x497b281c, + 0x497b281d, 0x497b281f, 0x497b2820, 0x497b2822, + 0x497b2823, 0x80000580, 0x0201f800, 0x001015fe, + 0x59a80805, 0x8c081500, 0x04000004, 0x82040d40, + 0x00000011, 0x0401f004, 0x8c081506, 0x04000002, + 0x84040d42, 0x84040d0a, 0x48075005, 0x4202d800, + 0x00000001, 0x82081500, 0x000000e0, 0x8008010a, + 0x0c020036, 0x0201f800, 0x0010513b, 0x04020009, + 0x4a035033, 0x00000001, 0x0201f800, 0x001050a2, + 0x0401f01f, 0x4a035033, 0x00000000, 0x0401f7fb, + 0x497b5032, 0x0201f800, 0x00104142, 0x0201f800, + 0x00106c55, 0x0201f800, 0x00106ede, 0x0201f800, + 0x00106c4b, 0x59a00a07, 0x480788a7, 0x59c400a3, + 0x82000500, 0xfeffffff, 0x82000540, 0x80018000, + 0x40000800, 0x84040d20, 0x480388a3, 0x480788a3, + 0x497b504e, 0x42000800, 0x0000002d, 0x42001000, + 0x001041bc, 0x0201f800, 0x00105f69, 0x59a00407, + 0x800000c2, 0x800008c4, 0x8005d400, 0x42000000, + 0x0000ffff, 0x0201f800, 0x0010513b, 0x04000003, + 0x59a00207, 0x80000110, 0x0201f800, 0x00103afc, + 0x0201f000, 0x001022c0, 0x0010366d, 0x00103670, + 0x00103678, 0x00102310, 0x00103675, 0x00102310, + 0x00102310, 0x00102310, 0x836c0580, 0x00000003, + 0x04000005, 0x4a034406, 0x00000007, 0x0201f000, + 0x0010230c, 0x59a03c06, 0x59a00407, 0x59a04a07, + 0x902449c0, 0x80244d40, 0x59a00409, 0x59a05209, + 0x902851c0, 0x80285540, 0x0401fb46, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x417a8800, 0x41783000, 0x497b4001, 0x497b4004, + 0x832c4400, 0x00000005, 0x48234002, 0x8c1c3d04, + 0x04020078, 0x0201f800, 0x00020245, 0x0402002a, + 0x0201f800, 0x001049e7, 0x04000004, 0x0201f800, + 0x001048e3, 0x04020024, 0x8c1c3d00, 0x04000008, + 0x59340009, 0x44004000, 0x59340008, 0x80204000, + 0x44004000, 0x80204000, 0x0401f007, 0x59340007, + 0x44004000, 0x59340006, 0x80204000, 0x44004000, + 0x80204000, 0x83440580, 0x000007fe, 0x0400000d, + 0x83440580, 0x000007fc, 0x0400000a, 0x0201f800, + 0x001049f3, 0x04000003, 0x85468d5e, 0x0401f005, + 0x0201f800, 0x00104838, 0x04020002, 0x85468d5e, + 0x45444000, 0x85468d1e, 0x80204000, 0x82183400, + 0x00000003, 0x81468800, 0x83440480, 0x000007f0, + 0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580, + 0x000007f0, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f006, 0x83440580, 0x000007ff, 0x04020007, + 0x42028800, 0x000007fc, 0x82180580, 0x0000000f, + 0x0400000b, 0x0401f7c0, 0x801831c0, 0x04020006, + 0x59a00801, 0x800408c4, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034004, 0x00000001, 0x49474000, + 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, + 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, + 0x4801d803, 0x4825d807, 0x4829d808, 0x4000a800, + 0x4000a000, 0x4018b000, 0x0201f800, 0x0010ab17, + 0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809, + 0x0010372a, 0x1c01f000, 0x4031d800, 0x58ef400b, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x59a00004, 0x80000540, 0x04020008, + 0x59a28800, 0x59a04002, 0x59a03803, 0x41783000, + 0x58ec4807, 0x58ec5008, 0x0401f78f, 0x59a00801, + 0x800408c4, 0x48074406, 0x0201f000, 0x001022c0, + 0x0201f800, 0x00020245, 0x0402002f, 0x0201f800, + 0x001049e7, 0x04000004, 0x0201f800, 0x001048e3, + 0x04020029, 0x83440580, 0x000007fe, 0x04000011, + 0x83440580, 0x000007fc, 0x0400000e, 0x0201f800, + 0x001049f3, 0x04000005, 0x59340403, 0x8400055e, + 0x48026c03, 0x0401f007, 0x0201f800, 0x00104838, + 0x04020004, 0x59340403, 0x8400055e, 0x48026c03, + 0x4134a000, 0x4020a800, 0x4200b000, 0x00000006, + 0x0201f800, 0x0010ab17, 0x59340007, 0x4400a800, + 0x59340006, 0x4800a801, 0x59340009, 0x4800a802, + 0x59340008, 0x4800a803, 0x59340403, 0x8400051e, + 0x48026c03, 0x82204400, 0x0000000a, 0x82183400, + 0x0000000a, 0x81468800, 0x83440480, 0x000007f0, + 0x0400100e, 0x8c1c3d06, 0x04000010, 0x83440580, + 0x000007f0, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f006, 0x83440580, 0x000007ff, 0x04020007, + 0x42028800, 0x000007fc, 0x82180580, 0x0000000a, + 0x0400000b, 0x0401f7bb, 0x801831c0, 0x04020006, + 0x59a00801, 0x800408c4, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034004, 0x00000001, 0x49474000, + 0x59a00001, 0x80180400, 0x48034001, 0x481f4003, + 0x4a01d801, 0x00000000, 0x4819d804, 0x59a00002, + 0x4801d803, 0x4825d807, 0x4829d808, 0x40ec1000, + 0x0201f800, 0x00100858, 0x4a01d809, 0x001037a1, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x59a00004, 0x80000540, 0x04020008, 0x59a28800, + 0x59a04002, 0x59a03803, 0x41783000, 0x58ec4807, + 0x58ec5008, 0x0401f78f, 0x59a00801, 0x800408c4, + 0x48074406, 0x0201f000, 0x001022c0, 0x42002800, + 0x0000007e, 0x59a00c06, 0x59a01207, 0x59a01c07, + 0x59a02209, 0x82040500, 0x0000ff00, 0x840001c0, + 0x82003480, 0x00000020, 0x02001000, 0x00102310, + 0x80140480, 0x02001000, 0x00102310, 0x82040500, + 0x000000ff, 0x82003480, 0x00000020, 0x02001000, + 0x00102310, 0x80140480, 0x02001000, 0x00102310, + 0x82080500, 0x0000ff00, 0x840001c0, 0x82003480, + 0x00000020, 0x02001000, 0x00102310, 0x80140480, + 0x02001000, 0x00102310, 0x82080500, 0x000000ff, + 0x82003480, 0x00000020, 0x02001000, 0x00102310, + 0x80140480, 0x02001000, 0x00102310, 0x820c0500, + 0x0000ff00, 0x840001c0, 0x82003480, 0x00000020, + 0x02001000, 0x00102310, 0x80140480, 0x02001000, + 0x00102310, 0x820c0500, 0x000000ff, 0x82003480, + 0x00000020, 0x02001000, 0x00102310, 0x80140480, + 0x02001000, 0x00102310, 0x82100500, 0x0000ff00, + 0x840001c0, 0x82003480, 0x00000020, 0x02001000, + 0x00102310, 0x80140480, 0x02001000, 0x00102310, + 0x82100500, 0x000000ff, 0x82003480, 0x00000020, + 0x02001000, 0x00102310, 0x80140480, 0x02001000, + 0x00102310, 0x900401c0, 0x80080d40, 0x900c01c0, + 0x80101d40, 0x83a83400, 0x0000003a, 0x44043000, + 0x80183000, 0x440c3000, 0x0201f000, 0x001022c0, + 0x0401f9ec, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x42000800, 0x0000000c, + 0x0401f853, 0x4a01d809, 0x00103820, 0x1c01f000, + 0x4031d800, 0x58ee580d, 0x58ef400b, 0x58ec0002, + 0x82000580, 0x00000200, 0x02000000, 0x00102304, + 0x832ca400, 0x00000004, 0x4200b000, 0x0000000c, + 0x40c8a800, 0x0201f800, 0x0010ab17, 0x58c80200, + 0x80000540, 0x04000034, 0x58c80400, 0x82000500, + 0xfffffffb, 0x04020030, 0x58c80401, 0x80000540, + 0x0400002d, 0x82000480, 0x0000ff01, 0x0402102a, + 0x58c80202, 0x82000480, 0x0000005c, 0x04001026, + 0x0201f800, 0x001063a3, 0x58c80c08, 0x58c80204, + 0x80040480, 0x04001020, 0x58c80204, 0x82000480, + 0x00000005, 0x0402101c, 0x58c80205, 0x58c80c08, + 0x80040902, 0x80040480, 0x04001017, 0x58c80c08, + 0x0201f800, 0x001062f1, 0x0400001b, 0x0201f800, + 0x001061b9, 0x04020012, 0x4979940b, 0x59c408a3, + 0x82040d40, 0x00000002, 0x480788a3, 0x4a038830, + 0x00000001, 0x4a038832, 0x01ffffff, 0x58c80202, + 0x48030804, 0x0201f800, 0x0010619b, 0x0201f000, + 0x001022c0, 0x0201f000, 0x00102310, 0x0201f800, + 0x001063f5, 0x0201f800, 0x00106402, 0x0201f800, + 0x001062e4, 0x0201f000, 0x0010230c, 0x4c000000, + 0x59a01207, 0x59a00407, 0x900811c0, 0x80081540, + 0x59a01a09, 0x59a00409, 0x900c19c0, 0x800c1d40, + 0x5c000000, 0x0401f1ac, 0x59840000, 0x82000580, + 0x00000000, 0x04000054, 0x59840002, 0x8c000504, + 0x04000051, 0x84000546, 0x48030802, 0x0201f800, + 0x001062e4, 0x59c408a3, 0x82040d00, 0xfffffffd, + 0x480788a3, 0x4c5c0000, 0x4200b800, 0x0010ac00, + 0x505e6800, 0x813669c0, 0x04000008, 0x5936600e, + 0x813261c0, 0x04000005, 0x0201f800, 0x001062d5, + 0x02000800, 0x001064ad, 0x805cb800, 0x825c0580, + 0x0010b3f0, 0x040207f3, 0x59866003, 0x813261c0, + 0x0400000b, 0x59300406, 0x82000580, 0x00000009, + 0x02020800, 0x001005d8, 0x5930b800, 0x0201f800, + 0x001062c1, 0x405e6000, 0x0401f7f5, 0x497b0803, + 0x4200b800, 0x0010b51b, 0x505e6000, 0x813261c0, + 0x04000011, 0x59300406, 0x82000580, 0x00000009, + 0x0402000d, 0x59300203, 0x82000580, 0x00000004, + 0x04020009, 0x59326809, 0x813669c0, 0x02020800, + 0x001005d8, 0x0201f800, 0x00100e99, 0x0201f800, + 0x001062c1, 0x4578b800, 0x805cb800, 0x825c0580, + 0x0010b523, 0x040207e9, 0x42000800, 0x0010b519, + 0x49780801, 0x49780800, 0x59a80069, 0x82000400, + 0x00000007, 0x48035069, 0x0201f800, 0x001063f5, + 0x0201f800, 0x00106402, 0x5c00b800, 0x0201f800, + 0x001061b4, 0x0201f000, 0x001022c0, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x59a00407, 0x59a02207, + 0x901021c0, 0x80102540, 0x59a00409, 0x59a02a09, + 0x901429c0, 0x80142d40, 0x0401f91e, 0x04020005, + 0x4a034406, 0x00000002, 0x0201f000, 0x0010230c, + 0x417a8800, 0x41781800, 0x497b4001, 0x497b4003, + 0x832c3400, 0x00000004, 0x481b4002, 0x41440000, + 0x81ac0400, 0x50026800, 0x813669c0, 0x0400000b, + 0x0201f800, 0x001049e7, 0x04020008, 0x59340002, + 0x48003000, 0x49443001, 0x82183400, 0x00000002, + 0x820c1c00, 0x00000002, 0x81468800, 0x83440480, + 0x00000800, 0x04000005, 0x820c0480, 0x00000010, + 0x0402100b, 0x0401f7ea, 0x800c19c0, 0x04020006, + 0x59a00801, 0x80040902, 0x48074406, 0x0201f000, + 0x001022c0, 0x4a034003, 0x00000001, 0x49474000, + 0x59a00001, 0x800c0400, 0x48034001, 0x40ec1000, + 0x4a001001, 0x00000000, 0x480c1004, 0x59a00002, + 0x48001003, 0x48101007, 0x48141008, 0x0201f800, + 0x00100858, 0x4a01d809, 0x00103920, 0x1c01f000, + 0x4031d800, 0x58ef400b, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x59a00003, + 0x80000540, 0x04020008, 0x59a28800, 0x59a03002, + 0x41781800, 0x40ec1000, 0x58082007, 0x58082808, + 0x0401f7bf, 0x59a00801, 0x80040902, 0x48074406, + 0x0201f000, 0x001022c0, 0x800409c0, 0x04000005, + 0x4a034406, 0x00000001, 0x0201f000, 0x0010230c, + 0x59a80026, 0x8c00050a, 0x04020007, 0x8c000506, + 0x04020005, 0x4a034406, 0x00000016, 0x0201f000, + 0x0010230c, 0x0401f8bb, 0x04020005, 0x4a034406, + 0x00000002, 0x0201f000, 0x0010230c, 0x59a00c06, + 0x80040902, 0x59a00407, 0x59a01207, 0x900811c0, + 0x80081540, 0x59a00409, 0x59a01a09, 0x900c19c0, + 0x800c1d40, 0x832c0400, 0x00000005, 0x0401f8ce, + 0x4a01d809, 0x0010395b, 0x1c01f000, 0x4031d800, + 0x58ef400b, 0x58ee580d, 0x58ec0002, 0x82000580, + 0x00000200, 0x02000000, 0x00102304, 0x592c0009, + 0x0201f800, 0x00105c9a, 0x02000800, 0x001045a6, + 0x02020000, 0x00102310, 0x49474001, 0x481a6802, + 0x592c000a, 0x82001d80, 0x70000000, 0x04020007, + 0x0401f890, 0x04020011, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x82001d80, 0x72000000, + 0x02020000, 0x00102310, 0x0401f886, 0x04020885, + 0x04020884, 0x04020005, 0x4a034406, 0x00000002, + 0x0201f000, 0x0010230c, 0x58ee580d, 0x4a025c04, + 0x00008000, 0x497a5a04, 0x592c3208, 0x80183102, + 0x592c1801, 0x4a001805, 0x01000000, 0x0201f800, + 0x001090d1, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x00103995, + 0x1c01f000, 0x592c4000, 0x592c0005, 0x82000580, + 0x01000000, 0x04020005, 0x4a034406, 0x00000004, + 0x0201f000, 0x0010230c, 0x832c3c00, 0x00000005, + 0x401ca000, 0x401ca800, 0x5820280a, 0x4200b000, + 0x00000002, 0x82143580, 0x70000000, 0x04000003, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab28, + 0x401c0000, 0x58201006, 0x58201807, 0x58202205, + 0x80102102, 0x82143580, 0x70000000, 0x04020008, + 0x82103480, 0x00000002, 0x02001000, 0x00102310, + 0x42000800, 0x00000002, 0x0401f06e, 0x82143580, + 0x72000000, 0x02020000, 0x00102310, 0x82103480, + 0x0000002a, 0x02001000, 0x00102310, 0x42000800, + 0x0000000f, 0x0401f863, 0x4a01d809, 0x001039c9, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x592e5800, 0x832c0c00, 0x00000005, + 0x4004a000, 0x4004a800, 0x4200b000, 0x0000000f, + 0x0201f800, 0x0010ab28, 0x40ec1000, 0x4a001001, + 0x00000000, 0x4a001004, 0x0000000f, 0x48041003, + 0x0201f800, 0x00100858, 0x4a01d809, 0x001039e5, + 0x1c01f000, 0x4031d800, 0x58ef400b, 0x58ee580e, + 0x58ec0002, 0x82000580, 0x00000200, 0x02000000, + 0x00102304, 0x832c0c00, 0x00000005, 0x4004a000, + 0x4004a800, 0x4200b000, 0x0000000c, 0x0201f800, + 0x0010ab28, 0x40ec1000, 0x4a001001, 0x00000000, + 0x4a001004, 0x0000000c, 0x48041003, 0x0201f800, + 0x00100858, 0x4a01d809, 0x001022b9, 0x1c01f000, + 0x0201f800, 0x001007e4, 0x04000010, 0x497a5800, + 0x58ec000d, 0x80000540, 0x04020004, 0x492dd80d, + 0x492dd80e, 0x0401f007, 0x58ec000e, 0x48025800, + 0x82000400, 0x00000001, 0x452c0000, 0x492dd80e, + 0x832c0400, 0x00000004, 0x492fc857, 0x4803c857, + 0x1c01f000, 0x4d2c0000, 0x48efc857, 0x58ec400d, + 0x4823c857, 0x802041c0, 0x04000007, 0x40225800, + 0x592c4001, 0x497a5801, 0x0201f800, 0x001007f4, + 0x0401f7f8, 0x4979d80d, 0x4979d80e, 0x5c025800, + 0x1c01f000, 0x42003000, 0x00000001, 0x0401f003, + 0x42003000, 0x00000000, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x481bc857, 0x48efc857, + 0x4819d801, 0x800409c0, 0x02000800, 0x001005d8, + 0x4805d804, 0x4801d803, 0x4809d807, 0x480dd808, + 0x40ec1000, 0x0201f800, 0x00100858, 0x4a01d809, + 0x001022b9, 0x1c01f000, 0x80002d80, 0x480bc857, + 0x480fc857, 0x4813c857, 0x4817c857, 0x4d2c0000, + 0x4da00000, 0x42034000, 0x0010b4a4, 0x59a00017, + 0x800001c0, 0x04020013, 0x04006012, 0x480bc020, + 0x480fc021, 0x4813c022, 0x4817c023, 0x900811c0, + 0x82081540, 0x00000012, 0x480bc011, 0x59e00017, + 0x8c000508, 0x04020004, 0x4203e000, 0x30000001, + 0x0401f053, 0x4a03c017, 0x00000002, 0x0401f7fb, + 0x4c040000, 0x4c1c0000, 0x80000800, 0x48074017, + 0x59a0381a, 0x481fc857, 0x801c39c0, 0x04020027, + 0x82000480, 0x0000000a, 0x04021010, 0x59a00018, + 0x80000000, 0x48034018, 0x59a00219, 0x82000400, + 0x00000002, 0x82000c80, 0x00000013, 0x48034219, + 0x04001003, 0x497b4219, 0x41780000, 0x59a03816, + 0x801c3c00, 0x0401f030, 0x4803c856, 0x0201f800, + 0x001007e4, 0x04000007, 0x492f401a, 0x492f401b, + 0x412c3800, 0x497b421c, 0x497a5813, 0x0401f026, + 0x59880051, 0x80000000, 0x48031051, 0x59a00017, + 0x80000040, 0x48034017, 0x59a00219, 0x59a03816, + 0x801c3c00, 0x0401f01c, 0x59a0021c, 0x82000400, + 0x00000002, 0x82000c80, 0x00000012, 0x04021004, + 0x4803421c, 0x801c3c00, 0x0401f013, 0x0201f800, + 0x001007e4, 0x0402000b, 0x59880051, 0x80000000, + 0x48031051, 0x59a00017, 0x80000040, 0x48034017, + 0x4803c856, 0x59a0021c, 0x801c3c00, 0x0401f006, + 0x492f401a, 0x492c3813, 0x412c3800, 0x497b421c, + 0x497a5813, 0x48083c00, 0x480c3a00, 0x48103c01, + 0x48143a01, 0x5c003800, 0x5c000800, 0x5c034000, + 0x5c025800, 0x1c01f000, 0x480fc857, 0x4813c857, + 0x481bc857, 0x42000000, 0x0010b813, 0x0201f800, + 0x0010aa47, 0x801800d0, 0x40002800, 0x42001000, + 0x00008014, 0x0401f786, 0x4c000000, 0x599c0017, + 0x8c000512, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x599c0018, 0x8c00050e, 0x5c000000, 0x1c01f000, + 0x59a80821, 0x800409c0, 0x04000005, 0x4a034406, + 0x00000001, 0x0201f000, 0x0010230c, 0x836c0580, + 0x00000003, 0x04000005, 0x4a034406, 0x00000007, + 0x0201f000, 0x0010230c, 0x599c0017, 0x8c00050a, + 0x04000005, 0x4a034406, 0x00000008, 0x0201f000, + 0x0010230c, 0x59340405, 0x8c000508, 0x04020004, + 0x8c00050a, 0x02020000, 0x001034db, 0x497a5a04, + 0x497a5805, 0x4a025c04, 0x00008000, 0x0201f800, + 0x00109176, 0x04020005, 0x4a034406, 0x00000003, + 0x0201f000, 0x0010230c, 0x4a01d809, 0x00103aed, + 0x1c01f000, 0x592c0005, 0x82000580, 0x01000000, + 0x04020005, 0x4a034406, 0x00000004, 0x0201f000, + 0x0010230c, 0x59a28c06, 0x0201f800, 0x00020245, + 0x02020000, 0x00102310, 0x0201f000, 0x001034db, + 0x82001580, 0x0000ffff, 0x04000009, 0x0201f800, + 0x00105c9a, 0x02000800, 0x00020245, 0x0402000c, + 0x0201f800, 0x00105fae, 0x0401f009, 0x42028800, + 0x000007ef, 0x0201f800, 0x00020245, 0x02000800, + 0x00105fae, 0x81468840, 0x040217fb, 0x1c01f000, + 0x4803c856, 0x4c0c0000, 0x4d340000, 0x4d440000, + 0x42028800, 0x000007fe, 0x0201f800, 0x00020245, + 0x04020009, 0x5934180a, 0x820c1d00, 0x00000001, + 0x820c1d80, 0x00000001, 0x42001000, 0x0000801b, + 0x0401ff1e, 0x5c028800, 0x5c026800, 0x5c001800, + 0x1c01f000, 0x599c0017, 0x8c000508, 0x1c01f000, + 0x48efc857, 0x04011000, 0x48efc840, 0x4a03c842, + 0x00000011, 0x40000000, 0x040117ff, 0x4a01d80f, + 0xbeefbeef, 0x1c01f000, 0x497b4000, 0x497b4001, + 0x497b4002, 0x497b4003, 0x497b4004, 0x1c01f000, + 0x59c400a4, 0x4c580000, 0x4c500000, 0x4c540000, + 0x82000500, 0x0000000f, 0x82000480, 0x00000007, + 0x0400100a, 0x82006c80, 0x00000006, 0x02021800, + 0x001005d8, 0x0c01f807, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x1c01f000, 0x0401f906, 0x0401f7fb, + 0x00103b51, 0x00103b57, 0x00103b7c, 0x00103b9e, + 0x00103c59, 0x59c40806, 0x8c040d00, 0x04020003, + 0x84040d40, 0x48078806, 0x1c01f000, 0x59c40005, + 0x8c000534, 0x02020000, 0x0010429e, 0x4a038805, + 0xffffffff, 0x42006000, 0x00020000, 0x0201f800, + 0x00104282, 0x59a80015, 0x82000500, 0xfffffffa, + 0x84000542, 0x48035015, 0x497b5026, 0x42000800, + 0x0010be21, 0x45780800, 0x497b5013, 0x42006000, + 0xffefffff, 0x42006800, 0x40000000, 0x0201f800, + 0x0010427d, 0x59c40006, 0x82000500, 0xffffff0f, + 0x48038806, 0x42000800, 0x00000010, 0x42001000, + 0x001041f3, 0x0201f800, 0x00105f83, 0x0401f001, + 0x42006000, 0xffffffff, 0x42006800, 0x00800000, + 0x0201f800, 0x0010427d, 0x4200b000, 0x000000c8, + 0x59c400a4, 0x82000500, 0x0000000f, 0x82000580, + 0x0000000a, 0x0400000f, 0x8058b040, 0x040207f9, + 0x497b5014, 0x42006000, 0xbf7fffff, 0x42006800, + 0x00018000, 0x0201f800, 0x0010427d, 0x42006000, + 0xfffeffff, 0x41786800, 0x0201f000, 0x0010427d, + 0x497b5014, 0x4a035012, 0x00000000, 0x80000580, + 0x0201f000, 0x00104289, 0x4a038805, 0xffffffff, + 0x59a80012, 0x82000c80, 0x00000004, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00103ba9, 0x00103bd6, + 0x00103c4f, 0x4803c856, 0x59c400a3, 0x8400051e, + 0x480388a3, 0x4a035012, 0x00000001, 0x59c40008, + 0x8400054e, 0x48038808, 0x0201f800, 0x00104263, + 0x42007800, 0x0010b54c, 0x4a007806, 0x11010000, + 0x4200a000, 0x0010b402, 0x4200a800, 0x0010b553, + 0x4200b000, 0x00000002, 0x0201f800, 0x0010ab17, + 0x497b8802, 0x42000800, 0x00000003, 0x497b504a, + 0x0201f800, 0x0010416e, 0x4a03504a, 0x00000001, + 0x497b5016, 0x0201f800, 0x00104290, 0x42006000, + 0xffffffff, 0x42006800, 0x00080000, 0x0201f800, + 0x0010427d, 0x42006000, 0xfff7ffff, 0x41786800, + 0x0201f000, 0x0010427d, 0x59a80016, 0x497b5016, + 0x80002540, 0x04000066, 0x59c40004, 0x82000500, + 0x00000003, 0x04020071, 0x59a80815, 0x8c040d02, + 0x0400004b, 0x82100580, 0x0000000c, 0x0402004f, + 0x82100400, 0x00000018, 0x8000b104, 0x41cc1000, + 0x42001800, 0x0010b54c, 0x50080800, 0x500c0000, + 0x80040580, 0x0402001a, 0x80081000, 0x800c1800, + 0x8058b040, 0x040207f9, 0x0201f800, 0x00104290, + 0x42006000, 0xffffffff, 0x42006800, 0x00500000, + 0x0201f800, 0x0010427d, 0x4a035012, 0x00000002, + 0x4a035014, 0x00000002, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f800, 0x0010606e, + 0x0201f800, 0x00104263, 0x0401f048, 0x59cc0806, + 0x82040d80, 0x11010000, 0x04020028, 0x59cc0800, + 0x82040500, 0x00ffffff, 0x0400001a, 0x82000580, + 0x000000ef, 0x04020017, 0x59cc0801, 0x82040500, + 0x00ffffff, 0x82000580, 0x000000ef, 0x04020011, + 0x83cca400, 0x00000007, 0x4200a800, 0x0010b402, + 0x4200b000, 0x00000002, 0x50500800, 0x50540000, + 0x80040480, 0x04001007, 0x04020010, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207f8, 0x0401f00b, + 0x59a80015, 0x84000502, 0x48035015, 0x41cca000, + 0x4200a800, 0x0010b54c, 0x4200b000, 0x00000009, + 0x0201f800, 0x0010ab17, 0x0201f800, 0x00104290, + 0x42006000, 0xffffffff, 0x42006800, 0x00080000, + 0x0201f800, 0x0010427d, 0x42006000, 0xfff7ffff, + 0x41786800, 0x0201f800, 0x0010427d, 0x42006000, + 0xffffffff, 0x42006800, 0x00004000, 0x0201f800, + 0x0010427d, 0x59c40004, 0x82000500, 0x00000003, + 0x04020006, 0x497b5016, 0x42000800, 0x00000003, + 0x0201f000, 0x0010416e, 0x1c01f000, 0x1c01f000, + 0x59a80014, 0x82006d80, 0x0000000f, 0x04000005, + 0x82000580, 0x0000001b, 0x02020800, 0x00104139, + 0x1c01f000, 0x59a80015, 0x84000506, 0x48035015, + 0x497b504a, 0x59a80014, 0x82000c80, 0x0000001e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00103c97, + 0x00103cac, 0x00103cd5, 0x00103cf0, 0x00103d14, + 0x00103d45, 0x00103d68, 0x00103d9b, 0x00103dbe, + 0x00103de4, 0x00103e21, 0x00103e48, 0x00103e5f, + 0x00103e71, 0x00103e8a, 0x00103ea0, 0x00103ea5, + 0x00103ecd, 0x00103ef0, 0x00103f16, 0x00103f39, + 0x00103f6c, 0x00103fae, 0x00103fd8, 0x00103ff0, + 0x00104030, 0x00104049, 0x0010405c, 0x0010405d, + 0x4803c856, 0x4202d800, 0x00000007, 0x0201f800, + 0x0010513b, 0x04000007, 0x42006000, 0xffffffd7, + 0x41786800, 0x0201f800, 0x0010427d, 0x0401f00b, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x42001000, 0x000000f0, 0x0201f800, 0x0010193d, + 0x0201f800, 0x00105098, 0x1c01f000, 0x4803c856, + 0x42006000, 0xbf7fffff, 0x42006800, 0x00400000, + 0x0201f800, 0x0010427d, 0x4a035014, 0x00000001, + 0x42001000, 0x001041f3, 0x0201f800, 0x00105fa4, + 0x0201f800, 0x001041f8, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f000, 0x0010606e, + 0x59a80016, 0x82000580, 0x00000014, 0x04020025, + 0x4803c857, 0x42006000, 0xffbfffff, 0x41786800, + 0x0201f800, 0x0010427d, 0x59c40004, 0x82000500, + 0x00000003, 0x0402001b, 0x59cc1006, 0x82081580, + 0x11020000, 0x04020016, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47, + 0x59a80015, 0x84000544, 0x48035015, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x4a035014, + 0x00000010, 0x0401f9d4, 0x0401f002, 0x497b5016, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000003, + 0x42006000, 0xbf3fffff, 0x42006800, 0x00100000, + 0x0201f800, 0x0010427d, 0x42001000, 0x001041f3, + 0x0201f800, 0x00105fa4, 0x0201f800, 0x001041f8, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x42007800, 0x0010b552, 0x46007800, 0x11020000, + 0x42000800, 0x00000005, 0x0201f000, 0x0010416e, + 0x59a80016, 0x80000540, 0x04000021, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020016, + 0x59cc1006, 0x82081580, 0x11020000, 0x04020012, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010b83f, + 0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544, + 0x48035015, 0x4a035014, 0x00000004, 0x0401f805, + 0x0401f003, 0x0201f800, 0x00104139, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000005, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x42007800, + 0x0010b552, 0x46007800, 0x11030000, 0x0201f800, + 0x0010413e, 0x04020014, 0x59a80015, 0x8c000500, + 0x04020011, 0x59a80810, 0x82040580, 0x00ffffff, + 0x0400000d, 0x82040d00, 0x000000ff, 0x82040400, + 0x0010210e, 0x50000800, 0x80040910, 0x42001000, + 0x00000004, 0x0401fb9b, 0x0400000b, 0x0201f800, + 0x0010420d, 0x4200b000, 0x00000004, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010b553, 0x0201f800, + 0x0010ab17, 0x42000800, 0x00000005, 0x0201f000, + 0x0010416e, 0x59a80016, 0x80000540, 0x04000020, + 0x4803c857, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035014, 0x00000006, + 0x0401f804, 0x0401f002, 0x0401fbd3, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000007, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x42007800, + 0x0010b552, 0x46007800, 0x11040000, 0x0401fbc7, + 0x04020020, 0x59a80015, 0x8c000500, 0x0402001d, + 0x599c0017, 0x8c000500, 0x0400001a, 0x599c1402, + 0x82080480, 0x0000007f, 0x02021800, 0x001005d8, + 0x4c080000, 0x82081400, 0x0010210e, 0x50081000, + 0x82081500, 0x000000ff, 0x480b5010, 0x42000800, + 0x00000003, 0x0201f800, 0x00106c78, 0x5c000800, + 0x42001000, 0x00000004, 0x0401fb3e, 0x04000005, + 0x0401fd2b, 0x04000003, 0x0201f800, 0x001015fe, + 0x42000800, 0x00000005, 0x0401f3d4, 0x59a80016, + 0x80000540, 0x04000020, 0x4803c857, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x59a80016, + 0x82000580, 0x00000014, 0x04020016, 0x59cc1006, + 0x82081580, 0x11040000, 0x04020012, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010b83f, 0x0201f800, + 0x0010aa47, 0x59a80015, 0x84000544, 0x48035015, + 0x4a035014, 0x00000008, 0x0401f804, 0x0401f002, + 0x0401fb7d, 0x1c01f000, 0x4803c856, 0x4a035014, + 0x00000009, 0x83cca400, 0x00000006, 0x4200a800, + 0x0010b552, 0x4200b000, 0x00000005, 0x0201f800, + 0x0010ab17, 0x42007800, 0x0010b552, 0x46007800, + 0x11050100, 0x0401fb71, 0x0402000a, 0x59a80015, + 0x8c000500, 0x04020007, 0x0401fa8c, 0x04020005, + 0x82000540, 0x00000001, 0x0201f800, 0x001015fe, + 0x42000800, 0x00000005, 0x0401fb94, 0x0401fb63, + 0x04020ea4, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000, + 0x59a80016, 0x80000540, 0x0400003a, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020030, + 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, + 0x11050000, 0x0402002a, 0x8c081510, 0x04000014, + 0x59cc1007, 0x8c08153e, 0x0400000b, 0x59a80015, + 0x8c000504, 0x04020008, 0x42000000, 0x0010b83f, + 0x0201f800, 0x0010aa47, 0x59a80015, 0x84000544, + 0x48035015, 0x4a035013, 0x00000001, 0x4a035014, + 0x0000000a, 0x0401f818, 0x0401f016, 0x80000540, + 0x04020013, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x497b5013, 0x4a035014, + 0x0000000e, 0x0401f86d, 0x0401f002, 0x0401fb1a, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x0000000b, + 0x42001000, 0x0010b553, 0x4008a800, 0x4200b000, + 0x00000020, 0x4600a800, 0xffffffff, 0x8054a800, + 0x8058b040, 0x040207fc, 0x42007800, 0x0010b552, + 0x46007800, 0x11060000, 0x42001000, 0x0010b553, + 0x0401fb0a, 0x04000005, 0x50080000, 0x46001000, + 0x00ffffff, 0x0401f00c, 0x50080800, 0x82040d00, + 0x0000ffff, 0x59a80010, 0x82000500, 0x000000ff, + 0x82000540, 0x00000100, 0x800000e0, 0x80040d40, + 0x44041000, 0x42000800, 0x00000021, 0x0401f327, + 0x59a80016, 0x80000540, 0x04000014, 0x4803c857, + 0x59a80016, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000084, + 0x04020009, 0x59cc1006, 0x82081580, 0x11060000, + 0x04020005, 0x4a035014, 0x0000000c, 0x0401f804, + 0x0401f002, 0x0401fadc, 0x1c01f000, 0x4803c856, + 0x4a035014, 0x0000000d, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b552, 0x4200b000, 0x00000021, + 0x0201f800, 0x0010ab17, 0x42007800, 0x0010b552, + 0x46007800, 0x11070000, 0x42000800, 0x00000021, + 0x0401f2fe, 0x59a80016, 0x80000540, 0x04000016, + 0x4803c857, 0x59a80016, 0x42001000, 0x00104148, + 0x0201f800, 0x00105f90, 0x82000580, 0x00000084, + 0x0402000c, 0x59cc1006, 0x82081580, 0x11070000, + 0x04020008, 0x4a035013, 0x00000001, 0x0401fa91, + 0x4a035014, 0x0000000e, 0x0401f804, 0x0401f002, + 0x0401fab1, 0x1c01f000, 0x4803c856, 0x82040d40, + 0x00000001, 0x0401fbfc, 0x4a035014, 0x0000000f, + 0x497b5016, 0x42006000, 0xffffffff, 0x42006800, + 0x00300000, 0x0401fbe8, 0x42006000, 0xffdfffff, + 0x41786800, 0x0401fbe4, 0x42000800, 0x000007d0, + 0x42001000, 0x00104148, 0x0201f000, 0x00105f69, + 0x4803c856, 0x59a80016, 0x80000540, 0x04020296, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000011, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b552, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17, + 0x4200a800, 0x0010b552, 0x4600a800, 0x11020000, + 0x0401fa8a, 0x04020015, 0x59a80010, 0x82000d00, + 0xffff0000, 0x04000011, 0x82000500, 0x000000ff, + 0x0400000e, 0x82000c00, 0x0010210e, 0x50040800, + 0x80040910, 0x82040580, 0x0000007e, 0x04000007, + 0x82040580, 0x00000080, 0x04000004, 0x42001000, + 0x00000004, 0x0401fa07, 0x42000800, 0x00000005, + 0x0401f2a2, 0x59a80016, 0x80000540, 0x04000020, + 0x4803c857, 0x42001000, 0x00104148, 0x0201f800, + 0x00105f90, 0x59a80016, 0x82000580, 0x00000014, + 0x04020016, 0x59cc1006, 0x82081580, 0x11030000, + 0x04020012, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x4a035014, 0x00000012, + 0x0401f804, 0x0401f002, 0x0401fa4b, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000013, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x4200a800, + 0x0010b552, 0x4600a800, 0x11030000, 0x0401fa3f, + 0x04020013, 0x59a80015, 0x8c000500, 0x04020010, + 0x59a80810, 0x82040580, 0x00ffffff, 0x0400000c, + 0x82040d00, 0x000000ff, 0x82040400, 0x0010210e, + 0x50000800, 0x80040910, 0x42001000, 0x00000004, + 0x0401f9c0, 0x04000002, 0x0401fafb, 0x42000800, + 0x00000005, 0x0401f259, 0x59a80016, 0x80000540, + 0x04000020, 0x4803c857, 0x42001000, 0x00104148, + 0x0201f800, 0x00105f90, 0x59a80016, 0x82000580, + 0x00000014, 0x04020016, 0x59cc1006, 0x82081580, + 0x11040000, 0x04020012, 0x59cc1007, 0x8c08153e, + 0x0400000b, 0x59a80015, 0x8c000504, 0x04020008, + 0x42000000, 0x0010b83f, 0x0201f800, 0x0010aa47, + 0x59a80015, 0x84000544, 0x48035015, 0x4a035014, + 0x00000014, 0x0401f804, 0x0401f002, 0x0401fa02, + 0x1c01f000, 0x4803c856, 0x4a035014, 0x00000015, + 0x83cca400, 0x00000006, 0x4200a800, 0x0010b552, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010ab17, + 0x4200a800, 0x0010b552, 0x4600a800, 0x11040000, + 0x0401f9f6, 0x04020020, 0x59a80015, 0x8c000500, + 0x0402001d, 0x599c0017, 0x8c000500, 0x0400001a, + 0x599c1402, 0x82080480, 0x0000007f, 0x02021800, + 0x001005d8, 0x4c080000, 0x82081400, 0x0010210e, + 0x50081000, 0x82081500, 0x000000ff, 0x480b5010, + 0x42000800, 0x00000003, 0x0201f800, 0x00106c78, + 0x5c000800, 0x42001000, 0x00000004, 0x0401f96d, + 0x04000005, 0x0201f800, 0x00103abf, 0x02020800, + 0x001015fe, 0x42000800, 0x00000005, 0x0401f203, + 0x59a80016, 0x80000540, 0x0400003f, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000014, 0x04020035, + 0x59cc1006, 0x82080500, 0x11050000, 0x82000580, + 0x11050000, 0x0402002f, 0x8c081510, 0x04000010, + 0x0401fb09, 0x59cc1007, 0x8c08153e, 0x0400000b, + 0x59a80015, 0x8c000504, 0x04020008, 0x42000000, + 0x0010b83f, 0x0201f800, 0x0010aa47, 0x59a80015, + 0x84000544, 0x48035015, 0x0401f013, 0x59cc1007, + 0x8c08153e, 0x0400000b, 0x59a80015, 0x8c000504, + 0x04020008, 0x42000000, 0x0010b83f, 0x0201f800, + 0x0010aa47, 0x59a80015, 0x84000544, 0x48035015, + 0x82000540, 0x00000001, 0x0401faeb, 0x497b5013, + 0x0401f003, 0x4a035013, 0x00000001, 0x59cc1007, + 0x8c08153c, 0x04000003, 0x4a035026, 0x00000008, + 0x4a035014, 0x00000016, 0x0401f804, 0x0401f002, + 0x0401f98d, 0x1c01f000, 0x4803c856, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000005, 0x0201f800, 0x0010ab17, 0x4a035014, + 0x00000017, 0x59a80013, 0x8c000500, 0x04000006, + 0x42001000, 0x0010b552, 0x46001000, 0x11050100, + 0x0401f003, 0x4a035014, 0x0000001b, 0x0401f97b, + 0x0402000a, 0x59a80015, 0x8c000500, 0x04020007, + 0x0401f896, 0x04020005, 0x82000540, 0x00000001, + 0x0201f800, 0x001015fe, 0x42000800, 0x00000005, + 0x0401f99e, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x1c01f000, + 0x59a80016, 0x80000540, 0x04000015, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000084, 0x0402000b, + 0x59cc1006, 0x82081580, 0x11060000, 0x04020007, + 0x80000580, 0x0401faa0, 0x4a035014, 0x00000018, + 0x0401f804, 0x0401f002, 0x0401f94b, 0x1c01f000, + 0x4803c856, 0x4a035014, 0x00000019, 0x83cca400, + 0x00000006, 0x4200a800, 0x0010b552, 0x4200b000, + 0x00000021, 0x0201f800, 0x0010ab17, 0x42003800, + 0x0010b553, 0x0401f941, 0x04020018, 0x401c2800, + 0x50141000, 0x80080130, 0x80000000, 0x40001800, + 0x82081500, 0x00ffffff, 0x800000f0, 0x80080540, + 0x44002800, 0x59a80810, 0x82040d00, 0x000000ff, + 0x400c1000, 0x80081104, 0x82082400, 0x0010b553, + 0x50101000, 0x820c0500, 0x00000003, 0x0c01f806, + 0x80081540, 0x44082000, 0x42000800, 0x00000021, + 0x0401f156, 0x0010401d, 0x00104022, 0x00104027, + 0x0010402c, 0x800408f0, 0x40040000, 0x82081500, + 0x00ffffff, 0x1c01f000, 0x800408e0, 0x40040000, + 0x82081500, 0xff00ffff, 0x1c01f000, 0x800408d0, + 0x40040000, 0x82081500, 0xffff00ff, 0x1c01f000, + 0x40040000, 0x82081500, 0xffffff00, 0x1c01f000, + 0x59a80016, 0x80000540, 0x04000016, 0x4803c857, + 0x42001000, 0x00104148, 0x0201f800, 0x00105f90, + 0x59a80016, 0x82000580, 0x00000084, 0x0402000c, + 0x59cc1006, 0x82081580, 0x11070000, 0x04020008, + 0x4a035013, 0x00000001, 0x0401f8d2, 0x4a035014, + 0x0000001a, 0x0401f804, 0x0401f002, 0x0401f8f2, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401fa3e, + 0x4a035014, 0x0000001b, 0x83cca400, 0x00000006, + 0x4200a800, 0x0010b552, 0x59a82016, 0x40100000, + 0x8000b104, 0x40580800, 0x5450a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207fc, 0x0401f113, + 0x1c01f000, 0x1c01f000, 0x4803c856, 0x42003000, + 0x00000004, 0x42004000, 0x0010b553, 0x599c2817, + 0x8c142d14, 0x0402001f, 0x42001000, 0x00000003, + 0x40200000, 0x80080400, 0x50000800, 0x82042580, + 0xffffffff, 0x04020005, 0x80081040, 0x80183040, + 0x040207f8, 0x0401f05e, 0x800811c0, 0x04020006, + 0x82042580, 0x3fffffff, 0x04000058, 0x82040d40, + 0xc0000000, 0x4200b000, 0x00000020, 0x42001800, + 0x00000001, 0x40042000, 0x80102102, 0x04021021, + 0x800c18c2, 0x8058b040, 0x040207fc, 0x0401f04b, + 0x41781000, 0x40200000, 0x80080400, 0x50000800, + 0x82042580, 0xffffffff, 0x04020005, 0x80081000, + 0x80183040, 0x040207f8, 0x0401f040, 0x800811c0, + 0x04020003, 0x82040d40, 0xc0000000, 0x4200b000, + 0x00000001, 0x42001800, 0x80000000, 0x40042000, + 0x801020c2, 0x04021007, 0x800c1902, 0x8058b000, + 0x82580480, 0x00000021, 0x040017fa, 0x0401f02f, + 0x40200000, 0x80082400, 0x50100000, 0x800c0540, + 0x44002000, 0x59a80015, 0x84000540, 0x48035015, + 0x40580000, 0x42002800, 0x00000020, 0x80142c80, + 0x40080000, 0x42003800, 0x00000003, 0x801c0480, + 0x800000ca, 0x80142d40, 0x82144c00, 0x0010210e, + 0x50242800, 0x82142d00, 0x000000ff, 0x48175010, + 0x4c040000, 0x40140800, 0x0201f800, 0x001015eb, + 0x5c000800, 0x40001800, 0x500c0000, 0x80100540, + 0x44001800, 0x59a80015, 0x84000540, 0x48035015, + 0x4200a800, 0x0010b553, 0x4020a000, 0x4200b000, + 0x00000004, 0x0201f800, 0x0010ab17, 0x82000540, + 0x00000001, 0x0401f002, 0x80000580, 0x1c01f000, + 0x4807c857, 0x480bc857, 0x4008b000, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010b553, 0x40541000, + 0x0201f800, 0x0010ab17, 0x40041800, 0x41782000, + 0x42000000, 0x00000003, 0x820c1c80, 0x00000020, + 0x04001004, 0x80102000, 0x80000040, 0x0401f7fb, + 0x40041800, 0x801021c0, 0x04000005, 0x820c1c80, + 0x00000020, 0x80102040, 0x040207fd, 0x42002000, + 0x00000001, 0x800c19c0, 0x04000004, 0x801020c2, + 0x800c1840, 0x040207fe, 0x80083c00, 0x83cc2c00, + 0x00000007, 0x80142c00, 0x50140000, 0x80102d00, + 0x04020012, 0x80100540, 0x44003800, 0x82042400, + 0x0010210e, 0x50102800, 0x82142d00, 0x000000ff, + 0x48175010, 0x4c040000, 0x40140800, 0x0201f800, + 0x001015eb, 0x5c000800, 0x59a80015, 0x84000540, + 0x48035015, 0x80000580, 0x1c01f000, 0x4807c856, + 0x42001000, 0x00008017, 0x59a8184e, 0x0201f800, + 0x0010aa4f, 0x0201f800, 0x00103a3e, 0x1c01f000, + 0x4807c856, 0x4200b000, 0x00000020, 0x83cca400, + 0x00000007, 0x4200a800, 0x0010be21, 0x0201f000, + 0x0010ab28, 0x4807c856, 0x0201f800, 0x00106ede, + 0x42000800, 0x000000f7, 0x0401f8de, 0x497b2804, + 0x497b2805, 0x497b281c, 0x497b281d, 0x4202d800, + 0x00000001, 0x42006000, 0xbf7fffff, 0x42006800, + 0x00018000, 0x0401f950, 0x42006000, 0xfffeffff, + 0x41786800, 0x0401f94c, 0x497b504e, 0x42000800, + 0x0000002d, 0x42001000, 0x001041bc, 0x0201f000, + 0x00105f69, 0x4807c856, 0x0401ffe3, 0x497b5014, + 0x497b5016, 0x1c01f000, 0x4807c856, 0x59a80005, + 0x8c000506, 0x1c01f000, 0x4807c856, 0x42006000, + 0xffffffff, 0x42006800, 0x00000028, 0x0401f136, + 0x4807c856, 0x0401ffc2, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0401f921, 0x42006000, 0xffdfffff, 0x41786800, + 0x0401f91d, 0x497b5014, 0x42000800, 0x000000f7, + 0x0401f89c, 0x59c400a3, 0x82000500, 0xbf20bfff, + 0x82000540, 0x0001c000, 0x480388a3, 0x84000520, + 0x480388a3, 0x1c01f000, 0x497b5016, 0x59b400f5, + 0x8c000500, 0x04020004, 0x82000540, 0x00000001, + 0x480368f5, 0x800400c4, 0x82000400, 0x00002000, + 0x4803910a, 0x59b400f6, 0x82000500, 0x00000018, + 0x040207fd, 0x4a0368f0, 0x0010b54b, 0x42000000, + 0x0010b552, 0x480368f1, 0x82040400, 0x0000dc00, + 0x480368f3, 0x59c400a4, 0x82000500, 0x0000000f, + 0x82000580, 0x00000008, 0x04020017, 0x4c5c0000, + 0x4c600000, 0x59c4b805, 0x8c5cbd3a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x001019fe, + 0x4000c000, 0x0201f800, 0x00101963, 0x4202d800, + 0x00000001, 0x497b5014, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x59c8010b, 0x8c000502, 0x040007e2, + 0x59c408a4, 0x82040d00, 0x0000000f, 0x82040d80, + 0x0000000b, 0x04020005, 0x59a80814, 0x82040d40, + 0x00002000, 0x0401f004, 0x59a80812, 0x82040d40, + 0x00001000, 0x4807504e, 0x59a8084a, 0x800409c0, + 0x04020007, 0x42000800, 0x000007d0, 0x42001000, + 0x00104148, 0x0201f800, 0x0010606e, 0x1c01f000, + 0x4807c856, 0x0401ff4e, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000580, 0x00000002, 0x0402000a, + 0x42006000, 0xffffffff, 0x42006800, 0x00200000, + 0x0401f8ad, 0x42006000, 0xffdfffff, 0x41786800, + 0x0401f8a9, 0x0201f800, 0x00105141, 0x04000014, + 0x0201f800, 0x00105151, 0x04020011, 0x4a035032, + 0x0000aaaa, 0x4c040000, 0x0201f800, 0x0010162a, + 0x59a8002a, 0x82000500, 0xffff0000, 0x80040540, + 0x4803502a, 0x5c000800, 0x4a035033, 0x00000000, + 0x0201f800, 0x001050a2, 0x0401f008, 0x4a03504c, + 0x00000005, 0x42000000, 0x00000001, 0x0201f800, + 0x00101590, 0x0401ff2c, 0x1c01f000, 0x0401f805, + 0x42006000, 0xbf7f7fff, 0x41786800, 0x0401f086, + 0x0201f800, 0x00105151, 0x04020005, 0x59c40006, + 0x82000540, 0x000000f0, 0x48038806, 0x1c01f000, + 0x800408d0, 0x59a80015, 0x8c000506, 0x04000006, + 0x59a80010, 0x82000500, 0x000000ff, 0x80040540, + 0x0401f003, 0x82040540, 0x000000f7, 0x480388a7, + 0x1c01f000, 0x4807c856, 0x42000000, 0x0010b83b, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000005, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000d, + 0x42027800, 0x00000002, 0x0401f038, 0x4807c856, + 0x42000000, 0x0010b86b, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000000, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x0000000f, 0x42027800, 0x00000002, + 0x0401f02a, 0x4807c856, 0x42000000, 0x0010b86a, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000003, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000e, + 0x42027800, 0x00000202, 0x0401f01c, 0x4807c856, + 0x42000000, 0x0010b869, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000004, 0x4d3c0000, 0x4c180000, + 0x42003000, 0x00000010, 0x42027800, 0x00000202, + 0x0401f00e, 0x4807c856, 0x42000000, 0x0010b83e, + 0x0201f800, 0x0010aa47, 0x42003000, 0x00000001, + 0x4d3c0000, 0x4c180000, 0x42003000, 0x0000000c, + 0x42027800, 0x00000202, 0x42001800, 0x0000ffff, + 0x42002000, 0x00000007, 0x0201f800, 0x00103aae, + 0x5c003000, 0x4d400000, 0x0201f800, 0x0010a95d, + 0x42028000, 0x0000002a, 0x0201f800, 0x00101fe5, + 0x5c028000, 0x5c027800, 0x1c01f000, 0x4807c856, + 0x04011000, 0x4a03c840, 0x0010b54b, 0x4a03c842, + 0x00000040, 0x40000000, 0x040117ff, 0x42007800, + 0x0010b54b, 0x46007800, 0x00000011, 0x803c7800, + 0x4a007800, 0x220000ef, 0x4a007801, 0x000000ef, + 0x4a007802, 0x01380000, 0x4a007803, 0x00000000, + 0x4a007804, 0xffffffff, 0x4a007805, 0x00000000, + 0x1c01f000, 0x59c400a3, 0x80300500, 0x80340540, + 0x480388a3, 0x1c01f000, 0x4833c857, 0x59c400a3, + 0x80300540, 0x480388a3, 0x80300580, 0x480388a3, + 0x1c01f000, 0x4803c856, 0x04000004, 0x4a03504b, + 0x00000001, 0x0401f002, 0x497b504b, 0x1c01f000, + 0x4803c856, 0x59c80002, 0x80000540, 0x0400000a, + 0x80000040, 0x04000008, 0x4a039005, 0x00000140, + 0x42000000, 0x00000006, 0x80000040, 0x040207ff, + 0x0401f7f4, 0x1c01f000, 0x4c5c0000, 0x4c600000, + 0x59c4b805, 0x485fc856, 0x8c5cbd3a, 0x04020005, + 0x42000000, 0x0010b818, 0x0201f800, 0x0010aa47, + 0x4a038805, 0x02000000, 0x0201f800, 0x001019fe, + 0x4000c000, 0x0201f800, 0x00101963, 0x4a038805, + 0x04000000, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x497a6a00, 0x4937c857, 0x4a026c00, 0x00000707, + 0x497a6801, 0x497a6808, 0x497a6809, 0x497a6806, + 0x497a6807, 0x497a6c0b, 0x497a680c, 0x0201f800, + 0x00103b25, 0x04020006, 0x5934080f, 0x59340010, + 0x80040540, 0x02020800, 0x001005d8, 0x4a026a04, + 0x00000100, 0x497a6a03, 0x59340402, 0x82000500, + 0x000000ff, 0x48026c02, 0x497a6c04, 0x497a6a05, + 0x497a6c05, 0x497a6811, 0x4d2c0000, 0x5934000d, + 0x49466c03, 0x80025d40, 0x04000004, 0x0201f800, + 0x001007fd, 0x497a680d, 0x5c025800, 0x599c0401, + 0x48026a0b, 0x599c0208, 0x48026c12, 0x497a680a, + 0x0201f000, 0x00104c62, 0x42000000, 0x00000005, + 0x80000d80, 0x0401f02d, 0x0201f800, 0x00104a09, + 0x04020017, 0x59a80026, 0x8c00050a, 0x04020010, + 0x59340212, 0x82000500, 0x0000ff00, 0x4803c857, + 0x0400000b, 0x59340a00, 0x8c040d1e, 0x02000000, + 0x000201c4, 0x42000000, 0x00000029, 0x42000800, + 0x00001000, 0x492fc857, 0x0401f018, 0x492fc857, + 0x42000000, 0x00000028, 0x0401f012, 0x59a80805, + 0x8c040d02, 0x04020003, 0x8c040d00, 0x04000004, + 0x42000000, 0x00000004, 0x0401f00a, 0x42000000, + 0x00000029, 0x59340a00, 0x8c040d1e, 0x04000005, + 0x492fc857, 0x42000800, 0x00001000, 0x0401f003, + 0x492fc857, 0x80000d80, 0x4803c857, 0x80028540, + 0x1c01f000, 0x4803c857, 0x59a80005, 0x8c000500, + 0x040207ec, 0x0201f800, 0x001049e7, 0x040207e4, + 0x59340200, 0x8c00050e, 0x040007e1, 0x0201f000, + 0x000201c4, 0x0201f800, 0x001047eb, 0x040007bf, + 0x0201f000, 0x000201c8, 0x592c0206, 0x492fc857, + 0x82000d80, 0x000007ff, 0x04020006, 0x4a025c0a, + 0x00000030, 0x42026800, 0x0010b524, 0x0401f021, + 0x82000c80, 0x000007f0, 0x04021046, 0x81ac0400, + 0x50000000, 0x80026d40, 0x04000038, 0x0201f800, + 0x001048e3, 0x04020038, 0x592c040a, 0x8c00050a, + 0x04020014, 0x592e6009, 0x83300480, 0x0010d1c0, + 0x0400103b, 0x41580000, 0x81300480, 0x04021038, + 0x59300c06, 0x82040580, 0x00000009, 0x04020037, + 0x4a025a06, 0x00000000, 0x497a5800, 0x59300008, + 0x80000540, 0x04020018, 0x492e6008, 0x0401f010, + 0x0201f800, 0x0002075a, 0x04000019, 0x592c0206, + 0x49366009, 0x492e6008, 0x4a026406, 0x00000009, + 0x497a6015, 0x49325809, 0x82000d80, 0x000007ff, + 0x04020003, 0x4a026015, 0x00008000, 0x42027000, + 0x00000043, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f020, 0x40000800, 0x58040000, 0x80000d40, + 0x040207fd, 0x492c0800, 0x0401f01a, 0x42000000, + 0x0000002c, 0x0401f016, 0x42000000, 0x00000028, + 0x0401f013, 0x59a80805, 0x82040500, 0x00000003, + 0x04000004, 0x42000000, 0x00000004, 0x0401f00c, + 0x42000000, 0x00000029, 0x0401f009, 0x42000000, + 0x00000008, 0x0401f006, 0x82040580, 0x00000007, + 0x040207fb, 0x42000000, 0x00000005, 0x80000540, + 0x1c01f000, 0x492fc857, 0x592e8c06, 0x83440d80, + 0x000007fc, 0x04000004, 0x83440480, 0x000007f0, + 0x04021014, 0x0201f800, 0x00020245, 0x04020011, + 0x0201f800, 0x001049f3, 0x04020011, 0x0201f800, + 0x0002075a, 0x0400001c, 0x49366009, 0x492e6008, + 0x4a026406, 0x0000000a, 0x42027000, 0x00000040, + 0x0201f800, 0x000207a1, 0x80000580, 0x0401f011, + 0x42000000, 0x00000028, 0x0401f00d, 0x0201f800, + 0x00104a09, 0x040007fb, 0x59a80805, 0x82040d00, + 0x00000003, 0x04000004, 0x42000000, 0x00000004, + 0x0401f003, 0x42000000, 0x00000029, 0x80000540, + 0x1c01f000, 0x42000000, 0x0000002c, 0x0401f7fc, + 0x492fc857, 0x592e8c06, 0x4947c857, 0x83440c80, + 0x00000800, 0x42000000, 0x0000000a, 0x04021176, + 0x592c4207, 0x4823c857, 0x82200500, 0x0000000f, + 0x0c01f001, 0x001043d5, 0x0010445d, 0x001044a9, + 0x001044b4, 0x001044bf, 0x001043d1, 0x001043d1, + 0x001043d1, 0x001044cf, 0x00104513, 0x00104530, + 0x001043d1, 0x001043d1, 0x001043d1, 0x001043d1, + 0x001043d1, 0x4803c857, 0x42000000, 0x0000000c, + 0x0401f15d, 0x592c1008, 0x82081500, 0x00ffffff, + 0x59a80010, 0x80084d80, 0x42000000, 0x00000010, + 0x04000155, 0x0201f800, 0x00104919, 0x04000036, + 0x4803c857, 0x82004d80, 0x0000001d, 0x0402001a, + 0x0201f800, 0x00105755, 0x59340405, 0x4c000000, + 0x0201f800, 0x001049e7, 0x5c000000, 0x04000004, + 0x8c20450a, 0x04000028, 0x80000580, 0x44002800, + 0x59340008, 0x48002802, 0x59340009, 0x48002801, + 0x59340006, 0x48002804, 0x59340007, 0x48002803, + 0x4200b000, 0x00000005, 0x0201f800, 0x0010955f, + 0x0401f166, 0x4803c857, 0x82004d80, 0x0000001a, + 0x04020003, 0x40101000, 0x0401f136, 0x4803c857, + 0x82004d80, 0x0000001b, 0x04020003, 0x40181000, + 0x0401f130, 0x4803c857, 0x82004d80, 0x0000001c, + 0x04000131, 0x82004d80, 0x00000019, 0x42000000, + 0x0000000a, 0x04000120, 0x42000000, 0x0000000a, + 0x04020137, 0x59a80005, 0x8c000514, 0x0400001b, + 0x0201f800, 0x001049e7, 0x04000018, 0x59340212, + 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, + 0x0402000c, 0x42001000, 0x00000008, 0x59a80026, + 0x8c000506, 0x04020009, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000007, + 0x0201f800, 0x00104c6d, 0x42000000, 0x0000001c, + 0x40181000, 0x04020107, 0x0201f800, 0x0002075a, + 0x04000111, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000001, 0x8c20450a, 0x04000004, 0x592c0404, + 0x8400055c, 0x48025c04, 0x4c200000, 0x4d3c0000, + 0x42027800, 0x00001000, 0x0201f800, 0x0010203c, + 0x5c027800, 0x5c004000, 0x8c204512, 0x0400000b, + 0x599c0018, 0x8c000518, 0x04000008, 0x592c0009, + 0x82000500, 0x00000380, 0x5934080a, 0x80040d40, + 0x84040d54, 0x4806680a, 0x417a7800, 0x0401f914, + 0x42000800, 0x00000003, 0x0401f91b, 0x42027000, + 0x00000002, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f10a, 0x0201f800, 0x00020245, 0x040200ec, + 0x0201f800, 0x001049ed, 0x04000008, 0x0201f800, + 0x001049e7, 0x040200ec, 0x417a7800, 0x417a6000, + 0x0201f800, 0x001020a1, 0x59a80005, 0x8c000514, + 0x0400001b, 0x0201f800, 0x001049e7, 0x04000018, + 0x59340212, 0x82000500, 0x0000ff00, 0x42001000, + 0x00000010, 0x0402000c, 0x42001000, 0x00000008, + 0x59a80026, 0x8c000506, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x04000007, 0x0201f800, 0x00104c6d, 0x42000000, + 0x0000001c, 0x40181000, 0x040200b2, 0x0201f800, + 0x0002075a, 0x040000bc, 0x5934080a, 0x8c204512, + 0x0400000c, 0x599c0018, 0x8c000518, 0x04000009, + 0x592c0009, 0x82000500, 0x00000380, 0x82041500, + 0xfffffc7f, 0x80080d40, 0x84040d54, 0x0401f002, + 0x84040d14, 0x4806680a, 0x49366009, 0x492e6008, + 0x4a026406, 0x00000001, 0x417a7800, 0x0401f8c8, + 0x42000800, 0x00000005, 0x0401f8cf, 0x42027000, + 0x00000003, 0x0201f800, 0x000207a1, 0x80000580, + 0x0401f0be, 0x0201f800, 0x00020245, 0x040200a0, + 0x0201f800, 0x001049fc, 0x040200a3, 0x0201f800, + 0x00109517, 0x04000094, 0x80000580, 0x0401f0b3, + 0x0201f800, 0x00020245, 0x04020095, 0x0201f800, + 0x001049fc, 0x04020098, 0x0201f800, 0x001090e6, + 0x04000089, 0x80000580, 0x0401f0a8, 0x0201f800, + 0x00020245, 0x0402008a, 0x83444d80, 0x000007fe, + 0x42000000, 0x0000000a, 0x0402006b, 0x0201f800, + 0x001049e7, 0x04020088, 0x0201f800, 0x0010952f, + 0x04000079, 0x80000580, 0x0401f098, 0x82200500, + 0x00000070, 0x04020005, 0x8c20450e, 0x42000000, + 0x0000000c, 0x0402005c, 0x8c20450a, 0x0400000d, + 0x4d3c0000, 0x42027800, 0x00001000, 0x8c20450e, + 0x04020002, 0x853e7d56, 0x82200500, 0x000000a0, + 0x0201f800, 0x001049d3, 0x5c027800, 0x0401f07f, + 0x0201f800, 0x00020245, 0x04020065, 0x8c204508, + 0x04000010, 0x4d3c0000, 0x42027800, 0x00001000, + 0x8c20450e, 0x04020002, 0x853e7d56, 0x82200500, + 0x00000090, 0x0201f800, 0x001049bb, 0x5c027800, + 0x42000000, 0x0000000a, 0x0402003b, 0x0401f06b, + 0x836c0580, 0x00000003, 0x42000800, 0x00000007, + 0x0402000f, 0x0201f800, 0x001049f3, 0x04000007, + 0x4c000000, 0x0201f800, 0x00104a1f, 0x5c000000, + 0x0400004d, 0x0401f05d, 0x0201f800, 0x001094c5, + 0x04000007, 0x80000580, 0x0401f05c, 0x0201f800, + 0x00104a1f, 0x04000051, 0x0401f054, 0x0201f800, + 0x00104a1f, 0x04000034, 0x0401f050, 0x0201f800, + 0x00020245, 0x04020036, 0x836c0580, 0x00000003, + 0x04020040, 0x8c204508, 0x04000006, 0x417a7800, + 0x417a6000, 0x0201f800, 0x001020a1, 0x0401f043, + 0x0201f800, 0x001049ed, 0x04000008, 0x0201f800, + 0x001049e7, 0x0402002c, 0x417a7800, 0x417a6000, + 0x0201f800, 0x001020a1, 0x480bc856, 0x0201f800, + 0x00109332, 0x04000018, 0x80000580, 0x0401f037, + 0x0401f7e3, 0x480bc857, 0x42000800, 0x00000019, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f00a, + 0x480bc857, 0x40000800, 0x4200b000, 0x00000002, + 0x0401f005, 0x480bc857, 0x40000800, 0x4200b000, + 0x00000001, 0x480bc857, 0x42028000, 0x00000031, + 0x0401f020, 0x480bc857, 0x42000800, 0x00000003, + 0x4200b000, 0x00000001, 0x0401f7f7, 0x480bc857, + 0x42000800, 0x0000000a, 0x4200b000, 0x00000001, + 0x0401f7f1, 0x480bc857, 0x42000800, 0x00000009, + 0x40001000, 0x4200b000, 0x00000002, 0x0401f7ea, + 0x480bc857, 0x42000800, 0x00000007, 0x4200b000, + 0x00000001, 0x0401f7e4, 0x480bc857, 0x4200b000, + 0x00000001, 0x0401f7e0, 0x80028580, 0x4178b000, + 0x82000540, 0x00000001, 0x1c01f000, 0x4937c857, + 0x59326809, 0x59341200, 0x813e79c0, 0x04000003, + 0x84081540, 0x0401f002, 0x84081500, 0x480a6a00, + 0x1c01f000, 0x59326809, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4937c857, 0x82040580, 0x00000006, + 0x04020004, 0x42000000, 0x00000606, 0x0401f021, + 0x82040580, 0x00000004, 0x04020004, 0x42000000, + 0x00000404, 0x0401f01b, 0x82040580, 0x00000007, + 0x42000000, 0x00000707, 0x04000016, 0x82040580, + 0x00000003, 0x42000000, 0x00000703, 0x04000011, + 0x82040580, 0x00000005, 0x42000000, 0x00000405, + 0x0400000c, 0x82040580, 0x00000009, 0x42000000, + 0x00000409, 0x04000007, 0x82040580, 0x0000000b, + 0x42000000, 0x0000070b, 0x02020800, 0x001005d8, + 0x4803c857, 0x48026c00, 0x82040d80, 0x00000006, + 0x04020005, 0x59341404, 0x800811c0, 0x02000800, + 0x001005d8, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4947c857, 0x481bc857, 0x83440480, + 0x00000800, 0x04021034, 0x83441400, 0x0010ac00, + 0x50080000, 0x80026d40, 0x04020011, 0x4c180000, + 0x4d2c0000, 0x0201f800, 0x001007d3, 0x412e6800, + 0x5c025800, 0x5c003000, 0x04000027, 0x45341000, + 0x497a680d, 0x497a6810, 0x497a680f, 0x497a680e, + 0x4c180000, 0x0401fcf3, 0x5c003000, 0x59340a12, + 0x4c040000, 0x0201f800, 0x0010513b, 0x5c000800, + 0x04000009, 0x82180500, 0x00ffff00, 0x04000008, + 0x59a81010, 0x82081500, 0x00ffff00, 0x80080580, + 0x04000003, 0x80000580, 0x0401f004, 0x82180500, + 0x000000ff, 0x800000d0, 0x80040d80, 0x04000003, + 0x4803c857, 0x48026a12, 0x59340002, 0x80180580, + 0x04000003, 0x481bc857, 0x481a6802, 0x80000580, + 0x1c01f000, 0x4803c856, 0x82000540, 0x00000001, + 0x0401f7fc, 0x4947c857, 0x83440480, 0x00000800, + 0x04021011, 0x83441400, 0x0010ac00, 0x50080000, + 0x80026d40, 0x0400000b, 0x0401fbf9, 0x0402000a, + 0x59a80005, 0x8c000502, 0x04000004, 0x59340200, + 0x8c00050e, 0x04000004, 0x82000540, 0x00000001, + 0x1c01f000, 0x80000580, 0x0401f7fe, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4947c857, 0x4d2c0000, + 0x4d300000, 0x83440480, 0x00000800, 0x04021024, + 0x83441400, 0x0010ac00, 0x50080000, 0x80026d40, + 0x0400001b, 0x45781000, 0x5934000d, 0x80025d40, + 0x02020800, 0x001007fd, 0x59366011, 0x813261c0, + 0x0400000e, 0x4c640000, 0x5930c800, 0x59325808, + 0x0201f800, 0x00109037, 0x02020800, 0x001007fd, + 0x0201f800, 0x0002077d, 0x82666540, 0x00000000, + 0x040207f6, 0x5c00c800, 0x0201f800, 0x00104c62, + 0x41365800, 0x0201f800, 0x001007f5, 0x80000580, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x82000540, + 0x00000001, 0x0401f7fb, 0x4937c857, 0x4c580000, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x48026802, + 0x497a6c01, 0x497a6a01, 0x59340200, 0x84000502, + 0x48026a00, 0x0201f800, 0x0010513b, 0x04020017, + 0x59340403, 0x82000580, 0x000007fe, 0x04000005, + 0x59a80026, 0x8c00050a, 0x04020010, 0x0401f008, + 0x59cc0408, 0x8c000518, 0x0400000c, 0x59cc0009, + 0x48035035, 0x59cc000a, 0x48035036, 0x59cc0207, + 0x80000540, 0x04020003, 0x42000000, 0x00000001, + 0x48038893, 0x4803501e, 0x59cc0a09, 0x82040d00, + 0x00000010, 0x59cc0408, 0x82000500, 0x00000020, + 0x04000002, 0x84040d40, 0x5934000a, 0x82000500, + 0xffffffee, 0x80040540, 0x4802680a, 0x83cca400, + 0x0000000b, 0x8334ac00, 0x00000006, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010ab17, 0x83cca400, + 0x0000000d, 0x8334ac00, 0x00000008, 0x4200b000, + 0x00000002, 0x0201f800, 0x0010ab17, 0x59cc0a18, + 0x82040480, 0x00000800, 0x0402100c, 0x82040480, + 0x00000400, 0x04001004, 0x42000800, 0x00000400, + 0x0401f006, 0x82040480, 0x00000200, 0x04001003, + 0x42000800, 0x00000200, 0x48066a04, 0x59340403, + 0x82000580, 0x000007fe, 0x04020003, 0x59cc0a08, + 0x48066a04, 0x42000800, 0x00000004, 0x59cc1207, + 0x800811c0, 0x04000005, 0x82080480, 0x00000004, + 0x04021002, 0x40080800, 0x48066c04, 0x5c00b000, + 0x1c01f000, 0x4937c857, 0x59a80026, 0x8c000508, + 0x04000004, 0x84000556, 0x4803c857, 0x48035026, + 0x59cc0207, 0x4803c857, 0x48026a05, 0x59cc020a, + 0x4803c857, 0x48026c05, 0x59341200, 0x599c0818, + 0x5934180a, 0x4807c857, 0x480bc857, 0x480fc857, + 0x59cc2006, 0x82102500, 0xff000000, 0x82102580, + 0x02000000, 0x04000007, 0x8c00050e, 0x04000009, + 0x8c0c1d14, 0x04000003, 0x8c0c1d0e, 0x04000005, + 0x8c040d18, 0x04000003, 0x8408154a, 0x0401f002, + 0x8408150a, 0x8c000510, 0x04000009, 0x8c0c1d14, + 0x04000003, 0x8c0c1d10, 0x04000005, 0x8c040d18, + 0x04000003, 0x8408154e, 0x0401f002, 0x8408150e, + 0x8c000512, 0x04000009, 0x8c0c1d14, 0x04000003, + 0x8c0c1d12, 0x04000005, 0x8c040d18, 0x04000003, + 0x8408155c, 0x0401f002, 0x8408151c, 0x480a6a00, + 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c580000, 0x5934000d, 0x80025d40, 0x04000029, + 0x592c0003, 0x82000480, 0x00000008, 0x0400100b, + 0x412cb800, 0x592c0001, 0x80025d40, 0x040207f9, + 0x0201f800, 0x001007e4, 0x04000037, 0x492fc857, + 0x492cb801, 0x0401f020, 0x832c0c00, 0x00000004, + 0x4200b000, 0x00000008, 0x50040000, 0x82000580, + 0xffffffff, 0x04020006, 0x80041000, 0x50080000, + 0x82000580, 0xffffffff, 0x04000007, 0x82040c00, + 0x00000002, 0x8058b040, 0x040207f4, 0x0201f800, + 0x001005d8, 0x45480800, 0x454c1000, 0x592c1803, + 0x800c1800, 0x480e5803, 0x480fc857, 0x0401f014, + 0x0201f800, 0x001007e4, 0x04000017, 0x492fc857, + 0x492e680d, 0x497a5802, 0x4a025803, 0x00000001, + 0x494a5804, 0x494e5805, 0x832c0c00, 0x00000006, + 0x4200b000, 0x0000000e, 0x46000800, 0xffffffff, + 0x80040800, 0x8058b040, 0x040207fc, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c025800, 0x5c00b800, + 0x1c01f000, 0x80000580, 0x0401f7fb, 0x4803c856, + 0x4d3c0000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x0400001f, 0x592c0002, 0x80000540, 0x0402001f, + 0x412e7800, 0x0401f8ce, 0x0402001c, 0x46000800, + 0xffffffff, 0x46001000, 0xffffffff, 0x4813c857, + 0x480fc857, 0x580c0003, 0x82000c80, 0x00000002, + 0x04021014, 0x480fc857, 0x400c0000, 0x812c0580, + 0x04020004, 0x580c0001, 0x4802680d, 0x0401f003, + 0x580c0001, 0x48002001, 0x400e5800, 0x0201f800, + 0x001007f4, 0x82000540, 0x00000001, 0x5c025800, + 0x5c027800, 0x1c01f000, 0x80000580, 0x0401f7fc, + 0x80000040, 0x48001803, 0x4803c857, 0x0401f7f6, + 0x0201f800, 0x00020086, 0x59300007, 0x8400054e, + 0x48026007, 0x592c1a04, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000048, 0x04000013, 0x0201f000, + 0x0002028e, 0x8c000500, 0x02020800, 0x000200e5, + 0x4a026203, 0x00000002, 0x592c1a04, 0x820c1d00, + 0x000000ff, 0x820c0580, 0x00000018, 0x02000000, + 0x0002028e, 0x820c0580, 0x00000048, 0x02020000, + 0x0002028e, 0x42000800, 0x80000804, 0x0201f800, + 0x00106721, 0x0201f000, 0x00020297, 0x4a025a06, + 0x00000008, 0x0201f000, 0x000202da, 0x4a025a06, + 0x00000029, 0x0201f000, 0x000202da, 0x4a025a06, + 0x0000002a, 0x0201f000, 0x000202da, 0x4a025a06, + 0x00000028, 0x0201f000, 0x000202da, 0x4943c857, + 0x4d440000, 0x4d340000, 0x4d2c0000, 0x4c580000, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020245, 0x0402000d, 0x8d3e7d14, 0x04000005, + 0x59340212, 0x82000500, 0x0000ff00, 0x04000007, + 0x8d3e7d06, 0x04000004, 0x59340200, 0x8c00050e, + 0x04020002, 0x0401f813, 0x81468800, 0x8058b040, + 0x040207ef, 0x83440480, 0x00000800, 0x04021008, + 0x8d3e7d02, 0x04000006, 0x42028800, 0x000007f0, + 0x4200b000, 0x00000010, 0x0401f7e5, 0x5c00b000, + 0x5c025800, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4d2c0000, 0x41783000, 0x5936580f, 0x812e59c0, + 0x04000029, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000012, 0x04000020, 0x8d3e7d00, + 0x04000003, 0x0401f83c, 0x0402001c, 0x592c2000, + 0x497a5800, 0x801831c0, 0x04020009, 0x59340010, + 0x812c0580, 0x04020004, 0x497a680f, 0x497a6810, + 0x0401f008, 0x4812680f, 0x0401f006, 0x48103000, + 0x59340010, 0x812c0580, 0x04020002, 0x481a6810, + 0x4a025a04, 0x00000103, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x001091c6, 0x0201f800, 0x000202da, + 0x40125800, 0x0401f7da, 0x412c3000, 0x592e5800, + 0x0401f7d7, 0x5c025800, 0x1c01f000, 0x4803c856, + 0x41781800, 0x5934000f, 0x80025d40, 0x04000010, + 0x592c0005, 0x80200580, 0x592c0000, 0x04000003, + 0x412c1800, 0x0401f7f9, 0x497a5800, 0x800c19c0, + 0x04000008, 0x48001800, 0x80000540, 0x04020004, + 0x480e6810, 0x82000540, 0x00000001, 0x1c01f000, + 0x4802680f, 0x80000540, 0x040207fd, 0x497a6810, + 0x0401f7f9, 0x592c0008, 0x81480580, 0x04020003, + 0x592c0009, 0x814c0580, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x413c1800, 0x400c2000, 0x593c0002, + 0x80000540, 0x04020018, 0x4200b000, 0x00000008, + 0x820c0c00, 0x00000004, 0x50040000, 0x81480580, + 0x04020005, 0x80041000, 0x50080000, 0x814c0580, + 0x0400000d, 0x82040c00, 0x00000002, 0x8058b040, + 0x040207f6, 0x400c2000, 0x580c0001, 0x80001d40, + 0x040207ee, 0x82000540, 0x00000001, 0x5c00b000, + 0x1c01f000, 0x80000580, 0x0401f7fd, 0x4937c857, + 0x4c580000, 0x4d2c0000, 0x5934000d, 0x80025d40, + 0x04020016, 0x0201f800, 0x001007e4, 0x04000010, + 0x492e680d, 0x4a025802, 0x00000001, 0x497a5803, + 0x832c0c00, 0x00000004, 0x4200b000, 0x00000010, + 0x46000800, 0xffffffff, 0x80040800, 0x8058b040, + 0x040207fc, 0x82000540, 0x00000001, 0x5c025800, + 0x5c00b000, 0x1c01f000, 0x4d2c0000, 0x592e5801, + 0x0201f800, 0x001007fd, 0x5c025800, 0x0401f7ea, + 0x4d2c0000, 0x5936580d, 0x812e59c0, 0x04000007, + 0x4937c857, 0x497a680d, 0x0201f800, 0x001007fd, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x59340405, 0x4937c857, 0x4803c857, 0x8c000508, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x0010513b, + 0x04000011, 0x59a80815, 0x8c040d04, 0x0402000e, + 0x59a80826, 0x8c040d06, 0x0400000b, 0x83ac0400, + 0x000007fe, 0x50000000, 0x80026d40, 0x04000006, + 0x0401f9a7, 0x04020004, 0x59340200, 0x8400055a, + 0x48026a00, 0x599c0017, 0x8c000508, 0x04000015, + 0x4200b000, 0x000007f0, 0x417a8800, 0x0201f800, + 0x00020245, 0x0402000c, 0x0401f999, 0x0402000a, + 0x59a80010, 0x59340802, 0x80040580, 0x82000500, + 0x00ffff00, 0x04020004, 0x59340200, 0x8400055a, + 0x48026a00, 0x81468800, 0x8058b040, 0x040207f0, + 0x0401f884, 0x04000003, 0x59a80836, 0x0401f006, + 0x599c0017, 0x8c000508, 0x04000007, 0x42000800, + 0x000007d0, 0x42001000, 0x00104876, 0x0201f800, + 0x0010606e, 0x1c01f000, 0x4803c856, 0x4d340000, + 0x4d440000, 0x4d3c0000, 0x4c580000, 0x42001000, + 0x00104876, 0x0201f800, 0x00105f90, 0x59a80826, + 0x8c040d06, 0x04000015, 0x0401f86a, 0x04000013, + 0x83ae6c00, 0x000007fe, 0x51366800, 0x59340200, + 0x8400051a, 0x48026a00, 0x599c0017, 0x8c000508, + 0x04000007, 0x42000800, 0x000007d0, 0x42001000, + 0x00104876, 0x0201f800, 0x0010606e, 0x0201f800, + 0x00101e45, 0x0401f027, 0x4200b000, 0x000007f0, + 0x80028d80, 0x0201f800, 0x00020245, 0x0402001e, + 0x59340200, 0x8c00051a, 0x0400001b, 0x59368c03, + 0x417a7800, 0x42028000, 0x00000029, 0x41783000, + 0x0201f800, 0x0010a446, 0x59340200, 0x84000558, + 0x8400051a, 0x48026a00, 0x4937c857, 0x4a026c00, + 0x00000707, 0x42028000, 0x00000029, 0x0201f800, + 0x00106ab4, 0x417a7800, 0x0201f800, 0x001067fd, + 0x80000d80, 0x0201f800, 0x0010a2ff, 0x0201f800, + 0x00106c4b, 0x81468800, 0x8058b040, 0x040207de, + 0x5c00b000, 0x5c027800, 0x5c028800, 0x5c026800, + 0x1c01f000, 0x4933c857, 0x59303809, 0x581c0200, + 0x8400051a, 0x48003a00, 0x1c01f000, 0x4803c856, + 0x42026800, 0x0010b524, 0x497a680e, 0x42028800, + 0x000007ff, 0x0201f800, 0x001042b4, 0x4937c857, + 0x4a026c00, 0x00000606, 0x4a026802, 0x00ffffff, + 0x4a026a04, 0x00000200, 0x4a026c04, 0x00000002, + 0x1c01f000, 0x59300009, 0x50000000, 0x4933c857, + 0x4803c857, 0x8c00050e, 0x1c01f000, 0x59300009, + 0x50000000, 0x8c00050a, 0x1c01f000, 0x4933c856, + 0x0401f90f, 0x04000006, 0x59340400, 0x82000d00, + 0x000000ff, 0x82041580, 0x00000005, 0x1c01f000, + 0x4d340000, 0x83ac0400, 0x000007fe, 0x50000000, + 0x80026d40, 0x04000003, 0x59340200, 0x8c00051a, + 0x5c026800, 0x1c01f000, 0x4937c857, 0x493fc857, + 0x59340403, 0x81ac0400, 0x50000000, 0x81340580, + 0x02020800, 0x001005d8, 0x59341200, 0x813e79c0, + 0x04000003, 0x8408155e, 0x0401f002, 0x8408151e, + 0x480a6a00, 0x1c01f000, 0x4937c857, 0x0201f800, + 0x0010210a, 0x04000006, 0x59a80835, 0x42001000, + 0x00104910, 0x0201f800, 0x0010606e, 0x1c01f000, + 0x4937c857, 0x42001000, 0x00104910, 0x0201f800, + 0x00105f90, 0x59a81026, 0x84081512, 0x480b5026, + 0x1c01f000, 0x4c380000, 0x4c340000, 0x4c240000, + 0x4c600000, 0x4008c000, 0x83440480, 0x00000800, + 0x04021045, 0x80002d80, 0x41442000, 0x83447400, + 0x0010ac00, 0x4200b000, 0x000007f0, 0x83444c80, + 0x000007f0, 0x04001003, 0x4200b000, 0x00000010, + 0x50380000, 0x80000540, 0x0402001e, 0x41440000, + 0x80100580, 0x04020043, 0x40102800, 0x82104c80, + 0x000007f0, 0x04001015, 0x82104d80, 0x000007fc, + 0x04020005, 0x82604d80, 0x00fffffc, 0x0402002a, + 0x0401f00e, 0x82104d80, 0x000007fd, 0x04020005, + 0x82604d80, 0x00fffffd, 0x04020023, 0x0401f007, + 0x82104d80, 0x000007ff, 0x0402001f, 0x82604d80, + 0x00ffffff, 0x0402001c, 0x84142d5e, 0x0401f029, + 0x40006800, 0x58343002, 0x82183500, 0x00ffffff, + 0x40180000, 0x80600580, 0x04020019, 0x40100000, + 0x81440580, 0x0402000a, 0x40366800, 0x8c204508, + 0x04000053, 0x0401ff8a, 0x04020051, 0x4947c857, + 0x42000000, 0x0000001d, 0x0401f04e, 0x4947c857, + 0x480bc857, 0x4823c857, 0x42000000, 0x0000001a, + 0x0401f048, 0x4947c857, 0x4863c857, 0x4813c857, + 0x42000000, 0x00000019, 0x0401f042, 0x40100000, + 0x81440580, 0x04020007, 0x58343002, 0x4947c857, + 0x481bc857, 0x42000000, 0x0000001b, 0x0401f039, + 0x80102000, 0x80387000, 0x83444c80, 0x000007f0, + 0x04001009, 0x82104d80, 0x00000800, 0x0402000c, + 0x42002000, 0x000007f0, 0x42007000, 0x0010b3f0, + 0x0401f007, 0x82104d80, 0x000007f0, 0x04020004, + 0x41782000, 0x42007000, 0x0010ac00, 0x8058b040, + 0x040207a4, 0x801429c0, 0x04020007, 0x0201f800, + 0x001005d8, 0x4947c857, 0x42000000, 0x0000000a, + 0x0401f01c, 0x4d2c0000, 0x4c180000, 0x40603000, + 0x0401fc12, 0x4947c857, 0x4937c857, 0x5c003000, + 0x5c025800, 0x040207f4, 0x497a6a12, 0x59a80026, + 0x8c00050a, 0x0402000d, 0x82600500, 0x00ffff00, + 0x04000006, 0x59a84810, 0x82244d00, 0x00ffff00, + 0x80240580, 0x04020005, 0x82600500, 0x000000ff, + 0x800000d0, 0x48026a12, 0x48626802, 0x80000580, + 0x80000540, 0x5c00c000, 0x5c004800, 0x5c006800, + 0x5c007000, 0x1c01f000, 0x5934000f, 0x5934140b, + 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, + 0x02020800, 0x00020253, 0x1c01f000, 0x4803c857, + 0x4947c857, 0x4c300000, 0x82006500, 0x00000030, + 0x04000006, 0x4c000000, 0x0201f800, 0x0010942a, + 0x5c000000, 0x0402000b, 0x8c00050e, 0x04000006, + 0x0201f800, 0x00020245, 0x04020006, 0x4937c857, + 0x0401fc2f, 0x80000580, 0x5c006000, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fc, 0x4803c857, + 0x4c580000, 0x4d440000, 0x40001000, 0x80000d80, + 0x4200b000, 0x000007f0, 0x4c040000, 0x40068800, + 0x4c080000, 0x40080000, 0x0401ffdd, 0x5c001000, + 0x5c000800, 0x80040800, 0x8058b040, 0x040207f7, + 0x5c028800, 0x5c00b000, 0x1c01f000, 0x4c5c0000, + 0x59340400, 0x8200bd80, 0x00000606, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x8200bd80, + 0x00000404, 0x5c00b800, 0x1c01f000, 0x4c5c0000, + 0x59340400, 0x8200bd80, 0x00000404, 0x04000003, + 0x8200bd80, 0x00000606, 0x5c00b800, 0x1c01f000, + 0x4c5c0000, 0x4c600000, 0x59340400, 0x8200bd00, + 0x0000ff00, 0x825cc580, 0x00000400, 0x04000003, + 0x825cc580, 0x00000600, 0x5c00c000, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x59340400, 0x82000500, + 0x000000ff, 0x8200bd80, 0x00000003, 0x04000003, + 0x8200bd80, 0x00000005, 0x5c00b800, 0x1c01f000, + 0x4c5c0000, 0x59340400, 0x82000500, 0x0000ff00, + 0x8400b9c0, 0x805c0580, 0x4937c857, 0x4803c857, + 0x48026c00, 0x5c00b800, 0x1c01f000, 0x4c040000, + 0x4c080000, 0x592c0207, 0x8c00050c, 0x0400000f, + 0x592e8c06, 0x82000500, 0x00000080, 0x84000548, + 0x4d3c0000, 0x42027800, 0x00001000, 0x0401ff90, + 0x5c027800, 0x82000540, 0x00000001, 0x5c001000, + 0x5c000800, 0x1c01f000, 0x80000580, 0x0401f7fc, + 0x592c040b, 0x82000500, 0x0000e000, 0x82000580, + 0x00006000, 0x04000019, 0x836c0580, 0x00000003, + 0x04000016, 0x836c0580, 0x00000002, 0x040200ff, + 0x59a80026, 0x82000d00, 0x00000038, 0x04020005, + 0x59a80832, 0x800409c0, 0x0400000c, 0x0401f0f7, + 0x82000d00, 0x00000003, 0x82040d80, 0x00000003, + 0x040200f2, 0x82000d00, 0x00000028, 0x04020003, + 0x8c00050c, 0x040000ed, 0x592c100a, 0x82080500, + 0xff000000, 0x040200ce, 0x59a80010, 0x80080580, + 0x040000c8, 0x592c0c0b, 0x82040d00, 0x0000e000, + 0x82040480, 0x00008000, 0x040210c8, 0x592e8c06, + 0x83440480, 0x00000800, 0x04001007, 0x83440580, + 0x0000ffff, 0x040200af, 0x800409c0, 0x040200f7, + 0x0401f0ac, 0x800409c0, 0x040200f4, 0x41784000, + 0x0401fead, 0x040200db, 0x42027000, 0x00000053, + 0x592c2409, 0x82100500, 0xffffff00, 0x040200aa, + 0x4813c857, 0x592c000c, 0x800001c0, 0x04000083, + 0x82100580, 0x00000004, 0x040000a0, 0x82100580, + 0x00000051, 0x0400009d, 0x82100580, 0x00000003, + 0x04000016, 0x82100580, 0x00000020, 0x0400004b, + 0x82100580, 0x00000024, 0x04000042, 0x82100580, + 0x00000021, 0x04000042, 0x82100580, 0x00000050, + 0x04000037, 0x82100580, 0x00000052, 0x04000031, + 0x82100580, 0x00000005, 0x0402006b, 0x42027000, + 0x00000001, 0x0401f01b, 0x42027000, 0x00000002, + 0x59a80005, 0x8c000514, 0x04000016, 0x0401ff4c, + 0x04000014, 0x59340212, 0x82000500, 0x0000ff00, + 0x42001000, 0x00000010, 0x0402000c, 0x59a80026, + 0x8c000506, 0x0402006f, 0x42001000, 0x00000008, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x04000003, 0x0401f9bf, 0x04020065, + 0x0201f800, 0x0002075a, 0x0400007e, 0x4a026406, + 0x00000010, 0x49366009, 0x42000800, 0x00000003, + 0x83380580, 0x00000002, 0x04000003, 0x42000800, + 0x0000000b, 0x0201f800, 0x00104571, 0x0401f044, + 0x42027000, 0x00000000, 0x0401f003, 0x42027000, + 0x00000004, 0x0401ff37, 0x04020071, 0x0401f036, + 0x42027000, 0x00000033, 0x0401f006, 0x42027000, + 0x00000005, 0x0401f003, 0x42027000, 0x00000003, + 0x0401ff23, 0x04020066, 0x59a80005, 0x8c000514, + 0x04000016, 0x0401ff12, 0x04000014, 0x59340212, + 0x82000500, 0x0000ff00, 0x42001000, 0x00000010, + 0x0402000c, 0x59a80026, 0x8c000506, 0x04020035, + 0x42001000, 0x00000008, 0x59340002, 0x82000500, + 0x00ff0000, 0x82000580, 0x00ff0000, 0x04000003, + 0x0401f985, 0x0402002b, 0x0201f800, 0x0002075a, + 0x04000044, 0x4a026406, 0x00000010, 0x49366009, + 0x42000800, 0x00000005, 0x83380580, 0x00000003, + 0x04000003, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x0401f00a, 0x82102580, 0x00000011, + 0x0402002d, 0x0201f800, 0x0002075a, 0x04000031, + 0x4a026406, 0x00000010, 0x49366009, 0x492e6008, + 0x49325808, 0x813669c0, 0x04000007, 0x592c0c0b, + 0x8c040d18, 0x04000004, 0x59340200, 0x84000514, + 0x48026a00, 0x0201f800, 0x000207a1, 0x80000580, + 0x1c01f000, 0x82000540, 0x00000001, 0x0401f7fd, + 0x42001000, 0x0000000a, 0x0401f015, 0x42001000, + 0x00000010, 0x0401f012, 0x42001000, 0x00000016, + 0x0401f00f, 0x42001000, 0x00000017, 0x0401f00c, + 0x42001000, 0x00000018, 0x0401f009, 0x42001000, + 0x0000001b, 0x0401f006, 0x42001000, 0x0000001e, + 0x0401f003, 0x42001000, 0x00000020, 0x42000800, + 0x00000019, 0x42028000, 0x00000031, 0x0401f7e2, + 0x42000800, 0x00000003, 0x0401f003, 0x42000800, + 0x0000000a, 0x41781000, 0x0401f7f7, 0x42000800, + 0x00000009, 0x59341400, 0x0401f7f3, 0x42028000, + 0x00000008, 0x0401f005, 0x42000800, 0x00000007, + 0x416c1000, 0x0401f7ec, 0x41780800, 0x41781000, + 0x0401f7cd, 0x42028000, 0x00000000, 0x0401f7fb, + 0x82004d80, 0x0000001d, 0x02000800, 0x001005d8, + 0x82004d80, 0x0000001a, 0x04020004, 0x40101000, + 0x40000800, 0x0401f7dc, 0x82004d80, 0x0000001b, + 0x04020003, 0x40181000, 0x0401f7fa, 0x82004d80, + 0x0000001c, 0x040007f7, 0x82004d80, 0x00000019, + 0x040007b8, 0x0401f7d6, 0x592e6008, 0x0201f800, + 0x0010941a, 0x040007b6, 0x59300c06, 0x82040580, + 0x00000011, 0x040207d6, 0x83440580, 0x0000ffff, + 0x04020005, 0x59326809, 0x813669c0, 0x0400000e, + 0x0401f7cf, 0x592c100a, 0x82081500, 0x00ffffff, + 0x41784000, 0x0401fda8, 0x040207d6, 0x59300009, + 0x800001c0, 0x04000003, 0x81340580, 0x040207c4, + 0x49366009, 0x592c0c0b, 0x82041500, 0x0000e000, + 0x82080580, 0x00006000, 0x04000009, 0x59300a03, + 0x82040580, 0x00000007, 0x040207b9, 0x492e6008, + 0x42027000, 0x00000054, 0x0401f77f, 0x0201f800, + 0x0010a8d4, 0x040007bc, 0x0401f7b1, 0x492fc857, + 0x59a80021, 0x800001c0, 0x04020073, 0x592e6008, + 0x4933c857, 0x0201f800, 0x0010941a, 0x04000041, + 0x59301406, 0x82080580, 0x00000005, 0x0402005b, + 0x59301203, 0x82080580, 0x00000007, 0x04020057, + 0x592e8c06, 0x83440480, 0x00000800, 0x04021032, + 0x41784000, 0x592c1009, 0x82081500, 0x00ffffff, + 0x0401fd75, 0x0402005f, 0x59300009, 0x800001c0, + 0x04000003, 0x81340580, 0x04020048, 0x4d300000, + 0x592e6013, 0x4933c857, 0x83300580, 0xffffffff, + 0x0400000d, 0x0201f800, 0x0010941a, 0x5c026000, + 0x04000029, 0x591c1406, 0x82080580, 0x00000006, + 0x04000046, 0x82080580, 0x00000011, 0x04000043, + 0x0401f002, 0x5c026000, 0x59a80010, 0x592c100a, + 0x82081500, 0x00ffffff, 0x80081580, 0x04020017, + 0x592c1009, 0x82081500, 0x00ffffff, 0x80081580, + 0x0400000f, 0x49366009, 0x492e6008, 0x42027000, + 0x00000092, 0x0201f800, 0x000207a1, 0x80000580, + 0x1c01f000, 0x42001000, 0x0000000a, 0x0401f00c, + 0x42001000, 0x00000010, 0x0401f009, 0x42001000, + 0x00000014, 0x0401f006, 0x42001000, 0x00000018, + 0x0401f003, 0x42001000, 0x0000003c, 0x492fc857, + 0x480bc857, 0x42000800, 0x00000019, 0x42028000, + 0x00000031, 0x82000540, 0x00000001, 0x0401f7e9, + 0x492fc857, 0x4803c857, 0x480bc857, 0x40000800, + 0x0401f7f7, 0x492fc857, 0x42000800, 0x0000000a, + 0x41781000, 0x0401f7f2, 0x4933c857, 0x59300406, + 0x4803c857, 0x59300203, 0x4803c857, 0x59300009, + 0x4803c857, 0x42028000, 0x00000008, 0x41780800, + 0x41781000, 0x0401f7e8, 0x42000800, 0x0000001e, + 0x0401f7f0, 0x42000800, 0x00000001, 0x0401f7ed, + 0x82004d80, 0x0000001d, 0x02000800, 0x001005d8, + 0x82004d80, 0x0000001a, 0x04020003, 0x40101000, + 0x0401f7dc, 0x82004d80, 0x0000001b, 0x04020003, + 0x40181000, 0x0401f7d7, 0x82004d80, 0x0000001c, + 0x040007d4, 0x82004d80, 0x00000019, 0x040007d1, + 0x0401f7d5, 0x59302009, 0x801021c0, 0x04000035, + 0x58101400, 0x82081d00, 0x000000ff, 0x59300c03, + 0x82040580, 0x00000008, 0x04000022, 0x82040580, + 0x0000000a, 0x04000017, 0x82040580, 0x0000000c, + 0x04000010, 0x82040580, 0x00000002, 0x04000019, + 0x82040580, 0x00000001, 0x04000012, 0x82040580, + 0x00000003, 0x0400000b, 0x82040580, 0x00000005, + 0x04000004, 0x82040580, 0x00000033, 0x04020019, + 0x820c0580, 0x00000009, 0x0400000d, 0x0401f015, + 0x820c0580, 0x00000005, 0x04000009, 0x0401f011, + 0x820c0580, 0x0000000b, 0x04000005, 0x0401f00d, + 0x820c0580, 0x00000003, 0x0402000a, 0x82081d00, + 0xffffff00, 0x840c01c0, 0x800c0540, 0x4813c857, + 0x480bc857, 0x4807c857, 0x4803c857, 0x48002400, + 0x1c01f000, 0x599c0017, 0x8c00050a, 0x04000003, + 0x80000580, 0x1c01f000, 0x59a80026, 0x82000500, + 0x00000028, 0x04000008, 0x42028800, 0x000007fd, + 0x0201f800, 0x00020245, 0x04020003, 0x5934000a, + 0x8c000504, 0x1c01f000, 0x4d300000, 0x5934000e, + 0x80026540, 0x04000006, 0x0201f800, 0x001062d5, + 0x02000800, 0x001064ad, 0x497a680e, 0x5c026000, + 0x1c01f000, 0x4d440000, 0x4d340000, 0x80000580, + 0x40001800, 0x40028800, 0x82080580, 0x00000008, + 0x04020003, 0x42001800, 0x00000001, 0x0201f800, + 0x00020245, 0x0402000a, 0x0401fd6d, 0x04020008, + 0x800c19c0, 0x04000004, 0x59340405, 0x8c000508, + 0x04000003, 0x80081040, 0x04000009, 0x81468800, + 0x83440480, 0x00000800, 0x040017f1, 0x80000580, + 0x5c026800, 0x5c028800, 0x1c01f000, 0x82000540, + 0x00000001, 0x5c026800, 0x5c028800, 0x1c01f000, + 0x4a033020, 0x00000000, 0x497b3026, 0x497b3027, + 0x497b3028, 0x497b3029, 0x497b302b, 0x497b3021, + 0x4a03b104, 0x60000001, 0x1c01f000, 0x4803c856, + 0x599c0018, 0x497b3024, 0x497b3025, 0x82000500, + 0x0000000f, 0x82000d80, 0x00000005, 0x04000006, + 0x82000580, 0x00000006, 0x0400000d, 0x497b3022, + 0x1c01f000, 0x4a033022, 0x00000005, 0x599c0216, + 0x82000500, 0x0000ffff, 0x04020003, 0x42000000, + 0x00000002, 0x48033023, 0x1c01f000, 0x4a033022, + 0x00000006, 0x0401f7f6, 0x0401ffe5, 0x4a03c826, + 0x00000004, 0x599c0209, 0x80000540, 0x0400001f, + 0x599c0207, 0x80000540, 0x04000007, 0x800000cc, + 0x599c080d, 0x80040400, 0x4803b100, 0x497bb102, + 0x59d80101, 0x599c000d, 0x4803b100, 0x599c000e, + 0x4803b101, 0x599c0207, 0x80000540, 0x04020002, + 0x497bb102, 0x599c0a09, 0x82040540, 0x00400000, + 0x59980822, 0x4803b103, 0x4a03b109, 0x00000004, + 0x4a03b104, 0x10000001, 0x800409c0, 0x04020004, + 0x4a033020, 0x00000001, 0x1c01f000, 0x4a033020, + 0x00000002, 0x0401f7fd, 0x59980022, 0x4803c856, + 0x80000540, 0x02000000, 0x000202de, 0x0401f017, + 0x42034000, 0x0010b4a4, 0x59a1d81e, 0x80edd9c0, + 0x02000800, 0x001005d8, 0x58ec0009, 0x48efc857, + 0x49a3c857, 0x492fc857, 0x4803c857, 0x800001c0, + 0x08020000, 0x0201f800, 0x001005d8, 0x5931d821, + 0x58ef400b, 0x58ec0009, 0x800001c0, 0x08020000, + 0x0201f800, 0x001005d8, 0x497a5800, 0x59980026, + 0x80000540, 0x0402008c, 0x59d80105, 0x82000d00, + 0x00018780, 0x040201da, 0x80000106, 0x82000500, + 0x00000003, 0x0c01f001, 0x00104d0a, 0x00104d89, + 0x00104d22, 0x00104d50, 0x592c0001, 0x492fc857, + 0x492fb107, 0x80000d40, 0x04020007, 0x59940019, + 0x80000540, 0x04022003, 0x59980023, 0x48032819, + 0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001, + 0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40, + 0x040207f9, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7ee, 0x492fc857, 0x492fb107, + 0x592c0001, 0x80000d40, 0x04020012, 0x59da5908, + 0x835c0480, 0x00000020, 0x0400101c, 0x0402b01a, + 0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500, + 0x00018780, 0x040201aa, 0x59940019, 0x80000540, + 0x04022003, 0x59980023, 0x48032819, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0401f7e3, 0x0400f009, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7e0, 0x492fa807, 0x0401f7de, + 0x492fc857, 0x59d81108, 0x45681000, 0x400ad000, + 0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540, + 0x00001200, 0x48039000, 0x0402d00c, 0x592c0001, + 0x492fc857, 0x492fb107, 0x80000d40, 0x0402001d, + 0x59940019, 0x80000540, 0x04022003, 0x59980023, + 0x48032819, 0x1c01f000, 0x59d80105, 0x82000500, + 0x00018780, 0x04020172, 0x42000000, 0x0010b855, + 0x0201f800, 0x0010aa47, 0x59980026, 0x59980828, + 0x80000000, 0x48033026, 0x492fc857, 0x800409c0, + 0x492f3028, 0x04000003, 0x492c0800, 0x0401f002, + 0x492f3029, 0x592c0001, 0x80000d40, 0x040007e5, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x815eb800, 0x412ed000, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0401f7d8, 0x59980026, 0x59980828, 0x80000000, + 0x48033026, 0x492fc857, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020027, 0x0402d00e, + 0x59980029, 0x80025d40, 0x0400000f, 0x59980026, + 0x80000040, 0x48033026, 0x04020002, 0x48033028, + 0x592c0000, 0x48033029, 0x492fc857, 0x492fb107, + 0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0402e00a, 0x59da5908, 0x496a5800, + 0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x59d80105, + 0x82000500, 0x00018780, 0x04020125, 0x59940019, + 0x80000540, 0x04022003, 0x59980023, 0x48032819, + 0x1c01f000, 0x497a5801, 0x40065800, 0x592c0001, + 0x496a5800, 0x815eb800, 0x412ed000, 0x80000d40, + 0x040207f9, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0401f7ce, 0x592c0204, 0x4803c856, + 0x04000008, 0x42034000, 0x0010b4a4, 0x59a1d81e, + 0x80edd9c0, 0x02000800, 0x001005d8, 0x0401f003, + 0x5931d821, 0x58ef400b, 0x58ec0009, 0x800001c0, + 0x08020000, 0x0201f800, 0x001005d8, 0x497a5801, + 0x40065800, 0x592c0001, 0x496a5800, 0x412ed000, + 0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x0200e000, 0x000202fb, 0x0201f000, 0x00020302, + 0x5998002b, 0x84000540, 0x4803302b, 0x0201f000, + 0x0002035e, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x492fc857, 0x59980026, 0x59980828, + 0x80000000, 0x48033026, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020002, 0x1c01f000, + 0x497a5801, 0x40065800, 0x592c0001, 0x496a5800, + 0x412ed000, 0x815eb800, 0x80000d40, 0x040207f9, + 0x59c80000, 0x82000540, 0x00001200, 0x48039000, + 0x1c01f000, 0x59980026, 0x59980828, 0x80000000, + 0x48033026, 0x492fc857, 0x800409c0, 0x492f3028, + 0x04000003, 0x492c0800, 0x0401f002, 0x492f3029, + 0x592c0001, 0x80000d40, 0x04020039, 0x0402d00e, + 0x59980029, 0x80025d40, 0x0400000f, 0x59980026, + 0x80000040, 0x48033026, 0x04020002, 0x48033028, + 0x592c0000, 0x48033029, 0x492fc857, 0x492fb107, + 0x0400d7f4, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0402e01d, 0x59da5908, 0x496a5800, + 0x412ed000, 0x815eb800, 0x0400e7fc, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x04006018, + 0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd, + 0x900001c0, 0x82000540, 0x00000013, 0x4803c011, + 0x5998002b, 0x84000500, 0x4803302b, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x59d80105, 0x82000500, + 0x00018780, 0x0402007e, 0x1c01f000, 0x5998002b, + 0x84000540, 0x4803302b, 0x0401f7f8, 0x497a5801, + 0x40065800, 0x592c0001, 0x496a5800, 0x412ed000, + 0x815eb800, 0x80000d40, 0x040207f9, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x0401f7bc, + 0x5c000000, 0x4c000000, 0x4803c857, 0x492fc857, + 0x4943c857, 0x4807c857, 0x4a025a04, 0x00000103, + 0x49425a06, 0x48065a08, 0x4a025c06, 0x0000ffff, + 0x813261c0, 0x04000003, 0x59300402, 0x48025c06, + 0x832c0400, 0x00000009, 0x04011000, 0x4803c840, + 0x4a03c842, 0x0000000b, 0x04011000, 0x1c01f000, + 0x4df00000, 0x4203e000, 0x50000000, 0x599cb817, + 0x59940019, 0x80000540, 0x04002023, 0x0400000e, + 0x59980022, 0x82000580, 0x00000005, 0x0400001e, + 0x59a80069, 0x81640580, 0x0402001b, 0x8c5cbd08, + 0x04000005, 0x59a8006a, 0x59a80866, 0x80040580, + 0x04020015, 0x8c5cbd08, 0x04020030, 0x59d8090b, + 0x59d8010a, 0x80040580, 0x0400000d, 0x0400600e, + 0x4a03c011, 0x80400012, 0x4a03c020, 0x00008040, + 0x59e00017, 0x8c000508, 0x04000003, 0x4a03c017, + 0x00000002, 0x4203e000, 0x30000001, 0x4a032819, + 0xffff0000, 0x04026835, 0x04006003, 0x8c5cbd08, + 0x04020860, 0x59980029, 0x80025d40, 0x04000010, + 0x59d80105, 0x82000500, 0x00018780, 0x04020020, + 0x0402d00d, 0x59980026, 0x492fc857, 0x80000040, + 0x48033026, 0x592c0000, 0x492fb107, 0x48033029, + 0x04020003, 0x4803c856, 0x48033028, 0x5c03e000, + 0x1c01f000, 0x42000000, 0x0010b855, 0x0201f800, + 0x0010aa47, 0x0401f7fa, 0x59e0000f, 0x59e0080f, + 0x80040580, 0x040207fd, 0x59e00010, 0x59e01010, + 0x80081580, 0x040207fd, 0x40065000, 0x80041580, + 0x040007c7, 0x040067dc, 0x0401f7ca, 0x4803c857, + 0x485fc857, 0x8c00050e, 0x02020800, 0x001005d0, + 0x4203e000, 0x50000000, 0x4200b800, 0x00008004, + 0x0201f000, 0x001005dd, 0x5998002b, 0x8c000500, + 0x04000013, 0x84000500, 0x4803302b, 0x59d8010a, + 0x59d8090a, 0x80040580, 0x040207fd, 0x800408e0, + 0x82040d40, 0x00000013, 0x4807c011, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x1c01f000, 0x0402e014, + 0x59da5908, 0x496a5800, 0x412ed000, 0x815eb800, + 0x0400e7fc, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x59d8090b, 0x59980024, 0x48073024, + 0x80040480, 0x04020004, 0x59940019, 0x80000540, + 0x04022003, 0x59980823, 0x48072819, 0x59d80105, + 0x82000500, 0x00018780, 0x040207c9, 0x1c01f000, + 0x59981025, 0x59e00010, 0x59e00810, 0x80041d80, + 0x040207fd, 0x80080580, 0x04000013, 0x48073025, + 0x59e0000f, 0x59e0100f, 0x80081d80, 0x040207fd, + 0x81280580, 0x04000008, 0x400a5000, 0x40080000, + 0x80040580, 0x04000003, 0x59980823, 0x48072819, + 0x1c01f000, 0x59940019, 0x80000540, 0x040227f8, + 0x0401f7fc, 0x59e0000f, 0x59e0100f, 0x80081d80, + 0x040207fd, 0x81280580, 0x040007f6, 0x400a5000, + 0x59940019, 0x80000540, 0x040027ed, 0x0401f7f1, + 0x59a80017, 0x82000c80, 0x0000000a, 0x02021800, + 0x001005d8, 0x0c01f809, 0x4a038805, 0x000000f0, + 0x59c400a3, 0x82000500, 0x02870000, 0x02020800, + 0x001005d8, 0x1c01f000, 0x00104fc5, 0x00104f51, + 0x00104f6c, 0x00104f95, 0x00104fb8, 0x00104ff2, + 0x00105004, 0x00104f6c, 0x00104fd6, 0x00104f50, + 0x1c01f000, 0x4a038808, 0x00000004, 0x0401f8f9, + 0x0201f800, 0x001053ab, 0x59c40805, 0x8c040d0e, + 0x04020013, 0x8c040d0a, 0x0402000b, 0x8c040d0c, + 0x04020006, 0x8c040d08, 0x0400000d, 0x4a035017, + 0x00000003, 0x0401f00a, 0x4a035017, 0x00000000, + 0x0401f007, 0x42000000, 0x0010b844, 0x0201f800, + 0x0010aa47, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000002, 0x0401f8de, 0x59c40805, + 0x8c040d08, 0x04020021, 0x8c040d0c, 0x0402001c, + 0x8c040d0e, 0x04020017, 0x82040500, 0x000000f0, + 0x0402001c, 0x0201f800, 0x001053ab, 0x4a038808, + 0x00000080, 0x59c40002, 0x8400050c, 0x48038802, + 0x0401f9d9, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00109874, 0x5c027800, 0x4a038808, + 0x00000080, 0x4a035017, 0x00000009, 0x0401f009, + 0x4a035017, 0x00000001, 0x0401f006, 0x4a035017, + 0x00000000, 0x0401f003, 0x4a035017, 0x00000003, + 0x1c01f000, 0x0401f8b7, 0x4a038808, 0x00000080, + 0x59c40805, 0x8c040d0a, 0x0402001b, 0x8c040d0c, + 0x04020016, 0x8c040d0e, 0x04020011, 0x82040500, + 0x000000f0, 0x04020016, 0x59c40002, 0x8400050c, + 0x48038802, 0x0401f9b4, 0x4d3c0000, 0x42027800, + 0x00000001, 0x0201f800, 0x00109874, 0x5c027800, + 0x4a035017, 0x00000009, 0x0401f009, 0x4a035017, + 0x00000001, 0x0401f006, 0x4a035017, 0x00000000, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000008, 0x59c40805, 0x8c040d0c, + 0x04020006, 0x8c040d0e, 0x04000006, 0x4a035017, + 0x00000001, 0x0401f003, 0x4a035017, 0x00000000, + 0x1c01f000, 0x0401f8d3, 0x59c40805, 0x8c040d0c, + 0x0402000d, 0x4c040000, 0x0401f882, 0x5c000800, + 0x8c040d0a, 0x04020006, 0x8c040d0e, 0x04000006, + 0x4a035017, 0x00000001, 0x0401f003, 0x4a035017, + 0x00000002, 0x1c01f000, 0x4a038808, 0x00000008, + 0x42001000, 0x00105058, 0x0201f800, 0x00106084, + 0x59c40805, 0x8c040d0a, 0x0402000d, 0x8c040d08, + 0x0402000b, 0x8c040d0c, 0x04020006, 0x8c040d0e, + 0x0400000d, 0x4a035017, 0x00000001, 0x0401f00a, + 0x4a035017, 0x00000000, 0x0401f007, 0x42000000, + 0x0010b844, 0x0201f800, 0x0010aa47, 0x4a035017, + 0x00000004, 0x1c01f000, 0x0401f8a6, 0x0401f859, + 0x59c40805, 0x8c040d0a, 0x0402000b, 0x8c040d0c, + 0x04020006, 0x8c040d0e, 0x04000009, 0x4a035017, + 0x00000001, 0x0401f006, 0x4a035017, 0x00000000, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x4a038808, 0x00000004, 0x0401f846, 0x59c40805, + 0x8c040d0a, 0x04020010, 0x8c040d08, 0x0402000b, + 0x8c040d0c, 0x04020006, 0x8c040d0e, 0x0400000c, + 0x4a035017, 0x00000001, 0x0401f009, 0x4a035017, + 0x00000000, 0x0401f006, 0x4a035017, 0x00000003, + 0x0401f003, 0x4a035017, 0x00000002, 0x1c01f000, + 0x0401f91f, 0x02020800, 0x001005d8, 0x59a80805, + 0x8c040d0c, 0x04000015, 0x84040d0c, 0x48075005, + 0x4a038805, 0x00000010, 0x0201f800, 0x00101937, + 0x59c40005, 0x8c000508, 0x04000008, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0401f01a, 0x59c40006, 0x84000548, + 0x48038806, 0x0401f016, 0x59a80017, 0x82000580, + 0x00000001, 0x0400000c, 0x59a80017, 0x82000580, + 0x00000005, 0x0402000c, 0x42000000, 0x0010b844, + 0x0201f800, 0x0010aa47, 0x4a035017, 0x00000008, + 0x0401f007, 0x42000000, 0x0010b844, 0x0201f800, + 0x0010aa47, 0x4a035017, 0x00000004, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x4c080000, 0x42000800, + 0x00000064, 0x42001000, 0x00105058, 0x0201f800, + 0x00106079, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0201f800, 0x00106e21, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401ffba, 0x5c000800, + 0x1c01f000, 0x4803c856, 0x4c040000, 0x4c080000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800, + 0x00106e21, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x59c40006, 0x84000500, 0x48038806, 0x0201f800, + 0x00106ede, 0x497b8880, 0x0201f800, 0x0010a9c0, + 0x0201f800, 0x0010a9ce, 0x0201f800, 0x00101815, + 0x4a03504c, 0x00000004, 0x4202d800, 0x00000004, + 0x4a038805, 0x00000001, 0x42001000, 0x00105058, + 0x0201f800, 0x00106084, 0x0201f800, 0x001006d4, + 0x0401f8c1, 0x04000006, 0x42006000, 0xfeffffff, + 0x41786800, 0x0201f800, 0x0010427d, 0x0201f800, + 0x00100452, 0x42000000, 0x00000001, 0x0201f800, + 0x00101590, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x59c40008, 0x8c000508, 0x04020007, 0x4a038808, + 0x00000010, 0x4201d000, 0x00001388, 0x0201f800, + 0x0010608e, 0x1c01f000, 0x4c040000, 0x59a80833, + 0x82040580, 0x00000000, 0x0400000b, 0x82040580, + 0x00000001, 0x0400000b, 0x82040580, 0x00000002, + 0x0400000b, 0x82040580, 0x00000003, 0x0400000b, + 0x0401f057, 0x4a035017, 0x00000000, 0x0401f009, + 0x4a035017, 0x00000004, 0x0401f006, 0x4a035017, + 0x00000001, 0x0401f003, 0x4a035017, 0x00000007, + 0x497b8880, 0x4a038893, 0x00000001, 0x41780000, + 0x0201f800, 0x00101606, 0x0201f800, 0x00106ede, + 0x836c0d80, 0x00000004, 0x04000008, 0x59c40006, + 0x82000500, 0xffffff0f, 0x82000540, 0x04000001, + 0x48038806, 0x0401f007, 0x59c40006, 0x82000500, + 0xffffff0f, 0x82000540, 0x04000000, 0x48038806, + 0x0401f875, 0x04020005, 0x59c40806, 0x82040d00, + 0xfbffff0f, 0x48078806, 0x4200b000, 0x00000005, + 0x59c40005, 0x8c000534, 0x04020033, 0x42006000, + 0xfc18ffff, 0x42006800, 0x01000000, 0x0201f800, + 0x0010427d, 0x0201f800, 0x00101937, 0x59c408a4, + 0x82040d00, 0x0000000f, 0x82040d80, 0x0000000c, + 0x0400000a, 0x42006000, 0xfeffffff, 0x42006800, + 0x02000000, 0x0201f800, 0x0010427d, 0x8058b040, + 0x040207e8, 0x0401f8a1, 0x0401f853, 0x04000006, + 0x42006000, 0xfeffffff, 0x41786800, 0x0201f800, + 0x0010427d, 0x836c0d80, 0x00000004, 0x04000006, + 0x59a8084d, 0x42001000, 0x00105065, 0x0201f800, + 0x0010606e, 0x4a035033, 0x00000004, 0x0401fe31, + 0x0401f841, 0x04020008, 0x59c408a4, 0x82040d00, + 0x0000000f, 0x82040580, 0x0000000c, 0x02020800, + 0x001005d8, 0x5c000800, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x0201f800, 0x0010609e, 0x4a035010, + 0x00ffffff, 0x497b5032, 0x59a8002a, 0x82000500, + 0xffff0000, 0x4803502a, 0x497b8880, 0x497b8893, + 0x41780000, 0x0201f800, 0x00101606, 0x59c40001, + 0x82000500, 0xfffffcff, 0x48038801, 0x42006000, + 0xfc18ffff, 0x41786800, 0x0201f800, 0x0010427d, + 0x4a038808, 0x00000000, 0x5c000000, 0x800001c0, + 0x02020800, 0x0010411d, 0x4a038805, 0x040000f0, + 0x59c40006, 0x82000500, 0xffffffcf, 0x82000540, + 0x440000c1, 0x48038806, 0x1c01f000, 0x4c5c0000, + 0x59a8b832, 0x825cbd80, 0x0000aaaa, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000000, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000010, 0x5c00b800, + 0x1c01f000, 0x4c5c0000, 0x599cb818, 0x825cbd00, + 0x00000030, 0x825cbd80, 0x00000020, 0x5c00b800, + 0x1c01f000, 0x59a80005, 0x4803c857, 0x82000d00, + 0x00000013, 0x04000025, 0x599c1017, 0x4d3c0000, + 0x82000500, 0x00000011, 0x04000007, 0x42027800, + 0x00000400, 0x0201f800, 0x00103b25, 0x0402000a, + 0x0401f012, 0x42027800, 0x00000408, 0x0201f800, + 0x00103b25, 0x0400000d, 0x42003000, 0x00000003, + 0x0401f003, 0x42003000, 0x00000004, 0x42028000, + 0x0000000e, 0x0201f800, 0x0010a449, 0x599c1017, + 0x8c08150a, 0x04020007, 0x42028000, 0x00000004, + 0x0201f800, 0x00101fe5, 0x80000580, 0x0401f80d, + 0x5c027800, 0x0401f00a, 0x0201f800, 0x00103b25, + 0x04000007, 0x42028000, 0x0000000f, 0x42003000, + 0x00000001, 0x0201f800, 0x0010a449, 0x1c01f000, + 0x59a80005, 0x04000004, 0x82000540, 0x00000010, + 0x0401f003, 0x82000500, 0xffffffef, 0x48035005, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x42000000, 0x0010b8cb, 0x0201f800, 0x0010aa47, + 0x42000800, 0x0010c0f1, 0x59c40003, 0x44000800, + 0x59c40004, 0x48000801, 0x59c4000b, 0x48000802, + 0x59c4008e, 0x48000803, 0x59c4008f, 0x48000804, + 0x59c40090, 0x48000805, 0x59c40091, 0x48000806, + 0x59c40092, 0x48000807, 0x59c40093, 0x48000808, + 0x59c40099, 0x48000809, 0x59c4009e, 0x4800080a, + 0x59c400aa, 0x4800080b, 0x59c400af, 0x4800080c, + 0x59c400b2, 0x4800080d, 0x59c400b1, 0x4800080e, + 0x82040c00, 0x0000000f, 0x41c41800, 0x4200b000, + 0x00000030, 0x580c0050, 0x44000800, 0x80040800, + 0x800c1800, 0x8058b040, 0x040207fb, 0x41c41800, + 0x4200b000, 0x00000020, 0x580c0010, 0x44000800, + 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, + 0x497b8830, 0x4200b000, 0x00000040, 0x59c40031, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x497b88ac, 0x4200b000, 0x00000010, 0x59c400ad, + 0x44000800, 0x80040800, 0x8058b040, 0x040207fc, + 0x59c41001, 0x4c080000, 0x8408150c, 0x480b8801, + 0x4a0370e4, 0x00000300, 0x4a0370e5, 0xb0000000, + 0x42000800, 0x00000800, 0x80040840, 0x02000800, + 0x001005d8, 0x59b800e5, 0x8c000538, 0x040207fb, + 0x4a0370e4, 0x00000200, 0x42006000, 0xffffffff, + 0x42006800, 0x80000000, 0x0201f800, 0x0010427d, + 0x4a038807, 0x00000001, 0x497b8807, 0x4a038808, + 0x00000010, 0x42006000, 0xfcf8ffff, 0x42006800, + 0x01000000, 0x0201f800, 0x0010427d, 0x5c001000, + 0x480b8801, 0x42000800, 0x0010c0f1, 0x50040000, + 0x48038803, 0x58040001, 0x48038804, 0x58040002, + 0x4803880b, 0x58040003, 0x4803888e, 0x58040004, + 0x4803888f, 0x58040005, 0x48038890, 0x58040006, + 0x48038891, 0x58040007, 0x48038892, 0x58040008, + 0x48038893, 0x58040009, 0x48038899, 0x5804000a, + 0x4803889e, 0x5804000b, 0x480388aa, 0x5804000c, + 0x480388af, 0x5804000d, 0x480388b2, 0x5804000e, + 0x480388b1, 0x82040c00, 0x0000000f, 0x41c41800, + 0x4200b000, 0x00000030, 0x50040000, 0x48001850, + 0x80040800, 0x800c1800, 0x8058b040, 0x040207fb, + 0x41c41800, 0x4200b000, 0x00000020, 0x50040000, + 0x48001810, 0x80040800, 0x800c1800, 0x8058b040, + 0x040207fb, 0x497b8830, 0x4200b000, 0x00000040, + 0x50040000, 0x48038831, 0x80040800, 0x8058b040, + 0x040207fc, 0x497b88ac, 0x4200b000, 0x00000010, + 0x50040000, 0x480388ad, 0x80040800, 0x8058b040, + 0x040207fc, 0x497b8880, 0x41780000, 0x0201f800, + 0x00101606, 0x59c408a4, 0x82040d00, 0x0000000f, + 0x82040580, 0x0000000c, 0x02020800, 0x001005d8, + 0x4a038805, 0x04000000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x4ce80000, 0x42000000, + 0x0010b845, 0x0201f800, 0x0010aa47, 0x59c41008, + 0x4c080000, 0x82080500, 0xffffff7f, 0x48038808, + 0x59c40004, 0x82000500, 0x00003e02, 0x04000005, + 0x4201d000, 0x00000014, 0x0201f800, 0x0010608e, + 0x59c40006, 0x82000500, 0xffffff0f, 0x48038806, + 0x4a038805, 0x00000010, 0x4a038808, 0x00000004, + 0x4200b000, 0x00000065, 0x59c40005, 0x8c000508, + 0x04020012, 0x4201d000, 0x000003e8, 0x0201f800, + 0x0010608e, 0x8058b040, 0x040207f8, 0x0201f800, + 0x00106ede, 0x4a038808, 0x00000008, 0x4a035033, + 0x00000001, 0x4202d800, 0x00000001, 0x82000540, + 0x00000001, 0x0401f030, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8a8, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x497b8880, 0x59a8002a, + 0x82000500, 0x0000ffff, 0x4c000000, 0x0201f800, + 0x00101606, 0x5c000000, 0x48038880, 0x4a038808, + 0x00000000, 0x4200b000, 0x00000065, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000008, + 0x4201d000, 0x000003e8, 0x0201f800, 0x0010608e, + 0x8058b040, 0x040207f2, 0x0401f7d1, 0x59c40006, + 0x82000540, 0x000000f0, 0x48038806, 0x59a8001e, + 0x80000540, 0x04020002, 0x80000000, 0x48038893, + 0x80000580, 0x5c001000, 0x4df00000, 0x0201f800, + 0x0010195d, 0x5c03e000, 0x480b8808, 0x5c01d000, + 0x5c00b000, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x4ce80000, 0x59c41008, 0x82080500, 0xffffff7f, + 0x48038808, 0x4c080000, 0x59c40004, 0x82000500, + 0x00003e02, 0x04000005, 0x4201d000, 0x00000014, + 0x0201f800, 0x0010608e, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8a9, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x4a038808, 0x00000002, + 0x80000580, 0x48038880, 0x48038893, 0x0201f800, + 0x00101606, 0x4200b000, 0x00000384, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x04000015, + 0x82000500, 0x000000d0, 0x04020012, 0x4201d000, + 0x00000067, 0x0201f800, 0x0010608e, 0x8058b040, + 0x040207ef, 0x0201f800, 0x00106ede, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x82000540, 0x00000001, 0x0401f010, + 0x497b8880, 0x59a8001e, 0x80000540, 0x04020002, + 0x80000000, 0x48038893, 0x59a8002a, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606, + 0x5c000000, 0x48038880, 0x80000580, 0x5c001000, + 0x4df00000, 0x0201f800, 0x0010195d, 0x5c03e000, + 0x480b8808, 0x5c01d000, 0x5c00b000, 0x1c01f000, + 0x4803c856, 0x59c40004, 0x82000500, 0x00003e02, + 0x0400000a, 0x0201f800, 0x00106ede, 0x4a038808, + 0x00000008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0401f052, 0x0201f800, 0x00100ae0, + 0x42000000, 0x0010b8aa, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00100ef4, 0x59c40006, 0x84000508, + 0x48038806, 0x4a038805, 0x00000010, 0x59a80805, + 0x84040d4c, 0x48075005, 0x42000800, 0x00000064, + 0x42001000, 0x00105058, 0x0201f800, 0x0010606e, + 0x4a038808, 0x00000000, 0x497b8880, 0x4a038805, + 0x000000f0, 0x0201f800, 0x00101937, 0x42000800, + 0x000000f0, 0x59c40005, 0x80040d00, 0x0400000e, + 0x82000500, 0x000000e0, 0x0402000b, 0x4201d000, + 0x000003e8, 0x0201f800, 0x0010608e, 0x0201f800, + 0x00105f48, 0x59940004, 0x80000540, 0x040207ec, + 0x0401f023, 0x4c080000, 0x42001000, 0x00105065, + 0x0201f800, 0x00105f90, 0x42001000, 0x00105058, + 0x0201f800, 0x00106084, 0x5c001000, 0x497b8880, + 0x59a8001e, 0x80000540, 0x04020002, 0x80000000, + 0x48038893, 0x59a8002a, 0x82000500, 0x0000ffff, + 0x4c000000, 0x0201f800, 0x00101606, 0x5c000000, + 0x48038880, 0x59a80805, 0x84040d0c, 0x48075005, + 0x59c40006, 0x84000548, 0x48038806, 0x0201f800, + 0x0010195d, 0x4a038808, 0x00000080, 0x1c01f000, + 0x4803c856, 0x4d400000, 0x4d3c0000, 0x0201f800, + 0x00106ede, 0x0201f800, 0x0010ab33, 0x04020025, + 0x599c1017, 0x59a80805, 0x8c040d00, 0x0402000c, + 0x8c08151a, 0x0400001f, 0x84040d42, 0x48075005, + 0x42028000, 0x00000004, 0x42027800, 0x0000000c, + 0x8c081508, 0x04020008, 0x0401f012, 0x42028000, + 0x00000004, 0x42027800, 0x00000004, 0x8c081508, + 0x0400000c, 0x4d400000, 0x42028000, 0x0000000e, + 0x42028800, 0x0000ffff, 0x0201f800, 0x0010a446, + 0x5c028000, 0x599c0817, 0x8c040d0a, 0x04020005, + 0x4943c857, 0x493fc857, 0x0201f800, 0x00101fe5, + 0x497b8880, 0x4202d800, 0x00000001, 0x0401fcfb, + 0x5c027800, 0x5c028000, 0x1c01f000, 0x0201f800, + 0x00100ae0, 0x42000000, 0x0010b8ab, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x00100ef4, 0x42000000, + 0x00000001, 0x0201f800, 0x00101606, 0x4a038880, + 0x00000001, 0x0201f000, 0x0010195d, 0x4202e000, + 0x00000000, 0x4a033015, 0x00000001, 0x497b301d, + 0x497b3006, 0x4a03b004, 0x60000001, 0x59d80005, + 0x4a03b004, 0x90000001, 0x4a03a804, 0x60000001, + 0x59d40005, 0x4a03a804, 0x90000001, 0x0201f000, + 0x00105983, 0x4a03c825, 0x00000004, 0x4a03c827, + 0x00000004, 0x599c0409, 0x80000d40, 0x04000020, + 0x599c0407, 0x80000540, 0x04000007, 0x800000cc, + 0x599c100b, 0x80080400, 0x4803b000, 0x497bb002, + 0x59d80001, 0x599c000b, 0x4803b000, 0x599c000c, + 0x4803b001, 0x599c0407, 0x80000540, 0x04020002, + 0x497bb002, 0x599c0c09, 0x82040540, 0x00400000, + 0x4803b003, 0x4a03b009, 0x00000004, 0x4a03b004, + 0x10000001, 0x59e00803, 0x82040d00, 0xfffffeff, + 0x82040d40, 0x00008000, 0x4807c003, 0x599c040a, + 0x80000540, 0x04000020, 0x599c0408, 0x80000540, + 0x04000007, 0x800000cc, 0x599c100f, 0x80080400, + 0x4803a800, 0x497ba802, 0x59d40001, 0x599c000f, + 0x4803a800, 0x599c0010, 0x4803a801, 0x599c0408, + 0x80000540, 0x04020002, 0x497ba802, 0x599c0c0a, + 0x82040540, 0x00400000, 0x4803a803, 0x4a03a809, + 0x00000004, 0x4a03a804, 0x10000001, 0x59e00803, + 0x82040d00, 0xfffffbff, 0x82040d40, 0x00008000, + 0x4807c003, 0x800409c0, 0x04000007, 0x4202e000, + 0x00000001, 0x0200b800, 0x00020551, 0x0200f000, + 0x00020566, 0x1c01f000, 0x0201f800, 0x001005d8, + 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, + 0x59981005, 0x800811c0, 0x0400001e, 0x58080005, + 0x82000d00, 0x43018780, 0x02020000, 0x00105846, + 0x8c000508, 0x04000015, 0x580a5808, 0x592c0204, + 0x497a5800, 0x497a5801, 0x82000500, 0x000000ff, + 0x82000c80, 0x0000004b, 0x0402100b, 0x0c01f80f, + 0x5c03e000, 0x83700580, 0x00000003, 0x040007e6, + 0x0200f800, 0x00020566, 0x0200b000, 0x00020551, + 0x1c01f000, 0x0401f850, 0x5c03e000, 0x0401f7f9, + 0x0401f8de, 0x0401f7fd, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x001054a1, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105519, 0x00105491, 0x00105491, 0x001054a1, + 0x001054a1, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x492fc857, 0x42000000, 0x0010b85e, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00000400, + 0x0401f019, 0x492fc857, 0x42000000, 0x0010b85d, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00001000, + 0x0401f011, 0x492fc857, 0x42000000, 0x0010b85c, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00002000, + 0x0401f009, 0x492fc857, 0x42000000, 0x0010b85f, + 0x0201f800, 0x0010aa47, 0x42000000, 0x00000800, + 0x0401f001, 0x4803c857, 0x4202e000, 0x00000001, + 0x592c0c04, 0x82040d00, 0xffff80ff, 0x80040540, + 0x48025c04, 0x0201f000, 0x000202da, 0x592c0204, + 0x492fc857, 0x80000110, 0x040007db, 0x80000040, + 0x04000025, 0x48033002, 0x492f3003, 0x492f3004, + 0x4a033008, 0x001054e5, 0x4202e000, 0x00000003, + 0x1c01f000, 0x592c0204, 0x492fc857, 0x80000110, + 0x040007cd, 0x80000040, 0x04000033, 0x48033002, + 0x492f3003, 0x492f3004, 0x4a033008, 0x00105501, + 0x4202e000, 0x00000003, 0x1c01f000, 0x0201f800, + 0x0010ab33, 0x02020000, 0x000204d9, 0x42028000, + 0x00000028, 0x41780800, 0x417a6000, 0x0201f800, + 0x00104e70, 0x0201f800, 0x001091c6, 0x0201f000, + 0x000202da, 0x592c0a0a, 0x8c040d02, 0x04020016, + 0x59a80021, 0x492fc857, 0x80000540, 0x0402000f, + 0x592c0207, 0x80000540, 0x04000005, 0x0201f800, + 0x00104326, 0x04020004, 0x1c01f000, 0x42000000, + 0x00000000, 0x592c0a06, 0x48065c06, 0x48025a06, + 0x0201f000, 0x000202da, 0x42000000, 0x00000028, + 0x0401f7f9, 0x42000800, 0x00000009, 0x0201f000, + 0x0010665b, 0x592c0208, 0x492fc857, 0x82000c80, + 0x0000199a, 0x040217a4, 0x592c0408, 0x80000540, + 0x040207a1, 0x59a80821, 0x800409c0, 0x04020009, + 0x592c0207, 0x80000540, 0x0400079b, 0x497a5a06, + 0x0201f800, 0x00104385, 0x04020004, 0x1c01f000, + 0x42000000, 0x00000028, 0x48025a06, 0x0201f000, + 0x000202da, 0x59980804, 0x59980002, 0x48065800, + 0x492c0801, 0x492f3004, 0x80000040, 0x48033002, + 0x04000002, 0x1c01f000, 0x599a5803, 0x59980008, + 0x4202e000, 0x00000001, 0x0801f000, 0x592e8a06, + 0x592c0406, 0x4803c856, 0x82000500, 0x000000ff, + 0x4200b800, 0x00000001, 0x82000d80, 0x00000001, + 0x04000015, 0x417a8800, 0x4200b800, 0x000007f0, + 0x82000d80, 0x00000002, 0x0400000f, 0x80000540, + 0x02020000, 0x000202da, 0x592e8a06, 0x0201f800, + 0x00020245, 0x02020000, 0x000202da, 0x592e9008, + 0x592e9809, 0x0201f800, 0x00104713, 0x0201f000, + 0x000202da, 0x59a80805, 0x84040d00, 0x48075005, + 0x0201f800, 0x00020245, 0x02000800, 0x0010482c, + 0x81468800, 0x805cb840, 0x040207fa, 0x0201f000, + 0x000202da, 0x592c0a08, 0x4807c857, 0x82040580, + 0x0000000e, 0x04000045, 0x82040580, 0x00000046, + 0x04000046, 0x82040580, 0x00000045, 0x04000020, + 0x82040580, 0x00000029, 0x04000010, 0x82040580, + 0x0000002a, 0x04000009, 0x82040580, 0x0000000f, + 0x040001fc, 0x82040580, 0x0000002e, 0x040001f9, + 0x4807c856, 0x0401f1f2, 0x59a80805, 0x84040d04, + 0x48075005, 0x0401f1f3, 0x592e8a06, 0x0201f800, + 0x00020245, 0x040201ef, 0x59340200, 0x84000518, + 0x48026a00, 0x592e6009, 0x4933c857, 0x83300580, + 0xffffffff, 0x0402002a, 0x0401f1e6, 0x592c1407, + 0x480bc857, 0x0201f800, 0x00109410, 0x411e6000, + 0x04020003, 0x4803c856, 0x0401f1d9, 0x592e3809, + 0x591c1414, 0x84081516, 0x84081554, 0x480a3c14, + 0x4a026403, 0x0000003a, 0x592c040b, 0x80000540, + 0x04000007, 0x4a026403, 0x0000003b, 0x592c020c, + 0x4802641a, 0x592c040c, 0x4802621a, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x0401f1c7, 0x59a80068, 0x84000510, + 0x48035068, 0x0401f1c3, 0x592c1207, 0x8c081500, + 0x040201c0, 0x592e8a06, 0x592e6009, 0x0201f800, + 0x0010941a, 0x04020003, 0x4803c856, 0x0401f1b4, + 0x59300c06, 0x82040580, 0x00000004, 0x04000003, + 0x4803c856, 0x0401f1ae, 0x59300a03, 0x82040580, + 0x00000007, 0x04000003, 0x4803c856, 0x0401f1a8, + 0x59300c03, 0x82040580, 0x00000001, 0x04000021, + 0x82040580, 0x00000003, 0x04000016, 0x82040580, + 0x00000006, 0x04000020, 0x82040580, 0x00000008, + 0x04000015, 0x82040580, 0x0000000a, 0x0400000a, + 0x82040580, 0x0000000c, 0x04000004, 0x82040580, + 0x0000002e, 0x04020018, 0x42000800, 0x00000009, + 0x0401f013, 0x42000800, 0x00000005, 0x0401f010, + 0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406, + 0x00000001, 0x42000800, 0x00000003, 0x0401f008, + 0x417a7800, 0x0201f800, 0x0010203c, 0x4a026406, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x0201f800, + 0x0010672b, 0x0401f17b, 0x40000800, 0x58040000, + 0x80000540, 0x040207fd, 0x492c0800, 0x1c01f000, + 0x492fc857, 0x59300c06, 0x82040580, 0x00000006, + 0x04020094, 0x0201f800, 0x001049e7, 0x04020005, + 0x59340200, 0x8c00051a, 0x02000000, 0x00020533, + 0x59340200, 0x8c00050e, 0x0400008a, 0x59300203, + 0x42027800, 0x00000001, 0x82000580, 0x00000007, + 0x02020000, 0x00020533, 0x4a026203, 0x00000002, + 0x0201f000, 0x00020533, 0x42028000, 0x00000002, + 0x4a026206, 0x00000014, 0x4d2c0000, 0x0201f800, + 0x0010a1d1, 0x5c025800, 0x59300c06, 0x4807c857, + 0x82040580, 0x00000007, 0x04020063, 0x492fc857, + 0x4a025a06, 0x00000001, 0x0201f000, 0x000202da, + 0x592c240a, 0x492fc857, 0x4813c857, 0x8c10251c, + 0x04020016, 0x8c10251a, 0x04000003, 0x8c10250a, + 0x04000069, 0x59340a00, 0x8c040d0e, 0x04000003, + 0x8c10251e, 0x04000064, 0x0201f800, 0x0002075a, + 0x0400006b, 0x592c240a, 0x49366009, 0x49325809, + 0x4a026406, 0x00000006, 0x4a026203, 0x00000007, + 0x0201f000, 0x0002052f, 0x592c0a0c, 0x5934000f, + 0x41784000, 0x80001540, 0x0400006d, 0x58080204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x04020004, 0x5808020c, 0x80040580, 0x04000004, + 0x58080000, 0x40084000, 0x0401f7f3, 0x58080000, + 0x49781000, 0x802041c0, 0x04000006, 0x48004000, + 0x80000540, 0x04020007, 0x48226810, 0x0401f005, + 0x4802680f, 0x80000540, 0x04020002, 0x497a6810, + 0x4d2c0000, 0x400a5800, 0x4a025a06, 0x00000002, + 0x0201f800, 0x000202da, 0x5c025800, 0x0401f7bc, + 0x592c040a, 0x8c00051c, 0x04000016, 0x592c0206, + 0x82000580, 0x0000ffff, 0x04020012, 0x592e6009, + 0x83300580, 0xffffffff, 0x040007b1, 0x83300480, + 0x0010d1c0, 0x04001010, 0x59a8000b, 0x81300480, + 0x0402100d, 0x59300008, 0x800001c0, 0x04020005, + 0x59300203, 0x82000580, 0x00000007, 0x04000797, + 0x492fc857, 0x4a025a06, 0x00000029, 0x0201f000, + 0x000202da, 0x492fc857, 0x4a025a06, 0x00000008, + 0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06, + 0x00000045, 0x0201f000, 0x000202da, 0x492fc857, + 0x4a025a06, 0x0000002a, 0x0201f000, 0x000202da, + 0x492fc857, 0x4a025a06, 0x00000028, 0x0201f000, + 0x000202da, 0x492fc857, 0x4a025a06, 0x00000006, + 0x0201f000, 0x000202da, 0x492fc857, 0x4a025a06, + 0x0000000e, 0x0201f000, 0x000202da, 0x59340010, + 0x492e6810, 0x492fc857, 0x80000d40, 0x04000003, + 0x492c0800, 0x1c01f000, 0x5934040b, 0x492e680f, + 0x492fc857, 0x4803c857, 0x80000540, 0x04020003, + 0x4a026a03, 0x00000001, 0x1c01f000, 0x59a8000e, + 0x81640480, 0x0402176e, 0x42026000, 0x0010d1c0, + 0x59300009, 0x81340580, 0x04020004, 0x59300202, + 0x80040580, 0x04000759, 0x83326400, 0x00000024, + 0x41580000, 0x81300480, 0x040017f6, 0x0401f760, + 0x492fc857, 0x592c0407, 0x82000c80, 0x0000199a, + 0x040215f1, 0x592c0204, 0x80000112, 0x040205de, + 0x592e8a06, 0x0201f800, 0x00020245, 0x04020059, + 0x0201f800, 0x001049e7, 0x04020059, 0x592e780a, + 0x493fc857, 0x8d3e7d3e, 0x04020007, 0x59a80021, + 0x80000540, 0x0402004f, 0x0201f800, 0x00104838, + 0x040005dd, 0x833c1d00, 0x0000001f, 0x040005da, + 0x592c0207, 0x82000c80, 0x00001000, 0x040215d6, + 0x800000c2, 0x800008c4, 0x8005d400, 0x592e9008, + 0x592e9809, 0x5934080d, 0x800409c0, 0x0402002e, + 0x833c1d00, 0x0000001f, 0x81780040, 0x80000000, + 0x800c1902, 0x040217fe, 0x040205c7, 0x0c01f001, + 0x001056e9, 0x001056ec, 0x001056f9, 0x001056fc, + 0x001056ff, 0x0201f800, 0x0010903e, 0x0401f01a, + 0x0201f800, 0x0010480b, 0x04000027, 0x80e9d1c0, + 0x02020800, 0x00105fae, 0x42028000, 0x00000005, + 0x417a9000, 0x417a9800, 0x0201f800, 0x0010904e, + 0x0401f00d, 0x42027000, 0x0000004d, 0x0401f006, + 0x42027000, 0x0000004e, 0x0401f003, 0x42027000, + 0x00000052, 0x0201f800, 0x001046c9, 0x02020800, + 0x0010907e, 0x04000010, 0x8d3e7d3e, 0x04020017, + 0x1c01f000, 0x58040002, 0x80000540, 0x04020007, + 0x4d3c0000, 0x40067800, 0x0201f800, 0x001047eb, + 0x5c027800, 0x040207cb, 0x4a025a06, 0x00000030, + 0x0401f00d, 0x4a025a06, 0x0000002c, 0x0401f00a, + 0x4a025a06, 0x00000028, 0x0401f007, 0x4a025a06, + 0x00000029, 0x0401f004, 0x497a5c09, 0x4a025a06, + 0x00000000, 0x4a025a04, 0x00000103, 0x0201f000, + 0x000202da, 0x492fc857, 0x592c0204, 0x80000110, + 0x80000040, 0x04000002, 0x0401f56f, 0x592c0207, + 0x82000500, 0x000003ff, 0x48025a07, 0x8c000506, + 0x04000004, 0x82000500, 0x00000070, 0x04020004, + 0x59a80821, 0x800409c0, 0x04020018, 0x4a025a06, + 0x0000dead, 0x592c0408, 0x82000500, 0x0000f0ff, + 0x48025c08, 0x0201f800, 0x001043b4, 0x04020002, + 0x1c01f000, 0x49425a06, 0x8058b1c0, 0x04000009, + 0x0201f800, 0x0010955f, 0x0401f80f, 0x44042800, + 0x82580580, 0x00000002, 0x04020002, 0x48082801, + 0x0201f000, 0x000202da, 0x42028000, 0x00000031, + 0x42000800, 0x00000001, 0x4200b000, 0x00000001, + 0x0401f7ed, 0x592c0408, 0x80000118, 0x832c2c00, + 0x00000009, 0x80142c00, 0x1c01f000, 0x492fc857, + 0x4a025a08, 0x00000006, 0x0201f000, 0x000202da, + 0x492fc857, 0x4a025a08, 0x00000001, 0x0201f000, + 0x000202da, 0x492fc857, 0x592c040a, 0x82000500, + 0x00000003, 0x04000020, 0x0201f800, 0x0002075a, + 0x04000021, 0x592c0204, 0x492e6008, 0x82000500, + 0x000000ff, 0x82000580, 0x00000045, 0x0400000e, + 0x592c000b, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x04020018, 0x42027000, 0x00000041, + 0x49366009, 0x4a026406, 0x00000001, 0x0201f000, + 0x000207a1, 0x59300015, 0x8400055e, 0x48026015, + 0x42026800, 0x0010b524, 0x42027000, 0x00000040, + 0x0401f7f4, 0x4a025a06, 0x00000101, 0x0201f000, + 0x000202da, 0x4a025a06, 0x0000002c, 0x0201f000, + 0x000202da, 0x4a025a06, 0x00000028, 0x0201f800, + 0x000202da, 0x0201f000, 0x0002077d, 0x492fc857, + 0x0201f800, 0x001062e1, 0x0400000b, 0x592c0204, + 0x80000110, 0x80000040, 0x040204fb, 0x592c0c06, + 0x800409c0, 0x04000009, 0x42000000, 0x00000102, + 0x0401f003, 0x42000000, 0x00000104, 0x48025a06, + 0x0201f000, 0x000202da, 0x592c0c07, 0x800409c0, + 0x04000024, 0x82040480, 0x00000005, 0x04021021, + 0x4c040000, 0x80040800, 0x0201f800, 0x00106306, + 0x5c001000, 0x04020018, 0x832c0400, 0x00000008, + 0x4000a000, 0x0201f800, 0x0010632f, 0x04020012, + 0x592c1207, 0x82cc0580, 0x0010b50e, 0x04020009, + 0x58c80c0b, 0x84040d00, 0x84040d02, 0x8c081500, + 0x04000002, 0x84040d5e, 0x4805940b, 0x0401f001, + 0x42000000, 0x00000000, 0x48025a06, 0x0201f000, + 0x000202da, 0x42000000, 0x00000103, 0x0401f7fb, + 0x42000000, 0x00000102, 0x0401f7f8, 0x492fc857, + 0x592e7c06, 0x833c0500, 0xfffffffe, 0x04020043, + 0x592c4007, 0x42026000, 0x0010d1c0, 0x41581800, + 0x400c0000, 0x81300480, 0x04021023, 0x59300203, + 0x82000580, 0x00000000, 0x04000007, 0x59300008, + 0x80000d40, 0x04000004, 0x58040005, 0x80200580, + 0x04000004, 0x83326400, 0x00000024, 0x0401f7f1, + 0x58040204, 0x82000500, 0x000000ff, 0x82000d80, + 0x00000053, 0x04000007, 0x82000d80, 0x00000048, + 0x04000004, 0x82000580, 0x00000018, 0x04020023, + 0x4d2c0000, 0x0201f800, 0x00108be3, 0x5c025800, + 0x0400001e, 0x4a025a06, 0x00000000, 0x0201f000, + 0x000202da, 0x592e8a06, 0x83440480, 0x000007f0, + 0x04021016, 0x83440400, 0x0010ac00, 0x50000000, + 0x80026d40, 0x04000011, 0x4d2c0000, 0x0201f800, + 0x001047cb, 0x0400000c, 0x42028000, 0x00000005, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x001091cc, 0x0201f800, 0x000202da, 0x5c025800, + 0x0401f7e5, 0x5c025800, 0x4a025a06, 0x00000031, + 0x0201f000, 0x000202da, 0x492fc857, 0x4d2c0000, + 0x0201f800, 0x001007e4, 0x04000016, 0x492fc857, + 0x412f4000, 0x0201f800, 0x001007e4, 0x0400000e, + 0x492fc857, 0x412dd800, 0x0201f800, 0x00103b28, + 0x0201f800, 0x00103b32, 0x49a1d80b, 0x5c025800, + 0x492dd80a, 0x0201f800, 0x00102214, 0x0201f000, + 0x00102233, 0x41a25800, 0x0201f800, 0x001007f4, + 0x5c025800, 0x4a025a06, 0x00004005, 0x4a025c06, + 0x00000002, 0x0201f000, 0x000202da, 0x4807c857, + 0x485fc857, 0x4200b800, 0x00000001, 0x5c000800, + 0x4c5c0000, 0x0401f005, 0x4807c857, 0x485fc857, + 0x5c000800, 0x4d780000, 0x4803c857, 0x492fc857, + 0x8c00050e, 0x02020800, 0x001005d0, 0x4203e000, + 0x50000000, 0x4200b800, 0x00008003, 0x0201f000, + 0x001005dd, 0x592c0204, 0x80000110, 0x80000040, + 0x04020441, 0x0201f800, 0x00104a34, 0x04020002, + 0x1c01f000, 0x49425a06, 0x4806580d, 0x480a580e, + 0x4943c857, 0x4807c857, 0x480bc857, 0x0201f000, + 0x000202da, 0x592c0204, 0x80000110, 0x80000040, + 0x04020431, 0x0201f800, 0x00104b8b, 0x04020002, + 0x1c01f000, 0x49425a06, 0x48065811, 0x480a5812, + 0x0201f000, 0x000202da, 0x592c0204, 0x80000110, + 0x04000425, 0x80000040, 0x0402000c, 0x4202e000, + 0x00000001, 0x592c020a, 0x8c000504, 0x02000000, + 0x000204d0, 0x592c0207, 0x82000c80, 0x00001001, + 0x04021429, 0x0401f009, 0x4202e000, 0x00000003, + 0x48033002, 0x492f3003, 0x492f3004, 0x4a033008, + 0x000204d0, 0x1c01f000, 0x4202e000, 0x00000002, + 0x42000000, 0x0010beda, 0x50007000, 0x492c700b, + 0x4978700e, 0x4978700c, 0x592c0011, 0x592c0812, + 0x48007007, 0x48047008, 0x592c1013, 0x82080500, + 0xffff0000, 0x04000003, 0x0201f800, 0x001005d8, + 0x4978700d, 0x82080480, 0x00000180, 0x4803c857, + 0x04001007, 0x4800700f, 0x4a007005, 0x00000180, + 0x4a007004, 0x00000060, 0x0401f005, 0x4978700f, + 0x48087005, 0x80081104, 0x48087004, 0x5838000a, + 0x48007003, 0x40381000, 0x0201f000, 0x00100858, + 0x0201f800, 0x001007d3, 0x04000003, 0x59980007, + 0x0801f000, 0x1c01f000, 0x40307000, 0x5838000b, + 0x80025d40, 0x0400001b, 0x58380002, 0x82000580, + 0x00000100, 0x0400001d, 0x4c380000, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000012, + 0x0400000b, 0x592c0208, 0x8400054e, 0x48025a08, + 0x4a025a06, 0x00000002, 0x4a025a04, 0x00000103, + 0x0201f800, 0x000202c1, 0x0401f005, 0x4a025a06, + 0x00000010, 0x0201f800, 0x000202da, 0x5c007000, + 0x4202e000, 0x00000001, 0x4a007002, 0x00000100, + 0x49787010, 0x1c01f000, 0x58380004, 0x82000480, + 0x00000003, 0x04000087, 0x58380010, 0x8c000500, + 0x04020019, 0x4200b000, 0x00000003, 0x832cac00, + 0x00000011, 0x5838000a, 0x5838100d, 0x8008a400, + 0x4c380000, 0x0201f800, 0x0010ab17, 0x5c007000, + 0x5838000d, 0x82000400, 0x00000003, 0x4800700d, + 0x4a007010, 0x00000001, 0x58380004, 0x82000480, + 0x00000003, 0x48007004, 0x82000580, 0x00000003, + 0x0400006c, 0x5838000e, 0x80001d40, 0x04020020, + 0x4c380000, 0x0201f800, 0x001007d3, 0x5c007000, + 0x04000010, 0x4a025a04, 0x0000010a, 0x42001800, + 0x00000005, 0x480c700e, 0x5838000c, 0x80000540, + 0x04020002, 0x5838000b, 0x40000800, 0x492c0801, + 0x492c700c, 0x42000800, 0x0000000f, 0x0401f011, + 0x4202e000, 0x00000008, 0x4a033007, 0x00105915, + 0x1c01f000, 0x4202e000, 0x00000002, 0x42000000, + 0x0010beda, 0x50007000, 0x0401f7e7, 0x583a580c, + 0x400c0000, 0x42000800, 0x00000014, 0x80040c80, + 0x58381004, 0x5838000f, 0x41783000, 0x80000540, + 0x04020005, 0x84183540, 0x82081480, 0x00000003, + 0x0400003c, 0x40080000, 0x80040480, 0x04001002, + 0x40080800, 0x4004b000, 0x412c0000, 0x800c0400, + 0x4000a800, 0x5838000a, 0x5838100d, 0x8008a400, + 0x4c080000, 0x4c040000, 0x4c0c0000, 0x4c380000, + 0x0201f800, 0x0010ab17, 0x5c007000, 0x5c001800, + 0x5c000800, 0x40040000, 0x58381004, 0x80080480, + 0x48007004, 0x82000580, 0x00000003, 0x04000002, + 0x84183500, 0x5c000000, 0x80041400, 0x82080480, + 0x00000060, 0x04020003, 0x84183542, 0x41781000, + 0x400c0000, 0x80041c00, 0x820c0480, 0x00000014, + 0x04020003, 0x84183544, 0x40001800, 0x40080800, + 0x4804700d, 0x480c700e, 0x40180000, 0x0c01f001, + 0x00105960, 0x00105964, 0x00105962, 0x00105960, + 0x001058fc, 0x00105964, 0x00105962, 0x00105960, + 0x0201f800, 0x001005d8, 0x5838100f, 0x0401f739, + 0x5838080d, 0x82040400, 0x00000002, 0x5838100a, + 0x80080400, 0x50001000, 0x800811c0, 0x0402000f, + 0x4202e000, 0x00000001, 0x583a580b, 0x4978700b, + 0x49787010, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000012, 0x02000000, 0x00020507, + 0x0201f000, 0x000204d0, 0x5838000a, 0x80040c00, + 0x82381c00, 0x00000007, 0x54041800, 0x80040800, + 0x800c1800, 0x54041800, 0x0401f71a, 0x0201f800, + 0x001007d3, 0x02000800, 0x001005d8, 0x4a02580a, + 0x0010be79, 0x42000800, 0x0010beda, 0x452c0800, + 0x497a580b, 0x497a580c, 0x497a580d, 0x497a580e, + 0x497a580f, 0x4a025809, 0x001058b6, 0x497a5810, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000001, + 0x1c01f000, 0x59c80007, 0x8c000502, 0x04000070, + 0x835c2c80, 0x00000005, 0x02001000, 0x00105f23, + 0x59c82817, 0x497b9005, 0x82140500, 0x00e00000, + 0x0402004f, 0x82140500, 0x000003ff, 0x82001c00, + 0x00000006, 0x41cc2000, 0x42003000, 0x00006080, + 0x820c0480, 0x00000040, 0x04001006, 0x42001000, + 0x00000040, 0x820c1c80, 0x00000040, 0x0401f003, + 0x400c1000, 0x41781800, 0x54182000, 0x80102000, + 0x80183000, 0x80081040, 0x040207fc, 0x800c19c0, + 0x04000005, 0x59c80005, 0x80000000, 0x48039005, + 0x0401f7ea, 0x82140500, 0x01f60000, 0x04020029, + 0x82140500, 0x0000f000, 0x0400000b, 0x82000c80, + 0x00002000, 0x0402100f, 0x82140500, 0x0e000000, + 0x80000132, 0x0c01f840, 0x4a039005, 0x00000140, + 0x1c01f000, 0x59cc0400, 0x82000500, 0x0000ff00, + 0x82000580, 0x00008100, 0x040007f4, 0x0401f01c, + 0x4817c857, 0x82140500, 0x000003ff, 0x04020007, + 0x59cc0400, 0x82000500, 0x0000ff00, 0x82000580, + 0x00008100, 0x04020012, 0x42000000, 0x0010b8bd, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00105dfa, + 0x4803c856, 0x4a039005, 0x00000140, 0x0401f020, + 0x4817c857, 0x82140500, 0x00f60000, 0x04020004, + 0x0201f800, 0x00105e35, 0x040207d2, 0x0201f800, + 0x0010513b, 0x04000010, 0x59c400a4, 0x4803c857, + 0x82000500, 0x0000000f, 0x82000580, 0x0000000a, + 0x04020009, 0x497b5016, 0x59c400a3, 0x82000540, + 0x00080000, 0x480388a3, 0x82000500, 0xfff7ffff, + 0x480388a3, 0x4817c856, 0x0201f800, 0x0010a978, + 0x4a039005, 0x00000140, 0x0401f842, 0x4803c856, + 0x1c01f000, 0x00105a1d, 0x00105cf4, 0x00105a15, + 0x00105a15, 0x00105a15, 0x00105a15, 0x00105a15, + 0x00105a15, 0x4803c857, 0x42000000, 0x0010b85a, + 0x0201f800, 0x0010aa47, 0x4a039005, 0x00000140, + 0x1c01f000, 0x4817c857, 0x59cc0400, 0x4803c857, + 0x82000d00, 0x0000ff00, 0x82041500, 0x0000f000, + 0x840409c0, 0x82140500, 0x000003ff, 0x800018c4, + 0x8c142d14, 0x04000005, 0x59cc0002, 0x82000500, + 0x00000003, 0x800c1c80, 0x480f5016, 0x82080580, + 0x00002000, 0x04020011, 0x836c0580, 0x00000001, + 0x0402000c, 0x59cc0006, 0x82000500, 0xff000000, + 0x82000580, 0x11000000, 0x04020011, 0x0201f800, + 0x00103b38, 0x0201f800, 0x00105f48, 0x0401f00c, + 0x0401f81f, 0x0401f00a, 0x82080580, 0x00003000, + 0x04020003, 0x0401fa06, 0x0401f005, 0x82080580, + 0x00008000, 0x04020002, 0x0401fafc, 0x1c01f000, + 0x4817c857, 0x42000000, 0x0010b859, 0x0201f800, + 0x0010aa47, 0x836c0580, 0x00000003, 0x0402000b, + 0x4c080000, 0x4c0c0000, 0x42001000, 0x00008048, + 0x40141800, 0x80142120, 0x0201f800, 0x00103a3e, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4807c857, + 0x59cc0002, 0x82000500, 0xff000000, 0x82001580, + 0x01000000, 0x04000004, 0x82001580, 0x23000000, + 0x04020192, 0x82040580, 0x00000023, 0x0402003f, + 0x0401fb6a, 0x0400018d, 0x59300c06, 0x82040580, + 0x00000010, 0x04000013, 0x82040580, 0x00000011, + 0x04000010, 0x82040580, 0x00000001, 0x0400000d, + 0x82040580, 0x00000004, 0x0400000a, 0x82040580, + 0x00000008, 0x04000007, 0x82040580, 0x0000000a, + 0x04000004, 0x4933c857, 0x4807c857, 0x0401f177, + 0x59300004, 0x82000500, 0x80010000, 0x04000004, + 0x0201f800, 0x00106f60, 0x04020170, 0x59cc0a04, + 0x48066202, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020005, 0x42027000, + 0x00000015, 0x0201f000, 0x000207a1, 0x82000d80, + 0x02140000, 0x040007fa, 0x82000d80, 0x02100000, + 0x040007f7, 0x82000d80, 0x02100000, 0x040007f4, + 0x82000d80, 0x01000000, 0x04020158, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x04020154, 0x42027000, + 0x00000016, 0x0401f7ec, 0x82040580, 0x00000022, + 0x0402014e, 0x59a80806, 0x8c040d14, 0x04000011, + 0x0401f967, 0x0402000f, 0x0401f97d, 0x0400000d, + 0x42027000, 0x0000004c, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x0201f800, 0x00105eec, 0x0400012a, + 0x42028800, 0x0000ffff, 0x417a6800, 0x0401f126, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x03000000, 0x04020021, 0x59a80026, 0x8c000508, + 0x04000017, 0x8400054c, 0x48035026, 0x59cc0800, + 0x82040d00, 0x00ffffff, 0x48075010, 0x497b8830, + 0x84040d70, 0x48078832, 0x59c40802, 0x84040d4c, + 0x48078802, 0x59cc0007, 0x82000500, 0x0000ffff, + 0x48038893, 0x4803501e, 0x42000800, 0x00000003, + 0x59a81010, 0x0201f800, 0x00106c78, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x04020118, 0x42027000, + 0x00000017, 0x0401f0d9, 0x82000d80, 0x04000000, + 0x04020011, 0x59cc0006, 0x82000500, 0x0000ffff, + 0x0402010e, 0x0201f800, 0x0010513b, 0x04000004, + 0x42027000, 0x0000001d, 0x0401f0cc, 0x59a80026, + 0x84000548, 0x48035026, 0x42027000, 0x00000030, + 0x0401f0c6, 0x82000d80, 0x05000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200fb, + 0x42027000, 0x00000018, 0x0401f0bc, 0x82000d80, + 0x20100000, 0x04020004, 0x42027000, 0x00000019, + 0x0401f0b6, 0x82000d80, 0x21100000, 0x04020004, + 0x42027000, 0x0000001a, 0x0401f0b0, 0x82000d80, + 0x52000000, 0x04020008, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x040200e5, 0x42027000, 0x0000001b, + 0x0401f0a6, 0x82000d80, 0x50000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200db, + 0x42027000, 0x0000001c, 0x0401f09c, 0x82000d80, + 0x13000000, 0x04020004, 0x42027000, 0x00000034, + 0x0401f096, 0x82000d80, 0x12000000, 0x04020008, + 0x59cc0006, 0x82000500, 0x0000ffff, 0x040200cb, + 0x42027000, 0x00000024, 0x0401f08c, 0x82000d00, + 0xff000000, 0x82040d80, 0x24000000, 0x04020004, + 0x42027000, 0x0000002d, 0x0401f084, 0x82000d00, + 0xff000000, 0x82040d80, 0x53000000, 0x04020004, + 0x42027000, 0x0000002a, 0x0401f07c, 0x82000d80, + 0x0f000000, 0x04020004, 0x42027000, 0x00000020, + 0x0401f076, 0x82000d80, 0x61040000, 0x04020036, + 0x83cc1400, 0x00000006, 0x80080800, 0x50080000, + 0x82000500, 0x0000ffff, 0x82000480, 0x00000004, + 0x4c580000, 0x8000b104, 0x8058b1c0, 0x04000026, + 0x4c100000, 0x50041800, 0x820c1500, 0x03000000, + 0x80081130, 0x42000000, 0x0010b817, 0x82082580, + 0x00000000, 0x04020004, 0x42000000, 0x0010b814, + 0x0401f00c, 0x82082580, 0x00000001, 0x04020004, + 0x42000000, 0x0010b815, 0x0401f006, 0x82082580, + 0x00000002, 0x04020003, 0x42000000, 0x0010b816, + 0x0201f800, 0x0010aa47, 0x42001000, 0x00008015, + 0x820c2500, 0x0000ffff, 0x800c1920, 0x0201f800, + 0x00103a3e, 0x5c002000, 0x80040800, 0x8058b040, + 0x040207da, 0x5c00b000, 0x42027000, 0x00000023, + 0x0401f03e, 0x82000d80, 0x60000000, 0x04020004, + 0x42027000, 0x0000003f, 0x0401f038, 0x82000d80, + 0x54000000, 0x04020006, 0x0401fb12, 0x0402006f, + 0x42027000, 0x00000046, 0x0401f030, 0x82000d80, + 0x55000000, 0x04020009, 0x0401fb32, 0x04020004, + 0x42027000, 0x00000041, 0x0401f028, 0x42027000, + 0x00000042, 0x0401f025, 0x82000d80, 0x78000000, + 0x04020004, 0x42027000, 0x00000045, 0x0401f01f, + 0x82000d80, 0x10000000, 0x04020004, 0x42027000, + 0x0000004e, 0x0401f019, 0x82000d80, 0x63000000, + 0x04020004, 0x42027000, 0x0000004a, 0x0401f013, + 0x82000d00, 0xff000000, 0x82040d80, 0x56000000, + 0x04020004, 0x42027000, 0x0000004f, 0x0401f00b, + 0x82000d00, 0xff000000, 0x82040d80, 0x57000000, + 0x04020004, 0x42027000, 0x00000050, 0x0401f003, + 0x42027000, 0x0000001d, 0x59cc3800, 0x821c3d00, + 0x00ffffff, 0x821c0580, 0x00fffffe, 0x59cc0001, + 0x04020005, 0x40003000, 0x42028800, 0x000007fe, + 0x0401f003, 0x0401f8d1, 0x04020030, 0x0201f800, + 0x001045a6, 0x0402002d, 0x83380580, 0x00000046, + 0x04020004, 0x59a80010, 0x80180580, 0x04000027, + 0x59340200, 0x8c000514, 0x0400000f, 0x83380580, + 0x00000030, 0x0400000c, 0x83380580, 0x0000003f, + 0x04000009, 0x83380580, 0x00000034, 0x04000006, + 0x83380580, 0x00000024, 0x04000003, 0x42027000, + 0x0000004c, 0x0201f800, 0x0002075a, 0x04000018, + 0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04, + 0x48066202, 0x83380580, 0x0000004c, 0x04020009, + 0x4a026406, 0x00000011, 0x813669c0, 0x04020005, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x4802601e, + 0x0201f000, 0x000207a1, 0x59880052, 0x4803c857, + 0x80000000, 0x48031052, 0x1c01f000, 0x42001000, + 0x00008049, 0x59cc1806, 0x800c1930, 0x0201f800, + 0x00103a3e, 0x0201f800, 0x00107942, 0x040007f3, + 0x49366009, 0x4a026406, 0x00000004, 0x59cc0c04, + 0x48066202, 0x4a026403, 0x00000009, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00002900, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x59a80026, + 0x4803c857, 0x8c000508, 0x04000010, 0x59cc0006, + 0x82000500, 0xff000000, 0x82000d80, 0x03000000, + 0x0400000c, 0x82000d80, 0x20000000, 0x04000009, + 0x82000d80, 0x05000000, 0x04000006, 0x82000d80, + 0x21000000, 0x04000003, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x59cc2006, + 0x82102500, 0xff000000, 0x9c1021c0, 0x0401f807, + 0x820c1c00, 0x0010b4e3, 0x500c1800, 0x800c0500, + 0x4803c857, 0x1c01f000, 0x40100800, 0x41781800, + 0x82040480, 0x00000020, 0x04001004, 0x800c1800, + 0x40000800, 0x0401f7fb, 0x82040500, 0x0000000f, + 0x82000400, 0x0010ab38, 0x50000000, 0x8c040d08, + 0x04000002, 0x900001c0, 0x1c01f000, 0x4803c856, + 0x0401fac3, 0x0402000a, 0x0201f800, 0x0010210a, + 0x04020007, 0x59cc0002, 0x82000500, 0xff000000, + 0x82000d80, 0x08000000, 0x04000802, 0x1c01f000, + 0x4803c856, 0x59cc0400, 0x82000d00, 0x0000ff00, + 0x840409c0, 0x82040580, 0x00000033, 0x0402001f, + 0x0401f976, 0x04000038, 0x59cc0a04, 0x48066202, + 0x59cc0006, 0x4803c857, 0x82000500, 0xffff0000, + 0x82000d80, 0x02000000, 0x04020009, 0x59cc0006, + 0x82000500, 0x0000ffff, 0x0402002b, 0x42027000, + 0x00000015, 0x0201f000, 0x000207a1, 0x82000d80, + 0x01000000, 0x04020024, 0x59cc0006, 0x82000500, + 0x0000ffff, 0x04020020, 0x42027000, 0x00000016, + 0x0201f000, 0x000207a1, 0x82040580, 0x00000032, + 0x04020019, 0x59cc0006, 0x82000500, 0xffff0000, + 0x82000d80, 0x14000000, 0x04020013, 0x42027000, + 0x00000038, 0x59cc0001, 0x0401f810, 0x0402000e, + 0x0201f800, 0x001045a6, 0x0402000b, 0x0201f800, + 0x0002075a, 0x04000008, 0x49366009, 0x4a026406, + 0x00000004, 0x59cc0c04, 0x48066202, 0x0201f000, + 0x000207a1, 0x1c01f000, 0x4803c857, 0x4c580000, + 0x4c100000, 0x4c380000, 0x4c340000, 0x82003500, + 0x00ffffff, 0x82181500, 0x00ff0000, 0x82081580, + 0x00ff0000, 0x04020016, 0x82181480, 0x00fffffc, + 0x04001013, 0x82181580, 0x00fffffd, 0x04020004, + 0x42028800, 0x000007fd, 0x0401f040, 0x82181580, + 0x00fffffe, 0x04020004, 0x42028800, 0x000007fe, + 0x0401f03a, 0x82181580, 0x00fffffc, 0x04020004, + 0x42028800, 0x000007fc, 0x0401f034, 0x41781000, + 0x42002000, 0x00000000, 0x4200b000, 0x000007f0, + 0x41ac7000, 0x50380000, 0x80006d40, 0x04020005, + 0x800811c0, 0x0402001e, 0x8410155e, 0x0401f01c, + 0x58340212, 0x82000500, 0x0000ff00, 0x04000011, + 0x59a84010, 0x82204500, 0x00ffff00, 0x82180500, + 0x00ffff00, 0x04000002, 0x80200580, 0x58340002, + 0x0402000f, 0x82000500, 0x000000ff, 0x82184500, + 0x000000ff, 0x80204580, 0x04020009, 0x0401f006, + 0x58340002, 0x82000500, 0x00ffffff, 0x80184580, + 0x04020003, 0x40128800, 0x0401f00c, 0x80102000, + 0x80387000, 0x8058b040, 0x040207db, 0x800811c0, + 0x04020005, 0x481bc857, 0x82000540, 0x00000001, + 0x0401f003, 0x840a8d1e, 0x80000580, 0x5c006800, + 0x5c007000, 0x5c002000, 0x5c00b000, 0x1c01f000, + 0x59a80026, 0x8c00050e, 0x04000003, 0x8c000502, + 0x04000006, 0x59cc0c00, 0x80040910, 0x82040500, + 0x0000000f, 0x0c01f002, 0x1c01f000, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105de5, 0x00105d0f, + 0x00105d11, 0x00105d29, 0x00105d2c, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105d0f, 0x00105d0f, + 0x00105d0f, 0x00105d0f, 0x00105d0f, 0x4803c856, + 0x1c01f000, 0x0401f8c5, 0x04000014, 0x82140500, + 0x000003ff, 0x800000c4, 0x82000480, 0x00000008, + 0x0400100e, 0x59cc0001, 0x59326809, 0x59340802, + 0x80040580, 0x82000500, 0x00ffffff, 0x04020007, + 0x59cc0a04, 0x48066202, 0x42027000, 0x00000046, + 0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857, + 0x1c01f000, 0x59cc0004, 0x4803c857, 0x1c01f000, + 0x0401f8aa, 0x04000016, 0x82140500, 0x000003ff, + 0x800000c4, 0x82000480, 0x0000000c, 0x04001010, + 0x59cc0001, 0x82000500, 0x00ffffff, 0x59326809, + 0x59340802, 0x82040d00, 0x00ffffff, 0x80040580, + 0x04020007, 0x59cc0a04, 0x48066202, 0x42027000, + 0x00000045, 0x0201f000, 0x000207a1, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x4817c857, 0x0401f9c8, + 0x04020011, 0x0201f800, 0x0010210a, 0x0402000e, + 0x59cc0002, 0x82000500, 0xff000000, 0x82000580, + 0x00000000, 0x04020008, 0x82040500, 0x0000000f, + 0x82000c80, 0x00000006, 0x04021003, 0x4803c857, + 0x0c01f002, 0x1c01f000, 0x00105d60, 0x00105d64, + 0x00105d60, 0x00105d60, 0x00105db2, 0x00105dc3, + 0x4803c857, 0x59cc0004, 0x4803c857, 0x1c01f000, + 0x59cc0004, 0x4803c857, 0x59a80016, 0x800001c0, + 0x040207f8, 0x59cc0802, 0x8c040d2e, 0x0402001d, + 0x0201f800, 0x00107942, 0x02000800, 0x001005d8, + 0x59cc0001, 0x4803c857, 0x0401ff28, 0x0402000d, + 0x0201f800, 0x00020245, 0x0402000a, 0x4a026406, + 0x00000005, 0x49366009, 0x59cc0c04, 0x48066202, + 0x42027000, 0x00000088, 0x0201f000, 0x000207a1, + 0x42028800, 0x0000ffff, 0x417a6800, 0x59cc0001, + 0x82000500, 0x00ffffff, 0x4802601e, 0x0401f7f0, + 0x59cc0001, 0x4803c857, 0x0401ff10, 0x040207d5, + 0x0201f800, 0x001045a6, 0x040207d2, 0x59cc0005, + 0x8c000500, 0x04020004, 0x59340200, 0x8c00050e, + 0x040207cc, 0x0201f800, 0x001049f3, 0x0402000f, + 0x0401f83e, 0x040007c7, 0x0201f800, 0x0002075a, + 0x040007c4, 0x49366009, 0x4a026406, 0x00000002, + 0x59cc0c04, 0x48066202, 0x42027000, 0x00000088, + 0x0201f000, 0x000207a1, 0x0201f800, 0x0002075a, + 0x040007b8, 0x49366009, 0x4a026406, 0x00000004, + 0x59cc0c04, 0x48066202, 0x42027000, 0x00000001, + 0x0201f000, 0x000207a1, 0x59cc0004, 0x4803c857, + 0x59cc0802, 0x8c040d2e, 0x0400000b, 0x0401f81f, + 0x04000009, 0x0401f960, 0x04020007, 0x59cc0a04, + 0x48066202, 0x42027000, 0x00000089, 0x0201f000, + 0x000207a1, 0x4933c857, 0x1c01f000, 0x59cc0004, + 0x4803c857, 0x59cc0802, 0x8c040d2e, 0x0400000b, + 0x0401f80e, 0x04000009, 0x0401f94f, 0x04020007, + 0x59cc0a04, 0x48066202, 0x42027000, 0x0000008a, + 0x0201f000, 0x000207a1, 0x4933c857, 0x1c01f000, + 0x59cc0a04, 0x0401f002, 0x59cc0c04, 0x59a8000e, + 0x59a81067, 0x80080400, 0x80040480, 0x04021008, + 0x40040000, 0x800000c4, 0x800408ca, 0x80040c00, + 0x82066400, 0x0010d1c0, 0x1c01f000, 0x80000580, + 0x0401f7fe, 0x59cc0802, 0x8c040d2e, 0x04020010, + 0x0401ffec, 0x0400000e, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59326809, 0x59340802, 0x82040d00, + 0x00ffffff, 0x80040580, 0x04020005, 0x42027000, + 0x00000051, 0x0201f000, 0x000207a1, 0x59cc0004, + 0x4803c857, 0x1c01f000, 0x4803c856, 0x42003000, + 0x00000105, 0x0401f001, 0x4803c856, 0x4c3c0000, + 0x41cc7800, 0x0401f803, 0x5c007800, 0x1c01f000, + 0x4803c856, 0x4c580000, 0x583c0400, 0x82000500, + 0x0000f000, 0x82000580, 0x0000c000, 0x04000024, + 0x0201f800, 0x0002075a, 0x04000021, 0x4c180000, + 0x583c0001, 0x0401fe89, 0x0402001f, 0x0201f800, + 0x001045a6, 0x0402001c, 0x49366009, 0x0201f800, + 0x001007e4, 0x04000018, 0x492e6017, 0x497a5800, + 0x497a5a04, 0x48125c04, 0x832cac00, 0x00000005, + 0x4200b000, 0x00000007, 0x403ca000, 0x0201f800, + 0x0010ab17, 0x5c003000, 0x481a641a, 0x4a026403, + 0x0000003e, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x0201f800, 0x0010672b, 0x5c00b000, + 0x1c01f000, 0x0201f800, 0x0002077d, 0x5c003000, + 0x0401f7fb, 0x4803c856, 0x59cc0400, 0x82000d00, + 0x0000ff00, 0x82040500, 0x0000f000, 0x840409c0, + 0x82000580, 0x00002000, 0x04020049, 0x82040580, + 0x00000022, 0x0402003a, 0x59c400a4, 0x82000500, + 0x0000000f, 0x82000c80, 0x00000007, 0x04001004, + 0x82000480, 0x0000000c, 0x0400103f, 0x59cc0006, + 0x82000500, 0xffff0000, 0x82000d80, 0x04000000, + 0x04000039, 0x82000d80, 0x60000000, 0x04000036, + 0x82000d80, 0x54000000, 0x04000033, 0x82000d80, + 0x03000000, 0x04020015, 0x59a80826, 0x8c040d02, + 0x0402002d, 0x8c040d08, 0x0402002b, 0x0201f800, + 0x001048ec, 0x0400002b, 0x59a8001d, 0x800000d0, + 0x59a80810, 0x82040d00, 0x000000ff, 0x80040540, + 0x59cc0800, 0x82040d00, 0x00ffffff, 0x80040580, + 0x0402001b, 0x0401f01c, 0x59c40802, 0x8c040d0c, + 0x04020017, 0x82000d80, 0x52000000, 0x040007ec, + 0x82000d80, 0x05000000, 0x040007e9, 0x82000d80, + 0x50000000, 0x040007e6, 0x0401f00d, 0x82040580, + 0x00000023, 0x0402000a, 0x0401ff58, 0x04000008, + 0x59300c03, 0x82040580, 0x00000002, 0x04000006, + 0x82040580, 0x00000051, 0x04000003, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x1c01f000, + 0x59cc0006, 0x82000500, 0xffff0000, 0x82000d80, + 0x03000000, 0x04000004, 0x82000d80, 0x52000000, + 0x040207f3, 0x59a80026, 0x82000500, 0x00000009, + 0x82000580, 0x00000008, 0x040007ef, 0x0401f7ec, + 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016, + 0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807, + 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, + 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x0000000d, 0x0201f800, + 0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, + 0x83cc1400, 0x0000000f, 0x0201f800, 0x0010855a, + 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4c5c0000, 0x4c580000, 0x59a80016, + 0x82000580, 0x0000004c, 0x0402001f, 0x59ccb807, + 0x9c5cb9c0, 0x825cbd00, 0x00000007, 0x8c5cbd00, + 0x0400000a, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83cc1400, 0x00000009, 0x0201f800, + 0x0010855a, 0x04020010, 0x8c5cbd02, 0x0400000a, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000000, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x04020005, 0x8c5cbd04, 0x04000003, 0x82000540, + 0x00000001, 0x5c00b000, 0x5c00b800, 0x1c01f000, + 0x4803c857, 0x4c580000, 0x40003000, 0x42002000, + 0x000007f0, 0x4200b000, 0x00000010, 0x83ac7400, + 0x000007f0, 0x50380000, 0x80026d40, 0x04000006, + 0x59340002, 0x82000500, 0x00ffffff, 0x80180580, + 0x04000010, 0x80102000, 0x80387000, 0x8058b040, + 0x040207f5, 0x82100480, 0x00000800, 0x42002000, + 0x00000000, 0x4200b000, 0x000007f0, 0x41ac7000, + 0x040217ed, 0x82000540, 0x00000001, 0x0401f002, + 0x40128800, 0x5c00b000, 0x1c01f000, 0x59a80026, + 0x8c00050e, 0x04000004, 0x8c000502, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x59300c06, 0x82040580, 0x00000002, + 0x04000006, 0x82040580, 0x00000005, 0x04000003, + 0x82000540, 0x00000001, 0x1c01f000, 0x59c80000, + 0x84000558, 0x84000512, 0x48039000, 0x1c01f000, + 0x4a03281a, 0x000003e8, 0x4a032802, 0x0010d1c0, + 0x4a032800, 0x00000000, 0x4a032808, 0x00107049, + 0x42000000, 0x00000005, 0x83947c00, 0x00000009, + 0x49787801, 0x4a007802, 0x00106fff, 0x823c7c00, + 0x00000003, 0x80000040, 0x040207fa, 0x4a032819, + 0xffff0000, 0x4201d000, 0x00000064, 0x0401f96e, + 0x4201d000, 0x000186a0, 0x0401f184, 0x00000000, + 0x00000003, 0x00000006, 0x00000009, 0x0000000c, + 0x4d300000, 0x4d2c0000, 0x4d340000, 0x4d400000, + 0x4cfc0000, 0x4d380000, 0x4d3c0000, 0x4d440000, + 0x4d4c0000, 0x4d480000, 0x4c5c0000, 0x4c600000, + 0x4c640000, 0x4cc80000, 0x4ccc0000, 0x0201f800, + 0x0002057b, 0x5c019800, 0x5c019000, 0x5c00c800, + 0x5c00c000, 0x5c00b800, 0x5c029000, 0x5c029800, + 0x5c028800, 0x5c027800, 0x5c027000, 0x5c01f800, + 0x5c028000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x59940004, 0x80000540, 0x0402000a, + 0x59940025, 0x80040400, 0x02001800, 0x001005d8, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x80000580, 0x1c01f000, 0x5994001f, 0x80000540, + 0x0402000a, 0x59940025, 0x80040400, 0x02001800, + 0x001005d8, 0x4803281f, 0x480b2820, 0x4a03281e, + 0x00000001, 0x80000580, 0x1c01f000, 0x59940022, + 0x80000540, 0x0402000a, 0x59940025, 0x80040400, + 0x02001800, 0x001005d8, 0x48032822, 0x480b2823, + 0x4a032821, 0x0000000a, 0x80000580, 0x1c01f000, + 0x4c000000, 0x59940005, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x497b2804, 0x497b2805, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59940020, + 0x4803c857, 0x480bc857, 0x80080580, 0x04020003, + 0x497b281f, 0x497b2820, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59940023, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x497b2822, 0x497b2823, + 0x5c000000, 0x1c01f000, 0x4937c857, 0x48ebc857, + 0x59340203, 0x80e80480, 0x04001002, 0x48ea6a03, + 0x1c01f000, 0x5c03e000, 0x1c01f000, 0x4d440000, + 0x42007800, 0x00000010, 0x59968801, 0x0201f800, + 0x00020245, 0x04020012, 0x59341a03, 0x800c1840, + 0x0400100f, 0x59940027, 0x800c0480, 0x04000003, + 0x48026a03, 0x0402100a, 0x5934000f, 0x497a6a03, + 0x80000540, 0x04000006, 0x4c3c0000, 0x5934140b, + 0x0201f800, 0x00020253, 0x5c007800, 0x81468800, + 0x83440480, 0x00000800, 0x04021007, 0x803c7840, + 0x040207e7, 0x49472801, 0x5c028800, 0x5c03e000, + 0x1c01f000, 0x4a032800, 0x00000002, 0x497b2801, + 0x0401f7fa, 0x42007800, 0x00000010, 0x59966002, + 0x59300205, 0x80000d40, 0x04000006, 0x59940027, + 0x80040480, 0x48026205, 0x0400102d, 0x0400002c, + 0x59300206, 0x80000d40, 0x04000014, 0x59b800e4, + 0x8c000524, 0x04020011, 0x4a0370e4, 0x00030000, + 0x40000000, 0x59b800e4, 0x8c000524, 0x04000004, + 0x4a0370e4, 0x00020000, 0x0401f008, 0x59940027, + 0x80040480, 0x48026206, 0x4a0370e4, 0x00020000, + 0x0400101c, 0x0400001b, 0x83326400, 0x00000024, + 0x49332802, 0x41540000, 0x81300480, 0x04021005, + 0x803c7840, 0x040207db, 0x5c03e000, 0x1c01f000, + 0x59940026, 0x48032827, 0x4a032802, 0x0010d1c0, + 0x497b2826, 0x80000540, 0x0400000f, 0x4a032800, + 0x00000001, 0x5c03e000, 0x1c01f000, 0x4c3c0000, + 0x0201f800, 0x001091db, 0x5c007800, 0x0401f7d1, + 0x4c3c0000, 0x0201f800, 0x00108d5d, 0x5c007800, + 0x0401f7e2, 0x4a032800, 0x00000000, 0x5c03e000, + 0x1c01f000, 0x59a8086b, 0x8c040d30, 0x04020029, + 0x8c040d32, 0x0400000f, 0x59a80069, 0x81640480, + 0x04001019, 0x59a8000b, 0x81500580, 0x04000005, + 0x59a8006a, 0x59a81066, 0x80080580, 0x04020012, + 0x900411c0, 0x82081500, 0x00007000, 0x0401f012, + 0x82040500, 0x0000001f, 0x04000016, 0x80040840, + 0x82040500, 0x0000001f, 0x04000003, 0x4807506b, + 0x0401f010, 0x900401c0, 0x82000500, 0x0000001f, + 0x80040d40, 0x900401c0, 0x80040580, 0x82001500, + 0x00007000, 0x82040500, 0xffff8fff, 0x80080540, + 0x4803506b, 0x80081114, 0x0201f800, 0x001006e2, + 0x1c01f000, 0x4a032807, 0x000007d0, 0x4a032806, + 0x0000000a, 0x1c01f000, 0x42000800, 0x000007d0, + 0x83180480, 0x00000005, 0x02021800, 0x001005d8, + 0x83947c00, 0x00000009, 0x83180400, 0x00105f43, + 0x50000000, 0x803c7c00, 0x48047801, 0x4a007800, + 0x0000000a, 0x1c01f000, 0x83180480, 0x00000005, + 0x02021800, 0x001005d8, 0x83947c00, 0x00000009, + 0x83180400, 0x00105f43, 0x50000000, 0x803c7c00, + 0x49787801, 0x1c01f000, 0x4807c857, 0x480bc857, + 0x59940025, 0x80040400, 0x02001800, 0x001005d8, + 0x48032804, 0x480b2805, 0x4a032803, 0x0000000a, + 0x1c01f000, 0x4807c857, 0x480bc857, 0x59940025, + 0x80040400, 0x02001800, 0x001005d8, 0x4803281c, + 0x480b281d, 0x4a03281b, 0x0000000a, 0x1c01f000, + 0x4c000000, 0x5994001d, 0x4803c857, 0x480bc857, + 0x80080580, 0x04020003, 0x4803281c, 0x4803281d, + 0x5c000000, 0x1c01f000, 0x80e9d1c0, 0x0400000e, + 0x0401f836, 0x04025000, 0x4203e000, 0x80000000, + 0x40e81000, 0x41780800, 0x42000000, 0x00000064, + 0x0201f800, 0x001066a0, 0x59940024, 0x80080400, + 0x48032824, 0x1c01f000, 0x42001000, 0x00105065, + 0x0401fef0, 0x42001000, 0x00105058, 0x0401ffe1, + 0x42001000, 0x00104148, 0x0401feea, 0x42001000, + 0x001041bc, 0x0401fee7, 0x42001000, 0x001041f3, + 0x0401f6f8, 0x4203e000, 0x70000000, 0x4203e000, + 0xb0300000, 0x41fc0000, 0x40ebf800, 0x80e80480, + 0x04001011, 0x04000004, 0x82000480, 0x00000003, + 0x0402100d, 0x42000000, 0x0000000f, 0x04004004, + 0x80000040, 0x040207fe, 0x0401f007, 0x4203e000, + 0x70000000, 0x42000000, 0x0010b87e, 0x0201f800, + 0x0010aa47, 0x1c01f000, 0x4203e000, 0x80000000, + 0x4203e000, 0xb0400000, 0x41fc0000, 0x40ebf800, + 0x80e80480, 0x04001011, 0x04000004, 0x82000480, + 0x00000003, 0x0402100d, 0x42000000, 0x0000000f, + 0x04005004, 0x80000040, 0x040207fe, 0x0401f007, + 0x4203e000, 0x80000000, 0x42000000, 0x0010b87f, + 0x0201f800, 0x0010aa47, 0x1c01f000, 0x59a8000e, + 0x82000480, 0x00000100, 0x599c0a02, 0x800409c0, + 0x04020002, 0x80040800, 0x80041480, 0x04001002, + 0x40000800, 0x48075067, 0x59a8100e, 0x40040000, + 0x800acc80, 0x4967500e, 0x49675069, 0x59aaa80b, + 0x41640800, 0x42001000, 0x00000024, 0x0201f800, + 0x00106681, 0x8206a400, 0x0010d1c0, 0x49535065, + 0x4152b000, 0x42006000, 0x0010be65, 0x4a006004, + 0x0000012c, 0x4a006005, 0xda10da10, 0x4a006008, + 0x00000011, 0x4a006009, 0x0010be65, 0x4a00600a, + 0x001010b8, 0x599c0014, 0x48006011, 0x599c0015, + 0x48006012, 0x42006000, 0x0010be41, 0x4a006203, + 0x00000008, 0x4a006406, 0x00000006, 0x4a006002, + 0xffff0000, 0x4a006008, 0x0010be65, 0x4a006014, + 0x0010be65, 0x599c0014, 0x48006015, 0x599c0015, + 0x48006016, 0x599c0413, 0x48006017, 0x49506018, + 0x49546019, 0x59a80067, 0x4800601a, 0x4a00601b, + 0x0010b465, 0x4a00601c, 0x0010b466, 0x4a00601d, + 0x0010b46a, 0x42000000, 0xb0000000, 0x42000800, + 0x0010be41, 0x0201f800, 0x00100b68, 0x1c01f000, + 0x82000d00, 0x000000c0, 0x04000004, 0x82040d80, + 0x000000c0, 0x04020055, 0x82000d00, 0x00002020, + 0x59300414, 0x84000512, 0x82040d80, 0x00002020, + 0x0400000b, 0x8c000514, 0x0402000f, 0x48026414, + 0x813e79c0, 0x02020000, 0x000206d0, 0x42027000, + 0x00000043, 0x0201f000, 0x000207a1, 0x59326809, + 0x59340a00, 0x8c040d0a, 0x040007f3, 0x84000552, + 0x0401f7f1, 0x84000514, 0x592c080d, 0x48066015, + 0x0401f7ef, 0x59326809, 0x59340a00, 0x8c040d0a, + 0x02000000, 0x000206e3, 0x59300c14, 0x84040d52, + 0x48066414, 0x0201f000, 0x000206e3, 0x0201f800, + 0x00020086, 0x813e79c0, 0x02020000, 0x000206d0, + 0x0201f000, 0x000206f1, 0x8c00051e, 0x02000000, + 0x000206fd, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x04000014, 0x82000500, 0x000000c0, + 0x82000d80, 0x00000080, 0x04000008, 0x813e79c0, + 0x02020000, 0x000206d0, 0x42027000, 0x00000041, + 0x0201f000, 0x000207a1, 0x813e79c0, 0x02020000, + 0x000206d0, 0x42027000, 0x00000043, 0x0201f000, + 0x000207a1, 0x59326809, 0x59340a00, 0x8c040d0a, + 0x040007ea, 0x59300c14, 0x84040d52, 0x48066414, + 0x0401f7e6, 0x492fc857, 0x42000800, 0x00000006, + 0x0201f000, 0x000206f8, 0x492fc857, 0x42000800, + 0x00000004, 0x0201f000, 0x000206f8, 0x4807c856, + 0x59a80068, 0x800409c0, 0x04000003, 0x80080540, + 0x0401f002, 0x80080500, 0x48035068, 0x1c01f000, + 0x4a030800, 0x00000000, 0x4a030802, 0x00000001, + 0x497b0803, 0x497b0804, 0x1c01f000, 0x59840002, + 0x8c000500, 0x04000004, 0x84000500, 0x4a030800, + 0x00000001, 0x84000544, 0x84000506, 0x48030802, + 0x82000d00, 0x0fffffff, 0x42000000, 0x90000000, + 0x0201f800, 0x00100b94, 0x59a80069, 0x82000480, + 0x00000007, 0x48035069, 0x80000580, 0x42000800, + 0x0010b519, 0x48000800, 0x48000801, 0x1c01f000, + 0x59a80069, 0x82000480, 0x00000007, 0x48035069, + 0x1c01f000, 0x83640480, 0x00000008, 0x0400101b, + 0x58c80a03, 0x80000580, 0x82000400, 0x00000008, + 0x80040840, 0x040207fd, 0x815c0480, 0x04001013, + 0x4200b000, 0x00000007, 0x0201f800, 0x0002075a, + 0x4a026203, 0x00000004, 0x4a026406, 0x00000009, + 0x4a026203, 0x00000004, 0x4a026007, 0x00000101, + 0x0401f809, 0x0401f880, 0x8058b040, 0x040207f3, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x0201f800, 0x001007e4, 0x492e6008, + 0x58c80a03, 0x4a025a04, 0x0000002c, 0x497a5800, + 0x497a5801, 0x497a5c04, 0x497a5c06, 0x497a5805, + 0x4a025a08, 0x00000005, 0x4a025a07, 0x00000002, + 0x58c80201, 0x48025c04, 0x58c80202, 0x48025c07, + 0x58c80204, 0x48025c08, 0x4a02580d, 0x0000ffff, + 0x80040840, 0x0400000c, 0x412c2000, 0x0201f800, + 0x001007e4, 0x4a025a04, 0x0000000a, 0x497a5c04, + 0x48125800, 0x492c2001, 0x412c2000, 0x80040840, + 0x040207f7, 0x1c01f000, 0x4d7c0000, 0x4202f800, + 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, + 0x59847803, 0x803c79c0, 0x0400001e, 0x4c5c0000, + 0x583cb808, 0x585c3408, 0x801831c0, 0x0400000b, + 0x0401f84a, 0x04000016, 0x42001000, 0x0010b519, + 0x0401f87f, 0x04000012, 0x0201f800, 0x001007d3, + 0x0400000f, 0x492cb805, 0x585c0005, 0x80000540, + 0x02000800, 0x001005d8, 0x0401f830, 0x585c5408, + 0x0401f80b, 0x5c00b800, 0x5c03e000, 0x817ef840, + 0x040207e1, 0x5c02f800, 0x1c01f000, 0x5c00b800, + 0x5c03e000, 0x5c02f800, 0x1c01f000, 0x4803c856, + 0x405c6000, 0x802851c0, 0x04000018, 0x585c0204, + 0x82000d00, 0x0000000f, 0x82040c00, 0x001010bd, + 0x50044000, 0x4cf00000, 0x4d000000, 0x4d040000, + 0x4021e000, 0x40320800, 0x59860004, 0x4c280000, + 0x0401f934, 0x5c005000, 0x40f04000, 0x41046000, + 0x0201f800, 0x0010109b, 0x040207f6, 0x5c020800, + 0x5c020000, 0x5c01e000, 0x58c80204, 0x4800bc08, + 0x0201f800, 0x00020086, 0x4a026007, 0x00000101, + 0x497a6009, 0x0401f055, 0x4803c856, 0x59840003, + 0x80026540, 0x04000003, 0x59300000, 0x48030803, + 0x1c01f000, 0x4803c856, 0x59840003, 0x48026000, + 0x49330803, 0x1c01f000, 0x58cc0805, 0x40180000, + 0x80040480, 0x0400100d, 0x82cc0580, 0x0010b50e, + 0x02020800, 0x001005d8, 0x58c80205, 0x80040480, + 0x0400101d, 0x82000540, 0x00000001, 0x1c01f000, + 0x80003580, 0x0401f7fe, 0x82cc0580, 0x0010b50e, + 0x02020800, 0x001005d8, 0x58c80400, 0x8c000504, + 0x040007f8, 0x58c8040b, 0x8c00051e, 0x040007f5, + 0x8c000500, 0x040207f3, 0x84000540, 0x4801940b, + 0x42000000, 0x0010b839, 0x0201f800, 0x0010aa47, + 0x42001000, 0x00008026, 0x0201f800, 0x00103a3e, + 0x0401f7e8, 0x58c8040b, 0x8c00051e, 0x040007e2, + 0x8c000502, 0x040207e0, 0x84000542, 0x4801940b, + 0x42000000, 0x0010b838, 0x0201f800, 0x0010aa47, + 0x42001000, 0x00008025, 0x42001800, 0x00000000, + 0x0201f800, 0x00103a3e, 0x0401f7d3, 0x4803c856, + 0x58080000, 0x42001800, 0x00000007, 0x58080801, + 0x80040480, 0x04020004, 0x400c0000, 0x80000540, + 0x0401f005, 0x04001003, 0x800c0480, 0x0401f002, + 0x80000080, 0x1c01f000, 0x4803c856, 0x59300008, + 0x80000d40, 0x02000800, 0x001005d8, 0x58040005, + 0x80000540, 0x02000800, 0x001005d8, 0x59300007, + 0x82000500, 0x00000101, 0x82000580, 0x00000101, + 0x02020800, 0x001005d8, 0x42001000, 0x0010b519, + 0x58080801, 0x82040400, 0x0010b51b, 0x497a6414, + 0x4a026015, 0x0000ffff, 0x45300000, 0x80040800, + 0x82040480, 0x00000008, 0x04001002, 0x80000d80, + 0x48041001, 0x82040400, 0x0010b51b, 0x45780000, + 0x1c01f000, 0x4933c857, 0x59300808, 0x800409c0, + 0x02000800, 0x001005d8, 0x4d2c0000, 0x58065805, + 0x812e59c0, 0x02020800, 0x001007f4, 0x49780805, + 0x40065800, 0x0201f800, 0x001007fd, 0x5c025800, + 0x4d300000, 0x0201f800, 0x0002077d, 0x5c026000, + 0x1c01f000, 0x59300406, 0x82000580, 0x00000009, + 0x04020006, 0x59300007, 0x8c000510, 0x04000003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x1c01f000, 0x59840802, 0x8c040d04, 0x1c01f000, + 0x4803c856, 0x59840802, 0x84040d04, 0x84040d40, + 0x4a030800, 0x00000000, 0x48070802, 0x82040d00, + 0x0fffffff, 0x42000000, 0x90000000, 0x0201f000, + 0x00100b94, 0x4807c857, 0x4805980a, 0x49799801, + 0x49799803, 0x49799806, 0x49799807, 0x49799808, + 0x49799805, 0x49799809, 0x0401f8c9, 0x0400000a, + 0x0401f8eb, 0x04000008, 0x48359800, 0x48359802, + 0x48359806, 0x4a019804, 0x00000001, 0x4a019807, + 0x00000005, 0x1c01f000, 0x4807c857, 0x58cc1007, + 0x40040000, 0x80080480, 0x04021020, 0x4c040000, + 0x4c080000, 0x0401f8da, 0x5c001000, 0x5c000800, + 0x0400001c, 0x58cc0006, 0x80006540, 0x0402000b, + 0x48359800, 0x48359802, 0x48359806, 0x49799801, + 0x49799803, 0x49786801, 0x49786800, 0x49799804, + 0x49799807, 0x0401f005, 0x48306801, 0x48346000, + 0x48359806, 0x49786800, 0x58cc0004, 0x58cc1007, + 0x80000000, 0x82081400, 0x00000005, 0x48019804, + 0x48099807, 0x0401f7df, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x480bc857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x40083000, + 0x58cc0801, 0x82040480, 0x00000005, 0x02021800, + 0x001005d8, 0x82040400, 0x00106418, 0x50000000, + 0x58cca800, 0x8054ac00, 0x42001800, 0x00000005, + 0x40040000, 0x800c0480, 0x80082480, 0x04021002, + 0x40080000, 0x8000b0c2, 0x8058b400, 0x5450a800, + 0x8050a000, 0x8054a800, 0x8058b040, 0x040207fc, + 0x40001000, 0x58cc2805, 0x58cc0807, 0x58cc2001, + 0x80142c00, 0x80040c80, 0x80102400, 0x48159805, + 0x48059807, 0x48119801, 0x82100580, 0x00000005, + 0x0400000c, 0x48119801, 0x40080000, 0x80181480, + 0x40083000, 0x04000003, 0x040217d6, 0x80000580, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x58cc0800, 0x800409c0, 0x02000800, 0x001005d8, + 0x58040800, 0x48059800, 0x41782000, 0x0401f7ee, + 0x0401f813, 0x50f00000, 0x81040400, 0x40001800, + 0x585c0204, 0x4803c857, 0x82000580, 0x0000002c, + 0x02020800, 0x001005d8, 0x58040202, 0x800000e0, + 0x81000540, 0x48001802, 0x58040000, 0x48001800, + 0x58040001, 0x48001801, 0x1c01f000, 0x4807c856, + 0x58cc0005, 0x80000040, 0x02001800, 0x001005d8, + 0x48019805, 0x58cc1003, 0x82080480, 0x00000005, + 0x02021800, 0x001005d8, 0x82080400, 0x00106418, + 0x50000000, 0x58cc0802, 0x80040c00, 0x80081000, + 0x82080480, 0x00000005, 0x0402000f, 0x58cc2002, + 0x58100000, 0x80006d40, 0x04000009, 0x4c340000, + 0x0401f858, 0x5c006800, 0x49786801, 0x48359802, + 0x58cc0004, 0x80000040, 0x48019804, 0x49799803, + 0x0401f002, 0x48099803, 0x1c01f000, 0x4807c856, + 0x41781800, 0x58c80201, 0x80000540, 0x04000002, + 0x800c1800, 0x58c80c01, 0x80040c80, 0x0400100a, + 0x04000009, 0x800c1800, 0x58c80202, 0x80041480, + 0x04001005, 0x04000004, 0x800c1800, 0x40080800, + 0x0401f7fb, 0x480d9204, 0x400c0000, 0x42002000, + 0x00000001, 0x80000040, 0x04000007, 0x04001006, + 0x80102000, 0x82000480, 0x00000005, 0x04000002, + 0x040217fc, 0x48119203, 0x1c01f000, 0x4807c856, + 0x4d2c0000, 0x58cc000a, 0x80000540, 0x02000800, + 0x001005d8, 0x82002400, 0x00000005, 0x0201f800, + 0x001007d3, 0x04000012, 0x492d9809, 0x497a5800, + 0x497a5801, 0x0201f800, 0x001007d3, 0x0400000c, + 0x58cc0009, 0x48025800, 0x497a5801, 0x492d9809, + 0x82102480, 0x00000005, 0x040217f7, 0x82000540, + 0x00000001, 0x5c025800, 0x1c01f000, 0x58cc0009, + 0x80025d40, 0x040007fc, 0x592c2000, 0x0201f800, + 0x001007f4, 0x40100000, 0x0401f7fa, 0x58cc0009, + 0x48cfc857, 0x80006d40, 0x04000005, 0x50340000, + 0x48019809, 0x49786800, 0x49786801, 0x1c01f000, + 0x4813c857, 0x58cc0009, 0x48002000, 0x48119809, + 0x1c01f000, 0x4807c856, 0x4d2c0000, 0x58cc0009, + 0x80025d40, 0x04000007, 0x592c0000, 0x4c000000, + 0x0201f800, 0x001007f4, 0x5c000000, 0x0401f7f9, + 0x5c025800, 0x1c01f000, 0x4807c856, 0x4d2c0000, + 0x58cc0002, 0x80025d40, 0x04000007, 0x592c0000, + 0x4c000000, 0x0201f800, 0x001007f4, 0x5c000000, + 0x0401f7f9, 0x49799800, 0x49799802, 0x49799801, + 0x49799803, 0x49799806, 0x49799807, 0x49799808, + 0x49799809, 0x4979980a, 0x5c025800, 0x1c01f000, + 0x00000003, 0x00000006, 0x00000009, 0x0000000c, + 0x0000000f, 0x00000012, 0x4803c856, 0x0401f857, + 0x4a00c204, 0x0000003c, 0x59301009, 0x82080580, + 0x0010b524, 0x04000013, 0x58080802, 0x82040d00, + 0x00ffffff, 0x58080403, 0x4804c005, 0x4800c406, + 0x4a00c207, 0x00000003, 0x59300811, 0x585c0404, + 0x4978c206, 0x4804c407, 0x80000540, 0x0400000d, + 0x58600206, 0x84000540, 0x4800c206, 0x0401f009, + 0x585c080a, 0x82040d00, 0x00ffffff, 0x4804c005, + 0x4a00c406, 0x000007ff, 0x4978c207, 0x0401f7ef, + 0x82603c00, 0x00000008, 0x58605404, 0x40282000, + 0x405c6000, 0x585c0a04, 0x82040d00, 0x0000000f, + 0x82040c00, 0x001010bd, 0x50044000, 0x80004d80, + 0x50200000, 0x80307400, 0x58380402, 0x8c244d00, + 0x04020003, 0x48003a00, 0x0401f003, 0x48003c00, + 0x801c3800, 0x80244800, 0x80102040, 0x04000006, + 0x0201f800, 0x0010109b, 0x02000800, 0x001005d8, + 0x0401f7f0, 0x1c01f000, 0x4803c856, 0x4d340000, + 0x59300009, 0x80026d40, 0x02000800, 0x001005d8, + 0x59340401, 0x80000540, 0x0400000e, 0x59840000, + 0x80000540, 0x0400000b, 0x836c0580, 0x00000003, + 0x04020008, 0x59341c03, 0x42002000, 0x00000004, + 0x42003000, 0x00000004, 0x0201f800, 0x00103aae, + 0x5c026800, 0x1c01f000, 0x4803c856, 0x80001580, + 0x58c80c01, 0x59300011, 0x80040c80, 0x48066011, + 0x58c80201, 0x80000540, 0x04000005, 0x80081000, + 0x80040c80, 0x04001007, 0x04000006, 0x58c80202, + 0x80081000, 0x80040c80, 0x04001002, 0x040207fd, + 0x4808bc08, 0x4808c404, 0x1c01f000, 0x4803c856, + 0x4a0370e5, 0x00020000, 0x59b800e5, 0x8c000524, + 0x040207fc, 0x4a0370e5, 0x00030000, 0x40000000, + 0x40000000, 0x59b800e5, 0x8c000524, 0x040207f5, + 0x5934000e, 0x80006d40, 0x04000010, 0x81300580, + 0x04020004, 0x58340000, 0x4802680e, 0x0401f00a, + 0x40347800, 0x58340000, 0x80006d40, 0x02000800, + 0x001005d8, 0x81300580, 0x040207fa, 0x58340000, + 0x48007800, 0x497a6000, 0x4a0370e5, 0x00020000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x4d2c0000, + 0x42000800, 0x000003ff, 0x4a0370e5, 0x00020000, + 0x59b800e5, 0x8c000524, 0x04000005, 0x80040840, + 0x040207fa, 0x0201f800, 0x001005d8, 0x4a0370e5, + 0x00030000, 0x40000000, 0x40000000, 0x59b800e5, + 0x8c000524, 0x040207f1, 0x5934000e, 0x80026540, + 0x0400000e, 0x4933c857, 0x59300000, 0x4802680e, + 0x4a026203, 0x00000004, 0x497a6206, 0x497a6009, + 0x4a026007, 0x00000101, 0x59325808, 0x497a5c08, + 0x0401fd81, 0x0401f7f1, 0x4a0370e5, 0x00020000, + 0x5c025800, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x4c000000, 0x0201f800, 0x00105c9a, 0x04020011, + 0x0201f800, 0x001045a6, 0x02020800, 0x001005d8, + 0x5c000000, 0x48026802, 0x0201f800, 0x0002075a, + 0x04000009, 0x49366009, 0x4a026406, 0x00000001, + 0x42027000, 0x00000001, 0x0201f000, 0x000207a1, + 0x5c000000, 0x1c01f000, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x0c01f001, 0x00106503, 0x00106503, 0x00106503, + 0x00106505, 0x00106565, 0x00106503, 0x00106503, + 0x001065b7, 0x001065b8, 0x00106503, 0x00106503, + 0x00106503, 0x00106503, 0x00106503, 0x0201f800, + 0x001005d8, 0x493bc857, 0x83380480, 0x00000050, + 0x02021800, 0x001005d8, 0x83380480, 0x00000049, + 0x02001800, 0x001005d8, 0x0c01f001, 0x00106518, + 0x0010653a, 0x00106516, 0x00106516, 0x00106516, + 0x00106516, 0x00106549, 0x0201f800, 0x001005d8, + 0x4d2c0000, 0x59325808, 0x592c0206, 0x48025c06, + 0x4a025a06, 0x00000000, 0x4c5c0000, 0x592cbc0a, + 0x592c0000, 0x48026008, 0x0201f800, 0x00104cde, + 0x59300008, 0x80000540, 0x04000008, 0x4a026203, + 0x00000007, 0x42027000, 0x00000043, 0x5c00b800, + 0x5c025800, 0x0401f08a, 0x8c5cbd08, 0x04020006, + 0x4a026203, 0x00000007, 0x497a6206, 0x497a6008, + 0x0401f003, 0x0201f800, 0x0002077d, 0x5c00b800, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x00106b8a, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x04000006, 0x4d400000, 0x42028000, 0x00000001, + 0x0401f8f8, 0x5c028000, 0x5c025800, 0x0201f000, + 0x0002077d, 0x0201f800, 0x00106b8a, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42003000, 0x00000014, 0x0201f800, 0x0010a942, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x04000006, 0x4d400000, 0x42028000, 0x00000029, + 0x0401f8dc, 0x5c028000, 0x5c025800, 0x0201f000, + 0x0002077d, 0x493bc857, 0x497a6206, 0x83380480, + 0x00000054, 0x02021800, 0x001005d8, 0x83380480, + 0x00000047, 0x02001800, 0x001005d8, 0x0c01f001, + 0x001065b6, 0x0010657f, 0x0010657d, 0x0010657d, + 0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d, + 0x0010657d, 0x0010657d, 0x0010657d, 0x0010657d, + 0x00106583, 0x0201f800, 0x001005d8, 0x59300011, + 0x82000500, 0xffff0000, 0x04020034, 0x59840802, + 0x8c040d04, 0x04000025, 0x59300009, 0x80026d40, + 0x0400001f, 0x4c5c0000, 0x4c600000, 0x497a6206, + 0x5930b808, 0x585c0005, 0x8000c540, 0x02000800, + 0x001005d8, 0x0401fe8d, 0x40625800, 0x0201f800, + 0x00104cde, 0x4978b805, 0x0401fef5, 0x497a6009, + 0x585c3408, 0x0401fcbd, 0x0400000e, 0x42001000, + 0x0010b519, 0x0401fcf2, 0x0400000a, 0x0201f800, + 0x001007e4, 0x04000007, 0x492cb805, 0x585c5408, + 0x0401fc83, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x0401fca9, 0x0401f7fc, 0x8c040d06, 0x040207fc, + 0x59300009, 0x80026d40, 0x04000006, 0x5934000e, + 0x80000540, 0x02020800, 0x001005d8, 0x497a6009, + 0x0401fd0d, 0x0401f7f2, 0x0401f06f, 0x4803c856, + 0x4803c856, 0x83380580, 0x00000043, 0x02020800, + 0x001005d8, 0x4a026203, 0x00000003, 0x493a6403, + 0x59325808, 0x592c000f, 0x48026011, 0x497a6013, + 0x592c0406, 0x800000c2, 0x800010c4, 0x80081400, + 0x480a6206, 0x0201f800, 0x00100f4e, 0x42000800, + 0x80000060, 0x0401f154, 0x42000000, 0x0010b875, + 0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x82000d80, 0x00000003, 0x04000006, 0x82000d80, + 0x00000004, 0x04000045, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106c55, 0x59300004, 0x8c00053e, + 0x04020007, 0x0201f800, 0x00106b6c, 0x02020800, + 0x001005d8, 0x0201f000, 0x00106c4b, 0x0401f9c3, + 0x0201f800, 0x00106c4b, 0x59325808, 0x42028000, + 0x00000006, 0x0401f84b, 0x0201f000, 0x0002077d, + 0x4803c856, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000004, 0x04000023, + 0x0201f800, 0x001005d8, 0x4803c856, 0x0201f800, + 0x00106c55, 0x4df00000, 0x59300004, 0x8c00053e, + 0x04020006, 0x0201f800, 0x00106f60, 0x02020800, + 0x001005d8, 0x0401f010, 0x0201f800, 0x00108cd6, + 0x04020004, 0x0201f800, 0x00106e62, 0x0402000a, + 0x0401f99a, 0x02020800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x82000540, 0x00000001, + 0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x00100e99, 0x4933c857, 0x4c5c0000, 0x4d340000, + 0x497a6206, 0x5930b808, 0x59300009, 0x80026d40, + 0x04020e5f, 0x42001000, 0x0010b519, 0x0401fc60, + 0x04000009, 0x58c80204, 0x4800bc08, 0x41785000, + 0x0201f800, 0x00106227, 0x5c026800, 0x5c00b800, + 0x1c01f000, 0x4978bc08, 0x0401fc17, 0x0401f7fb, + 0x4803c856, 0x0201f800, 0x00109037, 0x0400000f, + 0x592c0000, 0x80000d40, 0x04000009, 0x497a5800, + 0x49425a06, 0x4c040000, 0x0201f800, 0x000202da, + 0x5c000800, 0x40065800, 0x0401f7f6, 0x49425a06, + 0x0201f800, 0x000202da, 0x1c01f000, 0x4933c857, + 0x59300c06, 0x82040580, 0x0000000e, 0x04000004, + 0x82040580, 0x00000009, 0x04020004, 0x0401ffe5, + 0x497a6008, 0x80000580, 0x1c01f000, 0x592e6009, + 0x83300480, 0x0010d1c0, 0x04001016, 0x41580000, + 0x81300480, 0x04021013, 0x40040000, 0x59300c06, + 0x80040580, 0x04020012, 0x59300a03, 0x82040580, + 0x00000007, 0x02020800, 0x001005d8, 0x59300008, + 0x80000540, 0x02020800, 0x001005d8, 0x0201f800, + 0x0002077d, 0x42000000, 0x00000000, 0x0401f009, + 0x42000000, 0x00000008, 0x0401f006, 0x82040580, + 0x00000007, 0x040207fb, 0x42000000, 0x00000005, + 0x592c0a06, 0x48065c06, 0x48025a06, 0x0201f000, + 0x000202da, 0x4c0c0000, 0x4c100000, 0x4c140000, + 0x4c180000, 0x80001d80, 0x80002580, 0x42003000, + 0x00000020, 0x82040500, 0x00000001, 0x04000003, + 0x40080000, 0x800c1c00, 0x400c2800, 0x800c1902, + 0x80102102, 0x82140500, 0x00000001, 0x04000003, + 0x82102540, 0x80000000, 0x80040902, 0x80183040, + 0x040207f1, 0x40100800, 0x400c0000, 0x5c003000, + 0x5c002800, 0x5c002000, 0x5c001800, 0x1c01f000, + 0x4c580000, 0x4200b000, 0x00000020, 0x80000540, + 0x04000018, 0x80041c80, 0x04021016, 0x800810c2, + 0x80040982, 0x04001006, 0x80041c80, 0x04021005, + 0x8058b040, 0x040207fa, 0x0401f006, 0x80041c80, + 0x400c0800, 0x80081000, 0x8058b040, 0x040207f4, + 0x4c000000, 0x41f00000, 0x82000500, 0xf7ffffff, + 0x4003e000, 0x5c000000, 0x5c00b000, 0x1c01f000, + 0x4c000000, 0x41f00000, 0x82000540, 0x08000000, + 0x0401f7f8, 0x4a0378e8, 0x00000000, 0x4a03c821, + 0x00000010, 0x4a03c823, 0x00000004, 0x0401f82c, + 0x4a0378e9, 0x00003a0d, 0x4a0378e8, 0x00000001, + 0x42000000, 0x00001000, 0x50000000, 0x82000480, + 0x24220001, 0x04000004, 0x59e00002, 0x84000548, + 0x4803c002, 0x42000800, 0x00000005, 0x4203a000, + 0x00007600, 0x42000000, 0x00001000, 0x50000000, + 0x82000480, 0x24320001, 0x04021003, 0x4a03a005, + 0xd0000001, 0x59d00006, 0x4a03a005, 0x90000001, + 0x83d3a400, 0x00000020, 0x80040840, 0x040207fa, + 0x59e00003, 0x82000500, 0xffffffe0, 0x82000540, + 0x00008000, 0x4803c003, 0x59c40006, 0x82000500, + 0xfffcffff, 0x48038806, 0x1c01f000, 0x4d900000, + 0x4d180000, 0x4a0378e7, 0xaaaaaaaa, 0x4a0378e6, + 0xaaaaaaaa, 0x4a0378e5, 0xaaaaaaaa, 0x4a0378e4, + 0xaaaaaaaa, 0x42000800, 0x0000bf00, 0x4a00081a, + 0x0010b7d4, 0x4a00081b, 0x001010bd, 0x4a00081c, + 0x001010cd, 0x4a031800, 0x00000000, 0x4a031801, + 0x0010b544, 0x4a031802, 0x0010b54b, 0x42000800, + 0x0010b7d7, 0x417a3000, 0x811b20c8, 0x83932400, + 0x0000bf32, 0x48072000, 0x4a032001, 0x00000000, + 0x83180400, 0x001070ea, 0x50000000, 0x48032002, + 0x82040c00, 0x00000003, 0x811a3000, 0x83180480, + 0x00000005, 0x040017f1, 0x5c023000, 0x5c032000, + 0x1c01f000, 0x48066004, 0x497a6000, 0x497a6001, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, + 0xa0000000, 0x480378e1, 0x1c01f000, 0x4933c857, + 0x42000800, 0x80000040, 0x48066004, 0x497a6000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x83300400, + 0x60000000, 0x480378e1, 0x1c01f000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d300000, 0x4d340000, + 0x4d2c0000, 0x4d180000, 0x4c5c0000, 0x4c600000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x42003000, 0x0000bf2e, 0x581a6001, 0x813261c0, + 0x0400002c, 0x41302800, 0x4178c000, 0x59300000, + 0x4c000000, 0x59326809, 0x5930b801, 0x59300406, + 0x82000d80, 0x00000006, 0x04020003, 0x8d3e7d18, + 0x04000010, 0x8d3e7d06, 0x04000007, 0x82000580, + 0x00000003, 0x04020004, 0x59340200, 0x8c00050e, + 0x04020008, 0x0401f92f, 0x4c0c0000, 0x4c140000, + 0x0401fb5f, 0x5c002800, 0x5c001800, 0x0401f005, + 0x41301800, 0x8060c1c0, 0x04020002, 0x400cc000, + 0x805cb9c0, 0x04000003, 0x405e6000, 0x0401f7e3, + 0x5c026000, 0x813261c0, 0x04000006, 0x8060c1c0, + 0x04000002, 0x40602800, 0x4178c000, 0x0401f7d8, + 0x417a3000, 0x0201f800, 0x001070d8, 0x59926004, + 0x813261c0, 0x04000023, 0x59326809, 0x4130c000, + 0x59300001, 0x8000bd40, 0x04000016, 0x40026000, + 0x40602800, 0x5930b801, 0x59300406, 0x82000d80, + 0x00000006, 0x0400000e, 0x8d3e7d06, 0x04000007, + 0x82000580, 0x00000003, 0x04020004, 0x59340200, + 0x8c00050e, 0x04020006, 0x0401f8dc, 0x4c140000, + 0x0401fb2f, 0x5c002800, 0x0401f002, 0x41302800, + 0x405e6000, 0x813261c0, 0x040207eb, 0x8060c1c0, + 0x04000004, 0x40626000, 0x4178c000, 0x0401f7e7, + 0x811a3000, 0x83180480, 0x00000005, 0x040017d6, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c00c000, 0x5c00b800, 0x5c023000, 0x5c025800, + 0x5c026800, 0x5c026000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d340000, 0x4d180000, + 0x4d900000, 0x42003000, 0x0000bf2e, 0x59326809, + 0x58182001, 0x40102800, 0x801021c0, 0x04000016, + 0x41300000, 0x80100580, 0x04000011, 0x58100009, + 0x81340580, 0x0402000b, 0x40101800, 0x58102001, + 0x41300000, 0x801021c0, 0x0400000b, 0x80100d80, + 0x04000007, 0x40101800, 0x58102001, 0x0401f7fa, + 0x40102800, 0x58102000, 0x0401f7ec, 0x0401f8bd, + 0x0401f01a, 0x42032000, 0x0000bf32, 0x417a3000, + 0x59902004, 0x40102800, 0x801021c0, 0x0400000b, + 0x58100009, 0x81340580, 0x04020008, 0x41300000, + 0x80100580, 0x0400000c, 0x40102800, 0x58102001, + 0x801021c0, 0x040207fa, 0x811a3000, 0x83180480, + 0x00000005, 0x0402100d, 0x83932400, 0x00000010, + 0x0401f7ec, 0x0401f881, 0x5c032000, 0x5c023000, + 0x5c026800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x0401fb6f, 0x040007f7, + 0x5c032000, 0x5c023000, 0x5c026800, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x82000540, 0x00000001, + 0x1c01f000, 0x0201f800, 0x00106c55, 0x4df00000, + 0x4d300000, 0x4d340000, 0x4d180000, 0x4d2c0000, + 0x4c5c0000, 0x4c600000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x42003000, 0x0000bf2e, + 0x581a6001, 0x813261c0, 0x04000023, 0x41302800, + 0x5930b800, 0x59326809, 0x59340403, 0x81440580, + 0x04000006, 0x805cb9c0, 0x0400001b, 0x41302800, + 0x405e6000, 0x0401f7f7, 0x5930b801, 0x8d3e7d00, + 0x04000003, 0x0401fb67, 0x0402000e, 0x59300406, + 0x82000580, 0x00000006, 0x04020003, 0x8d3e7d18, + 0x04000008, 0x0401f867, 0x4c0c0000, 0x4c140000, + 0x0401fa97, 0x5c002800, 0x5c001800, 0x0401f002, + 0x41301800, 0x405e6000, 0x813261c0, 0x040207eb, + 0x0401f02d, 0x417a3000, 0x0201f800, 0x001070d8, + 0x59926004, 0x813261c0, 0x04000005, 0x59326809, + 0x59340403, 0x81440580, 0x04000006, 0x811a3000, + 0x83180480, 0x00000005, 0x040017f4, 0x0401f01e, + 0x4130c000, 0x59300001, 0x8000bd40, 0x04000012, + 0x40026000, 0x40602800, 0x5930b801, 0x8d3e7d00, + 0x04000003, 0x0401fb3b, 0x0402000a, 0x59300406, + 0x82000580, 0x00000006, 0x04000006, 0x0401f81b, + 0x4c140000, 0x0401fa6e, 0x5c002800, 0x0401f002, + 0x41302800, 0x405e6000, 0x813261c0, 0x040207ef, + 0x8060c1c0, 0x04000004, 0x40626000, 0x4178c000, + 0x0401f7eb, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c00c000, 0x5c00b800, 0x5c025800, + 0x5c023000, 0x5c026800, 0x5c026000, 0x5c03e000, + 0x04000be3, 0x1c01f000, 0x0401fbc8, 0x59900004, + 0x81300580, 0x04020018, 0x4c140000, 0x0201f800, + 0x00106dc3, 0x0401fbb8, 0x5c002800, 0x59300001, + 0x800001c0, 0x04020003, 0x497a680c, 0x1c01f000, + 0x42003000, 0x0000bf2e, 0x497a6001, 0x58180801, + 0x800409c0, 0x04020004, 0x48003000, 0x48003001, + 0x1c01f000, 0x58180800, 0x48000800, 0x48003000, + 0x1c01f000, 0x59300001, 0x48002801, 0x800001c0, + 0x04020002, 0x4816680c, 0x497a6001, 0x1c01f000, + 0x0401fba6, 0x42003000, 0x0000bf2e, 0x58180001, + 0x81300580, 0x0402001c, 0x59300801, 0x800409c0, + 0x0400000e, 0x59300000, 0x800001c0, 0x04020005, + 0x48043001, 0x48043000, 0x497a6001, 0x1c01f000, + 0x59300000, 0x48000800, 0x48043001, 0x497a6000, + 0x497a6001, 0x1c01f000, 0x59300800, 0x800409c0, + 0x04020005, 0x49783001, 0x49783000, 0x497a680c, + 0x1c01f000, 0x48043001, 0x497a6000, 0x497a680c, + 0x1c01f000, 0x58180000, 0x81300580, 0x0402000c, + 0x59300001, 0x800001c0, 0x04020005, 0x48143000, + 0x49782800, 0x497a680c, 0x1c01f000, 0x48003000, + 0x48002800, 0x497a6001, 0x1c01f000, 0x59300000, + 0x800001c0, 0x04020008, 0x59300001, 0x48001801, + 0x800001c0, 0x04020002, 0x480e680c, 0x497a6001, + 0x1c01f000, 0x59300801, 0x800409c0, 0x04020006, + 0x59300800, 0x48042800, 0x497a6000, 0x497a680c, + 0x1c01f000, 0x59300000, 0x48000800, 0x48042800, + 0x497a6000, 0x497a6001, 0x1c01f000, 0x0401fb82, + 0x4df00000, 0x0401f839, 0x040208c4, 0x04020945, + 0x04020a89, 0x04020005, 0x5c03e000, 0x04000b70, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x04000b6c, + 0x82000540, 0x00000001, 0x1c01f000, 0x4d2c0000, + 0x4d340000, 0x4d300000, 0x41783000, 0x598e6009, + 0x813261c0, 0x04000021, 0x59300406, 0x82000580, + 0x00000006, 0x04020004, 0x8d3e7d18, 0x0402000a, + 0x0401f017, 0x82040580, 0x00000005, 0x04020006, + 0x8d3e7d16, 0x04000004, 0x59300420, 0x8c000500, + 0x0402000f, 0x0401fa4e, 0x59300000, 0x4c000000, + 0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7, + 0x04000005, 0x0401f867, 0x4c180000, 0x0401f9bc, + 0x5c003000, 0x5c026000, 0x0401f7e2, 0x41303000, + 0x59326000, 0x0401f7df, 0x5c026000, 0x5c026800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x813261c0, 0x02000800, 0x001005d8, 0x41300000, + 0x598cb809, 0x41783000, 0x805cb9c0, 0x04000013, + 0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800, + 0x0401f7fa, 0x0401f84b, 0x598c000d, 0x81300580, + 0x02000800, 0x001070b9, 0x59300403, 0x82000580, + 0x00000042, 0x04020002, 0x497a6007, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c00b800, 0x1c01f000, 0x0401fb27, 0x4df00000, + 0x4d2c0000, 0x4d340000, 0x4d300000, 0x41783000, + 0x598e6009, 0x813261c0, 0x0400002c, 0x59300c06, + 0x82040580, 0x00000006, 0x04020004, 0x8d3e7d18, + 0x0402000a, 0x0401f022, 0x82040580, 0x00000005, + 0x04020006, 0x8d3e7d18, 0x04000004, 0x59300420, + 0x8c000500, 0x0402001a, 0x59326809, 0x59340403, + 0x81440580, 0x04020016, 0x8d3e7d00, 0x04000006, + 0x82040580, 0x00000003, 0x04020011, 0x0401fa35, + 0x0402000f, 0x0401f9f6, 0x59300000, 0x4c000000, + 0x8d3e7d06, 0x04000004, 0x0201f800, 0x001092d7, + 0x04000005, 0x0401f80f, 0x4c180000, 0x0401f964, + 0x5c003000, 0x5c026000, 0x0401f7d7, 0x41303000, + 0x59326000, 0x0401f7d4, 0x5c026000, 0x5c026800, + 0x5c025800, 0x5c03e000, 0x04000ae5, 0x1c01f000, + 0x59300800, 0x497a6000, 0x0401fac8, 0x801831c0, + 0x04020009, 0x598c0008, 0x81300580, 0x04020004, + 0x48031808, 0x48031809, 0x0401f008, 0x48071809, + 0x0401f006, 0x48043000, 0x598c0008, 0x81300580, + 0x04020002, 0x481b1808, 0x0401f2ca, 0x4d2c0000, + 0x4d300000, 0x4d340000, 0x41783000, 0x598e600b, + 0x813261c0, 0x04000013, 0x8d3e7d06, 0x04000005, + 0x59326809, 0x59340200, 0x8c00050e, 0x0402000a, + 0x0401f9bf, 0x59300000, 0x4c000000, 0x0401f853, + 0x4c180000, 0x0401f932, 0x5c003000, 0x5c026000, + 0x0401f7f0, 0x41303000, 0x59326000, 0x0401f7ed, + 0x0201f800, 0x00104773, 0x5c026800, 0x5c026000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x813261c0, 0x02000800, 0x001005d8, 0x41300000, + 0x598cb80b, 0x41783000, 0x805cb9c0, 0x0400000f, + 0x805c0d80, 0x04000004, 0x405c3000, 0x5818b800, + 0x0401f7fa, 0x0401f835, 0x598c000d, 0x81300580, + 0x02000800, 0x001070b9, 0x497a6007, 0x80000580, + 0x5c00b800, 0x1c01f000, 0x82000540, 0x00000001, + 0x5c00b800, 0x1c01f000, 0x0401fa9f, 0x4df00000, + 0x4d340000, 0x4d300000, 0x4d2c0000, 0x0201f800, + 0x00020245, 0x02020800, 0x001005d8, 0x41783000, + 0x598e600b, 0x813261c0, 0x04000014, 0x59300009, + 0x81340580, 0x0402000e, 0x8d3e7d00, 0x04000003, + 0x0401f9bc, 0x0402000a, 0x0401f97d, 0x59300000, + 0x4c000000, 0x0401f811, 0x4c180000, 0x0401f8f0, + 0x5c003000, 0x5c026000, 0x0401f7ef, 0x41303000, + 0x59326000, 0x0401f7ec, 0x0201f800, 0x0010479c, + 0x5c025800, 0x5c026000, 0x5c026800, 0x5c03e000, + 0x04000a6f, 0x1c01f000, 0x59300800, 0x497a6000, + 0x0401fa52, 0x801831c0, 0x04020009, 0x598c000a, + 0x81300580, 0x04020004, 0x4803180a, 0x4803180b, + 0x0401f008, 0x4807180b, 0x0401f006, 0x48043000, + 0x598c000a, 0x81300580, 0x04020002, 0x481b180a, + 0x0401f254, 0x0401fa64, 0x4df00000, 0x4d300000, + 0x598e6005, 0x813261c0, 0x04000020, 0x59300000, + 0x4c000000, 0x59300c06, 0x82040580, 0x00000011, + 0x04020007, 0x833c0500, 0x00001800, 0x04000015, + 0x8d3e7d16, 0x04020013, 0x0401f009, 0x82040580, + 0x00000004, 0x04020006, 0x8d3e7d16, 0x04000004, + 0x59300420, 0x8c000500, 0x0402000a, 0x0201f800, + 0x0010914e, 0x02000800, 0x0010801c, 0x0201f800, + 0x00109326, 0x0201f800, 0x0002077d, 0x0401fa31, + 0x5c026000, 0x0401f7e0, 0x497b1805, 0x497b1804, + 0x5c026000, 0x5c03e000, 0x04000a31, 0x1c01f000, + 0x4933c857, 0x4c5c0000, 0x4c600000, 0x813261c0, + 0x02000800, 0x001005d8, 0x41300000, 0x598cb805, + 0x405cc000, 0x805cb9c0, 0x04000025, 0x805c0d80, + 0x04000004, 0x405cc000, 0x5860b800, 0x0401f7fa, + 0x598c000d, 0x81300580, 0x02000800, 0x001070b9, + 0x0401fa02, 0x598c0005, 0x805c0580, 0x04020009, + 0x585c0000, 0x48031805, 0x4978b800, 0x598c0004, + 0x805c0580, 0x0402000d, 0x497b1804, 0x0401f00b, + 0x598c0004, 0x805c0580, 0x04020005, 0x48631804, + 0x4978b800, 0x4978c000, 0x0401f004, 0x585c0000, + 0x4800c000, 0x4978b800, 0x0401f9fe, 0x80000580, + 0x5c00c000, 0x5c00b800, 0x1c01f000, 0x82000540, + 0x00000001, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4933c857, 0x0401fa04, 0x4df00000, 0x4d2c0000, + 0x4d340000, 0x4d300000, 0x4c5c0000, 0x4178b800, + 0x8d3e7d18, 0x0400000d, 0x8d3e7d16, 0x0402000b, + 0x0201f800, 0x00109037, 0x04000008, 0x0201f800, + 0x00109597, 0x04020005, 0x592c0207, 0x492fc857, + 0x8200bd00, 0x0000000f, 0x41783000, 0x598e6005, + 0x813261c0, 0x04000029, 0x59326809, 0x813669c0, + 0x04000023, 0x59340403, 0x81440580, 0x04020020, + 0x59300c06, 0x82040580, 0x00000011, 0x0400001a, + 0x82040580, 0x00000004, 0x04020004, 0x59300420, + 0x8c000500, 0x04020016, 0x0201f800, 0x00109037, + 0x04000008, 0x0201f800, 0x00109597, 0x04020005, + 0x59300403, 0x82000580, 0x00000043, 0x0400000c, + 0x0401f8c3, 0x59300000, 0x4c000000, 0x0401f812, + 0x4c180000, 0x0401f836, 0x5c003000, 0x5c026000, + 0x0401f7dc, 0x805cb9c0, 0x040207ec, 0x41303000, + 0x59326000, 0x0401f7d7, 0x5c00b800, 0x5c026000, + 0x5c026800, 0x5c025800, 0x5c03e000, 0x040009b4, + 0x1c01f000, 0x59300800, 0x497a6000, 0x0401f997, + 0x801831c0, 0x04020009, 0x598c0004, 0x81300580, + 0x04020004, 0x48031804, 0x48031805, 0x0401f008, + 0x48071805, 0x0401f006, 0x48043000, 0x598c0004, + 0x81300580, 0x04020002, 0x481b1804, 0x0401f199, + 0x4943c857, 0x0401f9a8, 0x4df00000, 0x0401fe34, + 0x0401fecb, 0x5c03e000, 0x04000999, 0x1c01f000, + 0x4947c857, 0x0401f9a0, 0x4df00000, 0x4d3c0000, + 0x853e7d00, 0x0401fe75, 0x0401fefc, 0x5c027800, + 0x5c03e000, 0x0400098e, 0x1c01f000, 0x5c000000, + 0x4c000000, 0x4803c857, 0x4d340000, 0x4d2c0000, + 0x59326809, 0x59325808, 0x59300406, 0x82000c80, + 0x00000012, 0x02021800, 0x001005d8, 0x4933c857, + 0x4943c857, 0x493fc857, 0x4803c857, 0x0c01f804, + 0x5c025800, 0x5c026800, 0x1c01f000, 0x00106ae5, + 0x00106ae7, 0x00106af1, 0x00106b0b, 0x00106ae7, + 0x00106afb, 0x00106b23, 0x00106ae5, 0x00106ae5, + 0x00106b36, 0x00106b2d, 0x00106ae5, 0x00106ae5, + 0x00106ae5, 0x00106ae5, 0x00106ae5, 0x00106b3c, + 0x00106b3c, 0x0201f800, 0x001005d8, 0x0201f800, + 0x00109134, 0x02000800, 0x00102074, 0x0201f800, + 0x00109326, 0x0201f800, 0x0010801c, 0x0201f000, + 0x00107911, 0x812e59c0, 0x02020800, 0x001005d8, + 0x5930021d, 0x82000580, 0x00000003, 0x02000800, + 0x0010912a, 0x0201f000, 0x00107911, 0x0201f800, + 0x00109037, 0x02000000, 0x00107911, 0x592c1204, + 0x82081500, 0x000000ff, 0x82080580, 0x00000055, + 0x02020800, 0x001005d8, 0x49425a06, 0x0201f800, + 0x000202da, 0x0201f000, 0x00107911, 0x59300004, + 0x8400055c, 0x48026004, 0x59300007, 0x8c000500, + 0x02020800, 0x00100e99, 0x0201f800, 0x00109037, + 0x0400000d, 0x4a025a04, 0x00000103, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x001091c6, 0x0201f800, + 0x0010a693, 0x0201f800, 0x000202da, 0x0201f800, + 0x0010912a, 0x0201f000, 0x00107911, 0x59300007, + 0x8c000500, 0x02020800, 0x00100e99, 0x0201f800, + 0x00109037, 0x02020800, 0x0010a3ef, 0x0201f000, + 0x00107911, 0x0201f800, 0x00109037, 0x04000005, + 0x49425a06, 0x497a5c09, 0x0201f800, 0x000202da, + 0x0201f000, 0x00107911, 0x0201f800, 0x00109037, + 0x02020800, 0x0010664f, 0x0201f000, 0x00107911, + 0x0201f800, 0x00109037, 0x04000004, 0x49425a06, + 0x0201f800, 0x000202da, 0x59325817, 0x0201f800, + 0x001007fd, 0x0201f000, 0x00107911, 0x598c000d, + 0x81300580, 0x04000003, 0x497a6007, 0x1c01f000, + 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, + 0x4a038804, 0x0000000c, 0x497b2807, 0x0401f00a, + 0x0401facd, 0x59300403, 0x82000d80, 0x00000040, + 0x04000004, 0x82000580, 0x00000042, 0x04020002, + 0x497a6007, 0x0201f800, 0x001070b9, 0x80000580, + 0x1c01f000, 0x59300804, 0x8c040d3e, 0x04020004, + 0x82000540, 0x00000001, 0x0401f005, 0x4933c857, + 0x84040d3e, 0x48066004, 0x80000580, 0x1c01f000, + 0x59300804, 0x8c040d20, 0x04020004, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x4d380000, + 0x59300804, 0x84040d20, 0x48066004, 0x42027000, + 0x00000049, 0x59300203, 0x82000580, 0x00000003, + 0x04000003, 0x42027000, 0x00000013, 0x0201f800, + 0x000207a1, 0x80000580, 0x5c027000, 0x1c01f000, + 0x59300017, 0x81480580, 0x04020003, 0x59300018, + 0x814c0580, 0x1c01f000, 0x4d2c0000, 0x4d300000, + 0x0401f8c9, 0x4df00000, 0x0201f800, 0x00106062, + 0x59900001, 0x82000500, 0x00000003, 0x0c01f001, + 0x00106bba, 0x00106b9a, 0x00106b98, 0x00106b98, + 0x0201f800, 0x001005d8, 0x59926004, 0x0401f88e, + 0x813261c0, 0x0400001d, 0x59300004, 0x8c000516, + 0x04000004, 0x59325808, 0x497a5808, 0x497a5809, + 0x0401f88e, 0x59300001, 0x800001c0, 0x0400000e, + 0x497a6001, 0x42003000, 0x0000bf2e, 0x58180801, + 0x800409c0, 0x04020004, 0x48003001, 0x48003000, + 0x0401f00a, 0x58180800, 0x48000800, 0x48003000, + 0x0401f006, 0x59300809, 0x800409c0, 0x02000800, + 0x001005d8, 0x4978080c, 0x5c03e000, 0x04000890, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x4d300000, + 0x497b2807, 0x0401f894, 0x4df00000, 0x598c0000, + 0x82000500, 0x00000007, 0x4803c857, 0x0c01f001, + 0x00106bef, 0x00106bd2, 0x00106bdb, 0x00106bdf, + 0x00106bea, 0x00106bef, 0x00106bd0, 0x00106bd0, + 0x0201f800, 0x001005d8, 0x598c000d, 0x80026540, + 0x04000004, 0x0401f81e, 0x02020800, 0x001005d8, + 0x0201f800, 0x001070b9, 0x0401f015, 0x0401f827, + 0x0201f800, 0x001070b9, 0x0401f011, 0x598c000d, + 0x80026540, 0x0400000e, 0x0401f838, 0x04000004, + 0x0401f80f, 0x04000002, 0x0401f81c, 0x0201f800, + 0x001070b9, 0x0401f006, 0x0401f830, 0x02020800, + 0x001005d8, 0x0201f800, 0x001070b9, 0x5c03e000, + 0x0400085b, 0x5c026000, 0x1c01f000, 0x598c0009, + 0x81300580, 0x0402000c, 0x0401f84e, 0x0401f83b, + 0x59300000, 0x800001c0, 0x04000004, 0x48031809, + 0x497a6000, 0x0401f003, 0x497b1809, 0x497b1808, + 0x80000580, 0x1c01f000, 0x4d2c0000, 0x59300406, + 0x82000580, 0x00000003, 0x04020012, 0x598c000b, + 0x81300580, 0x0402000f, 0x0401f83a, 0x59325808, + 0x497a5808, 0x497a5809, 0x0401f824, 0x59300000, + 0x800001c0, 0x04000004, 0x4803180b, 0x497a6000, + 0x0401f003, 0x497b180a, 0x497b180b, 0x80000580, + 0x5c025800, 0x1c01f000, 0x598c0005, 0x81300580, + 0x0402000c, 0x0401f827, 0x0401f814, 0x59300000, + 0x800001c0, 0x04000004, 0x48031805, 0x497a6000, + 0x0401f003, 0x497b1805, 0x497b1804, 0x80000580, + 0x1c01f000, 0x4a032001, 0x00000000, 0x497b2004, + 0x497b2005, 0x59900006, 0x82000500, 0x0000ffff, + 0x48032006, 0x1c01f000, 0x4c040000, 0x59300004, + 0x82000500, 0x7ffeffff, 0x48026004, 0x59bc00e4, + 0x8c000514, 0x04000009, 0x42000800, 0x0000bf00, + 0x58040012, 0x81300580, 0x04020004, 0x49780812, + 0x4a0378e4, 0x00000800, 0x5c000800, 0x1c01f000, + 0x4803c856, 0x598c000c, 0x80000540, 0x04000003, + 0x80000040, 0x4803180c, 0x1c01f000, 0x59bc00ea, + 0x82000500, 0x00000007, 0x82000580, 0x00000003, + 0x04020004, 0x4803c856, 0x4a0378e8, 0x00000001, + 0x1c01f000, 0x59bc00ea, 0x82000500, 0x00000007, + 0x82000580, 0x00000001, 0x04020011, 0x4803c856, + 0x42000800, 0x00000000, 0x0401f80e, 0x42000800, + 0x00001000, 0x59bc00ea, 0x82000500, 0x00000007, + 0x82000580, 0x00000003, 0x04000005, 0x80040840, + 0x040207f9, 0x0201f800, 0x001005d8, 0x1c01f000, + 0x59bc00ea, 0x82000500, 0x00000007, 0x82000580, + 0x00000001, 0x02020800, 0x001005d8, 0x59bc00ea, + 0x8c000516, 0x040207fe, 0x480778e1, 0x1c01f000, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480778e1, + 0x59bc00ea, 0x8c000516, 0x040207fe, 0x480b78e1, + 0x1c01f000, 0x82000d00, 0x80000018, 0x02020800, + 0x001005d0, 0x0201f800, 0x001005d8, 0x00106c97, + 0x00106d3b, 0x00106d55, 0x00106c97, 0x00106c99, + 0x00106cba, 0x00106cd9, 0x00106d0d, 0x00106c97, + 0x00106d39, 0x00106c97, 0x00106c97, 0x00106c97, + 0x00106c97, 0x00106c97, 0x00106c97, 0x0201f800, + 0x001005d8, 0x4d300000, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x0201f800, 0x001070d8, + 0x59bc00ea, 0x8c000510, 0x040007fe, 0x59be60e0, + 0x59300004, 0x8c000520, 0x04000011, 0x82000500, + 0xfffefeff, 0x48026004, 0x4a026203, 0x00000003, + 0x0401ffa9, 0x0201f800, 0x00100fd0, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x5c026000, + 0x4a0378e4, 0x00000008, 0x0401f795, 0x84000510, + 0x48026004, 0x0401f7f6, 0x4d300000, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0201f800, + 0x001070d8, 0x59bc00ea, 0x8c000510, 0x040007fe, + 0x59be60e0, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0401ff8a, + 0x0201f800, 0x0010100e, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x4a0378e4, + 0x00000008, 0x0401f776, 0x84000510, 0x48026004, + 0x0401f7f6, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4da40000, 0x4cd00000, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, + 0x001005d8, 0x59300004, 0x8c000520, 0x0400001d, + 0x82000500, 0xfffefeff, 0x48026004, 0x59326809, + 0x42034800, 0x0010b544, 0x04011000, 0x4a03c840, + 0x0010b54b, 0x4a03c842, 0x00000012, 0x04011000, + 0x4a03c840, 0x0010b55d, 0x4a03c842, 0x000000ff, + 0x04011000, 0x4a03c840, 0x0010b65c, 0x4a03c842, + 0x000000ff, 0x0401fbf2, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x84000510, 0x48026004, 0x5c01a000, 0x5c034800, + 0x5c026800, 0x5c025800, 0x5c026000, 0x1c01f000, + 0x1c01f000, 0x4d300000, 0x4d2c0000, 0x4d340000, + 0x4cd00000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x0401fbc3, 0x59bc00ea, 0x8c000510, + 0x040007fe, 0x59be60e0, 0x813261c0, 0x02000800, + 0x001005d8, 0x59300004, 0x8c000520, 0x0400000f, + 0x82000500, 0xfffefeff, 0x48026004, 0x0201f800, + 0x0010783a, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x5c01a000, 0x5c026800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x84000510, 0x48026004, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c01a000, 0x5c026800, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x0201f800, 0x001005d8, 0x4d300000, + 0x4d380000, 0x42000000, 0x0010b8c4, 0x0201f800, + 0x0010aa47, 0x0401ff14, 0x598e600d, 0x59c40004, + 0x8c000506, 0x04000004, 0x0401f8db, 0x4a038804, + 0x00000008, 0x813261c0, 0x04000006, 0x0401fb87, + 0x42027000, 0x00000014, 0x0201f800, 0x000207a1, + 0x4a0378e4, 0x00000002, 0x5c027000, 0x5c026000, + 0x0401f6f7, 0x4d180000, 0x4d300000, 0x4d380000, + 0x4d900000, 0x4dd00000, 0x4da40000, 0x4d140000, + 0x0401fef9, 0x417a3000, 0x59c40804, 0x83180400, + 0x0010709f, 0x50000000, 0x80040500, 0x0400001b, + 0x42000000, 0x0010b8c5, 0x0201f800, 0x0010aa47, + 0x0401fb70, 0x59926004, 0x0401f859, 0x83180400, + 0x0010709f, 0x50000000, 0x48038804, 0x813261c0, + 0x0400000a, 0x59300004, 0x8c00050c, 0x04020003, + 0x4a026203, 0x00000003, 0x42027000, 0x0000004a, + 0x0201f800, 0x000207a1, 0x59c40004, 0x82000500, + 0x00f80000, 0x04000005, 0x811a3000, 0x83180480, + 0x00000005, 0x040017dd, 0x4a0378e4, 0x00000008, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x5c027000, 0x5c026000, 0x5c023000, 0x0401f6c0, + 0x4d2c0000, 0x4d340000, 0x59326809, 0x598c0800, + 0x82040580, 0x00000004, 0x04020004, 0x838c1400, + 0x00000005, 0x0401f00c, 0x82040580, 0x00000001, + 0x04020004, 0x838c1400, 0x00000009, 0x0401f006, + 0x82040580, 0x00000002, 0x04020022, 0x838c1400, + 0x0000000b, 0x41306800, 0x58340000, 0x80007d40, + 0x0400001c, 0x583c0009, 0x81340580, 0x04020006, + 0x403c6800, 0x583c0000, 0x80007d40, 0x040207fa, + 0x0401f014, 0x4933c857, 0x483fc857, 0x583c0000, + 0x48006800, 0x49307800, 0x443c1000, 0x80000580, + 0x4803180d, 0x4803180f, 0x598c0000, 0x82000580, + 0x00000003, 0x04000003, 0x4a031800, 0x00000000, + 0x80000580, 0x5c026800, 0x5c025800, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fb, 0x491bc857, + 0x59c80840, 0x82040540, 0x00000010, 0x48039040, + 0x59c41008, 0x82080500, 0xffffff7f, 0x48038808, + 0x4c040000, 0x4c080000, 0x0401fabb, 0x04020007, + 0x0401fabf, 0x04000022, 0x48038804, 0x0201f800, + 0x0010107a, 0x0401f042, 0x4a038803, 0x00000008, + 0x59c40003, 0x82000500, 0x00000003, 0x040007fd, + 0x8c000502, 0x04020007, 0x0401fab1, 0x04000014, + 0x48038804, 0x0201f800, 0x0010107a, 0x0401f034, + 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, + 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, + 0xc0000000, 0x04000006, 0x59c400a3, 0x84000540, + 0x480388a3, 0x4a038805, 0xc0000000, 0x0201f800, + 0x0010101d, 0x4a03a005, 0x30000000, 0x59d00006, + 0x4a03a005, 0x30000000, 0x59900006, 0x82000500, + 0xffff0000, 0x48032006, 0x59d00005, 0x8c000504, + 0x040207fe, 0x42000800, 0x00007600, 0x83180540, + 0x60000000, 0x480008a1, 0x811800dc, 0x59c80840, + 0x80040540, 0x48039040, 0x82000540, 0x00003000, + 0x48039040, 0x59c80040, 0x82000500, 0x00003000, + 0x040207fd, 0x0201f800, 0x00101068, 0x83180400, + 0x0010709f, 0x50000000, 0x48038804, 0x80000580, + 0x4df00000, 0x0201f800, 0x00106062, 0x5c03e000, + 0x5c001000, 0x5c000800, 0x480b8808, 0x48079040, + 0x1c01f000, 0x4803c856, 0x59c80840, 0x82040540, + 0x00000010, 0x48039040, 0x59c41008, 0x82080500, + 0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000, + 0x59c40004, 0x82000500, 0x00000003, 0x04020010, + 0x59c40004, 0x82000500, 0x0000000c, 0x04000005, + 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f025, + 0x59c80040, 0x8400056e, 0x48039040, 0x59c80040, + 0x8c00052e, 0x040207fe, 0x0401f01e, 0x4a038803, + 0x00000008, 0x59c40003, 0x82000500, 0x00000003, + 0x040007fd, 0x8c000502, 0x04020006, 0x59c40004, + 0x4a038804, 0x0000000c, 0x8c000504, 0x0401f011, + 0x59c80040, 0x8400056a, 0x48039040, 0x59c80040, + 0x8c00052a, 0x040207fe, 0x59c40005, 0x82000500, + 0xc0000000, 0x04000007, 0x59c400a3, 0x84000540, + 0x480388a3, 0x4a038805, 0xc0000000, 0x80000580, + 0x497b2807, 0x5c001000, 0x5c000800, 0x480b8808, + 0x48079040, 0x1c01f000, 0x4933c857, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x0401fdee, + 0x4df00000, 0x0401fa6f, 0x59900004, 0x800001c0, + 0x04000011, 0x81300580, 0x0402000f, 0x59300004, + 0x84000520, 0x48026004, 0x0401ff51, 0x04020009, + 0x5c03e000, 0x04000dd6, 0x80000580, 0x5c022800, + 0x5c034800, 0x5c03a000, 0x5c032000, 0x1c01f000, + 0x0401fd0e, 0x42027000, 0x00000049, 0x59300004, + 0x84000520, 0x48026004, 0x8c00050c, 0x02020800, + 0x000207a1, 0x5c03e000, 0x04000dc5, 0x82000540, + 0x00000001, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x1c01f000, 0x4933c857, 0x0401fdc6, + 0x4df00000, 0x598c000d, 0x80026540, 0x04000012, + 0x59300004, 0x84000520, 0x48026004, 0x0401ff8a, + 0x04000017, 0x0401fd26, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x02020800, 0x000207a1, + 0x5c03e000, 0x04000daa, 0x82000540, 0x00000001, + 0x1c01f000, 0x836c1580, 0x00000001, 0x040007f9, + 0x836c1580, 0x00000004, 0x040007f6, 0x42001000, + 0x00104148, 0x0201f800, 0x00105f90, 0x5c03e000, + 0x04000d9b, 0x80000580, 0x1c01f000, 0x4d300000, + 0x4d180000, 0x4d3c0000, 0x0401fd9f, 0x4df00000, + 0x4a0378e4, 0x0000000f, 0x0401f9ff, 0x417a3000, + 0x59926004, 0x813261c0, 0x04000010, 0x417a7800, + 0x0201f800, 0x001048d9, 0x0400000a, 0x59300c06, + 0x82040580, 0x00000003, 0x04000004, 0x82040580, + 0x00000006, 0x04020003, 0x42027800, 0x00000002, + 0x0201f800, 0x00108be3, 0x811a3000, 0x83180480, + 0x00000005, 0x040017eb, 0x42000800, 0x00000040, + 0x0201f800, 0x00101345, 0x4a0378e4, 0x0000000a, + 0x5c03e000, 0x04000d72, 0x5c027800, 0x5c023000, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0401fd75, 0x4df00000, 0x59c80840, 0x82040540, + 0x00000010, 0x48039040, 0x59c41008, 0x82080500, + 0xffffff7f, 0x48038808, 0x4c040000, 0x4c080000, + 0x42001000, 0x00000003, 0x0401f9c2, 0x598e600d, + 0x813261c0, 0x04020f9d, 0x040009c7, 0x497b2807, + 0x0401f80a, 0x5c001000, 0x5c000800, 0x480b8808, + 0x84040d74, 0x48079040, 0x5c03e000, 0x04000d50, + 0x5c026000, 0x1c01f000, 0x4d380000, 0x4d180000, + 0x4d300000, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x59c41004, 0x480bc857, 0x82080500, + 0x00003ff0, 0x04000025, 0x417a3000, 0x4c080000, + 0x0201f800, 0x00106062, 0x5c001000, 0x82080500, + 0x00000210, 0x04020004, 0x811a3000, 0x80081102, + 0x0401f7f7, 0x0401f9c3, 0x59926004, 0x4933c857, + 0x813261c0, 0x04020005, 0x59c400a3, 0x8c00051a, + 0x02000800, 0x001005d8, 0x0401fea5, 0x04000009, + 0x0401fc6a, 0x42027000, 0x00000049, 0x59300004, + 0x8c00050c, 0x02020800, 0x000207a1, 0x0401f007, + 0x42027000, 0x0000004a, 0x4a026203, 0x00000003, + 0x0201f800, 0x000207a1, 0x5c022800, 0x5c034800, + 0x5c03a000, 0x5c032000, 0x5c026000, 0x5c023000, + 0x5c027000, 0x1c01f000, 0x4d300000, 0x4d180000, + 0x4d900000, 0x0401fd1c, 0x42001000, 0x00000000, + 0x598c0000, 0x82000580, 0x00000005, 0x04000971, + 0x417a3000, 0x811b20c8, 0x83932400, 0x0000bf32, + 0x59900001, 0x82000580, 0x00000001, 0x0402000d, + 0x42000800, 0x000007d0, 0x59926004, 0x59300011, + 0x82000500, 0xfff00000, 0x80000540, 0x04000003, + 0x42000800, 0x00001b58, 0x0201f800, 0x00106054, + 0x811a3000, 0x83180480, 0x00000005, 0x040017ea, + 0x59c81040, 0x84081534, 0x480b9040, 0x0401fcf0, + 0x5c032000, 0x5c023000, 0x5c026000, 0x1c01f000, + 0x4933c857, 0x4d900000, 0x4dd00000, 0x4da40000, + 0x4d140000, 0x4d380000, 0x0401fcef, 0x4df00000, + 0x59300004, 0x8c00053e, 0x04020007, 0x8c000520, + 0x04000025, 0x0201f800, 0x00106b6c, 0x04000022, + 0x0401f02a, 0x598c000d, 0x81300580, 0x04000011, + 0x0201f800, 0x00108cd6, 0x04020024, 0x0401f918, + 0x04000022, 0x48038804, 0x0401f95e, 0x0201f800, + 0x0010107a, 0x0401fc0d, 0x42027000, 0x00000049, + 0x59300004, 0x8c00050c, 0x0402000d, 0x0401f00e, + 0x59c40004, 0x8c000504, 0x04000014, 0x4a038804, + 0x00000004, 0x0401fc36, 0x42027000, 0x00000013, + 0x59300004, 0x8c00050c, 0x04000003, 0x0201f800, + 0x000207a1, 0x5c03e000, 0x04000cb9, 0x5c027000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x04000cb0, + 0x5c027000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x82000540, 0x00000001, 0x1c01f000, + 0x497b2807, 0x0401fcb0, 0x59c400af, 0x800001c0, + 0x04020004, 0x0401fca2, 0x0201f000, 0x001014fb, + 0x598c000f, 0x82001480, 0x00000002, 0x04021007, + 0x80000000, 0x4803180f, 0x80000580, 0x0201f800, + 0x0010604d, 0x0400000e, 0x0401fed8, 0x0402000c, + 0x0401fdd4, 0x0400000a, 0x0201f800, 0x0010a9c7, + 0x0401f916, 0x4d380000, 0x42027000, 0x00000014, + 0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc88, + 0x0201f000, 0x001014fb, 0x4d900000, 0x4dd00000, + 0x4da40000, 0x4d140000, 0x4d300000, 0x0201f800, + 0x00106062, 0x0401fc88, 0x59c400af, 0x800001c0, + 0x04000027, 0x0401f907, 0x59926004, 0x4933c857, + 0x59300004, 0x8c000516, 0x0400000b, 0x0401fe8b, + 0x0402001f, 0x0201f800, 0x00106b8a, 0x0401fc70, + 0x42000800, 0x80000804, 0x0201f800, 0x00106721, + 0x0401f017, 0x42001800, 0x00007530, 0x0401f8c1, + 0x04020004, 0x0201f800, 0x00106052, 0x0401f010, + 0x0401fe7a, 0x0402000e, 0x0201f800, 0x0010a9c7, + 0x59300004, 0x8c00050c, 0x04020003, 0x4a026203, + 0x00000003, 0x4d380000, 0x42027000, 0x0000004a, + 0x0201f800, 0x000207a1, 0x5c027000, 0x0401fc54, + 0x5c026000, 0x5c022800, 0x5c034800, 0x5c03a000, + 0x5c032000, 0x0201f000, 0x001014fb, 0x4d900000, + 0x4dd00000, 0x4da40000, 0x4d140000, 0x4d300000, + 0x4d2c0000, 0x0401fc50, 0x0401f8d2, 0x59926004, + 0x4933c857, 0x0401f880, 0x04000016, 0x0201f800, + 0x00106062, 0x813261c0, 0x04000034, 0x59325808, + 0x812e59c0, 0x02000800, 0x001005d8, 0x0201f800, + 0x0010513b, 0x0402001d, 0x592c0208, 0x84000550, + 0x48025a08, 0x0201f800, 0x00105258, 0x04020027, + 0x592c0208, 0x84000510, 0x48025a08, 0x0401f023, + 0x0201f800, 0x00106052, 0x0401f020, 0x0201f800, + 0x0010a9c7, 0x0401fd9e, 0x592c0208, 0x84000550, + 0x48025a08, 0x4d380000, 0x42027000, 0x0000004a, + 0x4a026203, 0x00000003, 0x0201f800, 0x000207a1, + 0x5c027000, 0x0401f011, 0x59900006, 0x82000500, + 0xffff0000, 0x040207ee, 0x59c408af, 0x82040480, + 0x000003e8, 0x040217ea, 0x59900006, 0x82000400, + 0x00010000, 0x48032006, 0x0201f800, 0x00106052, + 0x0201f800, 0x0010411d, 0x5c025800, 0x5c026000, + 0x5c022800, 0x5c034800, 0x5c03a000, 0x5c032000, + 0x0401f403, 0x4d300000, 0x4d2c0000, 0x0401fc0a, + 0x598e600d, 0x4933c857, 0x59c41004, 0x8c081500, + 0x04000007, 0x0201f800, 0x0010513b, 0x04020007, + 0x0201f800, 0x00105258, 0x0402002f, 0x0201f800, + 0x0010604d, 0x0401f02c, 0x598c000f, 0x80000540, + 0x04020011, 0x59c408af, 0x82040480, 0x000003e8, + 0x0402100d, 0x598c080f, 0x80040800, 0x4807180f, + 0x0201f800, 0x0010604d, 0x42000000, 0x0010b852, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010411d, + 0x0401f019, 0x0401fdb4, 0x813261c0, 0x04020003, + 0x0401f849, 0x0401f014, 0x0201f800, 0x0010a9c7, + 0x59300406, 0x82000580, 0x00000003, 0x04020007, + 0x59325808, 0x812e59c0, 0x04000004, 0x592c0208, + 0x84000550, 0x48025a08, 0x0401f854, 0x4d380000, + 0x42027000, 0x00000014, 0x0201f800, 0x000207a1, + 0x5c027000, 0x5c025800, 0x5c026000, 0x0201f000, + 0x00106c4b, 0x59c40804, 0x83180400, 0x00107095, + 0x50000000, 0x80040500, 0x1c01f000, 0x59c40804, + 0x83180400, 0x0010709a, 0x50000000, 0x80040500, + 0x1c01f000, 0x00000210, 0x00000420, 0x00000840, + 0x00001080, 0x00002100, 0x00004000, 0x00008000, + 0x00010000, 0x00020000, 0x00040000, 0x00080000, + 0x00100000, 0x00200000, 0x00400000, 0x00800000, + 0x59900806, 0x80040120, 0x800c0480, 0x04021004, + 0x82000540, 0x00000001, 0x0401f005, 0x82040c00, + 0x00010000, 0x48072006, 0x80000580, 0x1c01f000, + 0x480bc857, 0x0201f800, 0x00106c55, 0x4df00000, + 0x480b1800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x1c01f000, 0x4803c856, 0x0201f800, 0x00106c55, + 0x4df00000, 0x497b180d, 0x497b1803, 0x497b180e, + 0x497b180f, 0x497b1810, 0x598c0000, 0x82000580, + 0x00000003, 0x04000009, 0x836c0580, 0x00000002, + 0x04020004, 0x4a031800, 0x00000005, 0x0401f003, + 0x4a031800, 0x00000000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x1c01f000, 0x59300004, 0x8c00050c, + 0x04020003, 0x4a026203, 0x00000001, 0x1c01f000, + 0x83180480, 0x00000005, 0x02021800, 0x001005d8, + 0x491bc857, 0x811b20c8, 0x83932400, 0x0000bf32, + 0x811ba0ca, 0x83d3a400, 0x00007600, 0x83180400, + 0x001070ea, 0x50034800, 0x811a28c2, 0x83162c00, + 0x00006100, 0x1c01f000, 0x0010b75b, 0x0010b772, + 0x0010b789, 0x0010b7a0, 0x0010b7b7, 0x4933c857, + 0x59300406, 0x82000c80, 0x00000012, 0x04021016, + 0x4803c857, 0x04011000, 0x0c01f001, 0x00107109, + 0x00107198, 0x001074d1, 0x00107556, 0x00107198, + 0x001074d1, 0x00107556, 0x00107109, 0x00107198, + 0x00107109, 0x00107109, 0x00107109, 0x00107109, + 0x00107109, 0x00107109, 0x00107109, 0x0010710f, + 0x0010710f, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x00106c4b, 0x42001000, + 0x0010b7f6, 0x50081000, 0x4930100c, 0x58080002, + 0x82000580, 0x00000100, 0x04020032, 0x59325808, + 0x812e59c0, 0x02000800, 0x001005d8, 0x59326809, + 0x813669c0, 0x04000019, 0x592c040b, 0x82000500, + 0x0000e000, 0x04000003, 0x0401fba8, 0x0401f002, + 0x0401fb98, 0x42001000, 0x0010b7f6, 0x50081000, + 0x4930100b, 0x492c100a, 0x82d00400, 0x00000006, + 0x48001003, 0x592c000d, 0x80000104, 0x48001004, + 0x592c000e, 0x48001007, 0x592c000f, 0x48001008, + 0x0201f000, 0x00100858, 0x42026800, 0x0010be0d, + 0x592c080a, 0x48066802, 0x82040500, 0x00ffff00, + 0x04000007, 0x497a6a12, 0x59a81010, 0x82081500, + 0x00ffff00, 0x80080580, 0x040207dc, 0x82040d00, + 0x000000ff, 0x800408d0, 0x48066a12, 0x0401f7d7, + 0x1c01f000, 0x4d2c0000, 0x4d300000, 0x4c580000, + 0x4c540000, 0x4c500000, 0x5832580a, 0x812e59c0, + 0x02000800, 0x001005d8, 0x58300002, 0x4a006002, + 0x00000100, 0x82000580, 0x00000100, 0x0402001c, + 0x5830000b, 0x5832600c, 0x81300580, 0x04020010, + 0x0401f828, 0x04020010, 0x592c080d, 0x80040904, + 0x4004b000, 0x4200a000, 0x0010b54b, 0x4050a800, + 0x0201f800, 0x0010ab28, 0x42001000, 0x0000dc00, + 0x0201f800, 0x001078bc, 0x0401f003, 0x0401f819, + 0x04000fa3, 0x5c00a000, 0x5c00a800, 0x5c00b000, + 0x5c026000, 0x5c025800, 0x1c01f000, 0x5830000b, + 0x5832600c, 0x81300580, 0x040207f5, 0x0401f80d, + 0x040207f5, 0x0201f800, 0x001068d3, 0x02020800, + 0x001005d8, 0x4a025a06, 0x00000002, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x0401f7ea, + 0x0201f800, 0x00106c55, 0x4df00000, 0x598c000d, + 0x81300580, 0x04020009, 0x598c0005, 0x81300580, + 0x04020006, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x80000580, 0x1c01f000, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300403, 0x82000c80, 0x00000056, 0x02021800, + 0x001005d8, 0x4803c857, 0x0c01f001, 0x00107302, + 0x0010731d, 0x0010732e, 0x00107431, 0x001073f1, + 0x001073f5, 0x00107406, 0x0010741a, 0x0010740f, + 0x0010741a, 0x00107455, 0x0010741a, 0x00107497, + 0x0010741a, 0x001074a5, 0x0010741a, 0x0010740f, + 0x0010741a, 0x001074a9, 0x001071f5, 0x001071f5, + 0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001071f5, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001071f5, 0x00107574, 0x00107593, 0x0010759d, + 0x001071f5, 0x001075b3, 0x00107406, 0x001071f5, + 0x00107406, 0x0010741a, 0x001071f5, 0x0010732e, + 0x00107431, 0x001071f5, 0x00107603, 0x0010741a, + 0x001071f5, 0x00107613, 0x0010741a, 0x001071f5, + 0x0010740f, 0x001072f3, 0x001071f7, 0x001071f5, + 0x0010762a, 0x0010765d, 0x001076d7, 0x001071f5, + 0x001076e7, 0x00107404, 0x001076da, 0x001071f5, + 0x001075bf, 0x00107700, 0x001071f5, 0x00107735, + 0x00107788, 0x001071f5, 0x0010720c, 0x00107265, + 0x00107272, 0x001071f5, 0x00107406, 0x001071f5, + 0x001072b9, 0x001072c4, 0x001071f5, 0x001071f5, + 0x00107220, 0x00107245, 0x001077c7, 0x00107808, + 0x0010782e, 0x001071f5, 0x001071f5, 0x001071f5, + 0x001077fc, 0x0201f800, 0x001005d8, 0x0401fac5, + 0x59325808, 0x592c0009, 0x4801a006, 0x592c000a, + 0x4801a007, 0x592c000b, 0x4801a008, 0x592c000c, + 0x4801a009, 0x592c000d, 0x4801a00a, 0x4979a00b, + 0x592c0809, 0x82040d00, 0x00000fff, 0x80040904, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x4a026202, 0x0000ffff, 0x0401faae, 0x4d2c0000, + 0x4a01a006, 0x05000000, 0x59325808, 0x592c0009, + 0x4801a007, 0x592c000a, 0x4801a008, 0x592c000b, + 0x4801a009, 0x42000800, 0x00000004, 0x42001000, + 0x0000dc00, 0x5c025800, 0x0201f000, 0x001078bc, + 0x4c580000, 0x4c500000, 0x4c540000, 0x4d2c0000, + 0x0401fa98, 0x59325808, 0x5930040b, 0x800000c2, + 0x4200a800, 0x0010b54b, 0x592cb205, 0x832ca400, + 0x00000006, 0x0201f800, 0x0010ab17, 0x40580000, + 0x8054ac00, 0x592c0001, 0x80000540, 0x04000003, + 0x40025800, 0x0401f7f5, 0x4200a000, 0x0010b54b, + 0x4050a800, 0x5930b40b, 0x0201f800, 0x0010ab28, + 0x59300c0b, 0x42001000, 0x0000dc00, 0x5c025800, + 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000, + 0x001078bc, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4d2c0000, 0x42034800, 0x0010b544, 0x0401fa7f, + 0x59325808, 0x4a025805, 0x02000000, 0x592c0802, + 0x82d0ac00, 0x00000006, 0x592cb011, 0x832ca400, + 0x00000005, 0x0201f800, 0x0010ab17, 0x40580000, + 0x8054ac00, 0x592e5801, 0x41780000, 0x812e5d40, + 0x040207f6, 0x42001000, 0x0000dc00, 0x5c025800, + 0x5c00a800, 0x5c00b000, 0x5c00a000, 0x0201f000, + 0x001078bc, 0x0401fa57, 0x4a01a006, 0x78000000, + 0x5930001c, 0x840001c0, 0x4801a407, 0x4979a207, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0201f000, 0x001078bc, 0x4c580000, 0x4c540000, + 0x4c500000, 0x0401fa55, 0x4a01a006, 0x02000000, + 0x59a80002, 0x4801a008, 0x59a80003, 0x4801a009, + 0x59a80000, 0x4801a00a, 0x59a80001, 0x4801a00b, + 0x5930001c, 0x82000d80, 0x0000e000, 0x04000016, + 0x82000d80, 0x0000df00, 0x04000006, 0x4a01a407, + 0x00000010, 0x42000800, 0x00000006, 0x0401f027, + 0x4a03c840, 0x0010b4eb, 0x4a03c842, 0x0000000d, + 0x42001800, 0x0010b4eb, 0x0201f800, 0x001007af, + 0x42000000, 0x0000df00, 0x4200a000, 0x0010b4eb, + 0x0401f00d, 0x4a03c840, 0x0010b4f8, 0x4a03c842, + 0x0000000d, 0x42001800, 0x0010b4f8, 0x0201f800, + 0x001007af, 0x42000000, 0x0000e000, 0x4200a000, + 0x0010b4f8, 0x82000540, 0x00000010, 0x4801a407, + 0x4a01a207, 0x00000034, 0x4200b000, 0x0000000d, + 0x82d0ac00, 0x0000000c, 0x0201f800, 0x0010ab17, + 0x42000800, 0x00000013, 0x42001000, 0x0000dc00, + 0x5c00a000, 0x5c00a800, 0x5c00b000, 0x0201f000, + 0x001078bc, 0x0401fa03, 0x4a01a006, 0x63000028, + 0x5930001c, 0x4801a007, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x0401fa06, 0x41780000, 0x41780800, 0x42002000, + 0x00080000, 0x0c01f81b, 0x80000000, 0x80040800, + 0x42001000, 0x0000000c, 0x59841802, 0x8c0c1d00, + 0x04020008, 0x42002000, 0x00050000, 0x0c01f811, + 0x80000000, 0x80040800, 0x82081400, 0x00000004, + 0x82080540, 0x02000000, 0x4801a006, 0x800408e0, + 0x5930001c, 0x80040540, 0x4801a007, 0x80080904, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x001072e9, 0x001072eb, 0x001072ed, 0x001072ef, + 0x001072f1, 0x4811a008, 0x1c01f000, 0x4811a009, + 0x1c01f000, 0x4811a00a, 0x1c01f000, 0x4811a00b, + 0x1c01f000, 0x4811a00c, 0x1c01f000, 0x4a026009, + 0x0010be0d, 0x59a80010, 0x82000500, 0x000000ff, + 0x800000d0, 0x42026800, 0x0010be0d, 0x48026a12, + 0x0401fa3b, 0x41780800, 0x42001000, 0x00005c00, + 0x0201f000, 0x001078bc, 0x0401f9ba, 0x4a01a006, + 0x52000000, 0x4979a007, 0x599c0017, 0x8c000500, + 0x04000005, 0x599c0402, 0x0201f800, 0x001015da, + 0x4805a007, 0x59a80002, 0x4801a008, 0x59a80003, + 0x4801a009, 0x59a80000, 0x4801a00a, 0x59a80001, + 0x4801a00b, 0x59a80010, 0x4801a00c, 0x42000800, + 0x00000007, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f99d, + 0x4a01a006, 0x05000000, 0x59a80010, 0x4801a007, + 0x59a80002, 0x59a80803, 0x4801a008, 0x4805a009, + 0x42000800, 0x00000004, 0x42001000, 0x0000dc00, + 0x0201f000, 0x001078bc, 0x4a026202, 0x0000ffff, + 0x0401f98c, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x001048f6, 0x5c027800, 0x4a01a006, 0x03000000, + 0x59340403, 0x82000580, 0x000007fe, 0x0402006e, + 0x4a01a006, 0x04000000, 0x81a40800, 0x4a000800, + 0x22fffffe, 0x5934000a, 0x84000500, 0x4802680a, + 0x59c41002, 0x8408150c, 0x480b8802, 0x59a80026, + 0x8c000508, 0x04000010, 0x59a8002a, 0x4801a007, + 0x59a8002b, 0x82000500, 0xffff2000, 0x599c0818, + 0x8c040d16, 0x04000002, 0x8400056a, 0x4801a008, + 0x4a01a009, 0x00002710, 0x59a8002d, 0x4801a00a, + 0x0401f039, 0x59a8002a, 0x4801a007, 0x0201f800, + 0x0010513b, 0x04020009, 0x497b8880, 0x82000500, + 0x0000ffff, 0x4c000000, 0x0201f800, 0x00101606, + 0x5c000000, 0x48038880, 0x59a8002b, 0x0201f800, + 0x0010513b, 0x04020004, 0x82000500, 0x37ffffff, + 0x0401f003, 0x82000500, 0x3fffffff, 0x599c0818, + 0x8c040d16, 0x04000002, 0x8400056a, 0x59a80805, + 0x8c040d10, 0x04000019, 0x59300c03, 0x82041580, + 0x00000051, 0x04000015, 0x82041580, 0x00000031, + 0x04000012, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000004, 0x4200a000, 0x0010b8fa, + 0x82d0ac00, 0x0000001f, 0x4c000000, 0x0201f800, + 0x0010ab17, 0x5c000000, 0x5c00a800, 0x5c00a000, + 0x5c00b000, 0x8400057a, 0x4801a008, 0x4979a009, + 0x4979a00a, 0x59a80002, 0x59a80803, 0x4801a00b, + 0x4805a00c, 0x59a80000, 0x59a80801, 0x4801a00d, + 0x4805a00e, 0x4979a00f, 0x4979a010, 0x4979a011, + 0x4979a012, 0x4979a013, 0x4979a014, 0x4979a015, + 0x4979a016, 0x59a8002e, 0x84000576, 0x4801a017, + 0x59a8002f, 0x4801a018, 0x4979a019, 0x4979a01a, + 0x0401f043, 0x59a80026, 0x8c000508, 0x0400000d, + 0x59a8002a, 0x82000500, 0x0000ffff, 0x59c40880, + 0x80040d80, 0x04000007, 0x497b8880, 0x4c000000, + 0x0201f800, 0x00101606, 0x5c000000, 0x48038880, + 0x59a8002a, 0x4801a007, 0x4c640000, 0x4d2c0000, + 0x59a8c82b, 0x0201f800, 0x00109037, 0x0400000d, + 0x0201f800, 0x00109597, 0x0402000a, 0x592c0207, + 0x8c00050e, 0x04000007, 0x8264cd00, 0x0000ffff, + 0x592c0009, 0x82000500, 0xffff0000, 0x8064cd40, + 0x4865a008, 0x5c025800, 0x5c00c800, 0x59a8002c, + 0x4801a009, 0x59a8002d, 0x4801a00a, 0x59a80002, + 0x59a80803, 0x4801a00b, 0x4805a00c, 0x59a80000, + 0x59a80801, 0x4801a00d, 0x4805a00e, 0x4979a00f, + 0x4979a010, 0x4979a011, 0x4979a012, 0x4979a013, + 0x4979a014, 0x4979a015, 0x4979a016, 0x59a8002e, + 0x4801a017, 0x59a8002f, 0x4801a018, 0x59a80030, + 0x4801a019, 0x59a80031, 0x4801a01a, 0x42000800, + 0x0000001d, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x0401f8cb, 0x4a01a006, 0x50000000, + 0x0401f7b5, 0x0401f8c7, 0x4a01a406, 0x21000010, + 0x4a01a206, 0x00000014, 0x4979a007, 0x4979a008, + 0x4979a009, 0x4979a00a, 0x42000800, 0x00000005, + 0x42001000, 0x0000dc00, 0x0201f000, 0x001078bc, + 0x0401f8bf, 0x0401f002, 0x0401f8c4, 0x4a01a006, + 0x02000000, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f8bb, + 0x4a01a006, 0x02000000, 0x59300403, 0x82000580, + 0x00000031, 0x04020794, 0x81a40800, 0x4a000801, + 0x00fffffe, 0x0401f72b, 0x0401f8b0, 0x4a01a006, + 0x01000000, 0x5930041a, 0x80000540, 0x04000003, + 0x4801a407, 0x0401f003, 0x4a01a407, 0x00000003, + 0x5930021a, 0x80000540, 0x04000003, 0x4801a207, + 0x0401f003, 0x4a01a207, 0x00002a00, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x4a026202, 0x0000ffff, 0x0401f889, + 0x4a01a406, 0x00002010, 0x4a01a206, 0x00000014, + 0x4a01a407, 0x00000800, 0x4a01a207, 0x00002000, + 0x80000580, 0x599c0817, 0x8c040d0a, 0x04020003, + 0x82000540, 0x00000020, 0x8c040d08, 0x04000003, + 0x82000540, 0x00000010, 0x82000540, 0x00000002, + 0x5934080a, 0x8c040d14, 0x04000005, 0x82040d00, + 0x00000380, 0x80040540, 0x0401f006, 0x599c0818, + 0x8c040d18, 0x04000003, 0x82000540, 0x00000380, + 0x0401f03c, 0x0401f875, 0x4a01a406, 0x00000210, + 0x4a01a206, 0x00000014, 0x4a01a407, 0x00000800, + 0x5934000a, 0x8c000516, 0x04000014, 0x59340c05, + 0x82040500, 0x00000030, 0x04000013, 0x59340a05, + 0x82040500, 0x0000c000, 0x04020009, 0x8c040d1a, + 0x04000004, 0x4a01a207, 0x00002100, 0x0401f00c, + 0x4a01a207, 0x00000100, 0x0401f009, 0x4a01a207, + 0x00000400, 0x0401f006, 0x4a01a207, 0x00000700, + 0x0401f003, 0x4a01a207, 0x00000800, 0x80000580, + 0x599c0817, 0x8c040d0a, 0x04020003, 0x82000540, + 0x00000020, 0x8c040d08, 0x04000003, 0x82000540, + 0x00000010, 0x82000540, 0x00000002, 0x59340a00, + 0x8c040d0e, 0x0400000b, 0x84000550, 0x599c1017, + 0x8c08150a, 0x04020004, 0x8c040d0a, 0x04000002, + 0x8400054e, 0x8c040d1c, 0x04000002, 0x84000552, + 0x4801a20a, 0x42000800, 0x00000005, 0x42001000, + 0x0000dc00, 0x0201f000, 0x001078bc, 0x0401f833, + 0x4a01a006, 0x02100014, 0x4a01a007, 0x01000000, + 0x4979a008, 0x4979a009, 0x4979a00a, 0x42000800, + 0x00000005, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x0401f825, 0x4a01a006, 0x02000000, + 0x0401f65d, 0x4933c857, 0x0401f820, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x0000000b, 0x42000800, + 0x00000002, 0x42001000, 0x0000dc00, 0x0201f000, + 0x001078bc, 0x42005000, 0x32000000, 0x42006000, + 0x08290000, 0x41786800, 0x41787800, 0x0401f3df, + 0x42005000, 0x22000000, 0x42006000, 0x01290000, + 0x41786800, 0x41787800, 0x0401f3d8, 0x42005000, + 0x33000000, 0x42006000, 0x08980000, 0x41786800, + 0x41787800, 0x0401f3d1, 0x42005000, 0x23000000, + 0x42006000, 0x01980000, 0x41786800, 0x41787800, + 0x0401f3ca, 0x59300403, 0x82000c80, 0x00000085, + 0x02001800, 0x001005d8, 0x82000c80, 0x00000093, + 0x02021800, 0x001005d8, 0x82000480, 0x00000085, + 0x0c01f001, 0x001074eb, 0x001074ed, 0x001074fb, + 0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb, + 0x001074eb, 0x001074eb, 0x001074eb, 0x001074eb, + 0x001074eb, 0x001074eb, 0x00107506, 0x0201f800, + 0x001005d8, 0x4933c857, 0x0401f850, 0x59300402, + 0x4801a407, 0x5930001c, 0x4801a207, 0x4979a408, + 0x4a01a208, 0x0000ffff, 0x42000800, 0x00000003, + 0x42001000, 0x0000dc00, 0x0401f3c2, 0x4933c857, + 0x0401f84e, 0x4a01a406, 0x00000003, 0x4a01a206, + 0x00000300, 0x42000800, 0x00000001, 0x42001000, + 0x0000dc00, 0x0401f3b7, 0x4d2c0000, 0x59325808, + 0x4933c857, 0x492fc857, 0x812e59c0, 0x02000800, + 0x001005d8, 0x59340a12, 0x82040d00, 0x0000ff00, + 0x592c000a, 0x82000500, 0x000000ff, 0x900001c0, + 0x80040540, 0x82000540, 0x00000011, 0x44034800, + 0x81a5a000, 0x42001000, 0x00000009, 0x42000800, + 0x00000003, 0x592c0009, 0x82000500, 0xff000000, + 0x82001d80, 0x84000000, 0x04000009, 0x82001d80, + 0x85000000, 0x02020800, 0x001005d8, 0x42001000, + 0x00000007, 0x42000800, 0x00000001, 0x832c1c00, + 0x00000009, 0x500c0000, 0x4401a000, 0x800c1800, + 0x80d1a000, 0x80081040, 0x040207fb, 0x42001000, + 0x0000dc00, 0x5c025800, 0x0401f386, 0x42005000, + 0x81000000, 0x42006000, 0x00090000, 0x41786800, + 0x41787800, 0x0401f35d, 0x42005000, 0x84000000, + 0x42006000, 0x00990000, 0x59300406, 0x82000580, + 0x00000005, 0x04000002, 0x8430652e, 0x41786800, + 0x41787800, 0x0401f351, 0x42005000, 0x85000000, + 0x42006000, 0x00990000, 0x59300406, 0x82000580, + 0x00000005, 0x04000002, 0x8430652e, 0x41786800, + 0x41787800, 0x0401f345, 0x59300403, 0x82000c80, + 0x00000053, 0x02021800, 0x001005d8, 0x82000480, + 0x0000004b, 0x02001800, 0x001005d8, 0x59326809, + 0x59368c03, 0x4803c857, 0x0c01f001, 0x001075da, + 0x001075e2, 0x001075ea, 0x001075f2, 0x0010756b, + 0x0010756b, 0x0010756b, 0x001075d2, 0x0201f800, + 0x001005d8, 0x42005000, 0x06000000, 0x42006000, + 0x08290000, 0x41786800, 0x41787800, 0x0401f327, + 0x4933c857, 0x0401ff47, 0x4a01a006, 0x12000000, + 0x59300406, 0x82000580, 0x00000004, 0x04020003, + 0x59340002, 0x0401f002, 0x59a80010, 0x82000500, + 0x00ffffff, 0x4801a007, 0x59300419, 0x4801a408, + 0x59300219, 0x4801a208, 0x4979a009, 0x4979a00a, + 0x4979a00b, 0x4979a00c, 0x4979a00d, 0x4979a00e, + 0x4979a00f, 0x4979a010, 0x42000800, 0x0000000b, + 0x42001000, 0x0000dc00, 0x0401f32a, 0x0401ff29, + 0x4a01a006, 0x0f000000, 0x5930001c, 0x4801a007, + 0x42000800, 0x00000002, 0x42001000, 0x0000dc00, + 0x0401f320, 0x0401ff2d, 0x4a01a006, 0x02000000, + 0x59c40085, 0x48031004, 0x59880000, 0x4801a007, + 0x59880001, 0x4801a008, 0x59880002, 0x4801a009, + 0x59880003, 0x4801a00a, 0x59880004, 0x4801a00b, + 0x59880005, 0x4801a00c, 0x42000800, 0x00000007, + 0x42001000, 0x0000dc00, 0x0401f30a, 0x4a026202, + 0x0000ffff, 0x0401ff07, 0x4a01a006, 0x62000000, + 0x5930001c, 0x4801a007, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0401f2fe, 0x0401fefd, + 0x59300808, 0x4c500000, 0x4c540000, 0x4c580000, + 0x8204a400, 0x0000000a, 0x5930b01c, 0x82d0ac00, + 0x00000006, 0x0201f800, 0x0010ab17, 0x5930081c, + 0x42001000, 0x0000dc00, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x0401f2eb, 0x0401ff9b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00001000, 0x0401f020, 0x0401ff93, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00004000, 0x0401f018, 0x0401ff8b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00002000, 0x0401f010, 0x0401ff83, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00000400, 0x0401f008, 0x0401ff7b, 0x59300017, + 0x4801a006, 0x59300018, 0x4801a007, 0x4a01a008, + 0x00000200, 0x4979a009, 0x4979a00a, 0x4979a00b, + 0x4979a00c, 0x4979a00d, 0x42000800, 0x00000008, + 0x42001000, 0x0000dc00, 0x0401f2ba, 0x0401fec7, + 0x4a01a006, 0x02000014, 0x4979a407, 0x4979a207, + 0x59a8003a, 0x4801a008, 0x59a8003b, 0x4801a009, + 0x4a01a00a, 0x00047878, 0x42000800, 0x00000005, + 0x42001000, 0x0000dc00, 0x0401f2aa, 0x0401feb7, + 0x4a01a006, 0x02140018, 0x4a01a407, 0x00000800, + 0x5930001c, 0x82000d00, 0xff000000, 0x900409c0, + 0x4805a207, 0x82000500, 0x00ffffff, 0x4801a00a, + 0x4979a408, 0x4979a208, 0x4979a409, 0x4979a209, + 0x4979a00b, 0x42000800, 0x00000006, 0x42001000, + 0x0000dc00, 0x0401f293, 0x4803c856, 0x4d380000, + 0x4d1c0000, 0x42027000, 0x00000035, 0x0201f800, + 0x001093ba, 0x0402001e, 0x0401fe8a, 0x4a01a006, + 0x13000000, 0x5932381e, 0x591c0019, 0x4801a005, + 0x591c0406, 0x82000580, 0x00000003, 0x04000007, + 0x59300809, 0x58040002, 0x82000500, 0x00ffffff, + 0x4801a007, 0x0401f003, 0x59a80010, 0x4801a007, + 0x59300419, 0x4801a408, 0x59300219, 0x4801a208, + 0x42000800, 0x00000003, 0x42001000, 0x0000dc00, + 0x5c023800, 0x5c027000, 0x0401f26e, 0x0201f800, + 0x00106c55, 0x598c000d, 0x81300580, 0x02020800, + 0x001005d8, 0x0201f800, 0x00106bbf, 0x0201f800, + 0x0002077d, 0x5c023800, 0x5c027000, 0x0201f000, + 0x00106c4b, 0x4803c856, 0x4d2c0000, 0x4d1c0000, + 0x5932381e, 0x811e39c0, 0x02000800, 0x001005d8, + 0x591c0c06, 0x82040580, 0x00000006, 0x0400000d, + 0x82040580, 0x00000003, 0x04000036, 0x4a026403, + 0x00000037, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00001700, 0x5c023800, 0x5c025800, 0x0401f064, + 0x0401f84b, 0x42001000, 0x40000000, 0x591c0203, + 0x591c0804, 0x8c040d3e, 0x04020023, 0x82000c80, + 0x0000000e, 0x0c001003, 0x0201f800, 0x001005d8, + 0x00107691, 0x0010769d, 0x00107693, 0x0010769d, + 0x00107699, 0x00107691, 0x00107691, 0x0010769d, + 0x0010769d, 0x00107691, 0x00107691, 0x00107691, + 0x00107691, 0x00107691, 0x0010769d, 0x00107691, + 0x0010769d, 0x0201f800, 0x001005d8, 0x591c0414, + 0x4803c857, 0x8c000518, 0x04000003, 0x8c000512, + 0x04000003, 0x80001580, 0x0401f003, 0x42001000, + 0x20000000, 0x591c0015, 0x4801a00a, 0x0401f018, + 0x0401f81f, 0x591e5808, 0x812e59c0, 0x02000800, + 0x001005d8, 0x592c100f, 0x591c0011, 0x80080480, + 0x4801a00a, 0x591c0203, 0x591c0804, 0x8c040d3e, + 0x04020007, 0x82000d80, 0x00000002, 0x04000007, + 0x82000d80, 0x00000004, 0x04000004, 0x42001000, + 0x40000000, 0x0401f002, 0x80001580, 0x4809a00b, + 0x42000800, 0x00000006, 0x42001000, 0x0000dc00, + 0x5c023800, 0x5c025800, 0x0401f1fe, 0x4803c856, + 0x0401fe0a, 0x4a01a006, 0x02000000, 0x59300c19, + 0x4805a407, 0x59300a19, 0x4805a207, 0x59a81010, + 0x59300809, 0x58041802, 0x820c1d00, 0x00ffffff, + 0x5930081e, 0x58040406, 0x82000580, 0x00000003, + 0x04020004, 0x4809a008, 0x480da009, 0x0401f003, + 0x480da008, 0x4809a009, 0x1c01f000, 0x4803c856, + 0x0401fdf2, 0x0401f003, 0x4803c856, 0x0401fde8, + 0x4a01a006, 0x01000000, 0x5930041a, 0x4801a407, + 0x5930021a, 0x4801a207, 0x42000800, 0x00000002, + 0x42001000, 0x0000dc00, 0x0401f1d6, 0x4803c856, + 0x4d1c0000, 0x0401fdcc, 0x4a01a006, 0x14000000, + 0x5932381e, 0x591c0019, 0x4801a005, 0x59300419, + 0x4801a407, 0x59300219, 0x4801a207, 0x59300015, + 0x4801a008, 0x59300216, 0x82000500, 0x000000ff, + 0x840001c0, 0x4801a409, 0x42000800, 0x00000004, + 0x42001000, 0x0000dc00, 0x5c023800, 0x0401f1bd, + 0x4803c856, 0x0401f80b, 0x5930041a, 0x900001c0, + 0x4801a005, 0x0401f9ec, 0x41780800, 0x42001000, + 0x00005c00, 0x0401f9b3, 0x0201f000, 0x0010604d, + 0x4803c856, 0x59300817, 0x82041c00, 0x00000005, + 0x46034800, 0x00000021, 0x58040404, 0x82000500, + 0x0000f000, 0x82000580, 0x00003000, 0x04000003, + 0x46034800, 0x00000041, 0x81a5a000, 0x580c0001, + 0x82000d00, 0x00ffffff, 0x82040d40, 0xc2000000, + 0x4805a000, 0x580c0800, 0x82041500, 0x00ffffff, + 0x82000500, 0xff000000, 0x80080540, 0x4801a001, + 0x580c0002, 0x82000580, 0x00c00000, 0x82000500, + 0x00fd0300, 0x4801a002, 0x580c0003, 0x4801a003, + 0x580c0404, 0x4801a404, 0x580c0204, 0x4801a204, + 0x1c01f000, 0x4803c856, 0x59a80026, 0x82000500, + 0x00000028, 0x04020009, 0x59a80026, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f003, + 0x4a026a12, 0x0000ff00, 0x42005000, 0x22000000, + 0x42006000, 0x01380000, 0x41786800, 0x41787800, + 0x0401f952, 0x59301008, 0x4a01a006, 0x54000000, + 0x59a80010, 0x82000500, 0x00ffffff, 0x58080c0a, + 0x800408f0, 0x80040540, 0x4801a007, 0x5808000a, + 0x82000500, 0xff000000, 0x4801a008, 0x59a80002, + 0x4801a009, 0x59a80003, 0x4801a00a, 0x59a80000, + 0x4801a00b, 0x59a80001, 0x4801a00c, 0x5808000c, + 0x9c0001c0, 0x4801a00d, 0x5808000d, 0x9c0001c0, + 0x4801a00e, 0x5808000e, 0x9c0001c0, 0x4801a00f, + 0x5808000f, 0x9c0001c0, 0x4801a010, 0x58080010, + 0x9c0001c0, 0x4801a011, 0x58080011, 0x9c0001c0, + 0x4801a012, 0x58080012, 0x9c0001c0, 0x4801a013, + 0x58080013, 0x9c0001c0, 0x4801a014, 0x58080010, + 0x9c0001c0, 0x4801a015, 0x58080011, 0x9c0001c0, + 0x4801a016, 0x58080012, 0x9c0001c0, 0x4801a017, + 0x58080013, 0x9c0001c0, 0x4801a018, 0x42000800, + 0x00000013, 0x42001000, 0x0000dc00, 0x0401f135, + 0x4803c856, 0x42005000, 0x22000000, 0x42006000, + 0x01290000, 0x41786800, 0x41787800, 0x0401f90b, + 0x59301008, 0x4a01a006, 0x55000000, 0x5808000b, + 0x82000500, 0x00ffffff, 0x58080c0a, 0x800408f0, + 0x80040540, 0x4801a007, 0x5808080a, 0x82040d00, + 0xff000000, 0x59a80010, 0x82000500, 0x00ffffff, + 0x80040540, 0x4801a008, 0x5808000c, 0x9c0001c0, + 0x4801a009, 0x5808000d, 0x9c0001c0, 0x4801a00a, + 0x5808000e, 0x9c0001c0, 0x4801a00b, 0x5808000f, + 0x9c0001c0, 0x4801a00c, 0x59a80002, 0x4801a00d, + 0x59a80003, 0x4801a00e, 0x59a80000, 0x4801a00f, + 0x59a80001, 0x4801a010, 0x58080010, 0x4801a011, + 0x58080011, 0x4801a012, 0x58080012, 0x4801a013, + 0x58080013, 0x4801a014, 0x4979a015, 0x4979a016, + 0x4979a017, 0x4979a018, 0x42000800, 0x00000013, + 0x42001000, 0x0000dc00, 0x0401f0f6, 0x0401fd03, + 0x5930001c, 0x800001c0, 0x04000008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f028, 0x4a01a006, 0x02000000, + 0x41780800, 0x836c0580, 0x00000004, 0x04020003, + 0x84040d42, 0x0401f00d, 0x0201f800, 0x0010513b, + 0x04020003, 0x84040d4a, 0x0401f002, 0x84040d48, + 0x59a80026, 0x8c000506, 0x04020003, 0x8c00050a, + 0x04000002, 0x84040d46, 0x4805a207, 0x59c40085, + 0x48031004, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4200b000, 0x00000006, 0x8388a400, 0x00000000, + 0x82d0ac00, 0x00000008, 0x0201f800, 0x0010ab17, + 0x5c00a800, 0x5c00a000, 0x5c00b000, 0x42000800, + 0x00000008, 0x42001000, 0x0000dc00, 0x0401f0c1, + 0x0401fcc0, 0x4a01a006, 0x56000000, 0x59340006, + 0x4801a007, 0x59340007, 0x4801a008, 0x42000800, + 0x00000003, 0x42001000, 0x0000dc00, 0x0401f0b5, + 0x4803c856, 0x0401fcc1, 0x5930081c, 0x800409c0, + 0x0400000e, 0x82040580, 0x0000ffff, 0x04000004, + 0x82040480, 0x00000007, 0x04021008, 0x4a01a006, + 0x01000000, 0x4a01a407, 0x00000003, 0x42000800, + 0x00000002, 0x0401f012, 0x4a01a006, 0x0200001c, + 0x4a01a007, 0x00000001, 0x42001000, 0x0010b4f0, + 0x50080000, 0x9c0001c0, 0x4801a009, 0x59a80010, + 0x4801a00a, 0x59a80002, 0x59a80803, 0x4801a00b, + 0x4805a00c, 0x42000800, 0x00000007, 0x42001000, + 0x0000dc00, 0x0401f08f, 0x4d2c0000, 0x0401fc8d, + 0x59325808, 0x592c0008, 0x82000500, 0x00ffffff, + 0x4801a001, 0x4a01a006, 0x51000000, 0x5c025800, + 0x0201f000, 0x00107344, 0x4803c856, 0x59a80810, + 0x82040d00, 0x000000ff, 0x59325808, 0x59326809, + 0x59a83026, 0x8c18350a, 0x04020008, 0x8c00050e, + 0x04020006, 0x80001d80, 0x59a82010, 0x82102500, + 0x000000ff, 0x0401f001, 0x59300406, 0x4803c857, + 0x82000d80, 0x00000009, 0x04000006, 0x82000d80, + 0x0000000a, 0x0400002e, 0x0201f800, 0x001005d8, + 0x59300015, 0x8c00051e, 0x04020020, 0x42005000, + 0x04000000, 0x42006000, 0x05000000, 0x592c040a, + 0x82000500, 0x00000030, 0x800000e0, 0x80306540, + 0x5934000a, 0x8c000508, 0x04000002, 0x84306546, + 0x41786800, 0x41787800, 0x0401f831, 0x59300c14, + 0x80040000, 0x48026414, 0x40040000, 0x800000d0, + 0x82000540, 0x00000020, 0x4801a403, 0x83180d40, + 0x00000038, 0x42001000, 0x0000c920, 0x0401f860, + 0x0201f000, 0x00106052, 0x59a80026, 0x82000500, + 0x00000028, 0x04000003, 0x497a6a12, 0x0401f7dc, + 0x4a026a12, 0x0000ff00, 0x0401f7d9, 0x42005000, + 0x02000000, 0x42006000, 0x20290000, 0x41786800, + 0x41787800, 0x0401f812, 0x83180d40, 0x00000038, + 0x42001000, 0x0000c9a0, 0x0401f849, 0x42000800, + 0x000007d0, 0x59300011, 0x82000500, 0xfff00000, + 0x80000540, 0x04000003, 0x42000800, 0x00001b58, + 0x41781000, 0x0201f000, 0x00106054, 0x4201a000, + 0x00000000, 0x0401f003, 0x4201a000, 0x00000011, + 0x59340a12, 0x82040d00, 0x0000ff00, 0x59a80010, + 0x82000500, 0x000000ff, 0x900001c0, 0x80040540, + 0x80d00540, 0x44034800, 0x81a5a000, 0x59340002, + 0x82000500, 0x00ffffff, 0x80280540, 0x4801a000, + 0x59a80010, 0x4801a001, 0x4831a002, 0x82340540, + 0x00000000, 0x4801a003, 0x59300402, 0x4801a404, + 0x59300a02, 0x4805a204, 0x8c30652e, 0x04000003, + 0x4805a404, 0x4801a204, 0x483da005, 0x1c01f000, + 0x4803c856, 0x4c040000, 0x0401f822, 0x5c000800, + 0x40040000, 0x80081540, 0x800000c4, 0x82000540, + 0x00002000, 0x4803910a, 0x59b400f6, 0x82000500, + 0x00000018, 0x040207fd, 0x4a0368f0, 0x0010b544, + 0x4a0368f1, 0x0010b54b, 0x480b68f3, 0x4a0378e4, + 0x00008000, 0x0201f000, 0x0010604d, 0x4807c857, + 0x480a2800, 0x4c040000, 0x0401f80a, 0x5c000800, + 0x59b400f6, 0x8c00050a, 0x040207fe, 0x49a768f2, + 0x480768f4, 0x4a0378e4, 0x00008000, 0x1c01f000, + 0x4a0378e4, 0x0000c000, 0x59bc00e4, 0x8c000520, + 0x0400000c, 0x4a0378e4, 0x00008000, 0x42007000, + 0x000003e8, 0x59bc00e4, 0x8c000520, 0x040007f5, + 0x80387040, 0x02000800, 0x001005d8, 0x0401f7fa, + 0x1c01f000, 0x82000500, 0xffff0000, 0x82000580, + 0x01050000, 0x0402000d, 0x599c0818, 0x8c040d10, + 0x0400000a, 0x59a80807, 0x8c040d0a, 0x04000007, + 0x42001000, 0x0000804f, 0x41781800, 0x41782000, + 0x0201f800, 0x00103a3e, 0x1c01f000, 0x41781000, + 0x42026000, 0x0010d1c0, 0x59a8180e, 0x480a6402, + 0x4a026202, 0x0000ffff, 0x80081000, 0x800c1840, + 0x04000004, 0x83326400, 0x00000024, 0x0401f7f8, + 0x1c01f000, 0x4933c857, 0x59300203, 0x82000580, + 0x00000000, 0x0400002c, 0x59300406, 0x4803c857, + 0x82000d80, 0x00000004, 0x04000011, 0x82000d80, + 0x00000001, 0x0400000e, 0x82000d80, 0x00000003, + 0x04000006, 0x82000d80, 0x00000006, 0x04020011, + 0x0201f800, 0x0010a5df, 0x5930001c, 0x800001c0, + 0x02020800, 0x0010984e, 0x0401f00a, 0x5930081e, + 0x4807c857, 0x800409c0, 0x04000006, 0x5804001c, + 0x4803c857, 0x81300580, 0x04020002, 0x4978081c, + 0x497a6008, 0x4a026004, 0x00004000, 0x59a80037, + 0x82000c80, 0x00000051, 0x04001002, 0x80000102, + 0x48026206, 0x497a6205, 0x497a6009, 0x4a026406, + 0x00000007, 0x1c01f000, 0x8166c9c0, 0x0400001c, + 0x41626000, 0x41580000, 0x59300a03, 0x82040d80, + 0x00000000, 0x04000008, 0x83326400, 0x00000024, + 0x81300c80, 0x040017f9, 0x42026000, 0x0010d1c0, + 0x0401f7f6, 0x4933c857, 0x8166c840, 0x83300c00, + 0x00000024, 0x80040480, 0x04021006, 0x4006c000, + 0x4a026203, 0x00000008, 0x813261c0, 0x1c01f000, + 0x4202c000, 0x0010d1c0, 0x0401f7fa, 0x42000000, + 0x0010b854, 0x0201f800, 0x0010aa47, 0x4933c856, + 0x417a6000, 0x0401f7f5, 0x4933c857, 0x83380580, + 0x00000013, 0x0402000b, 0x59300004, 0x8c00053e, + 0x04000007, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00106c4b, 0x1c01f000, + 0x4933c857, 0x59880052, 0x80000000, 0x48031052, + 0x1c01f000, 0x4933c857, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x00107991, + 0x00107efd, 0x0010804a, 0x00107991, 0x001080b0, + 0x00107af5, 0x00107991, 0x00107991, 0x00107e93, + 0x00107991, 0x00107991, 0x00107991, 0x00107991, + 0x00107991, 0x0201f800, 0x001005d8, 0x4933c857, + 0x59300203, 0x82003480, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f001, 0x001079a8, 0x00108a3d, + 0x001079a8, 0x001079a8, 0x001079a8, 0x001079a8, + 0x001079a8, 0x001079a8, 0x001089e5, 0x00108a58, + 0x00108ac6, 0x00108a58, 0x00108ac6, 0x001079a8, + 0x0201f800, 0x001005d8, 0x0201f800, 0x001005d8, + 0x4933c857, 0x4d2c0000, 0x59325808, 0x59300203, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001079c5, + 0x001079c5, 0x001079c5, 0x001079e1, 0x00107a2d, + 0x001079c5, 0x001079c5, 0x001079c5, 0x001079c7, + 0x001079c5, 0x001079c5, 0x001079c5, 0x001079c5, + 0x001079c5, 0x0201f800, 0x001005d8, 0x4933c857, + 0x83380580, 0x00000040, 0x02020800, 0x001005d8, + 0x4a026007, 0x00082000, 0x4a026203, 0x00000003, + 0x493a6403, 0x4a025c08, 0x00000001, 0x592c000d, + 0x48026011, 0x497a6013, 0x592c0208, 0x800000c2, + 0x800010c4, 0x80081400, 0x480a6206, 0x0201f800, + 0x00100f4e, 0x42000800, 0x80000060, 0x0201f000, + 0x00106721, 0x4933c857, 0x83380480, 0x00000050, + 0x02021800, 0x001005d8, 0x83380480, 0x00000049, + 0x02001800, 0x001005d8, 0x0c01f001, 0x001079f4, + 0x001079ff, 0x001079f2, 0x001079f2, 0x001079f2, + 0x001079f2, 0x00107a0a, 0x0201f800, 0x001005d8, + 0x4a026203, 0x00000004, 0x4a025c08, 0x00000002, + 0x592c0207, 0x48025c09, 0x592c0209, 0x48025a07, + 0x592c000c, 0x4802580d, 0x1c01f000, 0x0201f800, + 0x00106b8a, 0x0201f800, 0x00109037, 0x04000005, + 0x4a025a06, 0x00000006, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x0201f800, 0x00106b8a, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x42003000, 0x00000014, 0x41782800, + 0x42002000, 0x00000002, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42028000, 0x00000029, 0x0201f800, + 0x0010985e, 0x5c028800, 0x5c028000, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00109037, 0x02000000, 0x0002077d, 0x4a025a06, + 0x00000029, 0x0201f800, 0x000202da, 0x0201f000, + 0x0002077d, 0x4933c857, 0x83380580, 0x00000048, + 0x04000005, 0x83380580, 0x00000053, 0x02020800, + 0x001005d8, 0x592c0206, 0x82000580, 0x00000007, + 0x04000009, 0x59300011, 0x80000540, 0x04000006, + 0x592c080c, 0x80040480, 0x4802580c, 0x4a025a06, + 0x00000015, 0x592c0206, 0x80000540, 0x04020003, + 0x4a025a06, 0x00000000, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x0201f800, + 0x001007e4, 0x02000800, 0x001005d8, 0x497a5a06, + 0x59c80017, 0x82000500, 0x0000f000, 0x48025c07, + 0x59a80816, 0x82040c00, 0x00000018, 0x48065a07, + 0x412c7800, 0x4d2c0000, 0x41cca000, 0x42002800, + 0x00000001, 0x42001000, 0x0000002c, 0x82040480, + 0x0000002d, 0x04021006, 0x832cac00, 0x00000009, + 0x0201f800, 0x00108b96, 0x0401f02e, 0x40043000, + 0x42000800, 0x0000002c, 0x832cac00, 0x00000009, + 0x0201f800, 0x00108b96, 0x82183480, 0x0000002c, + 0x0201f800, 0x001007e4, 0x0400001a, 0x80142800, + 0x4a025804, 0x00000110, 0x492c7801, 0x82180c80, + 0x0000003d, 0x04021007, 0x40180800, 0x832cac00, + 0x00000005, 0x0201f800, 0x00108b96, 0x0401f015, + 0x82081400, 0x0000003c, 0x82183480, 0x0000003c, + 0x42000800, 0x0000003c, 0x412c7800, 0x832cac00, + 0x00000005, 0x0201f800, 0x00108b96, 0x0401f7e5, + 0x5c025800, 0x592c0206, 0x8400055e, 0x48025a06, + 0x592c0407, 0x80080540, 0x48025c07, 0x0401f002, + 0x5c025800, 0x813669c0, 0x04000003, 0x59343403, + 0x0401f003, 0x42003000, 0x0000ffff, 0x49325808, + 0x481a5c06, 0x82100580, 0x00000054, 0x04020002, + 0x491e5813, 0x841401c0, 0x80100540, 0x48025804, + 0x592c0001, 0x497a5801, 0x4c000000, 0x0201f800, + 0x000202da, 0x5c025800, 0x812e59c0, 0x040207f9, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x1c01f000, 0x4803c856, 0x4c5c0000, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x412cb800, + 0x592c040b, 0x8c000516, 0x04000003, 0x41cca000, + 0x0401f003, 0x83cca400, 0x00000006, 0x4008b000, + 0x41781000, 0x82580480, 0x00000012, 0x04001004, + 0x4200b000, 0x00000012, 0x40001000, 0x4c080000, + 0x4d2c0000, 0x0201f800, 0x001007e4, 0x04000023, + 0x5c001800, 0x492c1801, 0x485a5800, 0x832cac00, + 0x00000002, 0x0201f800, 0x0010ab28, 0x585c040b, + 0x8c000500, 0x0400000e, 0x832c1400, 0x00000002, + 0x8c000516, 0x04000003, 0x82081400, 0x00000006, + 0x46001000, 0x00000001, 0x80081000, 0x46001000, + 0x00000900, 0x84000500, 0x4800bc0b, 0x5c001000, + 0x800811c0, 0x040207da, 0x82000540, 0x00000001, + 0x5c00b000, 0x5c00a800, 0x5c00a000, 0x5c025800, + 0x5c00b800, 0x1c01f000, 0x5c025800, 0x5c001000, + 0x0401f7f8, 0x4933c857, 0x83380d80, 0x00000015, + 0x04020003, 0x0201f000, 0x0002077d, 0x83380d80, + 0x00000016, 0x02020800, 0x001005d8, 0x0201f000, + 0x0002077d, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325808, 0x83cca400, + 0x00000006, 0x59cc1806, 0x820c0580, 0x01000000, + 0x04020004, 0x4200b000, 0x00000002, 0x0401f00f, + 0x4200b000, 0x00000008, 0x832cac00, 0x00000005, + 0x0201f800, 0x0010ab17, 0x8c0c1d00, 0x0400000b, + 0x4200b000, 0x00000008, 0x592e5801, 0x812e59c0, + 0x02000800, 0x001005d8, 0x832cac00, 0x00000005, + 0x0201f800, 0x0010ab17, 0x0401f816, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4c500000, 0x4c540000, 0x4c580000, + 0x83cca400, 0x00000006, 0x5930a808, 0x8254ac00, + 0x00000005, 0x4200b000, 0x00000007, 0x0201f800, + 0x0010ab17, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x4933c857, 0x0201f800, 0x00109037, 0x02000000, + 0x0002077d, 0x4d2c0000, 0x0201f800, 0x00109597, + 0x0402000b, 0x41780800, 0x4d400000, 0x42028000, + 0x00000000, 0x0201f800, 0x0010943b, 0x5c028000, + 0x5c025800, 0x0201f000, 0x0002077d, 0x5931d821, + 0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103, + 0x58ec0009, 0x0801f800, 0x5c025800, 0x0201f000, + 0x0002077d, 0x4933c857, 0x59cc1806, 0x820c0580, + 0x02000000, 0x04020014, 0x4a026802, 0x00fffffd, + 0x5934000a, 0x84000504, 0x4802680a, 0x59300808, + 0x800409c0, 0x02000000, 0x0002077d, 0x4a000a04, + 0x00000103, 0x480c0805, 0x5931d821, 0x58ef400b, + 0x58ee580d, 0x58ec0009, 0x0801f800, 0x0201f000, + 0x0002077d, 0x42000000, 0x0010b86c, 0x0201f800, + 0x0010aa47, 0x4c0c0000, 0x0401f804, 0x5c001800, + 0x040207eb, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x59325808, 0x812e59c0, 0x04020009, 0x497a6206, + 0x497a6205, 0x4d380000, 0x42027000, 0x00000022, + 0x0401fb77, 0x5c027000, 0x80000580, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c500000, + 0x4c540000, 0x4c580000, 0x59325808, 0x592e5801, + 0x832cac00, 0x00000005, 0x83cca400, 0x00000006, + 0x59c80817, 0x82040d00, 0x000003ff, 0x82041480, + 0x0000000f, 0x0400101b, 0x4200b000, 0x0000000f, + 0x0201f800, 0x0010ab17, 0x592e5801, 0x832cac00, + 0x00000005, 0x82080c80, 0x0000000f, 0x0400100d, + 0x4200b000, 0x0000000f, 0x0201f800, 0x0010ab17, + 0x592e5801, 0x832cac00, 0x00000005, 0x82041480, + 0x0000000f, 0x04001007, 0x42001000, 0x0000000f, + 0x4008b000, 0x0201f800, 0x0010ab17, 0x0401f004, + 0x4004b000, 0x0201f800, 0x0010ab17, 0x5931d821, + 0x58ef400b, 0x58ee580d, 0x4a025a04, 0x00000103, + 0x592e5801, 0x58ec0009, 0x0801f800, 0x0201f800, + 0x0002077d, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4d2c0000, + 0x4c500000, 0x4c540000, 0x4c580000, 0x59cc0006, + 0x82000d80, 0x01000000, 0x0400002c, 0x59cc0007, + 0x9000b1c0, 0x8258b500, 0x000000ff, 0x8058b104, + 0x8258b400, 0x00000002, 0x82580c80, 0x00000007, + 0x04001003, 0x4200b000, 0x00000006, 0x83cca400, + 0x00000006, 0x59301008, 0x800811c0, 0x02000800, + 0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800, + 0x0010ab17, 0x82000d00, 0xff000000, 0x800409c0, + 0x04000019, 0x8200b500, 0x000000ff, 0x8058b104, + 0x82580c80, 0x0000000e, 0x04001003, 0x4200b000, + 0x0000000d, 0x58081001, 0x800811c0, 0x02000800, + 0x001005d8, 0x8208ac00, 0x00000005, 0x0201f800, + 0x0010ab17, 0x0401f008, 0x59301008, 0x800811c0, + 0x02000800, 0x001005d8, 0x48001005, 0x59cc0007, + 0x48001006, 0x0401ff3b, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x42000800, 0x00000000, 0x59cc0006, 0x82000580, + 0x02000000, 0x04000003, 0x42000800, 0x00000001, + 0x4d2c0000, 0x59325808, 0x812e59c0, 0x02000800, + 0x001005d8, 0x48065a06, 0x0201f800, 0x000202da, + 0x5c025800, 0x0201f000, 0x0002077d, 0x4933c857, + 0x4d2c0000, 0x4c500000, 0x4c540000, 0x4c580000, + 0x4200b000, 0x00000002, 0x59cc0806, 0x82040580, + 0x01000000, 0x04000004, 0x8204b500, 0x0000ffff, + 0x8058b104, 0x83cca400, 0x00000006, 0x59300008, + 0x8200ac00, 0x00000005, 0x0201f800, 0x0010ab17, + 0x0401ff0c, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x4803c857, + 0x4807c857, 0x480bc857, 0x480fc857, 0x4813c857, + 0x481bc857, 0x492fc857, 0x4d2c0000, 0x4c000000, + 0x0201f800, 0x001007d3, 0x5c000000, 0x0400000f, + 0x48025803, 0x5c000000, 0x4802580a, 0x4c000000, + 0x481a5801, 0x48125809, 0x48065804, 0x480a5807, + 0x480e5808, 0x412c1000, 0x0201f800, 0x00100858, + 0x82000540, 0x00000001, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x4d1c0000, 0x59cc0001, 0x82000500, + 0x00ffffff, 0x59341002, 0x82081500, 0x00ffffff, + 0x80080580, 0x0402001f, 0x497a6205, 0x4d380000, + 0x42027000, 0x00000035, 0x0201f800, 0x001093ba, + 0x5c027000, 0x04020012, 0x591c001c, 0x800001c0, + 0x0400000f, 0x497a381c, 0x591c0414, 0x8c000502, + 0x02000800, 0x001005d8, 0x84000502, 0x48023c14, + 0x591c1406, 0x82080580, 0x00000003, 0x04000006, + 0x82080580, 0x00000006, 0x04000005, 0x0401fc9e, + 0x0401f004, 0x0401f805, 0x0401f002, 0x0401f8c0, + 0x5c023800, 0x1c01f000, 0x4d2c0000, 0x591e5808, + 0x4933c857, 0x491fc857, 0x493bc857, 0x492fc857, + 0x83380580, 0x00000015, 0x040000b3, 0x83380580, + 0x00000016, 0x040200ae, 0x4d300000, 0x411e6000, + 0x59cc0207, 0x4803c857, 0x82000d00, 0x0000ff00, + 0x82040580, 0x00001700, 0x04000004, 0x82040580, + 0x00000300, 0x0402005b, 0x591c0203, 0x4803c857, + 0x82000580, 0x0000000d, 0x0400003f, 0x812e59c0, + 0x0400009a, 0x591c0202, 0x4803c857, 0x82000580, + 0x0000ffff, 0x0402007e, 0x592c020a, 0x4803c857, + 0x82000500, 0x00000003, 0x82000580, 0x00000002, + 0x04020007, 0x592c080f, 0x591c0011, 0x4803c857, + 0x4807c857, 0x80040580, 0x04020071, 0x591c0414, + 0x4803c857, 0x8c000500, 0x0402006d, 0x41780800, + 0x591c1206, 0x42000000, 0x0000000a, 0x0201f800, + 0x001066a0, 0x592c0406, 0x4803c857, 0x800001c0, + 0x0400000c, 0x80080c80, 0x04001004, 0x02020800, + 0x001005d8, 0x80001040, 0x480a5c06, 0x800811c0, + 0x04020004, 0x0201f800, 0x00108d88, 0x0401f06b, + 0x0201f800, 0x0010912a, 0x591c0817, 0x591c0018, + 0x48065808, 0x48025809, 0x59300007, 0x8c000500, + 0x02020800, 0x00100e99, 0x497a3808, 0x0201f800, + 0x000201ba, 0x0402004a, 0x411e6000, 0x0401fc3e, + 0x0401f05a, 0x0401fc6d, 0x04000013, 0x49366009, + 0x4a026406, 0x00000003, 0x492e6008, 0x591c0817, + 0x591c1018, 0x48066017, 0x480a6018, 0x4d380000, + 0x591e7403, 0x4d300000, 0x411e6000, 0x0401fc2e, + 0x5c026000, 0x0201f800, 0x000207a1, 0x5c027000, + 0x0401f046, 0x59a80039, 0x48023a05, 0x0401f043, + 0x59cc0407, 0x82000580, 0x0000000b, 0x04020025, + 0x59340a00, 0x84040d0e, 0x48066a00, 0x592c0a04, + 0x82040d00, 0x000000ff, 0x82040d80, 0x00000014, + 0x04000003, 0x4a02621d, 0x00000003, 0x59300007, + 0x8c000500, 0x02020800, 0x00100e99, 0x4d400000, + 0x42028000, 0x00000003, 0x592c0a08, 0x0201f800, + 0x00104e70, 0x0201f800, 0x000202da, 0x5c028000, + 0x497a6008, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026406, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f800, 0x00020721, 0x0401f01b, + 0x59cc0207, 0x82000580, 0x00002a00, 0x04020004, + 0x59a80039, 0x48023a05, 0x0401f014, 0x812e59c0, + 0x02000800, 0x001005d8, 0x4a025a04, 0x00000103, + 0x591c0007, 0x8c000500, 0x02020800, 0x00100e99, + 0x591c0402, 0x48025c06, 0x4a025a06, 0x00000003, + 0x0201f800, 0x000202c1, 0x0201f800, 0x00107911, + 0x0201f800, 0x001049b2, 0x5c026000, 0x0201f800, + 0x0002077d, 0x0401f002, 0x5c026000, 0x5c025800, + 0x1c01f000, 0x0401f819, 0x0401f7fd, 0x4933c857, + 0x83380580, 0x00000015, 0x04020004, 0x59a80039, + 0x48023a05, 0x0401f00d, 0x83380580, 0x00000016, + 0x0402000d, 0x4d300000, 0x411e6000, 0x0201f800, + 0x0010a5df, 0x0201f800, 0x000206fd, 0x0201f800, + 0x0002077d, 0x5c026000, 0x497a381c, 0x0201f800, + 0x0002077d, 0x1c01f000, 0x591c0414, 0x84000540, + 0x48023c14, 0x59cc100b, 0x4933c857, 0x491fc857, + 0x492fc857, 0x4803c857, 0x480bc857, 0x8c08153c, + 0x04000006, 0x59a80039, 0x48023a05, 0x497a381c, + 0x0201f000, 0x0002077d, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00108bd7, 0x5c026000, 0x591c0406, + 0x82000580, 0x00000000, 0x02000000, 0x0002077d, + 0x591c0403, 0x82000580, 0x00000050, 0x0402000d, + 0x4d300000, 0x411e6000, 0x4a026203, 0x00000001, + 0x42000800, 0x80000043, 0x0201f800, 0x00020721, + 0x5c026000, 0x497a381c, 0x0201f000, 0x0002077d, + 0x591c0203, 0x82000580, 0x0000000d, 0x04000014, + 0x812e59c0, 0x02000800, 0x001005d8, 0x591c0203, + 0x82000580, 0x00000004, 0x04020011, 0x592c020a, + 0x8c000502, 0x0400000e, 0x4a023812, 0x0fffffff, + 0x592c0208, 0x8400051e, 0x48025a08, 0x42000000, + 0x00000001, 0x48023a14, 0x0401f021, 0x42000000, + 0x00000007, 0x48023a14, 0x0401f01d, 0x592c020a, + 0x4803c857, 0x8c000500, 0x0402000b, 0x8c000502, + 0x040007f7, 0x591c0414, 0x8c00051c, 0x040207eb, + 0x591c0011, 0x4803c857, 0x800001c0, 0x040007f0, + 0x0401f7e6, 0x8c08153a, 0x040207ed, 0x59cc000a, + 0x592c180f, 0x4803c857, 0x480fc857, 0x800c0580, + 0x040007e7, 0x59cc000a, 0x4803c857, 0x48023816, + 0x42000000, 0x00000005, 0x48023a14, 0x0201f000, + 0x00109259, 0x4933c857, 0x4d1c0000, 0x59cc0001, + 0x59341002, 0x80080580, 0x82000500, 0x00ffffff, + 0x04020041, 0x59301419, 0x0201f800, 0x00109410, + 0x02000800, 0x001005d8, 0x591c1406, 0x82080580, + 0x00000007, 0x04000038, 0x82080580, 0x00000002, + 0x04000035, 0x82080580, 0x00000000, 0x04000032, + 0x591c0202, 0x82000d80, 0x0000ffff, 0x04000004, + 0x59301a19, 0x800c0580, 0x0402002b, 0x83380580, + 0x00000015, 0x04000026, 0x4d300000, 0x4d2c0000, + 0x411e6000, 0x59325808, 0x0201f800, 0x00109037, + 0x02000800, 0x001005d8, 0x592c0204, 0x82000500, + 0x000000ff, 0x82000580, 0x00000014, 0x04000003, + 0x4a02621d, 0x00000003, 0x42028000, 0x00000003, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x000202da, 0x5c025800, 0x497a6008, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, + 0x00020721, 0x5c026000, 0x0401f003, 0x59a80039, + 0x48023a05, 0x497a381c, 0x0201f800, 0x0002077d, + 0x5c023800, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x4d2c0000, 0x59325808, 0x83383580, 0x00000015, + 0x04000010, 0x59342200, 0x84102502, 0x48126a00, + 0x0201f800, 0x00109037, 0x04000066, 0x0201f800, + 0x00109597, 0x04020005, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x0401fa0a, 0x0401f079, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x04020015, 0x83cc1400, 0x0000000a, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, + 0x0010855a, 0x0402000c, 0x0201f800, 0x00102074, + 0x59342200, 0x59cc1007, 0x800811c0, 0x04000003, + 0x480a6801, 0x84102542, 0x8410251a, 0x48126a00, + 0x0401f05f, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x59340200, 0x84000558, + 0x48026a00, 0x4d300000, 0x0201f800, 0x0002075a, + 0x02000800, 0x001005d8, 0x49366009, 0x497a6008, + 0x4a026406, 0x00000001, 0x4a026403, 0x00000001, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a942, + 0x0201f800, 0x00103b25, 0x04000011, 0x41782800, + 0x42003000, 0x00000001, 0x4d400000, 0x42028000, + 0x00000029, 0x0201f800, 0x0010a43e, 0x5c028000, + 0x4a026406, 0x00000004, 0x4a026203, 0x00000007, + 0x4a026420, 0x00000001, 0x0401f009, 0x4a026203, + 0x00000001, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x0201f800, 0x0010672b, 0x5c026000, + 0x0201f800, 0x00109037, 0x04000022, 0x0201f800, + 0x00109597, 0x04020022, 0x0401f9ae, 0x0401f01d, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x59340200, 0x84000558, 0x48026a00, 0x42003000, + 0x00000003, 0x41782800, 0x42002000, 0x00000005, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x5c027800, 0x0201f800, 0x00102074, + 0x0201f800, 0x0002077d, 0x0401f002, 0x0401fca9, + 0x5c025800, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x41380000, 0x83383480, 0x00000056, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00107ef7, 0x00107ef2, + 0x00107ef7, 0x00107ef7, 0x00107ef7, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef7, 0x00107ef0, 0x00107ef7, + 0x00107ef7, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef7, 0x00107ef7, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef7, 0x00107ef7, + 0x00107ef0, 0x00107ef7, 0x00107ef7, 0x00107ef0, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x00107ef0, 0x00107ef0, 0x00107ef0, 0x00107ef7, + 0x0201f800, 0x001005d8, 0x4a026203, 0x00000001, + 0x493a6403, 0x0201f000, 0x0010672b, 0x4933c857, + 0x4a026203, 0x00000001, 0x493a6403, 0x0201f000, + 0x0010672b, 0x4933c857, 0x59300403, 0x82003480, + 0x00000056, 0x02021800, 0x001005d8, 0x83383580, + 0x00000013, 0x04000093, 0x83383580, 0x00000027, + 0x0402004b, 0x0201f800, 0x00106bbf, 0x0201f800, + 0x00109134, 0x0400000b, 0x0201f800, 0x0010914e, + 0x04000041, 0x59300403, 0x82000d80, 0x00000022, + 0x04020038, 0x0401fc61, 0x0400003a, 0x0401f03a, + 0x0201f800, 0x00102074, 0x42000800, 0x00000007, + 0x0201f800, 0x00104571, 0x0401f8fe, 0x4d440000, + 0x59368c03, 0x83440580, 0x000007fe, 0x04020008, + 0x59a81026, 0x84081540, 0x0201f800, 0x0010513b, + 0x04020002, 0x8408154a, 0x480b5026, 0x42028000, + 0x00000029, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x836c0580, 0x00000003, + 0x0400000c, 0x59326809, 0x59340008, 0x800001c0, + 0x04020008, 0x59368c03, 0x4933c857, 0x4937c857, + 0x4947c857, 0x0201f800, 0x001045fb, 0x0401f00c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x42003000, 0x00000015, 0x41782800, 0x42002000, + 0x00000003, 0x0201f800, 0x0010985e, 0x5c028800, + 0x0201f800, 0x00109326, 0x0201f000, 0x0002077d, + 0x1c01f000, 0x0401f8cb, 0x0401f7fa, 0x83380580, + 0x00000014, 0x0400000b, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x040000ed, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42003000, + 0x00000016, 0x41782800, 0x4d400000, 0x4d440000, + 0x59368c03, 0x42002000, 0x00000009, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x00109134, 0x0402000c, + 0x0201f800, 0x00102074, 0x0401f89e, 0x59340c03, + 0x82040580, 0x000007fe, 0x040207ca, 0x59a80826, + 0x84040d40, 0x48075026, 0x0401f7c6, 0x0201f800, + 0x0010914e, 0x04020003, 0x0401f892, 0x0401f7c1, + 0x59300403, 0x82000d80, 0x00000032, 0x04020004, + 0x0201f800, 0x0010230c, 0x0401f7ba, 0x59300403, + 0x82000d80, 0x00000022, 0x04000886, 0x0401f7b5, + 0x4803c857, 0x0c01f001, 0x00108016, 0x00108016, + 0x00108016, 0x00108016, 0x00108016, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff9, 0x00108016, 0x00107ff0, 0x00108016, + 0x00108016, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00108016, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00107ff0, + 0x00108007, 0x00108016, 0x00107ff0, 0x00108000, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108000, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00108003, 0x00107ff0, 0x00107ff2, 0x00108016, + 0x00107ff0, 0x00108016, 0x00108016, 0x00107ff0, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x00107ff0, 0x00107ff0, 0x00107ff0, 0x00108016, + 0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808, + 0x0201f800, 0x000202da, 0x5c025800, 0x0201f000, + 0x0002077d, 0x4a026203, 0x00000005, 0x59a80039, + 0x48026205, 0x59a80037, 0x48026206, 0x1c01f000, + 0x5930081e, 0x49780a05, 0x0401f014, 0x0201f800, + 0x00109326, 0x0201f000, 0x0002077d, 0x0201f800, + 0x0010230c, 0x0201f800, 0x00106c55, 0x04000005, + 0x0201f800, 0x00106bbf, 0x0201f000, 0x0002077d, + 0x0201f800, 0x00106bbf, 0x0201f800, 0x0002077d, + 0x0201f000, 0x00106c4b, 0x4933c857, 0x4a026203, + 0x00000002, 0x59a80037, 0x48026206, 0x1c01f000, + 0x4933c857, 0x0201f800, 0x00109037, 0x0400002a, + 0x4d2c0000, 0x0201f800, 0x00109597, 0x0402000a, + 0x4d400000, 0x42028000, 0x00000031, 0x42000800, + 0x00000004, 0x0201f800, 0x0010943b, 0x5c028000, + 0x0401f01c, 0x59300c06, 0x82040580, 0x00000010, + 0x04000004, 0x82040580, 0x00000011, 0x0402000a, + 0x4a025a06, 0x00000031, 0x4a02580d, 0x00000004, + 0x4a02580e, 0x000000ff, 0x0201f800, 0x000202da, + 0x0401f00c, 0x592c0404, 0x8c00051e, 0x04000009, + 0x4a025a04, 0x00000103, 0x4a025805, 0x01000000, + 0x5931d821, 0x58ef400b, 0x58ec0009, 0x0801f800, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x59340400, + 0x82000500, 0x000000ff, 0x82003480, 0x0000000c, + 0x02021800, 0x001005d8, 0x59303403, 0x82180d80, + 0x0000004d, 0x02000000, 0x0010938b, 0x82180d80, + 0x00000033, 0x02000000, 0x00109349, 0x82180d80, + 0x00000028, 0x02000000, 0x0010918f, 0x82180d80, + 0x00000029, 0x02000000, 0x001091a3, 0x82180d80, + 0x0000001f, 0x02000000, 0x00107b28, 0x82180d80, + 0x00000055, 0x02000000, 0x00107b01, 0x82180d80, + 0x00000000, 0x04000591, 0x82180d80, 0x00000022, + 0x02000000, 0x00107b55, 0x82180d80, 0x00000035, + 0x02000000, 0x00107c50, 0x82180d80, 0x00000039, + 0x04000539, 0x82180d80, 0x0000003d, 0x02000000, + 0x00107b85, 0x82180d80, 0x00000044, 0x02000000, + 0x00107bc2, 0x82180d80, 0x00000049, 0x02000000, + 0x00107c17, 0x82180d80, 0x00000041, 0x02000000, + 0x00107c03, 0x82180d80, 0x00000043, 0x02000000, + 0x001094dc, 0x82180d80, 0x00000051, 0x02000000, + 0x00109542, 0x82180d80, 0x00000004, 0x04020003, + 0x42000000, 0x00000001, 0x83380d80, 0x00000015, + 0x04000006, 0x83380d80, 0x00000016, 0x02020000, + 0x00107974, 0x0401f20f, 0x4d2c0000, 0x4d3c0000, + 0x0c01f804, 0x5c027800, 0x5c025800, 0x1c01f000, + 0x001080b8, 0x001080bc, 0x001080b8, 0x00108131, + 0x001080b8, 0x00108226, 0x001082bf, 0x001080b8, + 0x001080b8, 0x00108288, 0x001080b8, 0x0010829a, + 0x4933c857, 0x497a6007, 0x59300808, 0x58040000, + 0x4a000a04, 0x00000103, 0x0201f000, 0x0002077d, + 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, + 0x4933c857, 0x59a80016, 0x82000580, 0x00000074, + 0x0402005c, 0x0201f800, 0x0010a2c8, 0x04020016, + 0x0401f85c, 0x0201f800, 0x00109037, 0x0400000c, + 0x0201f800, 0x00109597, 0x04020009, 0x41780800, + 0x4d400000, 0x42028000, 0x00000000, 0x0201f800, + 0x0010943b, 0x5c028000, 0x0401f003, 0x0201f800, + 0x00102074, 0x0201f800, 0x001048c1, 0x0201f000, + 0x0002077d, 0x0201f800, 0x00109037, 0x04000007, + 0x0201f800, 0x00109597, 0x04020004, 0x0401ff3d, + 0x0201f000, 0x0002077d, 0x417a7800, 0x0201f800, + 0x0010203c, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x59340200, 0x84000558, 0x48026a00, + 0x42003000, 0x00000003, 0x0201f800, 0x0010a942, + 0x4d300000, 0x0201f800, 0x0002075a, 0x02000800, + 0x001005d8, 0x49366009, 0x497a6008, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000001, 0x0201f800, + 0x00103b25, 0x04000011, 0x4a026406, 0x00000004, + 0x4a026203, 0x00000007, 0x4a026420, 0x00000001, + 0x42003000, 0x00000001, 0x4d400000, 0x42028000, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x0401f009, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x0201f800, 0x0010672b, 0x5c026000, 0x0401ff05, + 0x0201f800, 0x00102074, 0x0201f000, 0x0002077d, + 0x0401ff00, 0x42000000, 0x00000001, 0x0401f0c7, + 0x4933c857, 0x59340200, 0x8c000500, 0x0400000d, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567, + 0x5c027800, 0x0201f800, 0x00103b25, 0x04000005, + 0x42000800, 0x00000006, 0x0201f800, 0x00104571, + 0x1c01f000, 0x4933c857, 0x59a80816, 0x82040580, + 0x00000074, 0x0400000e, 0x4807c857, 0x82040580, + 0x00000100, 0x040200a0, 0x59cc0408, 0x4803c857, + 0x8c000500, 0x0400009c, 0x59341403, 0x82080580, + 0x000007fe, 0x04000006, 0x0401f097, 0x59341403, + 0x82080580, 0x000007fe, 0x04020003, 0x0401fa9c, + 0x0401f04c, 0x0201f800, 0x0010462a, 0x59341403, + 0x82080580, 0x000007fc, 0x0402001f, 0x4a026802, + 0x00fffffc, 0x0201f800, 0x00109037, 0x04000012, + 0x0201f800, 0x00109597, 0x0402000f, 0x0401f8a9, + 0x41780800, 0x4d400000, 0x42028000, 0x00000000, + 0x0201f800, 0x0010943b, 0x5c028000, 0x42000800, + 0x00000004, 0x0201f800, 0x00104571, 0x0201f000, + 0x0002077d, 0x42000800, 0x00000004, 0x0201f800, + 0x00104571, 0x0201f800, 0x00102074, 0x0201f000, + 0x0002077d, 0x59a80005, 0x8c000514, 0x04000011, + 0x0201f800, 0x0010513b, 0x42001000, 0x00000010, + 0x04020009, 0x59340002, 0x82000500, 0x00ff0000, + 0x82000580, 0x00ff0000, 0x04000006, 0x42001000, + 0x00000008, 0x0201f800, 0x00104c6d, 0x0402005a, + 0x0201f800, 0x00109037, 0x0400005b, 0x0201f800, + 0x00109597, 0x04020005, 0x592c0404, 0x8c00051c, + 0x040207c9, 0x0401f877, 0x42000800, 0x00000005, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000003, 0x0201f000, 0x0010672b, + 0x59cc0408, 0x8c000518, 0x04000010, 0x0201f800, + 0x001092e5, 0x0201f800, 0x0010513b, 0x04000004, + 0x59cc0408, 0x8c000516, 0x040207b3, 0x59a80026, + 0x8400054a, 0x48035026, 0x59a80010, 0x84000570, + 0x48038832, 0x0401f7ac, 0x42001000, 0x000000ef, + 0x480b5010, 0x497b8830, 0x84081570, 0x480b8832, + 0x59c40802, 0x84040d4c, 0x48078802, 0x0201f800, + 0x0010930f, 0x59a80026, 0x84000548, 0x48035026, + 0x0201f800, 0x0010a3da, 0x0402079b, 0x59a80026, + 0x8400054c, 0x48035026, 0x42000800, 0x00000006, + 0x0201f800, 0x00104571, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000000, 0x000000e8, 0x0201f800, + 0x00105c9a, 0x02000800, 0x001045a6, 0x02020800, + 0x001005d8, 0x49366009, 0x59340200, 0x8400051a, + 0x48026a00, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, + 0x0010672b, 0x0401fe43, 0x42000000, 0x00000001, + 0x0401f00a, 0x599c0017, 0x8c00050a, 0x040007ab, + 0x42000800, 0x00000004, 0x0201f800, 0x00104571, + 0x0201f000, 0x0002077d, 0x4933c857, 0x80003540, + 0x04000005, 0x42000800, 0x00000007, 0x0201f800, + 0x00104571, 0x801831c0, 0x0402000e, 0x59302008, + 0x801021c0, 0x04000004, 0x58100404, 0x8c00051e, + 0x04020008, 0x59341c03, 0x42002000, 0x00000004, + 0x42003000, 0x00000012, 0x0201f800, 0x00103aae, + 0x0201f800, 0x00102074, 0x0201f000, 0x0002077d, + 0x4c5c0000, 0x4d2c0000, 0x59325808, 0x0201f800, + 0x00105755, 0x5c025800, 0x59cc0008, 0x48002805, + 0x59cc0009, 0x48002806, 0x49782807, 0x49782808, + 0x49782809, 0x4978280a, 0x59cc0013, 0x8c00053e, + 0x04000009, 0x59cc0414, 0x900001c0, 0x59ccbc15, + 0x805c0540, 0x48002807, 0x59cc0416, 0x900001c0, + 0x48002808, 0x59cc0017, 0x8c00053e, 0x04000009, + 0x59cc0418, 0x900001c0, 0x59ccbc19, 0x805c0540, + 0x48002809, 0x59cc041a, 0x900001c0, 0x4800280a, + 0x5c00b800, 0x1c01f000, 0x4933c857, 0x59a80016, + 0x82000580, 0x00000014, 0x04020048, 0x59a80005, + 0x8c000514, 0x04000015, 0x0201f800, 0x0010513b, + 0x42001000, 0x00000010, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x0400000a, 0x42001000, 0x00000008, 0x0201f800, + 0x00104c6d, 0x04000005, 0x59a80005, 0x84000556, + 0x48035005, 0x0401f031, 0x836c0580, 0x00000003, + 0x0402000b, 0x59300008, 0x80000540, 0x04020008, + 0x59341c03, 0x42002000, 0x00000006, 0x42003000, + 0x00000013, 0x0201f800, 0x00103aae, 0x0201f800, + 0x0010468d, 0x0401fecf, 0x0401fa1d, 0x0402001f, + 0x59340404, 0x80000540, 0x0400001c, 0x42000800, + 0x00000006, 0x0201f800, 0x00104571, 0x0201f800, + 0x00109037, 0x04000011, 0x0201f800, 0x00109597, + 0x0402000a, 0x41780800, 0x4d400000, 0x42028000, + 0x00000000, 0x0201f800, 0x0010943b, 0x5c028000, + 0x0201f000, 0x0002077d, 0x4a025a04, 0x00000103, + 0x4a025805, 0x02000000, 0x0201f800, 0x00102074, + 0x0201f000, 0x0002077d, 0x0201f800, 0x00104c19, + 0x0201f800, 0x00109037, 0x04000007, 0x0201f800, + 0x00109597, 0x04020004, 0x0401fda2, 0x0201f000, + 0x0002077d, 0x0401fd9f, 0x80000580, 0x59a80005, + 0x8c000516, 0x04000005, 0x84000516, 0x48035005, + 0x82000540, 0x00000001, 0x0401ff60, 0x1c01f000, + 0x4933c857, 0x59a80016, 0x82000580, 0x00000014, + 0x0402000b, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000001, 0x0201f000, 0x0010672b, 0x42000000, + 0x00000001, 0x0401f74d, 0x4933c857, 0x40003000, + 0x59a80016, 0x82000580, 0x00000004, 0x0402000a, + 0x82183580, 0x0000000b, 0x04020005, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0201f000, + 0x0002077d, 0x42000000, 0x00000001, 0x0401f73b, + 0x4803c857, 0x4d2c0000, 0x4d3c0000, 0x0c01f804, + 0x5c027800, 0x5c025800, 0x1c01f000, 0x001080b8, + 0x001082ce, 0x001080b8, 0x00108323, 0x001080b8, + 0x00108391, 0x001082bf, 0x001080b8, 0x001080b8, + 0x001083b1, 0x001080b8, 0x001083c1, 0x4933c857, + 0x4d1c0000, 0x59301403, 0x82080580, 0x00000003, + 0x04000008, 0x82081580, 0x0000001e, 0x04020003, + 0x0201f800, 0x0002077d, 0x5c023800, 0x1c01f000, + 0x0401ff5a, 0x0401f7fd, 0x4933c857, 0x0201f800, + 0x00109037, 0x0400000b, 0x0201f800, 0x00109597, + 0x04020008, 0x4200b000, 0x00000002, 0x0201f800, + 0x0010957d, 0x0401fd43, 0x0201f000, 0x0002077d, + 0x0401f8f5, 0x04020030, 0x417a7800, 0x0201f800, + 0x00104567, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x59340200, 0x84000558, 0x48026a00, 0x4a026403, + 0x00000002, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x0201f800, 0x00103b25, 0x04000011, + 0x4d400000, 0x41782800, 0x42003000, 0x00000005, + 0x42028000, 0x00000029, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x4a026203, 0x00000007, 0x4a026406, + 0x00000004, 0x4a026420, 0x00000001, 0x1c01f000, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x0201f800, 0x0010672b, + 0x0401f7f7, 0x59cc0407, 0x82000580, 0x00000009, + 0x0402000a, 0x59340412, 0x82000500, 0x000000ff, + 0x0400000c, 0x80000040, 0x48026c12, 0x4a026206, + 0x0000000a, 0x0401f7ea, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000580, 0x00001900, 0x040007c2, + 0x0401fcfc, 0x80000580, 0x0401f6c4, 0x4933c857, + 0x59a80032, 0x80000540, 0x04000015, 0x59340403, + 0x82000580, 0x000007fe, 0x04020011, 0x59a80010, + 0x80000000, 0x48035010, 0x417a7800, 0x0201f800, + 0x00104567, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000002, 0x0201f000, 0x0010672b, 0x0201f800, + 0x00109037, 0x04000011, 0x0201f800, 0x00109597, + 0x0402000e, 0x4c580000, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fcd5, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x0201f000, 0x0002077d, 0x0401fcce, 0x59cc3407, + 0x82183500, 0x000000ff, 0x82180580, 0x00000005, + 0x0400001c, 0x82180580, 0x0000000b, 0x04000016, + 0x59cc0207, 0x82000500, 0x0000ff00, 0x04020004, + 0x82180580, 0x00000009, 0x04000012, 0x82000580, + 0x00001900, 0x0402000c, 0x82180580, 0x00000009, + 0x0400000c, 0x42000800, 0x00000004, 0x0201f800, + 0x00104571, 0x0201f800, 0x00102074, 0x0201f000, + 0x0002077d, 0x42000000, 0x00000001, 0x0401f677, + 0x0201f800, 0x00109037, 0x59325808, 0x04000008, + 0x592c0204, 0x82000580, 0x00000139, 0x040007f6, + 0x592c0404, 0x8c00051e, 0x040207f3, 0x59340403, + 0x82000580, 0x000007fe, 0x04020007, 0x59a80026, + 0x84000540, 0x48035026, 0x0201f800, 0x00104229, + 0x0401f7e9, 0x417a7800, 0x0201f800, 0x0010203c, + 0x42003000, 0x00000005, 0x0201f800, 0x0010a942, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0401f7dd, 0x4933c857, 0x0401f84d, 0x0402000b, + 0x42000800, 0x00000005, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000003, + 0x0201f000, 0x0010672b, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0201f800, 0x00109597, + 0x0402000a, 0x4c580000, 0x4200b000, 0x00000002, + 0x0201f800, 0x0010957d, 0x5c00b000, 0x0401fc71, + 0x0201f000, 0x0002077d, 0x0401fc6e, 0x80000580, + 0x0401f636, 0x4933c857, 0x0401f82d, 0x0402000b, + 0x42000800, 0x00000009, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000005, + 0x0201f000, 0x0010672b, 0x42000000, 0x00000001, + 0x0401f626, 0x4933c857, 0x0401f81d, 0x0402000b, + 0x42000800, 0x0000000b, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000001, + 0x0201f000, 0x0010672b, 0x42000000, 0x00000001, + 0x0401f616, 0x4933c857, 0x59cc0407, 0x82000580, + 0x00000003, 0x04020009, 0x59cc0207, 0x82000500, + 0x0000ff00, 0x82000d80, 0x00002a00, 0x04000003, + 0x82000d80, 0x00001e00, 0x1c01f000, 0x4933c857, + 0x82000540, 0x00000001, 0x1c01f000, 0x4933c857, + 0x4d400000, 0x4c580000, 0x59a80026, 0x82000540, + 0x00000003, 0x48035026, 0x0401f85c, 0x04000038, + 0x4d340000, 0x4d440000, 0x59a80026, 0x84000552, + 0x48035026, 0x0201f800, 0x00103b25, 0x0400000c, + 0x42028000, 0x0000002a, 0x42028800, 0x0000ffff, + 0x42003000, 0x00000002, 0x0201f800, 0x0010a446, + 0x59a80805, 0x84040d44, 0x48075005, 0x42028000, + 0x0000002a, 0x4d3c0000, 0x42027800, 0x00000204, + 0x0201f800, 0x00101fe5, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00101e45, 0x4200b000, 0x00000010, 0x42028800, + 0x000007f0, 0x4d2c0000, 0x83440580, 0x000007fe, + 0x04000003, 0x0201f800, 0x001045fb, 0x81468800, + 0x8058b040, 0x040207f9, 0x5c025800, 0x59cc0408, + 0x8c00051e, 0x04000004, 0x59a80026, 0x84000512, + 0x48035026, 0x5c028800, 0x5c026800, 0x0201f800, + 0x0010462a, 0x4a026802, 0x00fffffe, 0x59a80826, + 0x84040d50, 0x59cc0013, 0x8c00053e, 0x04000003, + 0x8c000536, 0x04000004, 0x59cc0017, 0x8c000536, + 0x04020002, 0x84040d10, 0x48075026, 0x59cc0800, + 0x82040d00, 0x00ffffff, 0x48075010, 0x80040110, + 0x4803501d, 0x48038881, 0x0201f800, 0x0010513b, + 0x04000007, 0x59cc0009, 0x48035035, 0x59cc000a, + 0x48035036, 0x0201f800, 0x001092e5, 0x5c00b000, + 0x5c028000, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x59a80010, 0x82000500, 0x00ffff00, 0x04000022, + 0x59cc1000, 0x82081500, 0x00ffff00, 0x80080580, + 0x04000004, 0x42000000, 0x0010b83b, 0x0401f016, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0401f900, 0x04000004, + 0x42000000, 0x0010b83c, 0x0401f00b, 0x83cc1400, + 0x0000000d, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000008, 0x0401f8f5, 0x04000007, 0x42000000, + 0x0010b83d, 0x0201f800, 0x0010aa47, 0x82000540, + 0x00000001, 0x5c00b000, 0x1c01f000, 0x4933c857, + 0x59cc0206, 0x82000580, 0x00000014, 0x04020016, + 0x59cc0407, 0x82000580, 0x00000800, 0x04020012, + 0x59cc0207, 0x8c00051a, 0x0400000d, 0x82000500, + 0x00000f00, 0x82000580, 0x00000100, 0x04020008, + 0x59cc020a, 0x8c000508, 0x04020003, 0x8c00050a, + 0x04000003, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x4943c857, + 0x493fc857, 0x4c5c0000, 0x4d300000, 0x4d340000, + 0x4d2c0000, 0x4d380000, 0x4130b800, 0x42026000, + 0x0010d1c0, 0x59a8000e, 0x81640480, 0x040210bd, + 0x8d3e7d12, 0x04000004, 0x405c0000, 0x81300580, + 0x040000b3, 0x59300406, 0x82000c80, 0x00000012, + 0x04021015, 0x59326809, 0x0c01f001, 0x0010854f, + 0x001084bc, 0x001084d3, 0x001084de, 0x001084b7, + 0x001084ce, 0x00108507, 0x0010854f, 0x001084b5, + 0x0010851b, 0x0010852a, 0x001084b5, 0x001084b5, + 0x001084b5, 0x001084b5, 0x0010854f, 0x00108540, + 0x00108538, 0x0201f800, 0x001005d8, 0x8d3e7d18, + 0x04000004, 0x59300420, 0x8c000500, 0x04020094, + 0x59300403, 0x82000580, 0x00000043, 0x04000090, + 0x0201f800, 0x00109134, 0x02000800, 0x00102074, + 0x0201f800, 0x0010914e, 0x02000800, 0x0010801c, + 0x8d3e7d06, 0x04000084, 0x0201f800, 0x001092d7, + 0x04000083, 0x0401f080, 0x8d3e7d16, 0x04000004, + 0x59300420, 0x8c000500, 0x0402007d, 0x59325808, + 0x0201f800, 0x00109037, 0x04000077, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0201f800, + 0x0010912a, 0x0401f070, 0x813669c0, 0x02000800, + 0x001005d8, 0x8d3e7d06, 0x04000004, 0x59340200, + 0x8c00050e, 0x0402006a, 0x59300004, 0x8400055c, + 0x48026004, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400005c, 0x4a025a04, 0x00000103, + 0x59300402, 0x48025c06, 0x592c0408, 0x8c000512, + 0x04000006, 0x4d2c0000, 0x592e5809, 0x0201f800, + 0x001007fd, 0x5c025800, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x0010959c, 0x0201f800, 0x000202da, + 0x0201f800, 0x0010912a, 0x0401f047, 0x8c000518, + 0x04000047, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400003c, 0x49425a06, 0x497a5c09, + 0x0201f800, 0x0010a693, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x0401f033, 0x0201f800, + 0x001062d5, 0x04000032, 0x59300203, 0x82000580, + 0x00000004, 0x04020004, 0x0201f800, 0x00100e99, + 0x0401f02b, 0x42027000, 0x00000047, 0x0201f800, + 0x000207a1, 0x0401f026, 0x59300203, 0x82000580, + 0x00000004, 0x02000800, 0x00100e99, 0x59325808, + 0x0201f800, 0x00109037, 0x0400001b, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0401f016, + 0x833c0500, 0x00001800, 0x04000015, 0x8d3e7d16, + 0x04020013, 0x59325817, 0x0201f800, 0x001007fd, + 0x59300203, 0x82000580, 0x00000004, 0x02000800, + 0x00100e99, 0x59325808, 0x0201f800, 0x00109037, + 0x04000005, 0x49425a06, 0x497a5c09, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x83326400, + 0x00000024, 0x41580000, 0x81300480, 0x04001742, + 0x5c027000, 0x5c025800, 0x5c026800, 0x5c026000, + 0x5c00b800, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x480bc857, 0x480fc857, 0x485bc857, + 0x50080800, 0x500c0000, 0x80042580, 0x04020007, + 0x80081000, 0x800c1800, 0x8058b040, 0x040207f9, + 0x80000580, 0x1c01f000, 0x4803c857, 0x4807c857, + 0x480bc857, 0x480fc857, 0x80040480, 0x04001006, + 0x42000000, 0x00000001, 0x82040d40, 0x00000001, + 0x1c01f000, 0x41780000, 0x0401f7fc, 0x83380480, + 0x00000053, 0x02021800, 0x001005d8, 0x83380480, + 0x0000004b, 0x02001800, 0x001005d8, 0x0c01f001, + 0x0010858a, 0x0010858a, 0x0010858a, 0x0010858a, + 0x00108588, 0x00108588, 0x00108588, 0x0010858a, + 0x0201f800, 0x001005d8, 0x493bc857, 0x4a026203, + 0x0000000d, 0x493a6403, 0x42000800, 0x80000000, + 0x0201f000, 0x00020721, 0x83380580, 0x00000013, + 0x04020008, 0x59300403, 0x82000580, 0x00000050, + 0x02020800, 0x001005d8, 0x0201f000, 0x0002077d, + 0x4933c857, 0x83380580, 0x00000027, 0x04020030, + 0x4933c857, 0x0201f800, 0x00106bbf, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x492fc857, 0x0400000d, 0x4a025a04, 0x00000103, + 0x59300c02, 0x48065c06, 0x4a025a06, 0x00000029, + 0x497a5c09, 0x592c0c08, 0x84040d50, 0x48065c08, + 0x0201f800, 0x000202da, 0x5c025800, 0x42003000, + 0x00000015, 0x41782800, 0x42002000, 0x00000003, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x0201f000, 0x0002077d, 0x83380580, + 0x00000014, 0x0402000c, 0x59300403, 0x82000c80, + 0x00000053, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x4803c857, + 0x0c01f00e, 0x83380580, 0x00000053, 0x0400000a, + 0x83380580, 0x00000048, 0x02020800, 0x001005d8, + 0x59300403, 0x82000580, 0x00000050, 0x02020800, + 0x001005d8, 0x1c01f000, 0x001085ff, 0x001085fd, + 0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd, + 0x001085fd, 0x001085fd, 0x001085fd, 0x001085fd, + 0x001085fd, 0x00108616, 0x00108616, 0x00108616, + 0x00108616, 0x001085fd, 0x00108616, 0x001085fd, + 0x00108616, 0x0201f800, 0x001005d8, 0x4933c857, + 0x0201f800, 0x00106bbf, 0x0201f800, 0x00109037, + 0x02000000, 0x0002077d, 0x4d2c0000, 0x59325808, + 0x4a025a04, 0x00000103, 0x59300402, 0x48025c06, + 0x4a025a06, 0x00000006, 0x497a5c09, 0x0201f800, + 0x000202da, 0x5c025800, 0x0201f800, 0x0010912a, + 0x0201f000, 0x0002077d, 0x4933c857, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x0002077d, 0x0201f800, + 0x001005d8, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300004, 0x8c00053e, 0x04020029, + 0x59325808, 0x592c0c08, 0x59cc2a08, 0x82141d00, + 0x00000c00, 0x04000002, 0x59cc1809, 0x84040d58, + 0x48065c08, 0x82143500, 0x00000fff, 0x04020027, + 0x59340200, 0x8c00050e, 0x04020080, 0x0201f800, + 0x0002082b, 0x04020006, 0x4a025a06, 0x00000000, + 0x59300811, 0x800409c0, 0x0402094b, 0x4a025a04, + 0x00000103, 0x48065807, 0x480e580a, 0x48165c09, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x59cc0208, 0x8c000518, + 0x02020000, 0x001091d1, 0x0201f000, 0x0002077d, + 0x0201f800, 0x00106f60, 0x040007d6, 0x4d3c0000, + 0x42027800, 0x00000002, 0x0201f800, 0x00108be3, + 0x5c027800, 0x0401f7cf, 0x4817c857, 0x480fc857, + 0x82180500, 0x000000ff, 0x0400000e, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000048, + 0x04020008, 0x592c0407, 0x800001c0, 0x04000005, + 0x0201f800, 0x0010973f, 0x0201f000, 0x00109787, + 0x82180d00, 0x00000c00, 0x04000004, 0x59340200, + 0x8c00050e, 0x04020032, 0x4a025a06, 0x00000000, + 0x41782000, 0x8c183510, 0x04000007, 0x59cc000c, + 0x82000500, 0x000000ff, 0x04000002, 0x4803c857, + 0x59cc200b, 0x4812580c, 0x41780000, 0x8c183512, + 0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00, + 0x040007b8, 0x82041480, 0x0000001d, 0x04001006, + 0x592c0404, 0x8c00051e, 0x0400000e, 0x42000800, + 0x0000001c, 0x4c500000, 0x4c540000, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000d, 0x0201f800, + 0x00108b9f, 0x5c00a800, 0x5c00a000, 0x0401f7a5, + 0x59300011, 0x59301402, 0x480a5c06, 0x48025807, + 0x480e580a, 0x48165c09, 0x0201f800, 0x00108b48, + 0x0201f800, 0x00108b84, 0x0401f7a6, 0x592c020a, + 0x8c000502, 0x040007cd, 0x592c0208, 0x8c00050e, + 0x040207ca, 0x59300011, 0x800c0d80, 0x040007c7, + 0x4803c857, 0x480fc857, 0x8c183514, 0x02000000, + 0x0010920f, 0x80000540, 0x040007c0, 0x4807c856, + 0x0201f000, 0x0010920f, 0x592c020a, 0x8c000502, + 0x04000782, 0x59300011, 0x800001c0, 0x0400077f, + 0x592c0208, 0x8c00050e, 0x0402077c, 0x0201f000, + 0x0010920f, 0x59cc2006, 0x59cc2807, 0x0401f035, + 0x0401f034, 0x1c01f000, 0x4933c857, 0x5930001c, + 0x800001c0, 0x02020800, 0x0010984e, 0x59325808, + 0x592c0c08, 0x41782800, 0x41781800, 0x84040d58, + 0x48065c08, 0x41783000, 0x59340200, 0x8c00050e, + 0x04020018, 0x0201f800, 0x0002082b, 0x04020007, + 0x4a025a06, 0x00000000, 0x59300811, 0x4807c857, + 0x800409c0, 0x040208ac, 0x4a025a04, 0x00000103, + 0x48065807, 0x480e580a, 0x48165c09, 0x4933c857, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x592c020a, 0x8c000502, 0x040007ea, 0x59300011, + 0x4803c857, 0x800001c0, 0x040007e6, 0x592c0208, + 0x8c00050e, 0x040207e3, 0x0201f000, 0x0010920f, + 0x5930001c, 0x800001c0, 0x4c100000, 0x4c140000, + 0x02020800, 0x0010984e, 0x5c002800, 0x5c002000, + 0x4a026203, 0x00000002, 0x4a026403, 0x00000043, + 0x59325808, 0x592c020a, 0x8c000502, 0x04020018, + 0x40100000, 0x592c080f, 0x80040c80, 0x40140000, + 0x80040480, 0x04001014, 0x48126013, 0x48166011, + 0x59300004, 0x8c00053e, 0x04020008, 0x497a6205, + 0x0201f800, 0x00100f93, 0x04020009, 0x59300804, + 0x0201f000, 0x00106721, 0x0201f800, 0x00106f60, + 0x040007f7, 0x0201f000, 0x00107974, 0x4933c857, + 0x1c01f000, 0x4807c857, 0x40042800, 0x0401f7eb, + 0x83380480, 0x00000058, 0x04021005, 0x83380480, + 0x00000040, 0x04001002, 0x0c01f002, 0x1c01f000, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x00108740, 0x00108740, 0x00108742, 0x00108740, + 0x00108740, 0x00108740, 0x00108740, 0x0010874f, + 0x00108740, 0x00108740, 0x00108740, 0x00108740, + 0x0010877d, 0x00108740, 0x00108740, 0x00108740, + 0x0201f800, 0x001005d8, 0x4933c857, 0x0201f800, + 0x00106dc3, 0x4a026203, 0x00000002, 0x59a80039, + 0x48026205, 0x59300011, 0x59300815, 0x80040c80, + 0x48066015, 0x0201f000, 0x00106b8a, 0x4933c857, + 0x0201f800, 0x00106b8a, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00109037, 0x04000010, 0x4d2c0000, 0x59325808, + 0x4a025a04, 0x00000103, 0x59300402, 0x48025c06, + 0x4a025a06, 0x00000029, 0x497a5c09, 0x592c0c08, + 0x84040d50, 0x48065c08, 0x0201f800, 0x000202da, + 0x5c025800, 0x42003000, 0x00000014, 0x41782800, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42002000, + 0x00000002, 0x42028000, 0x00000029, 0x0201f800, + 0x0010985e, 0x5c028800, 0x5c028000, 0x0201f000, + 0x0002077d, 0x4933c857, 0x59300808, 0x49780c09, + 0x4978080a, 0x58041408, 0x84081558, 0x48080c08, + 0x1c01f000, 0x4807c857, 0x8c040d3e, 0x04020023, + 0x497a5a06, 0x5930001f, 0x80000540, 0x04000017, + 0x497a5a06, 0x4c040000, 0x4c080000, 0x4c0c0000, + 0x4c100000, 0x4c140000, 0x58f41003, 0x40040000, + 0x80081480, 0x5930001f, 0x4809e803, 0x0201f800, + 0x00100d56, 0x5c002800, 0x5c002000, 0x5c001800, + 0x5c001000, 0x5c000800, 0x592c0206, 0x80000540, + 0x04020009, 0x0401f005, 0x592c0408, 0x8c00051c, + 0x04000002, 0x592c0803, 0x4807c857, 0x4a025a06, + 0x00000015, 0x1c01f000, 0x5930001f, 0x80000540, + 0x04000009, 0x4a025a06, 0x00000011, 0x5930001f, + 0x4c040000, 0x0201f800, 0x00100d56, 0x5c000800, + 0x0401f7f5, 0x4807c856, 0x4a025a06, 0x00000007, + 0x1c01f000, 0x83380480, 0x00000058, 0x04021007, + 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001087db, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087dd, 0x001087db, 0x001087db, 0x00108860, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087db, 0x001087db, 0x001087db, 0x001087db, + 0x001087db, 0x001087db, 0x00108910, 0x00108939, + 0x00108918, 0x001087db, 0x00108945, 0x0201f800, + 0x001005d8, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300007, 0x8c00050e, 0x0400007c, + 0x8c000500, 0x0400006e, 0x8c00051c, 0x04000009, + 0x84000500, 0x48026007, 0x59325808, 0x592c3c08, + 0x841c3d58, 0x481e5c08, 0x0201f000, 0x000207dd, + 0x59325808, 0x592c3c08, 0x841c3d58, 0x59300007, + 0x8c00051c, 0x040207f3, 0x481e5c08, 0x42000000, + 0x00000005, 0x40000000, 0x80000040, 0x040207fe, + 0x59300007, 0x8c00051c, 0x040207ea, 0x59cc0a08, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000048, 0x0402000c, 0x497a580b, 0x82040500, + 0x000000ff, 0x04000008, 0x592c0407, 0x800001c0, + 0x04000005, 0x0201f800, 0x0010973f, 0x0201f000, + 0x00100e56, 0x48065c09, 0x41782000, 0x82040500, + 0x00000c00, 0x04000002, 0x59cc2009, 0x82043500, + 0x00000fff, 0x04020027, 0x481e5c08, 0x4a025a06, + 0x00000000, 0x801831c0, 0x02000000, 0x00100e56, + 0x41782000, 0x8c183510, 0x04000002, 0x59cc200b, + 0x4812580c, 0x41780000, 0x8c183512, 0x04000002, + 0x59cc000a, 0x4802580b, 0x80100c00, 0x02001800, + 0x001005d8, 0x02000000, 0x00100e56, 0x82041480, + 0x0000001d, 0x0402100c, 0x4c500000, 0x4c540000, + 0x83cca400, 0x0000000c, 0x832cac00, 0x0000000d, + 0x0401fb67, 0x5c00a800, 0x5c00a000, 0x0201f000, + 0x00100e56, 0x0401fb0b, 0x0201f000, 0x00100e56, + 0x412c7800, 0x0201f800, 0x001007e4, 0x02000800, + 0x001005d8, 0x492c7809, 0x841c3d52, 0x481c7c08, + 0x4a025a04, 0x00000103, 0x4812580a, 0x48065c09, + 0x583c0404, 0x583c1005, 0x583c2208, 0x48025c04, + 0x480a5805, 0x48125a08, 0x0401f7c8, 0x8c000524, + 0x04000794, 0x59325808, 0x4c000000, 0x592c0408, + 0x8c00051c, 0x5c000000, 0x04020003, 0x4a026011, + 0xffffffff, 0x84000524, 0x0401f78a, 0x1c01f000, + 0x59a80039, 0x48026205, 0x59325808, 0x4a026203, + 0x00000002, 0x592c2408, 0x59300807, 0x4933c857, + 0x4807c857, 0x592c0204, 0x82000500, 0x000000ff, + 0x82000580, 0x00000048, 0x04020004, 0x8c102500, + 0x02020000, 0x00109787, 0x4a025a06, 0x00000000, + 0x8c040d1e, 0x04000027, 0x41780800, 0x497a5c09, + 0x592c1c09, 0x59300011, 0x59341200, 0x497a6205, + 0x8c08150e, 0x0402006e, 0x4807c857, 0x4806580a, + 0x80000d40, 0x04020f04, 0x59300402, 0x48025c06, + 0x48065807, 0x4a025a04, 0x00000103, 0x4c040000, + 0x4c0c0000, 0x4c100000, 0x0201f800, 0x0010959c, + 0x5c002000, 0x5c001800, 0x5c000800, 0x8c102512, + 0x0402001a, 0x4c0c0000, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x5c001800, 0x8c0c1d18, + 0x02000000, 0x0002077d, 0x0201f000, 0x001091d1, + 0x4813c857, 0x8c102518, 0x0400004b, 0x41780800, + 0x592c1c09, 0x820c0580, 0x00001000, 0x040007d6, + 0x8c102512, 0x040007d4, 0x592c7809, 0x583c080a, + 0x583c1c09, 0x0401f7d0, 0x4807c857, 0x592c7809, + 0x59300402, 0x592c1404, 0x8c08151e, 0x0402000d, + 0x592c1206, 0x48007c06, 0x48047807, 0x48087a06, + 0x84102512, 0x48107c08, 0x4c0c0000, 0x0201f800, + 0x001007fd, 0x403e5800, 0x0401faca, 0x0401f7d9, + 0x48025c06, 0x48065807, 0x583c080c, 0x583c000b, + 0x80040c00, 0x82041480, 0x0000001d, 0x04001006, + 0x583c1001, 0x480a5801, 0x49787801, 0x42000800, + 0x0000001c, 0x82040c00, 0x00000014, 0x4c0c0000, + 0x4c500000, 0x4c540000, 0x823ca400, 0x00000008, + 0x832cac00, 0x00000008, 0x4c100000, 0x4c3c0000, + 0x0401facb, 0x5c007800, 0x5c002000, 0x5c00a800, + 0x5c00a000, 0x84102512, 0x48125c08, 0x403e5800, + 0x0201f800, 0x001007fd, 0x42034000, 0x0010b4a4, + 0x59a1d81e, 0x80edd9c0, 0x02000800, 0x001005d8, + 0x48efc857, 0x58ec0009, 0x4803c857, 0x0801f800, + 0x0401f7ac, 0x4933c857, 0x1c01f000, 0x59301414, + 0x480bc857, 0x8c08151c, 0x0402000e, 0x80000540, + 0x4803c857, 0x0400078d, 0x80042c80, 0x0402178b, + 0x8c081514, 0x04020005, 0x592c080f, 0x4807c857, + 0x80040480, 0x48026016, 0x8408155c, 0x480a6414, + 0x59301007, 0x8408151e, 0x480a6007, 0x4a025c09, + 0x00000001, 0x0201f800, 0x0010959c, 0x497a5c09, + 0x8c102512, 0x04000006, 0x4d2c0000, 0x403e5800, + 0x0201f800, 0x001007fd, 0x5c025800, 0x82102500, + 0xffffedff, 0x48125c08, 0x0201f000, 0x0010920f, + 0x59325808, 0x592c0408, 0x8c000518, 0x04000004, + 0x412df800, 0x0201f000, 0x00100e6f, 0x1c01f000, + 0x4933c857, 0x59325808, 0x497a5c09, 0x4a025a06, + 0x00000000, 0x4a025a04, 0x00000103, 0x59300811, + 0x4807c857, 0x800409c0, 0x0402000a, 0x48065807, + 0x59300c02, 0x48065c06, 0x0201f800, 0x000202c1, + 0x0201f800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x59340200, 0x8c00050e, 0x04020005, 0x59300811, + 0x0401fe55, 0x48065807, 0x0401f7f2, 0x592c0208, + 0x8c00050e, 0x040207fa, 0x4933c857, 0x0201f000, + 0x0010920f, 0x4933c857, 0x59325808, 0x812e59c0, + 0x02000800, 0x001005d8, 0x592c020a, 0x8c000502, + 0x02000800, 0x001005d8, 0x4a026206, 0x00000002, + 0x1c01f000, 0x5930001c, 0x800001c0, 0x02020800, + 0x0010984e, 0x59300007, 0x4933c857, 0x4803c857, + 0x8c00050e, 0x04000037, 0x8c000500, 0x04000029, + 0x8c00051c, 0x0400000a, 0x84000500, 0x48026007, + 0x59325808, 0x592c3c08, 0x481fc857, 0x841c3d58, + 0x481e5c08, 0x0201f000, 0x000207dd, 0x59325808, + 0x592c3c08, 0x841c3d58, 0x59300007, 0x8c00051c, + 0x040207f2, 0x481e5c08, 0x42000000, 0x00000005, + 0x40000000, 0x80000040, 0x040207fe, 0x59300007, + 0x8c00051c, 0x040207e9, 0x592c0204, 0x82000500, + 0x000000ff, 0x82000580, 0x00000048, 0x04020003, + 0x497a580b, 0x0401f002, 0x497a5c09, 0x481e5c08, + 0x4a025a06, 0x00000000, 0x0201f000, 0x00100e56, + 0x8c000524, 0x040007d9, 0x59325808, 0x4c000000, + 0x592c0408, 0x8c00051c, 0x5c000000, 0x04020003, + 0x4a026011, 0xffffffff, 0x84000524, 0x0401f7cf, + 0x1c01f000, 0x4933c857, 0x41780800, 0x83380480, + 0x00000058, 0x0402100b, 0x83380480, 0x00000040, + 0x04001008, 0x4d2c0000, 0x59325808, 0x812e59c0, + 0x0c020806, 0x5c025800, 0x0201f000, 0x0002077d, + 0x493bc857, 0x1c01f000, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089b0, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089ae, 0x001089ae, + 0x001089ae, 0x001089ae, 0x001089b5, 0x001089ae, + 0x001089ae, 0x001089ae, 0x0201f800, 0x001005d8, + 0x59cc0a08, 0x497a5807, 0x4807c857, 0x82040d00, + 0x00000fff, 0x59300402, 0x48025c06, 0x4a025a04, + 0x00000103, 0x48065c09, 0x4a025a06, 0x00000000, + 0x800409c0, 0x02000000, 0x000202c1, 0x59cc0009, + 0x4802580a, 0x82042500, 0x00000100, 0x04000002, + 0x59cc200b, 0x4812580c, 0x82040500, 0x00000200, + 0x04000002, 0x59cc000a, 0x4802580b, 0x80100c00, + 0x02001800, 0x001005d8, 0x02000000, 0x000202da, + 0x82041480, 0x0000001d, 0x04001006, 0x592c0404, + 0x8c00051e, 0x0400000e, 0x42000800, 0x0000001c, + 0x4c500000, 0x4c540000, 0x83cca400, 0x0000000c, + 0x832cac00, 0x0000000d, 0x0401f9c1, 0x5c00a800, + 0x5c00a000, 0x0201f000, 0x000202da, 0x0401f965, + 0x0401f1a0, 0x83380480, 0x00000093, 0x02021800, + 0x001005d8, 0x83380480, 0x00000085, 0x02001800, + 0x001005d8, 0x0c01f001, 0x001089fd, 0x001089fb, + 0x001089fb, 0x00108a04, 0x001089fb, 0x001089fb, + 0x001089fb, 0x001089fb, 0x001089fb, 0x001089fb, + 0x001089fb, 0x001089fb, 0x001089fb, 0x0201f800, + 0x001005d8, 0x4a026203, 0x00000001, 0x493a6403, + 0x42000800, 0x80000040, 0x0201f000, 0x00020721, + 0x4933c857, 0x59cc1204, 0x480a601c, 0x59cc1404, + 0x0201f800, 0x00109410, 0x0400001b, 0x591c0203, + 0x82000580, 0x00000000, 0x04000017, 0x591c0009, + 0x81340580, 0x04020014, 0x4d300000, 0x4d1c0000, + 0x411e6000, 0x0401f9c2, 0x5c023800, 0x5c026000, + 0x0400000b, 0x59cc0005, 0x8c000500, 0x04020003, + 0x0401f98c, 0x0401f003, 0x4a023a03, 0x00000002, + 0x4a026403, 0x00000086, 0x0401f005, 0x0401f9a6, + 0x040007f5, 0x4a026403, 0x00000087, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x59340200, 0x8c00050e, 0x0400000d, + 0x59cc1404, 0x0201f800, 0x00109410, 0x04000009, + 0x591c0414, 0x8c00051a, 0x04000006, 0x4d300000, + 0x411e6000, 0x0201f800, 0x0010921e, 0x5c026000, + 0x1c01f000, 0x83380580, 0x00000013, 0x0402000a, + 0x59300403, 0x82000d80, 0x00000086, 0x04000012, + 0x82000d80, 0x00000087, 0x02020800, 0x001005d8, + 0x0401f00d, 0x83380580, 0x00000027, 0x04000005, + 0x83380580, 0x00000014, 0x02020800, 0x001005d8, + 0x493bc857, 0x0201f800, 0x00106bbf, 0x0201f000, + 0x00107911, 0x4933c857, 0x0201f000, 0x00107911, + 0x83380580, 0x00000013, 0x04020005, 0x59300403, + 0x82000480, 0x00000085, 0x0c01f04d, 0x83380580, + 0x00000027, 0x04020041, 0x4933c857, 0x0201f800, + 0x00106bbf, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000015, + 0x41782800, 0x42002000, 0x00000003, 0x42028000, + 0x00000029, 0x4d400000, 0x4d440000, 0x59368c03, + 0x0201f800, 0x0010985e, 0x5c028800, 0x5c028000, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00109037, 0x0400000c, 0x4d2c0000, + 0x59325808, 0x4a025a04, 0x00000103, 0x59300402, + 0x48025c06, 0x497a5c09, 0x49425a06, 0x0201f800, + 0x000202da, 0x5c025800, 0x0201f800, 0x0010912a, + 0x0201f000, 0x0002077d, 0x83380580, 0x00000089, + 0x04000005, 0x83380580, 0x0000008a, 0x02020000, + 0x00107974, 0x0201f800, 0x00106f60, 0x02020000, + 0x00107974, 0x59300a03, 0x82040580, 0x0000000a, + 0x0400002a, 0x82040580, 0x0000000c, 0x04000027, + 0x0201f800, 0x001005d8, 0x83380580, 0x00000014, + 0x040207ea, 0x4933c857, 0x0201f800, 0x00106bbf, + 0x42028000, 0x00000006, 0x0401f7d2, 0x00108aba, + 0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8, + 0x00108ab8, 0x00108ac0, 0x00108ab8, 0x00108ab8, + 0x00108ab8, 0x00108ab8, 0x00108ab8, 0x00108ab8, + 0x0201f800, 0x001005d8, 0x4933c857, 0x59a80037, + 0x48026206, 0x4a026203, 0x0000000a, 0x1c01f000, + 0x4933c857, 0x59a80037, 0x48026206, 0x4a026203, + 0x0000000c, 0x1c01f000, 0x83380580, 0x00000089, + 0x04000008, 0x83380580, 0x0000008a, 0x04000032, + 0x4933c857, 0x493bc857, 0x0201f000, 0x00107974, + 0x4933c857, 0x59325808, 0x59300a1d, 0x82040580, + 0x00000003, 0x04020004, 0x0201f800, 0x001049b2, + 0x0401f00c, 0x5930021d, 0x82000580, 0x00000001, + 0x04020008, 0x59300c16, 0x82040580, 0x00000039, + 0x0400002c, 0x82040580, 0x00000035, 0x04000029, + 0x4c340000, 0x41306800, 0x0201f800, 0x0002075a, + 0x04000010, 0x4a026203, 0x00000001, 0x4a026403, + 0x0000001e, 0x59cc0c07, 0x48066419, 0x59cc0a07, + 0x48066219, 0x49366009, 0x4a026406, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x40366000, 0x0201f800, 0x0002077d, 0x5c006800, + 0x1c01f000, 0x4933c857, 0x5930021d, 0x82000580, + 0x00000001, 0x04020040, 0x59300c16, 0x82040580, + 0x00000035, 0x04000007, 0x82040580, 0x0000001e, + 0x04000004, 0x82040580, 0x00000039, 0x04020036, + 0x4933c857, 0x4c500000, 0x4d1c0000, 0x4130a000, + 0x40067000, 0x0201f800, 0x001093ba, 0x04020029, + 0x0201f800, 0x0002075a, 0x04000026, 0x491fc857, + 0x4933c857, 0x83380580, 0x00000035, 0x04000004, + 0x83380580, 0x00000039, 0x04020002, 0x4932381c, + 0x493a6403, 0x4a026203, 0x00000001, 0x4a026406, + 0x00000001, 0x58500809, 0x4807c857, 0x48066009, + 0x58500c15, 0x4807c857, 0x48066415, 0x58500a15, + 0x4807c857, 0x48066215, 0x58500a16, 0x4807c857, + 0x48066216, 0x58500c19, 0x4807c857, 0x48066419, + 0x58500a19, 0x4807c857, 0x48066219, 0x491e601e, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x40526000, 0x5c023800, 0x5c00a000, 0x0201f000, + 0x0002077d, 0x5930021d, 0x82000580, 0x00000003, + 0x02000800, 0x001049b2, 0x0201f000, 0x0002077d, + 0x4803c856, 0x4c500000, 0x4c540000, 0x412c7800, + 0x4c3c0000, 0x42002800, 0x00000001, 0x82040480, + 0x00000101, 0x04001003, 0x42000800, 0x00000100, + 0x40043000, 0x42000800, 0x0000001c, 0x83cca400, + 0x0000000c, 0x832cac00, 0x0000000d, 0x0401f844, + 0x82183480, 0x0000001c, 0x592e5801, 0x812e59c0, + 0x02020800, 0x001007fd, 0x0201f800, 0x001007e4, + 0x04000017, 0x80142800, 0x4a025a04, 0x00000110, + 0x497a5c04, 0x492c7801, 0x82180c80, 0x0000003d, + 0x04021006, 0x40180800, 0x832cac00, 0x00000005, + 0x0401f82f, 0x0401f00a, 0x82183480, 0x0000003c, + 0x42000800, 0x0000003c, 0x412c7800, 0x832cac00, + 0x00000005, 0x0401f826, 0x0401f7e8, 0x5c007800, + 0x841429c0, 0x82142d40, 0x00000003, 0x48147a04, + 0x403e5800, 0x5c00a800, 0x5c00a000, 0x1c01f000, + 0x492fc857, 0x812e59c0, 0x0400000f, 0x4d2c0000, + 0x4c3c0000, 0x592c7801, 0x803c79c0, 0x04000006, + 0x497a5801, 0x0201f800, 0x000202da, 0x403e5800, + 0x0401f7f9, 0x5c007800, 0x0201f800, 0x000202da, + 0x5c025800, 0x1c01f000, 0x4803c856, 0x4c580000, + 0x82040c00, 0x00000003, 0x8004b104, 0x0201f800, + 0x0010ab17, 0x5c00b000, 0x1c01f000, 0x4803c856, + 0x4c580000, 0x82040c00, 0x00000003, 0x8004b104, + 0x0201f800, 0x0010ab17, 0x5c00b000, 0x1c01f000, + 0x591c0c06, 0x82040580, 0x00000003, 0x04000004, + 0x82040580, 0x00000002, 0x0402001a, 0x4d300000, + 0x4d2c0000, 0x411e6000, 0x59325808, 0x0201f800, + 0x00109037, 0x0400000f, 0x4d400000, 0x42028000, + 0x00000013, 0x592c0a08, 0x84040d54, 0x0201f800, + 0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x0201f800, 0x0010912a, + 0x0201f800, 0x00107911, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x59cc0005, 0x8c000500, 0x0402000b, + 0x591c0406, 0x82000580, 0x00000002, 0x04020007, + 0x591c0c03, 0x82040580, 0x00000085, 0x04000003, + 0x82040580, 0x0000008b, 0x1c01f000, 0x4933c857, + 0x4d3c0000, 0x42027800, 0x00000002, 0x59300406, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f80a, 0x5c027800, 0x1c01f000, 0x4933c857, + 0x59300406, 0x82000c80, 0x00000012, 0x02021800, + 0x001005d8, 0x0c01f001, 0x00108c01, 0x00108bfe, + 0x00108bfe, 0x00108c29, 0x00108bfc, 0x00108bfe, + 0x00108c1a, 0x00108bfe, 0x00108bfc, 0x001065f4, + 0x00108bfe, 0x00108bfe, 0x00108bfe, 0x00108bfc, + 0x00108bfc, 0x00108bfc, 0x00108cf9, 0x00108bfe, + 0x0201f800, 0x001005d8, 0x4803c856, 0x80000580, + 0x1c01f000, 0x4803c856, 0x8d3e7d02, 0x04020016, + 0x0201f800, 0x00109037, 0x0400000f, 0x59325808, + 0x41780800, 0x4d400000, 0x42028000, 0x00000005, + 0x0201f800, 0x00104e70, 0x5c028000, 0x0201f800, + 0x0010959c, 0x0201f800, 0x001091cc, 0x0201f800, + 0x000202da, 0x0201f800, 0x00107911, 0x82000540, + 0x00000001, 0x1c01f000, 0x4933c857, 0x0201f800, + 0x001048d9, 0x0402000c, 0x4d400000, 0x42028000, + 0x00000010, 0x0201f800, 0x0010a1d1, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x5c028000, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55, + 0x4df00000, 0x0401f8b8, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00108c43, + 0x00108cb0, 0x00108c5a, 0x00108cc3, 0x00108cab, + 0x00108c41, 0x00108c43, 0x00108c43, 0x00108c47, + 0x00108c43, 0x00108c43, 0x00108c43, 0x00108c43, + 0x00108c5a, 0x0201f800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401f7b8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x59300406, 0x82000580, + 0x00000003, 0x040207b4, 0x59300203, 0x82000580, + 0x0000000d, 0x040007b0, 0x8d3e7d02, 0x040207ae, + 0x4d340000, 0x59326809, 0x0201f800, 0x001049b2, + 0x5c026800, 0x0401f7a8, 0x59300004, 0x8400055c, + 0x48026004, 0x0201f800, 0x00106c4b, 0x59300406, + 0x82000580, 0x00000006, 0x04000043, 0x8d3e7d02, + 0x04020041, 0x497a621d, 0x59300203, 0x82000580, + 0x0000000d, 0x04000003, 0x4a02621d, 0x00000003, + 0x0401fbcb, 0x04000024, 0x4d2c0000, 0x4d400000, + 0x59325808, 0x0201f800, 0x001091cc, 0x592c0408, + 0x8c000512, 0x04000009, 0x4d2c0000, 0x84000512, + 0x48025c08, 0x592c0809, 0x40065800, 0x0201f800, + 0x001007fd, 0x5c025800, 0x4d400000, 0x42028000, + 0x00000005, 0x592c0a08, 0x8c040d0e, 0x04000004, + 0x42028000, 0x00000002, 0x0401f001, 0x0201f800, + 0x00104e70, 0x5c028000, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x497a6008, 0x5c028000, + 0x5c025800, 0x8d3e7d00, 0x04000009, 0x4d340000, + 0x59326809, 0x0201f800, 0x001049b2, 0x5c026800, + 0x0201f800, 0x00107911, 0x0401f00b, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000404b, 0x0201f800, + 0x00020721, 0x5c03e000, 0x02020800, 0x00106c55, + 0x82000540, 0x00000001, 0x1c01f000, 0x0201f800, + 0x00106c4b, 0x0201f800, 0x00100e99, 0x0401f7ab, + 0x598c000d, 0x81300580, 0x04020004, 0x0201f800, + 0x00106e8e, 0x0402001b, 0x0201f800, 0x001068d3, + 0x04020006, 0x59300c03, 0x82040580, 0x00000040, + 0x0400078b, 0x0401f79d, 0x0201f800, 0x00106b6c, + 0x04000010, 0x0201f800, 0x001005d8, 0x0401f813, + 0x04020004, 0x0201f800, 0x00106e62, 0x04020009, + 0x0201f800, 0x001067ae, 0x040207f4, 0x59300c03, + 0x82040580, 0x00000040, 0x04000779, 0x0401f78b, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f75e, 0x417a3000, 0x42032000, + 0x0000bf32, 0x59900004, 0x81300580, 0x04000009, + 0x83932400, 0x00000010, 0x811a3000, 0x83180480, + 0x00000005, 0x040017f8, 0x82000540, 0x00000001, + 0x1c01f000, 0x59300004, 0x8c00053e, 0x04000010, + 0x8c00050c, 0x0402000e, 0x8c000516, 0x04020006, + 0x82000d00, 0x0000001f, 0x82040580, 0x00000005, + 0x04020004, 0x42000000, 0x00000003, 0x0401f005, + 0x42000000, 0x00000001, 0x0401f002, 0x59300203, + 0x1c01f000, 0x4933c857, 0x0201f800, 0x00106c55, + 0x4df00000, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x00108d13, + 0x00108d30, 0x00108d17, 0x00108d11, 0x00108d11, + 0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11, + 0x00108d11, 0x00108d11, 0x00108d11, 0x00108d11, + 0x00108d11, 0x0201f800, 0x001005d8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x0401f6e8, 0x5c03e000, + 0x02000800, 0x00106c4b, 0x4d2c0000, 0x59325808, + 0x59300403, 0x82000580, 0x00000052, 0x02000800, + 0x00101231, 0x0401fb16, 0x02000800, 0x001005d8, + 0x4a025a06, 0x00000005, 0x0201f800, 0x000202da, + 0x0201f800, 0x00104c19, 0x0201f800, 0x00107911, + 0x5c025800, 0x82000540, 0x00000001, 0x1c01f000, + 0x598c000d, 0x81300580, 0x0402001a, 0x59300004, + 0x8c000520, 0x04000004, 0x84000520, 0x48026004, + 0x0401f01a, 0x42001000, 0x0010b7f6, 0x50081000, + 0x58080002, 0x82000580, 0x00000100, 0x0400000a, + 0x5808000c, 0x81300580, 0x02020800, 0x001005d8, + 0x0201f800, 0x001068d3, 0x02020800, 0x001005d8, + 0x0401f7cf, 0x0201f800, 0x00106e8e, 0x0402000c, + 0x59300004, 0x8c000520, 0x04000004, 0x84000520, + 0x48026004, 0x0401f7c6, 0x0201f800, 0x001068d3, + 0x040007c3, 0x0201f800, 0x001005d8, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f7a7, 0x59300406, 0x4933c857, 0x4803c857, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f001, 0x00108d7c, 0x00108e41, 0x00108f79, + 0x00108d88, 0x00107911, 0x00108d7c, 0x0010a1c0, + 0x0002077d, 0x00108e41, 0x001065ce, 0x00108fda, + 0x00108d77, 0x00108d77, 0x00108d77, 0x00108d77, + 0x00108d77, 0x001096eb, 0x001096eb, 0x0201f800, + 0x001005d8, 0x0401fbd5, 0x02000000, 0x0010801c, + 0x1c01f000, 0x0201f800, 0x00106c55, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00106c4b, 0x0201f000, + 0x0002077d, 0x4a026206, 0x00000001, 0x1c01f000, + 0x42000000, 0x0010b872, 0x0201f800, 0x0010aa47, + 0x4d2c0000, 0x4d400000, 0x417a5800, 0x0401faa8, + 0x04000007, 0x59325808, 0x592c0208, 0x8400054c, + 0x48025a08, 0x42028000, 0x00000006, 0x0201f800, + 0x00106c55, 0x0401ff4c, 0x4803c857, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f806, + 0x0201f800, 0x00106c4b, 0x5c028000, 0x5c025800, + 0x1c01f000, 0x00108e40, 0x00108db5, 0x00108dc3, + 0x00108de5, 0x00108e11, 0x00108db3, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108db3, 0x00108db3, + 0x00108db3, 0x00108db3, 0x00108dc3, 0x0201f800, + 0x001005d8, 0x598c000d, 0x81300580, 0x04020004, + 0x0201f800, 0x00106e8e, 0x04020038, 0x0201f800, + 0x001068d3, 0x0400003b, 0x0201f800, 0x00106b6c, + 0x04000032, 0x0201f800, 0x001005d8, 0x497a621d, + 0x812e59c0, 0x02000800, 0x001005d8, 0x592c0204, + 0x82000500, 0x000000ff, 0x82000580, 0x00000014, + 0x04000003, 0x4a02621d, 0x00000003, 0x592c0a08, + 0x0201f800, 0x00104e70, 0x0201f800, 0x0010959c, + 0x0201f800, 0x000202da, 0x497a6008, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x4a026004, 0x8000404b, 0x0201f800, + 0x00106c4b, 0x42000800, 0x8000404b, 0x0201f000, + 0x00020721, 0x0401fef1, 0x04020004, 0x0201f800, + 0x00106e62, 0x04020009, 0x0201f800, 0x001067ae, + 0x040207d2, 0x59300c03, 0x82040580, 0x00000040, + 0x04000008, 0x0401f7d2, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ae, + 0x0201f800, 0x00106c4b, 0x812e59c0, 0x04000013, + 0x592c0a08, 0x0201f800, 0x00104e70, 0x0201f800, + 0x0010959c, 0x0201f800, 0x000202da, 0x59300203, + 0x82000580, 0x0000000d, 0x04000008, 0x0201f800, + 0x00106c4b, 0x4d340000, 0x59326809, 0x0201f800, + 0x001049b2, 0x5c026800, 0x0201f800, 0x00107911, + 0x0401f030, 0x812e59c0, 0x02000800, 0x001005d8, + 0x0201f800, 0x0010940a, 0x04020004, 0x0201f800, + 0x00100e99, 0x0401f7aa, 0x0201f800, 0x00106c4b, + 0x592c0208, 0x8400050c, 0x48025a08, 0x592c0406, + 0x800000c2, 0x800008c4, 0x80040c00, 0x48066206, + 0x42000000, 0x10000000, 0x41300800, 0x0201f800, + 0x00100b94, 0x0400000d, 0x592c0208, 0x8c00051c, + 0x04020006, 0x8400055c, 0x48025a08, 0x4a026206, + 0x00000002, 0x0401f00f, 0x4d300000, 0x0201f800, + 0x001012e5, 0x5c026000, 0x59300203, 0x82000580, + 0x00000004, 0x04020007, 0x4d380000, 0x42027000, + 0x00000048, 0x0201f800, 0x000207a1, 0x5c027000, + 0x1c01f000, 0x42000000, 0x0010b86e, 0x0201f800, + 0x0010aa47, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x4803c857, 0x0c01f001, + 0x00108e5a, 0x00108d85, 0x00108e5c, 0x00108e5a, + 0x00108e5c, 0x00108e5c, 0x00108d7d, 0x00108e5a, + 0x00108d79, 0x00108e5a, 0x00108e5a, 0x00108e5a, + 0x00108e5a, 0x00108e5a, 0x0201f800, 0x001005d8, + 0x4d340000, 0x4d2c0000, 0x59326809, 0x59340400, + 0x82000500, 0x000000ff, 0x82000c80, 0x0000000c, + 0x02021800, 0x001005d8, 0x59303403, 0x82180d80, + 0x00000004, 0x04020004, 0x42000000, 0x00000001, + 0x0401f006, 0x82180d80, 0x00000000, 0x04020003, + 0x42000000, 0x00000001, 0x4803c857, 0x0c01f804, + 0x5c025800, 0x5c026800, 0x1c01f000, 0x00108e83, + 0x00108f22, 0x00108e85, 0x00108eba, 0x00108e85, + 0x00108f3f, 0x00108e85, 0x00108e8f, 0x00108e83, + 0x00108f3f, 0x00108e83, 0x00108e9e, 0x0201f800, + 0x001005d8, 0x59300403, 0x82000d80, 0x00000016, + 0x0400002e, 0x82000d80, 0x00000004, 0x0400002b, + 0x82000d80, 0x00000002, 0x04000028, 0x0401fabf, + 0x04000079, 0x59300403, 0x82000d80, 0x00000022, + 0x040000ae, 0x82000d80, 0x00000039, 0x040000b3, + 0x82000d80, 0x00000035, 0x040000b0, 0x82000d80, + 0x0000001e, 0x0400001b, 0x0401f999, 0x04000007, + 0x0201f800, 0x00109597, 0x04020004, 0x0201f800, + 0x00104a14, 0x0401f011, 0x59300403, 0x82000d80, + 0x00000001, 0x04020004, 0x0201f800, 0x001049e7, + 0x0400000a, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010801c, + 0x0201f000, 0x00107911, 0x0401f97d, 0x04000004, + 0x0201f800, 0x00109597, 0x040000a9, 0x59300c03, + 0x82040580, 0x00000016, 0x04000056, 0x82040580, + 0x00000002, 0x04020034, 0x59a80026, 0x8c000502, + 0x04020013, 0x0201f800, 0x0010513b, 0x04020010, + 0x0201f800, 0x00105151, 0x04020006, 0x42000000, + 0x00000001, 0x0201f800, 0x00105113, 0x0401f094, + 0x4a035033, 0x00000001, 0x4202d800, 0x00000001, + 0x0201f800, 0x001050a2, 0x0401f08d, 0x59340403, + 0x82000580, 0x000007fc, 0x04000008, 0x59a80026, + 0x8c00050a, 0x04020084, 0x59340212, 0x82000500, + 0x0000ff00, 0x04000082, 0x59340412, 0x82000500, + 0x000000ff, 0x04000010, 0x80000040, 0x48026c12, + 0x497a6008, 0x4a026406, 0x00000007, 0x4a026206, + 0x00000398, 0x497a6205, 0x0201f800, 0x0002075a, + 0x04000005, 0x49366009, 0x4a026406, 0x00000001, + 0x0401f020, 0x59300403, 0x82000d80, 0x00000002, + 0x0402000d, 0x59340403, 0x82000580, 0x000007fe, + 0x04020009, 0x59a80026, 0x84000540, 0x48035026, + 0x0201f800, 0x00104237, 0x0201f800, 0x0010801c, + 0x0401f00c, 0x0201f800, 0x0010801c, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x0010203c, 0x5c027800, + 0x42000000, 0x0010b864, 0x0201f800, 0x0010aa47, + 0x0201f800, 0x00102074, 0x0201f000, 0x00107911, + 0x42000800, 0x00000003, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f000, 0x0010672b, 0x0401f915, 0x04020793, + 0x0201f800, 0x00102074, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x42000000, + 0x0010b864, 0x0201f800, 0x0010aa47, 0x42003000, + 0x00000018, 0x41782800, 0x42002000, 0x00000000, + 0x4d400000, 0x4d440000, 0x59368c03, 0x42028000, + 0x00000029, 0x0201f800, 0x0010985e, 0x5c028800, + 0x5c028000, 0x0201f000, 0x00107911, 0x0201f800, + 0x00104a14, 0x0401f7c8, 0x42000000, 0x0010b86d, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00107b76, + 0x040207c1, 0x1c01f000, 0x4d380000, 0x59327403, + 0x0201f800, 0x001093ba, 0x5c027000, 0x02020000, + 0x0002077d, 0x836c0580, 0x00000003, 0x04000004, + 0x4a026206, 0x00000002, 0x1c01f000, 0x59300403, + 0x48026416, 0x4a02621d, 0x00000001, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, + 0x00020721, 0x0201f800, 0x00102074, 0x0201f800, + 0x0010801c, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x497a6008, 0x4a026406, + 0x00000007, 0x4a026206, 0x00000398, 0x497a6205, + 0x1c01f000, 0x42000000, 0x0010b870, 0x0201f800, + 0x0010aa47, 0x4d340000, 0x59326809, 0x59300203, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x4803c857, 0x0c01f803, 0x5c026800, 0x1c01f000, + 0x00108f96, 0x00108d85, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108f96, 0x00108f96, 0x00108f96, + 0x00108f96, 0x00108d85, 0x00108f98, 0x00108d85, + 0x00108fa0, 0x00108f96, 0x0201f800, 0x001005d8, + 0x4a026403, 0x0000008b, 0x4a026203, 0x0000000b, + 0x42000800, 0x8000404b, 0x0201f000, 0x00020721, + 0x59300a1d, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000011, + 0x0201f800, 0x0010a942, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x41306800, 0x0201f800, + 0x0002075a, 0x04000008, 0x49366009, 0x4d300000, + 0x40366000, 0x0201f800, 0x00107911, 0x5c026000, + 0x0401f002, 0x40366000, 0x497a6008, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000001, 0x0201f800, + 0x00103b25, 0x04000011, 0x4a026406, 0x00000004, + 0x4a026203, 0x00000007, 0x4a026420, 0x00000001, + 0x42003000, 0x00000004, 0x4d400000, 0x42028000, + 0x00000029, 0x41782800, 0x0201f800, 0x0010a43e, + 0x5c028000, 0x1c01f000, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x42000000, 0x0010b876, + 0x0201f800, 0x0010aa47, 0x59300203, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x4803c857, + 0x0c01f001, 0x0010900b, 0x00108ff3, 0x00108ff7, + 0x0010900c, 0x00108ff5, 0x00108ff3, 0x00108ff3, + 0x00108ff3, 0x00108ff3, 0x00108ff3, 0x00108ff3, + 0x00108ff3, 0x00108ff3, 0x00108ff3, 0x0201f800, + 0x001005d8, 0x0201f800, 0x00100e99, 0x4d2c0000, + 0x59325808, 0x4a025a06, 0x00000006, 0x0201f800, + 0x000202da, 0x5c025800, 0x497a6008, 0x4a02621d, + 0x0000000a, 0x4a026403, 0x00000085, 0x4a026203, + 0x00000009, 0x4a026406, 0x00000002, 0x42000800, + 0x8000404b, 0x0201f000, 0x00020721, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0401fcc7, + 0x04020004, 0x0201f800, 0x00106e62, 0x0402000c, + 0x0201f800, 0x001067ae, 0x04020005, 0x5c03e000, + 0x0201f800, 0x00106c4b, 0x0401f7dd, 0x0201f800, + 0x00106b6c, 0x02020800, 0x001005d8, 0x5c03e000, + 0x0201f800, 0x00106c4b, 0x59300203, 0x82000d80, + 0x00000003, 0x02000800, 0x001005d8, 0x82000c80, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f7ba, + 0x4803c856, 0x59a8000e, 0x59a80867, 0x80040400, + 0x80080480, 0x04021004, 0x82000540, 0x00000001, + 0x1c01f000, 0x80000580, 0x1c01f000, 0x4803c856, + 0x4c080000, 0x59301008, 0x82081500, 0xfff00000, + 0x5c001000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x0002075a, 0x0400000a, 0x0401f82f, + 0x4d380000, 0x42027000, 0x0000004b, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x0400001b, 0x0401f81f, + 0x4d300000, 0x0201f800, 0x00106c55, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00106ab4, 0x0201f800, + 0x001067fd, 0x5c027800, 0x0201f800, 0x0010a2ff, + 0x0201f800, 0x00106c4b, 0x5c026000, 0x8d3e7d3e, + 0x0402000b, 0x4d380000, 0x42027000, 0x0000004c, + 0x0201f800, 0x000207a1, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x0201f800, + 0x0002077d, 0x0401f7fa, 0x592c0407, 0x494a6017, + 0x494e6018, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000003, 0x800000c2, 0x800008c4, 0x80040400, + 0x48026206, 0x1c01f000, 0x493bc857, 0x4d300000, + 0x0201f800, 0x0002075a, 0x0400000d, 0x0401ffef, + 0x4d400000, 0x42028000, 0x00000005, 0x0401f80d, + 0x5c028000, 0x8d3e7d3e, 0x04020007, 0x0201f800, + 0x000207a1, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x0201f800, 0x0002077d, 0x0401f7fa, + 0x4803c856, 0x0201f800, 0x00106c55, 0x4d3c0000, + 0x4d440000, 0x59368c03, 0x42027800, 0x00000001, + 0x0201f800, 0x001069b6, 0x0201f800, 0x0010692e, + 0x0201f800, 0x001067fd, 0x0201f800, 0x0010a2ff, + 0x5c028800, 0x5c027800, 0x0201f000, 0x00106c4b, + 0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a, + 0x0400000f, 0x481a601c, 0x48ee6021, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x0000001f, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000e, 0x48ee6021, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x00000055, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x0000003d, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x04000014, 0x49366009, + 0x492fc857, 0x4933c857, 0x592c0404, 0x8c00051e, + 0x04000003, 0x48efc857, 0x48ee6021, 0x4a026406, + 0x00000001, 0x492e6008, 0x4d380000, 0x42027000, + 0x00000000, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x0201f800, 0x0002075a, + 0x0400000f, 0x48ee6021, 0x481a601c, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x4d380000, + 0x42027000, 0x00000044, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4803c856, 0x4d300000, 0x0201f800, + 0x0002075a, 0x0400000f, 0x481a601c, 0x48ee6021, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x00000049, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x59300009, 0x80001540, + 0x02000800, 0x001005d8, 0x5808040b, 0x4803c856, + 0x80000040, 0x04001002, 0x4800140b, 0x1c01f000, + 0x4803c856, 0x59300403, 0x82000d80, 0x00000002, + 0x04000015, 0x82000d80, 0x00000003, 0x04000012, + 0x82000d80, 0x00000004, 0x0400000f, 0x82000d80, + 0x00000008, 0x0400000c, 0x82000d80, 0x0000000a, + 0x04000009, 0x599c0819, 0x8c040d0e, 0x04000004, + 0x82000d80, 0x00000000, 0x04000003, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x4c000000, + 0x4d2c0000, 0x59300406, 0x82000580, 0x00000004, + 0x0400001d, 0x59300008, 0x80025d40, 0x800001c0, + 0x04000019, 0x0201f800, 0x00109597, 0x04000014, + 0x59300406, 0x82004580, 0x00000010, 0x04000010, + 0x82004580, 0x00000011, 0x0400000d, 0x82004580, + 0x00000003, 0x0400000c, 0x82004580, 0x00000002, + 0x04000009, 0x82004580, 0x0000000a, 0x04000006, + 0x592c0404, 0x8c00051e, 0x04000003, 0x80000580, + 0x0401f003, 0x82000540, 0x00000001, 0x5c025800, + 0x5c000000, 0x1c01f000, 0x4803c856, 0x4d300000, + 0x0201f800, 0x00107942, 0x04000013, 0x49366009, + 0x48ee6021, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x4d380000, 0x42027000, 0x00000028, + 0x0201f800, 0x000207a1, 0x5c027000, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4803c856, + 0x83380580, 0x00000015, 0x0402000d, 0x59a80016, + 0x82000580, 0x00000074, 0x04020009, 0x0201f800, + 0x0010462a, 0x4a026203, 0x00000001, 0x4a026403, + 0x00000029, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010801c, 0x0201f000, 0x0002077d, 0x4803c856, + 0x83380580, 0x00000016, 0x04020007, 0x42000800, + 0x00000004, 0x0201f800, 0x00104571, 0x0201f000, + 0x00107b38, 0x83380580, 0x00000015, 0x04020013, + 0x59a80016, 0x82000580, 0x00000014, 0x0402000f, + 0x0201f800, 0x0010468d, 0x0201f800, 0x0010846f, + 0x0402000a, 0x59340404, 0x80000540, 0x04000007, + 0x42000800, 0x00000006, 0x0201f800, 0x00104571, + 0x0201f000, 0x00107b38, 0x0201f800, 0x0010801c, + 0x0201f000, 0x0002077d, 0x4803c856, 0x592c0206, + 0x82000580, 0x00000005, 0x04000002, 0x1c01f000, + 0x4803c856, 0x592c0208, 0x8400054a, 0x48025a08, + 0x1c01f000, 0x497a6205, 0x497a6008, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000050, 0x42000800, + 0x80000043, 0x0201f000, 0x00020721, 0x4933c857, + 0x4d340000, 0x59326809, 0x59340200, 0x8c00050e, + 0x04000006, 0x59300406, 0x82000c80, 0x00000012, + 0x04021004, 0x0c01f806, 0x5c026800, 0x1c01f000, + 0x0201f800, 0x00108d7c, 0x0401f7fc, 0x00108d7c, + 0x001091fd, 0x00109201, 0x00109204, 0x0010a49b, + 0x0010a4b8, 0x0010a4bc, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x00108d7c, 0x00108d7c, 0x00108d7c, + 0x00108d7c, 0x4803c856, 0x40000000, 0x40000000, + 0x1c01f000, 0x40000000, 0x40000000, 0x1c01f000, + 0x5930001c, 0x4803c857, 0x59300414, 0x4933c857, + 0x4803c857, 0x8c000502, 0x04000005, 0x84000502, + 0x84000540, 0x48026414, 0x1c01f000, 0x42000000, + 0xd0000000, 0x41300800, 0x0201f800, 0x00100b94, + 0x0401f80a, 0x04020008, 0x59a80037, 0x82000400, + 0x0000000a, 0x48026205, 0x59300414, 0x84000542, + 0x48026414, 0x1c01f000, 0x4933c857, 0x4d340000, + 0x59326809, 0x59340200, 0x8c00050e, 0x02000800, + 0x001005d8, 0x5930001c, 0x80000540, 0x0402002f, + 0x59a80021, 0x80000540, 0x0402002a, 0x4d1c0000, + 0x41323800, 0x0201f800, 0x0002075a, 0x04000023, + 0x4932381c, 0x591c0414, 0x84000542, 0x48023c14, + 0x49366009, 0x591c0406, 0x82000580, 0x00000003, + 0x04000006, 0x591c0202, 0x48026419, 0x591c0402, + 0x48026219, 0x0401f005, 0x591c0202, 0x48026219, + 0x591c0402, 0x48026419, 0x491e601e, 0x4a026406, + 0x00000001, 0x4a026403, 0x00000035, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f800, + 0x00020721, 0x411e6000, 0x5c023800, 0x80000580, + 0x5c026800, 0x1c01f000, 0x411e6000, 0x5c023800, + 0x59a80039, 0x48026205, 0x82000540, 0x00000001, + 0x0401f7f8, 0x4933c857, 0x4d2c0000, 0x4932381c, + 0x4a026202, 0x0000ffff, 0x591e5808, 0x591c0007, + 0x8c00051e, 0x04000005, 0x8400051e, 0x48023807, + 0x497a5c09, 0x0401f014, 0x592c0408, 0x8c000518, + 0x04000011, 0x84000518, 0x48025c08, 0x4a025c09, + 0x00000001, 0x0401fb2f, 0x497a5c09, 0x592c0408, + 0x8c000512, 0x04000008, 0x4d2c0000, 0x84000512, + 0x48025c08, 0x592e5809, 0x0201f800, 0x001007fd, + 0x5c025800, 0x59a80039, 0x48026205, 0x591c0214, + 0x48026216, 0x82000d80, 0x00000001, 0x04000008, + 0x4a023a03, 0x00000002, 0x82000580, 0x00000005, + 0x04000008, 0x497a6015, 0x0401f01e, 0x591c0007, + 0x84000540, 0x48023807, 0x4a023a03, 0x00000004, + 0x591c0414, 0x4803c857, 0x8400051c, 0x84000554, + 0x48023c14, 0x592c000f, 0x40001000, 0x591c0816, + 0x80040480, 0x040217f0, 0x591c0016, 0x82000500, + 0xfffffffc, 0x48026015, 0x48023816, 0x591c0a14, + 0x4807c857, 0x82040d80, 0x00000005, 0x04020005, + 0x480bc857, 0x4803c857, 0x4a023812, 0xffffffff, + 0x591c0402, 0x48026419, 0x591c0202, 0x48026219, + 0x591e6809, 0x49366009, 0x4a026406, 0x00000001, + 0x4a026403, 0x00000039, 0x4a026203, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x59300414, + 0x8c000514, 0x04000015, 0x8c00051c, 0x04020012, + 0x59300016, 0x80100480, 0x04001006, 0x04000005, + 0x59300414, 0x84000514, 0x8400055c, 0x0401f009, + 0x48126016, 0x48126012, 0x40100000, 0x592c180f, + 0x800c0480, 0x48026011, 0x59300414, 0x84000514, + 0x48026414, 0x1c01f000, 0x4933c857, 0x8c00051c, + 0x04020006, 0x59300012, 0x48026016, 0x59300414, + 0x8400055c, 0x48026414, 0x1c01f000, 0x59300c03, + 0x4933c857, 0x4807c857, 0x82040480, 0x00000034, + 0x04001006, 0x82040480, 0x0000003c, 0x04021003, + 0x80000580, 0x1c01f000, 0x82000540, 0x00000001, + 0x0401f7fd, 0x41780800, 0x59a81035, 0x42000000, + 0x00000032, 0x0201f800, 0x001066a0, 0x800811c0, + 0x04020003, 0x42001000, 0x00000014, 0x480b5037, + 0x59a81036, 0x480b502d, 0x41780800, 0x42000000, + 0x00000064, 0x0201f800, 0x001066a0, 0x800811c0, + 0x04020003, 0x42001000, 0x00000014, 0x480b5038, + 0x82081400, 0x0000000a, 0x480b5039, 0x42000800, + 0x00000001, 0x0201f800, 0x00106c78, 0x42000000, + 0x30000000, 0x40080800, 0x0201f800, 0x00100b68, + 0x42000800, 0x00000003, 0x59a81010, 0x0201f800, + 0x00106c78, 0x0201f000, 0x00104906, 0x4a035037, + 0x00000028, 0x4a035038, 0x00000014, 0x4a03502d, + 0x000007d0, 0x42001000, 0x0000001e, 0x480b5039, + 0x42000800, 0x00000001, 0x0201f800, 0x00106c78, + 0x42000000, 0x30000000, 0x40080800, 0x0201f800, + 0x00100b68, 0x42000800, 0x00000003, 0x59a81010, + 0x0201f000, 0x00106c78, 0x4933c857, 0x4d2c0000, + 0x59300403, 0x82000580, 0x0000003e, 0x04020005, + 0x59325817, 0x812e59c0, 0x02020800, 0x001007f4, + 0x5c025800, 0x1c01f000, 0x4937c857, 0x4d300000, + 0x0201f800, 0x0002075a, 0x04000011, 0x49366009, + 0x4a026406, 0x00000001, 0x492e6008, 0x42000800, + 0x00000009, 0x0201f800, 0x00104571, 0x4d380000, + 0x42027000, 0x00000033, 0x0201f800, 0x000207a1, + 0x5c027000, 0x82000540, 0x00000001, 0x5c026000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x4c580000, + 0x4d3c0000, 0x59325808, 0x83380580, 0x00000015, + 0x04020022, 0x59a8b016, 0x82580c80, 0x00000019, + 0x04001003, 0x4200b000, 0x00000018, 0x8058b104, + 0x0401fa07, 0x80000580, 0x0401fa17, 0x832cac00, + 0x00000009, 0x83cca400, 0x00000006, 0x0201f800, + 0x0010ab17, 0x42027800, 0x00000001, 0x592c100a, + 0x8c081518, 0x04020006, 0x59a80010, 0x592c100d, + 0x80080580, 0x04020006, 0x417a7800, 0x59301009, + 0x58081403, 0x0201f800, 0x001020a1, 0x0201f800, + 0x00107b38, 0x0401f008, 0x4200b000, 0x00000002, + 0x0401fa09, 0x0201f800, 0x0010801c, 0x0201f800, + 0x0002077d, 0x5c027800, 0x5c00b000, 0x5c025800, + 0x1c01f000, 0x4933c856, 0x49366009, 0x4a026406, + 0x00000001, 0x492e6008, 0x4d380000, 0x42027000, + 0x0000004d, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x1c01f000, 0x4803c856, + 0x4d2c0000, 0x83380580, 0x00000015, 0x04020027, + 0x59a80816, 0x59325808, 0x5930040b, 0x800000c4, + 0x80040580, 0x04020021, 0x4c500000, 0x4c540000, + 0x4c580000, 0x83cca400, 0x00000006, 0x4050a800, + 0x5930b40b, 0x0201f800, 0x0010ab28, 0x83cca400, + 0x00000006, 0x592cb205, 0x832cac00, 0x00000006, + 0x0201f800, 0x0010ab17, 0x592e5801, 0x812e59c0, + 0x040207f9, 0x5931d821, 0x58ef400b, 0x58ee580d, + 0x4a025a04, 0x00000103, 0x58ec0009, 0x0801f800, + 0x59300402, 0x5c00b000, 0x5c00a800, 0x5c00a000, + 0x5c025800, 0x1c01f000, 0x0201f800, 0x0010801c, + 0x5c025800, 0x1c01f000, 0x4933c857, 0x83380580, + 0x00000035, 0x04000005, 0x59301419, 0x0401f851, + 0x04000027, 0x0401f006, 0x4d300000, 0x5932601e, + 0x0401f856, 0x5c026000, 0x04000020, 0x591c0c06, + 0x82040580, 0x00000003, 0x04000004, 0x82040580, + 0x00000006, 0x0402001c, 0x591c0c02, 0x59300419, + 0x80040580, 0x04000009, 0x59300219, 0x80040580, + 0x04020015, 0x591c0a02, 0x59300419, 0x80040580, + 0x04020011, 0x0401f009, 0x59300a19, 0x82040580, + 0x0000ffff, 0x04000005, 0x591c0202, 0x59300a19, + 0x80040580, 0x04020008, 0x591c0009, 0x59300809, + 0x80040580, 0x1c01f000, 0x417a3800, 0x82000540, + 0x00000001, 0x1c01f000, 0x4803c856, 0x59b800e4, + 0x8c000538, 0x02020800, 0x001005d8, 0x42000800, + 0x0000012c, 0x4a0370e4, 0x20000000, 0x59b800e4, + 0x80040840, 0x02000800, 0x001005d8, 0x8c00053c, + 0x040207f9, 0x4a0370e4, 0x30000000, 0x40000000, + 0x40000000, 0x40000000, 0x59b800e4, 0x8c00053c, + 0x040207f1, 0x1c01f000, 0x4803c856, 0x4a0370e4, + 0x20000000, 0x40000000, 0x59b800e4, 0x8c000538, + 0x040207fb, 0x1c01f000, 0x59300807, 0x8c040d1e, + 0x592c0c08, 0x04020002, 0x8c040d18, 0x1c01f000, + 0x0401fc1c, 0x04000008, 0x42000800, 0x00000024, + 0x0201f800, 0x00106681, 0x82063c00, 0x0010d1c0, + 0x491fc857, 0x1c01f000, 0x83300480, 0x0010d1c0, + 0x0400100a, 0x59a8000b, 0x81300480, 0x04021007, + 0x59301402, 0x0401ffef, 0x04000007, 0x411c0000, + 0x81300580, 0x04000003, 0x81780500, 0x0401f002, + 0x81300540, 0x1c01f000, 0x4947c857, 0x4d300000, + 0x0201f800, 0x00020245, 0x0402000a, 0x42026000, + 0x0010bde9, 0x49366009, 0x492e6008, 0x0201f800, + 0x0010203c, 0x80000580, 0x5c026000, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fc, 0x4933c857, + 0x0201f800, 0x00109037, 0x02000800, 0x001005d8, + 0x4d2c0000, 0x4d340000, 0x4d440000, 0x4c580000, + 0x59325808, 0x59326809, 0x49425a06, 0x0201f800, + 0x00105755, 0x592e8c06, 0x592c4207, 0x82200500, + 0x0000000f, 0x0c01f806, 0x5c00b000, 0x5c028800, + 0x5c026800, 0x5c025800, 0x1c01f000, 0x00109466, + 0x00109488, 0x0010948f, 0x00109493, 0x0010949c, + 0x00109463, 0x00109463, 0x00109463, 0x001094a0, + 0x001094ac, 0x001094ac, 0x00109463, 0x00109463, + 0x00109463, 0x00109463, 0x00109463, 0x4803c857, + 0x0201f800, 0x001005d8, 0x814281c0, 0x04020012, + 0x41785800, 0x592c0404, 0x8c00051c, 0x04020002, + 0x59345c05, 0x442c2800, 0x59340008, 0x48002802, + 0x59340009, 0x48002801, 0x59340006, 0x48002804, + 0x59340007, 0x48002803, 0x4200b000, 0x0000000b, + 0x0401f037, 0x592c0207, 0x8c00051e, 0x4200b000, + 0x00000002, 0x04020032, 0x8204b540, 0x00000000, + 0x0400002f, 0x44042800, 0x59326809, 0x59340400, + 0x48002801, 0x4200b000, 0x00000002, 0x0401f028, + 0x814281c0, 0x04020030, 0x59345c05, 0x442c2800, + 0x4200b000, 0x00000001, 0x0401f021, 0x8340b540, + 0x00000000, 0x0400001e, 0x0401f027, 0x814281c0, + 0x04020025, 0x59340200, 0x44002800, 0x59340001, + 0x48002801, 0x4200b000, 0x00000002, 0x0401f014, + 0x8340b540, 0x00000000, 0x0402001b, 0x0401f010, + 0x8340b540, 0x00000000, 0x0400000d, 0x0201f800, + 0x00104a1f, 0x04000014, 0x8c20450e, 0x04000002, + 0x497a6009, 0x4178b000, 0x497a5a06, 0x0401f004, + 0x8340b540, 0x00000000, 0x0402000b, 0x592c0404, + 0x8400051c, 0x48025c04, 0x592c0207, 0x8400051e, + 0x48025a07, 0x0401f8aa, 0x497a6008, 0x0201f000, + 0x000202da, 0x592c0207, 0x8c00051e, 0x4200b000, + 0x00000002, 0x040207f2, 0x8204b540, 0x00000000, + 0x040007ef, 0x44042800, 0x4200b000, 0x00000001, + 0x0401f7eb, 0x4937c857, 0x4d300000, 0x0201f800, + 0x0002075a, 0x04000011, 0x49366009, 0x4a026406, + 0x00000001, 0x492e6008, 0x42000800, 0x0000000b, + 0x0201f800, 0x00104571, 0x4d380000, 0x42027000, + 0x00000043, 0x0201f800, 0x000207a1, 0x5c027000, + 0x82000540, 0x00000001, 0x5c026000, 0x1c01f000, + 0x4937c857, 0x4d2c0000, 0x59325808, 0x83380580, + 0x00000015, 0x04020025, 0x59a80016, 0x82000580, + 0x00000004, 0x04020021, 0x59a80010, 0x592c1009, + 0x80080580, 0x04020010, 0x4d440000, 0x592e8c06, + 0x592c0207, 0x4803c856, 0x82000500, 0x00000080, + 0x84000548, 0x4d3c0000, 0x42027800, 0x00001000, + 0x0201f800, 0x001049bb, 0x5c027800, 0x5c028800, + 0x0401f004, 0x4803c856, 0x0201f800, 0x00104a1f, + 0x0201f800, 0x00109037, 0x04000017, 0x4d400000, + 0x42028000, 0x00000000, 0x41780800, 0x0401ff38, + 0x5c028000, 0x0401f00e, 0x0201f800, 0x00104a1f, + 0x040207f4, 0x0201f800, 0x00109037, 0x0400000a, + 0x4c580000, 0x4200b000, 0x00000002, 0x0401f86e, + 0x5c00b000, 0x0201f800, 0x0010801c, 0x0201f800, + 0x0002077d, 0x5c025800, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x0002075a, 0x04000012, + 0x49366009, 0x4a026406, 0x00000001, 0x4d3c0000, + 0x4d380000, 0x417a7800, 0x0201f800, 0x00104567, + 0x492e6008, 0x42027000, 0x00000004, 0x0201f800, + 0x000207a1, 0x5c027000, 0x5c027800, 0x82000540, + 0x00000001, 0x5c026000, 0x1c01f000, 0x4937c857, + 0x4d300000, 0x0201f800, 0x00107942, 0x0400000d, + 0x49366009, 0x4a026406, 0x00000001, 0x492e6008, + 0x4d380000, 0x42027000, 0x00000051, 0x0201f800, + 0x000207a1, 0x5c027000, 0x82000540, 0x00000001, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x4c580000, + 0x59325808, 0x83383580, 0x00000015, 0x04020011, + 0x592c0008, 0x82000500, 0x00ffffff, 0x0402000a, + 0x0201f800, 0x00105755, 0x59cc0000, 0x82000500, + 0x00ffffff, 0x44002800, 0x4200b000, 0x00000001, + 0x0401f80b, 0x0201f800, 0x00107b38, 0x0401f006, + 0x4200b000, 0x00000002, 0x0401f823, 0x0201f800, + 0x0010801c, 0x5c00b000, 0x1c01f000, 0x492fc857, + 0x4c580000, 0x4c000000, 0x8058b1c0, 0x0400000b, + 0x82580500, 0xfffffff0, 0x02020800, 0x001005d8, + 0x8058b0d0, 0x592c0408, 0x82000500, 0xfffff0ff, + 0x80580540, 0x48025c08, 0x5c000000, 0x5c00b000, + 0x1c01f000, 0x492fc857, 0x4c000000, 0x4c040000, + 0x800000d8, 0x592c0c08, 0x82040d00, 0xffff0fff, + 0x80040540, 0x48025c08, 0x5c000800, 0x5c000000, + 0x1c01f000, 0x4933c857, 0x4d2c0000, 0x59325808, + 0x592c0207, 0x8400055e, 0x48025a07, 0x4c500000, + 0x4c540000, 0x4c580000, 0x0401ffd9, 0x0201f800, + 0x00105755, 0x46002800, 0x00000018, 0x80142800, + 0x8058b040, 0x83cca400, 0x00000007, 0x4014a800, + 0x0201f800, 0x0010ab17, 0x5c00b000, 0x5c00a800, + 0x5c00a000, 0x5c025800, 0x1c01f000, 0x59325808, + 0x592c0204, 0x82000580, 0x00000152, 0x1c01f000, + 0x5930001f, 0x80000540, 0x02020800, 0x00100d56, + 0x1c01f000, 0x4d2c0000, 0x59325808, 0x59300203, + 0x4933c857, 0x492fc857, 0x493bc857, 0x4803c857, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x001095bd, + 0x001095c8, 0x00109603, 0x001095bd, 0x001095bd, + 0x001095bd, 0x001095bd, 0x001095bd, 0x001095bf, + 0x001095bd, 0x001095bd, 0x001095bd, 0x001095bd, + 0x001095bd, 0x0201f800, 0x001005d8, 0x83383480, + 0x00000056, 0x02021800, 0x001005d8, 0x493a6403, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x83380580, 0x00000013, 0x0402000f, 0x592c000c, + 0x800001c0, 0x04000006, 0x4a026203, 0x00000002, + 0x59a80037, 0x48026206, 0x1c01f000, 0x4a025a06, + 0x00000000, 0x0201f800, 0x000202da, 0x0201f000, + 0x0002077d, 0x83380580, 0x00000027, 0x0400001a, + 0x83380580, 0x00000014, 0x04000012, 0x83380580, + 0x00000015, 0x04000005, 0x83380580, 0x00000016, + 0x02020800, 0x001005d8, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x02020800, 0x001005d8, 0x0401f014, + 0x0201f800, 0x00106bbf, 0x4a02580e, 0x00000011, + 0x0401f005, 0x0201f800, 0x00106bbf, 0x4a02580e, + 0x00000010, 0x4a025a06, 0x00000031, 0x4a02580d, + 0x00000004, 0x0201f800, 0x000202da, 0x0201f800, + 0x00104c19, 0x0201f000, 0x00107911, 0x59341400, + 0x82081d00, 0x000000ff, 0x59300c03, 0x480bc857, + 0x4807c857, 0x82040580, 0x00000053, 0x0400002e, + 0x82040580, 0x00000002, 0x04000016, 0x82040580, + 0x00000001, 0x04000017, 0x82040580, 0x00000003, + 0x0400001c, 0x82040580, 0x00000005, 0x0400001d, + 0x82040580, 0x00000033, 0x0400001a, 0x82040580, + 0x00000000, 0x0400001b, 0x82040580, 0x00000004, + 0x02020800, 0x001005d8, 0x0401f8a1, 0x0401f016, + 0x820c0580, 0x00000003, 0x0400084c, 0x0401f012, + 0x820c0580, 0x0000000b, 0x0402000f, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0401f00a, + 0x820c0580, 0x00000005, 0x04000864, 0x0401f006, + 0x820c0580, 0x00000009, 0x04000889, 0x0401f002, + 0x0401f893, 0x4a026403, 0x00000052, 0x59a81016, + 0x592c040b, 0x8c000500, 0x04000003, 0x42001000, + 0x00000008, 0x592c040b, 0x8c000516, 0x04000003, + 0x82081400, 0x00000018, 0x592c000c, 0x497a580d, + 0x497a580e, 0x80080c80, 0x04000009, 0x04001005, + 0x4a025a06, 0x00000007, 0x40001000, 0x0401f006, + 0x4a025a06, 0x00000015, 0x0401f003, 0x4a025a06, + 0x00000000, 0x480a580c, 0x82081400, 0x00000003, + 0x80081104, 0x0201f800, 0x00107ab5, 0x04000010, + 0x592c1001, 0x480a600b, 0x58080800, 0x82080400, + 0x00000002, 0x592c1011, 0x592c1812, 0x42003000, + 0x00000000, 0x42002000, 0x00101200, 0x0201f800, + 0x00107c32, 0x04000002, 0x1c01f000, 0x4a025a06, + 0x0000002c, 0x497a580c, 0x0201f800, 0x000202da, + 0x0201f000, 0x0002077d, 0x83380580, 0x00000015, + 0x0402000a, 0x59a80005, 0x8c000514, 0x0402000b, + 0x0201f800, 0x0010462a, 0x42000800, 0x00000004, + 0x0201f000, 0x00104571, 0x42000800, 0x00000007, + 0x0201f000, 0x00104571, 0x0201f800, 0x0010513b, + 0x42001000, 0x00000010, 0x04020009, 0x59340002, + 0x82000500, 0x00ff0000, 0x82000580, 0x00ff0000, + 0x040007ec, 0x42001000, 0x00000008, 0x0201f800, + 0x00104c6d, 0x040007e7, 0x592c040b, 0x84000540, + 0x48025c0b, 0x0401f7e9, 0x83380580, 0x00000015, + 0x0402000f, 0x59a80005, 0x8c000514, 0x04020010, + 0x0201f800, 0x0010468d, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x00104567, 0x5c027800, 0x42000800, + 0x00000006, 0x0201f000, 0x00104571, 0x42000800, + 0x00000004, 0x0201f000, 0x00104571, 0x0201f800, + 0x0010513b, 0x42001000, 0x00000010, 0x04020009, + 0x59340002, 0x82000500, 0x00ff0000, 0x82000580, + 0x00ff0000, 0x040007e7, 0x42001000, 0x00000008, + 0x0201f800, 0x00104c6d, 0x040007e2, 0x592c040b, + 0x84000540, 0x48025c0b, 0x0401f7e9, 0x42000800, + 0x00000004, 0x0201f000, 0x00104571, 0x83380580, + 0x00000015, 0x04020005, 0x0201f800, 0x0010a2c8, + 0x02000800, 0x001048c1, 0x1c01f000, 0x83380580, + 0x00000015, 0x0402001d, 0x4c580000, 0x83cc1400, + 0x00000008, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000006, 0x0201f800, 0x0010855a, 0x04020012, + 0x83cc1400, 0x0000000a, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000008, 0x0201f800, 0x0010855a, + 0x04020009, 0x59342200, 0x59cc1007, 0x800811c0, + 0x04000003, 0x480a6801, 0x84102542, 0x8410251a, + 0x48126a00, 0x5c00b000, 0x1c01f000, 0x42000000, + 0x0010b87b, 0x0201f800, 0x0010aa47, 0x0201f800, + 0x00106c55, 0x59300203, 0x4933c857, 0x4803c857, + 0x82000c80, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x0201f000, 0x00106c4b, 0x0010970b, + 0x0010971a, 0x0010970c, 0x00109709, 0x00109709, + 0x00109709, 0x00109709, 0x00109709, 0x00109709, + 0x00109709, 0x00109709, 0x00109709, 0x00109709, + 0x00109709, 0x0201f800, 0x001005d8, 0x1c01f000, + 0x59300403, 0x82000580, 0x00000052, 0x02000000, + 0x00108d85, 0x0201f800, 0x00104c19, 0x59325808, + 0x4a025a06, 0x00000006, 0x0201f800, 0x000202da, + 0x0201f000, 0x00107911, 0x59301804, 0x840c0520, + 0x48026004, 0x598c000d, 0x81300580, 0x04020010, + 0x8c0c1d20, 0x04020010, 0x42001000, 0x0010b7f6, + 0x50081000, 0x58080002, 0x82000580, 0x00000100, + 0x0400000e, 0x5808000c, 0x81300580, 0x02020800, + 0x001005d8, 0x4978100c, 0x0401f003, 0x8c0c1d20, + 0x040207dc, 0x0201f800, 0x001068d3, 0x040007d9, + 0x0201f800, 0x001005d8, 0x0201f800, 0x00106e8e, + 0x040007f9, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f7bd, 0x4933c857, + 0x4c500000, 0x4c540000, 0x4c580000, 0x592c0c07, + 0x4806580a, 0x59cc0809, 0x48065807, 0x59cc0a08, + 0x4806580b, 0x59c80817, 0x82040500, 0x000003ff, + 0x800010c4, 0x8c040d14, 0x04000005, 0x59cc0002, + 0x82000500, 0x00000003, 0x80081480, 0x82080480, + 0x000000f1, 0x02021800, 0x001005d8, 0x480a621a, + 0x412c0800, 0x0201f800, 0x001007d3, 0x02000800, + 0x001005d8, 0x492c0809, 0x58040408, 0x84000552, + 0x84000540, 0x48000c08, 0x82081400, 0x00000003, + 0x80081104, 0x83cca400, 0x00000006, 0x832cac00, + 0x00000004, 0x42000800, 0x00000010, 0x82080480, + 0x00000010, 0x04021003, 0x40080800, 0x80000580, + 0x4004b000, 0x4c000000, 0x0201f800, 0x0010ab28, + 0x5c000000, 0x800001c0, 0x0400000d, 0x412c1000, + 0x4c000000, 0x0201f800, 0x001007d3, 0x02000800, + 0x001005d8, 0x492c1001, 0x832cac00, 0x00000004, + 0x5c000000, 0x40001000, 0x0401f7e9, 0x5c00b000, + 0x5c00a800, 0x5c00a000, 0x1c01f000, 0x4933c857, + 0x4d2c0000, 0x4c380000, 0x59325808, 0x5930021a, + 0x48025a08, 0x59301011, 0x800811c0, 0x04020008, + 0x4a025a06, 0x00000000, 0x592c000b, 0x82000500, + 0x00000c00, 0x0400000b, 0x0401f00b, 0x8c08153e, + 0x04000006, 0x4a025a06, 0x00000007, 0x80081080, + 0x80081000, 0x0401f003, 0x4a025a06, 0x00000015, + 0x480a5807, 0x42000000, 0x0010bed9, 0x50007000, + 0x5838000b, 0x80000540, 0x04020008, 0x4930700c, + 0x4930700b, 0x58380002, 0x82000580, 0x00000000, + 0x04020809, 0x0401f005, 0x82001400, 0x00000000, + 0x45301000, 0x4930700b, 0x5c007000, 0x5c025800, + 0x1c01f000, 0x4933c857, 0x592c0009, 0x40001000, + 0x4800700a, 0x82080400, 0x00000004, 0x48007003, + 0x592c000d, 0x592c100e, 0x48007007, 0x48087008, + 0x592c000a, 0x592c1208, 0x80080c80, 0x04001002, + 0x40001000, 0x82081400, 0x00000003, 0x80081104, + 0x82080480, 0x00000010, 0x04021003, 0x80000580, + 0x0401f003, 0x42001000, 0x00000010, 0x4800700d, + 0x48087004, 0x800810c4, 0x48087005, 0x40381000, + 0x0201f800, 0x00100858, 0x1c01f000, 0x4d2c0000, + 0x0201f800, 0x001007d3, 0x02000800, 0x001005d8, + 0x42000800, 0x0010bed9, 0x452c0800, 0x497a580b, + 0x497a580c, 0x497a580d, 0x4a025809, 0x001097ea, + 0x4a025802, 0x00000100, 0x4a025801, 0x00000000, + 0x5c025800, 0x1c01f000, 0x4833c857, 0x4d300000, + 0x4d2c0000, 0x4c5c0000, 0x4030b800, 0x585c000a, + 0x80025d40, 0x04020004, 0x585c000c, 0x4c000000, + 0x0401f044, 0x585c0002, 0x82000580, 0x00000100, + 0x04020022, 0x592c0801, 0x4c040000, 0x0201f800, + 0x001007f4, 0x5c000800, 0x800409c0, 0x0400001c, + 0x4804b80a, 0x585c100d, 0x800811c0, 0x04020005, + 0x40065800, 0x0201f800, 0x001007fd, 0x0401f014, + 0x82080480, 0x00000010, 0x04021003, 0x80000580, + 0x0401f003, 0x42001000, 0x00000010, 0x4800b80d, + 0x4808b804, 0x800810c4, 0x4808b805, 0x82040400, + 0x00000004, 0x4800b803, 0x405c1000, 0x0201f800, + 0x00100858, 0x0401f025, 0x0401f828, 0x585c000c, + 0x80026540, 0x59300000, 0x80000d40, 0x04020002, + 0x4800b80b, 0x4800b80c, 0x497a6000, 0x4c000000, + 0x4978b80a, 0x59325808, 0x4a025a04, 0x00000103, + 0x59300402, 0x48025c06, 0x592c100b, 0x4c080000, + 0x0201f800, 0x000202c1, 0x0201f800, 0x0010912a, + 0x5c001000, 0x8c081518, 0x04000004, 0x0201f800, + 0x001091d1, 0x0401f003, 0x0201f800, 0x0002077d, + 0x405c7000, 0x5c000000, 0x80026540, 0x04000003, + 0x59325808, 0x0401ff78, 0x5c00b800, 0x5c025800, + 0x5c026000, 0x1c01f000, 0x483bc857, 0x5838000a, + 0x40025800, 0x0201f800, 0x001007fd, 0x5838000c, + 0x80026540, 0x59300008, 0x80025d40, 0x4a025a06, + 0x00000002, 0x1c01f000, 0x4803c857, 0x4d1c0000, + 0x497a601c, 0x41323800, 0x40026000, 0x4d3c0000, + 0x42027800, 0x00000005, 0x0401f83c, 0x5c027800, + 0x411e6000, 0x59300414, 0x84000502, 0x48026414, + 0x5c023800, 0x1c01f000, 0x481bc857, 0x4933c857, + 0x4c5c0000, 0x4c600000, 0x4010b800, 0x4014c000, + 0x0201f800, 0x0010a942, 0x0201f800, 0x00103b25, + 0x04000008, 0x40602800, 0x405c3000, 0x0201f800, + 0x0010a446, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c00c000, 0x5c00b800, 0x1c01f000, + 0x4803c856, 0x4d300000, 0x42026000, 0x0010d1c0, + 0x59a8000e, 0x81640580, 0x04000016, 0x59300c06, + 0x82040580, 0x00000001, 0x04000009, 0x82040580, + 0x00000004, 0x04000006, 0x82040580, 0x00000010, + 0x02000800, 0x00108cf9, 0x0401f005, 0x4807c857, + 0x0201f800, 0x001092d7, 0x04020808, 0x83326400, + 0x00000024, 0x41580000, 0x81300480, 0x040017e9, + 0x5c026000, 0x1c01f000, 0x4933c857, 0x59300403, + 0x4803c857, 0x0201f800, 0x00106c55, 0x4df00000, + 0x59300406, 0x4803c857, 0x82000d80, 0x00000002, + 0x04000018, 0x82000d80, 0x00000001, 0x04000009, + 0x82000d80, 0x00000004, 0x04000006, 0x4933c856, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x0401f03c, + 0x59300203, 0x82000d80, 0x00000001, 0x04000018, + 0x82000d80, 0x00000002, 0x04000026, 0x82000d80, + 0x00000005, 0x04000023, 0x0201f800, 0x001005d8, + 0x59300203, 0x82000d80, 0x00000009, 0x0400000c, + 0x82000d80, 0x0000000b, 0x04000009, 0x82000d80, + 0x0000000a, 0x04000017, 0x82000d80, 0x0000000c, + 0x04000014, 0x0201f800, 0x001005d8, 0x598c000d, + 0x81300580, 0x04020004, 0x0201f800, 0x00106e8e, + 0x0402000c, 0x59300004, 0x4803c857, 0x8c000520, + 0x04000004, 0x84000520, 0x48026004, 0x0401f005, + 0x0201f800, 0x001068d3, 0x02020800, 0x001005d8, + 0x5c03e000, 0x02000800, 0x00106c4b, 0x59300406, + 0x82000d80, 0x00000002, 0x04000009, 0x0201f800, + 0x00104c19, 0x0201f800, 0x0010914e, 0x02000800, + 0x0010801c, 0x8d3e7d00, 0x04000003, 0x0201f000, + 0x00107911, 0x4a02621d, 0x00000001, 0x4a026403, + 0x00000085, 0x4a026203, 0x00000009, 0x4a026406, + 0x00000002, 0x42000800, 0x8000004b, 0x0201f000, + 0x00020721, 0x4933c857, 0x59368c03, 0x4c180000, + 0x59300203, 0x82003480, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f803, 0x5c003000, 0x1c01f000, + 0x0010990a, 0x00109dcf, 0x00109edb, 0x0010990a, + 0x0010990a, 0x0010990a, 0x0010990a, 0x0010990a, + 0x0010992d, 0x0010990a, 0x0010990a, 0x0010990a, + 0x0010990a, 0x0010990a, 0x0201f800, 0x001005d8, + 0x4933c857, 0x42028800, 0x0000ffff, 0x813669c0, + 0x04000002, 0x59368c03, 0x4c180000, 0x59300203, + 0x82003480, 0x0000000e, 0x02021800, 0x001005d8, + 0x0c01f803, 0x5c003000, 0x1c01f000, 0x00109929, + 0x0010a180, 0x00109929, 0x00109929, 0x00109929, + 0x00109929, 0x00109929, 0x0010a952, 0x0010a0ed, + 0x0010a52c, 0x0010a562, 0x0010a52c, 0x0010a562, + 0x00109929, 0x0201f800, 0x001005d8, 0x0201f800, + 0x001005d8, 0x83383480, 0x00000051, 0x02021800, + 0x001005d8, 0x41380000, 0x493bc857, 0x4d1c0000, + 0x4d400000, 0x0c01f804, 0x5c028000, 0x5c023800, + 0x1c01f000, 0x0010998a, 0x00109b69, 0x0010998a, + 0x0010998a, 0x0010998a, 0x00109b74, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x001099ac, 0x001099f5, 0x00109a0c, 0x00109a62, + 0x00109ac6, 0x00109b04, 0x00109b34, 0x0010998a, + 0x0010998a, 0x00109b7c, 0x0010998a, 0x0010998a, + 0x00109b8a, 0x00109b93, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x00109c15, + 0x0010998a, 0x0010998a, 0x00109a9a, 0x0010998a, + 0x0010998a, 0x00109bec, 0x0010998a, 0x0010998a, + 0x0010998a, 0x00109c23, 0x0010998a, 0x0010998a, + 0x0010998a, 0x00109c6c, 0x0010998a, 0x0010998a, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010998a, + 0x00109cb9, 0x0010998a, 0x00109ce5, 0x00109cf0, + 0x0010998a, 0x0010998a, 0x0010998c, 0x00109cfb, + 0x0010998a, 0x0010998a, 0x0010998a, 0x0010999b, + 0x0010998a, 0x0010998a, 0x0010998a, 0x00109d02, + 0x00109d0a, 0x00109d28, 0x0201f800, 0x001005d8, + 0x4933c857, 0x0201f800, 0x0010a592, 0x040203a4, + 0x0201f800, 0x0010210a, 0x040203a1, 0x59cc0407, + 0x4802601c, 0x4a026403, 0x00000045, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x4933c857, + 0x0201f800, 0x0010a592, 0x04020395, 0x0201f800, + 0x0010210a, 0x04020392, 0x0401fbce, 0x040201a0, + 0x59cc0007, 0x4802601c, 0x4a026403, 0x0000004a, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x4933c857, 0x0201f800, 0x0010210a, 0x04020009, + 0x0201f800, 0x001048ec, 0x04020006, 0x82000500, + 0x00000009, 0x82000580, 0x00000008, 0x04020008, + 0x4a026403, 0x00000009, 0x4a02641a, 0x00000009, + 0x4a02621a, 0x00000000, 0x0401f1b2, 0x0201f800, + 0x001048c1, 0x0201f800, 0x00104a09, 0x04000021, + 0x0201f800, 0x001049ed, 0x0400001e, 0x0201f800, + 0x0010a252, 0x04020025, 0x42028000, 0x00000029, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x0201f800, 0x0010462a, 0x836c0580, + 0x00000002, 0x04020004, 0x59a8001b, 0x80000000, + 0x4803501b, 0x4a026403, 0x00000008, 0x42003000, + 0x00000003, 0x0201f800, 0x00103b25, 0x04000191, + 0x4a026203, 0x00000007, 0x41782800, 0x0401f180, + 0x0201f800, 0x0010a3da, 0x040207e1, 0x4a026403, + 0x00000009, 0x4a02641a, 0x0000000e, 0x4a02621a, + 0x00001900, 0x0401f183, 0x4a026403, 0x00000009, + 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000f00, + 0x0401f17c, 0x4933c857, 0x0201f800, 0x0010210a, + 0x0402033b, 0x0201f800, 0x001048ec, 0x04020338, + 0x493a6403, 0x0201f800, 0x0010a22d, 0x04020006, + 0x42003000, 0x00000005, 0x4a026403, 0x00000006, + 0x0401f7d9, 0x4a026403, 0x00000007, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00000000, 0x0401f165, + 0x4933c857, 0x0201f800, 0x001048ec, 0x04020324, + 0x0201f800, 0x0010a592, 0x02000800, 0x0010210a, + 0x0402031f, 0x0201f800, 0x00104a09, 0x04020005, + 0x42027800, 0x00000001, 0x0201f800, 0x00104567, + 0x0201f800, 0x001049fc, 0x0402002b, 0x59cc0206, + 0x82003500, 0x00000003, 0x0402002e, 0x82003480, + 0x00000014, 0x0400102b, 0x5934300a, 0x84183516, + 0x82000580, 0x00000014, 0x04020002, 0x84183556, + 0x481a680a, 0x59cc0406, 0x82000500, 0x00000003, + 0x04020020, 0x0201f800, 0x0010a29f, 0x04020028, + 0x0201f800, 0x001049e7, 0x0402000c, 0x417a7800, + 0x0201f800, 0x001020a1, 0x42003000, 0x00000006, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b865, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x0010468d, + 0x4a026403, 0x0000000a, 0x42003000, 0x00000020, + 0x0401f795, 0x4a026403, 0x0000000b, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f121, + 0x42000000, 0x0010b860, 0x0201f800, 0x0010aa47, + 0x4a026403, 0x0000000b, 0x4a02641a, 0x00000007, + 0x4a02621a, 0x00000000, 0x0401f116, 0x4a026403, + 0x0000000b, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00000000, 0x0401f10f, 0x4933c857, 0x0201f800, + 0x001048ec, 0x040202ce, 0x0201f800, 0x0010a592, + 0x040202cb, 0x0201f800, 0x0010210a, 0x040202c8, + 0x59cc0206, 0x82003500, 0x00000003, 0x0402001d, + 0x82003480, 0x00000014, 0x0400101a, 0x59cc0406, + 0x82000500, 0x00000003, 0x04020016, 0x59340400, + 0x82000580, 0x00000707, 0x04000019, 0x417a7800, + 0x0201f800, 0x001020a1, 0x42003000, 0x0000000a, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b862, + 0x0201f800, 0x0010aa47, 0x4a026403, 0x0000000c, + 0x41782800, 0x42003000, 0x00000021, 0x0401f752, + 0x4a026403, 0x0000000d, 0x4a02641a, 0x00000007, + 0x4a02621a, 0x00000000, 0x0401f0de, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00001e00, 0x0401f0d7, 0x4933c857, 0x0201f800, + 0x001048ec, 0x04020296, 0x0201f800, 0x0010a592, + 0x04020293, 0x0201f800, 0x0010210a, 0x04020290, + 0x0401facc, 0x0402001a, 0x493a6403, 0x4c5c0000, + 0x0401fad2, 0x0402000e, 0x4a026403, 0x0000002e, + 0x405c2800, 0x42003000, 0x00000024, 0x0201f800, + 0x00103b25, 0x0400000c, 0x4a026203, 0x00000007, + 0x405c2800, 0x5c00b800, 0x0401f0ad, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000007, 0x4a02621a, + 0x00000000, 0x5c00b800, 0x0401f0b2, 0x4a026403, + 0x0000000d, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00001e00, 0x0401f0ab, 0x4933c857, 0x0201f800, + 0x001048ec, 0x040206ef, 0x59a80026, 0x82000500, + 0x00000009, 0x82000580, 0x00000008, 0x040006e9, + 0x0201f800, 0x001049fc, 0x0402002d, 0x0201f800, + 0x0010a2a7, 0x04020007, 0x4a026403, 0x0000000e, + 0x41782800, 0x42003000, 0x00000052, 0x0401f702, + 0x4933c857, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x4d3c0000, 0x417a7800, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x59340200, 0x84000558, + 0x48026a00, 0x42000800, 0x0000000b, 0x0201f800, + 0x00104571, 0x0201f800, 0x00103b25, 0x04000076, + 0x42003000, 0x00000007, 0x0401f062, 0x4933c857, + 0x4a026403, 0x0000000f, 0x4a02641a, 0x00000003, + 0x4a02621a, 0x00001e00, 0x0401f072, 0x59340400, + 0x82000580, 0x00000703, 0x040007f5, 0x0401f040, + 0x4933c857, 0x0201f800, 0x001048ec, 0x0402022c, + 0x59a80026, 0x82000500, 0x00000009, 0x82000580, + 0x00000008, 0x04000226, 0x0201f800, 0x001049f3, + 0x0402002f, 0x0201f800, 0x0010a2c8, 0x02000800, + 0x0010a252, 0x04020007, 0x4a026403, 0x00000010, + 0x41782800, 0x42003000, 0x00000050, 0x0401f6c2, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c027800, 0x42003000, 0x00000003, 0x0201f800, + 0x0010a942, 0x42000000, 0x0010b864, 0x0201f800, + 0x0010aa47, 0x59340200, 0x84000558, 0x48026a00, + 0x0401f7c5, 0x4a026403, 0x00000011, 0x4a02641a, + 0x00000003, 0x4a02621a, 0x00001e00, 0x0401f03d, + 0x4933c857, 0x0201f800, 0x0010210a, 0x02000800, + 0x0010a592, 0x040201fa, 0x0401fa36, 0x04020008, + 0x4a026403, 0x00000012, 0x0401f032, 0x59340400, + 0x82000580, 0x00000703, 0x040007eb, 0x4d3c0000, + 0x417a7800, 0x42028000, 0x00000029, 0x0201f800, + 0x0010203c, 0x5c027800, 0x42003000, 0x00000017, + 0x0201f800, 0x0010a942, 0x42000000, 0x0010b864, + 0x0201f800, 0x0010aa47, 0x0201f800, 0x00103b25, + 0x04000015, 0x42003000, 0x00000006, 0x41782800, + 0x42028000, 0x00000029, 0x4933c857, 0x4a026403, + 0x00000001, 0x4a026203, 0x00000007, 0x0201f800, + 0x0010a974, 0x0201f000, 0x0010a43e, 0x42028000, + 0x00000046, 0x0201f800, 0x0010a974, 0x0201f000, + 0x0010a43e, 0x4933c857, 0x4a026403, 0x00000001, + 0x42000800, 0x0000000b, 0x0201f800, 0x00104571, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x4933c857, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x4a026403, 0x00000005, 0x0401f7f5, + 0x0201f800, 0x0010a592, 0x040201b5, 0x0201f800, + 0x0010210a, 0x040201b2, 0x0401f9ee, 0x040207c0, + 0x4a026403, 0x00000020, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x0201f800, 0x0010210a, + 0x040201a7, 0x4a026403, 0x00000023, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010a592, 0x02000800, 0x0010210a, 0x0402019c, + 0x0401f9d8, 0x040207aa, 0x40300800, 0x59a81010, + 0x59cc0007, 0x82000500, 0x00ffffff, 0x80080580, + 0x04000019, 0x59cc1408, 0x0201f800, 0x0010902c, + 0x0400002d, 0x59cc0c08, 0x4d300000, 0x0201f800, + 0x00105dd7, 0x41323800, 0x5c026000, 0x04000026, + 0x591c0202, 0x82000580, 0x0000ffff, 0x04000005, + 0x59cc1208, 0x591c0202, 0x80080580, 0x0402001e, + 0x591c0406, 0x82000580, 0x00000007, 0x0402001a, + 0x0401f02c, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x0400000c, 0x0201f800, 0x00109410, 0x04000012, + 0x59cc1408, 0x591c0202, 0x80080580, 0x0402000e, + 0x591c0009, 0x81340580, 0x04000016, 0x0401f00a, + 0x59cc1408, 0x417a7800, 0x0201f800, 0x0010a405, + 0x04020010, 0x59cc1208, 0x82080580, 0x0000ffff, + 0x04000019, 0x4a026403, 0x00000026, 0x4a02621a, + 0x00001700, 0x59cc1204, 0x82081580, 0x0000ffff, + 0x04020798, 0x4a026403, 0x00000025, 0x0401f795, + 0x591c0406, 0x82000580, 0x00000007, 0x040207f2, + 0x591c0403, 0x82000580, 0x00000024, 0x04020006, + 0x4d300000, 0x411e6000, 0x0201f800, 0x0002077d, + 0x5c026000, 0x4a026403, 0x00000025, 0x0401f785, + 0x4933c857, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00104567, 0x5c027800, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x5c00b000, 0x04000004, 0x4a026403, 0x00000031, + 0x0401f770, 0x0201f800, 0x00107911, 0x0201f800, + 0x0010513b, 0x0402000f, 0x0201f800, 0x00105149, + 0x04020008, 0x4a035033, 0x00000001, 0x4202d800, + 0x00000001, 0x0201f800, 0x001050a2, 0x0401f005, + 0x42000000, 0x00000001, 0x0201f800, 0x00105113, + 0x1c01f000, 0x0201f800, 0x0010210a, 0x0402011c, + 0x0401f958, 0x0402072a, 0x493a6403, 0x0401f996, + 0x04020004, 0x4a026403, 0x0000002b, 0x0401f751, + 0x4a026403, 0x0000002c, 0x0401f74e, 0x4933c857, + 0x0201f800, 0x0010210a, 0x0402010d, 0x0201f800, + 0x001049e7, 0x04020740, 0x0201f800, 0x001048d9, + 0x0400003c, 0x59cc0408, 0x48026419, 0x59cc0208, + 0x48026219, 0x59cc0807, 0x59340002, 0x82000500, + 0x00ffffff, 0x80040580, 0x04000012, 0x59a80010, + 0x80040580, 0x04020021, 0x59cc1408, 0x0201f800, + 0x00109410, 0x04000023, 0x0201f800, 0x0010a4ca, + 0x04000020, 0x0201f800, 0x0010a921, 0x0400001d, + 0x491e601e, 0x4a026403, 0x00000036, 0x0401f0e6, + 0x59cc1208, 0x82080580, 0x0000ffff, 0x04000009, + 0x0201f800, 0x00109410, 0x04000012, 0x591c0202, + 0x59cc0c08, 0x80040580, 0x0402000e, 0x0401f7eb, + 0x59cc1408, 0x41327800, 0x0201f800, 0x0010a405, + 0x04000008, 0x0401f7e5, 0x4803c856, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001500, 0x0401f006, + 0x4803c856, 0x4a02641a, 0x00000003, 0x4a02621a, + 0x00001700, 0x4a026403, 0x00000037, 0x0401f0c6, + 0x4803c856, 0x4a026403, 0x00000012, 0x0401f0c2, + 0x4933c857, 0x0201f800, 0x0010210a, 0x040200c4, + 0x0201f800, 0x001049e7, 0x040206f7, 0x0201f800, + 0x001048d9, 0x0400003e, 0x59cc0407, 0x48026419, + 0x59cc1207, 0x480a6219, 0x82080580, 0x0000ffff, + 0x04000005, 0x0201f800, 0x00109410, 0x0400002c, + 0x0401f006, 0x59cc1407, 0x41327800, 0x0201f800, + 0x0010a405, 0x04000026, 0x59cc0c07, 0x591c0202, + 0x80040580, 0x04020022, 0x4d300000, 0x411e6000, + 0x0201f800, 0x00108bd7, 0x5c026000, 0x59cc0c09, + 0x82040d00, 0x0000ff00, 0x840409c0, 0x0201f800, + 0x0010a921, 0x04000016, 0x82040580, 0x00000001, + 0x0400000a, 0x82040580, 0x00000005, 0x04000004, + 0x82040580, 0x00000007, 0x04020007, 0x591c0008, + 0x80000540, 0x04000004, 0x59cc2808, 0x0201f000, + 0x0010a4de, 0x4803c856, 0x4a02641a, 0x00000009, + 0x4a02621a, 0x00002a00, 0x0401f006, 0x4803c856, + 0x4a02641a, 0x00000003, 0x4a02621a, 0x00000300, + 0x4a026403, 0x0000003b, 0x0401f07b, 0x4803c856, + 0x4a02641a, 0x0000000b, 0x4a02621a, 0x00000000, + 0x0401f7f8, 0x4c080000, 0x0201f800, 0x001048ec, + 0x04000026, 0x0201f800, 0x001048c1, 0x0201f800, + 0x0010a601, 0x0402001e, 0x59a80026, 0x82000540, + 0x00000003, 0x48035026, 0x59a8001d, 0x800000d0, + 0x59a80810, 0x82040d00, 0x000000ff, 0x80041540, + 0x480b5010, 0x42000800, 0x00000003, 0x0201f800, + 0x00106c78, 0x497b5028, 0x0201f800, 0x00103b25, + 0x04000003, 0x4a032804, 0x000007d0, 0x8c00050a, + 0x0402000a, 0x0201f800, 0x0002077d, 0x0201f800, + 0x00101e45, 0x5c001000, 0x1c01f000, 0x0201f800, + 0x0010a623, 0x0401f7fc, 0x5c001000, 0x0201f000, + 0x0002077d, 0x0201f800, 0x0010210a, 0x0402004c, + 0x0201f800, 0x0010a628, 0x4a026403, 0x00000047, + 0x4a026203, 0x00000001, 0x0201f000, 0x0010672b, + 0x0201f800, 0x0010210a, 0x04020041, 0x0201f800, + 0x0010a628, 0x4a026403, 0x00000047, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x0010210a, 0x04020036, 0x0201f800, 0x0010a628, + 0x0201f000, 0x0002077d, 0x0401f834, 0x04000030, + 0x4a026403, 0x0000004e, 0x4a026203, 0x00000001, + 0x0201f000, 0x0010672b, 0x4a026403, 0x0000004f, + 0x497a601c, 0x59cc0a06, 0x82040d00, 0x000000ff, + 0x800409c0, 0x0400065f, 0x82040580, 0x00000001, + 0x04020005, 0x59cc0808, 0x59a80005, 0x80040580, + 0x04000658, 0x82040580, 0x00000002, 0x0402000a, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x0400064c, 0x4a02601c, 0x00000001, 0x0401f649, + 0x4a026403, 0x00000050, 0x59cc0207, 0x4802601c, + 0x0401f644, 0x4a026203, 0x00000001, 0x42000800, + 0x80000040, 0x0201f000, 0x00020721, 0x4803c857, + 0x0201f000, 0x0002077d, 0x4d2c0000, 0x4c500000, + 0x4c580000, 0x4c540000, 0x59a80016, 0x82000c80, + 0x00000829, 0x04021029, 0x0201f800, 0x001007d3, + 0x04000026, 0x492e6008, 0x59a80016, 0x80000104, + 0x48025802, 0x83cca400, 0x00000006, 0x82000c80, + 0x0000000b, 0x04001013, 0x4a025811, 0x0000000b, + 0x4200b000, 0x0000000b, 0x832c0400, 0x00000005, + 0x4000a800, 0x0201f800, 0x0010ab17, 0x412c7000, + 0x0201f800, 0x001007d3, 0x04000010, 0x492c7001, + 0x40040000, 0x800409c0, 0x04000009, 0x0401f7ec, + 0x48025811, 0x4000b000, 0x832c0400, 0x00000005, + 0x4000a800, 0x0201f800, 0x0010ab17, 0x82000540, + 0x00000001, 0x0401f006, 0x497b5016, 0x59325808, + 0x0201f800, 0x001007fd, 0x80000580, 0x5c00a800, + 0x5c00b000, 0x5c00a000, 0x5c025800, 0x1c01f000, + 0x4d340000, 0x59326809, 0x59343400, 0x4933c857, + 0x4937c857, 0x481bc857, 0x0201f800, 0x001049f3, + 0x5c026800, 0x1c01f000, 0x4933c857, 0x4c5c0000, + 0x4d3c0000, 0x0401f840, 0x0402002c, 0x59cc0207, + 0x82000d00, 0x0000ff00, 0x900411c0, 0x59cc000a, + 0x82000500, 0x00ffffff, 0x80081540, 0x480a601c, + 0x8c040d18, 0x0400000e, 0x42003000, 0x00000008, + 0x0201f800, 0x0010a932, 0x42000000, 0x0010b863, + 0x0201f800, 0x0010aa47, 0x4200b800, 0x00000002, + 0x42027800, 0x00000001, 0x0401f011, 0x4178b800, + 0x8c040d1a, 0x04000011, 0x59cc000a, 0x0201f800, + 0x00105c9a, 0x0402000d, 0x42003000, 0x00000009, + 0x0201f800, 0x0010a93a, 0x42000000, 0x0010b863, + 0x0201f800, 0x0010aa47, 0x417a7800, 0x0201f800, + 0x001020a1, 0x0401f004, 0x82000540, 0x00000001, + 0x0401f002, 0x80000580, 0x5c027800, 0x5c00b800, + 0x1c01f000, 0x4933c857, 0x59cc0206, 0x82000480, + 0x00000010, 0x04021006, 0x4a02621a, 0x00000000, + 0x82000540, 0x00000001, 0x0401f002, 0x80000580, + 0x1c01f000, 0x4933c857, 0x4a02621a, 0x00000000, + 0x59cc0407, 0x82000500, 0x0000ff00, 0x82000580, + 0x00000800, 0x04020009, 0x59cc0006, 0x82000500, + 0x00ff0000, 0x82000d80, 0x00140000, 0x04000003, + 0x82000d80, 0x00100000, 0x1c01f000, 0x4933c857, + 0x59300403, 0x82003480, 0x00000051, 0x02021800, + 0x001005d8, 0x83383580, 0x00000013, 0x04020003, + 0x4803c857, 0x0c01f012, 0x83383580, 0x00000027, + 0x04000005, 0x83383580, 0x00000014, 0x02020800, + 0x001005d8, 0x0201f800, 0x001048c1, 0x42000800, + 0x00000007, 0x0201f800, 0x00104571, 0x0201f800, + 0x00106bbf, 0x0201f000, 0x00107911, 0x00109e3c, + 0x00109e45, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e45, 0x00109e50, 0x00109ecd, 0x00109e95, + 0x00109ecd, 0x00109ead, 0x00109ecd, 0x00109ebe, + 0x00109ecd, 0x00109ec6, 0x00109ecd, 0x00109ec6, + 0x00109ecd, 0x00109ecd, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e45, 0x00109e3c, 0x00109ecd, + 0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109e3c, + 0x00109eca, 0x00109ecd, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109ecd, 0x00109ecd, + 0x00109e3c, 0x00109ec3, 0x00109ecd, 0x00109e3c, + 0x00109e4a, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109ec9, 0x00109ecd, 0x00109e3c, + 0x00109e3c, 0x00109ecd, 0x00109ecd, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3c, 0x00109e3c, 0x00109e3c, + 0x00109e3e, 0x00109e3c, 0x00109e3e, 0x00109e3c, + 0x00109e3c, 0x00109e3e, 0x00109e3c, 0x00109e3c, + 0x00109e3c, 0x00109e3e, 0x00109e3e, 0x00109e3e, + 0x0201f800, 0x001005d8, 0x4d2c0000, 0x59325808, + 0x0201f800, 0x001007fd, 0x5c025800, 0x0201f000, + 0x0002077d, 0x59a80037, 0x48026206, 0x4a026203, + 0x00000002, 0x1c01f000, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x00104567, 0x5c027800, 0x0401f07e, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x59a80026, 0x8c000508, 0x04000012, 0x59326809, + 0x4c580000, 0x4200b000, 0x00000002, 0x83a81c00, + 0x00000002, 0x83341400, 0x00000006, 0x0201f800, + 0x0010855a, 0x80000540, 0x5c00b000, 0x0402006a, + 0x59340200, 0x8400051a, 0x48026a00, 0x0401f01b, + 0x599c0017, 0x8c00050a, 0x04020063, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00104567, 0x5c027800, + 0x42000800, 0x00000007, 0x0201f800, 0x00104571, + 0x59340212, 0x82000500, 0x0000ff00, 0x04000056, + 0x599c0019, 0x8c00050e, 0x04020053, 0x416c0000, + 0x82000580, 0x00000002, 0x04020004, 0x59a8001b, + 0x80000000, 0x4803501b, 0x42000800, 0x00000003, + 0x0201f800, 0x00104571, 0x4a026406, 0x00000001, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000002, + 0x0201f800, 0x0010672b, 0x4ce80000, 0x4201d000, + 0x00000001, 0x0201f800, 0x00105fae, 0x5c01d000, + 0x1c01f000, 0x0201f800, 0x001049f3, 0x04000036, + 0x0201f800, 0x0010645e, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0201f800, 0x0010a96a, + 0x0402002d, 0x42000800, 0x00000005, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000003, 0x0201f000, + 0x0010672b, 0x42000800, 0x00000006, 0x0401f820, + 0x59303009, 0x599c0017, 0x8c00050a, 0x0402001a, + 0x59a80026, 0x8c000508, 0x04000017, 0x0201f800, + 0x001049e7, 0x04000014, 0x59a8001b, 0x80000000, + 0x4803501b, 0x0401f7c5, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0401f792, 0x42000800, + 0x00000004, 0x0401f006, 0x0201f800, 0x001048c1, + 0x0401f005, 0x0401f004, 0x0401f003, 0x0201f800, + 0x00104571, 0x0201f000, 0x0002077d, 0x4933c857, + 0x4807c857, 0x0201f800, 0x00104571, 0x4d3c0000, + 0x417a7800, 0x0201f800, 0x00104567, 0x5c027800, + 0x0201f800, 0x00102074, 0x1c01f000, 0x4933c857, + 0x59340400, 0x80000110, 0x82003480, 0x0000000c, + 0x02021800, 0x001005d8, 0x83383580, 0x00000015, + 0x04020002, 0x0c01f006, 0x83383580, 0x00000016, + 0x02020800, 0x001005d8, 0x0c01f00d, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x00109f30, 0x00109f03, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x001080b8, + 0x001080b8, 0x00109f30, 0x00109f37, 0x001080b8, + 0x001080b8, 0x001080b8, 0x001080b8, 0x4933c857, + 0x599c0017, 0x8c00050a, 0x0402001b, 0x813669c0, + 0x04000019, 0x59340212, 0x82000500, 0x0000ff00, + 0x04000015, 0x599c0019, 0x8c00050e, 0x04020012, + 0x4d3c0000, 0x417a7800, 0x0201f800, 0x00104567, + 0x5c027800, 0x42000800, 0x00000003, 0x0201f800, + 0x00104571, 0x4a026406, 0x00000001, 0x4a026203, + 0x00000001, 0x4a026403, 0x00000002, 0x0201f000, + 0x0010672b, 0x59cc0001, 0x0201f800, 0x00105c9a, + 0x0402000b, 0x0201f800, 0x00020245, 0x02020000, + 0x0002077d, 0x59345002, 0x0201f800, 0x001042b4, + 0x482a6802, 0x0201f000, 0x0002077d, 0x1c01f000, + 0x4933c857, 0x59303403, 0x82183580, 0x0000001e, + 0x02000000, 0x0002077d, 0x1c01f000, 0x4933c857, + 0x0201f800, 0x001083df, 0x02020000, 0x0002077d, + 0x4a026203, 0x00000001, 0x4a026403, 0x00000001, + 0x0201f000, 0x0010672b, 0x493bc857, 0x83380580, + 0x00000051, 0x0402000b, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300203, 0x82000580, + 0x00000002, 0x0400006d, 0x0201f800, 0x001005d8, + 0x83380580, 0x00000027, 0x04000014, 0x83380580, + 0x00000048, 0x04000006, 0x83380580, 0x00000014, + 0x0400000e, 0x02020800, 0x001005d8, 0x0201f800, + 0x00106f60, 0x02020000, 0x00107974, 0x59300203, + 0x82000580, 0x00000004, 0x02000000, 0x0002086e, + 0x0201f800, 0x001005d8, 0x59300403, 0x82000c80, + 0x00000044, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x40027000, + 0x4803c857, 0x0c01f001, 0x00109f76, 0x00109f78, + 0x00109f78, 0x00109f93, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x59325808, 0x812e59c0, + 0x04000016, 0x832c0500, 0x00ff0000, 0x04000013, + 0x4a026203, 0x00000002, 0x59326809, 0x59340200, + 0x8c00050e, 0x0402000d, 0x42028000, 0x00000004, + 0x0201f800, 0x0010a3ef, 0x497a6008, 0x59300206, + 0x80000540, 0x04020003, 0x59a80038, 0x48026206, + 0x4a026203, 0x00000007, 0x1c01f000, 0x0201f800, + 0x00106bbf, 0x0201f800, 0x00109037, 0x02000000, + 0x00107911, 0x59325808, 0x0201f800, 0x001007f4, + 0x0201f000, 0x00107911, 0x0201f800, 0x001005d8, + 0x59325808, 0x592c040a, 0x8c000502, 0x04000007, + 0x4a026203, 0x00000007, 0x42027000, 0x00000043, + 0x0201f000, 0x000207a1, 0x4a026203, 0x00000004, + 0x1c01f000, 0x0201f800, 0x0010a597, 0x02000000, + 0x0002086c, 0x1c01f000, 0x4a026203, 0x00000001, + 0x4a026403, 0x00000041, 0x42027800, 0x80002042, + 0x0201f000, 0x00020721, 0x83380580, 0x00000051, + 0x04000006, 0x83380580, 0x00000041, 0x02020800, + 0x001005d8, 0x1c01f000, 0x0201f800, 0x000206fd, + 0x0201f800, 0x0010a5df, 0x0201f000, 0x0002077d, + 0x83380480, 0x00000050, 0x02021800, 0x001005d8, + 0x83380480, 0x00000049, 0x02001800, 0x001005d8, + 0x0c01f001, 0x00109fda, 0x00109ffb, 0x00109fd8, + 0x00109fd8, 0x00109fd8, 0x00109fd8, 0x00109ffb, + 0x0201f800, 0x001005d8, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400000d, 0x82000d00, 0x000000c0, + 0x82040d80, 0x00000080, 0x0400000d, 0x59300804, + 0x8c040d18, 0x0402000a, 0x42027000, 0x00000041, + 0x0201f000, 0x0002088d, 0x4a026203, 0x00000007, + 0x497a6206, 0x0201f000, 0x000206fd, 0x59325808, + 0x592c0c0a, 0x8c040d1a, 0x04020005, 0x0201f800, + 0x000206fd, 0x0201f000, 0x0002077d, 0x0201f800, + 0x0010a597, 0x040007fa, 0x1c01f000, 0x0201f800, + 0x00106b8a, 0x59325808, 0x59326809, 0x59340200, + 0x8c00050e, 0x0400000e, 0x592c040a, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x04000005, + 0x592c000f, 0x59301815, 0x800c1c80, 0x480e6015, + 0x4a026203, 0x00000002, 0x0401f00d, 0x42028000, + 0x00000004, 0x0401fbde, 0x59300206, 0x80000540, + 0x04020004, 0x59a80038, 0x800000c2, 0x48026206, + 0x497a6008, 0x4a026203, 0x00000007, 0x1c01f000, + 0x4a026203, 0x00000007, 0x497a6206, 0x0201f000, + 0x000206fd, 0x4a026203, 0x00000007, 0x497a6206, + 0x0201f000, 0x000206f8, 0x59300414, 0x8c00051c, + 0x02020000, 0x0002087e, 0x59325808, 0x592c200f, + 0x40080000, 0x80102480, 0x59300015, 0x80102400, + 0x48126015, 0x0201f000, 0x0002087e, 0x8c040d0e, + 0x0402000a, 0x4a026203, 0x00000006, 0x0401f823, + 0x5930001f, 0x80000540, 0x02020800, 0x00100d7c, + 0x0201f000, 0x000206f8, 0x4a026203, 0x00000002, + 0x1c01f000, 0x42000800, 0x00000001, 0x0201f800, + 0x00100d7c, 0x82040580, 0x00000001, 0x02000000, + 0x00020885, 0x0401f7d8, 0x59300414, 0x8c00051c, + 0x04000006, 0x0201f800, 0x00100b63, 0x02000000, + 0x00020877, 0x1c01f000, 0x59300011, 0x80000540, + 0x04020005, 0x0201f800, 0x00100b63, 0x02000000, + 0x00020877, 0x1c01f000, 0x492fc857, 0x480bc857, + 0x8c08153e, 0x04000006, 0x80081080, 0x80081000, + 0x42000800, 0x00000009, 0x0401f003, 0x42000800, + 0x00000015, 0x480a580b, 0x1c01f000, 0x83380580, + 0x00000013, 0x04000005, 0x83380580, 0x00000014, + 0x02020800, 0x001005d8, 0x59300414, 0x8c000516, + 0x02000800, 0x001005d8, 0x1c01f000, 0x0201f800, + 0x001005d8, 0x59300008, 0x80000540, 0x02020800, + 0x001005d8, 0x1c01f000, 0x59300414, 0x8c000516, + 0x02000800, 0x001005d8, 0x1c01f000, 0x4a026203, + 0x00000004, 0x493a6403, 0x42000800, 0x80002001, + 0x0201f000, 0x00020721, 0x4a026203, 0x00000003, + 0x493a6403, 0x0201f800, 0x000200c9, 0x59325808, + 0x592c040a, 0x8c00051e, 0x04000012, 0x82000500, + 0x000000c0, 0x82000580, 0x00000080, 0x04000011, + 0x59300414, 0x8c000512, 0x0402000a, 0x8c000510, + 0x04020008, 0x592c040c, 0x80000540, 0x04020005, + 0x82080d40, 0x80003065, 0x0201f000, 0x00106721, + 0x82080d40, 0x80002065, 0x0201f000, 0x00106721, + 0x82080d40, 0x80002042, 0x0201f000, 0x00106721, + 0x4933c857, 0x493bc857, 0x83380480, 0x00000044, + 0x02021800, 0x001005d8, 0x83380480, 0x00000041, + 0x02001800, 0x001005d8, 0x0c01f001, 0x0010a0b6, + 0x0010a0c6, 0x0010a0db, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400001d, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x04000018, 0x4a026203, + 0x00000001, 0x493a6403, 0x42000800, 0x80002042, + 0x0201f000, 0x00020721, 0x59325808, 0x592c040a, + 0x8c00051e, 0x0400000d, 0x82001d00, 0x000000c0, + 0x820c1d80, 0x000000c0, 0x04000008, 0x4a026203, + 0x00000001, 0x493a6403, 0x42000800, 0x80002001, + 0x0201f000, 0x00020721, 0x497a6008, 0x497a6206, + 0x42028000, 0x00000004, 0x0401f315, 0x59325808, + 0x592c040a, 0x8c00051e, 0x040007f8, 0x82001d00, + 0x000000c0, 0x820c1d80, 0x000000c0, 0x040007f3, + 0x4a026203, 0x00000003, 0x493a6403, 0x0201f800, + 0x000200c9, 0x82080d40, 0x80002065, 0x0201f000, + 0x00106721, 0x4933c857, 0x493bc857, 0x83380580, + 0x00000085, 0x04000006, 0x83380580, 0x00000088, + 0x0400000a, 0x0201f800, 0x001005d8, 0x4a026203, + 0x00000009, 0x493a6403, 0x42000800, 0x8000004b, + 0x0201f000, 0x00020721, 0x4d1c0000, 0x813669c0, + 0x04000004, 0x0201f800, 0x0010a592, 0x04020044, + 0x59cc1404, 0x0401f846, 0x04000018, 0x591c0406, + 0x82000500, 0x0000001f, 0x82002580, 0x00000006, + 0x04000007, 0x82002580, 0x00000004, 0x0400002e, + 0x82002580, 0x00000011, 0x0402000c, 0x497a3a05, + 0x42002000, 0x00000054, 0x0201f800, 0x00107a4a, + 0x4a026203, 0x00000007, 0x493a6403, 0x0201f800, + 0x0010a974, 0x0401f02c, 0x0201f800, 0x00103b25, + 0x04000004, 0x42023800, 0xffffffff, 0x0401f7f1, + 0x813669c0, 0x04020009, 0x59cc0001, 0x0201f800, + 0x00105c9a, 0x0402001e, 0x0201f800, 0x001045a6, + 0x0402001b, 0x49366009, 0x4a026403, 0x00000087, + 0x59cc1204, 0x82081580, 0x0000ffff, 0x04020003, + 0x4a026403, 0x00000086, 0x4a026203, 0x00000001, + 0x42000800, 0x80000040, 0x0201f800, 0x00020721, + 0x0401f00d, 0x591c0203, 0x82000580, 0x00000007, + 0x040207de, 0x4d300000, 0x411e6000, 0x0201f800, + 0x00107911, 0x5c026000, 0x0401f7d8, 0x0201f800, + 0x00107911, 0x5c023800, 0x1c01f000, 0x4933c857, + 0x480bc857, 0x42002800, 0x0010d1c0, 0x41300000, + 0x80140580, 0x04000017, 0x58140203, 0x82000580, + 0x00000000, 0x04000013, 0x58140202, 0x80080580, + 0x04020010, 0x58141c06, 0x820c0580, 0x00000005, + 0x0400000c, 0x820c0580, 0x00000009, 0x0400001d, + 0x59302009, 0x58140009, 0x800001c0, 0x0400000b, + 0x801021c0, 0x04000003, 0x80100580, 0x04000010, + 0x82142c00, 0x00000024, 0x41540000, 0x80140480, + 0x0402100e, 0x0401f7e2, 0x5814001e, 0x801021c0, + 0x04000005, 0x58102002, 0x82102500, 0x00ffffff, + 0x0401f7f2, 0x5810201e, 0x0401f7f0, 0x40163800, + 0x81300540, 0x0401f002, 0x80000580, 0x1c01f000, + 0x58141807, 0x8c0c1d10, 0x040207ea, 0x0401f7e1, + 0x4933c857, 0x493bc857, 0x83380580, 0x00000013, + 0x0402000e, 0x59300403, 0x82000c80, 0x00000085, + 0x02001800, 0x001005d8, 0x82000c80, 0x00000093, + 0x02021800, 0x001005d8, 0x82000480, 0x00000085, + 0x4803c857, 0x0c01f018, 0x83380580, 0x00000027, + 0x04000005, 0x83380580, 0x00000014, 0x02020000, + 0x00107974, 0x0201f800, 0x00106bbf, 0x59325808, + 0x812e59c0, 0x02000000, 0x00107911, 0x4a025a06, + 0x00000031, 0x4a025811, 0x00000004, 0x4a025812, + 0x000000ff, 0x0201f800, 0x000202da, 0x0201f000, + 0x00107911, 0x0010a1b7, 0x0010a1be, 0x0010a1be, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, 0x0010a1b7, + 0x0010a1b7, 0x0010a1b7, 0x0010a1b9, 0x0201f800, + 0x001005d8, 0x59325808, 0x4a025a06, 0x00000000, + 0x0201f800, 0x000202da, 0x0201f000, 0x00107911, + 0x4933c857, 0x42000000, 0x0010b873, 0x0201f800, + 0x0010aa47, 0x0201f800, 0x0010a5df, 0x497a6205, + 0x42028000, 0x0000000b, 0x0401f807, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x497a6206, + 0x1c01f000, 0x4933c857, 0x4943c857, 0x59300406, + 0x82000580, 0x00000007, 0x04020002, 0x1c01f000, + 0x0201f800, 0x00106c55, 0x4df00000, 0x0201f800, + 0x00108ce5, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f001, 0x0010a205, 0x0010a209, + 0x0010a1f0, 0x0010a217, 0x0010a22a, 0x0010a1f0, + 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, + 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, 0x0010a1f0, + 0x4d400000, 0x5930001f, 0x80000540, 0x04000005, + 0x41400800, 0x0201f800, 0x00100d7c, 0x40068000, + 0x4d2c0000, 0x59325808, 0x0201f800, 0x00109037, + 0x040209f3, 0x4c5c0000, 0x5930b809, 0x0201f800, + 0x00107911, 0x485e6009, 0x5c00b800, 0x5c025800, + 0x5c028000, 0x5c03e000, 0x02000000, 0x00106c4b, + 0x1c01f000, 0x598c000d, 0x81300580, 0x04020004, + 0x0201f800, 0x00106e8e, 0x04020016, 0x0201f800, + 0x001068d3, 0x040007df, 0x0201f800, 0x00106b6c, + 0x04000010, 0x0201f800, 0x001005d8, 0x0201f800, + 0x00108cd6, 0x04020004, 0x0201f800, 0x00106e62, + 0x04020008, 0x0201f800, 0x001067ae, 0x040007d1, + 0x0201f800, 0x00106b6c, 0x02020800, 0x001005d8, + 0x59300203, 0x82000c80, 0x0000000e, 0x02021800, + 0x001005d8, 0x0c01f7b9, 0x0201f800, 0x00100e99, + 0x0401f7c4, 0x4933c857, 0x4d440000, 0x4d340000, + 0x59cc0007, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x0402001a, 0x59300009, 0x4c000000, + 0x49366009, 0x42003000, 0x0000000b, 0x0201f800, + 0x0010a942, 0x42000000, 0x0010b861, 0x0201f800, + 0x0010aa47, 0x4d3c0000, 0x4d400000, 0x42028000, + 0x00000029, 0x417a7800, 0x0201f800, 0x0010203c, + 0x5c028000, 0x5c027800, 0x5c000000, 0x48026009, + 0x59cc0007, 0x48026802, 0x80000580, 0x5c026800, + 0x5c028800, 0x1c01f000, 0x4933c857, 0x4c040000, + 0x59a80016, 0x82000580, 0x00000074, 0x04020040, + 0x59cc0a08, 0x82040480, 0x00000100, 0x04001033, + 0x59cc0c08, 0x82040500, 0x00008000, 0x04000035, + 0x59a80032, 0x80000540, 0x04020009, 0x59301009, + 0x58080212, 0x82000500, 0x0000ff00, 0x04000004, + 0x82040500, 0x00000800, 0x0400002a, 0x59cc0c09, + 0x80040840, 0x04001024, 0x59a80826, 0x8c040d06, + 0x04000004, 0x59cc0c0f, 0x8c040d1e, 0x04020012, + 0x59cc0a17, 0x800409c0, 0x04020012, 0x59cc0a18, + 0x82040480, 0x00000100, 0x04001014, 0x59cc0c18, + 0x800409c0, 0x0402000e, 0x59cc0c19, 0x80040840, + 0x04001011, 0x59cc0c1a, 0x80040840, 0x04001011, + 0x0401f018, 0x4a02621a, 0x00000100, 0x0401f012, + 0x4a02621a, 0x00000300, 0x0401f00f, 0x4a02621a, + 0x00000500, 0x0401f00c, 0x4a02621a, 0x00000700, + 0x0401f009, 0x4a02621a, 0x00000900, 0x0401f006, + 0x4a02621a, 0x00000f00, 0x0401f003, 0x4a02621a, + 0x00002d00, 0x82000540, 0x00000001, 0x0401f002, + 0x80000580, 0x5c000800, 0x1c01f000, 0x59cc0407, + 0x4803c857, 0x82000580, 0x00000800, 0x04000003, + 0x4a02621a, 0x00000000, 0x1c01f000, 0x4933c857, + 0x4c040000, 0x4c080000, 0x4c0c0000, 0x4c580000, + 0x59cc000c, 0x0201f800, 0x00105c9a, 0x02000800, + 0x00020245, 0x04020012, 0x83cc1400, 0x00000008, + 0x4200b000, 0x00000002, 0x83341c00, 0x00000006, + 0x0201f800, 0x0010855a, 0x04020009, 0x83cc1400, + 0x0000000a, 0x4200b000, 0x00000002, 0x83341c00, + 0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x5c000800, 0x1c01f000, + 0x4933c857, 0x4c000000, 0x4c040000, 0x4c080000, + 0x4c0c0000, 0x4c580000, 0x59cc0001, 0x0201f800, + 0x00105c9a, 0x02000800, 0x00020245, 0x04020014, + 0x83cc1400, 0x0000000b, 0x4200b000, 0x00000002, + 0x83341c00, 0x00000006, 0x0201f800, 0x0010855a, + 0x0402000c, 0x83cc1400, 0x0000000d, 0x4200b000, + 0x00000002, 0x83341c00, 0x00000008, 0x0201f800, + 0x0010855a, 0x04000014, 0x4933c856, 0x4933c856, + 0x4933c857, 0x59340009, 0x4803c857, 0x5934000e, + 0x4803c857, 0x59340008, 0x4803c857, 0x5934000d, + 0x4803c857, 0x59340007, 0x4803c857, 0x5934000c, + 0x4803c857, 0x59340006, 0x4803c857, 0x5934000b, + 0x4803c857, 0x5c00b000, 0x5c001800, 0x5c001000, + 0x5c000800, 0x5c000000, 0x1c01f000, 0x4933c857, + 0x4947c857, 0x4943c857, 0x4c600000, 0x0201f800, + 0x00106c55, 0x4df00000, 0x4d2c0000, 0x4d300000, + 0x4d340000, 0x4130c000, 0x42026000, 0x0010d1c0, + 0x59a8000e, 0x8060c1c0, 0x04000005, 0x82601580, + 0x0010bde9, 0x04000002, 0x80000040, 0x81640480, + 0x040210be, 0x40600000, 0x81300580, 0x040000b6, + 0x0401f97a, 0x040200b4, 0x59326809, 0x59300406, + 0x82000c80, 0x00000012, 0x02021800, 0x001005d8, + 0x0c01f001, 0x0010a3cd, 0x0010a338, 0x0010a351, + 0x0010a35c, 0x0010a335, 0x0010a34c, 0x0010a387, + 0x0010a3cd, 0x0010a333, 0x0010a39a, 0x0010a3ae, + 0x0010a333, 0x0010a333, 0x0010a333, 0x0010a333, + 0x0010a3cd, 0x0010a3c4, 0x0010a3bc, 0x0201f800, + 0x001005d8, 0x59300420, 0x8c000500, 0x04020096, + 0x59300403, 0x82000580, 0x00000043, 0x04000092, + 0x0201f800, 0x00109134, 0x04000007, 0x0201f800, + 0x0010914e, 0x0402008a, 0x0201f800, 0x0010801c, + 0x0401f087, 0x0201f800, 0x00102074, 0x0201f800, + 0x0010914e, 0x02000800, 0x0010801c, 0x0401f080, + 0x8d3e7d18, 0x04000004, 0x59300420, 0x8c000500, + 0x0402007d, 0x59325808, 0x0201f800, 0x00109037, + 0x04000077, 0x49425a06, 0x497a5c09, 0x0201f800, + 0x000202da, 0x0201f800, 0x0010912a, 0x0401f070, + 0x8d3e7d00, 0x04000007, 0x59300017, 0x81480580, + 0x0402006d, 0x59300018, 0x814c0580, 0x0402006a, + 0x59300203, 0x82000580, 0x00000004, 0x02000800, + 0x00100e99, 0x59325808, 0x0201f800, 0x00109037, + 0x0400005f, 0x4a025a04, 0x00000103, 0x59300004, + 0x8400055c, 0x48026004, 0x592c0408, 0x8c000512, + 0x04000007, 0x4d2c0000, 0x592c0009, 0x40025800, + 0x0201f800, 0x001007fd, 0x5c025800, 0x49425a06, + 0x497a5c09, 0x0401fb16, 0x0201f800, 0x0010959c, + 0x0201f800, 0x001091c6, 0x0201f800, 0x000202da, + 0x0201f800, 0x0010912a, 0x0401f045, 0x8d3e7d18, + 0x04000045, 0x59300203, 0x82000580, 0x00000004, + 0x02000800, 0x00100e99, 0x59325808, 0x0201f800, + 0x00109037, 0x0400003a, 0x49425a06, 0x497a5c09, + 0x0401faff, 0x0201f800, 0x0010959c, 0x0201f800, + 0x000202da, 0x0401f032, 0x0201f800, 0x001062d5, + 0x04000031, 0x59300203, 0x82000580, 0x00000004, + 0x0400002d, 0x59300203, 0x82000580, 0x00000003, + 0x04020029, 0x0201f800, 0x00106b8a, 0x59325808, + 0x0201f800, 0x00109037, 0x04000021, 0x0201f800, + 0x000202da, 0x0401f01e, 0x59300203, 0x82000580, + 0x00000004, 0x02000800, 0x00100e99, 0x59325808, + 0x0201f800, 0x00109037, 0x04000015, 0x49425a06, + 0x497a5c09, 0x0201f800, 0x000202da, 0x0401f010, + 0x833c0500, 0x00001800, 0x0400000f, 0x8d3e7d16, + 0x0402000d, 0x59325817, 0x0201f800, 0x001007fd, + 0x59325808, 0x0201f800, 0x00109037, 0x04000004, + 0x49425a06, 0x0201f800, 0x000202da, 0x0201f800, + 0x00107911, 0x83326400, 0x00000024, 0x41580000, + 0x81300480, 0x0400173b, 0x5c026800, 0x5c026000, + 0x5c025800, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x5c00c000, 0x1c01f000, 0x5c000000, 0x4c000000, + 0x4803c857, 0x4d3c0000, 0x42027800, 0x00000001, + 0x0201f800, 0x00104567, 0x5c027800, 0x4c580000, + 0x4200b000, 0x00000002, 0x83a81c00, 0x00000002, + 0x83cc1400, 0x0000000b, 0x0201f800, 0x0010855a, + 0x5c00b000, 0x80000540, 0x1c01f000, 0x492fc857, + 0x4943c857, 0x59a8000c, 0x812c0480, 0x04001011, + 0x59a8000d, 0x812c0480, 0x0402100e, 0x592c0000, + 0x80005d40, 0x04000008, 0x497a5800, 0x49425a06, + 0x4c2c0000, 0x0201f800, 0x000202da, 0x5c025800, + 0x0401f7f7, 0x49425a06, 0x0201f000, 0x000202da, + 0x1c01f000, 0x493fc857, 0x4933c857, 0x480bc857, + 0x0201f800, 0x00103b25, 0x0400002e, 0x41502800, + 0x813e79c0, 0x04020006, 0x59a80066, 0x80000000, + 0x59a8086a, 0x80040580, 0x04000026, 0x41300000, + 0x80140580, 0x0400001a, 0x58140203, 0x82000580, + 0x00000000, 0x04000016, 0x58140202, 0x80080580, + 0x04020013, 0x58141c06, 0x820c0580, 0x00000005, + 0x0400000f, 0x820c0580, 0x00000009, 0x04000017, + 0x59300009, 0x58142009, 0x801021c0, 0x04020006, + 0x5814201e, 0x59301809, 0x580c0002, 0x82000500, + 0x00ffffff, 0x80100580, 0x04000007, 0x82142c00, + 0x00000024, 0x41540000, 0x80140480, 0x04021005, + 0x0401f7df, 0x40163800, 0x81300540, 0x0401f002, + 0x80000580, 0x1c01f000, 0x58141807, 0x8c0c1d10, + 0x040207f3, 0x0401f7e7, 0x42002000, 0x0000ffff, + 0x59301009, 0x800811c0, 0x04000002, 0x58082403, + 0x41301000, 0x0401f007, 0x41781000, 0x41442000, + 0x0401f004, 0x41781000, 0x42002000, 0x0000ffff, + 0x5c000000, 0x4c000000, 0x4803c857, 0x480bc857, + 0x4813c857, 0x492fc857, 0x4943c857, 0x4d2c0000, + 0x0201f800, 0x001007e4, 0x02000800, 0x001005d8, + 0x4a025a04, 0x0000010d, 0x800811c0, 0x04000017, + 0x83400580, 0x00000029, 0x04020010, 0x82180580, + 0x00000002, 0x0400000a, 0x82180580, 0x00000003, + 0x04000007, 0x82180580, 0x00000008, 0x04000004, + 0x82180580, 0x00000009, 0x04020004, 0x4a025809, + 0xffffffff, 0x0401f002, 0x480a5809, 0x58080202, + 0x48025c13, 0x0401f005, 0x4a025809, 0xffffffff, + 0x4a025c13, 0x0000ffff, 0x49425a08, 0x48125a06, + 0x82100580, 0x0000ffff, 0x0400000e, 0x4d440000, + 0x4d340000, 0x40128800, 0x0201f800, 0x00020245, + 0x02020800, 0x001005d8, 0x59340002, 0x82000500, + 0x00ffffff, 0x48025812, 0x5c026800, 0x5c028800, + 0x497a5800, 0x497a5c04, 0x83400580, 0x00000046, + 0x04020002, 0x48165a07, 0x481a5c08, 0x0401fbed, + 0x5c025800, 0x1c01f000, 0x59300809, 0x800409c0, + 0x04000004, 0x58040403, 0x81440580, 0x1c01f000, + 0x82000540, 0x00000001, 0x0401f7fd, 0x4933c857, + 0x4c040000, 0x59300403, 0x82000d80, 0x0000001e, + 0x04020016, 0x800000d0, 0x59300a16, 0x82040d00, + 0x000000ff, 0x80040540, 0x4803c857, 0x48026416, + 0x4a026403, 0x00000085, 0x4a026203, 0x00000009, + 0x4a026406, 0x00000005, 0x4a02621d, 0x00000004, + 0x59a80038, 0x48026206, 0x42000800, 0x8000004b, + 0x0201f800, 0x00020721, 0x5c000800, 0x1c01f000, + 0x4933c857, 0x40000000, 0x40000000, 0x1c01f000, + 0x59300414, 0x4933c857, 0x4803c857, 0x8c000518, + 0x04000009, 0x8c000512, 0x02020000, 0x0010921e, + 0x0401f91b, 0x0201f800, 0x000206fd, 0x0201f800, + 0x0002077d, 0x1c01f000, 0x591c0406, 0x4803c857, + 0x82000c80, 0x00000009, 0x0402100b, 0x0c01f001, + 0x0010a4d9, 0x0010a4d9, 0x0010a4d9, 0x0010a4db, + 0x0010a4d9, 0x0010a4db, 0x0010a4db, 0x0010a4d9, + 0x0010a4db, 0x80000580, 0x1c01f000, 0x82000540, + 0x00000001, 0x1c01f000, 0x591c0406, 0x82000500, + 0x0000001f, 0x82000580, 0x00000006, 0x0400000e, + 0x4803c857, 0x4a026403, 0x0000003b, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00002a00, 0x4a026203, + 0x00000001, 0x42000800, 0x80000040, 0x0201f000, + 0x00020721, 0x4803c856, 0x4c040000, 0x4c140000, + 0x4d300000, 0x411e6000, 0x0401f8e9, 0x497a6205, + 0x59300414, 0x4803c857, 0x82000500, 0xffffadff, + 0x48026414, 0x497a6405, 0x5c026000, 0x0201f800, + 0x001007e4, 0x02000800, 0x001005d8, 0x5c002800, + 0x5c000800, 0x4a025a04, 0x0000010d, 0x497a5800, + 0x497a5c04, 0x4a025a08, 0x00000045, 0x491e5809, + 0x59300402, 0x48025c07, 0x59300419, 0x48025c0b, + 0x591c0414, 0x84000556, 0x48023c14, 0x591c1809, + 0x580c0403, 0x48025a06, 0x4816580a, 0x48065a0b, + 0x0401f99d, 0x4d400000, 0x42028000, 0x00000045, + 0x591c0202, 0x4c000000, 0x4d300000, 0x411e6000, + 0x0401fcb1, 0x5c026000, 0x5c000000, 0x48023a02, + 0x5c028000, 0x4a023c06, 0x00000006, 0x4a023a03, + 0x00000007, 0x497a3a06, 0x497a3a05, 0x1c01f000, + 0x4933c857, 0x83380580, 0x00000013, 0x0402000b, + 0x59300403, 0x4803c857, 0x82000d80, 0x00000085, + 0x0400002b, 0x82000d80, 0x0000008b, 0x04000028, + 0x0201f800, 0x001005d8, 0x83380580, 0x00000027, + 0x0402000c, 0x0201f800, 0x00106bbf, 0x4d2c0000, + 0x4d400000, 0x59325808, 0x42028000, 0x00000004, + 0x0401feab, 0x5c028000, 0x5c025800, 0x1c01f000, + 0x83380580, 0x00000014, 0x040007f3, 0x83380580, + 0x00000089, 0x04000005, 0x83380580, 0x0000008a, + 0x02020000, 0x00107974, 0x0201f800, 0x00106f60, + 0x02020000, 0x00107974, 0x59300a03, 0x82040580, + 0x0000000a, 0x04000009, 0x82040580, 0x0000000c, + 0x04000006, 0x0201f800, 0x001005d8, 0x4a026203, + 0x0000000a, 0x1c01f000, 0x83380480, 0x00000093, + 0x0402100c, 0x83380480, 0x00000085, 0x04001009, + 0x83380580, 0x00000089, 0x0400000a, 0x83380580, + 0x0000008a, 0x04000022, 0x0201f800, 0x001005d8, + 0x493bc857, 0x4933c857, 0x0201f000, 0x00107974, + 0x4933c857, 0x4c340000, 0x41306800, 0x0201f800, + 0x0002075a, 0x04000011, 0x4a026203, 0x00000001, + 0x4a026403, 0x0000001e, 0x59cc0c07, 0x48066419, + 0x59cc0a07, 0x48066219, 0x58340809, 0x48066009, + 0x4a026406, 0x00000004, 0x42000800, 0x80000040, + 0x0201f800, 0x00020721, 0x40366000, 0x0201f800, + 0x0002077d, 0x5c006800, 0x1c01f000, 0x4933c857, + 0x0201f000, 0x0002077d, 0x4933c857, 0x59300809, + 0x58040200, 0x8c00051a, 0x1c01f000, 0x0201f800, + 0x001048df, 0x0400001e, 0x4a026203, 0x00000002, + 0x59300414, 0x84000558, 0x48026414, 0x8c000512, + 0x04000004, 0x59a80039, 0x48026205, 0x0401f007, + 0x59a80839, 0x59a80037, 0x80040400, 0x82000400, + 0x0000000a, 0x48026205, 0x59300009, 0x82000c00, + 0x00000011, 0x50040000, 0x80000540, 0x04000004, + 0x82000c00, 0x00000000, 0x0401f7fb, 0x45300800, + 0x497a6000, 0x82000540, 0x00000001, 0x1c01f000, + 0x82100500, 0xfffffeef, 0x04020020, 0x4d2c0000, + 0x4937c857, 0x59340811, 0x83341400, 0x00000011, + 0x800409c0, 0x0400000e, 0x40040000, 0x81300580, + 0x04000005, 0x58040800, 0x82041400, 0x00000000, + 0x0401f7f8, 0x59300800, 0x497a6000, 0x44041000, + 0x0201f800, 0x000206fd, 0x0401f002, 0x4933c857, + 0x592c0000, 0x80000540, 0x02020800, 0x001005d8, + 0x5c025800, 0x492e6008, 0x0201f800, 0x000206fd, + 0x0201f000, 0x0002077d, 0x492fc857, 0x4a025a06, + 0x00000006, 0x0201f000, 0x000202da, 0x4c340000, + 0x59300009, 0x800001c0, 0x04000010, 0x82006c00, + 0x00000011, 0x50340000, 0x80000540, 0x04000009, + 0x81300580, 0x04000005, 0x50340000, 0x82006c00, + 0x00000000, 0x0401f7f8, 0x59300000, 0x44006800, + 0x5c006800, 0x1c01f000, 0x59300c06, 0x82040580, + 0x00000005, 0x040007fb, 0x82040580, 0x00000011, + 0x040007f8, 0x82040580, 0x00000006, 0x040007f5, + 0x82040580, 0x00000001, 0x040007f2, 0x0201f800, + 0x001005d8, 0x4933c857, 0x4c080000, 0x4c0c0000, + 0x4c580000, 0x59a8101d, 0x59cc1807, 0x820c1d00, + 0x00ffffff, 0x800c0110, 0x80083580, 0x04020014, + 0x83cc1400, 0x00000008, 0x4200b000, 0x00000002, + 0x59300009, 0x82001c00, 0x00000006, 0x0201f800, + 0x0010855a, 0x0402000a, 0x83cc1400, 0x0000000a, + 0x4200b000, 0x00000002, 0x59300009, 0x82001c00, + 0x00000008, 0x0201f800, 0x0010855a, 0x5c00b000, + 0x5c001800, 0x5c001000, 0x1c01f000, 0x4933c856, + 0x0201f800, 0x0010421b, 0x0201f000, 0x00101e45, + 0x493bc857, 0x4d2c0000, 0x0201f800, 0x001007e4, + 0x02000800, 0x001005d8, 0x832cac00, 0x00000005, + 0x4c580000, 0x4c540000, 0x4200b000, 0x00000006, + 0x4578a800, 0x8054a800, 0x8058b040, 0x040207fd, + 0x83380580, 0x00000046, 0x04020004, 0x4a025a04, + 0x00000144, 0x0401f008, 0x4a025a04, 0x00000146, + 0x83380580, 0x00000041, 0x04000003, 0x4a025a06, + 0x00000001, 0x59cc0007, 0x82000500, 0xff000000, + 0x80000110, 0x59cc1008, 0x82081500, 0xff000000, + 0x80081540, 0x480a580a, 0x83380580, 0x00000046, + 0x04020006, 0x59cc0007, 0x82000500, 0x00ffffff, + 0x4802580b, 0x0401f005, 0x59cc0008, 0x82000500, + 0x00ffffff, 0x4802580b, 0x83380580, 0x00000046, + 0x04020004, 0x83cc1400, 0x00000009, 0x0401f003, + 0x83cc1400, 0x0000000d, 0x50080000, 0x9c0001c0, + 0x4802580c, 0x80081000, 0x50080000, 0x9c0001c0, + 0x4802580d, 0x83380580, 0x00000046, 0x04020008, + 0x59cc000b, 0x9c0001c0, 0x4802580e, 0x59cc000c, + 0x9c0001c0, 0x4802580f, 0x0401f007, 0x59cc000f, + 0x9c0001c0, 0x4802580e, 0x59cc0010, 0x9c0001c0, + 0x4802580f, 0x83380580, 0x00000046, 0x04020004, + 0x83cc1400, 0x00000011, 0x0401f003, 0x83cc1400, + 0x00000015, 0x412c3000, 0x82183400, 0x00000010, + 0x4200b000, 0x00000004, 0x50080000, 0x9c0001c0, + 0x44003000, 0x80081000, 0x80183000, 0x8058b040, + 0x040207fa, 0x5c00a800, 0x5c00b000, 0x0201f800, + 0x000202da, 0x5c025800, 0x1c01f000, 0x4933c857, + 0x492fc857, 0x59300809, 0x58040200, 0x8c00051e, + 0x04000004, 0x592c0208, 0x84000558, 0x48025a08, + 0x1c01f000, 0x59e0180f, 0x599c0413, 0x800c1000, + 0x80080580, 0x04020002, 0x41781000, 0x59e00010, + 0x59e00810, 0x80040d80, 0x040207fd, 0x80080580, + 0x0400000b, 0x4c080000, 0x599c0814, 0x599c1015, + 0x800c00cc, 0x80040c00, 0x82081440, 0x00000000, + 0x5c001800, 0x82000540, 0x00000001, 0x4803c857, + 0x1c01f000, 0x492fc857, 0x42007000, 0x0010b7f8, + 0x58380807, 0x800409c0, 0x04020005, 0x492c7008, + 0x492c7007, 0x0201f000, 0x00100875, 0x492c0800, + 0x492c7007, 0x1c01f000, 0x59300203, 0x4933c857, + 0x4937c857, 0x493bc857, 0x4803c857, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001, + 0x0010a6da, 0x0010a82c, 0x0010a6da, 0x0010a6da, + 0x0010a6da, 0x0010a6da, 0x0010a6da, 0x0010a791, + 0x0010a6dc, 0x0010a6da, 0x0010a6da, 0x0010a6da, + 0x0010a6da, 0x0010a6da, 0x0201f800, 0x001005d8, + 0x83380580, 0x0000004c, 0x02020800, 0x001005d8, + 0x0201f800, 0x001048ec, 0x04020020, 0x59a80826, + 0x82040500, 0x00000009, 0x82000580, 0x00000008, + 0x0400001a, 0x8c040d12, 0x0400003d, 0x59cc0806, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400001f, 0x82040580, 0x50000000, 0x04000005, + 0x82040580, 0x52000000, 0x02020000, 0x0002077d, + 0x813669c0, 0x04000006, 0x4d3c0000, 0x417a7800, + 0x0201f800, 0x0010203c, 0x5c027800, 0x4a026403, + 0x00000001, 0x0401f014, 0x59cc0806, 0x82040d00, + 0xff000000, 0x82040580, 0x03000000, 0x04000008, + 0x82040580, 0x50000000, 0x04000005, 0x82040580, + 0x52000000, 0x02020000, 0x0002077d, 0x4a026403, + 0x00000009, 0x4a02641a, 0x00000009, 0x4a02621a, + 0x00000000, 0x813669c0, 0x0402000b, 0x59cc0001, + 0x0201f800, 0x00105c9a, 0x02020000, 0x0002077d, + 0x0201f800, 0x001045a6, 0x02020000, 0x0002077d, + 0x49366009, 0x4a026406, 0x00000004, 0x4a026203, + 0x00000001, 0x0201f000, 0x0010672b, 0x0201f800, + 0x00103b25, 0x04000023, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x04000033, 0x82040580, 0x20000000, 0x04000041, + 0x82040580, 0x21000000, 0x04000052, 0x82040580, + 0x24000000, 0x0400004f, 0x82040580, 0x50000000, + 0x0400004c, 0x82040580, 0x52000000, 0x04000049, + 0x82040580, 0x05000000, 0x0402000d, 0x59cc0806, + 0x82040d00, 0xff000000, 0x9c0431c0, 0x42028000, + 0x00000046, 0x42002800, 0x00000001, 0x0401fcf3, + 0x0401f93c, 0x02000800, 0x001005d8, 0x42002000, + 0x00000051, 0x0201f800, 0x00107a4a, 0x59cc0000, + 0x82000500, 0x00ffffff, 0x82000580, 0x00ffffff, + 0x04000005, 0x4a026203, 0x00000007, 0x493a6403, + 0x1c01f000, 0x59325817, 0x812e59c0, 0x02020800, + 0x001007fd, 0x0201f000, 0x0002077d, 0x813669c0, + 0x040007df, 0x59340400, 0x82000500, 0x000000ff, + 0x82000580, 0x00000003, 0x040207d9, 0x0401fc6f, + 0x040207d7, 0x4a026403, 0x00000009, 0x4a02641a, + 0x0000000e, 0x4a02621a, 0x00001900, 0x0401f7a2, + 0x813669c0, 0x0400000c, 0x59340c00, 0x82040500, + 0x000000ff, 0x82000580, 0x00000009, 0x04000794, + 0x82040500, 0x0000ff00, 0x82000580, 0x00000700, + 0x040207c3, 0x4a026403, 0x00000009, 0x4a02641a, + 0x00000009, 0x4a02621a, 0x00001e00, 0x0401f78e, + 0x813669c0, 0x040007f8, 0x59340c00, 0x82040500, + 0x0000ff00, 0x82000580, 0x00000700, 0x040007f2, + 0x0401f7b3, 0x4d2c0000, 0x4c580000, 0x4c500000, + 0x4c540000, 0x41385000, 0x83380580, 0x00000054, + 0x02020800, 0x001005d8, 0x59325808, 0x592c0c0b, + 0x82040d00, 0x0000e000, 0x82040580, 0x00002000, + 0x04020076, 0x59300817, 0x800409c0, 0x04000014, + 0x58041404, 0x41cca800, 0x8204a400, 0x00000005, + 0x82080480, 0x00000010, 0x04021004, 0x4008b000, + 0x0401fb6b, 0x0401f00a, 0x40001000, 0x4200b000, + 0x0000000f, 0x0401fb66, 0x58040801, 0x800409c0, + 0x040207f2, 0x0201f800, 0x001005d8, 0x813669c0, + 0x0400005e, 0x59344c00, 0x592c0c09, 0x4807c857, + 0x4827c857, 0x82040d00, 0x000000ff, 0x82040580, + 0x00000003, 0x0400002a, 0x82040580, 0x00000005, + 0x04000032, 0x82040580, 0x00000020, 0x04000036, + 0x82040580, 0x00000052, 0x04000042, 0x82040580, + 0x00000050, 0x04000042, 0x82040580, 0x00000021, + 0x04000004, 0x82040580, 0x00000024, 0x04020043, + 0x82240500, 0x0000ff00, 0x82000580, 0x00000007, + 0x04000008, 0x42000800, 0x00000009, 0x0201f800, + 0x00104571, 0x42005000, 0x0000000c, 0x0401f037, + 0x4a025a06, 0x00000031, 0x4a02580d, 0x00000009, + 0x59340400, 0x4802580e, 0x0201f800, 0x000202da, + 0x0201f800, 0x00107911, 0x0401f03d, 0x0201f800, + 0x001042b4, 0x0201f800, 0x0010462a, 0x42000800, + 0x00000003, 0x0201f800, 0x00104571, 0x42005000, + 0x00000008, 0x0401f021, 0x59cc0007, 0x0201f800, + 0x00105eec, 0x0402001d, 0x0201f800, 0x001042b4, + 0x0401f01a, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000007, 0x040007df, 0x82240500, 0x000000ff, + 0x82000580, 0x00000009, 0x040007da, 0x0201f800, + 0x0010468d, 0x42005000, 0x0000000a, 0x0401f00b, + 0x42005000, 0x0000000e, 0x0401f003, 0x42005000, + 0x00000010, 0x82240500, 0x0000ff00, 0x82000580, + 0x00000007, 0x040007cb, 0x482a6403, 0x4a026203, + 0x00000001, 0x592c000d, 0x48026011, 0x497a6013, + 0x59a80038, 0x48026206, 0x417a7800, 0x0201f800, + 0x0010672b, 0x59325817, 0x812e59c0, 0x04000004, + 0x0201f800, 0x001007fd, 0x497a6017, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, + 0x4d2c0000, 0x59325808, 0x83380580, 0x00000013, + 0x04020029, 0x59300c03, 0x82040580, 0x00000054, + 0x0400001e, 0x82040580, 0x00000010, 0x04000018, + 0x82040580, 0x0000000e, 0x04000015, 0x82040580, + 0x00000008, 0x0400000d, 0x82040580, 0x0000000c, + 0x0400000a, 0x82040580, 0x0000000a, 0x02020800, + 0x001005d8, 0x42000800, 0x00000006, 0x0201f800, + 0x00104571, 0x0401f009, 0x42000800, 0x00000004, + 0x0201f800, 0x00104571, 0x0401f004, 0x59340200, + 0x8400051a, 0x48026a00, 0x4a025a06, 0x00000000, + 0x0201f800, 0x000202da, 0x0201f800, 0x0002077d, + 0x0401f022, 0x83380580, 0x00000027, 0x0400000e, + 0x83380580, 0x00000014, 0x02020800, 0x001005d8, + 0x0201f800, 0x00106bbf, 0x42028000, 0x00000031, + 0x42000800, 0x00000004, 0x42001000, 0x000000ff, + 0x0401f009, 0x0201f800, 0x00106bbf, 0x42028000, + 0x00000031, 0x42000800, 0x00000004, 0x42001000, + 0x00000010, 0x49425a06, 0x4806580d, 0x480a580e, + 0x0201f800, 0x000202da, 0x0201f800, 0x00104c19, + 0x0201f800, 0x00107911, 0x5c025800, 0x1c01f000, + 0x42007000, 0x0010b7f8, 0x58380807, 0x800409c0, + 0x04020005, 0x492c7008, 0x492c7007, 0x0201f000, + 0x00100875, 0x492c0800, 0x492c7007, 0x1c01f000, + 0x4d2c0000, 0x4c580000, 0x4c500000, 0x4c540000, + 0x4933c857, 0x4937c857, 0x59cc0806, 0x4807c857, + 0x82040d00, 0xff000000, 0x82040580, 0x03000000, + 0x0400000d, 0x82040580, 0x05000000, 0x0400000a, + 0x82040580, 0x21000000, 0x04000030, 0x82040580, + 0x24000000, 0x0400002d, 0x82040580, 0x20000000, + 0x0402002f, 0x0201f800, 0x001007e4, 0x0400002c, + 0x492fc857, 0x492e6017, 0x59a8b016, 0x8258b400, + 0x0000001b, 0x8258b500, 0xfffffffc, 0x8058b104, + 0x485a5c04, 0x412c7800, 0x41cca000, 0x82580480, + 0x00000010, 0x04021005, 0x832cac00, 0x00000005, + 0x0401fa63, 0x0401f015, 0x40580800, 0x4200b000, + 0x0000000f, 0x832cac00, 0x00000005, 0x0401fa5c, + 0x8204b480, 0x0000000f, 0x0201f800, 0x001007e4, + 0x04000004, 0x492c7801, 0x412c7800, 0x0401f7ec, + 0x59325817, 0x0201f800, 0x001007fd, 0x497a6017, + 0x80000580, 0x0401f006, 0x59340200, 0x84000554, + 0x48026a00, 0x82000540, 0x00000001, 0x5c00a800, + 0x5c00a000, 0x5c00b000, 0x5c025800, 0x1c01f000, + 0x4933c857, 0x492fc857, 0x4d2c0000, 0x59300a03, + 0x82040580, 0x00000007, 0x04000036, 0x82040580, + 0x00000001, 0x02020800, 0x001005d8, 0x0201f800, + 0x00106c55, 0x4df00000, 0x598c000d, 0x81300580, + 0x04020016, 0x59300004, 0x8c000520, 0x04000004, + 0x84000520, 0x48026004, 0x0401f016, 0x42001000, + 0x0010b7f6, 0x50081000, 0x58080002, 0x82000580, + 0x00000100, 0x04000006, 0x5808000c, 0x81300580, + 0x02020800, 0x001005d8, 0x0401f00a, 0x0201f800, + 0x00106e8e, 0x04020020, 0x59300004, 0x8c000520, + 0x04000004, 0x84000520, 0x48026004, 0x0401f003, + 0x0201f800, 0x001068d3, 0x5c03e000, 0x02000800, + 0x00106c4b, 0x0201f800, 0x00109037, 0x02000800, + 0x001005d8, 0x59325808, 0x4a025a06, 0x00000005, + 0x0201f800, 0x000202da, 0x0201f800, 0x00104c19, + 0x59325817, 0x812e59c0, 0x02020800, 0x001007fd, + 0x0201f800, 0x00107911, 0x80000580, 0x5c025800, + 0x1c01f000, 0x5c03e000, 0x02000800, 0x00106c4b, + 0x59300406, 0x82000580, 0x00000011, 0x040007b8, + 0x0401f7f7, 0x4c040000, 0x59340200, 0x4803c857, + 0x8c00051c, 0x04000009, 0x59cc0805, 0x591c0019, + 0x4803c857, 0x80040580, 0x04000004, 0x80000580, + 0x4803c856, 0x0401f003, 0x82000540, 0x00000001, + 0x5c000800, 0x1c01f000, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x42001800, 0x0000ffff, 0x42002000, + 0x00000004, 0x0401f010, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x59302009, 0x58101c03, 0x42002000, + 0x00000004, 0x0401f008, 0x4c000000, 0x4c0c0000, + 0x4c100000, 0x59302009, 0x58101c03, 0x42002000, + 0x00000007, 0x480fc857, 0x4813c857, 0x481bc857, + 0x0201f800, 0x00103aae, 0x5c002000, 0x5c001800, + 0x5c000000, 0x1c01f000, 0x83380580, 0x00000092, + 0x02020800, 0x001005d8, 0x42000800, 0x80000040, + 0x4a026203, 0x00000001, 0x493a6403, 0x0201f000, + 0x00020721, 0x4d400000, 0x0201f800, 0x00103b25, + 0x04000008, 0x59a80005, 0x84000544, 0x48035005, + 0x42028000, 0x0000002a, 0x0201f800, 0x0010a449, + 0x5c028000, 0x1c01f000, 0x59a80026, 0x8c000508, + 0x04000005, 0x599c0017, 0x8c00050a, 0x04020002, + 0x1c01f000, 0x82000540, 0x00000001, 0x1c01f000, + 0x59300420, 0x84000540, 0x48026420, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x598800b8, 0x80000000, 0x480310b8, + 0x8c142d2e, 0x04000004, 0x598800b9, 0x80000000, + 0x480310b9, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x598800ba, 0x80000000, + 0x480310ba, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4817c857, 0x4c000000, 0x4c040000, 0x8c142d2a, + 0x04000004, 0x598800bb, 0x80000000, 0x480310bb, + 0x8c142d2e, 0x04000004, 0x598800bc, 0x80000000, + 0x480310bc, 0x8c142d2c, 0x04000013, 0x40140000, + 0x82000500, 0x00070000, 0x82000d80, 0x00030000, + 0x0400000d, 0x82000d80, 0x00040000, 0x0400000a, + 0x82000d80, 0x00050000, 0x04000007, 0x59880005, + 0x80000000, 0x48031005, 0x598800bd, 0x80000000, + 0x480310bd, 0x5c000800, 0x5c000000, 0x1c01f000, + 0x4c000000, 0x59880001, 0x80000000, 0x4803c857, + 0x48031001, 0x5c000000, 0x1c01f000, 0x4c000000, + 0x59880000, 0x80000000, 0x4803c857, 0x48031000, + 0x5c000000, 0x1c01f000, 0x4c000000, 0x59880002, + 0x80000000, 0x4803c857, 0x48031002, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d2c, + 0x04000004, 0x598800a6, 0x80000000, 0x480310a6, + 0x8c040d2a, 0x04000004, 0x598800a7, 0x80000000, + 0x480310a7, 0x8c040d28, 0x04000004, 0x598800a8, + 0x80000000, 0x480310a8, 0x8c040d26, 0x04000004, + 0x598800a9, 0x80000000, 0x480310a9, 0x8c040d24, + 0x04000004, 0x598800aa, 0x80000000, 0x480310aa, + 0x8c040d22, 0x04000004, 0x598800ab, 0x80000000, + 0x480310ab, 0x8c040d20, 0x04000004, 0x598800ac, + 0x80000000, 0x480310ac, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x598800ad, 0x80000000, + 0x480310ad, 0x5c000000, 0x1c01f000, 0x4807c857, + 0x4c000000, 0x8c040d1c, 0x04000004, 0x598800ae, + 0x80000000, 0x480310ae, 0x8c040d1a, 0x04000004, + 0x598800af, 0x80000000, 0x480310af, 0x5c000000, + 0x1c01f000, 0x4807c857, 0x4c000000, 0x8c040d18, + 0x04000004, 0x598800b0, 0x80000000, 0x480310b0, + 0x8c040d16, 0x04000004, 0x598800b1, 0x80000000, + 0x480310b1, 0x8c040d14, 0x04000004, 0x598800b2, + 0x80000000, 0x480310b2, 0x5c000000, 0x1c01f000, + 0x4807c857, 0x4c000000, 0x8c040d10, 0x04000004, + 0x598800b3, 0x80000000, 0x480310b3, 0x8c040d0c, + 0x04000004, 0x598800b4, 0x80000000, 0x480310b4, + 0x5c000000, 0x1c01f000, 0x4807c857, 0x4c000000, + 0x8c040d08, 0x04000004, 0x598800b5, 0x80000000, + 0x480310b5, 0x8c040d04, 0x04000004, 0x598800b6, + 0x80000000, 0x480310b6, 0x5c000000, 0x1c01f000, + 0x4807c856, 0x4c000000, 0x5988007f, 0x80000000, + 0x4803107f, 0x5c000000, 0x1c01f000, 0x4803c857, + 0x4c040000, 0x50000800, 0x80040800, 0x4807c857, + 0x44040000, 0x5c000800, 0x1c01f000, 0x480fc857, + 0x4c000000, 0x820c0580, 0x00000000, 0x04020004, + 0x42000000, 0x0010b819, 0x0401f014, 0x820c0580, + 0x00001001, 0x04020004, 0x42000000, 0x0010b81a, + 0x0401f00e, 0x820c0580, 0x00001002, 0x04020004, + 0x42000000, 0x0010b81b, 0x0401f008, 0x820c0c80, + 0x0000201c, 0x02021800, 0x001005d8, 0x820c0500, + 0x0000001f, 0x0c01f804, 0x0401ffdd, 0x5c000000, + 0x1c01f000, 0x0010aa89, 0x0010aa8c, 0x0010aa8f, + 0x0010aa92, 0x0010aa95, 0x0010aa98, 0x0010aa9b, + 0x0010aa9e, 0x0010aaa1, 0x0010aaa4, 0x0010aaa7, + 0x0010aaaa, 0x0010aaad, 0x0010aab0, 0x0010aab3, + 0x0010aab6, 0x0010aab9, 0x0010aabc, 0x0010aabf, + 0x0010aac2, 0x0010aac5, 0x0010aac8, 0x0010aacb, + 0x0010aace, 0x0010aad1, 0x0010aad4, 0x0010aad7, + 0x0010aada, 0x42000000, 0x0010b81c, 0x1c01f000, + 0x42000000, 0x0010b81d, 0x1c01f000, 0x42000000, + 0x0010b81e, 0x1c01f000, 0x42000000, 0x0010b81f, + 0x1c01f000, 0x42000000, 0x0010b820, 0x1c01f000, + 0x42000000, 0x0010b821, 0x1c01f000, 0x42000000, + 0x0010b822, 0x1c01f000, 0x42000000, 0x0010b823, + 0x1c01f000, 0x42000000, 0x0010b824, 0x1c01f000, + 0x42000000, 0x0010b825, 0x1c01f000, 0x42000000, + 0x0010b826, 0x1c01f000, 0x42000000, 0x0010b827, + 0x1c01f000, 0x42000000, 0x0010b828, 0x1c01f000, + 0x42000000, 0x0010b829, 0x1c01f000, 0x42000000, + 0x0010b82a, 0x1c01f000, 0x42000000, 0x0010b82b, + 0x1c01f000, 0x42000000, 0x0010b82c, 0x1c01f000, + 0x42000000, 0x0010b82d, 0x1c01f000, 0x42000000, + 0x0010b82e, 0x1c01f000, 0x42000000, 0x0010b82f, + 0x1c01f000, 0x42000000, 0x0010b830, 0x1c01f000, + 0x42000000, 0x0010b831, 0x1c01f000, 0x42000000, + 0x0010b832, 0x1c01f000, 0x42000000, 0x0010b833, + 0x1c01f000, 0x42000000, 0x0010b834, 0x1c01f000, + 0x42000000, 0x0010b835, 0x1c01f000, 0x42000000, + 0x0010b836, 0x1c01f000, 0x42000000, 0x0010b837, + 0x1c01f000, 0x480fc857, 0x4c000000, 0x820c0580, + 0x00000001, 0x04020004, 0x42000000, 0x0010b80e, + 0x0401f012, 0x820c0580, 0x00000002, 0x04020004, + 0x42000000, 0x0010b80f, 0x0401f00c, 0x820c0580, + 0x00000003, 0x04020004, 0x42000000, 0x0010b810, + 0x0401f006, 0x820c0580, 0x00000004, 0x04020004, + 0x42000000, 0x0010b811, 0x0401ff51, 0x5c000000, + 0x1c01f000, 0x4c000000, 0x59a80026, 0x4803c857, + 0x8c000502, 0x04000010, 0x8c000506, 0x04000004, + 0x42000000, 0x0010b841, 0x0401f012, 0x8c00050a, + 0x04000004, 0x42000000, 0x0010b840, 0x0401f00d, + 0x8c000508, 0x04000004, 0x42000000, 0x0010b843, + 0x0401f008, 0x0201f800, 0x0010513b, 0x04000006, + 0x8c000506, 0x04020004, 0x42000000, 0x0010b842, + 0x0401ff33, 0x5c000000, 0x1c01f000, 0x8058b1c0, + 0x02000800, 0x001005d8, 0x5450a800, 0x8050a000, + 0x8054a800, 0x8058b040, 0x040207fc, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x001005d8, 0x4450a800, + 0x8054a800, 0x8058b040, 0x040207fd, 0x1c01f000, + 0x8058b1c0, 0x02000800, 0x001005d8, 0x50500000, + 0x9c0001c0, 0x4400a800, 0x8050a000, 0x8054a800, + 0x8058b040, 0x040207fa, 0x1c01f000, 0x4c000000, + 0x59a80008, 0x8c00051c, 0x5c000000, 0x1c01f000, + 0x00000001, 0x00000002, 0x00000004, 0x00000008, + 0x00000010, 0x00000020, 0x00000040, 0x00000080, + 0x00000100, 0x00000200, 0x00000400, 0x00000800, + 0x00001000, 0x00002000, 0x00004000, 0x00008000, + 0x00010000, 0xa5f2b3ac +}; + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_length01 = 0x0000ab4a ; +#else +uint32_t risc_code_length01 = 0x0000ab4a ; +#endif + + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_addr02 = 0x0010e000 ; +#else +uint32_t risc_code_addr02 = 0x0010e000 ; +#endif + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_code02[] = { +#else +uint32_t risc_code02[] = { +#endif + 0x00000000, 0x00000000, 0x0010e000, 0x000014ff, + 0x00000000, 0x00000000, 0x00020000, 0x000008c0, + 0x836c0580, 0x00000003, 0x02020000, 0x001002e3, + 0x42000000, 0x0010b4bb, 0x50000000, 0x800001c0, + 0x04020956, 0x0401f923, 0x0401fbe3, 0x0401fb5c, + 0x0201f800, 0x00020718, 0x0201f800, 0x0002057b, + 0x0401f7f0, 0x59b800ea, 0x82000d00, 0xf0000038, + 0x02020000, 0x00100a7a, 0x8c000510, 0x02000000, + 0x00100a79, 0x59ba60e0, 0x81300182, 0x0402104e, + 0x04002030, 0x8532653e, 0x59300406, 0x82000580, + 0x00000003, 0x04020028, 0x59300203, 0x82000580, + 0x00000004, 0x04020024, 0x59325808, 0x59300402, + 0x4a025a04, 0x00000103, 0x900001c0, 0x48025806, + 0x497a5807, 0x497a5c09, 0x5930001f, 0x80000540, + 0x02020800, 0x00100d56, 0x59300004, 0x8c00053e, + 0x04020010, 0x0401fa88, 0x59326809, 0x0201f800, + 0x0002077d, 0x5934000f, 0x5934140b, 0x80081040, + 0x04001002, 0x480a6c0b, 0x80000540, 0x04020a10, + 0x59b800ea, 0x8c000510, 0x040207d7, 0x1c01f000, + 0x0201f800, 0x00106f60, 0x040007ef, 0x0201f000, + 0x00100a65, 0x42027000, 0x00000055, 0x0401f027, + 0x83326500, 0x3fffffff, 0x59300406, 0x82000580, + 0x00000003, 0x04020015, 0x59325808, 0x59326809, + 0x59301402, 0x4a025a04, 0x00000103, 0x900811c0, + 0x480a5806, 0x497a5c09, 0x497a5807, 0x0401fa62, + 0x0201f800, 0x0002077d, 0x5934000f, 0x5934140b, + 0x80081040, 0x04001002, 0x480a6c0b, 0x80000540, + 0x040209eb, 0x0401f7db, 0x42027000, 0x00000054, + 0x0401f00a, 0x83300500, 0x60000000, 0x02000000, + 0x00100a68, 0x81326580, 0x8000013a, 0x82000400, + 0x00100a80, 0x50027000, 0x59300c06, 0x82040580, + 0x00000002, 0x02000000, 0x00100a65, 0x59300004, + 0x8c00053e, 0x04020004, 0x0201f800, 0x000207a1, + 0x0401f7c4, 0x0201f800, 0x00106f60, 0x040007fb, + 0x0201f000, 0x00100a65, 0x59325808, 0x412c7000, + 0x58380a04, 0x82040500, 0x0000000f, 0x82000c00, + 0x001010bd, 0x50044000, 0x0c01f001, 0x00100dd9, + 0x00100dd9, 0x0002009f, 0x00100dd9, 0x00100dd9, + 0x00100dd9, 0x00100dd9, 0x00100dd9, 0x000200af, + 0x00100ded, 0x00100dd9, 0x00100dd9, 0x00100ddb, + 0x00100dd9, 0x00100dd9, 0x00100dd9, 0x5838040a, + 0x8c000500, 0x02000800, 0x001005d8, 0x50200000, + 0x80387c00, 0x583c1002, 0x583c2800, 0x583c2001, + 0x58380a07, 0x5838300f, 0x59303807, 0x58384c08, + 0x5838000d, 0x48026012, 0x0401f010, 0x5838020a, + 0x8c000502, 0x02000000, 0x00100dd9, 0x50200000, + 0x80387c00, 0x583c2800, 0x583c2001, 0x583c1002, + 0x592c0a07, 0x592c4c08, 0x592c300f, 0x59303807, + 0x497a6012, 0x497a6013, 0x4816600e, 0x4812600f, + 0x480a6010, 0x481a6011, 0x80040840, 0x4806600d, + 0x02020000, 0x00100e1a, 0x841c3d40, 0x481e6007, + 0x1c01f000, 0x41787800, 0x59325808, 0x592c0c0a, + 0x8c040d02, 0x02000000, 0x00100f8c, 0x592c000d, + 0x592c100f, 0x592c0a04, 0x480a6011, 0x48026012, + 0x48026013, 0x412c3000, 0x82040500, 0x0000000f, + 0x82000400, 0x001010bd, 0x50003800, 0x501c0000, + 0x401c1000, 0x592c1a07, 0x4802600a, 0x481a600b, + 0x480a600c, 0x480e600d, 0x843c7d4a, 0x403c1000, + 0x1c01f000, 0x41787800, 0x497a6012, 0x592c0a04, + 0x412c3000, 0x592c1a07, 0x82040500, 0x0000000f, + 0x82000400, 0x001010bd, 0x50004000, 0x50200000, + 0x40201000, 0x4802600a, 0x481a600b, 0x480a600c, + 0x480e600d, 0x80000580, 0x483e6004, 0x1c01f000, + 0x4c000000, 0x4df00000, 0x0201f800, 0x00020729, + 0x0401f005, 0x4c000000, 0x4df00000, 0x0401ff16, + 0x0401f001, 0x5c03e000, 0x5c000000, 0x1801f000, + 0x4203e000, 0xb0100000, 0x41fc0000, 0x82000500, + 0x00000011, 0x0c01f001, 0x0002012a, 0x00020697, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0010115a, 0x0002012c, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0002012a, 0x0002012a, + 0x0002012a, 0x0002012a, 0x0201f800, 0x001005d8, + 0x0201f800, 0x00020697, 0x0201f000, 0x0010115a, + 0x42000000, 0x0010b4c1, 0x50000000, 0x8c000504, + 0x04000014, 0x42000000, 0x0010b4c1, 0x50000000, + 0x8c000502, 0x04020002, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x42034000, 0x0010b4a4, + 0x59a0001d, 0x59a1d81e, 0x84000502, 0x4803401d, + 0x58ec0009, 0x0801f800, 0x5c03e000, 0x1c01f000, + 0x04027002, 0x04026002, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x0201f800, 0x001007e4, + 0x04000010, 0x412dd800, 0x48efc857, 0x0201f800, + 0x00103b28, 0x42034000, 0x0010b4a4, 0x49a1d80b, + 0x48ef401e, 0x59a0001d, 0x84000544, 0x4803401d, + 0x0201f800, 0x00102214, 0x0201f800, 0x00102233, + 0x5c03e000, 0x1c01f000, 0x4da00000, 0x4df00000, + 0x4203e000, 0x50000000, 0x04006051, 0x40001000, + 0x42034000, 0x0010b4a4, 0x59a01818, 0x800c19c0, + 0x04020008, 0x59a0381b, 0x801c39c0, 0x02000800, + 0x001005d8, 0x59a0041c, 0x801c3c00, 0x0401f00c, + 0x59a00419, 0x82000400, 0x00000002, 0x48034419, + 0x82000c80, 0x00000013, 0x04001003, 0x497b4419, + 0x41780000, 0x59a03816, 0x801c3c00, 0x80081040, + 0x480b4017, 0x581c0200, 0x4803c021, 0x581c0401, + 0x4803c022, 0x581c0201, 0x4803c023, 0x581c0400, + 0x4803c020, 0x900001c0, 0x82000540, 0x00000012, + 0x4803c011, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x00000002, 0x4203e000, 0x30000001, + 0x800c19c0, 0x04000007, 0x800c1840, 0x480f4018, + 0x0402001f, 0x497b4419, 0x497b4219, 0x0401f01c, + 0x800811c0, 0x0402000b, 0x4d2c0000, 0x59a2581b, + 0x0201f800, 0x001007f4, 0x5c025800, 0x497b401b, + 0x497b401a, 0x497b441c, 0x497b421c, 0x0401f010, + 0x59a0041c, 0x82000400, 0x00000002, 0x82000c80, + 0x00000012, 0x4803441c, 0x04001009, 0x4d2c0000, + 0x59a2581b, 0x592c3813, 0x481f401b, 0x497b441c, + 0x0201f800, 0x001007f4, 0x5c025800, 0x5c03e000, + 0x5c034000, 0x1c01f000, 0x59a80005, 0x82000500, + 0x00000003, 0x02020000, 0x00104315, 0x59340400, + 0x82000580, 0x00000606, 0x02020000, 0x001042e6, + 0x5934000d, 0x80027d40, 0x02020000, 0x00104321, + 0x0401f803, 0x80000580, 0x1c01f000, 0x5934000f, + 0x59341203, 0x80080540, 0x0402006f, 0x5934020b, + 0x5934140b, 0x80080480, 0x0402106b, 0x0201f800, + 0x0002075a, 0x04000064, 0x80081000, 0x592c0406, + 0x480a6c0b, 0x49366009, 0x492e6008, 0x4a026406, + 0x00000003, 0x4a026403, 0x00000040, 0x800000c2, + 0x800018c4, 0x800c0400, 0x48026206, 0x592c0808, + 0x592c1809, 0x592c020a, 0x48066017, 0x480e6018, + 0x8c000502, 0x04000030, 0x4a026203, 0x00000004, + 0x592c0207, 0x80000040, 0x04020020, 0x59a80005, + 0x8c000514, 0x42000000, 0x00000055, 0x04020003, + 0x42000000, 0x00000033, 0x80000040, 0x040207ff, + 0x592c0204, 0x82000500, 0x000000ff, 0x82000580, + 0x00000018, 0x04020011, 0x592c180f, 0x59300007, + 0x82000540, 0x00000091, 0x480e6011, 0x48026007, + 0x42000000, 0x80000004, 0x48026004, 0x59bc00ea, + 0x8c000516, 0x040207fe, 0x83300400, 0x20000000, + 0x480378e1, 0x1c01f000, 0x0401fe78, 0x59300007, + 0x8400054e, 0x48026007, 0x592c1a04, 0x820c1d00, + 0x000000ff, 0x820c0580, 0x00000048, 0x04000017, + 0x0401f7ec, 0x8c000500, 0x04020ecb, 0x4a026203, + 0x00000002, 0x59a80805, 0x82040500, 0x00000600, + 0x04020012, 0x42000000, 0x00000030, 0x80000040, + 0x040207ff, 0x592c1a04, 0x820c1d00, 0x000000ff, + 0x820c0580, 0x00000018, 0x040007da, 0x820c0580, + 0x00000048, 0x040207d7, 0x42000800, 0x80000804, + 0x0201f000, 0x00106721, 0x8c040d12, 0x42000000, + 0x00000010, 0x040207ee, 0x42000000, 0x00000051, + 0x0401f7eb, 0x800811c0, 0x04020003, 0x4a026a03, + 0x00000001, 0x59340010, 0x492e6810, 0x80000d40, + 0x04020003, 0x492e680f, 0x1c01f000, 0x492c0800, + 0x1c01f000, 0x83440c80, 0x00000800, 0x04021009, + 0x83440400, 0x0010ac00, 0x50000000, 0x80000540, + 0x04000004, 0x40026800, 0x80000580, 0x1c01f000, + 0x82000540, 0x00000001, 0x1c01f000, 0x59340203, + 0x80000540, 0x0402004b, 0x4d300000, 0x4d2c0000, + 0x5934000f, 0x80025d40, 0x04000044, 0x0201f800, + 0x0002075a, 0x0400003f, 0x592c0000, 0x4802680f, + 0x80000540, 0x04020002, 0x48026810, 0x592c2a04, + 0x80081000, 0x480a6c0b, 0x49366009, 0x492e6008, + 0x82142d00, 0x000000ff, 0x82140580, 0x00000012, + 0x04000035, 0x4a026406, 0x00000003, 0x4a026403, + 0x00000040, 0x592c0406, 0x800000c2, 0x800018c4, + 0x800c0400, 0x48026206, 0x592c0808, 0x592c1809, + 0x592c020a, 0x48066017, 0x480e6018, 0x8c000502, + 0x02000000, 0x0010474d, 0x4a026203, 0x00000004, + 0x592c0207, 0x80000040, 0x02020000, 0x00104740, + 0x82140580, 0x00000018, 0x02020000, 0x00104740, + 0x592c180f, 0x59300007, 0x82000540, 0x00000091, + 0x480e6011, 0x48026007, 0x42000000, 0x80000004, + 0x48026004, 0x59bc00ea, 0x8c000516, 0x040207fe, + 0x83300400, 0x20000000, 0x480378e1, 0x5934020b, + 0x5934140b, 0x80080480, 0x040017be, 0x0401f003, + 0x4a026a03, 0x00000001, 0x5c025800, 0x5c026000, + 0x1c01f000, 0x497a5800, 0x49325809, 0x4a026406, + 0x00000006, 0x4a026203, 0x00000007, 0x0401f802, + 0x0401f7ef, 0x59a80021, 0x800001c0, 0x02020000, + 0x0010476f, 0x59a80005, 0x8c000504, 0x02020000, + 0x0010476b, 0x59340200, 0x8c000518, 0x02020000, + 0x00104767, 0x592c0a0c, 0x48066202, 0x4a025a06, + 0x00000000, 0x8c000508, 0x02020000, 0x00104763, + 0x4d3c0000, 0x417a7800, 0x0401fbdf, 0x5c027800, + 0x1c01f000, 0x592c0404, 0x8c00051e, 0x02020000, + 0x00104ce4, 0x59980022, 0x80000540, 0x04000017, + 0x592c0a06, 0x592c0409, 0x80040540, 0x04020013, + 0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e, + 0x02020000, 0x00104cf3, 0x59980022, 0x80000540, + 0x0400000a, 0x82040580, 0x00000001, 0x04020007, + 0x0201f000, 0x00104cfa, 0x592c0404, 0x8c00051e, + 0x02020000, 0x00104dca, 0x59980026, 0x497a5800, + 0x80000540, 0x02020000, 0x00104e1d, 0x59d80105, + 0x82000d00, 0x00018780, 0x02020000, 0x00104edb, + 0x80000106, 0x82000500, 0x00000003, 0x0c01f001, + 0x000202f0, 0x00104e1d, 0x000202f6, 0x00020341, + 0x592c0001, 0x492fb107, 0x80000d40, 0x02020000, + 0x00104ddb, 0x1c01f000, 0x592c0001, 0x492fb107, + 0x80000d40, 0x02020000, 0x00104de8, 0x59da5908, + 0x835c0480, 0x00000020, 0x0400102c, 0x0402b034, + 0x492fb007, 0x0400e7fa, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x0400601f, + 0x59d8010a, 0x59d8090a, 0x80040580, 0x040207fd, + 0x800408e0, 0x599c1017, 0x8c081508, 0x04020028, + 0x82040d40, 0x00000013, 0x5998002b, 0x4807c011, + 0x84000500, 0x4803302b, 0x59e00017, 0x8c000508, + 0x04020004, 0x4203e000, 0x30000001, 0x1c01f000, + 0x4a03c017, 0x00000003, 0x82040500, 0x000000ff, + 0x82000580, 0x0000001d, 0x040207f7, 0x4a03c017, + 0x0000000d, 0x0401f7f4, 0x5998082b, 0x84040d40, + 0x4807302b, 0x1c01f000, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0400e7ca, 0x0401f7d0, 0x0402f7f7, + 0x492fa807, 0x0400e7c6, 0x0401f7cc, 0x59e0000f, + 0x59e0100f, 0x80081580, 0x040207fd, 0x81281580, + 0x040007d4, 0x40025000, 0x82040d40, 0x0000001d, + 0x0401f7d2, 0x59d80908, 0x45680800, 0x4006d000, + 0x815eb800, 0x0400e7fc, 0x59c80000, 0x82000540, + 0x00001200, 0x48039000, 0x02006000, 0x00104df8, + 0x59d8010a, 0x59d8090a, 0x80040d80, 0x040207fd, + 0x900001c0, 0x82000540, 0x00000013, 0x4803c011, + 0x5998002b, 0x84000500, 0x4803302b, 0x59e00017, + 0x8c000508, 0x04000003, 0x4a03c017, 0x00000003, + 0x4203e000, 0x30000001, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x0202d000, + 0x00104dfd, 0x592c0001, 0x492fb107, 0x80000d40, + 0x02020000, 0x00104e10, 0x1c01f000, 0x59980020, + 0x0c01f001, 0x00020370, 0x00020371, 0x00104e88, + 0x1c01f000, 0x4df00000, 0x4203e000, 0x50000000, + 0x0402681e, 0x04006004, 0x599c0017, 0x8c000508, + 0x04020865, 0x59980029, 0x80025d40, 0x0400000a, + 0x0402d00b, 0x59980026, 0x80000040, 0x48033026, + 0x592c0000, 0x492fb107, 0x48033029, 0x04020002, + 0x48033028, 0x5c03e000, 0x1c01f000, 0x59d80105, + 0x82000500, 0x00018780, 0x02020000, 0x00104edb, + 0x42000000, 0x0010b855, 0x0201f800, 0x0010aa47, + 0x5c03e000, 0x1c01f000, 0x5998002b, 0x8c000500, + 0x0402003b, 0x0400e007, 0x59d80105, 0x82000500, + 0x00018780, 0x02020000, 0x00104edb, 0x1c01f000, + 0x59da5908, 0x835c0c80, 0x00000020, 0x04001003, + 0x0400b029, 0x0400f02b, 0x496a5800, 0x412ed000, + 0x815eb800, 0x59c80000, 0x82000540, 0x00001200, + 0x48039000, 0x0400e7f3, 0x59d8010a, 0x59d8090a, + 0x80040580, 0x040207fd, 0x800408e0, 0x599c1017, + 0x8c081508, 0x04020022, 0x82040d40, 0x00000013, + 0x4807c011, 0x59e00017, 0x8c000508, 0x0400000a, + 0x4a03c017, 0x00000003, 0x82040500, 0x000000ff, + 0x82000580, 0x0000001d, 0x04020003, 0x4a03c017, + 0x0000000d, 0x4203e000, 0x30000001, 0x59d80105, + 0x82000500, 0x00018780, 0x02020000, 0x00104edb, + 0x1c01f000, 0x492fb007, 0x0400e7d2, 0x0401f7df, + 0x492fa807, 0x0400e7cf, 0x0401f7dc, 0x84000500, + 0x4803302b, 0x0400e7cb, 0x0401f7d8, 0x59e0000f, + 0x59e0100f, 0x80081580, 0x040207fd, 0x81281580, + 0x040007da, 0x40025000, 0x82040d40, 0x0000001d, + 0x0401f7d8, 0x59e0000f, 0x59e0100f, 0x80080d80, + 0x040207fd, 0x81280580, 0x04020002, 0x1c01f000, + 0x400a5000, 0x900811c0, 0x82081540, 0x0000001c, + 0x480bc011, 0x59e00017, 0x8c000508, 0x04000003, + 0x4a03c017, 0x0000000c, 0x4203e000, 0x30000001, + 0x1c01f000, 0x41700000, 0x0c01f001, 0x00105420, + 0x000203fc, 0x00105420, 0x00105421, 0x0010541e, + 0x0010541e, 0x0010541e, 0x0010541e, 0x001058b0, + 0x04010037, 0x59980006, 0x80000540, 0x0402003c, + 0x0402c01c, 0x4202f800, 0x00000010, 0x4df00000, + 0x4203e000, 0x50000000, 0x49db3005, 0x59da5808, + 0x592c0204, 0x497a5800, 0x497a5801, 0x82000500, + 0x000000ff, 0x82000c80, 0x00000079, 0x04021036, + 0x0c01f839, 0x5c03e000, 0x817ef840, 0x04000009, + 0x836c0580, 0x00000003, 0x04020006, 0x83700580, + 0x00000001, 0x04020010, 0x0401001b, 0x0400c7e8, + 0x0400f94a, 0x0400b134, 0x59d40005, 0x82000500, + 0x43018780, 0x02020000, 0x0010583f, 0x59d80005, + 0x82000500, 0x43018780, 0x02020000, 0x00105846, + 0x1c01f000, 0x83700580, 0x00000003, 0x02000800, + 0x00105421, 0x83700580, 0x00000001, 0x040207ed, + 0x04010005, 0x0400c7d2, 0x0401f7ea, 0x4202f800, + 0x00000010, 0x4df00000, 0x4203e000, 0x50000000, + 0x49d73005, 0x59d65808, 0x0401f7ce, 0x4df00000, + 0x4203e000, 0x50000000, 0x40025800, 0x592c0204, + 0x497b3005, 0x497b3006, 0x4202f800, 0x00000010, + 0x0401f7c7, 0x0201f800, 0x00105491, 0x5c03e000, + 0x0401f7d4, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105527, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x001054a1, + 0x00105491, 0x00105491, 0x00105491, 0x00105551, + 0x00105491, 0x00105491, 0x00105491, 0x000204ef, + 0x00105491, 0x001056b4, 0x00105491, 0x00105491, + 0x00105491, 0x000204c2, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x001054c9, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x001057d3, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x0010581e, 0x00105491, + 0x001054bb, 0x00105491, 0x00105797, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105765, 0x00105491, + 0x00105765, 0x00105872, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105725, + 0x00105855, 0x00105491, 0x00105865, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x00105491, 0x00105491, + 0x00105491, 0x00105491, 0x592c0204, 0x80000110, + 0x02000000, 0x00105499, 0x80000040, 0x04000009, + 0x48033002, 0x492f3003, 0x492f3004, 0x4a033008, + 0x000204d0, 0x4202e000, 0x00000003, 0x1c01f000, + 0x592c0406, 0x82000c80, 0x0000199a, 0x02021000, + 0x001054a9, 0x59a80021, 0x80000540, 0x02020000, + 0x001054d7, 0x592e8a06, 0x83440c80, 0x000007f0, + 0x02021000, 0x001054a9, 0x83440400, 0x0010ac00, + 0x50000000, 0x80026d40, 0x02000000, 0x001054db, + 0x59340002, 0x592c0810, 0x80040580, 0x82000500, + 0x00ffffff, 0x02020000, 0x001054a9, 0x0401fccf, + 0x02020000, 0x001054de, 0x1c01f000, 0x592c0204, + 0x80000110, 0x02000000, 0x00105499, 0x80000040, + 0x0402000b, 0x592c040a, 0x8c000504, 0x04000010, + 0x592c0207, 0x82000c80, 0x00001001, 0x02021000, + 0x001054a9, 0x0201f000, 0x0010588a, 0x48033002, + 0x492f3003, 0x492f3004, 0x4a033008, 0x00020507, + 0x4202e000, 0x00000003, 0x1c01f000, 0x592c0406, + 0x82000c80, 0x0000199a, 0x02021000, 0x001054a9, + 0x592e8a06, 0x417a7800, 0x0401fd37, 0x02020000, + 0x00105658, 0x59340002, 0x592c0808, 0x80040580, + 0x82000500, 0x00ffffff, 0x02020000, 0x001054a9, + 0x497a5808, 0x592e6009, 0x83300580, 0xffffffff, + 0x02000000, 0x00105618, 0x83300480, 0x0010d1c0, + 0x02001000, 0x00105675, 0x59a8000b, 0x81300480, + 0x02021000, 0x00105675, 0x592c240a, 0x49366009, + 0x8c10251c, 0x02020000, 0x00105606, 0x59a80068, + 0x8c000510, 0x02020000, 0x0010568e, 0x59a80821, + 0x800409c0, 0x02020000, 0x001055ec, 0x59a80805, + 0x8c040d04, 0x02020000, 0x0010567f, 0x59340200, + 0x8c000518, 0x02020000, 0x00105670, 0x59300c06, + 0x82040580, 0x00000006, 0x02020000, 0x00105610, + 0x59300414, 0x8c000516, 0x02020000, 0x0010567a, + 0x8c102508, 0x02020000, 0x0010a5b8, 0x59300808, + 0x4a025a06, 0x00000000, 0x800409c0, 0x02020000, + 0x001055e7, 0x592c0a0c, 0x48066202, 0x492e6008, + 0x0401f14d, 0x4df00000, 0x4203e000, 0x50000000, + 0x0402b00b, 0x835c0480, 0x00000020, 0x0400100d, + 0x815eb840, 0x416a5800, 0x592ed000, 0x492fb007, + 0x497a5800, 0x497a5801, 0x0400b7f7, 0x59d80005, + 0x82000500, 0x43018780, 0x02020000, 0x00105846, + 0x5c03e000, 0x1c01f000, 0x4df00000, 0x4203e000, + 0x50000000, 0x0402f00b, 0x835c0480, 0x00000020, + 0x0400100d, 0x815eb840, 0x416a5800, 0x592ed000, + 0x492fa807, 0x497a5800, 0x497a5801, 0x0400f7f7, + 0x59d40005, 0x82000500, 0x43018780, 0x02020000, + 0x0010583f, 0x5c03e000, 0x1c01f000, 0x4df00000, + 0x4203e000, 0x50000000, 0x59940024, 0x80000540, + 0x04000112, 0x4c000000, 0x42000000, 0x00001000, + 0x50000000, 0x82000480, 0x24320001, 0x04020015, + 0x42000800, 0x00000064, 0x80040840, 0x04000007, + 0x4a030000, 0x00000001, 0x40000000, 0x59800000, + 0x8c000500, 0x040007f9, 0x04000008, 0x42000800, + 0x00007a01, 0x50040000, 0x8c000510, 0x04000003, + 0x84000510, 0x44000800, 0x4a030000, 0x00000000, + 0x59e00002, 0x8c00051e, 0x0402001b, 0x42000000, + 0x00001000, 0x50000000, 0x82000480, 0x24320002, + 0x04020015, 0x42000800, 0x00000064, 0x80040840, + 0x04000007, 0x4a030000, 0x00000001, 0x40000000, + 0x59800000, 0x8c000500, 0x040007f9, 0x04000008, + 0x42000800, 0x00007a17, 0x50040000, 0x8c00050e, + 0x04020003, 0x8400054e, 0x44000800, 0x4a030000, + 0x00000000, 0x5c000000, 0x5994781a, 0x48032825, + 0x803c0480, 0x04001004, 0x04000003, 0x4803281a, + 0x0401f022, 0x41787800, 0x803c7800, 0x82000400, + 0x000003e8, 0x040027fd, 0x4803281a, 0x59a80024, + 0x803c1400, 0x480b5024, 0x803c0040, 0x04000002, + 0x483fc857, 0x59e40852, 0x59a80025, 0x80040580, + 0x04000004, 0x480bc857, 0x59e40052, 0x48035025, + 0x59940026, 0x803c0400, 0x48032826, 0x0201f800, + 0x00106021, 0x59940000, 0x82000580, 0x00000000, + 0x04020006, 0x59940026, 0x48032827, 0x497b2826, + 0x4a032800, 0x00000001, 0x4c0c0000, 0x59940007, + 0x80000d40, 0x0400001d, 0x59941006, 0x59940025, + 0x80081c80, 0x04001004, 0x04000003, 0x480f2806, + 0x0401f016, 0x80040840, 0x48072807, 0x82040580, + 0x000003e8, 0x04020007, 0x4c040000, 0x4c0c0000, + 0x59940008, 0x0801f800, 0x5c001800, 0x5c000800, + 0x800409c0, 0x04020004, 0x59940008, 0x0801f800, + 0x0401f006, 0x400c0000, 0x820c1c00, 0x0000000a, + 0x040027ed, 0x480f2806, 0x5c001800, 0x4d180000, + 0x59c40008, 0x8c000534, 0x04020025, 0x417a3000, + 0x83947c00, 0x00000009, 0x583c0001, 0x80000d40, + 0x04020008, 0x823c7c00, 0x00000003, 0x811a3000, + 0x83180580, 0x00000005, 0x040207f8, 0x0401f018, + 0x583c1000, 0x59940025, 0x80080480, 0x04001005, + 0x04000004, 0x48007800, 0x80000040, 0x04021010, + 0x80040840, 0x48047801, 0x04000008, 0x82000400, + 0x0000000a, 0x48007800, 0x040027fa, 0x82040500, + 0x0000007f, 0x0401f7e8, 0x583c0002, 0x4c3c0000, + 0x0801f800, 0x5c007800, 0x0401f7e3, 0x5c023000, + 0x59940019, 0x80001540, 0x04000008, 0x04002007, + 0x59940025, 0x80080480, 0x497b2819, 0x04001003, + 0x04000002, 0x48032819, 0x59940004, 0x80000d40, + 0x0400002a, 0x4c040000, 0x5994001c, 0x80000d40, + 0x04000013, 0x5994101b, 0x59940025, 0x80080480, + 0x04001005, 0x04000004, 0x4803281b, 0x80000040, + 0x0402100b, 0x80040840, 0x4807281c, 0x04020004, + 0x5994001d, 0x0801f800, 0x0401f005, 0x82000400, + 0x0000000a, 0x4803281b, 0x040027f7, 0x5c000800, + 0x59941003, 0x59940025, 0x80080480, 0x04001005, + 0x04000004, 0x48032803, 0x80000040, 0x0402100b, + 0x80040840, 0x48072804, 0x04020004, 0x59940005, + 0x0801f800, 0x0401f005, 0x82000400, 0x0000000a, + 0x48032803, 0x040027f7, 0x5994001f, 0x80000d40, + 0x04000013, 0x5994101e, 0x59940025, 0x80080480, + 0x04001005, 0x04000004, 0x4803281e, 0x80000040, + 0x0402100b, 0x80040840, 0x4807281f, 0x04020004, + 0x59940020, 0x0801f800, 0x0401f005, 0x82000400, + 0x00000001, 0x4803281e, 0x040027f7, 0x59940022, + 0x80000d40, 0x04000013, 0x59941021, 0x59940025, + 0x80080480, 0x04001005, 0x04000004, 0x48032821, + 0x80000040, 0x0402100b, 0x80040840, 0x48072822, + 0x04020004, 0x59940023, 0x0801f800, 0x0401f005, + 0x82000400, 0x0000000a, 0x48032821, 0x040027f7, + 0x59940824, 0x59940025, 0x80040480, 0x02001800, + 0x001005d8, 0x48032824, 0x59940000, 0x0c01f001, + 0x00105fb5, 0x00105fb7, 0x00105fdd, 0x59940024, + 0x80000000, 0x48032824, 0x4203e000, 0x70000000, + 0x1c01f000, 0x592c0406, 0x800000c2, 0x800008c4, + 0x80040c00, 0x592c040a, 0x48066206, 0x82000d00, + 0x00000003, 0x02000000, 0x0010615e, 0x8c000500, + 0x04020029, 0x8c00051e, 0x02000000, 0x00106139, + 0x82000d00, 0x000000c0, 0x02020000, 0x0010612f, + 0x82000d00, 0x00002020, 0x02020000, 0x0010612c, + 0x813e79c0, 0x02020000, 0x0010612c, 0x592c0c0c, + 0x800409c0, 0x02020000, 0x0010612c, 0x59300a03, + 0x82040d80, 0x00000007, 0x02020000, 0x0010612c, + 0x4a026203, 0x00000003, 0x4a026403, 0x00000043, + 0x0201f800, 0x000200c9, 0x82080d40, 0x80003465, + 0x48066004, 0x497a6000, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x83300400, 0xa0000000, 0x480378e1, + 0x1c01f000, 0x8c000502, 0x02020000, 0x00106181, + 0x8c00051e, 0x0400000e, 0x82000d00, 0x000000c0, + 0x04000005, 0x82040d80, 0x000000c0, 0x02020000, + 0x00106186, 0x82000d00, 0x00002020, 0x82040d80, + 0x00002020, 0x02000000, 0x0010614d, 0x592c0207, + 0x80000040, 0x02020000, 0x00106157, 0x592c180d, + 0x800c19c0, 0x02020000, 0x00106157, 0x592c180f, + 0x59300007, 0x82000540, 0x00000011, 0x480e6011, + 0x48026007, 0x4a026203, 0x00000004, 0x4a026403, + 0x00000042, 0x42000800, 0x80002001, 0x0401f02a, + 0x5c000000, 0x4c000000, 0x4803c857, 0x4807c857, + 0x0401f003, 0x42000800, 0x00000001, 0x59325808, + 0x832c0500, 0x00ff0000, 0x0400000d, 0x592c0000, + 0x48065a06, 0x48026008, 0x592c040a, 0x8c000510, + 0x04020008, 0x0201f800, 0x000202ce, 0x417a7800, + 0x59300008, 0x80025d40, 0x0402078f, 0x1c01f000, + 0x456a5800, 0x412ed000, 0x815eb800, 0x59c80000, + 0x82000540, 0x00001200, 0x48039000, 0x0401f7f4, + 0x59840000, 0x80000540, 0x04020002, 0x1c01f000, + 0x59840003, 0x80000540, 0x02020000, 0x001061fe, + 0x1c01f000, 0x48066004, 0x59bc00ea, 0x8c000516, + 0x040207fe, 0x83300400, 0x40000000, 0x480378e1, + 0x1c01f000, 0x59bc00ea, 0x82001500, 0xb0000018, + 0x02020000, 0x00106c81, 0x8c000510, 0x0400002a, + 0x59bc10e0, 0x82080500, 0xfffff000, 0x0402000a, + 0x80080108, 0x820a3500, 0x0000000f, 0x4803c857, + 0x1201f000, 0x00106c87, 0x84000510, 0x48026004, + 0x0401f016, 0x840a653e, 0x59300004, 0x8c000520, + 0x040007fa, 0x82000500, 0xfffefeff, 0x48026004, + 0x8c08153e, 0x04020005, 0x42027000, 0x00000013, + 0x0401f859, 0x0401f009, 0x59300004, 0x8c000514, + 0x04000003, 0x0401ffb0, 0x0401f02f, 0x42027000, + 0x00000049, 0x0401f850, 0x59bc00ea, 0x82001500, + 0xb0000018, 0x02020000, 0x00106c81, 0x8c000510, + 0x040207d8, 0x1c01f000, 0x83640480, 0x00000010, + 0x0400101a, 0x41626000, 0x41580000, 0x59300a03, + 0x82040d80, 0x00000000, 0x04000008, 0x83326400, + 0x00000024, 0x81300c80, 0x040017f9, 0x42026000, + 0x0010d1c0, 0x0401f7f6, 0x8166c840, 0x83300c00, + 0x00000024, 0x80040480, 0x04021005, 0x4006c000, + 0x4a026203, 0x00000008, 0x1c01f000, 0x837ac540, + 0x0010d1c0, 0x0401f7fb, 0x42000000, 0x0010b854, + 0x0201f800, 0x0010aa47, 0x4967c857, 0x80026580, + 0x1c01f000, 0x83300480, 0x0010d1c0, 0x02001800, + 0x001005d8, 0x41580000, 0x81300480, 0x0402100c, + 0x04011000, 0x457a6000, 0x4a026202, 0x0000ffff, + 0x83300400, 0x00000003, 0x4803c840, 0x4a03c842, + 0x00000021, 0x8166c800, 0x1c01f000, 0x41540000, + 0x81300480, 0x02021800, 0x001005d8, 0x04011000, + 0x457a6000, 0x4a026202, 0x0000ffff, 0x83300400, + 0x00000003, 0x4803c840, 0x4a03c842, 0x00000021, + 0x59a80066, 0x49335065, 0x80000000, 0x48035066, + 0x1c01f000, 0x4d340000, 0x59326809, 0x59300406, + 0x82000500, 0x0000001f, 0x0c01f803, 0x5c026800, + 0x1c01f000, 0x00107966, 0x00107979, 0x00107993, + 0x000207c9, 0x001098f1, 0x0010990c, 0x0002083e, + 0x00107966, 0x00107979, 0x001064ee, 0x001079ac, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x001095a1, 0x0010a6c2, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x00107966, 0x00107966, 0x00107966, + 0x00107966, 0x59300203, 0x82000c80, 0x0000000e, + 0x02021800, 0x001005d8, 0x0c01f001, 0x001079aa, + 0x00108592, 0x000207dd, 0x00108720, 0x001087b9, + 0x001079aa, 0x001079aa, 0x001079aa, 0x00108577, + 0x001079aa, 0x001079aa, 0x001079aa, 0x001079aa, + 0x00108985, 0x83380480, 0x00000058, 0x04021007, + 0x83380480, 0x00000040, 0x04001004, 0x4d2c0000, + 0x0c01f803, 0x5c025800, 0x1c01f000, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861d, 0x001086bd, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x0010861b, 0x0010861b, + 0x0010861b, 0x0010861b, 0x001086c1, 0x000207ff, + 0x0010861b, 0x001086c0, 0x001086c2, 0x59325808, + 0x59300811, 0x59301402, 0x59340200, 0x8c00050e, + 0x0402001c, 0x0401f826, 0x04000005, 0x4a025a04, + 0x00000103, 0x497a5c09, 0x0401f009, 0x4a025a04, + 0x00000103, 0x4a025a06, 0x00000000, 0x497a5c09, + 0x800409c0, 0x02020800, 0x00108785, 0x48065807, + 0x480a5c06, 0x0201f800, 0x000202c1, 0x5934000f, + 0x5934140b, 0x80081040, 0x04001002, 0x480a6c0b, + 0x80000540, 0x02020800, 0x00020253, 0x0401f75e, + 0x592c020a, 0x8c000502, 0x040007e9, 0x800409c0, + 0x040007e7, 0x592c0208, 0x8c00050e, 0x040207e4, + 0x4933c857, 0x0201f000, 0x0010920f, 0x592c020a, + 0x8c000500, 0x04000010, 0x59300015, 0x592c380f, + 0x801c3c80, 0x0400000c, 0x4a025a06, 0x00000015, + 0x8c1c3d3e, 0x04000005, 0x4a025a06, 0x00000007, + 0x801c3880, 0x801c3800, 0x481fc857, 0x821c0d40, + 0x00000000, 0x1c01f000, 0x59300203, 0x82003480, + 0x0000000e, 0x02021800, 0x001005d8, 0x0c01f001, + 0x0010992b, 0x00020852, 0x00109fba, 0x00109fc8, + 0x0002086e, 0x0010992b, 0x0010a0a8, 0x0002088d, + 0x0010992b, 0x0010992b, 0x0010992b, 0x0010992b, + 0x0010992b, 0x0010992b, 0x83380580, 0x00000013, + 0x02020000, 0x00109f42, 0x59300403, 0x82027480, + 0x00000044, 0x02021800, 0x001005d8, 0x82000480, + 0x00000040, 0x02001800, 0x001005d8, 0x0c01f001, + 0x00109f9e, 0x00020864, 0x00109fa0, 0x00109fb2, + 0x59325808, 0x832c0500, 0x00ff0000, 0x04000005, + 0x592c0c0a, 0x8c040d1a, 0x02020000, 0x00109fad, + 0x0401fe91, 0x0401f710, 0x83380580, 0x00000048, + 0x04000007, 0x83380580, 0x00000053, 0x02000000, + 0x0010a04a, 0x0201f800, 0x001005d8, 0x5930001f, + 0x59301011, 0x59300809, 0x58040a00, 0x8c040d0e, + 0x02020000, 0x0010a026, 0x800811c0, 0x02020000, + 0x0010a033, 0x5930001f, 0x80000540, 0x02020000, + 0x0010a041, 0x59325808, 0x592c040a, 0x8c00051e, + 0x02000000, 0x0010a01c, 0x42027000, 0x00000041, + 0x0401f001, 0x83380480, 0x00000054, 0x02021800, + 0x001005d8, 0x83380480, 0x00000040, 0x02001000, + 0x0010a067, 0x0c01f001, 0x0010a073, 0x000208aa, + 0x0010a07f, 0x0010a086, 0x0010a073, 0x0010a073, + 0x0010a073, 0x0010a073, 0x0010a075, 0x0010a07a, + 0x0010a07a, 0x0010a073, 0x0010a073, 0x0010a073, + 0x0010a073, 0x0010a07a, 0x0010a073, 0x0010a07a, + 0x0010a073, 0x0010a075, 0x4a026203, 0x00000001, + 0x493a6403, 0x42000800, 0x80002042, 0x0401f672, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x14aa62b1, + 0x00000000, 0x00000000, 0x00000000, 0x00000005, + 0xfffffffb, 0x02800004, 0x00000000, 0x0000c000, + 0x0000071d, 0x073fca5a, 0x0705a5a5, 0x01928009, + 0x070ff0e1, 0x03800006, 0x04958010, 0x05308000, + 0x05008000, 0x0600902f, 0x04a004dc, 0x0202f051, + 0x042e4020, 0x018f021b, 0x033e5000, 0x03020000, + 0x078d0018, 0x0493041a, 0x0092041c, 0x038a0305, + 0x078b0303, 0x048e8010, 0x0678aae5, 0x06000001, + 0x07818174, 0x040010e6, 0x0448e0e6, 0x04818010, + 0x002fb008, 0x0448e0e6, 0x04818010, 0x060ff0e6, + 0x00580401, 0x054880ff, 0x04818010, 0x022a5001, + 0x030430d4, 0x06780043, 0x030e0000, 0x030450ff, + 0x06780043, 0x03019000, 0x058185c6, 0x027c0045, + 0x03020000, 0x06810037, 0x027c0045, 0x03040000, + 0x068100c7, 0x027c0045, 0x03080000, 0x0781061e, + 0x04908037, 0x029105c4, 0x010410a6, 0x0379ff41, + 0x037fffff, 0x072d6000, 0x07601241, 0x050f80ff, + 0x032fa009, 0x05600400, 0x050f80ff, 0x056c04ff, + 0x068105dc, 0x073fa009, 0x06000001, 0x0279ff02, + 0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff, + 0x045c0402, 0x048185dc, 0x060ff0d0, 0x0179feff, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x078105be, + 0x05600e41, 0x050f80ff, 0x032fa069, 0x07480000, + 0x068105d0, 0x06780043, 0x070000f0, 0x0781005f, + 0x037c00ff, 0x06000010, 0x0781005f, 0x038005cc, + 0x0379ff00, 0x070fffff, 0x06780043, 0x07f00000, + 0x075a0000, 0x020ef001, 0x028605ce, 0x05484000, + 0x02a1819e, 0x062d6001, 0x002fb001, 0x070ff069, + 0x01868072, 0x060ff079, 0x055c0441, 0x06810010, + 0x012fb000, 0x060560fb, 0x03800078, 0x060ff079, + 0x02868198, 0x070ff069, 0x055c0441, 0x06810010, + 0x060560fb, 0x0400d0d0, 0x062d6002, 0x0648300d, + 0x06810086, 0x070ff0d1, 0x062d6001, 0x045c040b, + 0x06810089, 0x05488000, 0x04818086, 0x072e500c, + 0x00208001, 0x05a004e1, 0x02800010, 0x062d6001, + 0x07f00000, 0x07f00000, 0x070ff0d1, 0x0179feff, + 0x070000ff, 0x055c040c, 0x058180bb, 0x0007b001, + 0x03079041, 0x0307a000, 0x06600a79, 0x050f80ff, + 0x053fa80a, 0x06000010, 0x072d5003, 0x078d0096, + 0x0307c003, 0x0007d004, 0x0107e005, 0x0307f006, + 0x02080007, 0x00081008, 0x01082009, 0x0308300a, + 0x0008400b, 0x0308500c, 0x068d00a1, 0x0678007a, + 0x07f00000, 0x010880ff, 0x03386000, 0x03010000, + 0x072e6300, 0x020ef07f, 0x02860010, 0x070ff07d, + 0x0450047c, 0x050f80ff, 0x002fa819, 0x068d00ae, + 0x02080001, 0x00081002, 0x0448807a, 0x068100b5, + 0x0379ff03, 0x070000ff, 0x01082003, 0x068d00b6, + 0x02386004, 0x03010000, 0x072e6c00, 0x02800010, + 0x06780043, 0x070000f0, 0x078105d7, 0x050020ff, + 0x027c0002, 0x06000010, 0x078100c3, 0x038005d7, + 0x0700c0d1, 0x0379ff0c, 0x070000ff, 0x0380008e, + 0x0204a051, 0x06780043, 0x070000f0, 0x037c00ff, + 0x06000010, 0x0781816a, 0x072d6000, 0x019485c0, + 0x050fb056, 0x044880e6, 0x04818010, 0x060ff0d0, + 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, + 0x078105be, 0x05a00212, 0x0349c0e4, 0x0781811d, + 0x070ff093, 0x050010ff, 0x070ff093, 0x045c0401, + 0x058180db, 0x02046092, 0x04002046, 0x04600202, + 0x00540401, 0x048280e6, 0x04500425, 0x070060ff, + 0x0730ffff, 0x0700000f, 0x0742000f, 0x05810190, + 0x07a005a6, 0x0648a002, 0x048180e9, 0x00047089, + 0x070ff047, 0x045c0443, 0x077800ff, 0x07f00000, + 0x0781818e, 0x07780047, 0x0500e000, 0x048185ad, + 0x070ff006, 0x01860117, 0x0179fe47, 0x0700000f, + 0x010480ff, 0x056c7048, 0x06818102, 0x007a0d4a, + 0x04003801, 0x0220f001, 0x0180010f, 0x07608e48, + 0x034a60ff, 0x0700f0ff, 0x074b88ff, 0x037000ff, + 0x07000600, 0x05500448, 0x074d00ff, 0x045a044a, + 0x0304a0ff, 0x070ff00f, 0x01540406, 0x05820117, + 0x04950120, 0x05a001bd, 0x02868123, 0x0134bfff, + 0x070fffff, 0x0104102e, 0x050fd041, 0x00800126, + 0x0595011d, 0x05a001bd, 0x0186011d, 0x0202f00e, + 0x052e4030, 0x040fd02f, 0x070fc0ff, 0x05a00218, + 0x02800010, 0x0400e02f, 0x042e4020, 0x0202f051, + 0x0004100e, 0x0004b00e, 0x050fd041, 0x024a6c46, + 0x04500423, 0x050070ff, 0x03620024, 0x050080ff, + 0x04004046, 0x0700500f, 0x03206000, 0x05601048, + 0x0700a0ff, 0x0700900a, 0x070ff005, 0x04500446, + 0x00540425, 0x04820157, 0x05601622, 0x050f80ff, + 0x063fa032, 0x06000002, 0x03203000, 0x01204000, + 0x03205000, 0x0120b000, 0x0320c000, 0x07601441, + 0x050f80ff, 0x043fa852, 0x06000001, 0x070ff056, + 0x056c02ff, 0x050fb0ff, 0x070560ff, 0x03079041, + 0x05600e41, 0x050f80ff, 0x073fa011, 0x0600003d, + 0x06780043, 0x07f00000, 0x065a007a, 0x010880ff, + 0x04a001b6, 0x058d0150, 0x0208a04a, 0x0108b04b, + 0x02386001, 0x03010000, 0x072e6300, 0x028000a8, + 0x0500d00a, 0x05500405, 0x014a68ff, 0x070090ff, + 0x0154040a, 0x0700c0ff, 0x0600a023, 0x0500b024, + 0x02206001, 0x05601622, 0x050f80ff, 0x063fa04a, + 0x06000002, 0x05601022, 0x050f80ff, 0x043fa819, + 0x06000001, 0x0600a00d, 0x0180013c, 0x06780043, + 0x070000f0, 0x050010ff, 0x027c0001, 0x07000030, + 0x078105b4, 0x027c0001, 0x06000020, 0x078105b4, + 0x038005cc, 0x054880ff, 0x06810010, 0x070ff056, + 0x050fb0ff, 0x044880e5, 0x0581017d, 0x044880e6, + 0x04818010, 0x00800183, 0x056c02ff, 0x050fb0ff, + 0x070560ff, 0x072e5300, 0x044880e6, 0x04818010, + 0x072d5003, 0x06780043, 0x07f00000, 0x010880ff, + 0x058d0187, 0x03386005, 0x03010000, 0x033e6000, + 0x0700000c, 0x052e5200, 0x02800010, 0x0120918e, + 0x018004e4, 0x01209190, 0x018004e4, 0x00209192, + 0x018004e4, 0x03209000, 0x018004e4, 0x01209196, + 0x018004e4, 0x00209198, 0x018004e4, 0x02493075, + 0x06810510, 0x0120919a, 0x018004e4, 0x06601e01, + 0x050f80ff, 0x063fa029, 0x06000008, 0x02015010, + 0x02016051, 0x00017051, 0x00011051, 0x05601a41, + 0x050f80ff, 0x053fa83a, 0x06000008, 0x05600e41, + 0x050f80ff, 0x01464000, 0x032fa00a, 0x07006011, + 0x05007012, 0x04008013, 0x07009014, 0x0600a015, + 0x0400b016, 0x0700c017, 0x07c00000, 0x072d5003, + 0x06601479, 0x050f80ff, 0x048d01b9, 0x063fa051, + 0x0600003e, 0x07c00000, 0x06005051, 0x0400e02c, + 0x0660060e, 0x050f80ff, 0x032fa009, 0x0379ff00, + 0x070000ff, 0x076c0000, 0x058101dd, 0x0660480e, + 0x0500e0ff, 0x034000ff, 0x01540427, 0x0582020a, + 0x03400005, 0x070ff005, 0x055c0428, 0x0481020e, + 0x01680e05, 0x056c0405, 0x068181bf, 0x040f8029, + 0x053fa809, 0x07000024, 0x06600649, 0x050f80ff, + 0x032fa009, 0x0379ff00, 0x070000ff, 0x076c0000, + 0x068181bf, 0x0400e049, 0x0340002d, 0x050f802b, + 0x053fa80a, 0x06000016, 0x0660480e, 0x0302c0ff, + 0x034000ff, 0x01540427, 0x0582020c, 0x072d6000, + 0x0460040e, 0x050f80ff, 0x0104e0d1, 0x0379ff4e, + 0x0700ffff, 0x062d6002, 0x032fa009, 0x0004d0d0, + 0x074b004d, 0x07780000, 0x07ffff00, 0x055a044d, + 0x070000ff, 0x00201008, 0x04002051, 0x06003051, + 0x05304000, 0x07000060, 0x03205009, 0x07006022, + 0x0460040e, 0x050f80ff, 0x032fa03a, 0x06603c0e, + 0x050f80ff, 0x073fa00a, 0x07000027, 0x050010d1, + 0x0460320e, 0x050f80ff, 0x012fa80a, 0x060ff00e, + 0x055c042e, 0x04810210, 0x07c00000, 0x0400e026, + 0x008001cb, 0x0202c026, 0x008001e6, 0x0500e02e, + 0x008001e6, 0x0400e051, 0x01800209, 0x0349c0e4, + 0x04810215, 0x07c00000, 0x013e4000, 0x070c0000, + 0x07c00000, 0x013e4000, 0x03080000, 0x07c00000, + 0x009702f4, 0x022a5002, 0x0790821d, 0x00910291, + 0x030400a6, 0x0678aae5, 0x06000001, 0x00a1860e, + 0x06600c40, 0x050f80ff, 0x032fa021, 0x074b0000, + 0x076c0600, 0x07818293, 0x05600403, 0x050f80ff, + 0x073fa009, 0x06000002, 0x0279ff04, 0x0700ffff, + 0x010440d7, 0x0179fe44, 0x0700ffff, 0x045c0404, + 0x07818295, 0x0349f044, 0x0681829e, 0x02495001, + 0x06818297, 0x060ff079, 0x045c0440, 0x0781823c, + 0x0644f07a, 0x002fb008, 0x060ff079, 0x045c0440, + 0x07818241, 0x0644f07a, 0x002fb008, 0x0648f001, + 0x07818288, 0x04600e40, 0x050f80ff, 0x06480001, + 0x04810257, 0x0448e001, 0x04810273, 0x02460001, + 0x0644f001, 0x012fa80a, 0x04008040, 0x05a004ee, + 0x0286828c, 0x05a004d8, 0x062da001, 0x013e4000, + 0x06000080, 0x06930013, 0x02920013, 0x02800010, + 0x0644f001, 0x012fa80a, 0x020ef002, 0x00860275, + 0x04600840, 0x050f80ff, 0x053fa809, 0x06000002, + 0x05780105, 0x00800440, 0x017c0105, 0x05000400, + 0x06818275, 0x06601e02, 0x050f80ff, 0x053fa809, + 0x06000002, 0x04602a40, 0x050f80ff, 0x070ff005, + 0x053fa809, 0x06000002, 0x055c0405, 0x06818275, + 0x04008040, 0x0045e008, 0x05a004d8, 0x00800251, + 0x0644f001, 0x012fa80a, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x06480001, + 0x07818281, 0x05308000, 0x03040000, 0x06009040, + 0x04a004dc, 0x00800251, 0x06a0060e, 0x054b0800, + 0x056a0700, 0x06600c40, 0x050f80ff, 0x032fa00a, + 0x00800251, 0x013e4000, 0x06000080, 0x01209288, + 0x018004e4, 0x06009008, 0x05308000, 0x05004000, + 0x04a004dc, 0x00800251, 0x02209002, 0x008002e5, + 0x03209000, 0x008002e5, 0x02209004, 0x008002e5, + 0x04a002fd, 0x062da001, 0x05308000, 0x05002000, + 0x06009040, 0x04a004dc, 0x02800013, 0x013e4000, + 0x06000080, 0x02495001, 0x078182db, 0x04600840, + 0x050f80ff, 0x053fa809, 0x06000001, 0x0721f000, + 0x0349f003, 0x058102aa, 0x0245f01f, 0x06000002, + 0x018602db, 0x07601400, 0x050f80ff, 0x012fa809, + 0x06480001, 0x058102db, 0x06602440, 0x050f80ff, + 0x012fa809, 0x020ef001, 0x038682db, 0x019b02db, + 0x050020d8, 0x062da001, 0x06303002, 0x05000430, + 0x04600440, 0x050f80ff, 0x073fa012, 0x06000001, + 0x028f82bf, 0x050040d8, 0x062da001, 0x07601e00, + 0x050f80ff, 0x073fa009, 0x06000001, 0x060ff004, + 0x00540402, 0x048202d9, 0x06005051, 0x06006051, + 0x06602240, 0x050f80ff, 0x063fa01a, 0x06000002, + 0x06600a40, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x060ff040, 0x045a041f, 0x010eb0ff, 0x06930013, + 0x02920013, 0x02800010, 0x04004002, 0x018002c9, + 0x04a002fd, 0x062da001, 0x05308000, 0x07005000, + 0x06009040, 0x04a004dc, 0x050080d8, 0x05a004e1, + 0x062da001, 0x02800013, 0x050fd009, 0x050fd041, + 0x013e4000, 0x06000080, 0x05308000, 0x03013000, + 0x04a004dc, 0x010440d7, 0x0349f044, 0x048102f2, + 0x062da001, 0x008f02f2, 0x03e00000, 0x062da001, + 0x02800013, 0x0249c0e5, 0x06810013, 0x062da001, + 0x07f00000, 0x07f00000, 0x033e5000, 0x070c0000, + 0x018f02f6, 0x03800011, 0x050020d8, 0x04600440, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x07c00000, + 0x002fb001, 0x03800306, 0x012fb000, 0x03075087, + 0x068d0307, 0x03386000, 0x03020000, 0x04482075, + 0x06810352, 0x0648a0e6, 0x07810347, 0x0642007f, + 0x06810345, 0x0340007e, 0x060ff038, 0x0154047e, + 0x02d00334, 0x0560027d, 0x050f80ff, 0x032fa009, + 0x030ef000, 0x02860504, 0x0107d000, 0x05600800, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x04500420, + 0x050f80ff, 0x073fa009, 0x0700003f, 0x03800311, + 0x070ff07d, 0x0450047c, 0x050f80ff, 0x002fa819, + 0x078d0327, 0x02080001, 0x00081002, 0x0448807a, + 0x0781032e, 0x0379ff03, 0x070000ff, 0x01082003, + 0x068d032f, 0x02386004, 0x03010000, 0x072e6c00, + 0x02800352, 0x0380033a, 0x0380033c, 0x0280033e, + 0x02800340, 0x03800342, 0x03800344, 0x0727c005, + 0x02800323, 0x0627c008, 0x02800323, 0x0627c00b, + 0x02800323, 0x0627c00e, 0x02800323, 0x0727c011, + 0x02800323, 0x03800314, 0x052e6800, 0x02800352, + 0x044880e6, 0x07810533, 0x052e6200, 0x070ff088, + 0x0179feff, 0x070fffff, 0x04818501, 0x060ff083, + 0x0086836d, 0x033e6000, 0x07000003, 0x068d0352, + 0x07286000, 0x07f00000, 0x078d0355, 0x038c0306, + 0x0648c0e6, 0x05818372, 0x0448e0e6, 0x0781036a, + 0x004920e6, 0x07810365, 0x07a0056f, 0x05001088, + 0x00700101, 0x03100000, 0x00088001, 0x033e6000, + 0x07000088, 0x03800560, 0x02386001, 0x07030000, + 0x033e6000, 0x06000008, 0x028003f1, 0x02799075, + 0x0500040f, 0x06810010, 0x06601479, 0x050080ff, + 0x06309052, 0x0600003e, 0x02800376, 0x06602279, + 0x050080ff, 0x05309812, 0x07000041, 0x0648007a, + 0x0781037e, 0x04488075, 0x0581837e, 0x040f8008, + 0x070fa009, 0x0049107a, 0x01a183f3, 0x00798075, + 0x06000507, 0x05818521, 0x0448b075, 0x06810385, + 0x02493075, 0x0681050e, 0x0249c0e6, 0x048183e0, + 0x0648c0e6, 0x0581839a, 0x068d0389, 0x02386001, + 0x07030000, 0x0049107a, 0x07810390, 0x020ef083, + 0x0386039a, 0x06483075, 0x068103ef, 0x0678007a, + 0x07000035, 0x03a184cf, 0x05308000, 0x07060000, + 0x06009079, 0x04a004dc, 0x028003ef, 0x0448807a, + 0x0681039e, 0x06483075, 0x058104f9, 0x0448d07a, + 0x068103a2, 0x06483075, 0x058104f9, 0x068d03a2, + 0x02386001, 0x07030000, 0x0444e07a, 0x0648307a, + 0x048183c7, 0x0448707a, 0x068103ea, 0x0648f07a, + 0x078103b2, 0x05a004cf, 0x04008079, 0x05a004ee, + 0x008683c2, 0x05a004d8, 0x028003ef, 0x0560107b, + 0x050f80ff, 0x032fa009, 0x0349c000, 0x058183c0, + 0x04600e79, 0x050f80ff, 0x073fa00a, 0x0600003d, + 0x06600a79, 0x050f80ff, 0x053fa80a, 0x06000010, + 0x028003ef, 0x0046e07a, 0x028003ea, 0x06009008, + 0x05308000, 0x05004000, 0x04a004dc, 0x028003ef, + 0x0560167b, 0x050f80ff, 0x032fa011, 0x070ff000, + 0x04500401, 0x030460ff, 0x060ff025, 0x00540446, + 0x078203d1, 0x030460ff, 0x04092046, 0x05a00218, + 0x06600679, 0x050f80ff, 0x00201007, 0x012fa80a, + 0x0046047a, 0x034630ff, 0x050020ff, 0x06003051, + 0x04600e79, 0x050f80ff, 0x073fa012, 0x06000001, + 0x028003ef, 0x033e6a00, 0x0202000e, 0x02079051, + 0x07000088, 0x078d03e4, 0x0744c000, 0x01088000, + 0x03386006, 0x03010000, 0x02800010, 0x05a004cf, + 0x05308000, 0x03020000, 0x06009079, 0x04a004dc, + 0x033e6a00, 0x0302000a, 0x02079051, 0x02800010, + 0x04603e79, 0x050f80ff, 0x032fa009, 0x070ff000, + 0x0186040c, 0x057dfeff, 0x07ffffff, 0x0581040c, + 0x050f8000, 0x012fa811, 0x0079fe02, 0x070000ff, + 0x077d66ff, 0x060000dc, 0x0781840c, 0x060ff001, + 0x0286840d, 0x064b0002, 0x06420002, 0x060ff002, + 0x05500400, 0x050f80ff, 0x05004084, 0x073fa00a, + 0x06000002, 0x07c00000, 0x04600201, 0x050f80ff, + 0x073fa009, 0x06000001, 0x0079fe02, 0x070000ff, + 0x077d72ff, 0x070000dd, 0x0781840c, 0x064b0002, + 0x06420002, 0x06000001, 0x01800406, 0x0605004c, + 0x0180041e, 0x0493041a, 0x04a004d5, 0x054bc450, + 0x05810421, 0x01d00422, 0x01800421, 0x00800432, + 0x00800434, 0x00800432, 0x008004a7, 0x0180043f, + 0x00800434, 0x01800471, 0x00800432, 0x00800432, + 0x008004ab, 0x00800432, 0x018004af, 0x008004c4, + 0x01800488, 0x00800432, 0x00800432, 0x00209432, + 0x018004e4, 0x0379ff50, 0x070fffff, 0x060ff079, + 0x055c0450, 0x048104a4, 0x002fb008, 0x060ff079, + 0x055c0450, 0x058104a3, 0x04a004c7, 0x0180049c, + 0x0179fe50, 0x070fffff, 0x070050ff, 0x060ff079, + 0x055c0405, 0x04810449, 0x002fb008, 0x060ff079, + 0x055c0405, 0x078184a0, 0x070ff087, 0x017980ff, + 0x06000507, 0x06818451, 0x02203040, 0x05002087, + 0x0049d002, 0x0481046b, 0x04930458, 0x01257000, + 0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030, + 0x0304c050, 0x02400057, 0x06740057, 0x06000002, + 0x06820016, 0x04002083, 0x07003084, 0x04004085, + 0x06602279, 0x050f80ff, 0x063fa01a, 0x06000001, + 0x05a004cf, 0x07a00578, 0x033e6a00, 0x0302000a, + 0x062e5020, 0x003e4002, 0x07000a00, 0x028003f1, + 0x07420003, 0x0781844e, 0x00798002, 0x06000507, + 0x06818451, 0x0180045c, 0x05930478, 0x01257000, + 0x073c3fff, 0x0700000f, 0x052e4003, 0x072e5030, + 0x0304c050, 0x067800e6, 0x07000041, 0x0581047d, + 0x07a00581, 0x04818016, 0x002fb008, 0x067800e6, + 0x07000041, 0x04810483, 0x07a00581, 0x04818016, + 0x062e5020, 0x003e4002, 0x07000a00, 0x03e00000, + 0x02800010, 0x0379ff50, 0x070fffff, 0x060ff079, + 0x055c0450, 0x0781848e, 0x0245507a, 0x002fb008, + 0x060ff079, 0x055c0450, 0x07818493, 0x0245507a, + 0x002fb008, 0x05600e50, 0x050f80ff, 0x012fa809, + 0x02455001, 0x05600e50, 0x050f80ff, 0x012fa80a, + 0x0080049d, 0x002fb008, 0x003e4002, 0x07000a00, + 0x02800016, 0x079384a3, 0x062e5020, 0x042e4002, + 0x002fb008, 0x013e4000, 0x05000e00, 0x02800016, + 0x0179fe50, 0x070fffff, 0x010210ff, 0x02800016, + 0x0179fe50, 0x070fffff, 0x050340ff, 0x0080049d, + 0x0179fe50, 0x070fffff, 0x0102e0ff, 0x0760282e, + 0x050f80ff, 0x05222000, 0x07223000, 0x05224000, + 0x07225000, 0x07226000, 0x05227000, 0x05228000, + 0x07229000, 0x0722a000, 0x0522b000, 0x063fa051, + 0x07000011, 0x0202c026, 0x0522d000, 0x052e400c, + 0x02800016, 0x030430d4, 0x062e5008, 0x00800176, + 0x05600e50, 0x050f80ff, 0x032fa009, 0x03460000, + 0x018004d2, 0x0246007a, 0x0045207a, 0x008004d0, + 0x0246007a, 0x0600007a, 0x04600e79, 0x050f80ff, + 0x032fa00a, 0x07c00000, 0x029284d5, 0x070500e1, + 0x07c00000, 0x0245f008, 0x048404d9, 0x020e0008, + 0x07c00000, 0x070ff009, 0x065a0008, 0x058404de, + 0x020e0008, 0x07c00000, 0x058404e1, 0x020e0008, + 0x07c00000, 0x05308000, 0x0500d000, 0x04a004dc, + 0x04a004e9, 0x02800010, 0x052e4300, 0x072e500c, + 0x073c3fff, 0x0700000f, 0x07c00000, 0x06602208, + 0x050f80ff, 0x032fa011, 0x076a0000, 0x068184f7, + 0x066a0001, 0x048104f7, 0x04002051, 0x07c00000, + 0x00202001, 0x07c00000, 0x0648307a, 0x00a18608, + 0x05a004cc, 0x05308000, 0x05001000, 0x06009079, + 0x04a004dc, 0x03800560, 0x0249c0e6, 0x058104f9, + 0x0280036d, 0x0648307a, 0x07818196, 0x05a004cf, + 0x05308000, 0x03013000, 0x03209006, 0x04a004dc, + 0x033e6000, 0x07030000, 0x02800345, 0x02490075, + 0x0781051e, 0x04002089, 0x04780102, 0x07f00000, + 0x05001088, 0x07a0056f, 0x04740101, 0x03100000, + 0x060ff002, 0x045c0401, 0x0481851f, 0x00088001, + 0x033e6000, 0x070000c0, 0x0380055c, 0x07f00000, + 0x0220951f, 0x018004e4, 0x0648307a, 0x07810527, + 0x06780075, 0x06000007, 0x0581852e, 0x06a00608, + 0x06486075, 0x06818194, 0x02490075, 0x0781819a, + 0x04487075, 0x05818536, 0x0280053d, 0x05308000, + 0x03010000, 0x06009079, 0x04a004dc, 0x02800010, + 0x0448e0e6, 0x04818352, 0x00800192, 0x05308000, + 0x0500e000, 0x06009079, 0x04a004dc, 0x04008089, + 0x05a004e1, 0x0380055c, 0x05a004cc, 0x05308000, + 0x0700f000, 0x06009079, 0x07000088, 0x06a00545, + 0x04a004dc, 0x02800010, 0x03386000, 0x07030000, + 0x07f00000, 0x078d0548, 0x033e6a00, 0x0202000e, + 0x02079051, 0x0448b075, 0x07810553, 0x02493075, + 0x07810553, 0x05301005, 0x03010000, 0x03800555, + 0x05301006, 0x03010000, 0x05002087, 0x06485002, + 0x05818555, 0x0744c000, 0x01088000, 0x02086001, + 0x07c00000, 0x05001088, 0x07a0056f, 0x0644c001, + 0x00088001, 0x033e6a00, 0x0202000e, 0x004920e6, + 0x05818565, 0x02079051, 0x078d0565, 0x060ff089, + 0x034990ff, 0x0781056c, 0x03386005, 0x03010000, + 0x02800010, 0x03386006, 0x03010000, 0x02800010, + 0x078d056f, 0x03386000, 0x07030000, 0x07f00000, + 0x068d0573, 0x070ff087, 0x074850ff, 0x05818574, + 0x07c00000, 0x078d0578, 0x02386001, 0x07030000, + 0x07f00000, 0x068d057c, 0x070ff087, 0x074850ff, + 0x0581857d, 0x07c00000, 0x05002087, 0x0049d002, + 0x05818590, 0x002fb008, 0x067800e6, 0x07000041, + 0x002fb008, 0x05818590, 0x07a005a6, 0x0448e002, + 0x07810593, 0x0648a002, 0x0481859d, 0x06486002, + 0x06810597, 0x02400057, 0x056a02ff, 0x07c00000, + 0x07a005a6, 0x06788102, 0x06000004, 0x05818590, + 0x04002089, 0x070ff0d4, 0x045c0402, 0x077800ff, + 0x07f00000, 0x05818590, 0x00202010, 0x038c0590, + 0x07f00000, 0x06420002, 0x0481859e, 0x07a00578, + 0x033e6a00, 0x0302000a, 0x07c00000, 0x07f00000, + 0x060ff0a2, 0x050020ff, 0x060ff0a2, 0x045c0402, + 0x048185a7, 0x07c00000, 0x05a00218, 0x03495047, + 0x078105b2, 0x0320901d, 0x02800604, 0x0220901f, + 0x02800604, 0x014980e4, 0x04818010, 0x013e4000, + 0x07003000, 0x05600e35, 0x050f80ff, 0x07a006fc, + 0x01208003, 0x05a004e1, 0x038005cc, 0x03209009, + 0x02800604, 0x03209011, 0x02800604, 0x02209007, + 0x02800604, 0x03209003, 0x02800604, 0x00498043, + 0x058185be, 0x00497043, 0x048185c2, 0x02209001, + 0x02800604, 0x0220900d, 0x02800604, 0x0320900f, + 0x02800604, 0x03493000, 0x068105d5, 0x027c0045, + 0x070a0000, 0x078105de, 0x0220900b, 0x02800604, + 0x02209013, 0x05308000, 0x01012000, 0x04a004dc, + 0x00800183, 0x03209005, 0x02800604, 0x072e500c, + 0x00208002, 0x05a004e1, 0x02800010, 0x02209015, + 0x02800604, 0x072d6000, 0x05308000, 0x05007000, + 0x07f00000, 0x070090d1, 0x0379ff09, 0x0700ffff, + 0x04a004dc, 0x03209017, 0x02800604, 0x033e5000, + 0x06000080, 0x02209019, 0x02800604, 0x072d6000, + 0x033e5000, 0x06000080, 0x07f00000, 0x060ff0d0, + 0x0179feff, 0x0700ffff, 0x057dfeff, 0x0700ffff, + 0x04818010, 0x02400058, 0x00642058, 0x06820010, + 0x033e5000, 0x06000080, 0x04058051, 0x0320901b, + 0x02800604, 0x05308000, 0x01012000, 0x04a004dc, + 0x00800176, 0x05a00218, 0x05308000, 0x05008000, + 0x06009079, 0x04a004dc, 0x07c00000, 0x034900e4, + 0x05818618, 0x013e4000, 0x070000c0, 0x07f00000, + 0x034900e4, 0x04818616, 0x07c00000, 0x013e4000, + 0x06000080, 0x07f00000, 0x07f00000, 0x07f00000, + 0x034900e4, 0x06810610, 0x03800618, 0x072d6000, + 0x00498043, 0x06810632, 0x060ff0d0, 0x0179feff, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x058185e2, + 0x050f8030, 0x032fa009, 0x0379ff00, 0x0700ffff, + 0x070ff0d1, 0x0179feff, 0x0700ffff, 0x055c0400, + 0x078105e2, 0x04004051, 0x0280067a, 0x06a006dc, + 0x062d6001, 0x020ef004, 0x038605e4, 0x06600004, + 0x050f80ff, 0x032fa009, 0x074b0000, 0x05002000, + 0x0769ff00, 0x01640800, 0x078205e4, 0x01640e00, + 0x058285e4, 0x070ff036, 0x045c0404, 0x0581864d, + 0x072d6000, 0x050f8030, 0x032fa009, 0x0379ff00, + 0x0700ffff, 0x070ff0d1, 0x0179feff, 0x0700ffff, + 0x055c0400, 0x078105e2, 0x04482034, 0x078105ff, + 0x06483034, 0x058185ff, 0x070ff0d4, 0x077800ff, + 0x070000f0, 0x037c00ff, 0x06000010, 0x0681067a, + 0x06a006d6, 0x024900e5, 0x0681065d, 0x033e5000, + 0x06000080, 0x02800010, 0x04601c04, 0x050f80ff, + 0x053fa809, 0x06000020, 0x030ef041, 0x038605ee, + 0x062d6002, 0x05602a41, 0x050f80ff, 0x012fa809, + 0x060ff0d0, 0x074b00ff, 0x045c0401, 0x05818678, + 0x062d6001, 0x07602841, 0x050f80ff, 0x053fa809, + 0x06000001, 0x070ff0d1, 0x054b80ff, 0x074b0003, + 0x055c0403, 0x05818678, 0x033e5000, 0x06000080, + 0x0080070e, 0x07600041, 0x0280065e, 0x06a006d6, + 0x024900e5, 0x06810680, 0x033e5000, 0x06000080, + 0x02800010, 0x06a006c2, 0x030ef041, 0x028605f2, + 0x04058051, 0x072d6000, 0x05601041, 0x050f80ff, + 0x012fa809, 0x0600a0d0, 0x0500b0d1, 0x062d6001, + 0x07f00000, 0x07f00000, 0x0600c0d0, 0x0500d0d1, + 0x062d6002, 0x0279ff0d, 0x07ff0000, 0x044d800d, + 0x060ff0d0, 0x074b00ff, 0x065a000d, 0x06601201, + 0x050f80ff, 0x073fa022, 0x07000005, 0x0079fe0d, + 0x070000ff, 0x050020ff, 0x05602a41, 0x050f80ff, + 0x073fa00a, 0x06000001, 0x020ef004, 0x028606bf, + 0x04601c04, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050f80ff, 0x053fa80a, 0x06000020, 0x07602841, + 0x050f80ff, 0x073fa009, 0x06000001, 0x0279ff02, + 0x070000ff, 0x0678000d, 0x0700ff00, 0x065a0002, + 0x07602841, 0x050f80ff, 0x073fa00a, 0x06000001, + 0x07600041, 0x050f80ff, 0x053fa80a, 0x06000001, + 0x07601241, 0x050f80ff, 0x073fa00a, 0x06000002, + 0x033e5000, 0x06000080, 0x0080070e, 0x040f8032, + 0x073fa011, 0x06000001, 0x060ff002, 0x055c0403, + 0x058186ca, 0x00041051, 0x07c00000, 0x04600402, + 0x04500432, 0x050f80ff, 0x053fa809, 0x06000020, + 0x00400402, 0x01680eff, 0x070030ff, 0x040f8032, + 0x053fa80a, 0x06000001, 0x07c00000, 0x024900e5, + 0x068106d9, 0x07c00000, 0x033e5000, 0x070000c0, + 0x07c00000, 0x05004036, 0x060000d0, 0x0179fe00, + 0x0700ffff, 0x057dfeff, 0x0700ffff, 0x068106fb, + 0x070000d1, 0x0379ff00, 0x0700ffff, 0x06005051, + 0x060ff031, 0x05500405, 0x050f80ff, 0x073fa009, + 0x06000002, 0x020ef004, 0x038606f5, 0x04600404, + 0x050f80ff, 0x012fa809, 0x0079fe01, 0x0700ffff, + 0x055c0400, 0x068106fb, 0x01400405, 0x070050ff, + 0x057de0ff, 0x06000007, 0x058186e7, 0x04004051, + 0x07c00000, 0x072d6000, 0x07f00000, 0x07f00000, + 0x000110d0, 0x010120d1, 0x062d6001, 0x07f00000, + 0x07f00000, 0x020130d0, 0x010140d1, 0x062d6002, + 0x010170d4, 0x07f00000, 0x020150d0, 0x030160d1, + 0x053fa83a, 0x06000008, 0x07c00000, 0x07600c41, + 0x050f80ff, 0x073fa009, 0x06000001, 0x04780102, + 0x07ffff00, 0x046a0702, 0x050f80ff, 0x073fa00a, + 0x06000001, 0x05600e41, 0x050f80ff, 0x032fa069, + 0x03800053, 0xba6b4e34, 0x02800004, 0x00000000, + 0x00008000, 0x00000518, 0x040f801f, 0x012fa8c9, + 0x040f801f, 0x073fa081, 0x06000010, 0x03200005, + 0x07420000, 0x050fb000, 0x040f801f, 0x073fa011, + 0x06000038, 0x040f801f, 0x053fa859, 0x0700003a, + 0x050fe000, 0x0581800a, 0x0684003d, 0x04958019, + 0x030e0011, 0x072e4200, 0x03800014, 0x0291001f, + 0x050010c0, 0x04482001, 0x058180e8, 0x06483001, + 0x0781814b, 0x02920029, 0x068b0029, 0x018a0150, + 0x050010c0, 0x06780001, 0x050007c0, 0x06818223, + 0x06780001, 0x0500f800, 0x07818263, 0x03910030, + 0x040fe029, 0x03860030, 0x076c001d, 0x04810294, + 0x076c0a1d, 0x048102b9, 0x0292003d, 0x040fe02f, + 0x0286003d, 0x06000013, 0x050fb000, 0x066c0073, + 0x068103c2, 0x0297003d, 0x014920e4, 0x0481803d, + 0x03400000, 0x076c0a00, 0x04818034, 0x0796003f, + 0x03b900b8, 0x05908014, 0x010170e1, 0x07780017, + 0x03e00000, 0x06810092, 0x050010ff, 0x0179fe17, + 0x031fffff, 0x070000ff, 0x05600800, 0x050f80ff, + 0x073fa009, 0x06000001, 0x06780002, 0x02800040, + 0x037c00ff, 0x03800000, 0x0681005e, 0x0249f002, + 0x068100ab, 0x0448e002, 0x0681005e, 0x07600c00, + 0x050f80ff, 0x073fa009, 0x06000001, 0x06780002, + 0x07ffff00, 0x037c00ff, 0x05000200, 0x048180ab, + 0x064bd401, 0x03d00060, 0x038000a9, 0x02800068, + 0x03800072, 0x0280007c, 0x02800086, 0x03800090, + 0x038000a9, 0x038000a9, 0x050fe027, 0x0186806c, + 0x01028000, 0x0380006f, 0x07600027, 0x050f80ff, + 0x032fa00a, 0x01027000, 0x02400029, 0x028000ab, + 0x040fe025, 0x00868076, 0x03026000, 0x02800079, + 0x06600025, 0x050f80ff, 0x032fa00a, 0x03025000, + 0x02400029, 0x028000ab, 0x050fe021, 0x00868080, + 0x01022000, 0x02800083, 0x07600021, 0x050f80ff, + 0x032fa00a, 0x01021000, 0x02400029, 0x028000ab, + 0x040fe023, 0x0086808a, 0x01024000, 0x0380008d, + 0x06600023, 0x050f80ff, 0x032fa00a, 0x03023000, + 0x02400029, 0x028000ab, 0x06a000c8, 0x028000ab, + 0x01640817, 0x058280a9, 0x070ff017, 0x03d00096, + 0x0280009e, 0x038000a0, 0x038000a3, 0x038000a6, + 0x038000a9, 0x038000a9, 0x038000a9, 0x038000a9, + 0x03e00000, 0x03800014, 0x059080a0, 0x030160e1, + 0x028000ab, 0x059080a3, 0x030150e1, 0x028000ab, + 0x059080a6, 0x010140e1, 0x028000ab, 0x060fc013, + 0x06a00510, 0x03800014, 0x072e4800, 0x07000012, + 0x038000bb, 0x0747f000, 0x05600800, 0x050f80ff, + 0x012fa809, 0x0249f001, 0x078100bb, 0x01012000, + 0x052e4c00, 0x07c00000, 0x070000eb, 0x0349f000, + 0x058180af, 0x05600800, 0x050f80ff, 0x012fa809, + 0x0448e001, 0x068100c1, 0x07c00000, 0x0079c101, + 0x07ffffff, 0x027a4b01, 0x03800000, 0x05600800, + 0x050f80ff, 0x012fa80a, 0x07600c00, 0x050f80ff, + 0x012fa821, 0x06780001, 0x07ffff00, 0x037c00ff, + 0x05000700, 0x078100dd, 0x06601804, 0x070030ff, + 0x050f80ff, 0x012fa809, 0x05002000, 0x050f8003, + 0x073fa00a, 0x06000001, 0x040fe001, 0x038600de, + 0x04600201, 0x050f80ff, 0x032fa00a, 0x07c00000, + 0x050fe02e, 0x008680e3, 0x0102e000, 0x0302f000, + 0x038000e7, 0x0760002e, 0x050f80ff, 0x032fa00a, + 0x0102e000, 0x07c00000, 0x022c0004, 0x056c041d, + 0x078100fc, 0x056c021d, 0x04810113, 0x056c081d, + 0x04810125, 0x076c061d, 0x0581013f, 0x0521d000, + 0x0202c013, 0x0202a013, 0x02020013, 0x0460021a, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x03b600ac, + 0x0484801f, 0x0280003d, 0x040fe02a, 0x028600f2, + 0x06000013, 0x04001013, 0x0560102b, 0x050f80ff, + 0x032fa012, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x00860110, + 0x01028003, 0x0660002a, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x00800140, 0x00028013, 0x00027013, + 0x00800140, 0x040fe02a, 0x028600f1, 0x06420029, + 0x0660002a, 0x050f80ff, 0x053fa809, 0x06000001, + 0x050fe003, 0x01860122, 0x03026003, 0x0660002a, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x00800140, + 0x02026013, 0x02025013, 0x00800140, 0x040fe02a, + 0x028600f1, 0x06420029, 0x0660002a, 0x050f80ff, + 0x053fa809, 0x06000001, 0x050fe003, 0x00860134, + 0x01022003, 0x0660002a, 0x050f80ff, 0x053fa80a, + 0x07000009, 0x01800136, 0x00022013, 0x00021013, + 0x0647f020, 0x007a0120, 0x04000101, 0x04a00285, + 0x0400802a, 0x05a004f5, 0x009480f1, 0x0521d005, + 0x028000f2, 0x038000fa, 0x0647f020, 0x06486020, + 0x06818145, 0x04a00285, 0x028000f1, 0x007a0120, + 0x04000101, 0x04a00285, 0x0400802a, 0x05a004f5, + 0x028000f1, 0x040fd02a, 0x052e4003, 0x00208010, + 0x05a004f5, 0x038000fa, 0x00018098, 0x07480018, + 0x06818161, 0x05481018, 0x0781815f, 0x05482018, + 0x0681815d, 0x07483018, 0x0681815b, 0x002fb004, + 0x00800162, 0x012fb003, 0x00800162, 0x002fb002, + 0x00800162, 0x002fb001, 0x00800162, 0x012fb000, + 0x0179fe78, 0x070000ff, 0x030190ff, 0x00017086, + 0x058b0166, 0x03385000, 0x03020000, 0x07780017, + 0x00430407, 0x078181ee, 0x046c0419, 0x048101a2, + 0x046c0219, 0x05810172, 0x07219000, 0x00800186, + 0x07219000, 0x07483017, 0x0481018c, 0x05482017, + 0x05810193, 0x0448b075, 0x06818186, 0x06601476, + 0x050f80ff, 0x073fa022, 0x0600003e, 0x06000080, + 0x05001081, 0x05002082, 0x06003083, 0x05004084, + 0x04601c76, 0x050f80ff, 0x022fa02a, 0x07219000, + 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, + 0x0484801f, 0x0280003d, 0x040fe07f, 0x0086019b, + 0x05a001bb, 0x00920186, 0x040fe07f, 0x07a681bb, + 0x00800186, 0x0560107b, 0x050f80ff, 0x032fa009, + 0x0744f000, 0x0560107b, 0x050f80ff, 0x032fa00a, + 0x00800179, 0x052e400c, 0x040080fb, 0x046aa108, + 0x06009076, 0x04002075, 0x05a004fc, 0x00800186, + 0x06219001, 0x05482017, 0x058101af, 0x058b01a5, + 0x060ff086, 0x0349f0ff, 0x07818165, 0x07483017, + 0x058101ac, 0x050fd0ff, 0x040fe07f, 0x07a681bb, + 0x00800186, 0x05004084, 0x05a00205, 0x00920186, + 0x070ff07d, 0x0450047c, 0x056004ff, 0x050f80ff, + 0x032fa009, 0x070ff000, 0x00540479, 0x030790ff, + 0x01800193, 0x060ff079, 0x0054047a, 0x058201e7, + 0x058101e7, 0x070ff07d, 0x0450047c, 0x050f80ff, + 0x002fa819, 0x058b01c3, 0x02080001, 0x00081002, + 0x01082003, 0x048b01c7, 0x03385000, 0x03010000, + 0x02400019, 0x070ff003, 0x04500479, 0x030790ff, + 0x0340007e, 0x0642007f, 0x058101e7, 0x070ff07e, + 0x050f80ff, 0x032fa009, 0x050fe000, 0x028681e6, + 0x070ff07d, 0x056002ff, 0x050f80ff, 0x032fa009, + 0x0107d000, 0x018601e8, 0x0560087d, 0x050f80ff, + 0x032fa009, 0x0569fe00, 0x0550041b, 0x050f80ff, + 0x032fa009, 0x0107e000, 0x070ff07e, 0x018001d2, + 0x0307c000, 0x07c00000, 0x052e400c, 0x040080fb, + 0x046aa108, 0x06009076, 0x04002075, 0x018004fc, + 0x040fd076, 0x050fd017, 0x060ff086, 0x077800ff, + 0x07000060, 0x037c00ff, 0x07000060, 0x078181f0, + 0x07780078, 0x07ffff00, 0x045a0419, 0x010780ff, + 0x06601476, 0x050f80ff, 0x073fa022, 0x0600003e, + 0x052e400c, 0x040080fb, 0x066a8108, 0x06009076, + 0x04002075, 0x05a004fc, 0x02800029, 0x0240007f, + 0x0742007e, 0x050f807e, 0x032fa009, 0x050fe000, + 0x0286821f, 0x070ff07d, 0x055c047b, 0x05810214, + 0x0760007d, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x03868214, 0x070ff07b, 0x0107d0ff, 0x0560087d, + 0x050f80ff, 0x032fa009, 0x03681e00, 0x0450041c, + 0x0107e0ff, 0x050f80ff, 0x032fa009, 0x050fe000, + 0x01860221, 0x0307c000, 0x07c00000, 0x040fd076, + 0x02800510, 0x010180c0, 0x0548e018, 0x0781823c, + 0x0748f018, 0x06818238, 0x03490018, 0x06818234, + 0x01491018, 0x07818230, 0x073c0000, 0x06000040, + 0x02200004, 0x0180023f, 0x073c0000, 0x06000020, + 0x03200003, 0x0180023f, 0x073c0000, 0x06000010, + 0x02200002, 0x0180023f, 0x073c0000, 0x06000008, + 0x02200001, 0x0180023f, 0x073c0000, 0x06000004, + 0x06000013, 0x050fb000, 0x040fe076, 0x00860258, + 0x046c0273, 0x04810268, 0x066c0073, 0x04810249, + 0x040fd076, 0x06a00510, 0x03800014, 0x040fd076, + 0x0080024c, 0x00452075, 0x00077013, 0x0647f075, + 0x06486075, 0x06818252, 0x05a0028b, 0x00800258, + 0x007a0175, 0x04000101, 0x05a0028b, 0x04008076, + 0x0245f008, 0x05a004f5, 0x07273000, 0x05600272, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0379ff78, + 0x070000ff, 0x02076013, 0x02075013, 0x0484801f, + 0x0280003d, 0x070fc0ff, 0x052e400c, 0x00208020, + 0x05a004f5, 0x00800261, 0x04600276, 0x050010ff, + 0x040f8001, 0x032fa009, 0x040f8001, 0x053fa80a, + 0x07000009, 0x070ff000, 0x0286827a, 0x06601276, + 0x050f80ff, 0x073fa009, 0x0700000c, 0x07601818, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x0180027b, + 0x07a000de, 0x0448b075, 0x0581024b, 0x06000013, + 0x04001013, 0x0560107b, 0x050f80ff, 0x032fa012, + 0x0046b075, 0x03b600ac, 0x0080024c, 0x06000020, + 0x04001016, 0x0460082a, 0x050f80ff, 0x032fa012, + 0x07c00000, 0x06000075, 0x040010a2, 0x044b0801, + 0x060ff016, 0x065a0001, 0x04600876, 0x050f80ff, + 0x032fa012, 0x07c00000, 0x050fe022, 0x0186029a, + 0x0421d004, 0x0302a022, 0x04a002c1, 0x018002b1, + 0x040fe026, 0x008602b3, 0x0421d001, 0x0202a026, + 0x04a002c1, 0x0202c013, 0x00683e20, 0x070060ff, + 0x056c0206, 0x048102f4, 0x056c0406, 0x0781030a, + 0x076c0606, 0x06810379, 0x056c1606, 0x078182b1, + 0x04488020, 0x07810387, 0x040fd02a, 0x0521d000, + 0x0202a013, 0x02020013, 0x008002b3, 0x04a004ec, + 0x008002bf, 0x050fe028, 0x008602bf, 0x0302a028, + 0x0421d002, 0x04a002c1, 0x008002c8, 0x050fe022, + 0x008602bf, 0x0421d004, 0x0302a022, 0x04a002c1, + 0x04a004ec, 0x05848030, 0x0280003d, 0x0460082a, + 0x050f80ff, 0x022fa031, 0x03020000, 0x0002b004, + 0x01018005, 0x07c00000, 0x0400702a, 0x06a003ba, + 0x007a0101, 0x07060000, 0x07303000, 0x07008290, + 0x07600018, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0448e007, 0x068182d6, 0x06006013, 0x018002dd, + 0x02400010, 0x048102d6, 0x06006010, 0x0460322a, + 0x050f80ff, 0x073fa00a, 0x07000003, 0x050f801e, + 0x032fa03a, 0x063aa020, 0x06000002, 0x013e4000, + 0x07000030, 0x009802e3, 0x070ff0f6, 0x036830ff, + 0x078182e4, 0x070f001e, 0x0560102b, 0x050f10ff, + 0x063f3c08, 0x0600000d, 0x013e4000, 0x06000020, + 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, + 0x0202c013, 0x008002bf, 0x04007013, 0x06a003ba, + 0x007a0101, 0x07050000, 0x07303000, 0x07008890, + 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, + 0x05601a2b, 0x050f80ff, 0x022fa019, 0x04001002, + 0x04002013, 0x040f801f, 0x022fa01a, 0x073aa00c, + 0x06000002, 0x07300c03, 0x0600000d, 0x028003a7, + 0x04007013, 0x06a003ba, 0x007a0101, 0x03070000, + 0x0660282a, 0x050f80ff, 0x073fa009, 0x06000004, + 0x02499008, 0x07810317, 0x07303000, 0x07008890, + 0x02800319, 0x07303000, 0x04008980, 0x05007003, + 0x074d0005, 0x06006013, 0x050f801e, 0x032fa03a, + 0x0760142b, 0x050f80ff, 0x032fa021, 0x064b0002, + 0x02499008, 0x06810325, 0x0644c002, 0x054b0400, + 0x050040ff, 0x06698104, 0x0581833a, 0x06000013, + 0x04001013, 0x04780102, 0x06000010, 0x06003013, + 0x04004013, 0x06005013, 0x06006013, 0x04007013, + 0x00644015, 0x07820336, 0x04448002, 0x02205008, + 0x040f801f, 0x032fa042, 0x04008015, 0x03800371, + 0x046c8004, 0x05818348, 0x01208018, 0x06780002, + 0x07000003, 0x0581834b, 0x06003001, 0x06000013, + 0x04001013, 0x04004013, 0x06005013, 0x040f801f, + 0x022fa032, 0x03800371, 0x040fd02a, 0x06a00510, + 0x03800014, 0x04488002, 0x07810350, 0x070ff003, + 0x04500408, 0x050080ff, 0x06489002, 0x06810357, + 0x0379ff00, 0x070000ff, 0x070ff000, 0x04500408, + 0x050080ff, 0x07005003, 0x05004000, 0x06003001, + 0x06000013, 0x04001013, 0x040f801f, 0x022fa032, + 0x05601c2b, 0x050f80ff, 0x022fa031, 0x06600c1f, + 0x050f80ff, 0x022fa032, 0x02680608, 0x07810371, + 0x016408ff, 0x057dfeff, 0x07ffffff, 0x034000ff, + 0x045a0407, 0x070000ff, 0x0760061e, 0x050f80ff, + 0x032fa00a, 0x06600908, 0x0669f908, 0x027a0008, + 0x06000020, 0x070aa0ff, 0x014a20ff, 0x037a00ff, + 0x060000dc, 0x070000ff, 0x028003a7, 0x04007013, + 0x06a003ba, 0x007a0101, 0x07030000, 0x07303000, + 0x07008190, 0x06006013, 0x050f801e, 0x032fa03a, + 0x073aa000, 0x06000002, 0x07300c00, 0x07000005, + 0x028003a7, 0x04007013, 0x06a003ba, 0x007a0101, + 0x07810000, 0x07303000, 0x07000090, 0x06006013, + 0x06600c2a, 0x050f80ff, 0x053fa809, 0x07000003, + 0x04780107, 0x07ffff00, 0x007c0107, 0x07000500, + 0x0581839a, 0x07303000, 0x05000890, 0x074d0005, + 0x0660282a, 0x050f80ff, 0x053fa809, 0x07000003, + 0x0049d007, 0x068103a1, 0x02206001, 0x050f801e, + 0x032fa03a, 0x073aa000, 0x06000002, 0x07300c00, + 0x07000005, 0x013e4000, 0x07000030, 0x039803a9, + 0x070ff0f6, 0x036830ff, 0x058183aa, 0x070f001e, + 0x040f101f, 0x070f3000, 0x013e4000, 0x06000020, + 0x040f801a, 0x0320000a, 0x022017d0, 0x032fa012, + 0x008002bf, 0x03200000, 0x06006076, 0x028003bc, + 0x03200011, 0x0600602a, 0x05a00441, 0x05600406, + 0x050f80ff, 0x053fa809, 0x06000002, 0x07c00000, + 0x0207602f, 0x04600876, 0x050f80ff, 0x022fa031, + 0x03075000, 0x0007b004, 0x01018005, 0x06600076, + 0x050020ff, 0x050f80ff, 0x012fa809, 0x0202f001, + 0x008683d0, 0x0002e013, 0x040f8002, 0x053fa80a, + 0x07000009, 0x06273001, 0x0448b075, 0x048183da, + 0x04602076, 0x050f80ff, 0x053fa811, 0x0700003c, + 0x0179fe78, 0x070000ff, 0x030190ff, 0x018683e2, + 0x07a003f6, 0x00078019, 0x039203f5, 0x0180043a, + 0x040fd076, 0x040fd019, 0x04600276, 0x050020ff, + 0x050f80ff, 0x032fa009, 0x040f8002, 0x053fa80a, + 0x07000009, 0x050fe000, 0x008683f2, 0x07601818, + 0x050f80ff, 0x053fa80a, 0x07000009, 0x038003f3, + 0x07a000de, 0x07273000, 0x02076013, 0x0280003d, + 0x078b03f6, 0x03385000, 0x07030000, 0x05600818, + 0x050f80ff, 0x032fa009, 0x054b0400, 0x0308a0ff, + 0x0179fe00, 0x070000ff, 0x010880ff, 0x0448b075, + 0x04810410, 0x0760147b, 0x050f80ff, 0x002fa819, + 0x064b0001, 0x02080002, 0x01081003, 0x00082001, + 0x02083001, 0x02079001, 0x0207a001, 0x00084013, + 0x0207f013, 0x00800432, 0x06485075, 0x05810428, + 0x02465075, 0x06601476, 0x050f80ff, 0x073fa021, + 0x0600003e, 0x070ff07d, 0x0450047c, 0x050f80ff, + 0x002fa819, 0x058b041b, 0x02080001, 0x00081002, + 0x01082003, 0x03079003, 0x0208307a, 0x0340007e, + 0x0642007f, 0x0581042d, 0x070ff07e, 0x05a001d2, + 0x0392842d, 0x01800439, 0x058b0428, 0x06601476, + 0x050f80ff, 0x073fa041, 0x0600003e, 0x06602476, + 0x050f80ff, 0x073fa009, 0x06000007, 0x0008400e, + 0x048b0432, 0x03385000, 0x03010000, 0x06219001, + 0x040fe07f, 0x01860439, 0x018001bb, 0x07c00000, + 0x00683e75, 0x0581043f, 0x0448d075, 0x05810465, + 0x01800493, 0x05a004f0, 0x038003f5, 0x0297844c, + 0x07602418, 0x050f80ff, 0x012fa809, 0x06780001, + 0x070000ff, 0x075a0000, 0x070ff014, 0x0569feff, + 0x054b08ff, 0x075a0000, 0x05600418, 0x050f80ff, + 0x012fa809, 0x040fe007, 0x03868453, 0x01204000, + 0x00800461, 0x00700101, 0x03010000, 0x06780001, + 0x07ff0000, 0x076c00ff, 0x0681845b, 0x00700101, + 0x03010000, 0x05600418, 0x050f80ff, 0x012fa80a, + 0x06780001, 0x07ff0000, 0x050040ff, 0x0279ff01, + 0x0700ffff, 0x05002014, 0x07c00000, 0x04007076, + 0x0448b075, 0x0481047f, 0x03200011, 0x06006076, + 0x06a003bc, 0x007a0101, 0x07060000, 0x07303000, + 0x07008290, 0x07600018, 0x050f80ff, 0x053fa809, + 0x07000003, 0x0448e007, 0x07818477, 0x06006013, + 0x0180048e, 0x02400010, 0x05810477, 0x06006010, + 0x04603276, 0x050f80ff, 0x073fa00a, 0x07000003, + 0x0180048e, 0x04602a76, 0x050f80ff, 0x032fa009, + 0x060ff07a, 0x05500400, 0x070000ff, 0x04602a76, + 0x050f80ff, 0x032fa00a, 0x07a003b7, 0x007a0101, + 0x03010000, 0x06303008, 0x05008000, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x053079a0, 0x0700000c, + 0x008004d3, 0x00683e75, 0x076c0aff, 0x058104b2, + 0x04007013, 0x03200011, 0x06006076, 0x06a003bc, + 0x007a0101, 0x03070000, 0x06602876, 0x050f80ff, + 0x053fa809, 0x06000001, 0x03499003, 0x048104a7, + 0x07303000, 0x07008890, 0x053079a0, 0x0700000c, + 0x008004ab, 0x07303000, 0x04008980, 0x04307920, + 0x0700000c, 0x074d0005, 0x06006013, 0x050f8074, + 0x032fa03a, 0x04307920, 0x0700000c, 0x008004d3, + 0x04602a76, 0x050f80ff, 0x032fa009, 0x060ff07a, + 0x05500400, 0x070000ff, 0x04602a76, 0x050f80ff, + 0x032fa00a, 0x04007076, 0x07a003b7, 0x007a0101, + 0x03010000, 0x06303008, 0x07008800, 0x074d0005, + 0x06600a76, 0x050f80ff, 0x073fa009, 0x07000003, + 0x054b0406, 0x045a0404, 0x050040ff, 0x0600600e, + 0x050f8074, 0x032fa03a, 0x0648c075, 0x058104d1, + 0x06307d20, 0x0700000c, 0x008004d3, 0x04307920, + 0x0700000c, 0x013e4000, 0x07000030, 0x009804d5, + 0x070ff0f6, 0x074850ff, 0x068184d6, 0x050f2074, + 0x060a0007, 0x040070fb, 0x046a7007, 0x050f40ff, + 0x013e4000, 0x06000020, 0x0678007a, 0x07fff000, + 0x068184e6, 0x0320000a, 0x022017d0, 0x008004e9, + 0x0320000a, 0x06301b58, 0x06000001, 0x050f8072, + 0x032fa012, 0x038003f5, 0x01208060, 0x0600902a, + 0x04002020, 0x018004fc, 0x040080fb, 0x066ae108, + 0x06009076, 0x04002075, 0x018004fc, 0x03201100, + 0x078484fa, 0x06420001, 0x078184f6, 0x02800513, + 0x020e0008, 0x07c00000, 0x050fd009, 0x040fd008, + 0x03201100, 0x05848503, 0x06420001, 0x078184ff, + 0x02800513, 0x007a0102, 0x04000101, 0x05600809, + 0x050f80ff, 0x073fa00a, 0x06000001, 0x020e0008, + 0x0684050d, 0x030e0009, 0x07c00000, 0x01011009, + 0x052e4300, 0x07c00000, 0x052e400f, 0x01208090, + 0x018004f5, 0x070fc0ff, 0x040f8013, 0x032fa009, + 0x02800516, 0x15416ea9, 0xffef0b01 +}; + +#ifdef UNIQUE_FW_NAME +uint32_t fw2400_length02 = 0x000014ff ; +#else +uint32_t risc_code_length02 = 0x000014ff ; +#endif + -- cgit v1.2.3 From 47be1e0ee1f484c8127f306e06ed3be91add07ee Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:27 -0500 Subject: [SCSI] sym2: Remove FreeBSD ifdefs Remove FreeBSD ifdefs from sym2 driver Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_fw.c | 12 ------------ drivers/scsi/sym53c8xx_2/sym_malloc.c | 4 ---- 2 files changed, 16 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_fw.c b/drivers/scsi/sym53c8xx_2/sym_fw.c index fd36cf9858c..a7528a8331b 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw.c +++ b/drivers/scsi/sym53c8xx_2/sym_fw.c @@ -37,11 +37,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef __FreeBSD__ -#include -#else #include "sym_glue.h" -#endif /* * Macros used for all firmwares. @@ -60,11 +56,7 @@ #define SYM_FWA_SCR sym_fw1a_scr #define SYM_FWB_SCR sym_fw1b_scr #define SYM_FWZ_SCR sym_fw1z_scr -#ifdef __FreeBSD__ -#include -#else #include "sym_fw1.h" -#endif static struct sym_fwa_ofs sym_fw1a_ofs = { SYM_GEN_FW_A(struct SYM_FWA_SCR) }; @@ -88,11 +80,7 @@ static struct sym_fwz_ofs sym_fw1z_ofs = { #define SYM_FWA_SCR sym_fw2a_scr #define SYM_FWB_SCR sym_fw2b_scr #define SYM_FWZ_SCR sym_fw2z_scr -#ifdef __FreeBSD__ -#include -#else #include "sym_fw2.h" -#endif static struct sym_fwa_ofs sym_fw2a_ofs = { SYM_GEN_FW_A(struct SYM_FWA_SCR) }; diff --git a/drivers/scsi/sym53c8xx_2/sym_malloc.c b/drivers/scsi/sym53c8xx_2/sym_malloc.c index a34d403ccc6..92bf9b14a7a 100644 --- a/drivers/scsi/sym53c8xx_2/sym_malloc.c +++ b/drivers/scsi/sym53c8xx_2/sym_malloc.c @@ -37,11 +37,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef __FreeBSD__ -#include -#else #include "sym_glue.h" -#endif /* * Simple power of two buddy-like generic allocator. -- cgit v1.2.3 From 760c9de589175f5285668d17825c259aec08370c Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:29 -0500 Subject: [SCSI] sym2: Remove last vestiges of sym_sniff_inquiry The SYM_OPT_SNIFF_INQUIRY define is never set any more, and the sym_sniff_inquiry() function doesn't exist From: Christoph Hellwig Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_glue.h | 1 - drivers/scsi/sym53c8xx_2/sym_hipd.c | 9 --------- 2 files changed, 10 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h index d3d52f14d7c..c61c23fcce5 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.h +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h @@ -268,6 +268,5 @@ void sym_xpt_async_bus_reset(struct sym_hcb *np); void sym_xpt_async_sent_bdr(struct sym_hcb *np, int target); int sym_setup_data_and_start (struct sym_hcb *np, struct scsi_cmnd *csio, struct sym_ccb *cp); void sym_log_bus_error(struct sym_hcb *np); -void sym_sniff_inquiry(struct sym_hcb *np, struct scsi_cmnd *cmd, int resid); #endif /* SYM_GLUE_H */ diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index a7420cad454..113e3b35716 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -5551,15 +5551,6 @@ if (resid) */ sym_set_cam_result_ok(cp, cmd, resid); -#ifdef SYM_OPT_SNIFF_INQUIRY - /* - * On standard INQUIRY response (EVPD and CmDt - * not set), sniff out device capabilities. - */ - if (cp->cdb_buf[0] == INQUIRY && !(cp->cdb_buf[1] & 0x3)) - sym_sniff_inquiry(np, cmd, resid); -#endif - #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING /* * If max number of started ccbs had been reduced, -- cgit v1.2.3 From 84e203a279d3de1c8a41a73ab45e55a89bc19345 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:31 -0500 Subject: [SCSI] sym2: Manage sym_lcb properly Allocate the lcb in slave_alloc and free it in slave_destroy. This allows us to remove all the code that checks to see if it's already been allocated. From: Christoph Hellwig Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_glue.c | 59 +++++++++++++------------ drivers/scsi/sym53c8xx_2/sym_hipd.c | 86 +++---------------------------------- drivers/scsi/sym53c8xx_2/sym_hipd.h | 14 ------ 3 files changed, 38 insertions(+), 121 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index 7fc0b97173e..a2bfdf8417a 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -563,10 +563,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s /* * activate this job. */ - if (lp) - sym_start_next_ccbs(np, lp, 2); - else - sym_put_start_queue(np, cp); + sym_start_next_ccbs(np, lp, 2); return 0; out_abort: @@ -981,15 +978,13 @@ static int device_queue_depth(struct sym_hcb *np, int target, int lun) static int sym53c8xx_slave_alloc(struct scsi_device *sdev) { - struct sym_hcb *np; - struct sym_tcb *tp; + struct sym_hcb *np = sym_get_hcb(sdev->host); + struct sym_tcb *tp = &np->target[sdev->id]; + struct sym_lcb *lp; if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN) return -ENXIO; - np = sym_get_hcb(sdev->host); - tp = &np->target[sdev->id]; - /* * Fail the device init if the device is flagged NOSCAN at BOOT in * the NVRAM. This may speed up boot and maintain coherency with @@ -1005,6 +1000,10 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev) return -ENXIO; } + lp = sym_alloc_lcb(np, sdev->id, sdev->lun); + if (!lp) + return -ENOMEM; + tp->starget = sdev->sdev_target; return 0; } @@ -1012,21 +1011,13 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev) /* * Linux entry point for device queue sizing. */ -static int sym53c8xx_slave_configure(struct scsi_device *device) +static int sym53c8xx_slave_configure(struct scsi_device *sdev) { - struct sym_hcb *np = sym_get_hcb(device->host); - struct sym_tcb *tp = &np->target[device->id]; - struct sym_lcb *lp; + struct sym_hcb *np = sym_get_hcb(sdev->host); + struct sym_tcb *tp = &np->target[sdev->id]; + struct sym_lcb *lp = sym_lp(tp, sdev->lun); int reqtags, depth_to_use; - /* - * Allocate the LCB if not yet. - * If it fail, we may well be in the sh*t. :) - */ - lp = sym_alloc_lcb(np, device->id, device->lun); - if (!lp) - return -ENOMEM; - /* * Get user flags. */ @@ -1038,10 +1029,10 @@ static int sym53c8xx_slave_configure(struct scsi_device *device) * Use at least 2. * Donnot use more than our maximum. */ - reqtags = device_queue_depth(np, device->id, device->lun); + reqtags = device_queue_depth(np, sdev->id, sdev->lun); if (reqtags > tp->usrtags) reqtags = tp->usrtags; - if (!device->tagged_supported) + if (!sdev->tagged_supported) reqtags = 0; #if 1 /* Avoid to locally queue commands for no good reasons */ if (reqtags > SYM_CONF_MAX_TAG) @@ -1050,19 +1041,30 @@ static int sym53c8xx_slave_configure(struct scsi_device *device) #else depth_to_use = (reqtags ? SYM_CONF_MAX_TAG : 2); #endif - scsi_adjust_queue_depth(device, - (device->tagged_supported ? + scsi_adjust_queue_depth(sdev, + (sdev->tagged_supported ? MSG_SIMPLE_TAG : 0), depth_to_use); lp->s.scdev_depth = depth_to_use; - sym_tune_dev_queuing(tp, device->lun, reqtags); + sym_tune_dev_queuing(tp, sdev->lun, reqtags); - if (!spi_initial_dv(device->sdev_target)) - spi_dv_device(device); + if (!spi_initial_dv(sdev->sdev_target)) + spi_dv_device(sdev); return 0; } +static void sym53c8xx_slave_destroy(struct scsi_device *sdev) +{ + struct sym_hcb *np = sym_get_hcb(sdev->host); + struct sym_lcb *lp = sym_lp(&np->target[sdev->id], sdev->lun); + + if (lp->itlq_tbl) + sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK * 4, "ITLQ_TBL"); + kfree(lp->cb_tags); + sym_mfree_dma(lp, sizeof(*lp), "LCB"); +} + /* * Linux entry point for info() function */ @@ -1926,6 +1928,7 @@ static struct scsi_host_template sym2_template = { .queuecommand = sym53c8xx_queue_command, .slave_alloc = sym53c8xx_slave_alloc, .slave_configure = sym53c8xx_slave_configure, + .slave_destroy = sym53c8xx_slave_destroy, .eh_abort_handler = sym53c8xx_eh_abort_handler, .eh_device_reset_handler = sym53c8xx_eh_device_reset_handler, .eh_bus_reset_handler = sym53c8xx_eh_bus_reset_handler, diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 113e3b35716..bec644850d3 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -1523,7 +1523,7 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp /* * Insert a job into the start queue. */ -void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) +static void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) { u_short qidx; @@ -4664,30 +4664,7 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t goto out; cp = sym_que_entry(qp, struct sym_ccb, link_ccbq); -#ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING - /* - * If the LCB is not yet available and the LUN - * has been probed ok, try to allocate the LCB. - */ - if (!lp && sym_is_bit(tp->lun_map, ln)) { - lp = sym_alloc_lcb(np, tn, ln); - if (!lp) - goto out_free; - } -#endif - - /* - * If the LCB is not available here, then the - * logical unit is not yet discovered. For those - * ones only accept 1 SCSI IO per logical unit, - * since we cannot allow disconnections. - */ - if (!lp) { - if (!sym_is_bit(tp->busy0_map, ln)) - sym_set_bit(tp->busy0_map, ln); - else - goto out_free; - } else { + { /* * If we have been asked for a tagged command. */ @@ -4840,12 +4817,6 @@ void sym_free_ccb (struct sym_hcb *np, struct sym_ccb *cp) lp->head.resel_sa = cpu_to_scr(SCRIPTB_BA(np, resel_bad_lun)); } - /* - * Otherwise, we only accept 1 IO per LUN. - * Clear the bit that keeps track of this IO. - */ - else - sym_clr_bit(tp->busy0_map, cp->lun); /* * We donnot queue more than 1 ccb per target @@ -4997,20 +4968,7 @@ static void sym_init_tcb (struct sym_hcb *np, u_char tn) struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln) { struct sym_tcb *tp = &np->target[tn]; - struct sym_lcb *lp = sym_lp(tp, ln); - - /* - * Already done, just return. - */ - if (lp) - return lp; - - /* - * Donnot allow LUN control block - * allocation for not probed LUNs. - */ - if (!sym_is_bit(tp->lun_map, ln)) - return NULL; + struct sym_lcb *lp = NULL; /* * Initialize the target control block if not yet. @@ -5082,13 +5040,7 @@ struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln) lp->started_max = SYM_CONF_MAX_TASK; lp->started_limit = SYM_CONF_MAX_TASK; #endif - /* - * If we are busy, count the IO. - */ - if (sym_is_bit(tp->busy0_map, ln)) { - lp->busy_itl = 1; - sym_clr_bit(tp->busy0_map, ln); - } + fail: return lp; } @@ -5102,12 +5054,6 @@ static void sym_alloc_lcb_tags (struct sym_hcb *np, u_char tn, u_char ln) struct sym_lcb *lp = sym_lp(tp, ln); int i; - /* - * If LCB not available, try to allocate it. - */ - if (!lp && !(lp = sym_alloc_lcb(np, tn, ln))) - goto fail; - /* * Allocate the task table and and the tag allocation * circular buffer. We want both or none. @@ -5481,8 +5427,7 @@ finish: /* * Donnot start more than 1 command after an error. */ - if (lp) - sym_start_next_ccbs(np, lp, 1); + sym_start_next_ccbs(np, lp, 1); #endif } @@ -5520,12 +5465,6 @@ void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp) tp = &np->target[cp->target]; lp = sym_lp(tp, cp->lun); - /* - * Assume device discovered on first success. - */ - if (!lp) - sym_set_bit(tp->lun_map, cp->lun); - /* * If all data have been transferred, given than no * extended error did occur, there is no residual. @@ -5578,7 +5517,7 @@ if (resid) /* * Requeue a couple of awaiting scsi commands. */ - if (lp && !sym_que_empty(&lp->waiting_ccbq)) + if (!sym_que_empty(&lp->waiting_ccbq)) sym_start_next_ccbs(np, lp, 2); #endif /* @@ -5821,8 +5760,7 @@ void sym_hcb_free(struct sym_hcb *np) SYM_QUEHEAD *qp; struct sym_ccb *cp; struct sym_tcb *tp; - struct sym_lcb *lp; - int target, lun; + int target; if (np->scriptz0) sym_mfree_dma(np->scriptz0, np->scriptz_sz, "SCRIPTZ0"); @@ -5848,16 +5786,6 @@ void sym_hcb_free(struct sym_hcb *np) for (target = 0; target < SYM_CONF_MAX_TARGET ; target++) { tp = &np->target[target]; - for (lun = 0 ; lun < SYM_CONF_MAX_LUN ; lun++) { - lp = sym_lp(tp, lun); - if (!lp) - continue; - if (lp->itlq_tbl) - sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4, - "ITLQ_TBL"); - kfree(lp->cb_tags); - sym_mfree_dma(lp, sizeof(*lp), "LCB"); - } #if SYM_CONF_MAX_LUN > 1 kfree(tp->lunmp); #endif diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h index 3a264a40821..756008812aa 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.h +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h @@ -416,19 +416,6 @@ struct sym_tcb { struct sym_lcb **lunmp; /* Other LCBs [1..MAX_LUN] */ #endif - /* - * Bitmap that tells about LUNs that succeeded at least - * 1 IO and therefore assumed to be a real device. - * Avoid useless allocation of the LCB structure. - */ - u32 lun_map[(SYM_CONF_MAX_LUN+31)/32]; - - /* - * Bitmap that tells about LUNs that haven't yet an LCB - * allocated (not discovered or LCB allocation failed). - */ - u32 busy0_map[(SYM_CONF_MAX_LUN+31)/32]; - #ifdef SYM_HAVE_STCB /* * O/S specific data structure. @@ -1077,7 +1064,6 @@ char *sym_driver_name(void); void sym_print_xerr(struct scsi_cmnd *cmd, int x_status); int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int); struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision); -void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp); #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn); #endif -- cgit v1.2.3 From 44f30b0f59d628eb6f57cfa9d8ab06da670e5306 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:33 -0500 Subject: [SCSI] sym2: Remove code to handle DMA_BIDIRECTION requests The upper layer doesn't send these down since 2.4.x (or 2.6 in practice), so no need to handle it. Inline sym_setup_data_pointers into its only caller so we can fail gracefully in the case we'd get one neverless. Signed-off-by: Christoph Hellwig Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_fw.c | 6 --- drivers/scsi/sym53c8xx_2/sym_fw.h | 6 --- drivers/scsi/sym53c8xx_2/sym_fw1.h | 48 --------------------- drivers/scsi/sym53c8xx_2/sym_fw2.h | 52 ----------------------- drivers/scsi/sym53c8xx_2/sym_glue.c | 39 +++++++++++++++-- drivers/scsi/sym53c8xx_2/sym_glue.h | 1 - drivers/scsi/sym53c8xx_2/sym_hipd.c | 8 ++-- drivers/scsi/sym53c8xx_2/sym_hipd.h | 84 ------------------------------------- 8 files changed, 40 insertions(+), 204 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_fw.c b/drivers/scsi/sym53c8xx_2/sym_fw.c index a7528a8331b..9916a2a2255 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw.c +++ b/drivers/scsi/sym53c8xx_2/sym_fw.c @@ -62,9 +62,6 @@ static struct sym_fwa_ofs sym_fw1a_ofs = { }; static struct sym_fwb_ofs sym_fw1b_ofs = { SYM_GEN_FW_B(struct SYM_FWB_SCR) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(struct SYM_FWB_SCR, data_io) -#endif }; static struct sym_fwz_ofs sym_fw1z_ofs = { SYM_GEN_FW_Z(struct SYM_FWZ_SCR) @@ -86,9 +83,6 @@ static struct sym_fwa_ofs sym_fw2a_ofs = { }; static struct sym_fwb_ofs sym_fw2b_ofs = { SYM_GEN_FW_B(struct SYM_FWB_SCR) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(struct SYM_FWB_SCR, data_io) -#endif SYM_GEN_B(struct SYM_FWB_SCR, start64) SYM_GEN_B(struct SYM_FWB_SCR, pm_handle) }; diff --git a/drivers/scsi/sym53c8xx_2/sym_fw.h b/drivers/scsi/sym53c8xx_2/sym_fw.h index 43f6810a404..66ec35beab5 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw.h +++ b/drivers/scsi/sym53c8xx_2/sym_fw.h @@ -92,9 +92,6 @@ struct sym_fwa_ofs { }; struct sym_fwb_ofs { SYM_GEN_FW_B(u_short) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(u_short, data_io) -#endif SYM_GEN_B(u_short, start64) SYM_GEN_B(u_short, pm_handle) }; @@ -111,9 +108,6 @@ struct sym_fwa_ba { }; struct sym_fwb_ba { SYM_GEN_FW_B(u32) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(u32, data_io) -#endif SYM_GEN_B(u32, start64); SYM_GEN_B(u32, pm_handle); }; diff --git a/drivers/scsi/sym53c8xx_2/sym_fw1.h b/drivers/scsi/sym53c8xx_2/sym_fw1.h index cdd92d82f4b..7b39f4a35e9 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw1.h +++ b/drivers/scsi/sym53c8xx_2/sym_fw1.h @@ -197,12 +197,6 @@ struct SYM_FWB_SCR { u32 bad_status [ 7]; u32 wsr_ma_helper [ 4]; -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - /* Unknown direction handling */ - u32 data_io [ 2]; - u32 data_io_com [ 8]; - u32 data_io_out [ 7]; -#endif /* Data area */ u32 zero [ 1]; u32 scratch [ 1]; @@ -1747,48 +1741,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = { SCR_JUMP, PADDR_A (dispatch), -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN -}/*-------------------------< DATA_IO >--------------------------*/,{ - /* - * We jump here if the data direction was unknown at the - * time we had to queue the command to the scripts processor. - * Pointers had been set as follow in this situation: - * savep --> DATA_IO - * lastp --> start pointer when DATA_IN - * wlastp --> start pointer when DATA_OUT - * This script sets savep and lastp according to the - * direction chosen by the target. - */ - SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)), - PADDR_B (data_io_out), -}/*-------------------------< DATA_IO_COM >----------------------*/,{ - /* - * Direction is DATA IN. - */ - SCR_COPY (4), - HADDR_1 (ccb_head.lastp), - HADDR_1 (ccb_head.savep), - /* - * Jump to the SCRIPTS according to actual direction. - */ - SCR_COPY (4), - HADDR_1 (ccb_head.savep), - RADDR_1 (temp), - SCR_RETURN, - 0, -}/*-------------------------< DATA_IO_OUT >----------------------*/,{ - /* - * Direction is DATA OUT. - */ - SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)), - 0, - SCR_COPY (4), - HADDR_1 (ccb_head.wlastp), - HADDR_1 (ccb_head.lastp), - SCR_JUMP, - PADDR_B(data_io_com), -#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */ - }/*-------------------------< ZERO >-----------------------------*/,{ SCR_DATA_ZERO, }/*-------------------------< SCRATCH >--------------------------*/,{ diff --git a/drivers/scsi/sym53c8xx_2/sym_fw2.h b/drivers/scsi/sym53c8xx_2/sym_fw2.h index 7ea7151f5d1..851f2706f22 100644 --- a/drivers/scsi/sym53c8xx_2/sym_fw2.h +++ b/drivers/scsi/sym53c8xx_2/sym_fw2.h @@ -191,13 +191,6 @@ struct SYM_FWB_SCR { u32 pm_wsr_handle [ 38]; u32 wsr_ma_helper [ 4]; -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - /* Unknown direction handling */ - u32 data_io [ 2]; - u32 data_io_in [ 2]; - u32 data_io_com [ 6]; - u32 data_io_out [ 8]; -#endif /* Data area */ u32 zero [ 1]; u32 scratch [ 1]; @@ -1838,51 +1831,6 @@ static struct SYM_FWB_SCR SYM_FWB_SCR = { SCR_JUMP, PADDR_A (dispatch), -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN -}/*-------------------------< DATA_IO >--------------------------*/,{ - /* - * We jump here if the data direction was unknown at the - * time we had to queue the command to the scripts processor. - * Pointers had been set as follow in this situation: - * savep --> DATA_IO - * lastp --> start pointer when DATA_IN - * wlastp --> start pointer when DATA_OUT - * This script sets savep and lastp according to the - * direction chosen by the target. - */ - SCR_JUMP ^ IFTRUE (WHEN (SCR_DATA_OUT)), - PADDR_B (data_io_out), -}/*-------------------------< DATA_IO_IN >-----------------------*/,{ - /* - * Direction is DATA IN. - */ - SCR_LOAD_REL (scratcha, 4), - offsetof (struct sym_ccb, phys.head.lastp), -}/*-------------------------< DATA_IO_COM >----------------------*/,{ - SCR_STORE_REL (scratcha, 4), - offsetof (struct sym_ccb, phys.head.savep), - - /* - * Jump to the SCRIPTS according to actual direction. - */ - SCR_LOAD_REL (temp, 4), - offsetof (struct sym_ccb, phys.head.savep), - SCR_RETURN, - 0, -}/*-------------------------< DATA_IO_OUT >----------------------*/,{ - /* - * Direction is DATA OUT. - */ - SCR_REG_REG (HF_REG, SCR_AND, (~HF_DATA_IN)), - 0, - SCR_LOAD_REL (scratcha, 4), - offsetof (struct sym_ccb, phys.head.wlastp), - SCR_STORE_REL (scratcha, 4), - offsetof (struct sym_ccb, phys.head.lastp), - SCR_JUMP, - PADDR_B(data_io_com), -#endif /* SYM_OPT_HANDLE_DIR_UNKNOWN */ - }/*-------------------------< ZERO >-----------------------------*/,{ SCR_DATA_ZERO, }/*-------------------------< SCRATCH >--------------------------*/,{ diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index a2bfdf8417a..d924997db48 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -514,9 +514,10 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc */ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) { - int dir; struct sym_tcb *tp = &np->target[cp->target]; struct sym_lcb *lp = sym_lp(tp, cp->lun); + u32 lastp, goalp; + int dir; /* * Build the CDB. @@ -534,15 +535,47 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s sym_set_cam_status(cmd, DID_ERROR); goto out_abort; } + + /* + * No segments means no data. + */ + if (!cp->segments) + dir = DMA_NONE; } else { cp->data_len = 0; cp->segments = 0; } /* - * Set data pointers. + * Set the data pointer. + */ + switch (dir) { + case DMA_BIDIRECTIONAL: + printk("%s: got DMA_BIDIRECTIONAL command", sym_name(np)); + sym_set_cam_status(cmd, DID_ERROR); + goto out_abort; + case DMA_TO_DEVICE: + goalp = SCRIPTA_BA(np, data_out2) + 8; + lastp = goalp - 8 - (cp->segments * (2*4)); + break; + case DMA_FROM_DEVICE: + cp->host_flags |= HF_DATA_IN; + goalp = SCRIPTA_BA(np, data_in2) + 8; + lastp = goalp - 8 - (cp->segments * (2*4)); + break; + case DMA_NONE: + default: + lastp = goalp = SCRIPTB_BA(np, no_data); + break; + } + + /* + * Set all pointers values needed by SCRIPTS. */ - sym_setup_data_pointers(np, cp, dir); + cp->phys.head.lastp = cpu_to_scr(lastp); + cp->phys.head.savep = cpu_to_scr(lastp); + cp->startp = cp->phys.head.savep; + cp->goalp = cpu_to_scr(goalp); /* * When `#ifed 1', the code below makes the driver diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h index c61c23fcce5..cc92d0c70cd 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.h +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h @@ -68,7 +68,6 @@ */ #define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2) -#define SYM_OPT_HANDLE_DIR_UNKNOWN #define SYM_OPT_HANDLE_DEVICE_QUEUEING #define SYM_OPT_LIMIT_COMMAND_REORDERING diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index bec644850d3..b4f0d9a4a55 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -3654,7 +3654,7 @@ static int sym_evaluate_dp(struct sym_hcb *np, struct sym_ccb *cp, u32 scr, int * If result is dp_sg = SYM_CONF_MAX_SG, then we are at the * end of the data. */ - tmp = scr_to_cpu(sym_goalp(cp)); + tmp = scr_to_cpu(cp->goalp); dp_sg = SYM_CONF_MAX_SG; if (dp_scr != tmp) dp_sg -= (tmp - 8 - (int)dp_scr) / (2*4); @@ -3761,7 +3761,7 @@ static void sym_modify_dp(struct sym_hcb *np, struct sym_tcb *tp, struct sym_ccb * And our alchemy:) allows to easily calculate the data * script address we want to return for the next data phase. */ - dp_ret = cpu_to_scr(sym_goalp(cp)); + dp_ret = cpu_to_scr(cp->goalp); dp_ret = dp_ret - 8 - (SYM_CONF_MAX_SG - dp_sg) * (2*4); /* @@ -3857,7 +3857,7 @@ int sym_compute_residual(struct sym_hcb *np, struct sym_ccb *cp) * If all data has been transferred, * there is no residual. */ - if (cp->phys.head.lastp == sym_goalp(cp)) + if (cp->phys.head.lastp == cp->goalp) return resid; /* @@ -5470,7 +5470,7 @@ void sym_complete_ok (struct sym_hcb *np, struct sym_ccb *cp) * extended error did occur, there is no residual. */ resid = 0; - if (cp->phys.head.lastp != sym_goalp(cp)) + if (cp->phys.head.lastp != cp->goalp) resid = sym_compute_residual(np, cp); /* diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h index 756008812aa..17181101f6c 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.h +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h @@ -48,12 +48,6 @@ * They may be defined in platform specific headers, if they * are useful. * - * SYM_OPT_HANDLE_DIR_UNKNOWN - * When this option is set, the SCRIPTS used by the driver - * are able to handle SCSI transfers with direction not - * supplied by user. - * (set for Linux-2.0.X) - * * SYM_OPT_HANDLE_DEVICE_QUEUEING * When this option is set, the driver will use a queue per * device and handle QUEUE FULL status requeuing internally. @@ -64,7 +58,6 @@ * (set for Linux) */ #if 0 -#define SYM_OPT_HANDLE_DIR_UNKNOWN #define SYM_OPT_HANDLE_DEVICE_QUEUEING #define SYM_OPT_LIMIT_COMMAND_REORDERING #endif @@ -659,9 +652,6 @@ struct sym_ccbh { */ u32 savep; /* Jump address to saved data pointer */ u32 lastp; /* SCRIPTS address at end of data */ -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - u32 wlastp; -#endif /* * Status fields. @@ -791,9 +781,6 @@ struct sym_ccb { SYM_QUEHEAD link_ccbq; /* Link to free/busy CCB queue */ u32 startp; /* Initial data pointer */ u32 goalp; /* Expected last data pointer */ -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - u32 wgoalp; -#endif int ext_sg; /* Extreme data pointer, used */ int ext_ofs; /* to calculate the residual. */ #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING @@ -808,12 +795,6 @@ struct sym_ccb { #define CCB_BA(cp,lbl) cpu_to_scr(cp->ccb_ba + offsetof(struct sym_ccb, lbl)) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN -#define sym_goalp(cp) ((cp->host_flags & HF_DATA_IN) ? cp->goalp : cp->wgoalp) -#else -#define sym_goalp(cp) (cp->goalp) -#endif - typedef struct device *m_pool_ident_t; /* @@ -1121,71 +1102,6 @@ bad: #error "Unsupported DMA addressing mode" #endif -/* - * Set up data pointers used by SCRIPTS. - * Called from O/S specific code. - */ -static inline void sym_setup_data_pointers(struct sym_hcb *np, - struct sym_ccb *cp, int dir) -{ - u32 lastp, goalp; - - /* - * No segments means no data. - */ - if (!cp->segments) - dir = DMA_NONE; - - /* - * Set the data pointer. - */ - switch(dir) { -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - case DMA_BIDIRECTIONAL: -#endif - case DMA_TO_DEVICE: - goalp = SCRIPTA_BA(np, data_out2) + 8; - lastp = goalp - 8 - (cp->segments * (2*4)); -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - cp->wgoalp = cpu_to_scr(goalp); - if (dir != DMA_BIDIRECTIONAL) - break; - cp->phys.head.wlastp = cpu_to_scr(lastp); - /* fall through */ -#else - break; -#endif - case DMA_FROM_DEVICE: - cp->host_flags |= HF_DATA_IN; - goalp = SCRIPTA_BA(np, data_in2) + 8; - lastp = goalp - 8 - (cp->segments * (2*4)); - break; - case DMA_NONE: - default: -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - cp->host_flags |= HF_DATA_IN; -#endif - lastp = goalp = SCRIPTB_BA(np, no_data); - break; - } - - /* - * Set all pointers values needed by SCRIPTS. - */ - cp->phys.head.lastp = cpu_to_scr(lastp); - cp->phys.head.savep = cpu_to_scr(lastp); - cp->startp = cp->phys.head.savep; - cp->goalp = cpu_to_scr(goalp); - -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - /* - * If direction is unknown, start at data_io. - */ - if (dir == DMA_BIDIRECTIONAL) - cp->phys.head.savep = cpu_to_scr(SCRIPTB_BA(np, data_io)); -#endif -} - /* * MEMORY ALLOCATOR. */ -- cgit v1.2.3 From 1e8eb21ea7b5c318d881eab878f3e545e55fa273 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:36 -0500 Subject: [SCSI] sym2: Use DMA_40BIT_MASK constant Now that this constant has been added to dma-mapping.h, we don't need our own definition Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_glue.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index d924997db48..bb90ef9659a 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -1532,7 +1532,7 @@ static int sym_setup_bus_dma_mask(struct sym_hcb *np) { #if SYM_CONF_DMA_ADDRESSING_MODE > 0 #if SYM_CONF_DMA_ADDRESSING_MODE == 1 -#define DMA_DAC_MASK 0x000000ffffffffffULL /* 40-bit */ +#define DMA_DAC_MASK DMA_40BIT_MASK #elif SYM_CONF_DMA_ADDRESSING_MODE == 2 #define DMA_DAC_MASK DMA_64BIT_MASK #endif -- cgit v1.2.3 From 33333bacf523bb4bb903058fec6041a5952c93c6 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:42 -0500 Subject: [SCSI] sym2: Use scsi_print_msg sym_show_msg was almost a duplicate of scsi_print_msg, except not as featureful. So use the common code instead. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_hipd.c | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index b4f0d9a4a55..c36e43bbaae 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -40,6 +40,7 @@ #include #include /* for timeouts in units of HZ */ +#include #include "sym_glue.h" #include "sym_nvram.h" @@ -70,32 +71,12 @@ static void sym_printl_hex(u_char *p, int n) printf (".\n"); } -/* - * Print out the content of a SCSI message. - */ -static int sym_show_msg (u_char * msg) -{ - u_char i; - printf ("%x",*msg); - if (*msg==M_EXTENDED) { - for (i=1;i<8;i++) { - if (i-1>msg[1]) break; - printf ("-%x",msg[i]); - } - return (i+1); - } else if ((*msg & 0xf0) == 0x20) { - printf ("-%x",msg[1]); - return (2); - } - return (1); -} - static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) { sym_print_addr(cp->cmd, "%s: ", label); - sym_show_msg(msg); - printf(".\n"); + scsi_print_msg(msg); + printf("\n"); } static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_char *msg) @@ -103,8 +84,8 @@ static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_ch struct sym_tcb *tp = &np->target[target]; dev_info(&tp->starget->dev, "%s: ", label); - sym_show_msg(msg); - printf(".\n"); + scsi_print_msg(msg); + printf("\n"); } /* -- cgit v1.2.3 From b37df48923b76155de2a728e1155ed263dba5f53 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:44 -0500 Subject: [SCSI] sym2: Allow NVRAM settings to limit speed and width The NVRAM for both Tekram and Symbios boards allows the user to set the speed and width for individual targets. I took that code out in March 2004 when we introduced Domain Validation, but it seems there's still a legitimate need for it in some configurations. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_glue.c | 3 +++ drivers/scsi/sym53c8xx_2/sym_hipd.c | 2 +- drivers/scsi/sym53c8xx_2/sym_hipd.h | 6 ++++-- drivers/scsi/sym53c8xx_2/sym_nvram.c | 29 ++++++++++++++++------------- drivers/scsi/sym53c8xx_2/sym_nvram.h | 4 ++-- 5 files changed, 26 insertions(+), 18 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index bb90ef9659a..cb3d195bdb9 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -1038,6 +1038,9 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev) return -ENOMEM; tp->starget = sdev->sdev_target; + spi_min_period(tp->starget) = tp->usr_period; + spi_max_width(tp->starget) = tp->usr_width; + return 0; } diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index c36e43bbaae..0b0cba0d0bb 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -943,7 +943,7 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru tp->usrflags |= (SYM_DISC_ENABLED | SYM_TAGS_ENABLED); tp->usrtags = SYM_SETUP_MAX_TAG; - sym_nvram_setup_target(np, i, nvram); + sym_nvram_setup_target(tp, i, nvram); if (!tp->usrtags) tp->usrflags &= ~SYM_TAGS_ENABLED; diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h index 17181101f6c..2456090bb24 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.h +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h @@ -434,8 +434,10 @@ struct sym_tcb { * Other user settable limits and options. * These limits are read from the NVRAM if present. */ - u_char usrflags; - u_short usrtags; + unsigned char usrflags; + unsigned char usr_period; + unsigned char usr_width; + unsigned short usrtags; struct scsi_target *starget; }; diff --git a/drivers/scsi/sym53c8xx_2/sym_nvram.c b/drivers/scsi/sym53c8xx_2/sym_nvram.c index 994b7566bca..15d69298ab6 100644 --- a/drivers/scsi/sym53c8xx_2/sym_nvram.c +++ b/drivers/scsi/sym53c8xx_2/sym_nvram.c @@ -92,29 +92,32 @@ void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sy * Get target set-up from Symbios format NVRAM. */ static void -sym_Symbios_setup_target(struct sym_hcb *np, int target, Symbios_nvram *nvram) +sym_Symbios_setup_target(struct sym_tcb *tp, int target, Symbios_nvram *nvram) { - struct sym_tcb *tp = &np->target[target]; Symbios_target *tn = &nvram->target[target]; - tp->usrtags = - (tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)? SYM_SETUP_MAX_TAG : 0; - + if (!(tn->flags & SYMBIOS_QUEUE_TAGS_ENABLED)) + tp->usrtags = 0; if (!(tn->flags & SYMBIOS_DISCONNECT_ENABLE)) tp->usrflags &= ~SYM_DISC_ENABLED; if (!(tn->flags & SYMBIOS_SCAN_AT_BOOT_TIME)) tp->usrflags |= SYM_SCAN_BOOT_DISABLED; if (!(tn->flags & SYMBIOS_SCAN_LUNS)) tp->usrflags |= SYM_SCAN_LUNS_DISABLED; + tp->usr_period = (tn->sync_period + 3) / 4; + tp->usr_width = (tn->bus_width == 0x8) ? 0 : 1; } +static const unsigned char Tekram_sync[16] = { + 25, 31, 37, 43, 50, 62, 75, 125, 12, 15, 18, 21, 6, 7, 9, 10 +}; + /* * Get target set-up from Tekram format NVRAM. */ static void -sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram) +sym_Tekram_setup_target(struct sym_tcb *tp, int target, Tekram_nvram *nvram) { - struct sym_tcb *tp = &np->target[target]; struct Tekram_target *tn = &nvram->target[target]; if (tn->flags & TEKRAM_TAGGED_COMMANDS) { @@ -124,22 +127,22 @@ sym_Tekram_setup_target(struct sym_hcb *np, int target, Tekram_nvram *nvram) if (tn->flags & TEKRAM_DISCONNECT_ENABLE) tp->usrflags |= SYM_DISC_ENABLED; - /* If any device does not support parity, we will not use this option */ - if (!(tn->flags & TEKRAM_PARITY_CHECK)) - np->rv_scntl0 &= ~0x0a; /* SCSI parity checking disabled */ + if (tn->flags & TEKRAM_SYNC_NEGO) + tp->usr_period = Tekram_sync[tn->sync_index & 0xf]; + tp->usr_width = (tn->flags & TEKRAM_WIDE_NEGO) ? 1 : 0; } /* * Get target setup from NVRAM. */ -void sym_nvram_setup_target(struct sym_hcb *np, int target, struct sym_nvram *nvp) +void sym_nvram_setup_target(struct sym_tcb *tp, int target, struct sym_nvram *nvp) { switch (nvp->type) { case SYM_SYMBIOS_NVRAM: - sym_Symbios_setup_target(np, target, &nvp->data.Symbios); + sym_Symbios_setup_target(tp, target, &nvp->data.Symbios); break; case SYM_TEKRAM_NVRAM: - sym_Tekram_setup_target(np, target, &nvp->data.Tekram); + sym_Tekram_setup_target(tp, target, &nvp->data.Tekram); break; default: break; diff --git a/drivers/scsi/sym53c8xx_2/sym_nvram.h b/drivers/scsi/sym53c8xx_2/sym_nvram.h index 1538bede527..bdfbbb083b6 100644 --- a/drivers/scsi/sym53c8xx_2/sym_nvram.h +++ b/drivers/scsi/sym53c8xx_2/sym_nvram.h @@ -194,12 +194,12 @@ struct sym_nvram { #if SYM_CONF_NVRAM_SUPPORT void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram); -void sym_nvram_setup_target (struct sym_hcb *np, int target, struct sym_nvram *nvp); +void sym_nvram_setup_target (struct sym_tcb *tp, int target, struct sym_nvram *nvp); int sym_read_nvram (struct sym_device *np, struct sym_nvram *nvp); char *sym_nvram_type(struct sym_nvram *nvp); #else static inline void sym_nvram_setup_host(struct Scsi_Host *shost, struct sym_hcb *np, struct sym_nvram *nvram) { } -static inline void sym_nvram_setup_target(struct sym_hcb *np, struct sym_nvram *nvram) { } +static inline void sym_nvram_setup_target(struct sym_tcb *tp, struct sym_nvram *nvram) { } static inline int sym_read_nvram(struct sym_device *np, struct sym_nvram *nvp) { nvp->type = 0; -- cgit v1.2.3 From 66e8d1cc64e95be78e6138cc88635f7e3108ef58 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:46 -0500 Subject: [SCSI] sym2: Report disabled devices and LUNs more attractively Rather than print a list of targets at driver init time, print each disabled target as we attempt to scan it. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_glue.c | 14 +++++++++++--- drivers/scsi/sym53c8xx_2/sym_hipd.c | 30 ------------------------------ 2 files changed, 11 insertions(+), 33 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index cb3d195bdb9..1fffd2b3c65 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c @@ -1018,6 +1018,7 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev) if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN) return -ENXIO; + tp->starget = sdev->sdev_target; /* * Fail the device init if the device is flagged NOSCAN at BOOT in * the NVRAM. This may speed up boot and maintain coherency with @@ -1027,17 +1028,24 @@ static int sym53c8xx_slave_alloc(struct scsi_device *sdev) * lun devices behave badly when asked for a non zero LUN. */ - if ((tp->usrflags & SYM_SCAN_BOOT_DISABLED) || - ((tp->usrflags & SYM_SCAN_LUNS_DISABLED) && sdev->lun != 0)) { + if (tp->usrflags & SYM_SCAN_BOOT_DISABLED) { tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED; + starget_printk(KERN_INFO, tp->starget, + "Scan at boot disabled in NVRAM\n"); return -ENXIO; } + if (tp->usrflags & SYM_SCAN_LUNS_DISABLED) { + if (sdev->lun != 0) + return -ENXIO; + starget_printk(KERN_INFO, tp->starget, + "Multiple LUNs disabled in NVRAM\n"); + } + lp = sym_alloc_lcb(np, sdev->id, sdev->lun); if (!lp) return -ENOMEM; - tp->starget = sdev->sdev_target; spi_min_period(tp->starget) = tp->usr_period; spi_max_width(tp->starget) = tp->usr_width; diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 0b0cba0d0bb..7a3c807dcfc 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -616,29 +616,6 @@ static __inline void sym_init_burst(struct sym_hcb *np, u_char bc) } } - -/* - * Print out the list of targets that have some flag disabled by user. - */ -static void sym_print_targets_flag(struct sym_hcb *np, int mask, char *msg) -{ - int cnt; - int i; - - for (cnt = 0, i = 0 ; i < SYM_CONF_MAX_TARGET ; i++) { - if (i == np->myaddr) - continue; - if (np->target[i].usrflags & mask) { - if (!cnt++) - printf("%s: %s disabled for targets", - sym_name(np), msg); - printf(" %d", i); - } - } - if (cnt) - printf(".\n"); -} - /* * Save initial settings of some IO registers. * Assumed to have been set by BIOS. @@ -986,13 +963,6 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru sym_name(np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl, np->rv_ctest3, np->rv_ctest4, np->rv_ctest5); } - /* - * Let user be aware of targets that have some disable flags set. - */ - sym_print_targets_flag(np, SYM_SCAN_BOOT_DISABLED, "SCAN AT BOOT"); - if (sym_verbose) - sym_print_targets_flag(np, SYM_SCAN_LUNS_DISABLED, - "SCAN FOR LUNS"); return 0; } -- cgit v1.2.3 From ad94c9340a76db187166f2342ba0ff568dc7801f Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Tue, 29 Nov 2005 23:08:48 -0500 Subject: [SCSI] sym2: Version 2.2.2 Update version number to 2.2.2 Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sym53c8xx_2/sym_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sym53c8xx_2/sym_defs.h b/drivers/scsi/sym53c8xx_2/sym_defs.h index 2d9437d7242..3659dd7b9d7 100644 --- a/drivers/scsi/sym53c8xx_2/sym_defs.h +++ b/drivers/scsi/sym53c8xx_2/sym_defs.h @@ -40,7 +40,7 @@ #ifndef SYM_DEFS_H #define SYM_DEFS_H -#define SYM_VERSION "2.2.1" +#define SYM_VERSION "2.2.2" #define SYM_DRIVER_NAME "sym-" SYM_VERSION /* -- cgit v1.2.3 From 0d2f16559a9015c4daa8babfc443bf2b8740fbd9 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:12:46 -0600 Subject: [SCSI] iscsi: opcode check fix Must check only valid opcode bits. Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 4fea3e4edaa..0769e948219 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -584,7 +584,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) } /* save opcode for later */ - conn->in.opcode = hdr->opcode; + conn->in.opcode = hdr->opcode & ISCSI_OPCODE_MASK; /* verify itt (itt encoding: age+cid+itt) */ if (hdr->itt != cpu_to_be32(ISCSI_RESERVED_TAG)) { -- cgit v1.2.3 From e6273993dbcb8d805dd868e2128c3503a3bb1964 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:12:49 -0600 Subject: [SCSI] iscsi: redirect fix From tomof@acm.org: There is one more issue about Equallogic systems. They send re-direction info with FIN. I think that the kernel module needs to let iscsid to read data from the socket before killing it. Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0769e948219..f12d605c772 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -1237,8 +1237,9 @@ iscsi_tcp_state_change(struct sock *sk) conn = (struct iscsi_conn*)sk->sk_user_data; session = conn->session; - if (sk->sk_state == TCP_CLOSE_WAIT || - sk->sk_state == TCP_CLOSE) { + if ((sk->sk_state == TCP_CLOSE_WAIT || + sk->sk_state == TCP_CLOSE) && + !atomic_read(&sk->sk_rmem_alloc)) { debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n"); iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED); } -- cgit v1.2.3 From 733bb6a70cb351786f3c2290ab22f71b612e6893 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:12:54 -0600 Subject: [SCSI] iscsi: iscsi response fix from Wang Zhenyu: Must check SCSI CMD and R2T response according to the spec Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index f12d605c772..e6991515ad2 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -642,9 +642,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) switch(conn->in.opcode) { case ISCSI_OP_SCSI_CMD_RSP: BUG_ON((void*)ctask != ctask->sc->SCp.ptr); - if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE) - rc = iscsi_cmd_rsp(conn, ctask); - else if (!conn->in.datalen) + if (!conn->in.datalen) rc = iscsi_cmd_rsp(conn, ctask); else /* @@ -666,8 +664,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) break; case ISCSI_OP_R2T: BUG_ON((void*)ctask != ctask->sc->SCp.ptr); - if (ctask->hdr.flags & ISCSI_FLAG_CMD_WRITE && - ctask->sc->sc_data_direction == DMA_TO_DEVICE) + if (ctask->sc->sc_data_direction == DMA_TO_DEVICE) rc = iscsi_r2t_rsp(conn, ctask); else rc = ISCSI_ERR_PROTO; -- cgit v1.2.3 From f6cfba1d21e9e4afd80e2274aa4df3dc1bd0aab7 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:12:57 -0600 Subject: [SCSI] iscsi: data digest calculation fix From Wang Zhenyu: data digest fix (the bug caused data corruption w/Wasabi StorageBuilder target) Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 65 +++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 25 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index e6991515ad2..83e2f8c8e49 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -903,11 +903,20 @@ partial_sg_digest_update(struct iscsi_conn *conn, struct scatterlist *sg, crypto_digest_update(conn->data_rx_tfm, &temp, 1); } +static void +iscsi_recv_digest_update(struct iscsi_conn *conn, char* buf, int len) +{ + struct scatterlist tmp; + + sg_init_one(&tmp, buf, len); + crypto_digest_update(conn->data_rx_tfm, &tmp, 1); +} + static int iscsi_scsi_data_in(struct iscsi_conn *conn) { struct iscsi_cmd_task *ctask = conn->in.ctask; struct scsi_cmnd *sc = ctask->sc; - struct scatterlist tmp, *sg; + struct scatterlist *sg; int i, offset, rc = 0; BUG_ON((void*)ctask != sc->SCp.ptr); @@ -921,10 +930,8 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) sc->request_bufflen, ctask->data_offset); if (rc == -EAGAIN) return rc; - if (conn->datadgst_en) { - sg_init_one(&tmp, sc->request_buffer, i); - crypto_digest_update(conn->data_rx_tfm, &tmp, 1); - } + if (conn->datadgst_en) + iscsi_recv_digest_update(conn, sc->request_buffer, i); rc = 0; goto done; } @@ -1018,6 +1025,9 @@ iscsi_data_recv(struct iscsi_conn *conn) conn->in.hdr = &conn->hdr; conn->senselen = (conn->data[0] << 8) | conn->data[1]; rc = iscsi_cmd_rsp(conn, conn->in.ctask); + if (!rc && conn->datadgst_en) + iscsi_recv_digest_update(conn, conn->data, + conn->in.datalen); } break; case ISCSI_OP_TEXT_RSP: @@ -1042,6 +1052,11 @@ iscsi_data_recv(struct iscsi_conn *conn) rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr, conn->data, conn->in.datalen); + if (!rc && conn->datadgst_en && + conn->in.opcode != ISCSI_OP_LOGIN_RSP) + iscsi_recv_digest_update(conn, conn->data, + conn->in.datalen); + if (mtask && conn->login_mtask != mtask) { spin_lock(&session->lock); __kfifo_put(session->mgmtpool.queue, (void*)&mtask, @@ -1050,6 +1065,8 @@ iscsi_data_recv(struct iscsi_conn *conn) } } break; + case ISCSI_OP_ASYNC_EVENT: + case ISCSI_OP_REJECT: default: BUG_ON(1); } @@ -1112,7 +1129,7 @@ more: rc = iscsi_hdr_recv(conn); if (!rc && conn->in.datalen) { if (conn->datadgst_en && - conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) { + conn->in.opcode != ISCSI_OP_LOGIN_RSP) { BUG_ON(!conn->data_rx_tfm); crypto_digest_init(conn->data_rx_tfm); } @@ -1124,26 +1141,24 @@ more: } if (conn->in_progress == IN_PROGRESS_DDIGEST_RECV) { + uint32_t recv_digest; debug_tcp("extra data_recv offset %d copy %d\n", conn->in.offset, conn->in.copy); - if (conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) { - uint32_t recv_digest; - skb_copy_bits(conn->in.skb, conn->in.offset, - &recv_digest, 4); - conn->in.offset += 4; - conn->in.copy -= 4; - if (recv_digest != conn->in.datadgst) { - debug_tcp("iscsi_tcp: data digest error!" - "0x%x != 0x%x\n", recv_digest, - conn->in.datadgst); - iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST); - return 0; - } else { - debug_tcp("iscsi_tcp: data digest match!" - "0x%x == 0x%x\n", recv_digest, - conn->in.datadgst); - conn->in_progress = IN_PROGRESS_WAIT_HEADER; - } + skb_copy_bits(conn->in.skb, conn->in.offset, + &recv_digest, 4); + conn->in.offset += 4; + conn->in.copy -= 4; + if (recv_digest != conn->in.datadgst) { + debug_tcp("iscsi_tcp: data digest error!" + "0x%x != 0x%x\n", recv_digest, + conn->in.datadgst); + iscsi_conn_failure(conn, ISCSI_ERR_DATA_DGST); + return 0; + } else { + debug_tcp("iscsi_tcp: data digest match!" + "0x%x == 0x%x\n", recv_digest, + conn->in.datadgst); + conn->in_progress = IN_PROGRESS_WAIT_HEADER; } } @@ -1165,7 +1180,7 @@ more: conn->in.copy -= conn->in.padding; conn->in.offset += conn->in.padding; if (conn->datadgst_en && - conn->in.opcode == ISCSI_OP_SCSI_DATA_IN) { + conn->in.opcode != ISCSI_OP_LOGIN_RSP) { if (conn->in.padding) { debug_tcp("padding -> %d\n", conn->in.padding); memset(pad, 0, conn->in.padding); -- cgit v1.2.3 From 9e3961ba2be51a88c6223143568c80e0616d93ce Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:12:59 -0600 Subject: [SCSI] iscsi: lower queue depth From Wang Zhenyu: High queue depth was a problem for some targets so make queue_depth adjustable From Mike Christie Make default queue_depth a little lower Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 20 +++++++++++++++----- drivers/scsi/iscsi_tcp.h | 3 ++- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 83e2f8c8e49..5b14c404069 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -2401,6 +2401,15 @@ fault: return 0; } +static int +iscsi_change_queue_depth(struct scsi_device *sdev, int depth) +{ + if (depth > ISCSI_MAX_CMD_PER_LUN) + depth = ISCSI_MAX_CMD_PER_LUN; + scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth); + return sdev->queue_depth; +} + static int iscsi_pool_init(struct iscsi_queue *q, int max, void ***items, int item_size) { @@ -3260,13 +3269,14 @@ iscsi_r2tpool_free(struct iscsi_session *session) static struct scsi_host_template iscsi_sht = { .name = "iSCSI Initiator over TCP/IP, v." ISCSI_VERSION_STR, - .queuecommand = iscsi_queuecommand, + .queuecommand = iscsi_queuecommand, + .change_queue_depth = iscsi_change_queue_depth, .can_queue = ISCSI_XMIT_CMDS_MAX - 1, .sg_tablesize = ISCSI_SG_TABLESIZE, - .cmd_per_lun = ISCSI_CMD_PER_LUN, - .eh_abort_handler = iscsi_eh_abort, - .eh_host_reset_handler = iscsi_eh_host_reset, - .use_clustering = DISABLE_CLUSTERING, + .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN, + .eh_abort_handler = iscsi_eh_abort, + .eh_host_reset_handler = iscsi_eh_host_reset, + .use_clustering = DISABLE_CLUSTERING, .proc_name = "iscsi_tcp", .this_id = -1, }; diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h index d23ae68fae0..855f2dfd18a 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -71,7 +71,8 @@ #define ISCSI_MGMT_CMDS_MAX 32 /* must be power of 2 */ #define ISCSI_MGMT_ITT_OFFSET 0xa00 #define ISCSI_SG_TABLESIZE SG_ALL -#define ISCSI_CMD_PER_LUN 128 +#define ISCSI_DEF_CMD_PER_LUN 32 +#define ISCSI_MAX_CMD_PER_LUN 128 #define ISCSI_TCP_MAX_CMD_LEN 16 #define ITT_MASK (0xfff) -- cgit v1.2.3 From 4d841d6bd94d55642f8dbb11d6b672b3b50ff82e Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 29 Nov 2005 23:13:01 -0600 Subject: [SCSI] iscsi: update version Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 5b14c404069..feb8731907c 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -49,7 +49,7 @@ MODULE_AUTHOR("Dmitry Yusupov , " "Alex Aizman "); MODULE_DESCRIPTION("iSCSI/TCP data-path"); MODULE_LICENSE("GPL"); -MODULE_VERSION("0:4.409"); +MODULE_VERSION("0:4.445"); /* #define DEBUG_TCP */ /* #define DEBUG_SCSI */ #define DEBUG_ASSERT -- cgit v1.2.3 From 8a47cd340b4a299087f926ff2780d1eb08513f04 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Wed, 30 Nov 2005 02:27:19 -0600 Subject: [SCSI] iscsi: check header digests for mgmt tasks From Wang Zhenyu: check header digest for cmd and mgmt tasks Signed-off-by: Wang Zhenyu Signed-off-by: Mike Christie Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index feb8731907c..2d12355eed3 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -581,6 +581,12 @@ iscsi_hdr_recv(struct iscsi_conn *conn) crypto_digest_digest(conn->rx_tfm, &sg, 1, (u8 *)&cdgst); rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) + conn->in.ahslen); + if (cdgst != rdgst) { + printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error " + "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst, + cdgst); + return ISCSI_ERR_HDR_DGST; + } } /* save opcode for later */ @@ -610,13 +616,6 @@ iscsi_hdr_recv(struct iscsi_conn *conn) conn->in.ahslen, conn->in.datalen); if (conn->in.itt < session->cmds_max) { - if (conn->hdrdgst_en && cdgst != rdgst) { - printk(KERN_ERR "iscsi_tcp: itt %x: hdrdgst error " - "recv 0x%x calc 0x%x\n", conn->in.itt, rdgst, - cdgst); - return ISCSI_ERR_HDR_DGST; - } - ctask = (struct iscsi_cmd_task *)session->cmds[conn->in.itt]; if (!ctask->sc) { @@ -1128,8 +1127,7 @@ more: */ rc = iscsi_hdr_recv(conn); if (!rc && conn->in.datalen) { - if (conn->datadgst_en && - conn->in.opcode != ISCSI_OP_LOGIN_RSP) { + if (conn->datadgst_en) { BUG_ON(!conn->data_rx_tfm); crypto_digest_init(conn->data_rx_tfm); } @@ -1179,8 +1177,7 @@ more: } conn->in.copy -= conn->in.padding; conn->in.offset += conn->in.padding; - if (conn->datadgst_en && - conn->in.opcode != ISCSI_OP_LOGIN_RSP) { + if (conn->datadgst_en) { if (conn->in.padding) { debug_tcp("padding -> %d\n", conn->in.padding); memset(pad, 0, conn->in.padding); @@ -2875,8 +2872,11 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag) * in hdr_extract() and will be re-negotiated at * set_param() time. */ - if (flag == STOP_CONN_RECOVER) + if (flag == STOP_CONN_RECOVER) { conn->hdr_size = sizeof(struct iscsi_hdr); + conn->hdrdgst_en = 0; + conn->datadgst_en = 0; + } } up(&conn->xmitsema); } -- cgit v1.2.3 From 7f23e146a122966bd58e5da9c16a0e12385f09fc Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Thu, 1 Dec 2005 12:50:13 -0600 Subject: [SCSI] correct some dropped const compiler warnings Make the vendor, model and rev fields in scsi_device pointers to const and update a few prototypes of functions using them. Signed-off-by: James Bottomley --- drivers/scsi/scsi_devinfo.c | 5 +++-- drivers/scsi/scsi_priv.h | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index e69477d1889..f01ec0a7c50 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c @@ -354,8 +354,9 @@ static int scsi_dev_info_list_add_str(char *dev_list) * @model, if found, return the matching flags value, else return * the host or global default settings. **/ -int scsi_get_device_flags(struct scsi_device *sdev, unsigned char *vendor, - unsigned char *model) +int scsi_get_device_flags(struct scsi_device *sdev, + const unsigned char *vendor, + const unsigned char *model) { struct scsi_dev_info_list *devinfo; unsigned int bflags; diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index d632d9e1493..a8d121c8fbc 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -57,7 +57,8 @@ static inline void scsi_log_completion(struct scsi_cmnd *cmd, int disposition) /* scsi_devinfo.c */ extern int scsi_get_device_flags(struct scsi_device *sdev, - unsigned char *vendor, unsigned char *model); + const unsigned char *vendor, + const unsigned char *model); extern int __init scsi_init_devinfo(void); extern void scsi_exit_devinfo(void); -- cgit v1.2.3 From 0a21ef1e603096a8f57fcd7fa0b8b53e7147d3b9 Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Thu, 1 Dec 2005 12:51:50 -0600 Subject: [SCSI] qla2xxx: fix compile error caused by pci_dev.owner move Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_os.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 41d2aeee096..24304300d7b 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -2611,7 +2611,9 @@ qla2xxx_remove_one(struct pci_dev *pdev) static struct pci_driver qla2xxx_pci_driver = { .name = "qla2xxx", - .owner = THIS_MODULE, + .driver = { + .owner = THIS_MODULE, + }, .id_table = qla2xxx_pci_tbl, .probe = qla2xxx_probe_one, .remove = __devexit_p(qla2xxx_remove_one), -- cgit v1.2.3 From 1de933f35b17622f977eff1630eb1f2c92e9450c Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:41:15 -0500 Subject: [SCSI] lpfc 8.1.1: Miscellaneous Cleanups Miscellaneous Cleanups: - Remove ProgType READ_REV mailbox command value check in lpfc_config_port_prep. - Convert simple printk to an lpfc_printf_log in queuecommand. - Modify lpfc_abort_handler message 0749 to display more accurate text and data. - Minor style cleanup: fix 3 long lines in lpfc_hw.h Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_hw.h | 9 ++++++--- drivers/scsi/lpfc/lpfc_init.c | 34 +++++++++++++--------------------- drivers/scsi/lpfc/lpfc_scsi.c | 9 +++++---- 3 files changed, 24 insertions(+), 28 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 86c41981188..bf0c25fa873 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h @@ -266,9 +266,11 @@ struct lpfc_name { struct { #ifdef __BIG_ENDIAN_BITFIELD uint8_t nameType:4; /* FC Word 0, bit 28:31 */ - uint8_t IEEEextMsn:4; /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */ + uint8_t IEEEextMsn:4; /* FC Word 0, bit 24:27, bit + 8:11 of IEEE ext */ #else /* __LITTLE_ENDIAN_BITFIELD */ - uint8_t IEEEextMsn:4; /* FC Word 0, bit 24:27, bit 8:11 of IEEE ext */ + uint8_t IEEEextMsn:4; /* FC Word 0, bit 24:27, bit + 8:11 of IEEE ext */ uint8_t nameType:4; /* FC Word 0, bit 28:31 */ #endif @@ -278,7 +280,8 @@ struct lpfc_name { #define NAME_IP_TYPE 0x4 /* IP address */ #define NAME_CCITT_TYPE 0xC #define NAME_CCITT_GR_TYPE 0xE - uint8_t IEEEextLsb; /* FC Word 0, bit 16:23, IEEE extended Lsb */ + uint8_t IEEEextLsb; /* FC Word 0, bit 16:23, IEEE + extended Lsb */ uint8_t IEEE[6]; /* FC IEEE address */ } s; uint8_t wwn[8]; diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 07498118359..3eebe663a2e 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -126,34 +126,26 @@ lpfc_config_port_prep(struct lpfc_hba * phba) return -ERESTART; } - /* The HBA's current state is provided by the ProgType and rr fields. - * Read and check the value of these fields before continuing to config - * this port. + /* + * The value of rr must be 1 since the driver set the cv field to 1. + * This setting requires the FW to set all revision fields. */ - if (mb->un.varRdRev.rr == 0 || mb->un.varRdRev.un.b.ProgType != 2) { - /* Old firmware */ + if (mb->un.varRdRev.rr == 0) { vp->rev.rBit = 0; - lpfc_printf_log(phba, - KERN_ERR, - LOG_INIT, - "%d:0440 Adapter failed to init, mbxCmd x%x " - "READ_REV detected outdated firmware" - "Data: x%x\n", - phba->brd_no, - mb->mbxCommand, 0); + lpfc_printf_log(phba, KERN_ERR, LOG_INIT, + "%d:0440 Adapter failed to init, READ_REV has " + "missing revision information.\n", + phba->brd_no); mempool_free(pmb, phba->mbox_mem_pool); return -ERESTART; - } else { - vp->rev.rBit = 1; - vp->rev.sli1FwRev = mb->un.varRdRev.sli1FwRev; - memcpy(vp->rev.sli1FwName, - (char*)mb->un.varRdRev.sli1FwName, 16); - vp->rev.sli2FwRev = mb->un.varRdRev.sli2FwRev; - memcpy(vp->rev.sli2FwName, - (char *)mb->un.varRdRev.sli2FwName, 16); } /* Save information as VPD data */ + vp->rev.rBit = 1; + vp->rev.sli1FwRev = mb->un.varRdRev.sli1FwRev; + memcpy(vp->rev.sli1FwName, (char*) mb->un.varRdRev.sli1FwName, 16); + vp->rev.sli2FwRev = mb->un.varRdRev.sli2FwRev; + memcpy(vp->rev.sli2FwName, (char *) mb->un.varRdRev.sli2FwName, 16); vp->rev.biuRev = mb->un.varRdRev.biuRev; vp->rev.smRev = mb->un.varRdRev.smRev; vp->rev.smFwRev = mb->un.varRdRev.un.smFwRev; diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index c63275e66e2..0aa5ca68433 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -721,8 +721,9 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) } lpfc_cmd = lpfc_sli_get_scsi_buf (phba); if (lpfc_cmd == NULL) { - printk(KERN_WARNING "%s: No buffer available - list empty, " - "total count %d\n", __FUNCTION__, phba->total_scsi_bufs); + lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + "%d:0707 driver's buffer pool is empty, " + "IO busied\n", phba->brd_no); goto out_host_busy; } @@ -844,8 +845,8 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd) out: lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, - "%d:0749 SCSI layer issued abort device: ret %#x, " - "ID %d, LUN %d, snum %#lx\n", + "%d:0749 SCSI Layer I/O Abort Request " + "Status x%x ID %d LUN %d snum %#lx\n", phba->brd_no, ret, cmnd->device->id, cmnd->device->lun, cmnd->serial_number); -- cgit v1.2.3 From 2fb70f79936e7180e8b0287a4053b8ba89182717 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:41:24 -0500 Subject: [SCSI] lpfc 8.1.1 : Correct some 8bit to 16bit field conversions/comparisons Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_nportdisc.c | 69 +++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 24 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_nportdisc.c b/drivers/scsi/lpfc/lpfc_nportdisc.c index 507a6af56f4..fbead786031 100644 --- a/drivers/scsi/lpfc/lpfc_nportdisc.c +++ b/drivers/scsi/lpfc/lpfc_nportdisc.c @@ -55,55 +55,76 @@ lpfc_check_adisc(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, return (1); } - int lpfc_check_sparm(struct lpfc_hba * phba, struct lpfc_nodelist * ndlp, struct serv_parm * sp, uint32_t class) { volatile struct serv_parm *hsp = &phba->fc_sparam; - /* First check for supported version */ - - /* Next check for class validity */ + uint16_t hsp_value, ssp_value = 0; + + /* + * The receive data field size and buffer-to-buffer receive data field + * size entries are 16 bits but are represented as two 8-bit fields in + * the driver data structure to account for rsvd bits and other control + * bits. Reconstruct and compare the fields as a 16-bit values before + * correcting the byte values. + */ if (sp->cls1.classValid) { - - if (sp->cls1.rcvDataSizeMsb > hsp->cls1.rcvDataSizeMsb) - sp->cls1.rcvDataSizeMsb = hsp->cls1.rcvDataSizeMsb; - if (sp->cls1.rcvDataSizeLsb > hsp->cls1.rcvDataSizeLsb) + hsp_value = (hsp->cls1.rcvDataSizeMsb << 8) | + hsp->cls1.rcvDataSizeLsb; + ssp_value = (sp->cls1.rcvDataSizeMsb << 8) | + sp->cls1.rcvDataSizeLsb; + if (ssp_value > hsp_value) { sp->cls1.rcvDataSizeLsb = hsp->cls1.rcvDataSizeLsb; + sp->cls1.rcvDataSizeMsb = hsp->cls1.rcvDataSizeMsb; + } } else if (class == CLASS1) { - return (0); + return 0; } if (sp->cls2.classValid) { - - if (sp->cls2.rcvDataSizeMsb > hsp->cls2.rcvDataSizeMsb) - sp->cls2.rcvDataSizeMsb = hsp->cls2.rcvDataSizeMsb; - if (sp->cls2.rcvDataSizeLsb > hsp->cls2.rcvDataSizeLsb) + hsp_value = (hsp->cls2.rcvDataSizeMsb << 8) | + hsp->cls2.rcvDataSizeLsb; + ssp_value = (sp->cls2.rcvDataSizeMsb << 8) | + sp->cls2.rcvDataSizeLsb; + if (ssp_value > hsp_value) { sp->cls2.rcvDataSizeLsb = hsp->cls2.rcvDataSizeLsb; + sp->cls2.rcvDataSizeMsb = hsp->cls2.rcvDataSizeMsb; + } } else if (class == CLASS2) { - return (0); + return 0; } if (sp->cls3.classValid) { - - if (sp->cls3.rcvDataSizeMsb > hsp->cls3.rcvDataSizeMsb) - sp->cls3.rcvDataSizeMsb = hsp->cls3.rcvDataSizeMsb; - if (sp->cls3.rcvDataSizeLsb > hsp->cls3.rcvDataSizeLsb) + hsp_value = (hsp->cls3.rcvDataSizeMsb << 8) | + hsp->cls3.rcvDataSizeLsb; + ssp_value = (sp->cls3.rcvDataSizeMsb << 8) | + sp->cls3.rcvDataSizeLsb; + if (ssp_value > hsp_value) { sp->cls3.rcvDataSizeLsb = hsp->cls3.rcvDataSizeLsb; + sp->cls3.rcvDataSizeMsb = hsp->cls3.rcvDataSizeMsb; + } } else if (class == CLASS3) { - return (0); + return 0; } - if (sp->cmn.bbRcvSizeMsb > hsp->cmn.bbRcvSizeMsb) - sp->cmn.bbRcvSizeMsb = hsp->cmn.bbRcvSizeMsb; - if (sp->cmn.bbRcvSizeLsb > hsp->cmn.bbRcvSizeLsb) + /* + * Preserve the upper four bits of the MSB from the PLOGI response. + * These bits contain the Buffer-to-Buffer State Change Number + * from the target and need to be passed to the FW. + */ + hsp_value = (hsp->cmn.bbRcvSizeMsb << 8) | hsp->cmn.bbRcvSizeLsb; + ssp_value = (sp->cmn.bbRcvSizeMsb << 8) | sp->cmn.bbRcvSizeLsb; + if (ssp_value > hsp_value) { sp->cmn.bbRcvSizeLsb = hsp->cmn.bbRcvSizeLsb; + sp->cmn.bbRcvSizeMsb = (sp->cmn.bbRcvSizeMsb & 0xF0) | + (hsp->cmn.bbRcvSizeMsb & 0x0F); + } - /* If check is good, copy wwpn wwnn into ndlp */ memcpy(&ndlp->nlp_nodename, &sp->nodeName, sizeof (struct lpfc_name)); memcpy(&ndlp->nlp_portname, &sp->portName, sizeof (struct lpfc_name)); - return (1); + return 1; } static void * -- cgit v1.2.3 From 6281bfe0002acd7765cb4afe0304c36962ad6b15 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:41:33 -0500 Subject: [SCSI] lpfc 8.1.1 : Fixes for short cable pulls Cause: Link bounces were causing discovery ELS's to be killed. Driver was not properly flushing ELS commands upon the subsequent link bounces. Thus, processing of ELS post link bounce erroneously assumed discovery failure and device loss. Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_els.c | 4 ++++ drivers/scsi/lpfc/lpfc_init.c | 2 ++ 2 files changed, 6 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index bcc29ec126d..20f1a0713db 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c @@ -720,6 +720,7 @@ lpfc_cmpl_els_plogi(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || + (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); } @@ -869,6 +870,7 @@ lpfc_cmpl_els_prli(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || + (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { goto out; } @@ -1054,6 +1056,7 @@ lpfc_cmpl_els_adisc(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || + (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { disc = (ndlp->nlp_flag & NLP_NPR_2B_DISC); } @@ -1205,6 +1208,7 @@ lpfc_cmpl_els_logo(struct lpfc_hba * phba, struct lpfc_iocbq * cmdiocb, /* Do not call DSM for lpfc_els_abort'ed ELS cmds */ if ((irsp->ulpStatus == IOSTAT_LOCAL_REJECT) && ((irsp->un.ulpWord[4] == IOERR_SLI_ABORTED) || + (irsp->un.ulpWord[4] == IOERR_LINK_DOWN) || (irsp->un.ulpWord[4] == IOERR_SLI_DOWN))) { goto out; } diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 3eebe663a2e..4d4e217edd8 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -563,6 +563,8 @@ lpfc_handle_latt(struct lpfc_hba * phba) rc = -EIO; + /* Cleanup any outstanding ELS commands */ + lpfc_els_flush_cmd(phba); psli->slistat.link_event++; lpfc_read_la(phba, pmb, mp); -- cgit v1.2.3 From 23dc04f1ec0d2f8fdda82ad1f9aa87b6ed74cd4a Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:41:44 -0500 Subject: [SCSI] lpfc 8.1.1 : Adjust use of scsi_block_requests and interaction w/ FC transport - Remove unnecessary scsi_block_requests calls on rport deletes. This was deadlocking the sdev removals as they wanted to flush commands. - No longer block requests when adding the remote port (to block discovery). Instead, register, then change port role. Maps to Qlogic behavior, and closer to the register-node-upon-first-ELS behavior. Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_hbadisc.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 259eeb161b8..a1f751e7940 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c @@ -1017,12 +1017,7 @@ lpfc_register_remote_port(struct lpfc_hba * phba, rport_ids.port_name = wwn_to_u64(ndlp->nlp_portname.u.wwn); rport_ids.port_id = ndlp->nlp_DID; rport_ids.roles = FC_RPORT_ROLE_UNKNOWN; - if (ndlp->nlp_type & NLP_FCP_TARGET) - rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET; - if (ndlp->nlp_type & NLP_FCP_INITIATOR) - rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR; - scsi_block_requests(phba->host); ndlp->rport = rport = fc_remote_port_add(phba->host, 0, &rport_ids); if (!rport) { dev_printk(KERN_WARNING, &phba->pcidev->dev, @@ -1039,7 +1034,16 @@ lpfc_register_remote_port(struct lpfc_hba * phba, } rdata = rport->dd_data; rdata->pnode = ndlp; - scsi_unblock_requests(phba->host); + + if (ndlp->nlp_type & NLP_FCP_TARGET) + rport_ids.roles |= FC_RPORT_ROLE_FCP_TARGET; + if (ndlp->nlp_type & NLP_FCP_INITIATOR) + rport_ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR; + + + if (rport_ids.roles != FC_RPORT_ROLE_UNKNOWN) + fc_remote_port_rolechg(rport, rport_ids.roles); + return; } @@ -1053,9 +1057,7 @@ lpfc_unregister_remote_port(struct lpfc_hba * phba, ndlp->rport = NULL; rdata->pnode = NULL; - scsi_block_requests(phba->host); fc_remote_port_delete(rport); - scsi_unblock_requests(phba->host); return; } -- cgit v1.2.3 From 63c59c3b8ff444b771a245f59935c0202ece963b Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:41:53 -0500 Subject: [SCSI] lpfc 8.1.1 : Remove locking wrappers around error handlers Remove locking wrappers around error handlers. Wrappers were added in early 2.6.13 api change Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_scsi.c | 52 ++++++++++++------------------------------- 1 file changed, 14 insertions(+), 38 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 0aa5ca68433..a4d8455de44 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -760,11 +760,12 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) return 0; } + static int -__lpfc_abort_handler(struct scsi_cmnd *cmnd) +lpfc_abort_handler(struct scsi_cmnd *cmnd) { - struct lpfc_hba *phba = - (struct lpfc_hba *)cmnd->device->host->hostdata[0]; + struct Scsi_Host *shost = cmnd->device->host; + struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; struct lpfc_sli_ring *pring = &phba->sli.ring[phba->sli.fcp_ring]; struct lpfc_iocbq *iocb; struct lpfc_iocbq *abtsiocb; @@ -773,6 +774,7 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd) unsigned int loop_count = 0; int ret = SUCCESS; + spin_lock_irq(shost->host_lock); lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble; BUG_ON(!lpfc_cmd); @@ -850,21 +852,13 @@ __lpfc_abort_handler(struct scsi_cmnd *cmnd) phba->brd_no, ret, cmnd->device->id, cmnd->device->lun, cmnd->serial_number); - return ret; -} + spin_unlock_irq(shost->host_lock); -static int -lpfc_abort_handler(struct scsi_cmnd *cmnd) -{ - int rc; - spin_lock_irq(cmnd->device->host->host_lock); - rc = __lpfc_abort_handler(cmnd); - spin_unlock_irq(cmnd->device->host->host_lock); - return rc; + return ret; } static int -__lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) +lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) { struct Scsi_Host *shost = cmnd->device->host; struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; @@ -875,6 +869,7 @@ __lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) int ret = FAILED; int cnt, loopcnt; + spin_lock_irq(shost->host_lock); /* * If target is not in a MAPPED state, delay the reset until * target is rediscovered or nodev timeout expires. @@ -964,24 +959,12 @@ out_free_scsi_buf: lpfc_cmd->result); lpfc_release_scsi_buf(phba, lpfc_cmd); out: + spin_unlock_irq(shost->host_lock); return ret; } static int -lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) -{ - int rc; - spin_lock_irq(cmnd->device->host->host_lock); - rc = __lpfc_reset_lun_handler(cmnd); - spin_unlock_irq(cmnd->device->host->host_lock); - return rc; -} - -/* - * Note: midlayer calls this function with the host_lock held - */ -static int -__lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) +lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) { struct Scsi_Host *shost = cmnd->device->host; struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0]; @@ -992,6 +975,8 @@ __lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) unsigned int midlayer_id = 0; struct lpfc_scsi_buf * lpfc_cmd; + spin_lock_irq(shost->host_lock); + lpfc_cmd = lpfc_sli_get_scsi_buf (phba); if (lpfc_cmd == NULL) goto out; @@ -1067,19 +1052,10 @@ __lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) "%d:0714 SCSI layer issued Bus Reset Data: x%x\n", phba->brd_no, ret); out: + spin_unlock_irq(shost->host_lock); return ret; } -static int -lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) -{ - int rc; - spin_lock_irq(cmnd->device->host->host_lock); - rc = __lpfc_reset_bus_handler(cmnd); - spin_unlock_irq(cmnd->device->host->host_lock); - return rc; -} - static int lpfc_slave_alloc(struct scsi_device *sdev) { -- cgit v1.2.3 From 6175c02a0b12f92c03b56c756c4f1e131ae1456c Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:42:05 -0500 Subject: [SCSI] lpfc 8.1.1 : Fixes to error handlers - Release task management command before counting outstanding commands. TMF was being erroneously counted as an active outstanding command. - Serialize EH calls and block requests when EH function is running. Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc.h | 1 + drivers/scsi/lpfc/lpfc_init.c | 2 +- drivers/scsi/lpfc/lpfc_scsi.c | 104 +++++++++++++++++++++++++++--------------- 3 files changed, 70 insertions(+), 37 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 3062b39fbdb..dc73a2f8f12 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -167,6 +167,7 @@ struct lpfc_hba { dma_addr_t slim2p_mapping; uint16_t pci_cfg_value; + struct semaphore hba_can_block; uint32_t hba_state; #define LPFC_INIT_START 1 /* Initial state after board reset */ diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 4d4e217edd8..dfd59d21ec4 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -1345,7 +1345,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) goto out_put_host; host->unique_id = phba->brd_no; - + init_MUTEX(&phba->hba_can_block); INIT_LIST_HEAD(&phba->ctrspbuflist); INIT_LIST_HEAD(&phba->rnidrspbuflist); INIT_LIST_HEAD(&phba->freebufList); diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index a4d8455de44..7dc7810b748 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -41,6 +41,20 @@ #define LPFC_ABORT_WAIT 2 +static inline void +lpfc_block_requests(struct lpfc_hba * phba) +{ + down(&phba->hba_can_block); + scsi_block_requests(phba->host); +} + +static inline void +lpfc_unblock_requests(struct lpfc_hba * phba) +{ + scsi_unblock_requests(phba->host); + up(&phba->hba_can_block); +} + /* * This routine allocates a scsi buffer, which contains all the necessary * information needed to initiate a SCSI I/O. The non-DMAable buffer region @@ -774,6 +788,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) unsigned int loop_count = 0; int ret = SUCCESS; + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); lpfc_cmd = (struct lpfc_scsi_buf *)cmnd->host_scribble; @@ -853,6 +868,7 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) cmnd->device->lun, cmnd->serial_number); spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } @@ -866,9 +882,11 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) struct lpfc_iocbq *iocbq, *iocbqrsp; struct lpfc_rport_data *rdata = cmnd->device->hostdata; struct lpfc_nodelist *pnode = rdata->pnode; + uint32_t cmd_result = 0, cmd_status = 0; int ret = FAILED; int cnt, loopcnt; + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); /* * If target is not in a MAPPED state, delay the reset until @@ -912,26 +930,28 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) if (ret == IOCB_SUCCESS) ret = SUCCESS; - lpfc_cmd->result = iocbqrsp->iocb.un.ulpWord[4]; - lpfc_cmd->status = iocbqrsp->iocb.ulpStatus; - if (lpfc_cmd->status == IOSTAT_LOCAL_REJECT) - if (lpfc_cmd->result & IOERR_DRVR_MASK) - lpfc_cmd->status = IOSTAT_DRIVER_REJECT; + + cmd_result = iocbqrsp->iocb.un.ulpWord[4]; + cmd_status = iocbqrsp->iocb.ulpStatus; + + lpfc_sli_release_iocbq(phba, iocbqrsp); + lpfc_release_scsi_buf(phba, lpfc_cmd); /* - * All outstanding txcmplq I/Os should have been aborted by the target. + * All outstanding txcmplq I/Os should have been aborted by the device. * Unfortunately, some targets do not abide by this forcing the driver * to double check. */ - lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], - cmnd->device->id, cmnd->device->lun, 0, - LPFC_CTX_LUN); - + cnt = lpfc_sli_sum_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], + cmnd->device->id, cmnd->device->lun, + LPFC_CTX_LUN); + if (cnt) + lpfc_sli_abort_iocb(phba, + &phba->sli.ring[phba->sli.fcp_ring], + cmnd->device->id, cmnd->device->lun, + 0, LPFC_CTX_LUN); loopcnt = 0; - while((cnt = lpfc_sli_sum_iocb(phba, - &phba->sli.ring[phba->sli.fcp_ring], - cmnd->device->id, cmnd->device->lun, - LPFC_CTX_LUN))) { + while(cnt) { spin_unlock_irq(phba->host->host_lock); schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ); spin_lock_irq(phba->host->host_lock); @@ -939,6 +959,11 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) if (++loopcnt > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT) break; + + cnt = lpfc_sli_sum_iocb(phba, + &phba->sli.ring[phba->sli.fcp_ring], + cmnd->device->id, cmnd->device->lun, + LPFC_CTX_LUN); } if (cnt) { @@ -948,18 +973,16 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) ret = FAILED; } - lpfc_sli_release_iocbq(phba, iocbqrsp); - out_free_scsi_buf: lpfc_printf_log(phba, KERN_ERR, LOG_FCP, "%d:0713 SCSI layer issued LUN reset (%d, %d) " "Data: x%x x%x x%x\n", - phba->brd_no, lpfc_cmd->pCmd->device->id, - lpfc_cmd->pCmd->device->lun, ret, lpfc_cmd->status, - lpfc_cmd->result); - lpfc_release_scsi_buf(phba, lpfc_cmd); + phba->brd_no, cmnd->device->id,cmnd->device->lun, + ret, cmd_status, cmd_result); + out: spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } @@ -975,6 +998,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) unsigned int midlayer_id = 0; struct lpfc_scsi_buf * lpfc_cmd; + lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); lpfc_cmd = lpfc_sli_get_scsi_buf (phba); @@ -1008,18 +1032,31 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) lpfc_cmd->pCmd->device->hostdata = ndlp->rport->dd_data; ret = lpfc_scsi_tgt_reset(lpfc_cmd, phba); if (ret != SUCCESS) { - lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, "%d:0713 Bus Reset on target %d failed\n", phba->brd_no, i); err_count++; } } + if (err_count == 0) + ret = SUCCESS; + + lpfc_release_scsi_buf(phba, lpfc_cmd); + + /* + * All outstanding txcmplq I/Os should have been aborted by + * the targets. Unfortunately, some targets do not abide by + * this forcing the driver to double check. + */ cmnd->device->id = midlayer_id; + cnt = lpfc_sli_sum_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], + 0, 0, LPFC_CTX_HOST); + if (cnt) + lpfc_sli_abort_iocb(phba, &phba->sli.ring[phba->sli.fcp_ring], + 0, 0, 0, LPFC_CTX_HOST); loopcnt = 0; - while((cnt = lpfc_sli_sum_iocb(phba, - &phba->sli.ring[phba->sli.fcp_ring], - 0, 0, LPFC_CTX_HOST))) { + while(cnt) { spin_unlock_irq(phba->host->host_lock); schedule_timeout_uninterruptible(LPFC_RESET_WAIT*HZ); spin_lock_irq(phba->host->host_lock); @@ -1027,25 +1064,19 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) if (++loopcnt > (2 * phba->cfg_nodev_tmo)/LPFC_RESET_WAIT) break; + + cnt = lpfc_sli_sum_iocb(phba, + &phba->sli.ring[phba->sli.fcp_ring], + 0, 0, LPFC_CTX_HOST); } if (cnt) { - /* flush all outstanding commands on the host */ - i = lpfc_sli_abort_iocb(phba, - &phba->sli.ring[phba->sli.fcp_ring], 0, 0, 0, - LPFC_CTX_HOST); - - lpfc_printf_log(phba, KERN_INFO, LOG_FCP, + lpfc_printf_log(phba, KERN_ERR, LOG_FCP, "%d:0715 Bus Reset I/O flush failure: cnt x%x left x%x\n", phba->brd_no, cnt, i); - } - - if (cnt == 0) - ret = SUCCESS; - else ret = FAILED; + } - lpfc_release_scsi_buf(phba, lpfc_cmd); lpfc_printf_log(phba, KERN_ERR, LOG_FCP, @@ -1053,6 +1084,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) phba->brd_no, ret); out: spin_unlock_irq(shost->host_lock); + lpfc_unblock_requests(phba); return ret; } -- cgit v1.2.3 From e4adb20406385d1cc8fdb15e92ed7ac3d0ae41f6 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:42:12 -0500 Subject: [SCSI] lpfc 8.1.1 : Add support for more members of the Light Pulse 11xxx (4Gb) family Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_hw.h | 25 ++++++++++++------ drivers/scsi/lpfc/lpfc_init.c | 60 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 11 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index bf0c25fa873..4f002930141 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h @@ -1027,23 +1027,32 @@ typedef struct { /* Start FireFly Register definitions */ #define PCI_VENDOR_ID_EMULEX 0x10df #define PCI_DEVICE_ID_FIREFLY 0x1ae5 -#define PCI_DEVICE_ID_SUPERFLY 0xf700 -#define PCI_DEVICE_ID_DRAGONFLY 0xf800 #define PCI_DEVICE_ID_RFLY 0xf095 #define PCI_DEVICE_ID_PFLY 0xf098 +#define PCI_DEVICE_ID_LP101 0xf0a1 #define PCI_DEVICE_ID_TFLY 0xf0a5 +#define PCI_DEVICE_ID_BSMB 0xf0d1 +#define PCI_DEVICE_ID_BMID 0xf0d5 +#define PCI_DEVICE_ID_ZSMB 0xf0e1 +#define PCI_DEVICE_ID_ZMID 0xf0e5 +#define PCI_DEVICE_ID_NEPTUNE 0xf0f5 +#define PCI_DEVICE_ID_NEPTUNE_SCSP 0xf0f6 +#define PCI_DEVICE_ID_NEPTUNE_DCSP 0xf0f7 +#define PCI_DEVICE_ID_SUPERFLY 0xf700 +#define PCI_DEVICE_ID_DRAGONFLY 0xf800 #define PCI_DEVICE_ID_CENTAUR 0xf900 #define PCI_DEVICE_ID_PEGASUS 0xf980 #define PCI_DEVICE_ID_THOR 0xfa00 #define PCI_DEVICE_ID_VIPER 0xfb00 +#define PCI_DEVICE_ID_LP10000S 0xfc00 +#define PCI_DEVICE_ID_LP11000S 0xfc10 +#define PCI_DEVICE_ID_LPE11000S 0xfc20 #define PCI_DEVICE_ID_HELIOS 0xfd00 -#define PCI_DEVICE_ID_BMID 0xf0d5 -#define PCI_DEVICE_ID_BSMB 0xf0d1 +#define PCI_DEVICE_ID_HELIOS_SCSP 0xfd11 +#define PCI_DEVICE_ID_HELIOS_DCSP 0xfd12 #define PCI_DEVICE_ID_ZEPHYR 0xfe00 -#define PCI_DEVICE_ID_ZMID 0xf0e5 -#define PCI_DEVICE_ID_ZSMB 0xf0e1 -#define PCI_DEVICE_ID_LP101 0xf0a1 -#define PCI_DEVICE_ID_LP10000S 0xfc00 +#define PCI_DEVICE_ID_ZEPHYR_SCSP 0xfe11 +#define PCI_DEVICE_ID_ZEPHYR_DCSP 0xfe12 #define JEDEC_ID_ADDRESS 0x0080001c #define FIREFLY_JEDEC_ID 0x1ACC diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index dfd59d21ec4..1ab3dac7b63 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -759,15 +759,15 @@ static void lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) { lpfc_vpd_t *vp; - uint32_t id; + uint16_t dev_id; uint8_t hdrtype; char str[16]; vp = &phba->vpd; - pci_read_config_dword(phba->pcidev, PCI_VENDOR_ID, &id); + pci_read_config_word(phba->pcidev, PCI_DEVICE_ID, &dev_id); pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype); - switch ((id >> 16) & 0xffff) { + switch (dev_id) { case PCI_DEVICE_ID_FIREFLY: strcpy(str, "LP6000 1"); break; @@ -816,6 +816,24 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) else strcpy(str, "LP11000 4"); break; + case PCI_DEVICE_ID_HELIOS_SCSP: + strcpy(str, "LP11000-SP 4"); + break; + case PCI_DEVICE_ID_HELIOS_DCSP: + strcpy(str, "LP11002-SP 4"); + break; + case PCI_DEVICE_ID_NEPTUNE: + if (hdrtype == 0x80) + strcpy(str, "LPe1002 4"); + else + strcpy(str, "LPe1000 4"); + break; + case PCI_DEVICE_ID_NEPTUNE_SCSP: + strcpy(str, "LPe1000-SP 4"); + break; + case PCI_DEVICE_ID_NEPTUNE_DCSP: + strcpy(str, "LPe1002-SP 4"); + break; case PCI_DEVICE_ID_BMID: strcpy(str, "LP1150 4"); break; @@ -828,6 +846,12 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) else strcpy(str, "LPe11000 4"); break; + case PCI_DEVICE_ID_ZEPHYR_SCSP: + strcpy(str, "LPe11000-SP 4"); + break; + case PCI_DEVICE_ID_ZEPHYR_DCSP: + strcpy(str, "LPe11002-SP 4"); + break; case PCI_DEVICE_ID_ZMID: strcpy(str, "LPe1150 4"); break; @@ -843,6 +867,18 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) default: memset(str, 0, 16); break; + case PCI_DEVICE_ID_LP11000S: + if (hdrtype == 0x80) + strcpy(str, "LP11002-S 4"); + else + strcpy(str, "LP11000-S 4"); + break; + case PCI_DEVICE_ID_LPE11000S: + if (hdrtype == 0x80) + strcpy(str, "LPe11002-S 4"); + else + strcpy(str, "LPe11000-S 4"); + break; } if (mdp) sscanf(str, "%s", mdp); @@ -1673,14 +1709,28 @@ static struct pci_device_id lpfc_id_table[] = { PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_PFLY, PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE, + PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE_SCSP, + PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_NEPTUNE_DCSP, + PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS, PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS_SCSP, + PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_HELIOS_DCSP, + PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_BMID, PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_BSMB, PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR, PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_SCSP, + PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZEPHYR_DCSP, + PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZMID, PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_ZSMB, @@ -1691,6 +1741,10 @@ static struct pci_device_id lpfc_id_table[] = { PCI_ANY_ID, PCI_ANY_ID, }, {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LP10000S, PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LP11000S, + PCI_ANY_ID, PCI_ANY_ID, }, + {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_LPE11000S, + PCI_ANY_ID, PCI_ANY_ID, }, { 0 } }; -- cgit v1.2.3 From 5cc36b3cd0e3610ad7c7e2514160998276798fc0 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:42:19 -0500 Subject: [SCSI] lpfc 8.1.1 : Bring model descriptions in sync with Emulex standard generic names Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_hw.h | 6 +++ drivers/scsi/lpfc/lpfc_init.c | 107 +++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 48 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 4f002930141..1ea565e0561 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h @@ -1054,6 +1054,12 @@ typedef struct { #define PCI_DEVICE_ID_ZEPHYR_SCSP 0xfe11 #define PCI_DEVICE_ID_ZEPHYR_DCSP 0xfe12 +#define PCI_SUBSYSTEM_ID_LP11000S 0xfc11 +#define PCI_SUBSYSTEM_ID_LP11002S 0xfc12 +#define PCI_SUBSYSTEM_ID_LPE11000S 0xfc21 +#define PCI_SUBSYSTEM_ID_LPE11002S 0xfc22 +#define PCI_SUBSYSTEM_ID_LPE11010S 0xfc2A + #define JEDEC_ID_ADDRESS 0x0080001c #define FIREFLY_JEDEC_ID 0x1ACC #define SUPERFLY_JEDEC_ID 0x0020 diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 1ab3dac7b63..766dac230a6 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -760,8 +760,9 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) { lpfc_vpd_t *vp; uint16_t dev_id; + uint16_t dev_subid; uint8_t hdrtype; - char str[16]; + char *model_str = ""; vp = &phba->vpd; pci_read_config_word(phba->pcidev, PCI_DEVICE_ID, &dev_id); @@ -769,122 +770,132 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) switch (dev_id) { case PCI_DEVICE_ID_FIREFLY: - strcpy(str, "LP6000 1"); + model_str = "LP6000 1Gb PCI"; break; case PCI_DEVICE_ID_SUPERFLY: if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) - strcpy(str, "LP7000 1"); + model_str = "LP7000 1Gb PCI"; else - strcpy(str, "LP7000E 1"); + model_str = "LP7000E 1Gb PCI"; break; case PCI_DEVICE_ID_DRAGONFLY: - strcpy(str, "LP8000 1"); + model_str = "LP8000 1Gb PCI"; break; case PCI_DEVICE_ID_CENTAUR: if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) - strcpy(str, "LP9002 2"); + model_str = "LP9002 2Gb PCI"; else - strcpy(str, "LP9000 1"); + model_str = "LP9000 1Gb PCI"; break; case PCI_DEVICE_ID_RFLY: - strcpy(str, "LP952 2"); + model_str = "LP952 2Gb PCI"; break; case PCI_DEVICE_ID_PEGASUS: - strcpy(str, "LP9802 2"); + model_str = "LP9802 2Gb PCI-X"; break; case PCI_DEVICE_ID_THOR: if (hdrtype == 0x80) - strcpy(str, "LP10000DC 2"); + model_str = "LP10000DC 2Gb 2-port PCI-X"; else - strcpy(str, "LP10000 2"); + model_str = "LP10000 2Gb PCI-X"; break; case PCI_DEVICE_ID_VIPER: - strcpy(str, "LPX1000 10"); + model_str = "LPX1000 10Gb PCI-X"; break; case PCI_DEVICE_ID_PFLY: - strcpy(str, "LP982 2"); + model_str = "LP982 2Gb PCI-X"; break; case PCI_DEVICE_ID_TFLY: if (hdrtype == 0x80) - strcpy(str, "LP1050DC 2"); + model_str = "LP1050DC 2Gb 2-port PCI-X"; else - strcpy(str, "LP1050 2"); + model_str = "LP1050 2Gb PCI-X"; break; case PCI_DEVICE_ID_HELIOS: if (hdrtype == 0x80) - strcpy(str, "LP11002 4"); + model_str = "LP11002 4Gb 2-port PCI-X2"; else - strcpy(str, "LP11000 4"); + model_str = "LP11000 4Gb PCI-X2"; break; case PCI_DEVICE_ID_HELIOS_SCSP: - strcpy(str, "LP11000-SP 4"); + model_str = "LP11000-SP 4Gb PCI-X2"; break; case PCI_DEVICE_ID_HELIOS_DCSP: - strcpy(str, "LP11002-SP 4"); + model_str = "LP11002-SP 4Gb 2-port PCI-X2"; break; case PCI_DEVICE_ID_NEPTUNE: if (hdrtype == 0x80) - strcpy(str, "LPe1002 4"); + model_str = "LPe1002 4Gb 2-port"; else - strcpy(str, "LPe1000 4"); + model_str = "LPe1000 4Gb PCIe"; break; case PCI_DEVICE_ID_NEPTUNE_SCSP: - strcpy(str, "LPe1000-SP 4"); + model_str = "LPe1000-SP 4Gb PCIe"; break; case PCI_DEVICE_ID_NEPTUNE_DCSP: - strcpy(str, "LPe1002-SP 4"); + model_str = "LPe1002-SP 4Gb 2-port PCIe"; break; case PCI_DEVICE_ID_BMID: - strcpy(str, "LP1150 4"); + model_str = "LP1150 4Gb PCI-X2"; break; case PCI_DEVICE_ID_BSMB: - strcpy(str, "LP111 4"); + model_str = "LP111 4Gb PCI-X2"; break; case PCI_DEVICE_ID_ZEPHYR: if (hdrtype == 0x80) - strcpy(str, "LPe11002 4"); + model_str = "LPe11002 4Gb 2-port PCIe"; else - strcpy(str, "LPe11000 4"); + model_str = "LPe11000 4Gb PCIe"; break; case PCI_DEVICE_ID_ZEPHYR_SCSP: - strcpy(str, "LPe11000-SP 4"); + model_str = "LPe11000-SP 4Gb PCIe"; break; case PCI_DEVICE_ID_ZEPHYR_DCSP: - strcpy(str, "LPe11002-SP 4"); + model_str = "LPe11002-SP 4Gb 2-port PCIe"; break; case PCI_DEVICE_ID_ZMID: - strcpy(str, "LPe1150 4"); + model_str = "LPe1150 4Gb PCIe"; break; case PCI_DEVICE_ID_ZSMB: - strcpy(str, "LPe111 4"); + model_str = "LPe111 4Gb PCIe"; break; case PCI_DEVICE_ID_LP101: - strcpy(str, "LP101 2"); + model_str = "LP101 2Gb PCI-X"; break; case PCI_DEVICE_ID_LP10000S: - strcpy(str, "LP10000-S 2"); - break; - default: - memset(str, 0, 16); + model_str = "LP10000-S 2Gb PCI"; break; case PCI_DEVICE_ID_LP11000S: - if (hdrtype == 0x80) - strcpy(str, "LP11002-S 4"); - else - strcpy(str, "LP11000-S 4"); - break; case PCI_DEVICE_ID_LPE11000S: - if (hdrtype == 0x80) - strcpy(str, "LPe11002-S 4"); - else - strcpy(str, "LPe11000-S 4"); + pci_read_config_word(phba->pcidev, PCI_SUBSYSTEM_ID, + &dev_subid); + switch (dev_subid) { + case PCI_SUBSYSTEM_ID_LP11000S: + model_str = "LP11002-S 4Gb PCI-X2"; + break; + case PCI_SUBSYSTEM_ID_LP11002S: + model_str = "LP11000-S 4Gb 2-port PCI-X2"; + break; + case PCI_SUBSYSTEM_ID_LPE11000S: + model_str = "LPe11002-S 4Gb PCIe"; + break; + case PCI_SUBSYSTEM_ID_LPE11002S: + model_str = "LPe11002-S 4Gb 2-port PCIe"; + break; + case PCI_SUBSYSTEM_ID_LPE11010S: + model_str = "LPe11010-S 4Gb 10-port PCIe"; + break; + default: + break; + } + break; + default: break; } if (mdp) - sscanf(str, "%s", mdp); + sscanf(model_str, "%s", mdp); if (descp) - sprintf(descp, "Emulex LightPulse %s Gigabit PCI Fibre " - "Channel Adapter", str); + sprintf(descp, "Emulex %s Fibre Channel Adapter", model_str); } /**************************************************/ -- cgit v1.2.3 From 875fbdfe9b1b4c8f12622a8d8d81428ff0984875 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Tue, 29 Nov 2005 16:32:13 -0500 Subject: [SCSI] lpfc 8.1.1 : Add polled-mode support - Add functionality to run in polled mode only. Includes run time attribute to enable mode. - Enable runtime writable hba settings for coallescing and delay parameters Customers have requested a mode in the driver to run strictly polled. This is generally to support an environment where the server is extremely loaded and is looking to reclaim some cpu cycles from adapter interrupt handling. This patch adds a new "poll" attribute, and the following behavior: if value is 0 (default): The driver uses the normal method for i/o completion. It uses the firmware feature of interrupt coalesing. The firmware allows a minimum number of i/o completions before an interrupt, or a maximum time delay between interrupts. By default, the driver sets these to no delay (disabled) or 1 i/o - meaning coalescing is disabled. Attributes were provided to change the coalescing values, but it was a module-load time only and global across all adapters. This patch allows them to be writable on a per-adapter basis. if value is 1 : Interrupts are left enabled, expecting that the user has tuned the interrupt coalescing values. When this setting is enabled, the driver will attempt to service completed i/o whenever new i/o is submitted to the adapter. If the coalescing values are large, and the i/o generation rate steady, an interrupt will be avoided by servicing completed i/o prior to the coalescing thresholds kicking in. However, if the i/o completion load is high enough or i/o generation slow, the coalescion values will ensure that completed i/o is serviced in a timely fashion. if value is 3 : Turns off FCP i/o interrupts altogether. The coalescing values now have no effect. A new attribute "poll_tmo" (default 10ms) exists to set the polling interval for i/o completion. When this setting is enabled, the driver will attempt to service completed i/o and restart the interval timer whenever new i/o is submitted. This behavior allows for servicing of completed i/o sooner than the interval timer, but ensures that if no i/o is being issued, then the interval timer will kick in to service the outstanding i/o. Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc.h | 10 ++ drivers/scsi/lpfc/lpfc_attr.c | 92 +++++++++++++++++- drivers/scsi/lpfc/lpfc_crtn.h | 3 + drivers/scsi/lpfc/lpfc_init.c | 16 ++++ drivers/scsi/lpfc/lpfc_scsi.c | 72 ++++++++++++-- drivers/scsi/lpfc/lpfc_sli.c | 217 ++++++++++++++++++++++++++++++++++++++---- 6 files changed, 377 insertions(+), 33 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index dc73a2f8f12..1f3873ae9d6 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -45,6 +45,11 @@ struct lpfc_sli2_slim; #define MAX_HBAEVT 32 +enum lpfc_polling_flags { + ENABLE_FCP_RING_POLLING = 0x1, + DISABLE_FCP_RING_INT = 0x2 +}; + /* Provide DMA memory definitions the driver uses per port instance. */ struct lpfc_dmabuf { struct list_head list; @@ -287,6 +292,8 @@ struct lpfc_hba { uint32_t cfg_fcp_bind_method; uint32_t cfg_discovery_threads; uint32_t cfg_max_luns; + uint32_t cfg_poll; + uint32_t cfg_poll_tmo; uint32_t cfg_sg_seg_cnt; uint32_t cfg_sg_dma_buf_size; @@ -338,7 +345,9 @@ struct lpfc_hba { #define VPD_PORT 0x8 /* valid vpd port data */ #define VPD_MASK 0xf /* mask for any vpd data */ + struct timer_list fcp_poll_timer; struct timer_list els_tmofunc; + /* * stat counters */ @@ -349,6 +358,7 @@ struct lpfc_hba { struct lpfc_sysfs_mbox sysfs_mbox; /* fastpath list. */ + spinlock_t scsi_buf_list_lock; struct list_head lpfc_scsi_buf_list; uint32_t total_scsi_bufs; struct list_head lpfc_iocb_list; diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 89e8222bc7c..5625a8c2a8f 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c @@ -278,6 +278,71 @@ lpfc_board_online_store(struct class_device *cdev, const char *buf, return -EIO; } +static ssize_t +lpfc_poll_show(struct class_device *cdev, char *buf) +{ + struct Scsi_Host *host = class_to_shost(cdev); + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + + return snprintf(buf, PAGE_SIZE, "%#x\n", phba->cfg_poll); +} + +static ssize_t +lpfc_poll_store(struct class_device *cdev, const char *buf, + size_t count) +{ + struct Scsi_Host *host = class_to_shost(cdev); + struct lpfc_hba *phba = (struct lpfc_hba*)host->hostdata[0]; + uint32_t creg_val; + uint32_t old_val; + int val=0; + + if (!isdigit(buf[0])) + return -EINVAL; + + if (sscanf(buf, "%i", &val) != 1) + return -EINVAL; + + if ((val & 0x3) != val) + return -EINVAL; + + spin_lock_irq(phba->host->host_lock); + + old_val = phba->cfg_poll; + + if (val & ENABLE_FCP_RING_POLLING) { + if ((val & DISABLE_FCP_RING_INT) && + !(old_val & DISABLE_FCP_RING_INT)) { + creg_val = readl(phba->HCregaddr); + creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); + writel(creg_val, phba->HCregaddr); + readl(phba->HCregaddr); /* flush */ + + lpfc_poll_start_timer(phba); + } + } else if (val != 0x0) { + spin_unlock_irq(phba->host->host_lock); + return -EINVAL; + } + + if (!(val & DISABLE_FCP_RING_INT) && + (old_val & DISABLE_FCP_RING_INT)) + { + spin_unlock_irq(phba->host->host_lock); + del_timer(&phba->fcp_poll_timer); + spin_lock_irq(phba->host->host_lock); + creg_val = readl(phba->HCregaddr); + creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); + writel(creg_val, phba->HCregaddr); + readl(phba->HCregaddr); /* flush */ + } + + phba->cfg_poll = val; + + spin_unlock_irq(phba->host->host_lock); + + return strlen(buf); +} #define lpfc_param_show(attr) \ static ssize_t \ @@ -416,6 +481,15 @@ static CLASS_DEVICE_ATTR(management_version, S_IRUGO, management_version_show, static CLASS_DEVICE_ATTR(board_online, S_IRUGO | S_IWUSR, lpfc_board_online_show, lpfc_board_online_store); +static int lpfc_poll = 0; +module_param(lpfc_poll, int, 0); +MODULE_PARM_DESC(lpfc_poll, "FCP ring polling mode control:" + " 0 - none," + " 1 - poll with interrupts enabled" + " 3 - poll and disable FCP ring interrupts"); + +static CLASS_DEVICE_ATTR(lpfc_poll, S_IRUGO | S_IWUSR, + lpfc_poll_show, lpfc_poll_store); /* # lpfc_log_verbose: Only turn this flag on if you are willing to risk being @@ -523,10 +597,10 @@ LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support"); # is 0. Default value of cr_count is 1. The cr_count feature is disabled if # cr_delay is set to 0. */ -LPFC_ATTR(cr_delay, 0, 0, 63, "A count of milliseconds after which an" +LPFC_ATTR_RW(cr_delay, 0, 0, 63, "A count of milliseconds after which an" "interrupt response is generated"); -LPFC_ATTR(cr_count, 1, 1, 255, "A count of I/O completions after which an" +LPFC_ATTR_RW(cr_count, 1, 1, 255, "A count of I/O completions after which an" "interrupt response is generated"); /* @@ -553,6 +627,13 @@ LPFC_ATTR(discovery_threads, 32, 1, 64, "Maximum number of ELS commands" LPFC_ATTR_R(max_luns, 256, 1, 32768, "Maximum number of LUNs per target driver will support"); +/* +# lpfc_poll_tmo: .Milliseconds driver will wait between polling FCP ring. +# Value range is [1,255], default value is 10. +*/ +LPFC_ATTR_RW(poll_tmo, 10, 1, 255, + "Milliseconds driver will wait between polling FCP ring"); + struct class_device_attribute *lpfc_host_attrs[] = { &class_device_attr_info, &class_device_attr_serialnum, @@ -575,11 +656,15 @@ struct class_device_attribute *lpfc_host_attrs[] = { &class_device_attr_lpfc_topology, &class_device_attr_lpfc_scan_down, &class_device_attr_lpfc_link_speed, + &class_device_attr_lpfc_cr_delay, + &class_device_attr_lpfc_cr_count, &class_device_attr_lpfc_fdmi_on, &class_device_attr_lpfc_max_luns, &class_device_attr_nport_evt_cnt, &class_device_attr_management_version, &class_device_attr_board_online, + &class_device_attr_lpfc_poll, + &class_device_attr_lpfc_poll_tmo, NULL, }; @@ -1292,6 +1377,9 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) lpfc_fdmi_on_init(phba, lpfc_fdmi_on); lpfc_discovery_threads_init(phba, lpfc_discovery_threads); lpfc_max_luns_init(phba, lpfc_max_luns); + lpfc_poll_tmo_init(phba, lpfc_poll_tmo); + + phba->cfg_poll = lpfc_poll; /* * The total number of segments is the configuration value plus 2 diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index d527d05a607..f1e708946e6 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h @@ -143,6 +143,9 @@ LPFC_MBOXQ_t *lpfc_mbox_get(struct lpfc_hba *); int lpfc_mem_alloc(struct lpfc_hba *); void lpfc_mem_free(struct lpfc_hba *); +void lpfc_poll_timeout(unsigned long ptr); +void lpfc_poll_start_timer(struct lpfc_hba * phba); +void lpfc_sli_poll_fcp_ring(struct lpfc_hba * hba); struct lpfc_iocbq * lpfc_sli_get_iocbq(struct lpfc_hba *); void lpfc_sli_release_iocbq(struct lpfc_hba * phba, struct lpfc_iocbq * iocb); uint16_t lpfc_sli_next_iotag(struct lpfc_hba * phba, struct lpfc_iocbq * iocb); diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 766dac230a6..db3c2ad4e94 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -370,6 +370,10 @@ lpfc_config_port_post(struct lpfc_hba * phba) if (psli->num_rings > 3) status |= HC_R3INT_ENA; + if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) && + (phba->cfg_poll & DISABLE_FCP_RING_INT)) + status &= ~(HC_R0INT_ENA << LPFC_FCP_RING); + writel(status, phba->HCregaddr); readl(phba->HCregaddr); /* flush */ spin_unlock_irq(phba->host->host_lock); @@ -1237,6 +1241,7 @@ lpfc_stop_timer(struct lpfc_hba * phba) } } + del_timer_sync(&phba->fcp_poll_timer); del_timer_sync(&phba->fc_estabtmo); del_timer_sync(&phba->fc_disctmo); del_timer_sync(&phba->fc_fdmitmo); @@ -1416,6 +1421,10 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) psli->mbox_tmo.function = lpfc_mbox_timeout; psli->mbox_tmo.data = (unsigned long)phba; + init_timer(&phba->fcp_poll_timer); + phba->fcp_poll_timer.function = lpfc_poll_timeout; + phba->fcp_poll_timer.data = (unsigned long)phba; + /* * Get all the module params for configuring this host and then * establish the host parameters. @@ -1530,6 +1539,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) host->max_cmd_len = 16; /* Initialize the list of scsi buffers used by driver for scsi IO. */ + spin_lock_init(&phba->scsi_buf_list_lock); INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list); host->transportt = lpfc_transport_template; @@ -1561,6 +1571,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid) if (error) goto out_free_irq; + if (phba->cfg_poll & DISABLE_FCP_RING_INT) { + spin_lock_irq(phba->host->host_lock); + lpfc_poll_start_timer(phba); + spin_unlock_irq(phba->host->host_lock); + } + /* * set fixed host attributes * Must done after lpfc_sli_hba_setup() diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 7dc7810b748..c422220db0a 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -151,18 +151,22 @@ lpfc_new_scsi_buf(struct lpfc_hba * phba) } struct lpfc_scsi_buf* -lpfc_sli_get_scsi_buf(struct lpfc_hba * phba) +lpfc_get_scsi_buf(struct lpfc_hba * phba) { struct lpfc_scsi_buf * lpfc_cmd = NULL; struct list_head *scsi_buf_list = &phba->lpfc_scsi_buf_list; + unsigned long iflag = 0; + spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag); list_remove_head(scsi_buf_list, lpfc_cmd, struct lpfc_scsi_buf, list); + spin_unlock_irqrestore(&phba->scsi_buf_list_lock, iflag); return lpfc_cmd; } static void lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) { + unsigned long iflag = 0; /* * There are only two special cases to consider. (1) the scsi command * requested scatter-gather usage or (2) the scsi command allocated @@ -180,8 +184,10 @@ lpfc_release_scsi_buf(struct lpfc_hba * phba, struct lpfc_scsi_buf * psb) } } + spin_lock_irqsave(&phba->scsi_buf_list_lock, iflag); psb->pCmd = NULL; list_add_tail(&psb->list, &phba->lpfc_scsi_buf_list); + spin_unlock_irqrestore(&phba->scsi_buf_list_lock, iflag); } static int @@ -403,7 +409,6 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, struct lpfc_rport_data *rdata = lpfc_cmd->rdata; struct lpfc_nodelist *pnode = rdata->pnode; struct scsi_cmnd *cmd = lpfc_cmd->pCmd; - unsigned long iflag; lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4]; lpfc_cmd->status = pIocbOut->iocb.ulpStatus; @@ -457,9 +462,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, cmd->scsi_done(cmd); - spin_lock_irqsave(phba->host->host_lock, iflag); lpfc_release_scsi_buf(phba, lpfc_cmd); - spin_unlock_irqrestore(phba->host->host_lock, iflag); } static void @@ -707,6 +710,37 @@ lpfc_info(struct Scsi_Host *host) return lpfcinfobuf; } +static __inline__ void lpfc_poll_rearm_timer(struct lpfc_hba * phba) +{ + unsigned long poll_tmo_expires = + (jiffies + msecs_to_jiffies(phba->cfg_poll_tmo)); + + if (phba->sli.ring[LPFC_FCP_RING].txcmplq_cnt) + mod_timer(&phba->fcp_poll_timer, + poll_tmo_expires); +} + +void lpfc_poll_start_timer(struct lpfc_hba * phba) +{ + lpfc_poll_rearm_timer(phba); +} + +void lpfc_poll_timeout(unsigned long ptr) +{ + struct lpfc_hba *phba = (struct lpfc_hba *)ptr; + unsigned long iflag; + + spin_lock_irqsave(phba->host->host_lock, iflag); + + if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { + lpfc_sli_poll_fcp_ring (phba); + if (phba->cfg_poll & DISABLE_FCP_RING_INT) + lpfc_poll_rearm_timer(phba); + } + + spin_unlock_irqrestore(phba->host->host_lock, iflag); +} + static int lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) { @@ -733,7 +767,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) cmnd->result = ScsiResult(DID_BUS_BUSY, 0); goto out_fail_command; } - lpfc_cmd = lpfc_sli_get_scsi_buf (phba); + lpfc_cmd = lpfc_get_scsi_buf (phba); if (lpfc_cmd == NULL) { lpfc_printf_log(phba, KERN_INFO, LOG_FCP, "%d:0707 driver's buffer pool is empty, " @@ -761,11 +795,17 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *)) &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB); if (err) goto out_host_busy_free_buf; + + if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { + lpfc_sli_poll_fcp_ring(phba); + if (phba->cfg_poll & DISABLE_FCP_RING_INT) + lpfc_poll_rearm_timer(phba); + } + return 0; out_host_busy_free_buf: lpfc_release_scsi_buf(phba, lpfc_cmd); - cmnd->host_scribble = NULL; out_host_busy: return SCSI_MLQUEUE_HOST_BUSY; @@ -839,9 +879,15 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) goto out; } + if (phba->cfg_poll & DISABLE_FCP_RING_INT) + lpfc_sli_poll_fcp_ring (phba); + /* Wait for abort to complete */ while (lpfc_cmd->pCmd == cmnd) { + if (phba->cfg_poll & DISABLE_FCP_RING_INT) + lpfc_sli_poll_fcp_ring (phba); + spin_unlock_irq(phba->host->host_lock); schedule_timeout_uninterruptible(LPFC_ABORT_WAIT*HZ); spin_lock_irq(phba->host->host_lock); @@ -905,7 +951,7 @@ lpfc_reset_lun_handler(struct scsi_cmnd *cmnd) break; } - lpfc_cmd = lpfc_sli_get_scsi_buf (phba); + lpfc_cmd = lpfc_get_scsi_buf (phba); if (lpfc_cmd == NULL) goto out; @@ -1001,7 +1047,7 @@ lpfc_reset_bus_handler(struct scsi_cmnd *cmnd) lpfc_block_requests(phba); spin_lock_irq(shost->host_lock); - lpfc_cmd = lpfc_sli_get_scsi_buf (phba); + lpfc_cmd = lpfc_get_scsi_buf(phba); if (lpfc_cmd == NULL) goto out; @@ -1136,10 +1182,10 @@ lpfc_slave_alloc(struct scsi_device *sdev) break; } - spin_lock_irqsave(phba->host->host_lock, flags); + spin_lock_irqsave(&phba->scsi_buf_list_lock, flags); phba->total_scsi_bufs++; list_add_tail(&scsi_buf->list, &phba->lpfc_scsi_buf_list); - spin_unlock_irqrestore(phba->host->host_lock, flags); + spin_unlock_irqrestore(&phba->scsi_buf_list_lock, flags); } return 0; } @@ -1163,6 +1209,12 @@ lpfc_slave_configure(struct scsi_device *sdev) */ rport->dev_loss_tmo = phba->cfg_nodev_tmo + 5; + if (phba->cfg_poll & ENABLE_FCP_RING_POLLING) { + lpfc_sli_poll_fcp_ring(phba); + if (phba->cfg_poll & DISABLE_FCP_RING_INT) + lpfc_poll_rearm_timer(phba); + } + return 0; } diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index e2c08c5d83f..7b785ade8b0 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -886,6 +886,182 @@ lpfc_sli_process_sol_iocb(struct lpfc_hba * phba, struct lpfc_sli_ring * pring, return rc; } +static void lpfc_sli_rsp_pointers_error(struct lpfc_hba * phba, + struct lpfc_sli_ring * pring) +{ + struct lpfc_pgp *pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; + /* + * Ring handler: portRspPut is bigger then + * rsp ring + */ + lpfc_printf_log(phba, KERN_ERR, LOG_SLI, + "%d:0312 Ring %d handler: portRspPut %d " + "is bigger then rsp ring %d\n", + phba->brd_no, pring->ringno, + le32_to_cpu(pgp->rspPutInx), + pring->numRiocb); + + phba->hba_state = LPFC_HBA_ERROR; + + /* + * All error attention handlers are posted to + * worker thread + */ + phba->work_ha |= HA_ERATT; + phba->work_hs = HS_FFER3; + if (phba->work_wait) + wake_up(phba->work_wait); + + return; +} + +void lpfc_sli_poll_fcp_ring(struct lpfc_hba * phba) +{ + struct lpfc_sli * psli = &phba->sli; + struct lpfc_sli_ring * pring = &psli->ring[LPFC_FCP_RING]; + IOCB_t *irsp = NULL; + IOCB_t *entry = NULL; + struct lpfc_iocbq *cmdiocbq = NULL; + struct lpfc_iocbq rspiocbq; + struct lpfc_pgp *pgp; + uint32_t status; + uint32_t portRspPut, portRspMax; + int type; + uint32_t rsp_cmpl = 0; + void __iomem *to_slim; + uint32_t ha_copy; + + pring->stats.iocb_event++; + + /* The driver assumes SLI-2 mode */ + pgp = &phba->slim2p->mbx.us.s2.port[pring->ringno]; + + /* + * The next available response entry should never exceed the maximum + * entries. If it does, treat it as an adapter hardware error. + */ + portRspMax = pring->numRiocb; + portRspPut = le32_to_cpu(pgp->rspPutInx); + if (unlikely(portRspPut >= portRspMax)) { + lpfc_sli_rsp_pointers_error(phba, pring); + return; + } + + rmb(); + while (pring->rspidx != portRspPut) { + + entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx); + + if (++pring->rspidx >= portRspMax) + pring->rspidx = 0; + + lpfc_sli_pcimem_bcopy((uint32_t *) entry, + (uint32_t *) &rspiocbq.iocb, + sizeof (IOCB_t)); + irsp = &rspiocbq.iocb; + type = lpfc_sli_iocb_cmd_type(irsp->ulpCommand & CMD_IOCB_MASK); + pring->stats.iocb_rsp++; + rsp_cmpl++; + + if (unlikely(irsp->ulpStatus)) { + /* Rsp ring error: IOCB */ + lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, + "%d:0326 Rsp Ring %d error: IOCB Data: " + "x%x x%x x%x x%x x%x x%x x%x x%x\n", + phba->brd_no, pring->ringno, + irsp->un.ulpWord[0], + irsp->un.ulpWord[1], + irsp->un.ulpWord[2], + irsp->un.ulpWord[3], + irsp->un.ulpWord[4], + irsp->un.ulpWord[5], + *(((uint32_t *) irsp) + 6), + *(((uint32_t *) irsp) + 7)); + } + + switch (type) { + case LPFC_ABORT_IOCB: + case LPFC_SOL_IOCB: + /* + * Idle exchange closed via ABTS from port. No iocb + * resources need to be recovered. + */ + if (unlikely(irsp->ulpCommand == CMD_XRI_ABORTED_CX)) { + printk(KERN_INFO "%s: IOCB cmd 0x%x processed." + " Skipping completion\n", __FUNCTION__, + irsp->ulpCommand); + break; + } + + cmdiocbq = lpfc_sli_iocbq_lookup(phba, pring, + &rspiocbq); + if ((cmdiocbq) && (cmdiocbq->iocb_cmpl)) { + (cmdiocbq->iocb_cmpl)(phba, cmdiocbq, + &rspiocbq); + } + break; + default: + if (irsp->ulpCommand == CMD_ADAPTER_MSG) { + char adaptermsg[LPFC_MAX_ADPTMSG]; + memset(adaptermsg, 0, LPFC_MAX_ADPTMSG); + memcpy(&adaptermsg[0], (uint8_t *) irsp, + MAX_MSG_DATA); + dev_warn(&((phba->pcidev)->dev), "lpfc%d: %s", + phba->brd_no, adaptermsg); + } else { + /* Unknown IOCB command */ + lpfc_printf_log(phba, KERN_ERR, LOG_SLI, + "%d:0321 Unknown IOCB command " + "Data: x%x, x%x x%x x%x x%x\n", + phba->brd_no, type, + irsp->ulpCommand, + irsp->ulpStatus, + irsp->ulpIoTag, + irsp->ulpContext); + } + break; + } + + /* + * The response IOCB has been processed. Update the ring + * pointer in SLIM. If the port response put pointer has not + * been updated, sync the pgp->rspPutInx and fetch the new port + * response put pointer. + */ + to_slim = phba->MBslimaddr + + (SLIMOFF + (pring->ringno * 2) + 1) * 4; + writeb(pring->rspidx, to_slim); + + if (pring->rspidx == portRspPut) + portRspPut = le32_to_cpu(pgp->rspPutInx); + } + + ha_copy = readl(phba->HAregaddr); + ha_copy >>= (LPFC_FCP_RING * 4); + + if ((rsp_cmpl > 0) && (ha_copy & HA_R0RE_REQ)) { + pring->stats.iocb_rsp_full++; + status = ((CA_R0ATT | CA_R0RE_RSP) << (LPFC_FCP_RING * 4)); + writel(status, phba->CAregaddr); + readl(phba->CAregaddr); + } + if ((ha_copy & HA_R0CE_RSP) && + (pring->flag & LPFC_CALL_RING_AVAILABLE)) { + pring->flag &= ~LPFC_CALL_RING_AVAILABLE; + pring->stats.iocb_cmd_empty++; + + /* Force update of the local copy of cmdGetInx */ + pring->local_getidx = le32_to_cpu(pgp->cmdGetInx); + lpfc_sli_resume_iocb(phba, pring); + + if ((pring->lpfc_sli_cmd_available)) + (pring->lpfc_sli_cmd_available) (phba, pring); + + } + + return; +} + /* * This routine presumes LPFC_FCP_RING handling and doesn't bother * to check it explicitly. @@ -917,24 +1093,7 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, portRspMax = pring->numRiocb; portRspPut = le32_to_cpu(pgp->rspPutInx); if (unlikely(portRspPut >= portRspMax)) { - /* - * Ring handler: portRspPut is bigger then - * rsp ring - */ - lpfc_printf_log(phba, KERN_ERR, LOG_SLI, - "%d:0312 Ring %d handler: portRspPut %d " - "is bigger then rsp ring %d\n", - phba->brd_no, pring->ringno, portRspPut, - portRspMax); - - phba->hba_state = LPFC_HBA_ERROR; - - /* All error attention handlers are posted to worker thread */ - phba->work_ha |= HA_ERATT; - phba->work_hs = HS_FFER3; - if (phba->work_wait) - wake_up(phba->work_wait); - + lpfc_sli_rsp_pointers_error(phba, pring); spin_unlock_irqrestore(phba->host->host_lock, iflag); return 1; } @@ -947,6 +1106,10 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, * network byte order and pci byte orders are different. */ entry = IOCB_ENTRY(pring->rspringaddr, pring->rspidx); + + if (++pring->rspidx >= portRspMax) + pring->rspidx = 0; + lpfc_sli_pcimem_bcopy((uint32_t *) entry, (uint32_t *) &rspiocbq.iocb, sizeof (IOCB_t)); @@ -1020,9 +1183,6 @@ lpfc_sli_handle_fast_ring_event(struct lpfc_hba * phba, * been updated, sync the pgp->rspPutInx and fetch the new port * response put pointer. */ - if (++pring->rspidx >= portRspMax) - pring->rspidx = 0; - to_slim = phba->MBslimaddr + (SLIMOFF + (pring->ringno * 2) + 1) * 4; writel(pring->rspidx, to_slim); @@ -2615,6 +2775,7 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, DECLARE_WAIT_QUEUE_HEAD(done_q); long timeleft, timeout_req = 0; int retval = IOCB_SUCCESS; + uint32_t creg_val; /* * If the caller has provided a response iocbq buffer, then context2 @@ -2630,6 +2791,13 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, piocb->context_un.wait_queue = &done_q; piocb->iocb_flag &= ~LPFC_IO_WAKE; + if (phba->cfg_poll & DISABLE_FCP_RING_INT) { + creg_val = readl(phba->HCregaddr); + creg_val |= (HC_R0INT_ENA << LPFC_FCP_RING); + writel(creg_val, phba->HCregaddr); + readl(phba->HCregaddr); /* flush */ + } + retval = lpfc_sli_issue_iocb(phba, pring, piocb, 0); if (retval == IOCB_SUCCESS) { timeout_req = timeout * HZ; @@ -2663,6 +2831,13 @@ lpfc_sli_issue_iocb_wait(struct lpfc_hba * phba, retval = IOCB_ERROR; } + if (phba->cfg_poll & DISABLE_FCP_RING_INT) { + creg_val = readl(phba->HCregaddr); + creg_val &= ~(HC_R0INT_ENA << LPFC_FCP_RING); + writel(creg_val, phba->HCregaddr); + readl(phba->HCregaddr); /* flush */ + } + if (prspiocbq) piocb->context2 = NULL; -- cgit v1.2.3 From 445cf4f4d2aa28f6ddd1d7a5f0986341ad61ec91 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:42:38 -0500 Subject: [SCSI] lpfc 8.1.1 : Added code to adjust lun queue depth to avoid target overloading Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc.h | 3 ++- drivers/scsi/lpfc/lpfc_disc.h | 2 ++ drivers/scsi/lpfc/lpfc_scsi.c | 58 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 1f3873ae9d6..38ffa8d6e62 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h @@ -29,9 +29,10 @@ struct lpfc_sli2_slim; #define LPFC_LC_HBA_Q_DEPTH 1024 /* max cmds per low cost hba */ #define LPFC_LP101_HBA_Q_DEPTH 128 /* max cmds per low cost hba */ -#define LPFC_CMD_PER_LUN 30 /* max outstanding cmds per lun */ +#define LPFC_CMD_PER_LUN 3 /* max outstanding cmds per lun */ #define LPFC_SG_SEG_CNT 64 /* sg element count per scsi cmnd */ #define LPFC_IOCB_LIST_CNT 2250 /* list of IOCBs for fast-path usage. */ +#define LPFC_Q_RAMP_UP_INTERVAL 120 /* lun q_depth ramp up interval */ /* Define macros for 64 bit support */ #define putPaddrLow(addr) ((uint32_t) (0xffffffff & (u64)(addr))) diff --git a/drivers/scsi/lpfc/lpfc_disc.h b/drivers/scsi/lpfc/lpfc_disc.h index 084e7628ce1..ed6c81660e0 100644 --- a/drivers/scsi/lpfc/lpfc_disc.h +++ b/drivers/scsi/lpfc/lpfc_disc.h @@ -73,6 +73,8 @@ struct lpfc_nodelist { struct lpfc_hba *nlp_phba; struct lpfc_work_evt nodev_timeout_evt; struct lpfc_work_evt els_retry_evt; + unsigned long last_ramp_up_time; /* jiffy of last ramp up */ + unsigned long last_q_full_time; /* jiffy of last queue full */ }; /* Defines for nlp_flag (uint32) */ diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index c422220db0a..9ee8218404c 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -409,6 +409,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, struct lpfc_rport_data *rdata = lpfc_cmd->rdata; struct lpfc_nodelist *pnode = rdata->pnode; struct scsi_cmnd *cmd = lpfc_cmd->pCmd; + int result; + struct scsi_device *sdev, *tmp_sdev; + int depth = 0; lpfc_cmd->result = pIocbOut->iocb.un.ulpWord[4]; lpfc_cmd->status = pIocbOut->iocb.ulpStatus; @@ -460,8 +463,63 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, *lp, *(lp + 3), cmd->retries, cmd->resid); } + result = cmd->result; + sdev = cmd->device; cmd->scsi_done(cmd); + if (!result && + ((jiffies - pnode->last_ramp_up_time) > + LPFC_Q_RAMP_UP_INTERVAL * HZ) && + ((jiffies - pnode->last_q_full_time) > + LPFC_Q_RAMP_UP_INTERVAL * HZ) && + (phba->cfg_lun_queue_depth > sdev->queue_depth)) { + shost_for_each_device(tmp_sdev, sdev->host) { + if (phba->cfg_lun_queue_depth > tmp_sdev->queue_depth) { + if (tmp_sdev->id != sdev->id) + continue; + if (tmp_sdev->ordered_tags) + scsi_adjust_queue_depth(tmp_sdev, + MSG_ORDERED_TAG, + tmp_sdev->queue_depth+1); + else + scsi_adjust_queue_depth(tmp_sdev, + MSG_SIMPLE_TAG, + tmp_sdev->queue_depth+1); + + pnode->last_ramp_up_time = jiffies; + } + } + } + + /* + * Check for queue full. If the lun is reporting queue full, then + * back off the lun queue depth to prevent target overloads. + */ + if (result == SAM_STAT_TASK_SET_FULL) { + pnode->last_q_full_time = jiffies; + + shost_for_each_device(tmp_sdev, sdev->host) { + if (tmp_sdev->id != sdev->id) + continue; + depth = scsi_track_queue_full(tmp_sdev, + tmp_sdev->queue_depth - 1); + } + /* + * The queue depth cannot be lowered any more. + * Modify the returned error code to store + * the final depth value set by + * scsi_track_queue_full. + */ + if (depth == -1) + depth = sdev->host->cmd_per_lun; + + if (depth) { + lpfc_printf_log(phba, KERN_WARNING, LOG_FCP, + "%d:0711 detected queue full - lun queue depth " + " adjusted to %d.\n", phba->brd_no, depth); + } + } + lpfc_release_scsi_buf(phba, lpfc_cmd); } -- cgit v1.2.3 From fefcb2b677fbfce894133e59a34395f8988d4610 Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 15:08:56 -0500 Subject: [SCSI] lpfc 8.1.1 : kill use of pci_read_config_xxx Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_init.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index db3c2ad4e94..b7a603a4532 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -763,14 +763,12 @@ static void lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) { lpfc_vpd_t *vp; - uint16_t dev_id; - uint16_t dev_subid; - uint8_t hdrtype; + uint16_t dev_id = phba->pcidev->device; + uint16_t dev_subid = phba->pcidev->subsystem_device; + uint8_t hdrtype = phba->pcidev->hdr_type; char *model_str = ""; vp = &phba->vpd; - pci_read_config_word(phba->pcidev, PCI_DEVICE_ID, &dev_id); - pci_read_config_byte(phba->pcidev, PCI_HEADER_TYPE, &hdrtype); switch (dev_id) { case PCI_DEVICE_ID_FIREFLY: @@ -871,8 +869,6 @@ lpfc_get_hba_model_desc(struct lpfc_hba * phba, uint8_t * mdp, uint8_t * descp) break; case PCI_DEVICE_ID_LP11000S: case PCI_DEVICE_ID_LPE11000S: - pci_read_config_word(phba->pcidev, PCI_SUBSYSTEM_ID, - &dev_subid); switch (dev_subid) { case PCI_SUBSYSTEM_ID_LP11000S: model_str = "LP11002-S 4Gb PCI-X2"; -- cgit v1.2.3 From 1cb25a27d0a3f8296e67e5cc915048db10910d4f Mon Sep 17 00:00:00 2001 From: "James.Smart@Emulex.Com" Date: Mon, 28 Nov 2005 11:42:49 -0500 Subject: [SCSI] lpfc 8.1.1 : Change version number to 8.1.1 Signed-off-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index 4f0466fbd5f..fa681a934ff 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h @@ -18,7 +18,7 @@ * included with this package. * *******************************************************************/ -#define LPFC_DRIVER_VERSION "8.1.0" +#define LPFC_DRIVER_VERSION "8.1.1" #define LPFC_DRIVER_NAME "lpfc" -- cgit v1.2.3 From 38d76df2f5483478dee803cb6e39da5e506a6643 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Fri, 9 Dec 2005 11:34:45 -0500 Subject: [SCSI] sd: Always do write-protect check Since nobody has offered an explanation for why the sd driver makes a write-protect check only for devices with removable media, I'm submitting this patch to get rid of the removable-media test. Signed-off-by: Alan Stern Signed-off-by: James Bottomley --- drivers/scsi/sd.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 8613a131771..d82795455ef 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1509,9 +1509,7 @@ static int sd_revalidate_disk(struct gendisk *disk) */ if (sdkp->media_present) { sd_read_capacity(sdkp, disk->disk_name, buffer); - if (sdp->removable) - sd_read_write_protect_flag(sdkp, disk->disk_name, - buffer); + sd_read_write_protect_flag(sdkp, disk->disk_name, buffer); sd_read_cache_type(sdkp, disk->disk_name, buffer); } -- cgit v1.2.3 From e7a1ca1d27e20ea2c0ba161c57e3c1d4112b60f7 Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 14 Dec 2005 19:27:28 +0100 Subject: [SCSI] handle scsi_add_host failure for aic79xx and fix compiler warning Add scsi_add_host() failure handling for aic79xx Also silence a compiler warning : drivers/scsi/aic7xxx/aic79xx_osm.c: In function `ahd_linux_register_host': drivers/scsi/aic7xxx/aic79xx_osm.c:1099: warning: ignoring return value of `scsi_add_host', declared with attribute warn_unused_result Signed-off-by: Jesper Juhl Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx_osm.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index 6aab9dacdee..1c8f872e2dd 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -1064,6 +1064,7 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa struct Scsi_Host *host; char *new_name; u_long s; + int retval; template->name = ahd->description; host = scsi_host_alloc(template, sizeof(struct ahd_softc *)); @@ -1096,9 +1097,15 @@ ahd_linux_register_host(struct ahd_softc *ahd, struct scsi_host_template *templa host->transportt = ahd_linux_transport_template; - scsi_add_host(host, &ahd->dev_softc->dev); /* XXX handle failure */ + retval = scsi_add_host(host, &ahd->dev_softc->dev); + if (retval) { + printk(KERN_WARNING "aic79xx: scsi_add_host failed\n"); + scsi_host_put(host); + return retval; + } + scsi_scan_host(host); - return (0); + return 0; } uint64_t -- cgit v1.2.3 From 9e1fe9314cb5649b2dc73690f2cd8d0068e633d9 Mon Sep 17 00:00:00 2001 From: Jesper Juhl Date: Wed, 14 Dec 2005 19:27:20 +0100 Subject: [SCSI] handle scsi_add_host failure for aic7xxx and fix compiler warning Add scsi_add_host() failure handling for aic7xxx Also silence a compiler warning : drivers/scsi/aic7xxx/aic7xxx_osm.c: In function `ahc_linux_register_host': drivers/scsi/aic7xxx/aic7xxx_osm.c:1100: warning: ignoring return value of `scsi_add_host', declared with attribute warn_unused_result Signed-off-by: Jesper Juhl Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic7xxx_osm.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index d866213f42b..fd389e9f946 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -1061,10 +1061,11 @@ uint32_t aic7xxx_verbose; int ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *template) { - char buf[80]; - struct Scsi_Host *host; + char buf[80]; + struct Scsi_Host *host; char *new_name; - u_long s; + u_long s; + int retval; template->name = ahc->description; host = scsi_host_alloc(template, sizeof(struct ahc_softc *)); @@ -1097,9 +1098,16 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa host->transportt = ahc_linux_transport_template; - scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); /* XXX handle failure */ + retval = scsi_add_host(host, + (ahc->dev_softc ? &ahc->dev_softc->dev : NULL)); + if (retval) { + printk(KERN_WARNING "aic7xxx: scsi_add_host failed\n"); + scsi_host_put(host); + return retval; + } + scsi_scan_host(host); - return (0); + return 0; } /* -- cgit v1.2.3 From 6e68af666f5336254b5715dca591026b7324499a Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 11 Nov 2005 05:30:27 -0600 Subject: [SCSI] Convert SCSI mid-layer to scsi_execute_async Add scsi helpers to create really-large-requests and convert scsi-ml to scsi_execute_async(). Per Jens's previous comments, I placed this function in scsi_lib.c. I made it follow all the queue's limits - I think I did at least :), so I removed the warning on the function header. I think the scsi_execute_* functions should eventually take a request_queue and be placed some place where the dm-multipath hw_handler can use them if that failover code is going to stay in the kernel. That conversion patch will be sent in another mail though. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/scsi_error.c | 47 ++-------- drivers/scsi/scsi_lib.c | 230 +++++++++++++++++++++++++++++++++++++++------- drivers/scsi/scsi_priv.h | 1 - 3 files changed, 205 insertions(+), 73 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 18c5d252301..53ea62d3b53 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1314,23 +1314,6 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd) } } -/** - * scsi_eh_lock_done - done function for eh door lock request - * @scmd: SCSI command block for the door lock request - * - * Notes: - * We completed the asynchronous door lock request, and it has either - * locked the door or failed. We must free the command structures - * associated with this request. - **/ -static void scsi_eh_lock_done(struct scsi_cmnd *scmd) -{ - struct scsi_request *sreq = scmd->sc_request; - - scsi_release_request(sreq); -} - - /** * scsi_eh_lock_door - Prevent medium removal for the specified device * @sdev: SCSI device to prevent medium removal @@ -1353,29 +1336,17 @@ static void scsi_eh_lock_done(struct scsi_cmnd *scmd) **/ static void scsi_eh_lock_door(struct scsi_device *sdev) { - struct scsi_request *sreq = scsi_allocate_request(sdev, GFP_KERNEL); + unsigned char cmnd[MAX_COMMAND_SIZE]; - if (unlikely(!sreq)) { - printk(KERN_ERR "%s: request allocate failed," - "prevent media removal cmd not sent\n", __FUNCTION__); - return; - } + cmnd[0] = ALLOW_MEDIUM_REMOVAL; + cmnd[1] = 0; + cmnd[2] = 0; + cmnd[3] = 0; + cmnd[4] = SCSI_REMOVAL_PREVENT; + cmnd[5] = 0; - sreq->sr_cmnd[0] = ALLOW_MEDIUM_REMOVAL; - sreq->sr_cmnd[1] = 0; - sreq->sr_cmnd[2] = 0; - sreq->sr_cmnd[3] = 0; - sreq->sr_cmnd[4] = SCSI_REMOVAL_PREVENT; - sreq->sr_cmnd[5] = 0; - sreq->sr_data_direction = DMA_NONE; - sreq->sr_bufflen = 0; - sreq->sr_buffer = NULL; - sreq->sr_allowed = 5; - sreq->sr_done = scsi_eh_lock_done; - sreq->sr_timeout_per_command = 10 * HZ; - sreq->sr_cmd_len = COMMAND_SIZE(sreq->sr_cmnd[0]); - - scsi_insert_special_req(sreq, 1); + scsi_execute_async(sdev, cmnd, DMA_NONE, NULL, 0, 0, 10 * HZ, + 5, NULL, NULL, GFP_KERNEL); } diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 1f2782767ca..eb0cfbfbcf8 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -63,39 +63,6 @@ static struct scsi_host_sg_pool scsi_sg_pools[] = { }; #undef SP - -/* - * Function: scsi_insert_special_req() - * - * Purpose: Insert pre-formed request into request queue. - * - * Arguments: sreq - request that is ready to be queued. - * at_head - boolean. True if we should insert at head - * of queue, false if we should insert at tail. - * - * Lock status: Assumed that lock is not held upon entry. - * - * Returns: Nothing - * - * Notes: This function is called from character device and from - * ioctl types of functions where the caller knows exactly - * what SCSI command needs to be issued. The idea is that - * we merely inject the command into the queue (at the head - * for now), and then call the queue request function to actually - * process it. - */ -int scsi_insert_special_req(struct scsi_request *sreq, int at_head) -{ - /* - * Because users of this function are apt to reuse requests with no - * modification, we have to sanitise the request flags here - */ - sreq->sr_request->flags &= ~REQ_DONTPREP; - blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request, - at_head, sreq); - return 0; -} - static void scsi_run_queue(struct request_queue *q); /* @@ -249,8 +216,13 @@ void scsi_do_req(struct scsi_request *sreq, const void *cmnd, /* * head injection *required* here otherwise quiesce won't work + * + * Because users of this function are apt to reuse requests with no + * modification, we have to sanitise the request flags here */ - scsi_insert_special_req(sreq, 1); + sreq->sr_request->flags &= ~REQ_DONTPREP; + blk_insert_request(sreq->sr_device->request_queue, sreq->sr_request, + 1, sreq); } EXPORT_SYMBOL(scsi_do_req); @@ -327,6 +299,196 @@ int scsi_execute_req(struct scsi_device *sdev, const unsigned char *cmd, } EXPORT_SYMBOL(scsi_execute_req); +struct scsi_io_context { + void *data; + void (*done)(void *data, char *sense, int result, int resid); + char sense[SCSI_SENSE_BUFFERSIZE]; +}; + +static void scsi_end_async(struct request *req) +{ + struct scsi_io_context *sioc = req->end_io_data; + + if (sioc->done) + sioc->done(sioc->data, sioc->sense, req->errors, req->data_len); + + kfree(sioc); + __blk_put_request(req->q, req); +} + +static int scsi_merge_bio(struct request *rq, struct bio *bio) +{ + struct request_queue *q = rq->q; + + bio->bi_flags &= ~(1 << BIO_SEG_VALID); + if (rq_data_dir(rq) == WRITE) + bio->bi_rw |= (1 << BIO_RW); + blk_queue_bounce(q, &bio); + + if (!rq->bio) + blk_rq_bio_prep(q, rq, bio); + else if (!q->back_merge_fn(q, rq, bio)) + return -EINVAL; + else { + rq->biotail->bi_next = bio; + rq->biotail = bio; + rq->hard_nr_sectors += bio_sectors(bio); + rq->nr_sectors = rq->hard_nr_sectors; + } + + return 0; +} + +static int scsi_bi_endio(struct bio *bio, unsigned int bytes_done, int error) +{ + if (bio->bi_size) + return 1; + + bio_put(bio); + return 0; +} + +/** + * scsi_req_map_sg - map a scatterlist into a request + * @rq: request to fill + * @sg: scatterlist + * @nsegs: number of elements + * @bufflen: len of buffer + * @gfp: memory allocation flags + * + * scsi_req_map_sg maps a scatterlist into a request so that the + * request can be sent to the block layer. We do not trust the scatterlist + * sent to use, as some ULDs use that struct to only organize the pages. + */ +static int scsi_req_map_sg(struct request *rq, struct scatterlist *sgl, + int nsegs, unsigned bufflen, gfp_t gfp) +{ + struct request_queue *q = rq->q; + int nr_pages = (bufflen + PAGE_SIZE - 1) >> PAGE_SHIFT; + unsigned int data_len = 0, len, bytes, off; + struct page *page; + struct bio *bio = NULL; + int i, err, nr_vecs = 0; + + for (i = 0; i < nsegs; i++) { + page = sgl[i].page; + off = sgl[i].offset; + len = sgl[i].length; + data_len += len; + + while (len > 0) { + bytes = min_t(unsigned int, len, PAGE_SIZE - off); + + if (!bio) { + nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages); + nr_pages -= nr_vecs; + + bio = bio_alloc(gfp, nr_vecs); + if (!bio) { + err = -ENOMEM; + goto free_bios; + } + bio->bi_end_io = scsi_bi_endio; + } + + if (bio_add_pc_page(q, bio, page, bytes, off) != + bytes) { + bio_put(bio); + err = -EINVAL; + goto free_bios; + } + + if (bio->bi_vcnt >= nr_vecs) { + err = scsi_merge_bio(rq, bio); + if (err) { + bio_endio(bio, bio->bi_size, 0); + goto free_bios; + } + bio = NULL; + } + + page++; + len -= bytes; + off = 0; + } + } + + rq->buffer = rq->data = NULL; + rq->data_len = data_len; + return 0; + +free_bios: + while ((bio = rq->bio) != NULL) { + rq->bio = bio->bi_next; + /* + * call endio instead of bio_put incase it was bounced + */ + bio_endio(bio, bio->bi_size, 0); + } + + return err; +} + +/** + * scsi_execute_async - insert request + * @sdev: scsi device + * @cmd: scsi command + * @data_direction: data direction + * @buffer: data buffer (this can be a kernel buffer or scatterlist) + * @bufflen: len of buffer + * @use_sg: if buffer is a scatterlist this is the number of elements + * @timeout: request timeout in seconds + * @retries: number of times to retry request + * @flags: or into request flags + **/ +int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, + int data_direction, void *buffer, unsigned bufflen, + int use_sg, int timeout, int retries, void *privdata, + void (*done)(void *, char *, int, int), gfp_t gfp) +{ + struct request *req; + struct scsi_io_context *sioc; + int err = 0; + int write = (data_direction == DMA_TO_DEVICE); + + sioc = kzalloc(sizeof(*sioc), gfp); + if (!sioc) + return DRIVER_ERROR << 24; + + req = blk_get_request(sdev->request_queue, write, gfp); + if (!req) + goto free_sense; + + if (use_sg) + err = scsi_req_map_sg(req, buffer, use_sg, bufflen, gfp); + else if (bufflen) + err = blk_rq_map_kern(req->q, req, buffer, bufflen, gfp); + + if (err) + goto free_req; + + req->cmd_len = COMMAND_SIZE(cmd[0]); + memcpy(req->cmd, cmd, req->cmd_len); + req->sense = sioc->sense; + req->sense_len = 0; + req->timeout = timeout; + req->flags |= REQ_BLOCK_PC | REQ_QUIET; + req->end_io_data = sioc; + + sioc->data = privdata; + sioc->done = done; + + blk_execute_rq_nowait(req->q, NULL, req, 1, scsi_end_async); + return 0; + +free_req: + blk_put_request(req); +free_sense: + kfree(sioc); + return DRIVER_ERROR << 24; +} +EXPORT_SYMBOL_GPL(scsi_execute_async); + /* * Function: scsi_init_cmd_errh() * diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index a8d121c8fbc..f04e7e11f57 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -40,7 +40,6 @@ extern void scsi_exit_hosts(void); extern int scsi_dispatch_cmd(struct scsi_cmnd *cmd); extern int scsi_setup_command_freelist(struct Scsi_Host *shost); extern void scsi_destroy_command_freelist(struct Scsi_Host *shost); -extern int scsi_insert_special_req(struct scsi_request *sreq, int); extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq); extern void __scsi_release_request(struct scsi_request *sreq); -- cgit v1.2.3 From 17e01f216b611fc46956dcd9063aec4de75991e3 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 11 Nov 2005 05:31:37 -0600 Subject: [SCSI] add retries field to request for REQ_BLOCK_PC use For tape we need to control the retries. This patch adds a retries counter on the request for REQ_BLOCK_PC commands originating from scsi_execute* to use. REQ_BLOCK_PC commands comming from the block layer SG_IO path continue to use the retires set in the ULD init_command. (scsi_execute* does not set the gendisk so we do not execute the init_command in that path). Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index eb0cfbfbcf8..365843a1561 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -259,6 +259,7 @@ int scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, memcpy(req->cmd, cmd, req->cmd_len); req->sense = sense; req->sense_len = 0; + req->retries = retries; req->timeout = timeout; req->flags |= flags | REQ_BLOCK_PC | REQ_SPECIAL | REQ_QUIET; @@ -472,6 +473,7 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, req->sense = sioc->sense; req->sense_len = 0; req->timeout = timeout; + req->retries = retries; req->flags |= REQ_BLOCK_PC | REQ_QUIET; req->end_io_data = sioc; @@ -1393,7 +1395,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) cmd->sc_data_direction = DMA_NONE; cmd->transfersize = req->data_len; - cmd->allowed = 3; + cmd->allowed = req->retries; cmd->timeout_per_command = req->timeout; cmd->done = scsi_generic_done; } -- cgit v1.2.3 From 0d95716d6a1308c465d8c17ed1a217628936bb0c Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 11 Nov 2005 05:31:40 -0600 Subject: [SCSI] complete the whole command when it is REQ_BLOCK_PC sd does not allow scsi_io_completion to retry commands for SG_IO requests, and it make sense that it should not happen for st SG_IO commands too. If for st we hit the bottom of scsi_io_completion we will probably screw things up pretty bad. This patch returns to the block layer that the whole command completed and relies on the caller to check the request errors field. For initialization commands like in sd, this adds the previous behavior where scsi_io_completion did not process the error. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 8 +++++++- drivers/scsi/st.c | 6 +++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 365843a1561..3e136bfe421 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1247,7 +1247,13 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk, static void scsi_generic_done(struct scsi_cmnd *cmd) { BUG_ON(!blk_pc_request(cmd->request)); - scsi_io_completion(cmd, cmd->result == 0 ? cmd->bufflen : 0, 0); + /* + * This will complete the whole command with uptodate=1 so + * as far as the block layer is concerned the command completed + * successfully. Since this is a REQ_BLOCK_PC command the + * caller should check the request's errors value + */ + scsi_io_completion(cmd, cmd->bufflen, 0); } static int scsi_prep_fn(struct request_queue *q, struct request *req) diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 6d9078705c5..053444b027d 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -4185,7 +4185,11 @@ static void scsi_tape_release(struct kref *kref) static void st_intr(struct scsi_cmnd *SCpnt) { - scsi_io_completion(SCpnt, (SCpnt->result ? 0: SCpnt->bufflen), 1); + /* + * The caller should be checking the request's errors + * value. + */ + scsi_io_completion(SCpnt, SCpnt->bufflen, 0); } /* -- cgit v1.2.3 From aa7b5cd750c766f66a92c9f78ba176bc77512b7e Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 11 Nov 2005 05:31:41 -0600 Subject: [SCSI] add kmemcache for scsi_io_context Add kmemcache of scsi io contexts. In the future when we finalize on where these functions will live we can add a mempool for it and do a bioset for out REQ_BLOCK_PC bios. This is needed becuase the dm-multipath handlers will want to use the scsi_exectute* functions for failover and we cannot have them and the bio device allocating from the same mempool. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 3e136bfe421..54a72f19748 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -306,6 +306,8 @@ struct scsi_io_context { char sense[SCSI_SENSE_BUFFERSIZE]; }; +static kmem_cache_t *scsi_io_context_cache; + static void scsi_end_async(struct request *req) { struct scsi_io_context *sioc = req->end_io_data; @@ -313,7 +315,7 @@ static void scsi_end_async(struct request *req) if (sioc->done) sioc->done(sioc->data, sioc->sense, req->errors, req->data_len); - kfree(sioc); + kmem_cache_free(scsi_io_context_cache, sioc); __blk_put_request(req->q, req); } @@ -452,9 +454,10 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, int err = 0; int write = (data_direction == DMA_TO_DEVICE); - sioc = kzalloc(sizeof(*sioc), gfp); + sioc = kmem_cache_alloc(scsi_io_context_cache, gfp); if (!sioc) return DRIVER_ERROR << 24; + memset(sioc, 0, sizeof(*sioc)); req = blk_get_request(sdev->request_queue, write, gfp); if (!req) @@ -1765,6 +1768,14 @@ int __init scsi_init_queue(void) { int i; + scsi_io_context_cache = kmem_cache_create("scsi_io_context", + sizeof(struct scsi_io_context), + 0, 0, NULL, NULL); + if (!scsi_io_context_cache) { + printk(KERN_ERR "SCSI: can't init scsi io context cache\n"); + return -ENOMEM; + } + for (i = 0; i < SG_MEMPOOL_NR; i++) { struct scsi_host_sg_pool *sgp = scsi_sg_pools + i; int size = sgp->size * sizeof(struct scatterlist); @@ -1792,6 +1803,8 @@ void scsi_exit_queue(void) { int i; + kmem_cache_destroy(scsi_io_context_cache); + for (i = 0; i < SG_MEMPOOL_NR; i++) { struct scsi_host_sg_pool *sgp = scsi_sg_pools + i; mempool_destroy(sgp->pool); -- cgit v1.2.3 From d6b10348f9397943eb968419a2b7f08895e38472 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 8 Nov 2005 04:06:41 -0600 Subject: [SCSI] convert sg to scsi_execute_async Convert sg to always send scatterlists, and kill scsi_request usage. TODO: - move DIO code to common place or make block layers usable for ULDs. - move buffer allocation code to common place for all ULDs to use. And make buffer allocation code obey all queue limits so we can find out about problems before calling scsi_execute_async. Currently, sg.c could allocate a buffer that is too large, and send the request to scsi_execute_async. scsi_execute_async will then check it against all the queue limits and return a failure in this case. It would nicer to know about the queue limit violation right away. - move indirect (copy_to/from_user) paths commone place or make block layers usable for ULDs. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/sg.c | 686 +++++++++++++++++++++--------------------------------- 1 file changed, 259 insertions(+), 427 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index b55c2a8a547..221e96e2620 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -104,8 +104,6 @@ static int sg_allow_dio = SG_ALLOW_DIO_DEF; static int sg_add(struct class_device *, struct class_interface *); static void sg_remove(struct class_device *, struct class_interface *); -static Scsi_Request *dummy_cmdp; /* only used for sizeof */ - static DEFINE_RWLOCK(sg_dev_arr_lock); /* Also used to lock file descriptor list for device */ @@ -119,7 +117,7 @@ typedef struct sg_scatter_hold { /* holding area for scsi scatter gather info */ unsigned short sglist_len; /* size of malloc'd scatter-gather list ++ */ unsigned bufflen; /* Size of (aggregate) data buffer */ unsigned b_malloc_len; /* actual len malloc'ed in buffer */ - void *buffer; /* Data buffer or scatter list (k_use_sg>0) */ + struct scatterlist *buffer;/* scatter list */ char dio_in_use; /* 0->indirect IO (or mmap), 1->dio */ unsigned char cmd_opcode; /* first byte of command */ } Sg_scatter_hold; @@ -128,12 +126,11 @@ struct sg_device; /* forward declarations */ struct sg_fd; typedef struct sg_request { /* SG_MAX_QUEUE requests outstanding per file */ - Scsi_Request *my_cmdp; /* != 0 when request with lower levels */ struct sg_request *nextrp; /* NULL -> tail request (slist) */ struct sg_fd *parentfp; /* NULL -> not in use */ Sg_scatter_hold data; /* hold buffer, perhaps scatter list */ sg_io_hdr_t header; /* scsi command+info, see */ - unsigned char sense_b[sizeof (dummy_cmdp->sr_sense_buffer)]; + unsigned char sense_b[SCSI_SENSE_BUFFERSIZE]; char res_used; /* 1 -> using reserve buffer, 0 -> not ... */ char orphan; /* 1 -> drop on sight, 0 -> normal */ char sg_io_owned; /* 1 -> packet belongs to SG_IO */ @@ -174,7 +171,8 @@ typedef struct sg_device { /* holds the state of each scsi generic device */ } Sg_device; static int sg_fasync(int fd, struct file *filp, int mode); -static void sg_cmd_done(Scsi_Cmnd * SCpnt); /* tasklet or soft irq callback */ +/* tasklet or soft irq callback */ +static void sg_cmd_done(void *data, char *sense, int result, int resid); static int sg_start_req(Sg_request * srp); static void sg_finish_rem_req(Sg_request * srp); static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size); @@ -195,8 +193,8 @@ static void sg_remove_scat(Sg_scatter_hold * schp); static void sg_build_reserve(Sg_fd * sfp, int req_size); static void sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size); static void sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp); -static char *sg_page_malloc(int rqSz, int lowDma, int *retSzp); -static void sg_page_free(char *buff, int size); +static struct page *sg_page_malloc(int rqSz, int lowDma, int *retSzp); +static void sg_page_free(struct page *page, int size); static Sg_fd *sg_add_sfp(Sg_device * sdp, int dev); static int sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp); static void __sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp); @@ -207,7 +205,6 @@ static int sg_res_in_use(Sg_fd * sfp); static int sg_allow_access(unsigned char opcode, char dev_type); static int sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len); static Sg_device *sg_get_dev(int dev); -static inline unsigned char *sg_scatg2virt(const struct scatterlist *sclp); #ifdef CONFIG_SCSI_PROC_FS static int sg_last_dev(void); #endif @@ -226,6 +223,7 @@ sg_open(struct inode *inode, struct file *filp) { int dev = iminor(inode); int flags = filp->f_flags; + struct request_queue *q; Sg_device *sdp; Sg_fd *sfp; int res; @@ -287,7 +285,9 @@ sg_open(struct inode *inode, struct file *filp) } if (!sdp->headfp) { /* no existing opens on this device */ sdp->sgdebug = 0; - sdp->sg_tablesize = sdp->device->host->sg_tablesize; + q = sdp->device->request_queue; + sdp->sg_tablesize = min(q->max_hw_segments, + q->max_phys_segments); } if ((sfp = sg_add_sfp(sdp, dev))) filp->private_data = sfp; @@ -340,6 +340,7 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) return -ENXIO; SCSI_LOG_TIMEOUT(3, printk("sg_read: %s, count=%d\n", sdp->disk->disk_name, (int) count)); + if (!access_ok(VERIFY_WRITE, buf, count)) return -EFAULT; if (sfp->force_packid && (count >= SZ_SG_HEADER)) { @@ -491,7 +492,7 @@ sg_new_read(Sg_fd * sfp, char __user *buf, size_t count, Sg_request * srp) if ((hp->mx_sb_len > 0) && hp->sbp) { if ((CHECK_CONDITION & hp->masked_status) || (DRIVER_SENSE & hp->driver_status)) { - int sb_len = sizeof (dummy_cmdp->sr_sense_buffer); + int sb_len = SCSI_SENSE_BUFFERSIZE; sb_len = (hp->mx_sb_len > sb_len) ? sb_len : hp->mx_sb_len; len = 8 + (int) srp->sense_b[7]; /* Additional sense length field */ len = (len > sb_len) ? sb_len : len; @@ -525,7 +526,7 @@ sg_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) Sg_request *srp; struct sg_header old_hdr; sg_io_hdr_t *hp; - unsigned char cmnd[sizeof (dummy_cmdp->sr_cmnd)]; + unsigned char cmnd[MAX_COMMAND_SIZE]; if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) return -ENXIO; @@ -624,7 +625,7 @@ sg_new_write(Sg_fd * sfp, const char __user *buf, size_t count, int k; Sg_request *srp; sg_io_hdr_t *hp; - unsigned char cmnd[sizeof (dummy_cmdp->sr_cmnd)]; + unsigned char cmnd[MAX_COMMAND_SIZE]; int timeout; unsigned long ul_timeout; @@ -692,11 +693,9 @@ static int sg_common_write(Sg_fd * sfp, Sg_request * srp, unsigned char *cmnd, int timeout, int blocking) { - int k; - Scsi_Request *SRpnt; + int k, data_dir; Sg_device *sdp = sfp->parentdp; sg_io_hdr_t *hp = &srp->header; - request_queue_t *q; srp->data.cmd_opcode = cmnd[0]; /* hold opcode of command */ hp->status = 0; @@ -723,51 +722,36 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, sg_finish_rem_req(srp); return -ENODEV; } - SRpnt = scsi_allocate_request(sdp->device, GFP_ATOMIC); - if (SRpnt == NULL) { - SCSI_LOG_TIMEOUT(1, printk("sg_write: no mem\n")); - sg_finish_rem_req(srp); - return -ENOMEM; - } - srp->my_cmdp = SRpnt; - q = SRpnt->sr_device->request_queue; - SRpnt->sr_request->rq_disk = sdp->disk; - SRpnt->sr_sense_buffer[0] = 0; - SRpnt->sr_cmd_len = hp->cmd_len; - SRpnt->sr_use_sg = srp->data.k_use_sg; - SRpnt->sr_sglist_len = srp->data.sglist_len; - SRpnt->sr_bufflen = srp->data.bufflen; - SRpnt->sr_underflow = 0; - SRpnt->sr_buffer = srp->data.buffer; switch (hp->dxfer_direction) { case SG_DXFER_TO_FROM_DEV: case SG_DXFER_FROM_DEV: - SRpnt->sr_data_direction = DMA_FROM_DEVICE; + data_dir = DMA_FROM_DEVICE; break; case SG_DXFER_TO_DEV: - SRpnt->sr_data_direction = DMA_TO_DEVICE; + data_dir = DMA_TO_DEVICE; break; case SG_DXFER_UNKNOWN: - SRpnt->sr_data_direction = DMA_BIDIRECTIONAL; + data_dir = DMA_BIDIRECTIONAL; break; default: - SRpnt->sr_data_direction = DMA_NONE; + data_dir = DMA_NONE; break; } - SRpnt->upper_private_data = srp; - srp->data.k_use_sg = 0; - srp->data.sglist_len = 0; - srp->data.bufflen = 0; - srp->data.buffer = NULL; hp->duration = jiffies_to_msecs(jiffies); /* Now send everything of to mid-level. The next time we hear about this packet is when sg_cmd_done() is called (i.e. a callback). */ - scsi_do_req(SRpnt, (void *) cmnd, - (void *) SRpnt->sr_buffer, hp->dxfer_len, - sg_cmd_done, timeout, SG_DEFAULT_RETRIES); - /* dxfer_len overwrites SRpnt->sr_bufflen, hence need for b_malloc_len */ - return 0; + if (scsi_execute_async(sdp->device, cmnd, data_dir, srp->data.buffer, + hp->dxfer_len, srp->data.k_use_sg, timeout, + SG_DEFAULT_RETRIES, srp, sg_cmd_done, + GFP_ATOMIC)) { + SCSI_LOG_TIMEOUT(1, printk("sg_write: scsi_execute_async failed\n")); + /* + * most likely out of mem, but could also be a bad map + */ + return -ENOMEM; + } else + return 0; } static int @@ -1156,45 +1140,22 @@ sg_fasync(int fd, struct file *filp, int mode) return (retval < 0) ? retval : 0; } -static inline unsigned char * -sg_scatg2virt(const struct scatterlist *sclp) -{ - return (sclp && sclp->page) ? - (unsigned char *) page_address(sclp->page) + sclp->offset : NULL; -} - /* When startFinish==1 increments page counts for pages other than the - first of scatter gather elements obtained from __get_free_pages(). + first of scatter gather elements obtained from alloc_pages(). When startFinish==0 decrements ... */ static void sg_rb_correct4mmap(Sg_scatter_hold * rsv_schp, int startFinish) { - void *page_ptr; + struct scatterlist *sg = rsv_schp->buffer; struct page *page; int k, m; SCSI_LOG_TIMEOUT(3, printk("sg_rb_correct4mmap: startFinish=%d, scatg=%d\n", startFinish, rsv_schp->k_use_sg)); /* N.B. correction _not_ applied to base page of each allocation */ - if (rsv_schp->k_use_sg) { /* reserve buffer is a scatter gather list */ - struct scatterlist *sclp = rsv_schp->buffer; - - for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sclp) { - for (m = PAGE_SIZE; m < sclp->length; m += PAGE_SIZE) { - page_ptr = sg_scatg2virt(sclp) + m; - page = virt_to_page(page_ptr); - if (startFinish) - get_page(page); - else { - if (page_count(page) > 0) - __put_page(page); - } - } - } - } else { /* reserve buffer is just a single allocation */ - for (m = PAGE_SIZE; m < rsv_schp->bufflen; m += PAGE_SIZE) { - page_ptr = (unsigned char *) rsv_schp->buffer + m; - page = virt_to_page(page_ptr); + for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) { + for (m = PAGE_SIZE; m < sg->length; m += PAGE_SIZE) { + page = sg->page; if (startFinish) get_page(page); else { @@ -1210,9 +1171,10 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) { Sg_fd *sfp; struct page *page = NOPAGE_SIGBUS; - void *page_ptr = NULL; - unsigned long offset; + unsigned long offset, len, sa; Sg_scatter_hold *rsv_schp; + struct scatterlist *sg; + int k; if ((NULL == vma) || (!(sfp = (Sg_fd *) vma->vm_private_data))) return page; @@ -1222,30 +1184,21 @@ sg_vma_nopage(struct vm_area_struct *vma, unsigned long addr, int *type) return page; SCSI_LOG_TIMEOUT(3, printk("sg_vma_nopage: offset=%lu, scatg=%d\n", offset, rsv_schp->k_use_sg)); - if (rsv_schp->k_use_sg) { /* reserve buffer is a scatter gather list */ - int k; - unsigned long sa = vma->vm_start; - unsigned long len; - struct scatterlist *sclp = rsv_schp->buffer; - - for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end); - ++k, ++sclp) { - len = vma->vm_end - sa; - len = (len < sclp->length) ? len : sclp->length; - if (offset < len) { - page_ptr = sg_scatg2virt(sclp) + offset; - page = virt_to_page(page_ptr); - get_page(page); /* increment page count */ - break; - } - sa += len; - offset -= len; + sg = rsv_schp->buffer; + sa = vma->vm_start; + for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end); + ++k, ++sg) { + len = vma->vm_end - sa; + len = (len < sg->length) ? len : sg->length; + if (offset < len) { + page = sg->page; + get_page(page); /* increment page count */ + break; } - } else { /* reserve buffer is just a single allocation */ - page_ptr = (unsigned char *) rsv_schp->buffer + offset; - page = virt_to_page(page_ptr); - get_page(page); /* increment page count */ + sa += len; + offset -= len; } + if (type) *type = VM_FAULT_MINOR; return page; @@ -1259,8 +1212,10 @@ static int sg_mmap(struct file *filp, struct vm_area_struct *vma) { Sg_fd *sfp; - unsigned long req_sz; + unsigned long req_sz, len, sa; Sg_scatter_hold *rsv_schp; + int k; + struct scatterlist *sg; if ((!filp) || (!vma) || (!(sfp = (Sg_fd *) filp->private_data))) return -ENXIO; @@ -1273,24 +1228,15 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma) if (req_sz > rsv_schp->bufflen) return -ENOMEM; /* cannot map more than reserved buffer */ - if (rsv_schp->k_use_sg) { /* reserve buffer is a scatter gather list */ - int k; - unsigned long sa = vma->vm_start; - unsigned long len; - struct scatterlist *sclp = rsv_schp->buffer; - - for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end); - ++k, ++sclp) { - if (0 != sclp->offset) - return -EFAULT; /* non page aligned memory ?? */ - len = vma->vm_end - sa; - len = (len < sclp->length) ? len : sclp->length; - sa += len; - } - } else { /* reserve buffer is just a single allocation */ - if ((unsigned long) rsv_schp->buffer & (PAGE_SIZE - 1)) - return -EFAULT; /* non page aligned memory ?? */ + sa = vma->vm_start; + sg = rsv_schp->buffer; + for (k = 0; (k < rsv_schp->k_use_sg) && (sa < vma->vm_end); + ++k, ++sg) { + len = vma->vm_end - sa; + len = (len < sg->length) ? len : sg->length; + sa += len; } + if (0 == sfp->mmap_called) { sg_rb_correct4mmap(rsv_schp, 1); /* do only once per fd lifetime */ sfp->mmap_called = 1; @@ -1304,21 +1250,16 @@ sg_mmap(struct file *filp, struct vm_area_struct *vma) /* This function is a "bottom half" handler that is called by the * mid level when a command is completed (or has failed). */ static void -sg_cmd_done(Scsi_Cmnd * SCpnt) +sg_cmd_done(void *data, char *sense, int result, int resid) { - Scsi_Request *SRpnt = NULL; + Sg_request *srp = data; Sg_device *sdp = NULL; Sg_fd *sfp; - Sg_request *srp = NULL; unsigned long iflags; unsigned int ms; - if (SCpnt && (SRpnt = SCpnt->sc_request)) - srp = (Sg_request *) SRpnt->upper_private_data; if (NULL == srp) { printk(KERN_ERR "sg_cmd_done: NULL request\n"); - if (SRpnt) - scsi_release_request(SRpnt); return; } sfp = srp->parentfp; @@ -1326,49 +1267,34 @@ sg_cmd_done(Scsi_Cmnd * SCpnt) sdp = sfp->parentdp; if ((NULL == sdp) || sdp->detached) { printk(KERN_INFO "sg_cmd_done: device detached\n"); - scsi_release_request(SRpnt); return; } - /* First transfer ownership of data buffers to sg_device object. */ - srp->data.k_use_sg = SRpnt->sr_use_sg; - srp->data.sglist_len = SRpnt->sr_sglist_len; - srp->data.bufflen = SRpnt->sr_bufflen; - srp->data.buffer = SRpnt->sr_buffer; - /* now clear out request structure */ - SRpnt->sr_use_sg = 0; - SRpnt->sr_sglist_len = 0; - SRpnt->sr_bufflen = 0; - SRpnt->sr_buffer = NULL; - SRpnt->sr_underflow = 0; - SRpnt->sr_request->rq_disk = NULL; /* "sg" _disowns_ request blk */ - - srp->my_cmdp = NULL; SCSI_LOG_TIMEOUT(4, printk("sg_cmd_done: %s, pack_id=%d, res=0x%x\n", - sdp->disk->disk_name, srp->header.pack_id, (int) SRpnt->sr_result)); - srp->header.resid = SCpnt->resid; + sdp->disk->disk_name, srp->header.pack_id, result)); + srp->header.resid = resid; ms = jiffies_to_msecs(jiffies); srp->header.duration = (ms > srp->header.duration) ? (ms - srp->header.duration) : 0; - if (0 != SRpnt->sr_result) { + if (0 != result) { struct scsi_sense_hdr sshdr; - memcpy(srp->sense_b, SRpnt->sr_sense_buffer, - sizeof (srp->sense_b)); - srp->header.status = 0xff & SRpnt->sr_result; - srp->header.masked_status = status_byte(SRpnt->sr_result); - srp->header.msg_status = msg_byte(SRpnt->sr_result); - srp->header.host_status = host_byte(SRpnt->sr_result); - srp->header.driver_status = driver_byte(SRpnt->sr_result); + memcpy(srp->sense_b, sense, sizeof (srp->sense_b)); + srp->header.status = 0xff & result; + srp->header.masked_status = status_byte(result); + srp->header.msg_status = msg_byte(result); + srp->header.host_status = host_byte(result); + srp->header.driver_status = driver_byte(result); if ((sdp->sgdebug > 0) && ((CHECK_CONDITION == srp->header.masked_status) || (COMMAND_TERMINATED == srp->header.masked_status))) - scsi_print_req_sense("sg_cmd_done", SRpnt); + __scsi_print_sense("sg_cmd_done", sense, + SCSI_SENSE_BUFFERSIZE); /* Following if statement is a patch supplied by Eric Youngdale */ - if (driver_byte(SRpnt->sr_result) != 0 - && scsi_command_normalize_sense(SCpnt, &sshdr) + if (driver_byte(result) != 0 + && scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, &sshdr) && !scsi_sense_is_deferred(&sshdr) && sshdr.sense_key == UNIT_ATTENTION && sdp->device->removable) { @@ -1379,8 +1305,6 @@ sg_cmd_done(Scsi_Cmnd * SCpnt) } /* Rely on write phase to clean out srp status values, so no "else" */ - scsi_release_request(SRpnt); - SRpnt = NULL; if (sfp->closed) { /* whoops this fd already released, cleanup */ SCSI_LOG_TIMEOUT(1, printk("sg_cmd_done: already closed, freeing ...\n")); sg_finish_rem_req(srp); @@ -1431,6 +1355,7 @@ static int sg_sysfs_valid = 0; static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp) { + struct request_queue *q = scsidp->request_queue; Sg_device *sdp; unsigned long iflags; void *old_sg_dev_arr = NULL; @@ -1473,7 +1398,7 @@ static int sg_alloc(struct gendisk *disk, struct scsi_device *scsidp) sdp->disk = disk; sdp->device = scsidp; init_waitqueue_head(&sdp->o_excl_wait); - sdp->sg_tablesize = scsidp->host ? scsidp->host->sg_tablesize : 0; + sdp->sg_tablesize = min(q->max_hw_segments, q->max_phys_segments); sg_nr_dev++; sg_dev_arr[k] = sdp; @@ -1753,36 +1678,35 @@ sg_finish_rem_req(Sg_request * srp) static int sg_build_sgat(Sg_scatter_hold * schp, const Sg_fd * sfp, int tablesize) { - int ret_sz; - int elem_sz = sizeof (struct scatterlist); - int sg_bufflen = tablesize * elem_sz; - int mx_sc_elems = tablesize; + int sg_bufflen = tablesize * sizeof(struct scatterlist); + unsigned int gfp_flags = GFP_ATOMIC | __GFP_NOWARN; - schp->buffer = sg_page_malloc(sg_bufflen, sfp->low_dma, &ret_sz); + /* + * TODO: test without low_dma, we should not need it since + * the block layer will bounce the buffer for us + * + * XXX(hch): we shouldn't need GFP_DMA for the actual S/G list. + */ + if (sfp->low_dma) + gfp_flags |= GFP_DMA; + schp->buffer = kzalloc(sg_bufflen, gfp_flags); if (!schp->buffer) return -ENOMEM; - else if (ret_sz != sg_bufflen) { - sg_bufflen = ret_sz; - mx_sc_elems = sg_bufflen / elem_sz; - } schp->sglist_len = sg_bufflen; - memset(schp->buffer, 0, sg_bufflen); - return mx_sc_elems; /* number of scat_gath elements allocated */ + return tablesize; /* number of scat_gath elements allocated */ } #ifdef SG_ALLOW_DIO_CODE /* vvvvvvvv following code borrowed from st driver's direct IO vvvvvvvvv */ - /* hopefully this generic code will moved to a library */ + /* TODO: hopefully we can use the generic block layer code */ /* Pin down user pages and put them into a scatter gather list. Returns <= 0 if - mapping of all pages not successful - - any page is above max_pfn (i.e., either completely successful or fails) */ static int st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, - unsigned long uaddr, size_t count, int rw, - unsigned long max_pfn) + unsigned long uaddr, size_t count, int rw) { unsigned long end = (uaddr + count + PAGE_SIZE - 1) >> PAGE_SHIFT; unsigned long start = uaddr >> PAGE_SHIFT; @@ -1828,21 +1752,17 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, * probably wrong function for rw==WRITE */ flush_dcache_page(pages[i]); - if (page_to_pfn(pages[i]) > max_pfn) - goto out_unlock; /* ?? Is locking needed? I don't think so */ /* if (TestSetPageLocked(pages[i])) goto out_unlock; */ } - /* Populate the scatter/gather list */ - sgl[0].page = pages[0]; + sgl[0].page = pages[0]; sgl[0].offset = uaddr & ~PAGE_MASK; if (nr_pages > 1) { sgl[0].length = PAGE_SIZE - sgl[0].offset; count -= sgl[0].length; for (i=1; i < nr_pages ; i++) { - sgl[i].offset = 0; sgl[i].page = pages[i]; sgl[i].length = count < PAGE_SIZE ? count : PAGE_SIZE; count -= PAGE_SIZE; @@ -1855,10 +1775,6 @@ st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, kfree(pages); return nr_pages; - out_unlock: - /* for (j=0; j < i; j++) - unlock_page(pages[j]); */ - res = 0; out_unmap: if (res > 0) { for (j=0; j < res; j++) @@ -1904,20 +1820,20 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len) sg_io_hdr_t *hp = &srp->header; Sg_scatter_hold *schp = &srp->data; int sg_tablesize = sfp->parentdp->sg_tablesize; - struct scatterlist *sgl; int mx_sc_elems, res; struct scsi_device *sdev = sfp->parentdp->device; if (((unsigned long)hp->dxferp & queue_dma_alignment(sdev->request_queue)) != 0) return 1; + mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); if (mx_sc_elems <= 0) { return 1; } - sgl = (struct scatterlist *)schp->buffer; - res = st_map_user_pages(sgl, mx_sc_elems, (unsigned long)hp->dxferp, dxfer_len, - (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0, ULONG_MAX); + res = st_map_user_pages(schp->buffer, mx_sc_elems, + (unsigned long)hp->dxferp, dxfer_len, + (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0); if (res <= 0) return 1; schp->k_use_sg = res; @@ -1932,9 +1848,11 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len) static int sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) { - int ret_sz; + struct scatterlist *sg; + int ret_sz = 0, k, rem_sz, num, mx_sc_elems; + int sg_tablesize = sfp->parentdp->sg_tablesize; int blk_size = buff_size; - unsigned char *p = NULL; + struct page *p = NULL; if ((blk_size < 0) || (!sfp)) return -EFAULT; @@ -1944,59 +1862,35 @@ sg_build_indirect(Sg_scatter_hold * schp, Sg_fd * sfp, int buff_size) blk_size = (blk_size + SG_SECTOR_MSK) & (~SG_SECTOR_MSK); SCSI_LOG_TIMEOUT(4, printk("sg_build_indirect: buff_size=%d, blk_size=%d\n", buff_size, blk_size)); - if (blk_size <= SG_SCATTER_SZ) { - p = sg_page_malloc(blk_size, sfp->low_dma, &ret_sz); - if (!p) - return -ENOMEM; - if (blk_size == ret_sz) { /* got it on the first attempt */ - schp->k_use_sg = 0; - schp->buffer = p; - schp->bufflen = blk_size; - schp->b_malloc_len = blk_size; - return 0; - } - } else { - p = sg_page_malloc(SG_SCATTER_SZ, sfp->low_dma, &ret_sz); + + /* N.B. ret_sz carried into this block ... */ + mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); + if (mx_sc_elems < 0) + return mx_sc_elems; /* most likely -ENOMEM */ + + for (k = 0, sg = schp->buffer, rem_sz = blk_size; + (rem_sz > 0) && (k < mx_sc_elems); + ++k, rem_sz -= ret_sz, ++sg) { + + num = (rem_sz > SG_SCATTER_SZ) ? SG_SCATTER_SZ : rem_sz; + p = sg_page_malloc(num, sfp->low_dma, &ret_sz); if (!p) return -ENOMEM; - } -/* Want some local declarations, so start new block ... */ - { /* lets try and build a scatter gather list */ - struct scatterlist *sclp; - int k, rem_sz, num; - int mx_sc_elems; - int sg_tablesize = sfp->parentdp->sg_tablesize; - int first = 1; - - /* N.B. ret_sz carried into this block ... */ - mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); - if (mx_sc_elems < 0) - return mx_sc_elems; /* most likely -ENOMEM */ - - for (k = 0, sclp = schp->buffer, rem_sz = blk_size; - (rem_sz > 0) && (k < mx_sc_elems); - ++k, rem_sz -= ret_sz, ++sclp) { - if (first) - first = 0; - else { - num = - (rem_sz > - SG_SCATTER_SZ) ? SG_SCATTER_SZ : rem_sz; - p = sg_page_malloc(num, sfp->low_dma, &ret_sz); - if (!p) - break; - } - sg_set_buf(sclp, p, ret_sz); - - SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", - k, sg_scatg2virt(sclp), ret_sz)); - } /* end of for loop */ - schp->k_use_sg = k; - SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz)); - schp->bufflen = blk_size; - if (rem_sz > 0) /* must have failed */ - return -ENOMEM; - } + + sg->page = p; + sg->length = ret_sz; + + SCSI_LOG_TIMEOUT(5, printk("sg_build_build: k=%d, a=0x%p, len=%d\n", + k, p, ret_sz)); + } /* end of for loop */ + + schp->k_use_sg = k; + SCSI_LOG_TIMEOUT(5, printk("sg_build_indirect: k_use_sg=%d, rem_sz=%d\n", k, rem_sz)); + + schp->bufflen = blk_size; + if (rem_sz > 0) /* must have failed */ + return -ENOMEM; + return 0; } @@ -2005,6 +1899,7 @@ sg_write_xfer(Sg_request * srp) { sg_io_hdr_t *hp = &srp->header; Sg_scatter_hold *schp = &srp->data; + struct scatterlist *sg = schp->buffer; int num_xfer = 0; int j, k, onum, usglen, ksglen, res; int iovec_count = (int) hp->iovec_count; @@ -2033,63 +1928,45 @@ sg_write_xfer(Sg_request * srp) } else onum = 1; - if (0 == schp->k_use_sg) { /* kernel has single buffer */ - for (j = 0, p = schp->buffer; j < onum; ++j) { - res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up); - if (res) - return res; - usglen = (num_xfer > usglen) ? usglen : num_xfer; - if (__copy_from_user(p, up, usglen)) - return -EFAULT; - p += usglen; - num_xfer -= usglen; - if (num_xfer <= 0) - return 0; - } - } else { /* kernel using scatter gather list */ - struct scatterlist *sclp = (struct scatterlist *) schp->buffer; - - ksglen = (int) sclp->length; - p = sg_scatg2virt(sclp); - for (j = 0, k = 0; j < onum; ++j) { - res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up); - if (res) - return res; - - for (; p; ++sclp, ksglen = (int) sclp->length, - p = sg_scatg2virt(sclp)) { - if (usglen <= 0) - break; - if (ksglen > usglen) { - if (usglen >= num_xfer) { - if (__copy_from_user - (p, up, num_xfer)) - return -EFAULT; - return 0; - } - if (__copy_from_user(p, up, usglen)) - return -EFAULT; - p += usglen; - ksglen -= usglen; - break; - } else { - if (ksglen >= num_xfer) { - if (__copy_from_user - (p, up, num_xfer)) - return -EFAULT; - return 0; - } - if (__copy_from_user(p, up, ksglen)) + ksglen = sg->length; + p = page_address(sg->page); + for (j = 0, k = 0; j < onum; ++j) { + res = sg_u_iovec(hp, iovec_count, j, 1, &usglen, &up); + if (res) + return res; + + for (; p; ++sg, ksglen = sg->length, + p = page_address(sg->page)) { + if (usglen <= 0) + break; + if (ksglen > usglen) { + if (usglen >= num_xfer) { + if (__copy_from_user(p, up, num_xfer)) return -EFAULT; - up += ksglen; - usglen -= ksglen; + return 0; } - ++k; - if (k >= schp->k_use_sg) + if (__copy_from_user(p, up, usglen)) + return -EFAULT; + p += usglen; + ksglen -= usglen; + break; + } else { + if (ksglen >= num_xfer) { + if (__copy_from_user(p, up, num_xfer)) + return -EFAULT; return 0; + } + if (__copy_from_user(p, up, ksglen)) + return -EFAULT; + up += ksglen; + usglen -= ksglen; } + ++k; + if (k >= schp->k_use_sg) + return 0; } } + return 0; } @@ -2127,29 +2004,25 @@ sg_remove_scat(Sg_scatter_hold * schp) { SCSI_LOG_TIMEOUT(4, printk("sg_remove_scat: k_use_sg=%d\n", schp->k_use_sg)); if (schp->buffer && (schp->sglist_len > 0)) { - struct scatterlist *sclp = (struct scatterlist *) schp->buffer; + struct scatterlist *sg = schp->buffer; if (schp->dio_in_use) { #ifdef SG_ALLOW_DIO_CODE - st_unmap_user_pages(sclp, schp->k_use_sg, TRUE); + st_unmap_user_pages(sg, schp->k_use_sg, TRUE); #endif } else { int k; - for (k = 0; (k < schp->k_use_sg) && sg_scatg2virt(sclp); - ++k, ++sclp) { + for (k = 0; (k < schp->k_use_sg) && sg->page; + ++k, ++sg) { SCSI_LOG_TIMEOUT(5, printk( "sg_remove_scat: k=%d, a=0x%p, len=%d\n", - k, sg_scatg2virt(sclp), sclp->length)); - sg_page_free(sg_scatg2virt(sclp), sclp->length); - sclp->page = NULL; - sclp->offset = 0; - sclp->length = 0; + k, sg->page, sg->length)); + sg_page_free(sg->page, sg->length); } } - sg_page_free(schp->buffer, schp->sglist_len); - } else if (schp->buffer) - sg_page_free(schp->buffer, schp->b_malloc_len); + kfree(schp->buffer); + } memset(schp, 0, sizeof (*schp)); } @@ -2158,6 +2031,7 @@ sg_read_xfer(Sg_request * srp) { sg_io_hdr_t *hp = &srp->header; Sg_scatter_hold *schp = &srp->data; + struct scatterlist *sg = schp->buffer; int num_xfer = 0; int j, k, onum, usglen, ksglen, res; int iovec_count = (int) hp->iovec_count; @@ -2186,63 +2060,45 @@ sg_read_xfer(Sg_request * srp) } else onum = 1; - if (0 == schp->k_use_sg) { /* kernel has single buffer */ - for (j = 0, p = schp->buffer; j < onum; ++j) { - res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up); - if (res) - return res; - usglen = (num_xfer > usglen) ? usglen : num_xfer; - if (__copy_to_user(up, p, usglen)) - return -EFAULT; - p += usglen; - num_xfer -= usglen; - if (num_xfer <= 0) - return 0; - } - } else { /* kernel using scatter gather list */ - struct scatterlist *sclp = (struct scatterlist *) schp->buffer; - - ksglen = (int) sclp->length; - p = sg_scatg2virt(sclp); - for (j = 0, k = 0; j < onum; ++j) { - res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up); - if (res) - return res; - - for (; p; ++sclp, ksglen = (int) sclp->length, - p = sg_scatg2virt(sclp)) { - if (usglen <= 0) - break; - if (ksglen > usglen) { - if (usglen >= num_xfer) { - if (__copy_to_user - (up, p, num_xfer)) - return -EFAULT; - return 0; - } - if (__copy_to_user(up, p, usglen)) - return -EFAULT; - p += usglen; - ksglen -= usglen; - break; - } else { - if (ksglen >= num_xfer) { - if (__copy_to_user - (up, p, num_xfer)) - return -EFAULT; - return 0; - } - if (__copy_to_user(up, p, ksglen)) + p = page_address(sg->page); + ksglen = sg->length; + for (j = 0, k = 0; j < onum; ++j) { + res = sg_u_iovec(hp, iovec_count, j, 0, &usglen, &up); + if (res) + return res; + + for (; p; ++sg, ksglen = sg->length, + p = page_address(sg->page)) { + if (usglen <= 0) + break; + if (ksglen > usglen) { + if (usglen >= num_xfer) { + if (__copy_to_user(up, p, num_xfer)) return -EFAULT; - up += ksglen; - usglen -= ksglen; + return 0; } - ++k; - if (k >= schp->k_use_sg) + if (__copy_to_user(up, p, usglen)) + return -EFAULT; + p += usglen; + ksglen -= usglen; + break; + } else { + if (ksglen >= num_xfer) { + if (__copy_to_user(up, p, num_xfer)) + return -EFAULT; return 0; + } + if (__copy_to_user(up, p, ksglen)) + return -EFAULT; + up += ksglen; + usglen -= ksglen; } + ++k; + if (k >= schp->k_use_sg) + return 0; } } + return 0; } @@ -2250,37 +2106,32 @@ static int sg_read_oxfer(Sg_request * srp, char __user *outp, int num_read_xfer) { Sg_scatter_hold *schp = &srp->data; + struct scatterlist *sg = schp->buffer; + int k, num; SCSI_LOG_TIMEOUT(4, printk("sg_read_oxfer: num_read_xfer=%d\n", num_read_xfer)); if ((!outp) || (num_read_xfer <= 0)) return 0; - if (schp->k_use_sg > 0) { - int k, num; - struct scatterlist *sclp = (struct scatterlist *) schp->buffer; - - for (k = 0; (k < schp->k_use_sg) && sg_scatg2virt(sclp); - ++k, ++sclp) { - num = (int) sclp->length; - if (num > num_read_xfer) { - if (__copy_to_user - (outp, sg_scatg2virt(sclp), num_read_xfer)) - return -EFAULT; + + for (k = 0; (k < schp->k_use_sg) && sg->page; ++k, ++sg) { + num = sg->length; + if (num > num_read_xfer) { + if (__copy_to_user(outp, page_address(sg->page), + num_read_xfer)) + return -EFAULT; + break; + } else { + if (__copy_to_user(outp, page_address(sg->page), + num)) + return -EFAULT; + num_read_xfer -= num; + if (num_read_xfer <= 0) break; - } else { - if (__copy_to_user - (outp, sg_scatg2virt(sclp), num)) - return -EFAULT; - num_read_xfer -= num; - if (num_read_xfer <= 0) - break; - outp += num; - } + outp += num; } - } else { - if (__copy_to_user(outp, schp->buffer, num_read_xfer)) - return -EFAULT; } + return 0; } @@ -2306,44 +2157,31 @@ sg_link_reserve(Sg_fd * sfp, Sg_request * srp, int size) { Sg_scatter_hold *req_schp = &srp->data; Sg_scatter_hold *rsv_schp = &sfp->reserve; + struct scatterlist *sg = rsv_schp->buffer; + int k, num, rem; srp->res_used = 1; SCSI_LOG_TIMEOUT(4, printk("sg_link_reserve: size=%d\n", size)); - size = (size + 1) & (~1); /* round to even for aha1542 */ - if (rsv_schp->k_use_sg > 0) { - int k, num; - int rem = size; - struct scatterlist *sclp = - (struct scatterlist *) rsv_schp->buffer; - - for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sclp) { - num = (int) sclp->length; - if (rem <= num) { - if (0 == k) { - req_schp->k_use_sg = 0; - req_schp->buffer = sg_scatg2virt(sclp); - } else { - sfp->save_scat_len = num; - sclp->length = (unsigned) rem; - req_schp->k_use_sg = k + 1; - req_schp->sglist_len = - rsv_schp->sglist_len; - req_schp->buffer = rsv_schp->buffer; - } - req_schp->bufflen = size; - req_schp->b_malloc_len = rsv_schp->b_malloc_len; - break; - } else - rem -= num; - } - if (k >= rsv_schp->k_use_sg) - SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n")); - } else { - req_schp->k_use_sg = 0; - req_schp->bufflen = size; - req_schp->buffer = rsv_schp->buffer; - req_schp->b_malloc_len = rsv_schp->b_malloc_len; + rem = size = (size + 1) & (~1); /* round to even for aha1542 */ + + for (k = 0; k < rsv_schp->k_use_sg; ++k, ++sg) { + num = sg->length; + if (rem <= num) { + sfp->save_scat_len = num; + sg->length = rem; + req_schp->k_use_sg = k + 1; + req_schp->sglist_len = rsv_schp->sglist_len; + req_schp->buffer = rsv_schp->buffer; + + req_schp->bufflen = size; + req_schp->b_malloc_len = rsv_schp->b_malloc_len; + break; + } else + rem -= num; } + + if (k >= rsv_schp->k_use_sg) + SCSI_LOG_TIMEOUT(1, printk("sg_link_reserve: BAD size\n")); } static void @@ -2355,11 +2193,10 @@ sg_unlink_reserve(Sg_fd * sfp, Sg_request * srp) SCSI_LOG_TIMEOUT(4, printk("sg_unlink_reserve: req->k_use_sg=%d\n", (int) req_schp->k_use_sg)); if ((rsv_schp->k_use_sg > 0) && (req_schp->k_use_sg > 0)) { - struct scatterlist *sclp = - (struct scatterlist *) rsv_schp->buffer; + struct scatterlist *sg = rsv_schp->buffer; if (sfp->save_scat_len > 0) - (sclp + (req_schp->k_use_sg - 1))->length = + (sg + (req_schp->k_use_sg - 1))->length = (unsigned) sfp->save_scat_len; else SCSI_LOG_TIMEOUT(1, printk ("sg_unlink_reserve: BAD save_scat_len\n")); @@ -2445,7 +2282,6 @@ sg_add_request(Sg_fd * sfp) if (resp) { resp->nextrp = NULL; resp->header.duration = jiffies_to_msecs(jiffies); - resp->my_cmdp = NULL; } write_unlock_irqrestore(&sfp->rq_list_lock, iflags); return resp; @@ -2463,8 +2299,6 @@ sg_remove_request(Sg_fd * sfp, Sg_request * srp) if ((!sfp) || (!srp) || (!sfp->headrp)) return res; write_lock_irqsave(&sfp->rq_list_lock, iflags); - if (srp->my_cmdp) - srp->my_cmdp->upper_private_data = NULL; prev_rp = sfp->headrp; if (srp == prev_rp) { sfp->headrp = prev_rp->nextrp; @@ -2507,10 +2341,10 @@ sg_add_sfp(Sg_device * sdp, int dev) Sg_fd *sfp; unsigned long iflags; - sfp = (Sg_fd *) sg_page_malloc(sizeof (Sg_fd), 0, NULL); + sfp = kzalloc(sizeof(*sfp), GFP_ATOMIC | __GFP_NOWARN); if (!sfp) return NULL; - memset(sfp, 0, sizeof (Sg_fd)); + init_waitqueue_head(&sfp->read_wait); rwlock_init(&sfp->rq_list_lock); @@ -2567,7 +2401,7 @@ __sg_remove_sfp(Sg_device * sdp, Sg_fd * sfp) } sfp->parentdp = NULL; SCSI_LOG_TIMEOUT(6, printk("__sg_remove_sfp: sfp=0x%p\n", sfp)); - sg_page_free((char *) sfp, sizeof (Sg_fd)); + kfree(sfp); } /* Returns 0 in normal case, 1 when detached and sdp object removed */ @@ -2632,10 +2466,10 @@ sg_res_in_use(Sg_fd * sfp) } /* If retSzp==NULL want exact size or fail */ -static char * +static struct page * sg_page_malloc(int rqSz, int lowDma, int *retSzp) { - char *resp = NULL; + struct page *resp = NULL; gfp_t page_mask; int order, a_size; int resSz = rqSz; @@ -2650,11 +2484,11 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp) for (order = 0, a_size = PAGE_SIZE; a_size < rqSz; order++, a_size <<= 1) ; - resp = (char *) __get_free_pages(page_mask, order); + resp = alloc_pages(page_mask, order); while ((!resp) && order && retSzp) { --order; a_size >>= 1; /* divide by 2, until PAGE_SIZE */ - resp = (char *) __get_free_pages(page_mask, order); /* try half */ + resp = alloc_pages(page_mask, order); /* try half */ resSz = a_size; } if (resp) { @@ -2667,15 +2501,15 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp) } static void -sg_page_free(char *buff, int size) +sg_page_free(struct page *page, int size) { int order, a_size; - if (!buff) + if (!page) return; for (order = 0, a_size = PAGE_SIZE; a_size < size; order++, a_size <<= 1) ; - free_pages((unsigned long) buff, order); + __free_pages(page, order); } #ifndef MAINTENANCE_IN_CMD @@ -3067,13 +2901,11 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp) cp = " "; } seq_printf(s, cp); - blen = srp->my_cmdp ? - srp->my_cmdp->sr_bufflen : srp->data.bufflen; - usg = srp->my_cmdp ? - srp->my_cmdp->sr_use_sg : srp->data.k_use_sg; + blen = srp->data.bufflen; + usg = srp->data.k_use_sg; seq_printf(s, srp->done ? ((1 == srp->done) ? "rcv:" : "fin:") - : (srp->my_cmdp ? "act:" : "prior:")); + : "act:"); seq_printf(s, " id=%d blen=%d", srp->header.pack_id, blen); if (srp->done) -- cgit v1.2.3 From 8b05b773b6030de5b1bab1cbb0bf1ff8c34cdbe0 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Tue, 8 Nov 2005 04:06:44 -0600 Subject: [SCSI] convert st to use scsi_execute_async convert st to always send scatterlists and kill scsi_request usage. This is the same as last time as it was posted, but with Kai's patches merged and we now pass the bytes value to scsi_execute_async. TODO: - move DIO code to common place or make block layers usable for ULDs. - move buffer allocation code to common place for all ULDs to use. And make buffer allocation code handle all queue limits so we can find out about problems before calling scsi_execute_async. - move indirect (copy_to/from_user) paths commone place or make block layers usable for ULDs. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/st.c | 254 +++++++++++++++++++++++------------------------------- drivers/scsi/st.h | 14 ++- 2 files changed, 123 insertions(+), 145 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 053444b027d..26e13dc7bcd 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -50,7 +50,6 @@ static const char *verstr = "20050830"; #include #include #include -#include #include @@ -188,8 +187,6 @@ static int from_buffer(struct st_buffer *, char __user *, int); static void move_buffer_data(struct st_buffer *, int); static void buf_to_sg(struct st_buffer *, unsigned int); -static int st_map_user_pages(struct scatterlist *, const unsigned int, - unsigned long, size_t, int, unsigned long); static int sgl_map_user_pages(struct scatterlist *, const unsigned int, unsigned long, size_t, int); static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int); @@ -313,12 +310,13 @@ static inline char *tape_name(struct scsi_tape *tape) } -static void st_analyze_sense(struct scsi_request *SRpnt, struct st_cmdstatus *s) +static void st_analyze_sense(struct st_request *SRpnt, struct st_cmdstatus *s) { const u8 *ucp; - const u8 *sense = SRpnt->sr_sense_buffer; + const u8 *sense = SRpnt->sense; - s->have_sense = scsi_request_normalize_sense(SRpnt, &s->sense_hdr); + s->have_sense = scsi_normalize_sense(SRpnt->sense, + SCSI_SENSE_BUFFERSIZE, &s->sense_hdr); s->flags = 0; if (s->have_sense) { @@ -345,9 +343,9 @@ static void st_analyze_sense(struct scsi_request *SRpnt, struct st_cmdstatus *s) /* Convert the result to success code */ -static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) +static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt) { - int result = SRpnt->sr_result; + int result = SRpnt->result; u8 scode; DEB(const char *stp;) char *name = tape_name(STp); @@ -366,13 +364,12 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) DEB( if (debugging) { - printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", + printk(ST_DEB_MSG "%s: Error: %x, cmd: %x %x %x %x %x %x\n", name, result, - SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2], - SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5], - SRpnt->sr_bufflen); + SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2], + SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]); if (cmdstatp->have_sense) - scsi_print_req_sense("st", SRpnt); + __scsi_print_sense("st", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); } ) /* end DEB */ if (!debugging) { /* Abnormal conditions for tape */ if (!cmdstatp->have_sense) @@ -386,20 +383,21 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) /* scode != UNIT_ATTENTION && */ scode != BLANK_CHECK && scode != VOLUME_OVERFLOW && - SRpnt->sr_cmnd[0] != MODE_SENSE && - SRpnt->sr_cmnd[0] != TEST_UNIT_READY) { + SRpnt->cmd[0] != MODE_SENSE && + SRpnt->cmd[0] != TEST_UNIT_READY) { printk(KERN_WARNING "%s: Error with sense data: ", name); - scsi_print_req_sense("st", SRpnt); + __scsi_print_sense("st", SRpnt->sense, + SCSI_SENSE_BUFFERSIZE); } } if (cmdstatp->fixed_format && STp->cln_mode >= EXTENDED_SENSE_START) { /* Only fixed format sense */ if (STp->cln_sense_value) - STp->cleaning_req |= ((SRpnt->sr_sense_buffer[STp->cln_mode] & + STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] & STp->cln_sense_mask) == STp->cln_sense_value); else - STp->cleaning_req |= ((SRpnt->sr_sense_buffer[STp->cln_mode] & + STp->cleaning_req |= ((SRpnt->sense[STp->cln_mode] & STp->cln_sense_mask) != 0); } if (cmdstatp->have_sense && @@ -411,8 +409,8 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) if (cmdstatp->have_sense && scode == RECOVERED_ERROR #if ST_RECOVERED_WRITE_FATAL - && SRpnt->sr_cmnd[0] != WRITE_6 - && SRpnt->sr_cmnd[0] != WRITE_FILEMARKS + && SRpnt->cmd[0] != WRITE_6 + && SRpnt->cmd[0] != WRITE_FILEMARKS #endif ) { STp->recover_count++; @@ -420,9 +418,9 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) DEB( if (debugging) { - if (SRpnt->sr_cmnd[0] == READ_6) + if (SRpnt->cmd[0] == READ_6) stp = "read"; - else if (SRpnt->sr_cmnd[0] == WRITE_6) + else if (SRpnt->cmd[0] == WRITE_6) stp = "write"; else stp = "ioctl"; @@ -438,28 +436,37 @@ static int st_chk_result(struct scsi_tape *STp, struct scsi_request * SRpnt) /* Wakeup from interrupt */ -static void st_sleep_done(struct scsi_cmnd * SCpnt) +static void st_sleep_done(void *data, char *sense, int result, int resid) { - struct scsi_tape *STp = container_of(SCpnt->request->rq_disk->private_data, - struct scsi_tape, driver); + struct st_request *SRpnt = data; + struct scsi_tape *STp = SRpnt->stp; - (STp->buffer)->cmdstat.midlevel_result = SCpnt->result; - SCpnt->request->rq_status = RQ_SCSI_DONE; + memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE); + (STp->buffer)->cmdstat.midlevel_result = SRpnt->result = result; DEB( STp->write_pending = 0; ) - if (SCpnt->request->waiting) - complete(SCpnt->request->waiting); + if (SRpnt->waiting) + complete(SRpnt->waiting); +} + +static struct st_request *st_allocate_request(void) +{ + return kzalloc(sizeof(struct st_request), GFP_KERNEL); +} + +static void st_release_request(struct st_request *streq) +{ + kfree(streq); } /* Do the scsi command. Waits until command performed if do_wait is true. Otherwise write_behind_check() is used to check that the command has finished. */ -static struct scsi_request * -st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd, +static struct st_request * +st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait) { struct completion *waiting; - unsigned char *bp; /* if async, make sure there's no command outstanding */ if (!do_wait && ((STp->buffer)->last_SRpnt)) { @@ -473,7 +480,7 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c } if (SRpnt == NULL) { - SRpnt = scsi_allocate_request(STp->device, GFP_ATOMIC); + SRpnt = st_allocate_request(); if (SRpnt == NULL) { DEBC( printk(KERN_ERR "%s: Can't get SCSI request.\n", tape_name(STp)); ); @@ -483,6 +490,7 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c (STp->buffer)->syscall_result = (-EBUSY); return NULL; } + SRpnt->stp = STp; } /* If async IO, set last_SRpnt. This ptr tells write_behind_check @@ -492,32 +500,26 @@ st_do_scsi(struct scsi_request * SRpnt, struct scsi_tape * STp, unsigned char *c waiting = &STp->wait; init_completion(waiting); - SRpnt->sr_use_sg = STp->buffer->do_dio || (bytes > (STp->buffer)->frp[0].length); - if (SRpnt->sr_use_sg) { - if (!STp->buffer->do_dio) - buf_to_sg(STp->buffer, bytes); - SRpnt->sr_use_sg = (STp->buffer)->sg_segs; - bp = (char *) &((STp->buffer)->sg[0]); - } else - bp = (STp->buffer)->b_data; - SRpnt->sr_data_direction = direction; - SRpnt->sr_cmd_len = 0; - SRpnt->sr_request->waiting = waiting; - SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; - SRpnt->sr_request->rq_disk = STp->disk; - SRpnt->sr_request->end_io = blk_end_sync_rq; - STp->buffer->cmdstat.have_sense = 0; + SRpnt->waiting = waiting; - scsi_do_req(SRpnt, (void *) cmd, bp, bytes, - st_sleep_done, timeout, retries); + if (!STp->buffer->do_dio) + buf_to_sg(STp->buffer, bytes); - if (do_wait) { + memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); + STp->buffer->cmdstat.have_sense = 0; + STp->buffer->syscall_result = 0; + + if (scsi_execute_async(STp->device, cmd, direction, + &((STp->buffer)->sg[0]), bytes, (STp->buffer)->sg_segs, + timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) + /* could not allocate the buffer or request was too large */ + (STp->buffer)->syscall_result = (-EBUSY); + else if (do_wait) { wait_for_completion(waiting); - SRpnt->sr_request->waiting = NULL; - if (SRpnt->sr_request->rq_status != RQ_SCSI_DONE) - SRpnt->sr_result |= (DRIVER_ERROR << 24); + SRpnt->waiting = NULL; (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt); } + return SRpnt; } @@ -532,7 +534,7 @@ static int write_behind_check(struct scsi_tape * STp) struct st_buffer *STbuffer; struct st_partstat *STps; struct st_cmdstatus *cmdstatp; - struct scsi_request *SRpnt; + struct st_request *SRpnt; STbuffer = STp->buffer; if (!STbuffer->writing) @@ -548,12 +550,10 @@ static int write_behind_check(struct scsi_tape * STp) wait_for_completion(&(STp->wait)); SRpnt = STbuffer->last_SRpnt; STbuffer->last_SRpnt = NULL; - SRpnt->sr_request->waiting = NULL; - if (SRpnt->sr_request->rq_status != RQ_SCSI_DONE) - SRpnt->sr_result |= (DRIVER_ERROR << 24); + SRpnt->waiting = NULL; (STp->buffer)->syscall_result = st_chk_result(STp, SRpnt); - scsi_release_request(SRpnt); + st_release_request(SRpnt); STbuffer->buffer_bytes -= STbuffer->writing; STps = &(STp->ps[STp->partition]); @@ -593,7 +593,7 @@ static int write_behind_check(struct scsi_tape * STp) it messes up the block number). */ static int cross_eof(struct scsi_tape * STp, int forward) { - struct scsi_request *SRpnt; + struct st_request *SRpnt; unsigned char cmd[MAX_COMMAND_SIZE]; cmd[0] = SPACE; @@ -613,7 +613,7 @@ static int cross_eof(struct scsi_tape * STp, int forward) if (!SRpnt) return (STp->buffer)->syscall_result; - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; if ((STp->buffer)->cmdstat.midlevel_result != 0) @@ -630,7 +630,7 @@ static int flush_write_buffer(struct scsi_tape * STp) int offset, transfer, blks; int result; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; struct st_partstat *STps; result = write_behind_check(STp); @@ -688,7 +688,7 @@ static int flush_write_buffer(struct scsi_tape * STp) STp->dirty = 0; (STp->buffer)->buffer_bytes = 0; } - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; } return result; @@ -785,7 +785,7 @@ static int set_mode_densblk(struct scsi_tape * STp, struct st_modedef * STm) } -/* Lock or unlock the drive door. Don't use when scsi_request allocated. */ +/* Lock or unlock the drive door. Don't use when st_request allocated. */ static int do_door_lock(struct scsi_tape * STp, int do_lock) { int retval, cmd; @@ -844,7 +844,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait) int attentions, waits, max_wait, scode; int retval = CHKRES_READY, new_session = 0; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat; max_wait = do_wait ? ST_BLOCK_SECONDS : 0; @@ -903,7 +903,7 @@ static int test_ready(struct scsi_tape *STp, int do_wait) } if (SRpnt != NULL) - scsi_release_request(SRpnt); + st_release_request(SRpnt); return retval; } @@ -918,7 +918,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp) int i, retval, new_session = 0, do_wait; unsigned char cmd[MAX_COMMAND_SIZE], saved_cleaning; unsigned short st_flags = filp->f_flags; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; struct st_modedef *STm; struct st_partstat *STps; char *name = tape_name(STp); @@ -993,7 +993,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp) goto err_out; } - if (!SRpnt->sr_result && !STp->buffer->cmdstat.have_sense) { + if (!SRpnt->result && !STp->buffer->cmdstat.have_sense) { STp->max_block = ((STp->buffer)->b_data[1] << 16) | ((STp->buffer)->b_data[2] << 8) | (STp->buffer)->b_data[3]; STp->min_block = ((STp->buffer)->b_data[4] << 8) | @@ -1045,7 +1045,7 @@ static int check_tape(struct scsi_tape *STp, struct file *filp) } STp->drv_write_prot = ((STp->buffer)->b_data[2] & 0x80) != 0; } - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; STp->inited = 1; @@ -1196,7 +1196,7 @@ static int st_flush(struct file *filp) { int result = 0, result2; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; struct scsi_tape *STp = filp->private_data; struct st_modedef *STm = &(STp->modes[STp->current_mode]); struct st_partstat *STps = &(STp->ps[STp->partition]); @@ -1249,7 +1249,7 @@ static int st_flush(struct file *filp) cmdstatp->sense_hdr.sense_key == RECOVERED_ERROR) && (!cmdstatp->remainder_valid || cmdstatp->uremainder64 == 0))) { /* Write successful at EOM */ - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; if (STps->drv_file >= 0) STps->drv_file++; @@ -1259,7 +1259,7 @@ static int st_flush(struct file *filp) STps->eof = ST_FM; } else { /* Write error */ - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; printk(KERN_ERR "%s: Error on write filemark.\n", name); if (result == 0) @@ -1400,11 +1400,11 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf, i = STp->try_dio && try_rdio; else i = STp->try_dio && try_wdio; + if (i && ((unsigned long)buf & queue_dma_alignment( STp->device->request_queue)) == 0) { - i = st_map_user_pages(&(STbp->sg[0]), STbp->use_sg, - (unsigned long)buf, count, (is_read ? READ : WRITE), - STp->max_pfn); + i = sgl_map_user_pages(&(STbp->sg[0]), STbp->use_sg, + (unsigned long)buf, count, (is_read ? READ : WRITE)); if (i > 0) { STbp->do_dio = i; STbp->buffer_bytes = 0; /* can be used as transfer counter */ @@ -1472,7 +1472,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) int async_write; unsigned char cmd[MAX_COMMAND_SIZE]; const char __user *b_point; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; struct scsi_tape *STp = filp->private_data; struct st_modedef *STm; struct st_partstat *STps; @@ -1624,7 +1624,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) retval = STbp->syscall_result; goto out; } - if (async_write) { + if (async_write && !STbp->syscall_result) { STbp->writing = transfer; STp->dirty = !(STbp->writing == STbp->buffer_bytes); @@ -1698,7 +1698,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) } else { count += do_count; STps->drv_block = (-1); /* Too cautious? */ - retval = (-EIO); + retval = STbp->syscall_result; } } @@ -1728,7 +1728,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) out: if (SRpnt != NULL) - scsi_release_request(SRpnt); + st_release_request(SRpnt); release_buffering(STp); up(&STp->lock); @@ -1742,11 +1742,11 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) Does release user buffer mapping if it is set. */ static long read_tape(struct scsi_tape *STp, long count, - struct scsi_request ** aSRpnt) + struct st_request ** aSRpnt) { int transfer, blks, bytes; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; struct st_modedef *STm; struct st_partstat *STps; struct st_buffer *STbp; @@ -1802,10 +1802,10 @@ static long read_tape(struct scsi_tape *STp, long count, retval = 1; DEBC(printk(ST_DEB_MSG "%s: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", name, - SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1], - SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3], - SRpnt->sr_sense_buffer[4], SRpnt->sr_sense_buffer[5], - SRpnt->sr_sense_buffer[6], SRpnt->sr_sense_buffer[7])); + SRpnt->sense[0], SRpnt->sense[1], + SRpnt->sense[2], SRpnt->sense[3], + SRpnt->sense[4], SRpnt->sense[5], + SRpnt->sense[6], SRpnt->sense[7])); if (cmdstatp->have_sense) { if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK) @@ -1835,7 +1835,7 @@ static long read_tape(struct scsi_tape *STp, long count, } STbp->buffer_bytes = bytes - transfer; } else { - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = *aSRpnt = NULL; if (transfer == blks) { /* We did not get anything, error */ printk(KERN_NOTICE "%s: Incorrect block size.\n", name); @@ -1929,7 +1929,7 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) ssize_t retval = 0; ssize_t i, transfer; int special, do_dio = 0; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; struct scsi_tape *STp = filp->private_data; struct st_modedef *STm; struct st_partstat *STps; @@ -2054,7 +2054,7 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) out: if (SRpnt != NULL) { - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; } if (do_dio) { @@ -2284,7 +2284,7 @@ static int st_set_options(struct scsi_tape *STp, long options) static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SENSE; @@ -2298,7 +2298,7 @@ static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs) if (SRpnt == NULL) return (STp->buffer)->syscall_result; - scsi_release_request(SRpnt); + st_release_request(SRpnt); return (STp->buffer)->syscall_result; } @@ -2310,7 +2310,7 @@ static int write_mode_page(struct scsi_tape *STp, int page, int slow) { int pgo; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt = NULL; + struct st_request *SRpnt = NULL; memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SELECT; @@ -2329,7 +2329,7 @@ static int write_mode_page(struct scsi_tape *STp, int page, int slow) if (SRpnt == NULL) return (STp->buffer)->syscall_result; - scsi_release_request(SRpnt); + st_release_request(SRpnt); return (STp->buffer)->syscall_result; } @@ -2412,7 +2412,7 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod DEB( char *name = tape_name(STp); ) unsigned char cmd[MAX_COMMAND_SIZE]; struct st_partstat *STps; - struct scsi_request *SRpnt; + struct st_request *SRpnt; if (STp->ready != ST_READY && !load_code) { if (STp->ready == ST_NO_TAPE) @@ -2455,7 +2455,7 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod return (STp->buffer)->syscall_result; retval = (STp->buffer)->syscall_result; - scsi_release_request(SRpnt); + st_release_request(SRpnt); if (!retval) { /* SCSI command successful */ @@ -2503,7 +2503,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon int ioctl_result; int chg_eof = 1; unsigned char cmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; struct st_partstat *STps; int fileno, blkno, at_sm, undone; int datalen = 0, direction = DMA_NONE; @@ -2757,7 +2757,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon ioctl_result = (STp->buffer)->syscall_result; if (!ioctl_result) { /* SCSI command successful */ - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; STps->drv_block = blkno; STps->drv_file = fileno; @@ -2872,7 +2872,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon /* Try the other possible state of Page Format if not already tried */ STp->use_pf = !STp->use_pf | PF_TESTED; - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; return st_int_ioctl(STp, cmd_in, arg); } @@ -2882,7 +2882,7 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon if (cmdstatp->sense_hdr.sense_key == BLANK_CHECK) STps->eof = ST_EOD; - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; } @@ -2898,7 +2898,7 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti { int result; unsigned char scmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; DEB( char *name = tape_name(STp); ) if (STp->ready != ST_READY) @@ -2944,7 +2944,7 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti DEBC(printk(ST_DEB_MSG "%s: Got tape pos. blk %d part %d.\n", name, *block, *partition)); } - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; return result; @@ -2961,7 +2961,7 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition unsigned int blk; int timeout; unsigned char scmd[MAX_COMMAND_SIZE]; - struct scsi_request *SRpnt; + struct st_request *SRpnt; DEB( char *name = tape_name(STp); ) if (STp->ready != ST_READY) @@ -3047,7 +3047,7 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition result = 0; } - scsi_release_request(SRpnt); + st_release_request(SRpnt); SRpnt = NULL; return result; @@ -3577,7 +3577,7 @@ static long st_compat_ioctl(struct file *file, unsigned int cmd, unsigned long a static struct st_buffer * new_tape_buffer(int from_initialization, int need_dma, int max_sg) { - int i, got = 0, segs = 0; + int i, got = 0; gfp_t priority; struct st_buffer *tb; @@ -3594,10 +3594,8 @@ static struct st_buffer * return NULL; } memset(tb, 0, i); - tb->frp_segs = tb->orig_frp_segs = segs; + tb->frp_segs = tb->orig_frp_segs = 0; tb->use_sg = max_sg; - if (segs > 0) - tb->b_data = page_address(tb->sg[0].page); tb->frp = (struct st_buf_fragment *)(&(tb->sg[0]) + max_sg); tb->in_use = 1; @@ -3628,7 +3626,7 @@ static int enlarge_buffer(struct st_buffer * STbuffer, int new_size, int need_dm priority = GFP_KERNEL | __GFP_NOWARN; if (need_dma) priority |= GFP_DMA; - for (b_size = PAGE_SIZE, order=0; + for (b_size = PAGE_SIZE, order=0; order <= 6 && b_size < new_size - STbuffer->buffer_size; order++, b_size *= 2) ; /* empty */ @@ -3670,6 +3668,7 @@ static void normalize_buffer(struct st_buffer * STbuffer) } STbuffer->frp_segs = STbuffer->orig_frp_segs; STbuffer->frp_sg_current = 0; + STbuffer->sg_segs = 0; } @@ -3882,7 +3881,6 @@ static int st_probe(struct device *dev) struct st_buffer *buffer; int i, j, mode, dev_num, error; char *stp; - u64 bounce_limit; if (SDp->type != TYPE_TAPE) return -ENODEV; @@ -3892,7 +3890,8 @@ static int st_probe(struct device *dev) return -ENODEV; } - i = SDp->host->sg_tablesize; + i = min(SDp->request_queue->max_hw_segments, + SDp->request_queue->max_phys_segments); if (st_max_sg_segs < i) i = st_max_sg_segs; buffer = new_tape_buffer(1, (SDp->host)->unchecked_isa_dma, i); @@ -3994,11 +3993,6 @@ static int st_probe(struct device *dev) tpnt->long_timeout = ST_LONG_TIMEOUT; tpnt->try_dio = try_direct_io && !SDp->host->unchecked_isa_dma; - bounce_limit = scsi_calculate_bounce_limit(SDp->host) >> PAGE_SHIFT; - if (bounce_limit > ULONG_MAX) - bounce_limit = ULONG_MAX; - tpnt->max_pfn = bounce_limit; - for (i = 0; i < ST_NBR_MODES; i++) { STm = &(tpnt->modes[i]); STm->defined = 0; @@ -4077,9 +4071,9 @@ static int st_probe(struct device *dev) sdev_printk(KERN_WARNING, SDp, "Attached scsi tape %s", tape_name(tpnt)); - printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B), max page reachable by HBA %lu\n", + printk(KERN_WARNING "%s: try direct i/o: %s (alignment %d B)\n", tape_name(tpnt), tpnt->try_dio ? "yes" : "no", - queue_dma_alignment(SDp->request_queue) + 1, tpnt->max_pfn); + queue_dma_alignment(SDp->request_queue) + 1); return 0; @@ -4411,34 +4405,6 @@ static void do_create_class_files(struct scsi_tape *STp, int dev_num, int mode) return; } - -/* Pin down user pages and put them into a scatter gather list. Returns <= 0 if - - mapping of all pages not successful - - any page is above max_pfn - (i.e., either completely successful or fails) -*/ -static int st_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, - unsigned long uaddr, size_t count, int rw, - unsigned long max_pfn) -{ - int i, nr_pages; - - nr_pages = sgl_map_user_pages(sgl, max_pages, uaddr, count, rw); - if (nr_pages <= 0) - return nr_pages; - - for (i=0; i < nr_pages; i++) { - if (page_to_pfn(sgl[i].page) > max_pfn) - goto out_unmap; - } - return nr_pages; - - out_unmap: - sgl_unmap_user_pages(sgl, nr_pages, 0); - return 0; -} - - /* The following functions may be useful for a larger audience. */ static int sgl_map_user_pages(struct scatterlist *sgl, const unsigned int max_pages, unsigned long uaddr, size_t count, int rw) diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h index 790acac160b..411209048d7 100644 --- a/drivers/scsi/st.h +++ b/drivers/scsi/st.h @@ -4,6 +4,7 @@ #include #include +#include /* Descriptor for analyzed sense data */ struct st_cmdstatus { @@ -17,6 +18,17 @@ struct st_cmdstatus { u8 deferred; }; +struct scsi_tape; + +/* scsi tape command */ +struct st_request { + unsigned char cmd[MAX_COMMAND_SIZE]; + unsigned char sense[SCSI_SENSE_BUFFERSIZE]; + int result; + struct scsi_tape *stp; + struct completion *waiting; +}; + /* The tape buffer descriptor. */ struct st_buffer { unsigned char in_use; @@ -28,7 +40,7 @@ struct st_buffer { int read_pointer; int writing; int syscall_result; - struct scsi_request *last_SRpnt; + struct st_request *last_SRpnt; struct st_cmdstatus cmdstat; unsigned char *b_data; unsigned short use_sg; /* zero or max number of s/g segments for this adapter */ -- cgit v1.2.3 From defd94b75409b983f94548ea2f52ff5787ddb848 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Mon, 5 Dec 2005 02:37:06 -0600 Subject: [SCSI] seperate max_sectors from max_hw_sectors - export __blk_put_request and blk_execute_rq_nowait needed for async REQ_BLOCK_PC requests - seperate max_hw_sectors and max_sectors for block/scsi_ioctl.c and SG_IO bio.c helpers per Jens's last comments. Since block/scsi_ioctl.c SG_IO was already testing against max_sectors and SCSI-ml was setting max_sectors and max_hw_sectors to the same value this does not change any scsi SG_IO behavior. It only prepares ll_rw_blk.c, scsi_ioctl.c and bio.c for when SCSI-ml begins to set a valid max_hw_sectors for all LLDs. Today if a LLD does not set it SCSI-ml sets it to a safe default and some LLDs set it to a artificial low value to overcome memory and feedback issues. Note: Since we now cap max_sectors to BLK_DEF_MAX_SECTORS, which is 1024, drivers that used to call blk_queue_max_sectors with a large value of max_sectors will now see the fs requests capped to BLK_DEF_MAX_SECTORS. Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 54a72f19748..14ad2a785a3 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -462,6 +462,7 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, req = blk_get_request(sdev->request_queue, write, gfp); if (!req) goto free_sense; + req->flags |= REQ_BLOCK_PC | REQ_QUIET; if (use_sg) err = scsi_req_map_sg(req, buffer, use_sg, bufflen, gfp); @@ -477,7 +478,6 @@ int scsi_execute_async(struct scsi_device *sdev, const unsigned char *cmd, req->sense_len = 0; req->timeout = timeout; req->retries = retries; - req->flags |= REQ_BLOCK_PC | REQ_QUIET; req->end_io_data = sioc; sioc->data = privdata; -- cgit v1.2.3 From 787926b1b2d21d42ca462dc736b77f1a4a30c503 Mon Sep 17 00:00:00 2001 From: Kai Makisara Date: Sun, 13 Nov 2005 10:04:44 +0200 Subject: [SCSI] Fix st oops with new scsi_execute infrastructure Patch from Kai minus last sg_segs clearing which was merged already. > > Was there a oops or lockup or any debug output you can send me? I will try > > some more large request tests with scsi_debug. You also have to compile your > > kernel with SCSI_MAX_PHYS_SEGMENTS == 255 to get larger requests now. > It was an oops in sgl_unmap_user_pages(). The reason is this: /* XXX: just for debug. Remove when PageReserved is removed */ BUG_ON(PageReserved(page)); I was using /dev/zero as input and it triggers this. When I used a file as input, this did not trigger. Should this BUG_ON be removed? In the same log I noticed that there was another ->sg_segs inconsistency. Also, the field ->last_SRpnt was not reset when scsi_execute_async() failed. This caused the error message "Async command already active" later and prevented proper close. While doing the changes, I noticed that the current code (since 2.6.0-test4) does not set the pages dirty when reading with direct i/o. All of these st problems (including the one I sent earlier) are fixed in the patch at the end of this message. These fixes should probably be included already in 2.6.15. After these fixes, the tape seems to operate as expected. Without other changes, the largest block size with sym53c896 SCSI adapter is 384 kB. The maximum number of sg segments is set to 96 and clustering is disabled in the driver. 96 x 4 kB = 384 kB. OK. I enabled clustering and set max_sectors to 10000 in the SCSI HBA driver. Now the block size limit is 5000 kB as expected. Signed-off-by: James Bottomley --- drivers/scsi/st.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 26e13dc7bcd..2096d137f5e 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -511,9 +511,11 @@ st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd if (scsi_execute_async(STp->device, cmd, direction, &((STp->buffer)->sg[0]), bytes, (STp->buffer)->sg_segs, - timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) + timeout, retries, SRpnt, st_sleep_done, GFP_KERNEL)) { /* could not allocate the buffer or request was too large */ (STp->buffer)->syscall_result = (-EBUSY); + (STp->buffer)->last_SRpnt = NULL; + } else if (do_wait) { wait_for_completion(waiting); SRpnt->waiting = NULL; @@ -1449,14 +1451,15 @@ static int setup_buffering(struct scsi_tape *STp, const char __user *buf, /* Can be called more than once after each setup_buffer() */ -static void release_buffering(struct scsi_tape *STp) +static void release_buffering(struct scsi_tape *STp, int is_read) { struct st_buffer *STbp; STbp = STp->buffer; if (STbp->do_dio) { - sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, 0); + sgl_unmap_user_pages(&(STbp->sg[0]), STbp->do_dio, is_read); STbp->do_dio = 0; + STbp->sg_segs = 0; } } @@ -1729,7 +1732,7 @@ st_write(struct file *filp, const char __user *buf, size_t count, loff_t * ppos) out: if (SRpnt != NULL) st_release_request(SRpnt); - release_buffering(STp); + release_buffering(STp, 0); up(&STp->lock); return retval; @@ -1787,7 +1790,7 @@ static long read_tape(struct scsi_tape *STp, long count, SRpnt = *aSRpnt; SRpnt = st_do_scsi(SRpnt, STp, cmd, bytes, DMA_FROM_DEVICE, STp->device->timeout, MAX_RETRIES, 1); - release_buffering(STp); + release_buffering(STp, 1); *aSRpnt = SRpnt; if (!SRpnt) return STbp->syscall_result; @@ -2058,7 +2061,7 @@ st_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) SRpnt = NULL; } if (do_dio) { - release_buffering(STp); + release_buffering(STp, 1); STbp->buffer_bytes = 0; } up(&STp->lock); -- cgit v1.2.3 From 7b16318dea8d9840dac567a2ae8c50ecdea36aea Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Thu, 15 Dec 2005 20:17:02 -0600 Subject: Fix up SCSI mismerge I forgot to do a git-update-cache on the merged files ... --- drivers/scsi/scsi_lib.c | 33 +++++++++++++++++++++------------ drivers/scsi/sd.c | 2 +- drivers/scsi/sr.c | 2 +- drivers/scsi/st.c | 2 +- 4 files changed, 24 insertions(+), 15 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 14ad2a785a3..a7f3f0c84db 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1259,6 +1259,26 @@ static void scsi_generic_done(struct scsi_cmnd *cmd) scsi_io_completion(cmd, cmd->bufflen, 0); } +void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) +{ + struct request *req = cmd->request; + + BUG_ON(sizeof(req->cmd) > sizeof(cmd->cmnd)); + memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); + cmd->cmd_len = req->cmd_len; + if (!req->data_len) + cmd->sc_data_direction = DMA_NONE; + else if (rq_data_dir(req) == WRITE) + cmd->sc_data_direction = DMA_TO_DEVICE; + else + cmd->sc_data_direction = DMA_FROM_DEVICE; + + cmd->transfersize = req->data_len; + cmd->allowed = req->retries; + cmd->timeout_per_command = req->timeout; +} +EXPORT_SYMBOL_GPL(scsi_setup_blk_pc_cmnd); + static int scsi_prep_fn(struct request_queue *q, struct request *req) { struct scsi_device *sdev = q->queuedata; @@ -1394,18 +1414,7 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) goto kill; } } else { - memcpy(cmd->cmnd, req->cmd, sizeof(cmd->cmnd)); - cmd->cmd_len = req->cmd_len; - if (rq_data_dir(req) == WRITE) - cmd->sc_data_direction = DMA_TO_DEVICE; - else if (req->data_len) - cmd->sc_data_direction = DMA_FROM_DEVICE; - else - cmd->sc_data_direction = DMA_NONE; - - cmd->transfersize = req->data_len; - cmd->allowed = req->retries; - cmd->timeout_per_command = req->timeout; + scsi_setup_blk_pc_cmnd(cmd); cmd->done = scsi_generic_done; } } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 9d893f08501..3d3ad7d1b77 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -245,7 +245,7 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) * SG_IO from block layer already setup, just copy cdb basically */ if (blk_pc_request(rq)) { - scsi_setup_blk_pc_cmnd(SCpnt, SD_PASSTHROUGH_RETRIES); + scsi_setup_blk_pc_cmnd(SCpnt); if (rq->timeout) timeout = rq->timeout; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 7e7398d563c..a4d9be7c687 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -320,7 +320,7 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) * these are already setup, just copy cdb basically */ if (SCpnt->request->flags & REQ_BLOCK_PC) { - scsi_setup_blk_pc_cmnd(SCpnt, MAX_RETRIES); + scsi_setup_blk_pc_cmnd(SCpnt); if (SCpnt->timeout_per_command) timeout = SCpnt->timeout_per_command; diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 894ad53be04..c4aade8f534 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -4198,7 +4198,7 @@ static int st_init_command(struct scsi_cmnd *SCpnt) if (!(SCpnt->request->flags & REQ_BLOCK_PC)) return 0; - scsi_setup_blk_pc_cmnd(SCpnt, 0); + scsi_setup_blk_pc_cmnd(SCpnt); SCpnt->done = st_intr; return 1; } -- cgit v1.2.3 From 410ca5c7c6ed08bda165e8137bff26c3fbee5a1b Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 15 Dec 2005 16:22:01 -0500 Subject: [SCSI] Move scsi_print_msg to SPI class scsi_print_msg() is an SPI-specific concept. This patch moves it from constants.c to scsi_transport_spi.c and updates the Kconfig to link in the SPI class for the drivers which use scsi_print_msg(). Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/Kconfig | 13 +++++ drivers/scsi/arm/Kconfig | 1 + drivers/scsi/constants.c | 108 ------------------------------------- drivers/scsi/scsi_transport_spi.c | 109 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+), 108 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 20dd85a7781..4c42065dea8 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -336,6 +336,7 @@ config SCSI_ACARD config SCSI_AHA152X tristate "Adaptec AHA152X/2825 support" depends on ISA && SCSI && !64BIT + select SCSI_SPI_ATTRS ---help--- This is a driver for the AHA-1510, AHA-1520, AHA-1522, and AHA-2825 SCSI host adapters. It also works for the AVA-1505, but the IRQ etc. @@ -623,6 +624,7 @@ config SCSI_OMIT_FLASHPOINT config SCSI_DMX3191D tristate "DMX3191D SCSI support" depends on PCI && SCSI + select SCSI_SPI_ATTRS help This is support for Domex DMX3191D SCSI Host Adapters. @@ -632,6 +634,7 @@ config SCSI_DMX3191D config SCSI_DTC3280 tristate "DTC3180/3280 SCSI support" depends on ISA && SCSI + select SCSI_SPI_ATTRS help This is support for DTC 3180/3280 SCSI Host Adapters. Please read the SCSI-HOWTO, available from @@ -752,6 +755,7 @@ config SCSI_GDTH config SCSI_GENERIC_NCR5380 tristate "Generic NCR5380/53c400 SCSI PIO support" depends on ISA && SCSI + select SCSI_SPI_ATTRS ---help--- This is a driver for the old NCR 53c80 series of SCSI controllers on boards using PIO. Most boards such as the Trantor T130 fit this @@ -771,6 +775,7 @@ config SCSI_GENERIC_NCR5380 config SCSI_GENERIC_NCR5380_MMIO tristate "Generic NCR5380/53c400 SCSI MMIO support" depends on ISA && SCSI + select SCSI_SPI_ATTRS ---help--- This is a driver for the old NCR 53c80 series of SCSI controllers on boards using memory mapped I/O. @@ -1254,6 +1259,7 @@ config SCSI_MCA_53C9X config SCSI_PAS16 tristate "PAS16 SCSI support" depends on ISA && SCSI + select SCSI_SPI_ATTRS ---help--- This is support for a SCSI host adapter. It is explained in section 3.10 of the SCSI-HOWTO, available from @@ -1423,6 +1429,7 @@ config SCSI_DC390T config SCSI_T128 tristate "Trantor T128/T128F/T228 SCSI support" depends on ISA && SCSI + select SCSI_SPI_ATTRS ---help--- This is support for a SCSI host adapter. It is explained in section 3.11 of the SCSI-HOWTO, available from @@ -1681,6 +1688,7 @@ config OKTAGON_SCSI config ATARI_SCSI tristate "Atari native SCSI support" depends on ATARI && SCSI && BROKEN + select SCSI_SPI_ATTRS ---help--- If you have an Atari with built-in NCR5380 SCSI controller (TT, Falcon, ...) say Y to get it supported. Of course also, if you have @@ -1722,6 +1730,7 @@ config TT_DMA_EMUL config MAC_SCSI bool "Macintosh NCR5380 SCSI" depends on MAC && SCSI=y + select SCSI_SPI_ATTRS help This is the NCR 5380 SCSI controller included on most of the 68030 based Macintoshes. If you have one of these say Y and read the @@ -1743,6 +1752,7 @@ config SCSI_MAC_ESP config MVME147_SCSI bool "WD33C93 SCSI driver for MVME147" depends on MVME147 && SCSI=y + select SCSI_SPI_ATTRS help Support for the on-board SCSI controller on the Motorola MVME147 single-board computer. @@ -1750,6 +1760,7 @@ config MVME147_SCSI config MVME16x_SCSI bool "NCR53C710 SCSI driver for MVME16x" depends on MVME16x && SCSI && BROKEN + select SCSI_SPI_ATTRS help The Motorola MVME162, 166, 167, 172 and 177 boards use the NCR53C710 SCSI controller chip. Almost everyone using one of these boards @@ -1758,6 +1769,7 @@ config MVME16x_SCSI config BVME6000_SCSI bool "NCR53C710 SCSI driver for BVME6000" depends on BVME6000 && SCSI && BROKEN + select SCSI_SPI_ATTRS help The BVME4000 and BVME6000 boards from BVM Ltd use the NCR53C710 SCSI controller chip. Almost everyone using one of these boards @@ -1774,6 +1786,7 @@ config SCSI_NCR53C7xx_FAST config SUN3_SCSI tristate "Sun3 NCR5380 SCSI" depends on SUN3 && SCSI && BROKEN + select SCSI_SPI_ATTRS help This option will enable support for the OBIO (onboard io) NCR5380 SCSI controller found in the Sun 3/50 and 3/60, as well as for diff --git a/drivers/scsi/arm/Kconfig b/drivers/scsi/arm/Kconfig index 13f23043c8a..06d7601cdf5 100644 --- a/drivers/scsi/arm/Kconfig +++ b/drivers/scsi/arm/Kconfig @@ -4,6 +4,7 @@ config SCSI_ACORNSCSI_3 tristate "Acorn SCSI card (aka30) support" depends on ARCH_ACORN && SCSI && BROKEN + select SCSI_SPI_ATTRS help This enables support for the Acorn SCSI card (aka30). If you have an Acorn system with one of these, say Y. If unsure, say N. diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index a972c1e89e3..30a335349ce 100644 --- a/drivers/scsi/constants.c +++ b/drivers/scsi/constants.c @@ -1278,114 +1278,6 @@ void scsi_print_req_sense(const char *devclass, struct scsi_request *sreq) } EXPORT_SYMBOL(scsi_print_req_sense); -#ifdef CONFIG_SCSI_CONSTANTS -static const char * const one_byte_msgs[] = { -/* 0x00 */ "Command Complete", NULL, "Save Pointers", -/* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", -/* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error", -/* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag", -/* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", -/* 0x0f */ "Initiate Recovery", "Release Recovery" -}; -#define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs) / sizeof (const char *)) - -static const char * const two_byte_msgs[] = { -/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag" -/* 0x23 */ "Ignore Wide Residue" -}; -#define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) - -static const char * const extended_msgs[] = { -/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", -/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" -}; -#define NO_EXTENDED_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) - - -int scsi_print_msg (const unsigned char *msg) -{ - int len = 0, i; - if (msg[0] == EXTENDED_MESSAGE) { - len = 3 + msg[1]; - if (msg[2] < NO_EXTENDED_MSGS) - printk ("%s ", extended_msgs[msg[2]]); - else - printk ("Extended Message, reserved code (0x%02x) ", - (int) msg[2]); - switch (msg[2]) { - case EXTENDED_MODIFY_DATA_POINTER: - printk("pointer = %d", (int) (msg[3] << 24) | - (msg[4] << 16) | (msg[5] << 8) | msg[6]); - break; - case EXTENDED_SDTR: - printk("period = %d ns, offset = %d", - (int) msg[3] * 4, (int) msg[4]); - break; - case EXTENDED_WDTR: - printk("width = 2^%d bytes", msg[3]); - break; - default: - for (i = 2; i < len; ++i) - printk("%02x ", msg[i]); - } - /* Identify */ - } else if (msg[0] & 0x80) { - printk("Identify disconnect %sallowed %s %d ", - (msg[0] & 0x40) ? "" : "not ", - (msg[0] & 0x20) ? "target routine" : "lun", - msg[0] & 0x7); - len = 1; - /* Normal One byte */ - } else if (msg[0] < 0x1f) { - if (msg[0] < NO_ONE_BYTE_MSGS) - printk(one_byte_msgs[msg[0]]); - else - printk("reserved (%02x) ", msg[0]); - len = 1; - /* Two byte */ - } else if (msg[0] <= 0x2f) { - if ((msg[0] - 0x20) < NO_TWO_BYTE_MSGS) - printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], - msg[1]); - else - printk("reserved two byte (%02x %02x) ", - msg[0], msg[1]); - len = 2; - } else - printk("reserved"); - return len; -} -EXPORT_SYMBOL(scsi_print_msg); - -#else /* ifndef CONFIG_SCSI_CONSTANTS */ - -int scsi_print_msg (const unsigned char *msg) -{ - int len = 0, i; - - if (msg[0] == EXTENDED_MESSAGE) { - len = 3 + msg[1]; - for (i = 0; i < len; ++i) - printk("%02x ", msg[i]); - /* Identify */ - } else if (msg[0] & 0x80) { - printk("%02x ", msg[0]); - len = 1; - /* Normal One byte */ - } else if (msg[0] < 0x1f) { - printk("%02x ", msg[0]); - len = 1; - /* Two byte */ - } else if (msg[0] <= 0x2f) { - printk("%02x %02x", msg[0], msg[1]); - len = 2; - } else - printk("%02x ", msg[0]); - return len; -} -EXPORT_SYMBOL(scsi_print_msg); -#endif /* ! CONFIG_SCSI_CONSTANTS */ - void scsi_print_command(struct scsi_cmnd *cmd) { /* Assume appended output (i.e. not at start of line) */ diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 4002a98ab16..00a73fc23fc 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -18,6 +18,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include #include #include #include @@ -1047,6 +1048,114 @@ void spi_display_xfer_agreement(struct scsi_target *starget) } EXPORT_SYMBOL(spi_display_xfer_agreement); +#ifdef CONFIG_SCSI_CONSTANTS +static const char * const one_byte_msgs[] = { +/* 0x00 */ "Command Complete", NULL, "Save Pointers", +/* 0x03 */ "Restore Pointers", "Disconnect", "Initiator Error", +/* 0x06 */ "Abort", "Message Reject", "Nop", "Message Parity Error", +/* 0x0a */ "Linked Command Complete", "Linked Command Complete w/flag", +/* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", +/* 0x0f */ "Initiate Recovery", "Release Recovery" +}; +#define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs) / sizeof (const char *)) + +static const char * const two_byte_msgs[] = { +/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag" +/* 0x23 */ "Ignore Wide Residue" +}; +#define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) + +static const char * const extended_msgs[] = { +/* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", +/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" +}; +#define NO_EXTENDED_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) + + +int scsi_print_msg (const unsigned char *msg) +{ + int len = 0, i; + if (msg[0] == EXTENDED_MESSAGE) { + len = 3 + msg[1]; + if (msg[2] < NO_EXTENDED_MSGS) + printk ("%s ", extended_msgs[msg[2]]); + else + printk ("Extended Message, reserved code (0x%02x) ", + (int) msg[2]); + switch (msg[2]) { + case EXTENDED_MODIFY_DATA_POINTER: + printk("pointer = %d", (int) (msg[3] << 24) | + (msg[4] << 16) | (msg[5] << 8) | msg[6]); + break; + case EXTENDED_SDTR: + printk("period = %d ns, offset = %d", + (int) msg[3] * 4, (int) msg[4]); + break; + case EXTENDED_WDTR: + printk("width = 2^%d bytes", msg[3]); + break; + default: + for (i = 2; i < len; ++i) + printk("%02x ", msg[i]); + } + /* Identify */ + } else if (msg[0] & 0x80) { + printk("Identify disconnect %sallowed %s %d ", + (msg[0] & 0x40) ? "" : "not ", + (msg[0] & 0x20) ? "target routine" : "lun", + msg[0] & 0x7); + len = 1; + /* Normal One byte */ + } else if (msg[0] < 0x1f) { + if (msg[0] < NO_ONE_BYTE_MSGS) + printk(one_byte_msgs[msg[0]]); + else + printk("reserved (%02x) ", msg[0]); + len = 1; + /* Two byte */ + } else if (msg[0] <= 0x2f) { + if ((msg[0] - 0x20) < NO_TWO_BYTE_MSGS) + printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], + msg[1]); + else + printk("reserved two byte (%02x %02x) ", + msg[0], msg[1]); + len = 2; + } else + printk("reserved"); + return len; +} +EXPORT_SYMBOL(scsi_print_msg); + +#else /* ifndef CONFIG_SCSI_CONSTANTS */ + +int scsi_print_msg (const unsigned char *msg) +{ + int len = 0, i; + + if (msg[0] == EXTENDED_MESSAGE) { + len = 3 + msg[1]; + for (i = 0; i < len; ++i) + printk("%02x ", msg[i]); + /* Identify */ + } else if (msg[0] & 0x80) { + printk("%02x ", msg[0]); + len = 1; + /* Normal One byte */ + } else if (msg[0] < 0x1f) { + printk("%02x ", msg[0]); + len = 1; + /* Two byte */ + } else if (msg[0] <= 0x2f) { + printk("%02x %02x", msg[0], msg[1]); + len = 2; + } else + printk("%02x ", msg[0]); + return len; +} +EXPORT_SYMBOL(scsi_print_msg); +#endif /* ! CONFIG_SCSI_CONSTANTS */ + #define SETUP_ATTRIBUTE(field) \ i->private_attrs[count] = class_device_attr_##field; \ if (!i->f->set_##field) { \ -- cgit v1.2.3 From 1abfd370134553f3b47e3e40a0526e05001409c2 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 15 Dec 2005 16:22:01 -0500 Subject: [SCSI] Rename scsi_print_msg to spi_print_msg Rename scsi_print_msg to spi_print_msg and move its prototype from scsi_dbg.h to scsi_transport_spi.h Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/53c700.c | 6 +++--- drivers/scsi/53c7xx.c | 7 ++++--- drivers/scsi/NCR5380.c | 7 ++++--- drivers/scsi/aha152x.c | 7 ++++--- drivers/scsi/arm/acornscsi.c | 7 ++++--- drivers/scsi/atari_NCR5380.c | 7 ++++--- drivers/scsi/scsi_transport_spi.c | 8 ++++---- drivers/scsi/sun3_NCR5380.c | 7 ++++--- drivers/scsi/sym53c8xx_2/sym_hipd.c | 4 ++-- 9 files changed, 33 insertions(+), 27 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index e7ad269041a..4ce7438608e 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c @@ -857,7 +857,7 @@ process_extended_message(struct Scsi_Host *host, printk(KERN_INFO "scsi%d (%d:%d): Unexpected message %s: ", host->host_no, pun, lun, NCR_700_phase[(dsps & 0xf00) >> 8]); - scsi_print_msg(hostdata->msgin); + spi_print_msg(hostdata->msgin); printk("\n"); /* just reject it */ hostdata->msgout[0] = A_REJECT_MSG; @@ -887,7 +887,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata #ifdef NCR_700_DEBUG printk("scsi%d (%d:%d): message %s: ", host->host_no, pun, lun, NCR_700_phase[(dsps & 0xf00) >> 8]); - scsi_print_msg(hostdata->msgin); + spi_print_msg(hostdata->msgin); printk("\n"); #endif @@ -939,7 +939,7 @@ process_message(struct Scsi_Host *host, struct NCR_700_Host_Parameters *hostdata host->host_no, pun, lun, NCR_700_phase[(dsps & 0xf00) >> 8]); - scsi_print_msg(hostdata->msgin); + spi_print_msg(hostdata->msgin); printk("\n"); /* just reject it */ hostdata->msgout[0] = A_REJECT_MSG; diff --git a/drivers/scsi/53c7xx.c b/drivers/scsi/53c7xx.c index 9cb5dd48383..7894b8ea84b 100644 --- a/drivers/scsi/53c7xx.c +++ b/drivers/scsi/53c7xx.c @@ -282,6 +282,7 @@ #include "scsi.h" #include #include +#include #include "53c7xx.h" #include #include @@ -1724,7 +1725,7 @@ NCR53c7xx_run_tests (struct Scsi_Host *host) { printk ("scsi%d : status ", host->host_no); scsi_print_status (status); printk ("\nscsi%d : message ", host->host_no); - scsi_print_msg (&msg); + spi_print_msg(&msg); printk ("\n"); } else if (hostdata->test_completed == 3) { printk("scsi%d : test 2 no connection with target %d\n", @@ -2313,7 +2314,7 @@ NCR53c7x0_dstat_sir_intr (struct Scsi_Host *host, struct printk ("scsi%d : received message", host->host_no); if (c) printk (" from target %d lun %d ", c->device->id, c->device->lun); - scsi_print_msg ((unsigned char *) hostdata->msg_buf); + spi_print_msg((unsigned char *) hostdata->msg_buf); printk("\n"); } @@ -5540,7 +5541,7 @@ print_dsa (struct Scsi_Host *host, u32 *dsa, const char *prefix) { i > 0 && !check_address ((unsigned long) ptr, 1); ptr += len, i -= len) { printk(" "); - len = scsi_print_msg (ptr); + len = spi_print_msg(ptr); printk("\n"); if (!len) break; diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c index cba9655d0f1..9f0ddbe6dc7 100644 --- a/drivers/scsi/NCR5380.c +++ b/drivers/scsi/NCR5380.c @@ -87,6 +87,7 @@ * the high level code. */ #include +#include #ifndef NDEBUG #define NDEBUG 0 @@ -2377,7 +2378,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) { * 3..length+1 arguments * * Start the extended message buffer with the EXTENDED_MESSAGE - * byte, since scsi_print_msg() wants the whole thing. + * byte, since spi_print_msg() wants the whole thing. */ extended_msg[0] = EXTENDED_MESSAGE; /* Accept first byte by clearing ACK */ @@ -2424,7 +2425,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) { default: if (!tmp) { printk("scsi%d: rejecting message ", instance->host_no); - scsi_print_msg(extended_msg); + spi_print_msg(extended_msg); printk("\n"); } else if (tmp != EXTENDED_MESSAGE) scmd_printk(KERN_INFO, cmd, @@ -2560,7 +2561,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) { if (!(msg[0] & 0x80)) { printk(KERN_ERR "scsi%d : expecting IDENTIFY message, got ", instance->host_no); - scsi_print_msg(msg); + spi_print_msg(msg); abort = 1; } else { /* Accept message by clearing ACK */ diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index 9df23b654ce..cb2ee25f213 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c @@ -259,6 +259,7 @@ #include "scsi.h" #include #include +#include #include "aha152x.h" @@ -1845,7 +1846,7 @@ static void msgi_run(struct Scsi_Host *shpnt) #if defined(AHA152X_DEBUG) if (HOSTDATA(shpnt)->debug & debug_msgi) { printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0)); - scsi_print_msg(&MSGI(0)); + spi_print_msg(&MSGI(0)); printk("\n"); } #endif @@ -1933,7 +1934,7 @@ static void msgi_run(struct Scsi_Host *shpnt) break; printk(INFO_LEAD, CMDINFO(CURRENT_SC)); - scsi_print_msg(&MSGI(0)); + spi_print_msg(&MSGI(0)); printk("\n"); ticks = (MSGI(3) * 4 + 49) / 50; @@ -2031,7 +2032,7 @@ static void msgo_init(struct Scsi_Host *shpnt) int i; printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC)); - for (i=0; i #include +#include #include "acornscsi.h" #include "msgqueue.h" #include "scsi.h" @@ -1370,7 +1371,7 @@ void acornscsi_sendmessage(AS_Host *host) host->scsi.last_message = msg->msg[0]; #if (DEBUG & DEBUG_MESSAGES) - scsi_print_msg(msg->msg); + spi_print_msg(msg->msg); #endif break; @@ -1392,7 +1393,7 @@ void acornscsi_sendmessage(AS_Host *host) while ((msg = msgqueue_getmsg(&host->scsi.msgs, msgnr++)) != NULL) { unsigned int i; #if (DEBUG & DEBUG_MESSAGES) - scsi_print_msg(msg); + spi_print_msg(msg); #endif i = 0; if (acornscsi_write_pio(host, msg->msg, &i, msg->length, 1000000)) @@ -1488,7 +1489,7 @@ void acornscsi_message(AS_Host *host) #if (DEBUG & DEBUG_MESSAGES) printk("scsi%d.%c: message in: ", host->host->host_no, acornscsi_target(host)); - scsi_print_msg(message); + spi_print_msg(message); printk("\n"); #endif diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c index 2ae31ceb32a..57295bcea3e 100644 --- a/drivers/scsi/atari_NCR5380.c +++ b/drivers/scsi/atari_NCR5380.c @@ -74,6 +74,7 @@ * the high level code. */ #include +#include #if (NDEBUG & NDEBUG_LISTS) #define LIST(x,y) \ @@ -2355,7 +2356,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) * 3..length+1 arguments * * Start the extended message buffer with the EXTENDED_MESSAGE - * byte, since scsi_print_msg() wants the whole thing. + * byte, since spi_print_msg() wants the whole thing. */ extended_msg[0] = EXTENDED_MESSAGE; /* Accept first byte by clearing ACK */ @@ -2408,7 +2409,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) default: if (!tmp) { printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO); - scsi_print_msg (extended_msg); + spi_print_msg(extended_msg); printk("\n"); } else if (tmp != EXTENDED_MESSAGE) printk(KERN_DEBUG "scsi%d: rejecting unknown " @@ -2541,7 +2542,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) if (!(msg[0] & 0x80)) { printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO); - scsi_print_msg(msg); + spi_print_msg(msg); do_abort(instance); return; } diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 00a73fc23fc..59fb69ba790 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -1072,7 +1072,7 @@ static const char * const extended_msgs[] = { #define NO_EXTENDED_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) -int scsi_print_msg (const unsigned char *msg) +int spi_print_msg(const unsigned char *msg) { int len = 0, i; if (msg[0] == EXTENDED_MESSAGE) { @@ -1125,11 +1125,11 @@ int scsi_print_msg (const unsigned char *msg) printk("reserved"); return len; } -EXPORT_SYMBOL(scsi_print_msg); +EXPORT_SYMBOL(spi_print_msg); #else /* ifndef CONFIG_SCSI_CONSTANTS */ -int scsi_print_msg (const unsigned char *msg) +int spi_print_msg(const unsigned char *msg) { int len = 0, i; @@ -1153,7 +1153,7 @@ int scsi_print_msg (const unsigned char *msg) printk("%02x ", msg[0]); return len; } -EXPORT_SYMBOL(scsi_print_msg); +EXPORT_SYMBOL(spi_print_msg); #endif /* ! CONFIG_SCSI_CONSTANTS */ #define SETUP_ATTRIBUTE(field) \ diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c index c041bfd56e1..25cced91c8a 100644 --- a/drivers/scsi/sun3_NCR5380.c +++ b/drivers/scsi/sun3_NCR5380.c @@ -70,6 +70,7 @@ * */ #include +#include /* * Further development / testing that should be done : @@ -2378,7 +2379,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) * 3..length+1 arguments * * Start the extended message buffer with the EXTENDED_MESSAGE - * byte, since scsi_print_msg() wants the whole thing. + * byte, since spi_print_msg() wants the whole thing. */ extended_msg[0] = EXTENDED_MESSAGE; /* Accept first byte by clearing ACK */ @@ -2431,7 +2432,7 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance) default: if (!tmp) { printk(KERN_DEBUG "scsi%d: rejecting message ", HOSTNO); - scsi_print_msg (extended_msg); + spi_print_msg(extended_msg); printk("\n"); } else if (tmp != EXTENDED_MESSAGE) printk(KERN_DEBUG "scsi%d: rejecting unknown " @@ -2566,7 +2567,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance) if (!(msg[0] & 0x80)) { printk(KERN_DEBUG "scsi%d: expecting IDENTIFY message, got ", HOSTNO); - scsi_print_msg(msg); + spi_print_msg(msg); do_abort(instance); return; } diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 1010e716162..8260f040d39 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -75,7 +75,7 @@ static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) { sym_print_addr(cp->cmd, "%s: ", label); - scsi_print_msg(msg); + spi_print_msg(msg); printf("\n"); } @@ -84,7 +84,7 @@ static void sym_print_nego_msg(struct sym_hcb *np, int target, char *label, u_ch struct sym_tcb *tp = &np->target[target]; dev_info(&tp->starget->dev, "%s: ", label); - scsi_print_msg(msg); + spi_print_msg(msg); printf("\n"); } -- cgit v1.2.3 From 479721538957d514df6dcb29f66e5edd26393bb1 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 15 Dec 2005 16:22:01 -0500 Subject: [SCSI] Fix printing of two-byte messages A missing comma meant that "Ordered Queue Tag" and "Ignore Wide Residue" were being concatenated together. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 59fb69ba790..8cc5dffc04b 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -1060,7 +1060,7 @@ static const char * const one_byte_msgs[] = { #define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs) / sizeof (const char *)) static const char * const two_byte_msgs[] = { -/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag" +/* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag", /* 0x23 */ "Ignore Wide Residue" }; #define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) -- cgit v1.2.3 From b32aaffcdc694650d299a59501c5b3e267fca343 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 15 Dec 2005 16:22:01 -0500 Subject: [SCSI] Use ARRAY_SIZE in spi_print_msg Replace the custom NO_*_MSGS definitions with uses of ARRAY_SIZE. This fixes a bug in the definition of NO_EXTENDED_MSGS. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 8cc5dffc04b..380e1671eb1 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -1057,19 +1057,16 @@ static const char * const one_byte_msgs[] = { /* 0x0c */ "Bus device reset", "Abort Tag", "Clear Queue", /* 0x0f */ "Initiate Recovery", "Release Recovery" }; -#define NO_ONE_BYTE_MSGS (sizeof(one_byte_msgs) / sizeof (const char *)) static const char * const two_byte_msgs[] = { /* 0x20 */ "Simple Queue Tag", "Head of Queue Tag", "Ordered Queue Tag", /* 0x23 */ "Ignore Wide Residue" }; -#define NO_TWO_BYTE_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) static const char * const extended_msgs[] = { /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", /* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" }; -#define NO_EXTENDED_MSGS (sizeof(two_byte_msgs) / sizeof (const char *)) int spi_print_msg(const unsigned char *msg) @@ -1077,7 +1074,7 @@ int spi_print_msg(const unsigned char *msg) int len = 0, i; if (msg[0] == EXTENDED_MESSAGE) { len = 3 + msg[1]; - if (msg[2] < NO_EXTENDED_MSGS) + if (msg[2] < ARRAY_SIZE(extended_msgs)) printk ("%s ", extended_msgs[msg[2]]); else printk ("Extended Message, reserved code (0x%02x) ", @@ -1107,14 +1104,14 @@ int spi_print_msg(const unsigned char *msg) len = 1; /* Normal One byte */ } else if (msg[0] < 0x1f) { - if (msg[0] < NO_ONE_BYTE_MSGS) + if (msg[0] < ARRAY_SIZE(one_byte_msgs)) printk(one_byte_msgs[msg[0]]); else printk("reserved (%02x) ", msg[0]); len = 1; /* Two byte */ } else if (msg[0] <= 0x2f) { - if ((msg[0] - 0x20) < NO_TWO_BYTE_MSGS) + if ((msg[0] - 0x20) < ARRAY_SIZE(two_byte_msgs)) printk("%s %02x ", two_byte_msgs[msg[0] - 0x20], msg[1]); else -- cgit v1.2.3 From ef72582e7a02e1069c6e6bf5eecf6f388b1467c6 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Thu, 15 Dec 2005 16:22:01 -0500 Subject: [SCSI] Add PPR support to spi_print_msg Introduce a new helper, print_nego() to handle SDTR/WDTR/PPR. Split out the guts of show_spi_transport_period_helper() into period_to_str() and use it in print_nego to get the period factor conversion right. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 380e1671eb1..46da6fe10ad 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -379,9 +379,7 @@ static CLASS_DEVICE_ATTR(revalidate, S_IWUSR, NULL, store_spi_revalidate); /* Translate the period into ns according to the current spec * for SDTR/PPR messages */ -static ssize_t -show_spi_transport_period_helper(struct class_device *cdev, char *buf, - int period) +static int period_to_str(char *buf, int period) { int len, picosec; @@ -399,6 +397,14 @@ show_spi_transport_period_helper(struct class_device *cdev, char *buf, len = sprint_frac(buf, picosec, 1000); } + return len; +} + +static ssize_t +show_spi_transport_period_helper(struct class_device *cdev, char *buf, + int period) +{ + int len = period_to_str(buf, period); buf[len++] = '\n'; buf[len] = '\0'; return len; @@ -1065,9 +1071,23 @@ static const char * const two_byte_msgs[] = { static const char * const extended_msgs[] = { /* 0x00 */ "Modify Data Pointer", "Synchronous Data Transfer Request", -/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request" +/* 0x02 */ "SCSI-I Extended Identify", "Wide Data Transfer Request", +/* 0x04 */ "Parallel Protocol Request" }; +void print_nego(const unsigned char *msg, int per, int off, int width) +{ + if (per) { + char buf[20]; + period_to_str(buf, msg[per]); + printk("period = %s ns ", buf); + } + + if (off) + printk("offset = %d ", msg[off]); + if (width) + printk("width = %d ", 8 << msg[width]); +} int spi_print_msg(const unsigned char *msg) { @@ -1085,11 +1105,13 @@ int spi_print_msg(const unsigned char *msg) (msg[4] << 16) | (msg[5] << 8) | msg[6]); break; case EXTENDED_SDTR: - printk("period = %d ns, offset = %d", - (int) msg[3] * 4, (int) msg[4]); + print_nego(msg, 3, 4, 0); break; case EXTENDED_WDTR: - printk("width = 2^%d bytes", msg[3]); + print_nego(msg, 0, 0, 3); + break; + case EXTENDED_PPR: + print_nego(msg, 3, 5, 6); break; default: for (i = 2; i < len; ++i) -- cgit v1.2.3 From 8f23d475581adac949315e3339421e12554932c9 Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Tue, 29 Nov 2005 16:24:52 -0600 Subject: [SCSI] 53c700: update endian processing macros This update now allows this driver to be used on big endian bus machines that aren't parisc. To do that, the driver must set a CONFIG_53C700_BE_BUS in Kconfig to compile the right macro versions. Signed-off-by: James Bottomley --- drivers/scsi/53c700.h | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h index 362d78483d0..a8c83bb0363 100644 --- a/drivers/scsi/53c700.h +++ b/drivers/scsi/53c700.h @@ -238,21 +238,23 @@ struct NCR_700_Host_Parameters { #ifdef CONFIG_53C700_LE_ON_BE #define bE (hostdata->force_le_on_be ? 0 : 3) #define bSWAP (hostdata->force_le_on_be) -/* This is terrible, but there's no raw version of ioread32. That means - * that on a be board we swap twice (once in ioread32 and once again to - * get the value correct) */ -#define bS_to_io(x) ((hostdata->force_le_on_be) ? (x) : cpu_to_le32(x)) +#define bEBus (!hostdata->force_le_on_be) #elif defined(__BIG_ENDIAN) #define bE 3 #define bSWAP 0 -#define bS_to_io(x) (x) #elif defined(__LITTLE_ENDIAN) #define bE 0 #define bSWAP 0 -#define bS_to_io(x) (x) #else #error "__BIG_ENDIAN or __LITTLE_ENDIAN must be defined, did you include byteorder.h?" #endif +#ifndef bEBus +#ifdef CONFIG_53C700_BE_BUS +#define bEBus 1 +#else +#define bEBus 0 +#endif +#endif #define bS_to_cpu(x) (bSWAP ? le32_to_cpu(x) : (x)) #define bS_to_host(x) (bSWAP ? cpu_to_le32(x) : (x)) @@ -466,14 +468,15 @@ NCR_700_readl(struct Scsi_Host *host, __u32 reg) { const struct NCR_700_Host_Parameters *hostdata = (struct NCR_700_Host_Parameters *)host->hostdata[0]; - __u32 value = ioread32(hostdata->base + reg); + __u32 value = bEBus ? ioread32be(hostdata->base + reg) : + ioread32(hostdata->base + reg); #if 1 /* sanity check the register */ if((reg & 0x3) != 0) BUG(); #endif - return bS_to_io(value); + return value; } static inline void @@ -497,7 +500,8 @@ NCR_700_writel(__u32 value, struct Scsi_Host *host, __u32 reg) BUG(); #endif - iowrite32(bS_to_io(value), hostdata->base + reg); + bEBus ? iowrite32be(value, hostdata->base + reg): + iowrite32(value, hostdata->base + reg); } #endif -- cgit v1.2.3 From cd453c6353ea30171d966fd1dd87c37b05bccee1 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Fri, 16 Dec 2005 12:50:53 -0500 Subject: [SCSI] Use spi_print_msg in ncr53c8xx driver The ncr53c8xx driver had its own loop to print scsi messages. Use the SPI one instead. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/ncr53c8xx.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 243470936fa..8e1c77c81f6 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -2971,21 +2971,10 @@ struct host_data { static void ncr_print_msg(struct ccb *cp, char *label, u_char *msg) { - int i; PRINT_ADDR(cp->cmd, "%s: ", label); - printk ("%x",*msg); - if (*msg == M_EXTENDED) { - for (i = 1; i < 8; i++) { - if (i - 1 > msg[1]) - break; - printk ("-%x",msg[i]); - } - } else if ((*msg & 0xf0) == 0x20) { - printk ("-%x",msg[1]); - } - - printk(".\n"); + spi_print_msg(msg); + printk("\n"); } /*========================================================== -- cgit v1.2.3 From 19c65091c133a98b20d867c94b1b1380a79e4b81 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Fri, 16 Dec 2005 12:50:53 -0500 Subject: [SCSI] Merge sym53c8xx_comm.h and sym53c8xx_defs.h into ncr driver When the sym1 driver was in the tree, it used to share various parts of its infrastructure with the ncr driver. Now it's gone, these files are just an annoyance, so merge sym53c8xx_comm.h into ncr53c8xx.c and merge sym53c8xx_defs.h into ncr53c8xx.h. Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/ncr53c8xx.c | 734 ++++++++++++++++++++++- drivers/scsi/ncr53c8xx.h | 1263 ++++++++++++++++++++++++++++++++++++++- drivers/scsi/sym53c8xx_comm.h | 792 ------------------------- drivers/scsi/sym53c8xx_defs.h | 1320 ----------------------------------------- 4 files changed, 1995 insertions(+), 2114 deletions(-) delete mode 100644 drivers/scsi/sym53c8xx_comm.h delete mode 100644 drivers/scsi/sym53c8xx_defs.h (limited to 'drivers/scsi') diff --git a/drivers/scsi/ncr53c8xx.c b/drivers/scsi/ncr53c8xx.c index 8e1c77c81f6..32350707b94 100644 --- a/drivers/scsi/ncr53c8xx.c +++ b/drivers/scsi/ncr53c8xx.c @@ -131,7 +131,739 @@ #define NAME53C "ncr53c" #define NAME53C8XX "ncr53c8xx" -#include "sym53c8xx_comm.h" + +/*========================================================== +** +** Debugging tags +** +**========================================================== +*/ + +#define DEBUG_ALLOC (0x0001) +#define DEBUG_PHASE (0x0002) +#define DEBUG_QUEUE (0x0008) +#define DEBUG_RESULT (0x0010) +#define DEBUG_POINTER (0x0020) +#define DEBUG_SCRIPT (0x0040) +#define DEBUG_TINY (0x0080) +#define DEBUG_TIMING (0x0100) +#define DEBUG_NEGO (0x0200) +#define DEBUG_TAGS (0x0400) +#define DEBUG_SCATTER (0x0800) +#define DEBUG_IC (0x1000) + +/* +** Enable/Disable debug messages. +** Can be changed at runtime too. +*/ + +#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT +static int ncr_debug = SCSI_NCR_DEBUG_FLAGS; + #define DEBUG_FLAGS ncr_debug +#else + #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS +#endif + +static inline struct list_head *ncr_list_pop(struct list_head *head) +{ + if (!list_empty(head)) { + struct list_head *elem = head->next; + + list_del(elem); + return elem; + } + + return NULL; +} + +/*========================================================== +** +** Simple power of two buddy-like allocator. +** +** This simple code is not intended to be fast, but to +** provide power of 2 aligned memory allocations. +** Since the SCRIPTS processor only supplies 8 bit +** arithmetic, this allocator allows simple and fast +** address calculations from the SCRIPTS code. +** In addition, cache line alignment is guaranteed for +** power of 2 cache line size. +** Enhanced in linux-2.3.44 to provide a memory pool +** per pcidev to support dynamic dma mapping. (I would +** have preferred a real bus astraction, btw). +** +**========================================================== +*/ + +#define MEMO_SHIFT 4 /* 16 bytes minimum memory chunk */ +#if PAGE_SIZE >= 8192 +#define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */ +#else +#define MEMO_PAGE_ORDER 1 /* 2 PAGES maximum */ +#endif +#define MEMO_FREE_UNUSED /* Free unused pages immediately */ +#define MEMO_WARN 1 +#define MEMO_GFP_FLAGS GFP_ATOMIC +#define MEMO_CLUSTER_SHIFT (PAGE_SHIFT+MEMO_PAGE_ORDER) +#define MEMO_CLUSTER_SIZE (1UL << MEMO_CLUSTER_SHIFT) +#define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1) + +typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */ +typedef struct device *m_bush_t; /* Something that addresses DMAable */ + +typedef struct m_link { /* Link between free memory chunks */ + struct m_link *next; +} m_link_s; + +typedef struct m_vtob { /* Virtual to Bus address translation */ + struct m_vtob *next; + m_addr_t vaddr; + m_addr_t baddr; +} m_vtob_s; +#define VTOB_HASH_SHIFT 5 +#define VTOB_HASH_SIZE (1UL << VTOB_HASH_SHIFT) +#define VTOB_HASH_MASK (VTOB_HASH_SIZE-1) +#define VTOB_HASH_CODE(m) \ + ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK) + +typedef struct m_pool { /* Memory pool of a given kind */ + m_bush_t bush; + m_addr_t (*getp)(struct m_pool *); + void (*freep)(struct m_pool *, m_addr_t); + int nump; + m_vtob_s *(vtob[VTOB_HASH_SIZE]); + struct m_pool *next; + struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1]; +} m_pool_s; + +static void *___m_alloc(m_pool_s *mp, int size) +{ + int i = 0; + int s = (1 << MEMO_SHIFT); + int j; + m_addr_t a; + m_link_s *h = mp->h; + + if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) + return NULL; + + while (size > s) { + s <<= 1; + ++i; + } + + j = i; + while (!h[j].next) { + if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { + h[j].next = (m_link_s *)mp->getp(mp); + if (h[j].next) + h[j].next->next = NULL; + break; + } + ++j; + s <<= 1; + } + a = (m_addr_t) h[j].next; + if (a) { + h[j].next = h[j].next->next; + while (j > i) { + j -= 1; + s >>= 1; + h[j].next = (m_link_s *) (a+s); + h[j].next->next = NULL; + } + } +#ifdef DEBUG + printk("___m_alloc(%d) = %p\n", size, (void *) a); +#endif + return (void *) a; +} + +static void ___m_free(m_pool_s *mp, void *ptr, int size) +{ + int i = 0; + int s = (1 << MEMO_SHIFT); + m_link_s *q; + m_addr_t a, b; + m_link_s *h = mp->h; + +#ifdef DEBUG + printk("___m_free(%p, %d)\n", ptr, size); +#endif + + if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) + return; + + while (size > s) { + s <<= 1; + ++i; + } + + a = (m_addr_t) ptr; + + while (1) { +#ifdef MEMO_FREE_UNUSED + if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { + mp->freep(mp, a); + break; + } +#endif + b = a ^ s; + q = &h[i]; + while (q->next && q->next != (m_link_s *) b) { + q = q->next; + } + if (!q->next) { + ((m_link_s *) a)->next = h[i].next; + h[i].next = (m_link_s *) a; + break; + } + q->next = q->next->next; + a = a & b; + s <<= 1; + ++i; + } +} + +static DEFINE_SPINLOCK(ncr53c8xx_lock); + +static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags) +{ + void *p; + + p = ___m_alloc(mp, size); + + if (DEBUG_FLAGS & DEBUG_ALLOC) + printk ("new %-10s[%4d] @%p.\n", name, size, p); + + if (p) + memset(p, 0, size); + else if (uflags & MEMO_WARN) + printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size); + + return p; +} + +#define __m_calloc(mp, s, n) __m_calloc2(mp, s, n, MEMO_WARN) + +static void __m_free(m_pool_s *mp, void *ptr, int size, char *name) +{ + if (DEBUG_FLAGS & DEBUG_ALLOC) + printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr); + + ___m_free(mp, ptr, size); + +} + +/* + * With pci bus iommu support, we use a default pool of unmapped memory + * for memory we donnot need to DMA from/to and one pool per pcidev for + * memory accessed by the PCI chip. `mp0' is the default not DMAable pool. + */ + +static m_addr_t ___mp0_getp(m_pool_s *mp) +{ + m_addr_t m = __get_free_pages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER); + if (m) + ++mp->nump; + return m; +} + +static void ___mp0_freep(m_pool_s *mp, m_addr_t m) +{ + free_pages(m, MEMO_PAGE_ORDER); + --mp->nump; +} + +static m_pool_s mp0 = {NULL, ___mp0_getp, ___mp0_freep}; + +/* + * DMAable pools. + */ + +/* + * With pci bus iommu support, we maintain one pool per pcidev and a + * hashed reverse table for virtual to bus physical address translations. + */ +static m_addr_t ___dma_getp(m_pool_s *mp) +{ + m_addr_t vp; + m_vtob_s *vbp; + + vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB"); + if (vbp) { + dma_addr_t daddr; + vp = (m_addr_t) dma_alloc_coherent(mp->bush, + PAGE_SIZE<vaddr = vp; + vbp->baddr = daddr; + vbp->next = mp->vtob[hc]; + mp->vtob[hc] = vbp; + ++mp->nump; + return vp; + } + } + if (vbp) + __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); + return 0; +} + +static void ___dma_freep(m_pool_s *mp, m_addr_t m) +{ + m_vtob_s **vbpp, *vbp; + int hc = VTOB_HASH_CODE(m); + + vbpp = &mp->vtob[hc]; + while (*vbpp && (*vbpp)->vaddr != m) + vbpp = &(*vbpp)->next; + if (*vbpp) { + vbp = *vbpp; + *vbpp = (*vbpp)->next; + dma_free_coherent(mp->bush, PAGE_SIZE<vaddr, (dma_addr_t)vbp->baddr); + __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); + --mp->nump; + } +} + +static inline m_pool_s *___get_dma_pool(m_bush_t bush) +{ + m_pool_s *mp; + for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next); + return mp; +} + +static m_pool_s *___cre_dma_pool(m_bush_t bush) +{ + m_pool_s *mp; + mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL"); + if (mp) { + memset(mp, 0, sizeof(*mp)); + mp->bush = bush; + mp->getp = ___dma_getp; + mp->freep = ___dma_freep; + mp->next = mp0.next; + mp0.next = mp; + } + return mp; +} + +static void ___del_dma_pool(m_pool_s *p) +{ + struct m_pool **pp = &mp0.next; + + while (*pp && *pp != p) + pp = &(*pp)->next; + if (*pp) { + *pp = (*pp)->next; + __m_free(&mp0, p, sizeof(*p), "MPOOL"); + } +} + +static void *__m_calloc_dma(m_bush_t bush, int size, char *name) +{ + u_long flags; + struct m_pool *mp; + void *m = NULL; + + spin_lock_irqsave(&ncr53c8xx_lock, flags); + mp = ___get_dma_pool(bush); + if (!mp) + mp = ___cre_dma_pool(bush); + if (mp) + m = __m_calloc(mp, size, name); + if (mp && !mp->nump) + ___del_dma_pool(mp); + spin_unlock_irqrestore(&ncr53c8xx_lock, flags); + + return m; +} + +static void __m_free_dma(m_bush_t bush, void *m, int size, char *name) +{ + u_long flags; + struct m_pool *mp; + + spin_lock_irqsave(&ncr53c8xx_lock, flags); + mp = ___get_dma_pool(bush); + if (mp) + __m_free(mp, m, size, name); + if (mp && !mp->nump) + ___del_dma_pool(mp); + spin_unlock_irqrestore(&ncr53c8xx_lock, flags); +} + +static m_addr_t __vtobus(m_bush_t bush, void *m) +{ + u_long flags; + m_pool_s *mp; + int hc = VTOB_HASH_CODE(m); + m_vtob_s *vp = NULL; + m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK; + + spin_lock_irqsave(&ncr53c8xx_lock, flags); + mp = ___get_dma_pool(bush); + if (mp) { + vp = mp->vtob[hc]; + while (vp && (m_addr_t) vp->vaddr != a) + vp = vp->next; + } + spin_unlock_irqrestore(&ncr53c8xx_lock, flags); + return vp ? vp->baddr + (((m_addr_t) m) - a) : 0; +} + +#define _m_calloc_dma(np, s, n) __m_calloc_dma(np->dev, s, n) +#define _m_free_dma(np, p, s, n) __m_free_dma(np->dev, p, s, n) +#define m_calloc_dma(s, n) _m_calloc_dma(np, s, n) +#define m_free_dma(p, s, n) _m_free_dma(np, p, s, n) +#define _vtobus(np, p) __vtobus(np->dev, p) +#define vtobus(p) _vtobus(np, p) + +/* + * Deal with DMA mapping/unmapping. + */ + +/* To keep track of the dma mapping (sg/single) that has been set */ +#define __data_mapped SCp.phase +#define __data_mapping SCp.have_data_in + +static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd) +{ + switch(cmd->__data_mapped) { + case 2: + dma_unmap_sg(dev, cmd->buffer, cmd->use_sg, + cmd->sc_data_direction); + break; + case 1: + dma_unmap_single(dev, cmd->__data_mapping, + cmd->request_bufflen, + cmd->sc_data_direction); + break; + } + cmd->__data_mapped = 0; +} + +static u_long __map_scsi_single_data(struct device *dev, struct scsi_cmnd *cmd) +{ + dma_addr_t mapping; + + if (cmd->request_bufflen == 0) + return 0; + + mapping = dma_map_single(dev, cmd->request_buffer, + cmd->request_bufflen, + cmd->sc_data_direction); + cmd->__data_mapped = 1; + cmd->__data_mapping = mapping; + + return mapping; +} + +static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd) +{ + int use_sg; + + if (cmd->use_sg == 0) + return 0; + + use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, + cmd->sc_data_direction); + cmd->__data_mapped = 2; + cmd->__data_mapping = use_sg; + + return use_sg; +} + +#define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd) +#define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->dev, cmd) +#define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd) + +/*========================================================== +** +** Driver setup. +** +** This structure is initialized from linux config +** options. It can be overridden at boot-up by the boot +** command line. +** +**========================================================== +*/ +static struct ncr_driver_setup + driver_setup = SCSI_NCR_DRIVER_SETUP; + +#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT +static struct ncr_driver_setup + driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP; +#endif + +#define initverbose (driver_setup.verbose) +#define bootverbose (np->verbose) + + +/*=================================================================== +** +** Driver setup from the boot command line +** +**=================================================================== +*/ + +#ifdef MODULE +#define ARG_SEP ' ' +#else +#define ARG_SEP ',' +#endif + +#define OPT_TAGS 1 +#define OPT_MASTER_PARITY 2 +#define OPT_SCSI_PARITY 3 +#define OPT_DISCONNECTION 4 +#define OPT_SPECIAL_FEATURES 5 +#define OPT_UNUSED_1 6 +#define OPT_FORCE_SYNC_NEGO 7 +#define OPT_REVERSE_PROBE 8 +#define OPT_DEFAULT_SYNC 9 +#define OPT_VERBOSE 10 +#define OPT_DEBUG 11 +#define OPT_BURST_MAX 12 +#define OPT_LED_PIN 13 +#define OPT_MAX_WIDE 14 +#define OPT_SETTLE_DELAY 15 +#define OPT_DIFF_SUPPORT 16 +#define OPT_IRQM 17 +#define OPT_PCI_FIX_UP 18 +#define OPT_BUS_CHECK 19 +#define OPT_OPTIMIZE 20 +#define OPT_RECOVERY 21 +#define OPT_SAFE_SETUP 22 +#define OPT_USE_NVRAM 23 +#define OPT_EXCLUDE 24 +#define OPT_HOST_ID 25 + +#ifdef SCSI_NCR_IARB_SUPPORT +#define OPT_IARB 26 +#endif + +static char setup_token[] __initdata = + "tags:" "mpar:" + "spar:" "disc:" + "specf:" "ultra:" + "fsn:" "revprob:" + "sync:" "verb:" + "debug:" "burst:" + "led:" "wide:" + "settle:" "diff:" + "irqm:" "pcifix:" + "buschk:" "optim:" + "recovery:" + "safe:" "nvram:" + "excl:" "hostid:" +#ifdef SCSI_NCR_IARB_SUPPORT + "iarb:" +#endif + ; /* DONNOT REMOVE THIS ';' */ + +#ifdef MODULE +#define ARG_SEP ' ' +#else +#define ARG_SEP ',' +#endif + +static int __init get_setup_token(char *p) +{ + char *cur = setup_token; + char *pc; + int i = 0; + + while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { + ++pc; + ++i; + if (!strncmp(p, cur, pc - cur)) + return i; + cur = pc; + } + return 0; +} + + +static int __init sym53c8xx__setup(char *str) +{ +#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT + char *cur = str; + char *pc, *pv; + int i, val, c; + int xi = 0; + + while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { + char *pe; + + val = 0; + pv = pc; + c = *++pv; + + if (c == 'n') + val = 0; + else if (c == 'y') + val = 1; + else + val = (int) simple_strtoul(pv, &pe, 0); + + switch (get_setup_token(cur)) { + case OPT_TAGS: + driver_setup.default_tags = val; + if (pe && *pe == '/') { + i = 0; + while (*pe && *pe != ARG_SEP && + i < sizeof(driver_setup.tag_ctrl)-1) { + driver_setup.tag_ctrl[i++] = *pe++; + } + driver_setup.tag_ctrl[i] = '\0'; + } + break; + case OPT_MASTER_PARITY: + driver_setup.master_parity = val; + break; + case OPT_SCSI_PARITY: + driver_setup.scsi_parity = val; + break; + case OPT_DISCONNECTION: + driver_setup.disconnection = val; + break; + case OPT_SPECIAL_FEATURES: + driver_setup.special_features = val; + break; + case OPT_FORCE_SYNC_NEGO: + driver_setup.force_sync_nego = val; + break; + case OPT_REVERSE_PROBE: + driver_setup.reverse_probe = val; + break; + case OPT_DEFAULT_SYNC: + driver_setup.default_sync = val; + break; + case OPT_VERBOSE: + driver_setup.verbose = val; + break; + case OPT_DEBUG: + driver_setup.debug = val; + break; + case OPT_BURST_MAX: + driver_setup.burst_max = val; + break; + case OPT_LED_PIN: + driver_setup.led_pin = val; + break; + case OPT_MAX_WIDE: + driver_setup.max_wide = val? 1:0; + break; + case OPT_SETTLE_DELAY: + driver_setup.settle_delay = val; + break; + case OPT_DIFF_SUPPORT: + driver_setup.diff_support = val; + break; + case OPT_IRQM: + driver_setup.irqm = val; + break; + case OPT_PCI_FIX_UP: + driver_setup.pci_fix_up = val; + break; + case OPT_BUS_CHECK: + driver_setup.bus_check = val; + break; + case OPT_OPTIMIZE: + driver_setup.optimize = val; + break; + case OPT_RECOVERY: + driver_setup.recovery = val; + break; + case OPT_USE_NVRAM: + driver_setup.use_nvram = val; + break; + case OPT_SAFE_SETUP: + memcpy(&driver_setup, &driver_safe_setup, + sizeof(driver_setup)); + break; + case OPT_EXCLUDE: + if (xi < SCSI_NCR_MAX_EXCLUDES) + driver_setup.excludes[xi++] = val; + break; + case OPT_HOST_ID: + driver_setup.host_id = val; + break; +#ifdef SCSI_NCR_IARB_SUPPORT + case OPT_IARB: + driver_setup.iarb = val; + break; +#endif + default: + printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur); + break; + } + + if ((cur = strchr(cur, ARG_SEP)) != NULL) + ++cur; + } +#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */ + return 1; +} + +/*=================================================================== +** +** Get device queue depth from boot command line. +** +**=================================================================== +*/ +#define DEF_DEPTH (driver_setup.default_tags) +#define ALL_TARGETS -2 +#define NO_TARGET -1 +#define ALL_LUNS -2 +#define NO_LUN -1 + +static int device_queue_depth(int unit, int target, int lun) +{ + int c, h, t, u, v; + char *p = driver_setup.tag_ctrl; + char *ep; + + h = -1; + t = NO_TARGET; + u = NO_LUN; + while ((c = *p++) != 0) { + v = simple_strtoul(p, &ep, 0); + switch(c) { + case '/': + ++h; + t = ALL_TARGETS; + u = ALL_LUNS; + break; + case 't': + if (t != target) + t = (target == v) ? v : NO_TARGET; + u = ALL_LUNS; + break; + case 'u': + if (u != lun) + u = (lun == v) ? v : NO_LUN; + break; + case 'q': + if (h == unit && + (t == ALL_TARGETS || t == target) && + (u == ALL_LUNS || u == lun)) + return v; + break; + case '-': + t = ALL_TARGETS; + u = ALL_LUNS; + break; + default: + break; + } + p = ep; + } + return DEF_DEPTH; +} /*========================================================== diff --git a/drivers/scsi/ncr53c8xx.h b/drivers/scsi/ncr53c8xx.h index 05c7b83cef0..6a7bef2e611 100644 --- a/drivers/scsi/ncr53c8xx.h +++ b/drivers/scsi/ncr53c8xx.h @@ -2,6 +2,7 @@ ** Device driver for the PCI-SCSI NCR538XX controller family. ** ** Copyright (C) 1994 Wolfgang Stanglmeier +** Copyright (C) 1998-2001 Gerard Roudier ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by @@ -36,15 +37,1275 @@ ** And has been ported to NetBSD by ** Charles M. Hannum ** +** NVRAM detection and reading. +** Copyright (C) 1997 Richard Waltham +** +** Added support for MIPS big endian systems. +** Carsten Langgaard, carstenl@mips.com +** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. +** +** Added support for HP PARISC big endian systems. +** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. +** ******************************************************************************* */ #ifndef NCR53C8XX_H #define NCR53C8XX_H +#include #include -#include "sym53c8xx_defs.h" +/* +** If you want a driver as small as possible, do not define the +** following options. +*/ +#define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT +#define SCSI_NCR_DEBUG_INFO_SUPPORT + +/* +** To disable integrity checking, do not define the +** following option. +*/ +#ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK +# define SCSI_NCR_ENABLE_INTEGRITY_CHECK +#endif + +/* --------------------------------------------------------------------- +** Take into account kernel configured parameters. +** Most of these options can be overridden at startup by a command line. +** --------------------------------------------------------------------- +*/ + +/* + * For Ultra2 and Ultra3 SCSI support option, use special features. + * + * Value (default) means: + * bit 0 : all features enabled, except: + * bit 1 : PCI Write And Invalidate. + * bit 2 : Data Phase Mismatch handling from SCRIPTS. + * + * Use boot options ncr53c8xx=specf:1 if you want all chip features to be + * enabled by the driver. + */ +#define SCSI_NCR_SETUP_SPECIAL_FEATURES (3) + +#define SCSI_NCR_MAX_SYNC (80) + +/* + * Allow tags from 2 to 256, default 8 + */ +#ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS +#if CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2 +#define SCSI_NCR_MAX_TAGS (2) +#elif CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256 +#define SCSI_NCR_MAX_TAGS (256) +#else +#define SCSI_NCR_MAX_TAGS CONFIG_SCSI_NCR53C8XX_MAX_TAGS +#endif +#else +#define SCSI_NCR_MAX_TAGS (8) +#endif + +/* + * Allow tagged command queuing support if configured with default number + * of tags set to max (see above). + */ +#ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS +#define SCSI_NCR_SETUP_DEFAULT_TAGS CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS +#elif defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE +#define SCSI_NCR_SETUP_DEFAULT_TAGS SCSI_NCR_MAX_TAGS +#else +#define SCSI_NCR_SETUP_DEFAULT_TAGS (0) +#endif + +/* + * Immediate arbitration + */ +#if defined(CONFIG_SCSI_NCR53C8XX_IARB) +#define SCSI_NCR_IARB_SUPPORT +#endif + +/* + * Sync transfer frequency at startup. + * Allow from 5Mhz to 80Mhz default 20 Mhz. + */ +#ifndef CONFIG_SCSI_NCR53C8XX_SYNC +#define CONFIG_SCSI_NCR53C8XX_SYNC (20) +#elif CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC +#undef CONFIG_SCSI_NCR53C8XX_SYNC +#define CONFIG_SCSI_NCR53C8XX_SYNC SCSI_NCR_MAX_SYNC +#endif + +#if CONFIG_SCSI_NCR53C8XX_SYNC == 0 +#define SCSI_NCR_SETUP_DEFAULT_SYNC (255) +#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 5 +#define SCSI_NCR_SETUP_DEFAULT_SYNC (50) +#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 20 +#define SCSI_NCR_SETUP_DEFAULT_SYNC (250/(CONFIG_SCSI_NCR53C8XX_SYNC)) +#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 33 +#define SCSI_NCR_SETUP_DEFAULT_SYNC (11) +#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 40 +#define SCSI_NCR_SETUP_DEFAULT_SYNC (10) +#else +#define SCSI_NCR_SETUP_DEFAULT_SYNC (9) +#endif + +/* + * Disallow disconnections at boot-up + */ +#ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT +#define SCSI_NCR_SETUP_DISCONNECTION (0) +#else +#define SCSI_NCR_SETUP_DISCONNECTION (1) +#endif + +/* + * Force synchronous negotiation for all targets + */ +#ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO +#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1) +#else +#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0) +#endif + +/* + * Disable master parity checking (flawed hardwares need that) + */ +#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK +#define SCSI_NCR_SETUP_MASTER_PARITY (0) +#else +#define SCSI_NCR_SETUP_MASTER_PARITY (1) +#endif + +/* + * Disable scsi parity checking (flawed devices may need that) + */ +#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK +#define SCSI_NCR_SETUP_SCSI_PARITY (0) +#else +#define SCSI_NCR_SETUP_SCSI_PARITY (1) +#endif + +/* + * Settle time after reset at boot-up + */ +#define SCSI_NCR_SETUP_SETTLE_TIME (2) + +/* +** Bridge quirks work-around option defaulted to 1. +*/ +#ifndef SCSI_NCR_PCIQ_WORK_AROUND_OPT +#define SCSI_NCR_PCIQ_WORK_AROUND_OPT 1 +#endif + +/* +** Work-around common bridge misbehaviour. +** +** - Do not flush posted writes in the opposite +** direction on read. +** - May reorder DMA writes to memory. +** +** This option should not affect performances +** significantly, so it is the default. +*/ +#if SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1 +#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM +#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES +#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS + +/* +** Same as option 1, but also deal with +** misconfigured interrupts. +** +** - Edge triggerred instead of level sensitive. +** - No interrupt line connected. +** - IRQ number misconfigured. +** +** If no interrupt is delivered, the driver will +** catch the interrupt conditions 10 times per +** second. No need to say that this option is +** not recommended. +*/ +#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2 +#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM +#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES +#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS +#define SCSI_NCR_PCIQ_BROKEN_INTR + +/* +** Some bridge designers decided to flush +** everything prior to deliver the interrupt. +** This option tries to deal with such a +** behaviour. +*/ +#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3 +#define SCSI_NCR_PCIQ_SYNC_ON_INTR +#endif + +/* +** Other parameters not configurable with "make config" +** Avoid to change these constants, unless you know what you are doing. +*/ + +#define SCSI_NCR_ALWAYS_SIMPLE_TAG +#define SCSI_NCR_MAX_SCATTER (127) +#define SCSI_NCR_MAX_TARGET (16) + +/* +** Compute some desirable value for CAN_QUEUE +** and CMD_PER_LUN. +** The driver will use lower values if these +** ones appear to be too large. +*/ +#define SCSI_NCR_CAN_QUEUE (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET) +#define SCSI_NCR_CMD_PER_LUN (SCSI_NCR_MAX_TAGS) + +#define SCSI_NCR_SG_TABLESIZE (SCSI_NCR_MAX_SCATTER) +#define SCSI_NCR_TIMER_INTERVAL (HZ) + +#if 1 /* defined CONFIG_SCSI_MULTI_LUN */ +#define SCSI_NCR_MAX_LUN (16) +#else +#define SCSI_NCR_MAX_LUN (1) +#endif + +/* + * IO functions definition for big/little endian CPU support. + * For now, the NCR is only supported in little endian addressing mode, + */ + +#ifdef __BIG_ENDIAN + +#define inw_l2b inw +#define inl_l2b inl +#define outw_b2l outw +#define outl_b2l outl + +#define readb_raw readb +#define writeb_raw writeb + +#if defined(SCSI_NCR_BIG_ENDIAN) +#define readw_l2b __raw_readw +#define readl_l2b __raw_readl +#define writew_b2l __raw_writew +#define writel_b2l __raw_writel +#define readw_raw __raw_readw +#define readl_raw __raw_readl +#define writew_raw __raw_writew +#define writel_raw __raw_writel +#else /* Other big-endian */ +#define readw_l2b readw +#define readl_l2b readl +#define writew_b2l writew +#define writel_b2l writel +#define readw_raw readw +#define readl_raw readl +#define writew_raw writew +#define writel_raw writel +#endif + +#else /* little endian */ + +#define inw_raw inw +#define inl_raw inl +#define outw_raw outw +#define outl_raw outl + +#define readb_raw readb +#define readw_raw readw +#define readl_raw readl +#define writeb_raw writeb +#define writew_raw writew +#define writel_raw writel + +#endif + +#if !defined(__hppa__) && !defined(__mips__) +#ifdef SCSI_NCR_BIG_ENDIAN +#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported" +#endif +#endif + +#define MEMORY_BARRIER() mb() + + +/* + * If the NCR uses big endian addressing mode over the + * PCI, actual io register addresses for byte and word + * accesses must be changed according to lane routing. + * Btw, ncr_offb() and ncr_offw() macros only apply to + * constants and so donnot generate bloated code. + */ + +#if defined(SCSI_NCR_BIG_ENDIAN) + +#define ncr_offb(o) (((o)&~3)+((~((o)&3))&3)) +#define ncr_offw(o) (((o)&~3)+((~((o)&3))&2)) + +#else + +#define ncr_offb(o) (o) +#define ncr_offw(o) (o) + +#endif + +/* + * If the CPU and the NCR use same endian-ness addressing, + * no byte reordering is needed for script patching. + * Macro cpu_to_scr() is to be used for script patching. + * Macro scr_to_cpu() is to be used for getting a DWORD + * from the script. + */ + +#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN) + +#define cpu_to_scr(dw) cpu_to_le32(dw) +#define scr_to_cpu(dw) le32_to_cpu(dw) + +#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN) + +#define cpu_to_scr(dw) cpu_to_be32(dw) +#define scr_to_cpu(dw) be32_to_cpu(dw) + +#else + +#define cpu_to_scr(dw) (dw) +#define scr_to_cpu(dw) (dw) + +#endif + +/* + * Access to the controller chip. + * + * If the CPU and the NCR use same endian-ness addressing, + * no byte reordering is needed for accessing chip io + * registers. Functions suffixed by '_raw' are assumed + * to access the chip over the PCI without doing byte + * reordering. Functions suffixed by '_l2b' are + * assumed to perform little-endian to big-endian byte + * reordering, those suffixed by '_b2l' blah, blah, + * blah, ... + */ + +/* + * MEMORY mapped IO input / output + */ + +#define INB_OFF(o) readb_raw((char __iomem *)np->reg + ncr_offb(o)) +#define OUTB_OFF(o, val) writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o)) + +#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN) + +#define INW_OFF(o) readw_l2b((char __iomem *)np->reg + ncr_offw(o)) +#define INL_OFF(o) readl_l2b((char __iomem *)np->reg + (o)) + +#define OUTW_OFF(o, val) writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o)) +#define OUTL_OFF(o, val) writel_b2l((val), (char __iomem *)np->reg + (o)) + +#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN) + +#define INW_OFF(o) readw_b2l((char __iomem *)np->reg + ncr_offw(o)) +#define INL_OFF(o) readl_b2l((char __iomem *)np->reg + (o)) + +#define OUTW_OFF(o, val) writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o)) +#define OUTL_OFF(o, val) writel_l2b((val), (char __iomem *)np->reg + (o)) + +#else + +#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS +/* Only 8 or 32 bit transfers allowed */ +#define INW_OFF(o) (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1)) +#else +#define INW_OFF(o) readw_raw((char __iomem *)np->reg + ncr_offw(o)) +#endif +#define INL_OFF(o) readl_raw((char __iomem *)np->reg + (o)) + +#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS +/* Only 8 or 32 bit transfers allowed */ +#define OUTW_OFF(o, val) do { writeb((char)((val) >> 8), (char __iomem *)np->reg + ncr_offw(o)); writeb((char)(val), (char __iomem *)np->reg + ncr_offw(o) + 1); } while (0) +#else +#define OUTW_OFF(o, val) writew_raw((val), (char __iomem *)np->reg + ncr_offw(o)) +#endif +#define OUTL_OFF(o, val) writel_raw((val), (char __iomem *)np->reg + (o)) + +#endif + +#define INB(r) INB_OFF (offsetof(struct ncr_reg,r)) +#define INW(r) INW_OFF (offsetof(struct ncr_reg,r)) +#define INL(r) INL_OFF (offsetof(struct ncr_reg,r)) + +#define OUTB(r, val) OUTB_OFF (offsetof(struct ncr_reg,r), (val)) +#define OUTW(r, val) OUTW_OFF (offsetof(struct ncr_reg,r), (val)) +#define OUTL(r, val) OUTL_OFF (offsetof(struct ncr_reg,r), (val)) + +/* + * Set bit field ON, OFF + */ + +#define OUTONB(r, m) OUTB(r, INB(r) | (m)) +#define OUTOFFB(r, m) OUTB(r, INB(r) & ~(m)) +#define OUTONW(r, m) OUTW(r, INW(r) | (m)) +#define OUTOFFW(r, m) OUTW(r, INW(r) & ~(m)) +#define OUTONL(r, m) OUTL(r, INL(r) | (m)) +#define OUTOFFL(r, m) OUTL(r, INL(r) & ~(m)) + +/* + * We normally want the chip to have a consistent view + * of driver internal data structures when we restart it. + * Thus these macros. + */ +#define OUTL_DSP(v) \ + do { \ + MEMORY_BARRIER(); \ + OUTL (nc_dsp, (v)); \ + } while (0) + +#define OUTONB_STD() \ + do { \ + MEMORY_BARRIER(); \ + OUTONB (nc_dcntl, (STD|NOCOM)); \ + } while (0) + + +/* +** NCR53C8XX devices features table. +*/ +struct ncr_chip { + unsigned short revision_id; + unsigned char burst_max; /* log-base-2 of max burst */ + unsigned char offset_max; + unsigned char nr_divisor; + unsigned int features; +#define FE_LED0 (1<<0) +#define FE_WIDE (1<<1) /* Wide data transfers */ +#define FE_ULTRA (1<<2) /* Ultra speed 20Mtrans/sec */ +#define FE_DBLR (1<<4) /* Clock doubler present */ +#define FE_QUAD (1<<5) /* Clock quadrupler present */ +#define FE_ERL (1<<6) /* Enable read line */ +#define FE_CLSE (1<<7) /* Cache line size enable */ +#define FE_WRIE (1<<8) /* Write & Invalidate enable */ +#define FE_ERMP (1<<9) /* Enable read multiple */ +#define FE_BOF (1<<10) /* Burst opcode fetch */ +#define FE_DFS (1<<11) /* DMA fifo size */ +#define FE_PFEN (1<<12) /* Prefetch enable */ +#define FE_LDSTR (1<<13) /* Load/Store supported */ +#define FE_RAM (1<<14) /* On chip RAM present */ +#define FE_VARCLK (1<<15) /* SCSI clock may vary */ +#define FE_RAM8K (1<<16) /* On chip RAM sized 8Kb */ +#define FE_64BIT (1<<17) /* Have a 64-bit PCI interface */ +#define FE_IO256 (1<<18) /* Requires full 256 bytes in PCI space */ +#define FE_NOPM (1<<19) /* Scripts handles phase mismatch */ +#define FE_LEDC (1<<20) /* Hardware control of LED */ +#define FE_DIFF (1<<21) /* Support Differential SCSI */ +#define FE_66MHZ (1<<23) /* 66MHz PCI Support */ +#define FE_DAC (1<<24) /* Support DAC cycles (64 bit addressing) */ +#define FE_ISTAT1 (1<<25) /* Have ISTAT1, MBOX0, MBOX1 registers */ +#define FE_DAC_IN_USE (1<<26) /* Platform does DAC cycles */ +#define FE_EHP (1<<27) /* 720: Even host parity */ +#define FE_MUX (1<<28) /* 720: Multiplexed bus */ +#define FE_EA (1<<29) /* 720: Enable Ack */ + +#define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP) +#define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80) +#define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM) +}; + + +/* +** Driver setup structure. +** +** This structure is initialized from linux config options. +** It can be overridden at boot-up by the boot command line. +*/ +#define SCSI_NCR_MAX_EXCLUDES 8 +struct ncr_driver_setup { + u8 master_parity; + u8 scsi_parity; + u8 disconnection; + u8 special_features; + u8 force_sync_nego; + u8 reverse_probe; + u8 pci_fix_up; + u8 use_nvram; + u8 verbose; + u8 default_tags; + u16 default_sync; + u16 debug; + u8 burst_max; + u8 led_pin; + u8 max_wide; + u8 settle_delay; + u8 diff_support; + u8 irqm; + u8 bus_check; + u8 optimize; + u8 recovery; + u8 host_id; + u16 iarb; + u32 excludes[SCSI_NCR_MAX_EXCLUDES]; + char tag_ctrl[100]; +}; + +/* +** Initial setup. +** Can be overriden at startup by a command line. +*/ +#define SCSI_NCR_DRIVER_SETUP \ +{ \ + SCSI_NCR_SETUP_MASTER_PARITY, \ + SCSI_NCR_SETUP_SCSI_PARITY, \ + SCSI_NCR_SETUP_DISCONNECTION, \ + SCSI_NCR_SETUP_SPECIAL_FEATURES, \ + SCSI_NCR_SETUP_FORCE_SYNC_NEGO, \ + 0, \ + 0, \ + 1, \ + 0, \ + SCSI_NCR_SETUP_DEFAULT_TAGS, \ + SCSI_NCR_SETUP_DEFAULT_SYNC, \ + 0x00, \ + 7, \ + 0, \ + 1, \ + SCSI_NCR_SETUP_SETTLE_TIME, \ + 0, \ + 0, \ + 1, \ + 0, \ + 0, \ + 255, \ + 0x00 \ +} + +/* +** Boot fail safe setup. +** Override initial setup from boot command line: +** ncr53c8xx=safe:y +*/ +#define SCSI_NCR_DRIVER_SAFE_SETUP \ +{ \ + 0, \ + 1, \ + 0, \ + 0, \ + 0, \ + 0, \ + 0, \ + 1, \ + 2, \ + 0, \ + 255, \ + 0x00, \ + 255, \ + 0, \ + 0, \ + 10, \ + 1, \ + 1, \ + 1, \ + 0, \ + 0, \ + 255 \ +} + +/**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/ + +/*----------------------------------------------------------------- +** +** The ncr 53c810 register structure. +** +**----------------------------------------------------------------- +*/ + +struct ncr_reg { +/*00*/ u8 nc_scntl0; /* full arb., ena parity, par->ATN */ + +/*01*/ u8 nc_scntl1; /* no reset */ + #define ISCON 0x10 /* connected to scsi */ + #define CRST 0x08 /* force reset */ + #define IARB 0x02 /* immediate arbitration */ + +/*02*/ u8 nc_scntl2; /* no disconnect expected */ + #define SDU 0x80 /* cmd: disconnect will raise error */ + #define CHM 0x40 /* sta: chained mode */ + #define WSS 0x08 /* sta: wide scsi send [W]*/ + #define WSR 0x01 /* sta: wide scsi received [W]*/ + +/*03*/ u8 nc_scntl3; /* cnf system clock dependent */ + #define EWS 0x08 /* cmd: enable wide scsi [W]*/ + #define ULTRA 0x80 /* cmd: ULTRA enable */ + /* bits 0-2, 7 rsvd for C1010 */ + +/*04*/ u8 nc_scid; /* cnf host adapter scsi address */ + #define RRE 0x40 /* r/w:e enable response to resel. */ + #define SRE 0x20 /* r/w:e enable response to select */ + +/*05*/ u8 nc_sxfer; /* ### Sync speed and count */ + /* bits 6-7 rsvd for C1010 */ + +/*06*/ u8 nc_sdid; /* ### Destination-ID */ + +/*07*/ u8 nc_gpreg; /* ??? IO-Pins */ + +/*08*/ u8 nc_sfbr; /* ### First byte in phase */ + +/*09*/ u8 nc_socl; + #define CREQ 0x80 /* r/w: SCSI-REQ */ + #define CACK 0x40 /* r/w: SCSI-ACK */ + #define CBSY 0x20 /* r/w: SCSI-BSY */ + #define CSEL 0x10 /* r/w: SCSI-SEL */ + #define CATN 0x08 /* r/w: SCSI-ATN */ + #define CMSG 0x04 /* r/w: SCSI-MSG */ + #define CC_D 0x02 /* r/w: SCSI-C_D */ + #define CI_O 0x01 /* r/w: SCSI-I_O */ + +/*0a*/ u8 nc_ssid; + +/*0b*/ u8 nc_sbcl; + +/*0c*/ u8 nc_dstat; + #define DFE 0x80 /* sta: dma fifo empty */ + #define MDPE 0x40 /* int: master data parity error */ + #define BF 0x20 /* int: script: bus fault */ + #define ABRT 0x10 /* int: script: command aborted */ + #define SSI 0x08 /* int: script: single step */ + #define SIR 0x04 /* int: script: interrupt instruct. */ + #define IID 0x01 /* int: script: illegal instruct. */ + +/*0d*/ u8 nc_sstat0; + #define ILF 0x80 /* sta: data in SIDL register lsb */ + #define ORF 0x40 /* sta: data in SODR register lsb */ + #define OLF 0x20 /* sta: data in SODL register lsb */ + #define AIP 0x10 /* sta: arbitration in progress */ + #define LOA 0x08 /* sta: arbitration lost */ + #define WOA 0x04 /* sta: arbitration won */ + #define IRST 0x02 /* sta: scsi reset signal */ + #define SDP 0x01 /* sta: scsi parity signal */ + +/*0e*/ u8 nc_sstat1; + #define FF3210 0xf0 /* sta: bytes in the scsi fifo */ + +/*0f*/ u8 nc_sstat2; + #define ILF1 0x80 /* sta: data in SIDL register msb[W]*/ + #define ORF1 0x40 /* sta: data in SODR register msb[W]*/ + #define OLF1 0x20 /* sta: data in SODL register msb[W]*/ + #define DM 0x04 /* sta: DIFFSENS mismatch (895/6 only) */ + #define LDSC 0x02 /* sta: disconnect & reconnect */ + +/*10*/ u8 nc_dsa; /* --> Base page */ +/*11*/ u8 nc_dsa1; +/*12*/ u8 nc_dsa2; +/*13*/ u8 nc_dsa3; + +/*14*/ u8 nc_istat; /* --> Main Command and status */ + #define CABRT 0x80 /* cmd: abort current operation */ + #define SRST 0x40 /* mod: reset chip */ + #define SIGP 0x20 /* r/w: message from host to ncr */ + #define SEM 0x10 /* r/w: message between host + ncr */ + #define CON 0x08 /* sta: connected to scsi */ + #define INTF 0x04 /* sta: int on the fly (reset by wr)*/ + #define SIP 0x02 /* sta: scsi-interrupt */ + #define DIP 0x01 /* sta: host/script interrupt */ + +/*15*/ u8 nc_istat1; /* 896 and later cores only */ + #define FLSH 0x04 /* sta: chip is flushing */ + #define SRUN 0x02 /* sta: scripts are running */ + #define SIRQD 0x01 /* r/w: disable INT pin */ + +/*16*/ u8 nc_mbox0; /* 896 and later cores only */ +/*17*/ u8 nc_mbox1; /* 896 and later cores only */ + +/*18*/ u8 nc_ctest0; + #define EHP 0x04 /* 720 even host parity */ +/*19*/ u8 nc_ctest1; + +/*1a*/ u8 nc_ctest2; + #define CSIGP 0x40 + /* bits 0-2,7 rsvd for C1010 */ + +/*1b*/ u8 nc_ctest3; + #define FLF 0x08 /* cmd: flush dma fifo */ + #define CLF 0x04 /* cmd: clear dma fifo */ + #define FM 0x02 /* mod: fetch pin mode */ + #define WRIE 0x01 /* mod: write and invalidate enable */ + /* bits 4-7 rsvd for C1010 */ + +/*1c*/ u32 nc_temp; /* ### Temporary stack */ + +/*20*/ u8 nc_dfifo; +/*21*/ u8 nc_ctest4; + #define MUX 0x80 /* 720 host bus multiplex mode */ + #define BDIS 0x80 /* mod: burst disable */ + #define MPEE 0x08 /* mod: master parity error enable */ + +/*22*/ u8 nc_ctest5; + #define DFS 0x20 /* mod: dma fifo size */ + /* bits 0-1, 3-7 rsvd for C1010 */ +/*23*/ u8 nc_ctest6; + +/*24*/ u32 nc_dbc; /* ### Byte count and command */ +/*28*/ u32 nc_dnad; /* ### Next command register */ +/*2c*/ u32 nc_dsp; /* --> Script Pointer */ +/*30*/ u32 nc_dsps; /* --> Script pointer save/opcode#2 */ + +/*34*/ u8 nc_scratcha; /* Temporary register a */ +/*35*/ u8 nc_scratcha1; +/*36*/ u8 nc_scratcha2; +/*37*/ u8 nc_scratcha3; + +/*38*/ u8 nc_dmode; + #define BL_2 0x80 /* mod: burst length shift value +2 */ + #define BL_1 0x40 /* mod: burst length shift value +1 */ + #define ERL 0x08 /* mod: enable read line */ + #define ERMP 0x04 /* mod: enable read multiple */ + #define BOF 0x02 /* mod: burst op code fetch */ + +/*39*/ u8 nc_dien; +/*3a*/ u8 nc_sbr; + +/*3b*/ u8 nc_dcntl; /* --> Script execution control */ + #define CLSE 0x80 /* mod: cache line size enable */ + #define PFF 0x40 /* cmd: pre-fetch flush */ + #define PFEN 0x20 /* mod: pre-fetch enable */ + #define EA 0x20 /* mod: 720 enable-ack */ + #define SSM 0x10 /* mod: single step mode */ + #define IRQM 0x08 /* mod: irq mode (1 = totem pole !) */ + #define STD 0x04 /* cmd: start dma mode */ + #define IRQD 0x02 /* mod: irq disable */ + #define NOCOM 0x01 /* cmd: protect sfbr while reselect */ + /* bits 0-1 rsvd for C1010 */ + +/*3c*/ u32 nc_adder; + +/*40*/ u16 nc_sien; /* -->: interrupt enable */ +/*42*/ u16 nc_sist; /* <--: interrupt status */ + #define SBMC 0x1000/* sta: SCSI Bus Mode Change (895/6 only) */ + #define STO 0x0400/* sta: timeout (select) */ + #define GEN 0x0200/* sta: timeout (general) */ + #define HTH 0x0100/* sta: timeout (handshake) */ + #define MA 0x80 /* sta: phase mismatch */ + #define CMP 0x40 /* sta: arbitration complete */ + #define SEL 0x20 /* sta: selected by another device */ + #define RSL 0x10 /* sta: reselected by another device*/ + #define SGE 0x08 /* sta: gross error (over/underflow)*/ + #define UDC 0x04 /* sta: unexpected disconnect */ + #define RST 0x02 /* sta: scsi bus reset detected */ + #define PAR 0x01 /* sta: scsi parity error */ + +/*44*/ u8 nc_slpar; +/*45*/ u8 nc_swide; +/*46*/ u8 nc_macntl; +/*47*/ u8 nc_gpcntl; +/*48*/ u8 nc_stime0; /* cmd: timeout for select&handshake*/ +/*49*/ u8 nc_stime1; /* cmd: timeout user defined */ +/*4a*/ u16 nc_respid; /* sta: Reselect-IDs */ + +/*4c*/ u8 nc_stest0; + +/*4d*/ u8 nc_stest1; + #define SCLK 0x80 /* Use the PCI clock as SCSI clock */ + #define DBLEN 0x08 /* clock doubler running */ + #define DBLSEL 0x04 /* clock doubler selected */ + + +/*4e*/ u8 nc_stest2; + #define ROF 0x40 /* reset scsi offset (after gross error!) */ + #define DIF 0x20 /* 720 SCSI differential mode */ + #define EXT 0x02 /* extended filtering */ + +/*4f*/ u8 nc_stest3; + #define TE 0x80 /* c: tolerAnt enable */ + #define HSC 0x20 /* c: Halt SCSI Clock */ + #define CSF 0x02 /* c: clear scsi fifo */ + +/*50*/ u16 nc_sidl; /* Lowlevel: latched from scsi data */ +/*52*/ u8 nc_stest4; + #define SMODE 0xc0 /* SCSI bus mode (895/6 only) */ + #define SMODE_HVD 0x40 /* High Voltage Differential */ + #define SMODE_SE 0x80 /* Single Ended */ + #define SMODE_LVD 0xc0 /* Low Voltage Differential */ + #define LCKFRQ 0x20 /* Frequency Lock (895/6 only) */ + /* bits 0-5 rsvd for C1010 */ + +/*53*/ u8 nc_53_; +/*54*/ u16 nc_sodl; /* Lowlevel: data out to scsi data */ +/*56*/ u8 nc_ccntl0; /* Chip Control 0 (896) */ + #define ENPMJ 0x80 /* Enable Phase Mismatch Jump */ + #define PMJCTL 0x40 /* Phase Mismatch Jump Control */ + #define ENNDJ 0x20 /* Enable Non Data PM Jump */ + #define DISFC 0x10 /* Disable Auto FIFO Clear */ + #define DILS 0x02 /* Disable Internal Load/Store */ + #define DPR 0x01 /* Disable Pipe Req */ + +/*57*/ u8 nc_ccntl1; /* Chip Control 1 (896) */ + #define ZMOD 0x80 /* High Impedance Mode */ + #define DIC 0x10 /* Disable Internal Cycles */ + #define DDAC 0x08 /* Disable Dual Address Cycle */ + #define XTIMOD 0x04 /* 64-bit Table Ind. Indexing Mode */ + #define EXTIBMV 0x02 /* Enable 64-bit Table Ind. BMOV */ + #define EXDBMV 0x01 /* Enable 64-bit Direct BMOV */ + +/*58*/ u16 nc_sbdl; /* Lowlevel: data from scsi data */ +/*5a*/ u16 nc_5a_; + +/*5c*/ u8 nc_scr0; /* Working register B */ +/*5d*/ u8 nc_scr1; /* */ +/*5e*/ u8 nc_scr2; /* */ +/*5f*/ u8 nc_scr3; /* */ + +/*60*/ u8 nc_scrx[64]; /* Working register C-R */ +/*a0*/ u32 nc_mmrs; /* Memory Move Read Selector */ +/*a4*/ u32 nc_mmws; /* Memory Move Write Selector */ +/*a8*/ u32 nc_sfs; /* Script Fetch Selector */ +/*ac*/ u32 nc_drs; /* DSA Relative Selector */ +/*b0*/ u32 nc_sbms; /* Static Block Move Selector */ +/*b4*/ u32 nc_dbms; /* Dynamic Block Move Selector */ +/*b8*/ u32 nc_dnad64; /* DMA Next Address 64 */ +/*bc*/ u16 nc_scntl4; /* C1010 only */ + #define U3EN 0x80 /* Enable Ultra 3 */ + #define AIPEN 0x40 /* Allow check upper byte lanes */ + #define XCLKH_DT 0x08 /* Extra clock of data hold on DT + transfer edge */ + #define XCLKH_ST 0x04 /* Extra clock of data hold on ST + transfer edge */ + +/*be*/ u8 nc_aipcntl0; /* Epat Control 1 C1010 only */ +/*bf*/ u8 nc_aipcntl1; /* AIP Control C1010_66 Only */ + +/*c0*/ u32 nc_pmjad1; /* Phase Mismatch Jump Address 1 */ +/*c4*/ u32 nc_pmjad2; /* Phase Mismatch Jump Address 2 */ +/*c8*/ u8 nc_rbc; /* Remaining Byte Count */ +/*c9*/ u8 nc_rbc1; /* */ +/*ca*/ u8 nc_rbc2; /* */ +/*cb*/ u8 nc_rbc3; /* */ + +/*cc*/ u8 nc_ua; /* Updated Address */ +/*cd*/ u8 nc_ua1; /* */ +/*ce*/ u8 nc_ua2; /* */ +/*cf*/ u8 nc_ua3; /* */ +/*d0*/ u32 nc_esa; /* Entry Storage Address */ +/*d4*/ u8 nc_ia; /* Instruction Address */ +/*d5*/ u8 nc_ia1; +/*d6*/ u8 nc_ia2; +/*d7*/ u8 nc_ia3; +/*d8*/ u32 nc_sbc; /* SCSI Byte Count (3 bytes only) */ +/*dc*/ u32 nc_csbc; /* Cumulative SCSI Byte Count */ + + /* Following for C1010 only */ +/*e0*/ u16 nc_crcpad; /* CRC Value */ +/*e2*/ u8 nc_crccntl0; /* CRC control register */ + #define SNDCRC 0x10 /* Send CRC Request */ +/*e3*/ u8 nc_crccntl1; /* CRC control register */ +/*e4*/ u32 nc_crcdata; /* CRC data register */ +/*e8*/ u32 nc_e8_; /* rsvd */ +/*ec*/ u32 nc_ec_; /* rsvd */ +/*f0*/ u16 nc_dfbc; /* DMA FIFO byte count */ + +}; + +/*----------------------------------------------------------- +** +** Utility macros for the script. +** +**----------------------------------------------------------- +*/ + +#define REGJ(p,r) (offsetof(struct ncr_reg, p ## r)) +#define REG(r) REGJ (nc_, r) + +typedef u32 ncrcmd; + +/*----------------------------------------------------------- +** +** SCSI phases +** +** DT phases illegal for ncr driver. +** +**----------------------------------------------------------- +*/ + +#define SCR_DATA_OUT 0x00000000 +#define SCR_DATA_IN 0x01000000 +#define SCR_COMMAND 0x02000000 +#define SCR_STATUS 0x03000000 +#define SCR_DT_DATA_OUT 0x04000000 +#define SCR_DT_DATA_IN 0x05000000 +#define SCR_MSG_OUT 0x06000000 +#define SCR_MSG_IN 0x07000000 + +#define SCR_ILG_OUT 0x04000000 +#define SCR_ILG_IN 0x05000000 + +/*----------------------------------------------------------- +** +** Data transfer via SCSI. +** +**----------------------------------------------------------- +** +** MOVE_ABS (LEN) +** <> +** +** MOVE_IND (LEN) +** <> +** +** MOVE_TBL +** <> +** +**----------------------------------------------------------- +*/ + +#define OPC_MOVE 0x08000000 + +#define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l)) +#define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l)) +#define SCR_MOVE_TBL (0x10000000 | OPC_MOVE) + +#define SCR_CHMOV_ABS(l) ((0x00000000) | (l)) +#define SCR_CHMOV_IND(l) ((0x20000000) | (l)) +#define SCR_CHMOV_TBL (0x10000000) + +struct scr_tblmove { + u32 size; + u32 addr; +}; + +/*----------------------------------------------------------- +** +** Selection +** +**----------------------------------------------------------- +** +** SEL_ABS | SCR_ID (0..15) [ | REL_JMP] +** <> +** +** SEL_TBL | << dnad_offset>> [ | REL_JMP] +** <> +** +**----------------------------------------------------------- +*/ + +#define SCR_SEL_ABS 0x40000000 +#define SCR_SEL_ABS_ATN 0x41000000 +#define SCR_SEL_TBL 0x42000000 +#define SCR_SEL_TBL_ATN 0x43000000 + + +#ifdef SCSI_NCR_BIG_ENDIAN +struct scr_tblsel { + u8 sel_scntl3; + u8 sel_id; + u8 sel_sxfer; + u8 sel_scntl4; +}; +#else +struct scr_tblsel { + u8 sel_scntl4; + u8 sel_sxfer; + u8 sel_id; + u8 sel_scntl3; +}; +#endif + +#define SCR_JMP_REL 0x04000000 +#define SCR_ID(id) (((u32)(id)) << 16) + +/*----------------------------------------------------------- +** +** Waiting for Disconnect or Reselect +** +**----------------------------------------------------------- +** +** WAIT_DISC +** dummy: <> +** +** WAIT_RESEL +** <> +** +**----------------------------------------------------------- +*/ + +#define SCR_WAIT_DISC 0x48000000 +#define SCR_WAIT_RESEL 0x50000000 + +/*----------------------------------------------------------- +** +** Bit Set / Reset +** +**----------------------------------------------------------- +** +** SET (flags {|.. }) +** +** CLR (flags {|.. }) +** +**----------------------------------------------------------- +*/ + +#define SCR_SET(f) (0x58000000 | (f)) +#define SCR_CLR(f) (0x60000000 | (f)) + +#define SCR_CARRY 0x00000400 +#define SCR_TRG 0x00000200 +#define SCR_ACK 0x00000040 +#define SCR_ATN 0x00000008 + + + + +/*----------------------------------------------------------- +** +** Memory to memory move +** +**----------------------------------------------------------- +** +** COPY (bytecount) +** << source_address >> +** << destination_address >> +** +** SCR_COPY sets the NO FLUSH option by default. +** SCR_COPY_F does not set this option. +** +** For chips which do not support this option, +** ncr_copy_and_bind() will remove this bit. +**----------------------------------------------------------- +*/ + +#define SCR_NO_FLUSH 0x01000000 + +#define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n)) +#define SCR_COPY_F(n) (0xc0000000 | (n)) + +/*----------------------------------------------------------- +** +** Register move and binary operations +** +**----------------------------------------------------------- +** +** SFBR_REG (reg, op, data) reg = SFBR op data +** << 0 >> +** +** REG_SFBR (reg, op, data) SFBR = reg op data +** << 0 >> +** +** REG_REG (reg, op, data) reg = reg op data +** << 0 >> +** +**----------------------------------------------------------- +** On 810A, 860, 825A, 875, 895 and 896 chips the content +** of SFBR register can be used as data (SCR_SFBR_DATA). +** The 896 has additionnal IO registers starting at +** offset 0x80. Bit 7 of register offset is stored in +** bit 7 of the SCRIPTS instruction first DWORD. +**----------------------------------------------------------- +*/ + +#define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) + +#define SCR_SFBR_REG(reg,op,data) \ + (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) + +#define SCR_REG_SFBR(reg,op,data) \ + (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) + +#define SCR_REG_REG(reg,op,data) \ + (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) + + +#define SCR_LOAD 0x00000000 +#define SCR_SHL 0x01000000 +#define SCR_OR 0x02000000 +#define SCR_XOR 0x03000000 +#define SCR_AND 0x04000000 +#define SCR_SHR 0x05000000 +#define SCR_ADD 0x06000000 +#define SCR_ADDC 0x07000000 + +#define SCR_SFBR_DATA (0x00800000>>8ul) /* Use SFBR as data */ + +/*----------------------------------------------------------- +** +** FROM_REG (reg) SFBR = reg +** << 0 >> +** +** TO_REG (reg) reg = SFBR +** << 0 >> +** +** LOAD_REG (reg, data) reg = +** << 0 >> +** +** LOAD_SFBR(data) SFBR = +** << 0 >> +** +**----------------------------------------------------------- +*/ + +#define SCR_FROM_REG(reg) \ + SCR_REG_SFBR(reg,SCR_OR,0) + +#define SCR_TO_REG(reg) \ + SCR_SFBR_REG(reg,SCR_OR,0) + +#define SCR_LOAD_REG(reg,data) \ + SCR_REG_REG(reg,SCR_LOAD,data) + +#define SCR_LOAD_SFBR(data) \ + (SCR_REG_SFBR (gpreg, SCR_LOAD, data)) + +/*----------------------------------------------------------- +** +** LOAD from memory to register. +** STORE from register to memory. +** +** Only supported by 810A, 860, 825A, 875, 895 and 896. +** +**----------------------------------------------------------- +** +** LOAD_ABS (LEN) +** <> +** +** LOAD_REL (LEN) (DSA relative) +** <> +** +**----------------------------------------------------------- +*/ + +#define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul) +#define SCR_NO_FLUSH2 0x02000000 +#define SCR_DSA_REL2 0x10000000 + +#define SCR_LOAD_R(reg, how, n) \ + (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n)) + +#define SCR_STORE_R(reg, how, n) \ + (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n)) + +#define SCR_LOAD_ABS(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2, n) +#define SCR_LOAD_REL(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n) +#define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n) +#define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n) + +#define SCR_STORE_ABS(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2, n) +#define SCR_STORE_REL(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n) +#define SCR_STORE_ABS_F(reg, n) SCR_STORE_R(reg, 0, n) +#define SCR_STORE_REL_F(reg, n) SCR_STORE_R(reg, SCR_DSA_REL2, n) + + +/*----------------------------------------------------------- +** +** Waiting for Disconnect or Reselect +** +**----------------------------------------------------------- +** +** JUMP [ | IFTRUE/IFFALSE ( ... ) ] +** <
> +** +** JUMPR [ | IFTRUE/IFFALSE ( ... ) ] +** <> +** +** CALL [ | IFTRUE/IFFALSE ( ... ) ] +** <
> +** +** CALLR [ | IFTRUE/IFFALSE ( ... ) ] +** <> +** +** RETURN [ | IFTRUE/IFFALSE ( ... ) ] +** <> +** +** INT [ | IFTRUE/IFFALSE ( ... ) ] +** <> +** +** INT_FLY [ | IFTRUE/IFFALSE ( ... ) ] +** <> +** +** Conditions: +** WHEN (phase) +** IF (phase) +** CARRYSET +** DATA (data, mask) +** +**----------------------------------------------------------- +*/ + +#define SCR_NO_OP 0x80000000 +#define SCR_JUMP 0x80080000 +#define SCR_JUMP64 0x80480000 +#define SCR_JUMPR 0x80880000 +#define SCR_CALL 0x88080000 +#define SCR_CALLR 0x88880000 +#define SCR_RETURN 0x90080000 +#define SCR_INT 0x98080000 +#define SCR_INT_FLY 0x98180000 + +#define IFFALSE(arg) (0x00080000 | (arg)) +#define IFTRUE(arg) (0x00000000 | (arg)) + +#define WHEN(phase) (0x00030000 | (phase)) +#define IF(phase) (0x00020000 | (phase)) + +#define DATA(D) (0x00040000 | ((D) & 0xff)) +#define MASK(D,M) (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff)) + +#define CARRYSET (0x00200000) + +/*----------------------------------------------------------- +** +** SCSI constants. +** +**----------------------------------------------------------- +*/ + +/* +** Messages +*/ + +#define M_COMPLETE COMMAND_COMPLETE +#define M_EXTENDED EXTENDED_MESSAGE +#define M_SAVE_DP SAVE_POINTERS +#define M_RESTORE_DP RESTORE_POINTERS +#define M_DISCONNECT DISCONNECT +#define M_ID_ERROR INITIATOR_ERROR +#define M_ABORT ABORT_TASK_SET +#define M_REJECT MESSAGE_REJECT +#define M_NOOP NOP +#define M_PARITY MSG_PARITY_ERROR +#define M_LCOMPLETE LINKED_CMD_COMPLETE +#define M_FCOMPLETE LINKED_FLG_CMD_COMPLETE +#define M_RESET TARGET_RESET +#define M_ABORT_TAG ABORT_TASK +#define M_CLEAR_QUEUE CLEAR_TASK_SET +#define M_INIT_REC INITIATE_RECOVERY +#define M_REL_REC RELEASE_RECOVERY +#define M_TERMINATE (0x11) +#define M_SIMPLE_TAG SIMPLE_QUEUE_TAG +#define M_HEAD_TAG HEAD_OF_QUEUE_TAG +#define M_ORDERED_TAG ORDERED_QUEUE_TAG +#define M_IGN_RESIDUE IGNORE_WIDE_RESIDUE +#define M_IDENTIFY (0x80) + +#define M_X_MODIFY_DP EXTENDED_MODIFY_DATA_POINTER +#define M_X_SYNC_REQ EXTENDED_SDTR +#define M_X_WIDE_REQ EXTENDED_WDTR +#define M_X_PPR_REQ EXTENDED_PPR + +/* +** Status +*/ + +#define S_GOOD (0x00) +#define S_CHECK_COND (0x02) +#define S_COND_MET (0x04) +#define S_BUSY (0x08) +#define S_INT (0x10) +#define S_INT_COND_MET (0x14) +#define S_CONFLICT (0x18) +#define S_TERMINATED (0x20) +#define S_QUEUE_FULL (0x28) +#define S_ILLEGAL (0xff) +#define S_SENSE (0x80) + +/* + * End of ncrreg from FreeBSD + */ /* Build a scatter/gather entry. diff --git a/drivers/scsi/sym53c8xx_comm.h b/drivers/scsi/sym53c8xx_comm.h deleted file mode 100644 index 20ae2b17df5..00000000000 --- a/drivers/scsi/sym53c8xx_comm.h +++ /dev/null @@ -1,792 +0,0 @@ -/****************************************************************************** -** High Performance device driver for the Symbios 53C896 controller. -** -** Copyright (C) 1998-2001 Gerard Roudier -** -** This driver also supports all the Symbios 53C8XX controller family, -** except 53C810 revisions < 16, 53C825 revisions < 16 and all -** revisions of 53C815 controllers. -** -** This driver is based on the Linux port of the FreeBSD ncr driver. -** -** Copyright (C) 1994 Wolfgang Stanglmeier -** -**----------------------------------------------------------------------------- -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -** -**----------------------------------------------------------------------------- -** -** The Linux port of the FreeBSD ncr driver has been achieved in -** november 1995 by: -** -** Gerard Roudier -** -** Being given that this driver originates from the FreeBSD version, and -** in order to keep synergy on both, any suggested enhancements and corrections -** received on Linux are automatically a potential candidate for the FreeBSD -** version. -** -** The original driver has been written for 386bsd and FreeBSD by -** Wolfgang Stanglmeier -** Stefan Esser -** -**----------------------------------------------------------------------------- -** -** Major contributions: -** -------------------- -** -** NVRAM detection and reading. -** Copyright (C) 1997 Richard Waltham -** -******************************************************************************* -*/ - -/*========================================================== -** -** Debugging tags -** -**========================================================== -*/ - -#define DEBUG_ALLOC (0x0001) -#define DEBUG_PHASE (0x0002) -#define DEBUG_QUEUE (0x0008) -#define DEBUG_RESULT (0x0010) -#define DEBUG_POINTER (0x0020) -#define DEBUG_SCRIPT (0x0040) -#define DEBUG_TINY (0x0080) -#define DEBUG_TIMING (0x0100) -#define DEBUG_NEGO (0x0200) -#define DEBUG_TAGS (0x0400) -#define DEBUG_SCATTER (0x0800) -#define DEBUG_IC (0x1000) - -/* -** Enable/Disable debug messages. -** Can be changed at runtime too. -*/ - -#ifdef SCSI_NCR_DEBUG_INFO_SUPPORT -static int ncr_debug = SCSI_NCR_DEBUG_FLAGS; - #define DEBUG_FLAGS ncr_debug -#else - #define DEBUG_FLAGS SCSI_NCR_DEBUG_FLAGS -#endif - -static inline struct list_head *ncr_list_pop(struct list_head *head) -{ - if (!list_empty(head)) { - struct list_head *elem = head->next; - - list_del(elem); - return elem; - } - - return NULL; -} - -#ifdef __sparc__ -#include -#endif - -/*========================================================== -** -** Simple power of two buddy-like allocator. -** -** This simple code is not intended to be fast, but to -** provide power of 2 aligned memory allocations. -** Since the SCRIPTS processor only supplies 8 bit -** arithmetic, this allocator allows simple and fast -** address calculations from the SCRIPTS code. -** In addition, cache line alignment is guaranteed for -** power of 2 cache line size. -** Enhanced in linux-2.3.44 to provide a memory pool -** per pcidev to support dynamic dma mapping. (I would -** have preferred a real bus astraction, btw). -** -**========================================================== -*/ - -#define MEMO_SHIFT 4 /* 16 bytes minimum memory chunk */ -#if PAGE_SIZE >= 8192 -#define MEMO_PAGE_ORDER 0 /* 1 PAGE maximum */ -#else -#define MEMO_PAGE_ORDER 1 /* 2 PAGES maximum */ -#endif -#define MEMO_FREE_UNUSED /* Free unused pages immediately */ -#define MEMO_WARN 1 -#define MEMO_GFP_FLAGS GFP_ATOMIC -#define MEMO_CLUSTER_SHIFT (PAGE_SHIFT+MEMO_PAGE_ORDER) -#define MEMO_CLUSTER_SIZE (1UL << MEMO_CLUSTER_SHIFT) -#define MEMO_CLUSTER_MASK (MEMO_CLUSTER_SIZE-1) - -typedef u_long m_addr_t; /* Enough bits to bit-hack addresses */ -typedef struct device *m_bush_t; /* Something that addresses DMAable */ - -typedef struct m_link { /* Link between free memory chunks */ - struct m_link *next; -} m_link_s; - -typedef struct m_vtob { /* Virtual to Bus address translation */ - struct m_vtob *next; - m_addr_t vaddr; - m_addr_t baddr; -} m_vtob_s; -#define VTOB_HASH_SHIFT 5 -#define VTOB_HASH_SIZE (1UL << VTOB_HASH_SHIFT) -#define VTOB_HASH_MASK (VTOB_HASH_SIZE-1) -#define VTOB_HASH_CODE(m) \ - ((((m_addr_t) (m)) >> MEMO_CLUSTER_SHIFT) & VTOB_HASH_MASK) - -typedef struct m_pool { /* Memory pool of a given kind */ - m_bush_t bush; - m_addr_t (*getp)(struct m_pool *); - void (*freep)(struct m_pool *, m_addr_t); - int nump; - m_vtob_s *(vtob[VTOB_HASH_SIZE]); - struct m_pool *next; - struct m_link h[PAGE_SHIFT-MEMO_SHIFT+MEMO_PAGE_ORDER+1]; -} m_pool_s; - -static void *___m_alloc(m_pool_s *mp, int size) -{ - int i = 0; - int s = (1 << MEMO_SHIFT); - int j; - m_addr_t a; - m_link_s *h = mp->h; - - if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) - return NULL; - - while (size > s) { - s <<= 1; - ++i; - } - - j = i; - while (!h[j].next) { - if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { - h[j].next = (m_link_s *)mp->getp(mp); - if (h[j].next) - h[j].next->next = NULL; - break; - } - ++j; - s <<= 1; - } - a = (m_addr_t) h[j].next; - if (a) { - h[j].next = h[j].next->next; - while (j > i) { - j -= 1; - s >>= 1; - h[j].next = (m_link_s *) (a+s); - h[j].next->next = NULL; - } - } -#ifdef DEBUG - printk("___m_alloc(%d) = %p\n", size, (void *) a); -#endif - return (void *) a; -} - -static void ___m_free(m_pool_s *mp, void *ptr, int size) -{ - int i = 0; - int s = (1 << MEMO_SHIFT); - m_link_s *q; - m_addr_t a, b; - m_link_s *h = mp->h; - -#ifdef DEBUG - printk("___m_free(%p, %d)\n", ptr, size); -#endif - - if (size > (PAGE_SIZE << MEMO_PAGE_ORDER)) - return; - - while (size > s) { - s <<= 1; - ++i; - } - - a = (m_addr_t) ptr; - - while (1) { -#ifdef MEMO_FREE_UNUSED - if (s == (PAGE_SIZE << MEMO_PAGE_ORDER)) { - mp->freep(mp, a); - break; - } -#endif - b = a ^ s; - q = &h[i]; - while (q->next && q->next != (m_link_s *) b) { - q = q->next; - } - if (!q->next) { - ((m_link_s *) a)->next = h[i].next; - h[i].next = (m_link_s *) a; - break; - } - q->next = q->next->next; - a = a & b; - s <<= 1; - ++i; - } -} - -static DEFINE_SPINLOCK(ncr53c8xx_lock); - -static void *__m_calloc2(m_pool_s *mp, int size, char *name, int uflags) -{ - void *p; - - p = ___m_alloc(mp, size); - - if (DEBUG_FLAGS & DEBUG_ALLOC) - printk ("new %-10s[%4d] @%p.\n", name, size, p); - - if (p) - memset(p, 0, size); - else if (uflags & MEMO_WARN) - printk (NAME53C8XX ": failed to allocate %s[%d]\n", name, size); - - return p; -} - -#define __m_calloc(mp, s, n) __m_calloc2(mp, s, n, MEMO_WARN) - -static void __m_free(m_pool_s *mp, void *ptr, int size, char *name) -{ - if (DEBUG_FLAGS & DEBUG_ALLOC) - printk ("freeing %-10s[%4d] @%p.\n", name, size, ptr); - - ___m_free(mp, ptr, size); - -} - -/* - * With pci bus iommu support, we use a default pool of unmapped memory - * for memory we donnot need to DMA from/to and one pool per pcidev for - * memory accessed by the PCI chip. `mp0' is the default not DMAable pool. - */ - -static m_addr_t ___mp0_getp(m_pool_s *mp) -{ - m_addr_t m = __get_free_pages(MEMO_GFP_FLAGS, MEMO_PAGE_ORDER); - if (m) - ++mp->nump; - return m; -} - -static void ___mp0_freep(m_pool_s *mp, m_addr_t m) -{ - free_pages(m, MEMO_PAGE_ORDER); - --mp->nump; -} - -static m_pool_s mp0 = {NULL, ___mp0_getp, ___mp0_freep}; - -/* - * DMAable pools. - */ - -/* - * With pci bus iommu support, we maintain one pool per pcidev and a - * hashed reverse table for virtual to bus physical address translations. - */ -static m_addr_t ___dma_getp(m_pool_s *mp) -{ - m_addr_t vp; - m_vtob_s *vbp; - - vbp = __m_calloc(&mp0, sizeof(*vbp), "VTOB"); - if (vbp) { - dma_addr_t daddr; - vp = (m_addr_t) dma_alloc_coherent(mp->bush, - PAGE_SIZE<vaddr = vp; - vbp->baddr = daddr; - vbp->next = mp->vtob[hc]; - mp->vtob[hc] = vbp; - ++mp->nump; - return vp; - } - } - if (vbp) - __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); - return 0; -} - -static void ___dma_freep(m_pool_s *mp, m_addr_t m) -{ - m_vtob_s **vbpp, *vbp; - int hc = VTOB_HASH_CODE(m); - - vbpp = &mp->vtob[hc]; - while (*vbpp && (*vbpp)->vaddr != m) - vbpp = &(*vbpp)->next; - if (*vbpp) { - vbp = *vbpp; - *vbpp = (*vbpp)->next; - dma_free_coherent(mp->bush, PAGE_SIZE<vaddr, (dma_addr_t)vbp->baddr); - __m_free(&mp0, vbp, sizeof(*vbp), "VTOB"); - --mp->nump; - } -} - -static inline m_pool_s *___get_dma_pool(m_bush_t bush) -{ - m_pool_s *mp; - for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next); - return mp; -} - -static m_pool_s *___cre_dma_pool(m_bush_t bush) -{ - m_pool_s *mp; - mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL"); - if (mp) { - memset(mp, 0, sizeof(*mp)); - mp->bush = bush; - mp->getp = ___dma_getp; - mp->freep = ___dma_freep; - mp->next = mp0.next; - mp0.next = mp; - } - return mp; -} - -static void ___del_dma_pool(m_pool_s *p) -{ - struct m_pool **pp = &mp0.next; - - while (*pp && *pp != p) - pp = &(*pp)->next; - if (*pp) { - *pp = (*pp)->next; - __m_free(&mp0, p, sizeof(*p), "MPOOL"); - } -} - -static void *__m_calloc_dma(m_bush_t bush, int size, char *name) -{ - u_long flags; - struct m_pool *mp; - void *m = NULL; - - spin_lock_irqsave(&ncr53c8xx_lock, flags); - mp = ___get_dma_pool(bush); - if (!mp) - mp = ___cre_dma_pool(bush); - if (mp) - m = __m_calloc(mp, size, name); - if (mp && !mp->nump) - ___del_dma_pool(mp); - spin_unlock_irqrestore(&ncr53c8xx_lock, flags); - - return m; -} - -static void __m_free_dma(m_bush_t bush, void *m, int size, char *name) -{ - u_long flags; - struct m_pool *mp; - - spin_lock_irqsave(&ncr53c8xx_lock, flags); - mp = ___get_dma_pool(bush); - if (mp) - __m_free(mp, m, size, name); - if (mp && !mp->nump) - ___del_dma_pool(mp); - spin_unlock_irqrestore(&ncr53c8xx_lock, flags); -} - -static m_addr_t __vtobus(m_bush_t bush, void *m) -{ - u_long flags; - m_pool_s *mp; - int hc = VTOB_HASH_CODE(m); - m_vtob_s *vp = NULL; - m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK; - - spin_lock_irqsave(&ncr53c8xx_lock, flags); - mp = ___get_dma_pool(bush); - if (mp) { - vp = mp->vtob[hc]; - while (vp && (m_addr_t) vp->vaddr != a) - vp = vp->next; - } - spin_unlock_irqrestore(&ncr53c8xx_lock, flags); - return vp ? vp->baddr + (((m_addr_t) m) - a) : 0; -} - -#define _m_calloc_dma(np, s, n) __m_calloc_dma(np->dev, s, n) -#define _m_free_dma(np, p, s, n) __m_free_dma(np->dev, p, s, n) -#define m_calloc_dma(s, n) _m_calloc_dma(np, s, n) -#define m_free_dma(p, s, n) _m_free_dma(np, p, s, n) -#define _vtobus(np, p) __vtobus(np->dev, p) -#define vtobus(p) _vtobus(np, p) - -/* - * Deal with DMA mapping/unmapping. - */ - -/* To keep track of the dma mapping (sg/single) that has been set */ -#define __data_mapped SCp.phase -#define __data_mapping SCp.have_data_in - -static void __unmap_scsi_data(struct device *dev, struct scsi_cmnd *cmd) -{ - switch(cmd->__data_mapped) { - case 2: - dma_unmap_sg(dev, cmd->buffer, cmd->use_sg, - cmd->sc_data_direction); - break; - case 1: - dma_unmap_single(dev, cmd->__data_mapping, - cmd->request_bufflen, - cmd->sc_data_direction); - break; - } - cmd->__data_mapped = 0; -} - -static u_long __map_scsi_single_data(struct device *dev, struct scsi_cmnd *cmd) -{ - dma_addr_t mapping; - - if (cmd->request_bufflen == 0) - return 0; - - mapping = dma_map_single(dev, cmd->request_buffer, - cmd->request_bufflen, - cmd->sc_data_direction); - cmd->__data_mapped = 1; - cmd->__data_mapping = mapping; - - return mapping; -} - -static int __map_scsi_sg_data(struct device *dev, struct scsi_cmnd *cmd) -{ - int use_sg; - - if (cmd->use_sg == 0) - return 0; - - use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, - cmd->sc_data_direction); - cmd->__data_mapped = 2; - cmd->__data_mapping = use_sg; - - return use_sg; -} - -#define unmap_scsi_data(np, cmd) __unmap_scsi_data(np->dev, cmd) -#define map_scsi_single_data(np, cmd) __map_scsi_single_data(np->dev, cmd) -#define map_scsi_sg_data(np, cmd) __map_scsi_sg_data(np->dev, cmd) - -/*========================================================== -** -** Driver setup. -** -** This structure is initialized from linux config -** options. It can be overridden at boot-up by the boot -** command line. -** -**========================================================== -*/ -static struct ncr_driver_setup - driver_setup = SCSI_NCR_DRIVER_SETUP; - -#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT -static struct ncr_driver_setup - driver_safe_setup __initdata = SCSI_NCR_DRIVER_SAFE_SETUP; -#endif - -#define initverbose (driver_setup.verbose) -#define bootverbose (np->verbose) - - -/*=================================================================== -** -** Driver setup from the boot command line -** -**=================================================================== -*/ - -#ifdef MODULE -#define ARG_SEP ' ' -#else -#define ARG_SEP ',' -#endif - -#define OPT_TAGS 1 -#define OPT_MASTER_PARITY 2 -#define OPT_SCSI_PARITY 3 -#define OPT_DISCONNECTION 4 -#define OPT_SPECIAL_FEATURES 5 -#define OPT_UNUSED_1 6 -#define OPT_FORCE_SYNC_NEGO 7 -#define OPT_REVERSE_PROBE 8 -#define OPT_DEFAULT_SYNC 9 -#define OPT_VERBOSE 10 -#define OPT_DEBUG 11 -#define OPT_BURST_MAX 12 -#define OPT_LED_PIN 13 -#define OPT_MAX_WIDE 14 -#define OPT_SETTLE_DELAY 15 -#define OPT_DIFF_SUPPORT 16 -#define OPT_IRQM 17 -#define OPT_PCI_FIX_UP 18 -#define OPT_BUS_CHECK 19 -#define OPT_OPTIMIZE 20 -#define OPT_RECOVERY 21 -#define OPT_SAFE_SETUP 22 -#define OPT_USE_NVRAM 23 -#define OPT_EXCLUDE 24 -#define OPT_HOST_ID 25 - -#ifdef SCSI_NCR_IARB_SUPPORT -#define OPT_IARB 26 -#endif - -static char setup_token[] __initdata = - "tags:" "mpar:" - "spar:" "disc:" - "specf:" "ultra:" - "fsn:" "revprob:" - "sync:" "verb:" - "debug:" "burst:" - "led:" "wide:" - "settle:" "diff:" - "irqm:" "pcifix:" - "buschk:" "optim:" - "recovery:" - "safe:" "nvram:" - "excl:" "hostid:" -#ifdef SCSI_NCR_IARB_SUPPORT - "iarb:" -#endif - ; /* DONNOT REMOVE THIS ';' */ - -#ifdef MODULE -#define ARG_SEP ' ' -#else -#define ARG_SEP ',' -#endif - -static int __init get_setup_token(char *p) -{ - char *cur = setup_token; - char *pc; - int i = 0; - - while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { - ++pc; - ++i; - if (!strncmp(p, cur, pc - cur)) - return i; - cur = pc; - } - return 0; -} - - -static int __init sym53c8xx__setup(char *str) -{ -#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT - char *cur = str; - char *pc, *pv; - int i, val, c; - int xi = 0; - - while (cur != NULL && (pc = strchr(cur, ':')) != NULL) { - char *pe; - - val = 0; - pv = pc; - c = *++pv; - - if (c == 'n') - val = 0; - else if (c == 'y') - val = 1; - else - val = (int) simple_strtoul(pv, &pe, 0); - - switch (get_setup_token(cur)) { - case OPT_TAGS: - driver_setup.default_tags = val; - if (pe && *pe == '/') { - i = 0; - while (*pe && *pe != ARG_SEP && - i < sizeof(driver_setup.tag_ctrl)-1) { - driver_setup.tag_ctrl[i++] = *pe++; - } - driver_setup.tag_ctrl[i] = '\0'; - } - break; - case OPT_MASTER_PARITY: - driver_setup.master_parity = val; - break; - case OPT_SCSI_PARITY: - driver_setup.scsi_parity = val; - break; - case OPT_DISCONNECTION: - driver_setup.disconnection = val; - break; - case OPT_SPECIAL_FEATURES: - driver_setup.special_features = val; - break; - case OPT_FORCE_SYNC_NEGO: - driver_setup.force_sync_nego = val; - break; - case OPT_REVERSE_PROBE: - driver_setup.reverse_probe = val; - break; - case OPT_DEFAULT_SYNC: - driver_setup.default_sync = val; - break; - case OPT_VERBOSE: - driver_setup.verbose = val; - break; - case OPT_DEBUG: - driver_setup.debug = val; - break; - case OPT_BURST_MAX: - driver_setup.burst_max = val; - break; - case OPT_LED_PIN: - driver_setup.led_pin = val; - break; - case OPT_MAX_WIDE: - driver_setup.max_wide = val? 1:0; - break; - case OPT_SETTLE_DELAY: - driver_setup.settle_delay = val; - break; - case OPT_DIFF_SUPPORT: - driver_setup.diff_support = val; - break; - case OPT_IRQM: - driver_setup.irqm = val; - break; - case OPT_PCI_FIX_UP: - driver_setup.pci_fix_up = val; - break; - case OPT_BUS_CHECK: - driver_setup.bus_check = val; - break; - case OPT_OPTIMIZE: - driver_setup.optimize = val; - break; - case OPT_RECOVERY: - driver_setup.recovery = val; - break; - case OPT_USE_NVRAM: - driver_setup.use_nvram = val; - break; - case OPT_SAFE_SETUP: - memcpy(&driver_setup, &driver_safe_setup, - sizeof(driver_setup)); - break; - case OPT_EXCLUDE: - if (xi < SCSI_NCR_MAX_EXCLUDES) - driver_setup.excludes[xi++] = val; - break; - case OPT_HOST_ID: - driver_setup.host_id = val; - break; -#ifdef SCSI_NCR_IARB_SUPPORT - case OPT_IARB: - driver_setup.iarb = val; - break; -#endif - default: - printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur); - break; - } - - if ((cur = strchr(cur, ARG_SEP)) != NULL) - ++cur; - } -#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */ - return 1; -} - -/*=================================================================== -** -** Get device queue depth from boot command line. -** -**=================================================================== -*/ -#define DEF_DEPTH (driver_setup.default_tags) -#define ALL_TARGETS -2 -#define NO_TARGET -1 -#define ALL_LUNS -2 -#define NO_LUN -1 - -static int device_queue_depth(int unit, int target, int lun) -{ - int c, h, t, u, v; - char *p = driver_setup.tag_ctrl; - char *ep; - - h = -1; - t = NO_TARGET; - u = NO_LUN; - while ((c = *p++) != 0) { - v = simple_strtoul(p, &ep, 0); - switch(c) { - case '/': - ++h; - t = ALL_TARGETS; - u = ALL_LUNS; - break; - case 't': - if (t != target) - t = (target == v) ? v : NO_TARGET; - u = ALL_LUNS; - break; - case 'u': - if (u != lun) - u = (lun == v) ? v : NO_LUN; - break; - case 'q': - if (h == unit && - (t == ALL_TARGETS || t == target) && - (u == ALL_LUNS || u == lun)) - return v; - break; - case '-': - t = ALL_TARGETS; - u = ALL_LUNS; - break; - default: - break; - } - p = ep; - } - return DEF_DEPTH; -} diff --git a/drivers/scsi/sym53c8xx_defs.h b/drivers/scsi/sym53c8xx_defs.h deleted file mode 100644 index 139cd0e12e6..00000000000 --- a/drivers/scsi/sym53c8xx_defs.h +++ /dev/null @@ -1,1320 +0,0 @@ -/****************************************************************************** -** High Performance device driver for the Symbios 53C896 controller. -** -** Copyright (C) 1998-2001 Gerard Roudier -** -** This driver also supports all the Symbios 53C8XX controller family, -** except 53C810 revisions < 16, 53C825 revisions < 16 and all -** revisions of 53C815 controllers. -** -** This driver is based on the Linux port of the FreeBSD ncr driver. -** -** Copyright (C) 1994 Wolfgang Stanglmeier -** -**----------------------------------------------------------------------------- -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -** -**----------------------------------------------------------------------------- -** -** The Linux port of the FreeBSD ncr driver has been achieved in -** november 1995 by: -** -** Gerard Roudier -** -** Being given that this driver originates from the FreeBSD version, and -** in order to keep synergy on both, any suggested enhancements and corrections -** received on Linux are automatically a potential candidate for the FreeBSD -** version. -** -** The original driver has been written for 386bsd and FreeBSD by -** Wolfgang Stanglmeier -** Stefan Esser -** -**----------------------------------------------------------------------------- -** -** Major contributions: -** -------------------- -** -** NVRAM detection and reading. -** Copyright (C) 1997 Richard Waltham -** -** Added support for MIPS big endian systems. -** Carsten Langgaard, carstenl@mips.com -** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. -** -** Added support for HP PARISC big endian systems. -** Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. -** -******************************************************************************* -*/ - -#ifndef SYM53C8XX_DEFS_H -#define SYM53C8XX_DEFS_H - -#include - -/* -** If you want a driver as small as possible, donnot define the -** following options. -*/ -#define SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT -#define SCSI_NCR_DEBUG_INFO_SUPPORT - -/* -** To disable integrity checking, do not define the -** following option. -*/ -#ifdef CONFIG_SCSI_NCR53C8XX_INTEGRITY_CHECK -# define SCSI_NCR_ENABLE_INTEGRITY_CHECK -#endif - -/* --------------------------------------------------------------------- -** Take into account kernel configured parameters. -** Most of these options can be overridden at startup by a command line. -** --------------------------------------------------------------------- -*/ - -/* - * For Ultra2 and Ultra3 SCSI support option, use special features. - * - * Value (default) means: - * bit 0 : all features enabled, except: - * bit 1 : PCI Write And Invalidate. - * bit 2 : Data Phase Mismatch handling from SCRIPTS. - * - * Use boot options ncr53c8xx=specf:1 if you want all chip features to be - * enabled by the driver. - */ -#define SCSI_NCR_SETUP_SPECIAL_FEATURES (3) - -#define SCSI_NCR_MAX_SYNC (80) - -/* - * Allow tags from 2 to 256, default 8 - */ -#ifdef CONFIG_SCSI_NCR53C8XX_MAX_TAGS -#if CONFIG_SCSI_NCR53C8XX_MAX_TAGS < 2 -#define SCSI_NCR_MAX_TAGS (2) -#elif CONFIG_SCSI_NCR53C8XX_MAX_TAGS > 256 -#define SCSI_NCR_MAX_TAGS (256) -#else -#define SCSI_NCR_MAX_TAGS CONFIG_SCSI_NCR53C8XX_MAX_TAGS -#endif -#else -#define SCSI_NCR_MAX_TAGS (8) -#endif - -/* - * Allow tagged command queuing support if configured with default number - * of tags set to max (see above). - */ -#ifdef CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS -#define SCSI_NCR_SETUP_DEFAULT_TAGS CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS -#elif defined CONFIG_SCSI_NCR53C8XX_TAGGED_QUEUE -#define SCSI_NCR_SETUP_DEFAULT_TAGS SCSI_NCR_MAX_TAGS -#else -#define SCSI_NCR_SETUP_DEFAULT_TAGS (0) -#endif - -/* - * Immediate arbitration - */ -#if defined(CONFIG_SCSI_NCR53C8XX_IARB) -#define SCSI_NCR_IARB_SUPPORT -#endif - -/* - * Sync transfer frequency at startup. - * Allow from 5Mhz to 80Mhz default 20 Mhz. - */ -#ifndef CONFIG_SCSI_NCR53C8XX_SYNC -#define CONFIG_SCSI_NCR53C8XX_SYNC (20) -#elif CONFIG_SCSI_NCR53C8XX_SYNC > SCSI_NCR_MAX_SYNC -#undef CONFIG_SCSI_NCR53C8XX_SYNC -#define CONFIG_SCSI_NCR53C8XX_SYNC SCSI_NCR_MAX_SYNC -#endif - -#if CONFIG_SCSI_NCR53C8XX_SYNC == 0 -#define SCSI_NCR_SETUP_DEFAULT_SYNC (255) -#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 5 -#define SCSI_NCR_SETUP_DEFAULT_SYNC (50) -#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 20 -#define SCSI_NCR_SETUP_DEFAULT_SYNC (250/(CONFIG_SCSI_NCR53C8XX_SYNC)) -#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 33 -#define SCSI_NCR_SETUP_DEFAULT_SYNC (11) -#elif CONFIG_SCSI_NCR53C8XX_SYNC <= 40 -#define SCSI_NCR_SETUP_DEFAULT_SYNC (10) -#else -#define SCSI_NCR_SETUP_DEFAULT_SYNC (9) -#endif - -/* - * Disallow disconnections at boot-up - */ -#ifdef CONFIG_SCSI_NCR53C8XX_NO_DISCONNECT -#define SCSI_NCR_SETUP_DISCONNECTION (0) -#else -#define SCSI_NCR_SETUP_DISCONNECTION (1) -#endif - -/* - * Force synchronous negotiation for all targets - */ -#ifdef CONFIG_SCSI_NCR53C8XX_FORCE_SYNC_NEGO -#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (1) -#else -#define SCSI_NCR_SETUP_FORCE_SYNC_NEGO (0) -#endif - -/* - * Disable master parity checking (flawed hardwares need that) - */ -#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_MPARITY_CHECK -#define SCSI_NCR_SETUP_MASTER_PARITY (0) -#else -#define SCSI_NCR_SETUP_MASTER_PARITY (1) -#endif - -/* - * Disable scsi parity checking (flawed devices may need that) - */ -#ifdef CONFIG_SCSI_NCR53C8XX_DISABLE_PARITY_CHECK -#define SCSI_NCR_SETUP_SCSI_PARITY (0) -#else -#define SCSI_NCR_SETUP_SCSI_PARITY (1) -#endif - -/* - * Settle time after reset at boot-up - */ -#define SCSI_NCR_SETUP_SETTLE_TIME (2) - -/* -** Bridge quirks work-around option defaulted to 1. -*/ -#ifndef SCSI_NCR_PCIQ_WORK_AROUND_OPT -#define SCSI_NCR_PCIQ_WORK_AROUND_OPT 1 -#endif - -/* -** Work-around common bridge misbehaviour. -** -** - Do not flush posted writes in the opposite -** direction on read. -** - May reorder DMA writes to memory. -** -** This option should not affect performances -** significantly, so it is the default. -*/ -#if SCSI_NCR_PCIQ_WORK_AROUND_OPT == 1 -#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM -#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES -#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS - -/* -** Same as option 1, but also deal with -** misconfigured interrupts. -** -** - Edge triggerred instead of level sensitive. -** - No interrupt line connected. -** - IRQ number misconfigured. -** -** If no interrupt is delivered, the driver will -** catch the interrupt conditions 10 times per -** second. No need to say that this option is -** not recommended. -*/ -#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 2 -#define SCSI_NCR_PCIQ_MAY_NOT_FLUSH_PW_UPSTREAM -#define SCSI_NCR_PCIQ_MAY_REORDER_WRITES -#define SCSI_NCR_PCIQ_MAY_MISS_COMPLETIONS -#define SCSI_NCR_PCIQ_BROKEN_INTR - -/* -** Some bridge designers decided to flush -** everything prior to deliver the interrupt. -** This option tries to deal with such a -** behaviour. -*/ -#elif SCSI_NCR_PCIQ_WORK_AROUND_OPT == 3 -#define SCSI_NCR_PCIQ_SYNC_ON_INTR -#endif - -/* -** Other parameters not configurable with "make config" -** Avoid to change these constants, unless you know what you are doing. -*/ - -#define SCSI_NCR_ALWAYS_SIMPLE_TAG -#define SCSI_NCR_MAX_SCATTER (127) -#define SCSI_NCR_MAX_TARGET (16) - -/* -** Compute some desirable value for CAN_QUEUE -** and CMD_PER_LUN. -** The driver will use lower values if these -** ones appear to be too large. -*/ -#define SCSI_NCR_CAN_QUEUE (8*SCSI_NCR_MAX_TAGS + 2*SCSI_NCR_MAX_TARGET) -#define SCSI_NCR_CMD_PER_LUN (SCSI_NCR_MAX_TAGS) - -#define SCSI_NCR_SG_TABLESIZE (SCSI_NCR_MAX_SCATTER) -#define SCSI_NCR_TIMER_INTERVAL (HZ) - -#if 1 /* defined CONFIG_SCSI_MULTI_LUN */ -#define SCSI_NCR_MAX_LUN (16) -#else -#define SCSI_NCR_MAX_LUN (1) -#endif - -/* - * IO functions definition for big/little endian CPU support. - * For now, the NCR is only supported in little endian addressing mode, - */ - -#ifdef __BIG_ENDIAN - -#define inw_l2b inw -#define inl_l2b inl -#define outw_b2l outw -#define outl_b2l outl - -#define readb_raw readb -#define writeb_raw writeb - -#if defined(SCSI_NCR_BIG_ENDIAN) -#define readw_l2b __raw_readw -#define readl_l2b __raw_readl -#define writew_b2l __raw_writew -#define writel_b2l __raw_writel -#define readw_raw __raw_readw -#define readl_raw __raw_readl -#define writew_raw __raw_writew -#define writel_raw __raw_writel -#else /* Other big-endian */ -#define readw_l2b readw -#define readl_l2b readl -#define writew_b2l writew -#define writel_b2l writel -#define readw_raw readw -#define readl_raw readl -#define writew_raw writew -#define writel_raw writel -#endif - -#else /* little endian */ - -#define inw_raw inw -#define inl_raw inl -#define outw_raw outw -#define outl_raw outl - -#define readb_raw readb -#define readw_raw readw -#define readl_raw readl -#define writeb_raw writeb -#define writew_raw writew -#define writel_raw writel - -#endif - -#if !defined(__hppa__) && !defined(__mips__) -#ifdef SCSI_NCR_BIG_ENDIAN -#error "The NCR in BIG ENDIAN addressing mode is not (yet) supported" -#endif -#endif - -#define MEMORY_BARRIER() mb() - - -/* - * If the NCR uses big endian addressing mode over the - * PCI, actual io register addresses for byte and word - * accesses must be changed according to lane routing. - * Btw, ncr_offb() and ncr_offw() macros only apply to - * constants and so donnot generate bloated code. - */ - -#if defined(SCSI_NCR_BIG_ENDIAN) - -#define ncr_offb(o) (((o)&~3)+((~((o)&3))&3)) -#define ncr_offw(o) (((o)&~3)+((~((o)&3))&2)) - -#else - -#define ncr_offb(o) (o) -#define ncr_offw(o) (o) - -#endif - -/* - * If the CPU and the NCR use same endian-ness addressing, - * no byte reordering is needed for script patching. - * Macro cpu_to_scr() is to be used for script patching. - * Macro scr_to_cpu() is to be used for getting a DWORD - * from the script. - */ - -#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN) - -#define cpu_to_scr(dw) cpu_to_le32(dw) -#define scr_to_cpu(dw) le32_to_cpu(dw) - -#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN) - -#define cpu_to_scr(dw) cpu_to_be32(dw) -#define scr_to_cpu(dw) be32_to_cpu(dw) - -#else - -#define cpu_to_scr(dw) (dw) -#define scr_to_cpu(dw) (dw) - -#endif - -/* - * Access to the controller chip. - * - * If the CPU and the NCR use same endian-ness addressing, - * no byte reordering is needed for accessing chip io - * registers. Functions suffixed by '_raw' are assumed - * to access the chip over the PCI without doing byte - * reordering. Functions suffixed by '_l2b' are - * assumed to perform little-endian to big-endian byte - * reordering, those suffixed by '_b2l' blah, blah, - * blah, ... - */ - -/* - * MEMORY mapped IO input / output - */ - -#define INB_OFF(o) readb_raw((char __iomem *)np->reg + ncr_offb(o)) -#define OUTB_OFF(o, val) writeb_raw((val), (char __iomem *)np->reg + ncr_offb(o)) - -#if defined(__BIG_ENDIAN) && !defined(SCSI_NCR_BIG_ENDIAN) - -#define INW_OFF(o) readw_l2b((char __iomem *)np->reg + ncr_offw(o)) -#define INL_OFF(o) readl_l2b((char __iomem *)np->reg + (o)) - -#define OUTW_OFF(o, val) writew_b2l((val), (char __iomem *)np->reg + ncr_offw(o)) -#define OUTL_OFF(o, val) writel_b2l((val), (char __iomem *)np->reg + (o)) - -#elif defined(__LITTLE_ENDIAN) && defined(SCSI_NCR_BIG_ENDIAN) - -#define INW_OFF(o) readw_b2l((char __iomem *)np->reg + ncr_offw(o)) -#define INL_OFF(o) readl_b2l((char __iomem *)np->reg + (o)) - -#define OUTW_OFF(o, val) writew_l2b((val), (char __iomem *)np->reg + ncr_offw(o)) -#define OUTL_OFF(o, val) writel_l2b((val), (char __iomem *)np->reg + (o)) - -#else - -#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS -/* Only 8 or 32 bit transfers allowed */ -#define INW_OFF(o) (readb((char __iomem *)np->reg + ncr_offw(o)) << 8 | readb((char __iomem *)np->reg + ncr_offw(o) + 1)) -#else -#define INW_OFF(o) readw_raw((char __iomem *)np->reg + ncr_offw(o)) -#endif -#define INL_OFF(o) readl_raw((char __iomem *)np->reg + (o)) - -#ifdef CONFIG_SCSI_NCR53C8XX_NO_WORD_TRANSFERS -/* Only 8 or 32 bit transfers allowed */ -#define OUTW_OFF(o, val) do { writeb((char)((val) >> 8), (char __iomem *)np->reg + ncr_offw(o)); writeb((char)(val), (char __iomem *)np->reg + ncr_offw(o) + 1); } while (0) -#else -#define OUTW_OFF(o, val) writew_raw((val), (char __iomem *)np->reg + ncr_offw(o)) -#endif -#define OUTL_OFF(o, val) writel_raw((val), (char __iomem *)np->reg + (o)) - -#endif - -#define INB(r) INB_OFF (offsetof(struct ncr_reg,r)) -#define INW(r) INW_OFF (offsetof(struct ncr_reg,r)) -#define INL(r) INL_OFF (offsetof(struct ncr_reg,r)) - -#define OUTB(r, val) OUTB_OFF (offsetof(struct ncr_reg,r), (val)) -#define OUTW(r, val) OUTW_OFF (offsetof(struct ncr_reg,r), (val)) -#define OUTL(r, val) OUTL_OFF (offsetof(struct ncr_reg,r), (val)) - -/* - * Set bit field ON, OFF - */ - -#define OUTONB(r, m) OUTB(r, INB(r) | (m)) -#define OUTOFFB(r, m) OUTB(r, INB(r) & ~(m)) -#define OUTONW(r, m) OUTW(r, INW(r) | (m)) -#define OUTOFFW(r, m) OUTW(r, INW(r) & ~(m)) -#define OUTONL(r, m) OUTL(r, INL(r) | (m)) -#define OUTOFFL(r, m) OUTL(r, INL(r) & ~(m)) - -/* - * We normally want the chip to have a consistent view - * of driver internal data structures when we restart it. - * Thus these macros. - */ -#define OUTL_DSP(v) \ - do { \ - MEMORY_BARRIER(); \ - OUTL (nc_dsp, (v)); \ - } while (0) - -#define OUTONB_STD() \ - do { \ - MEMORY_BARRIER(); \ - OUTONB (nc_dcntl, (STD|NOCOM)); \ - } while (0) - - -/* -** NCR53C8XX devices features table. -*/ -struct ncr_chip { - unsigned short revision_id; - unsigned char burst_max; /* log-base-2 of max burst */ - unsigned char offset_max; - unsigned char nr_divisor; - unsigned int features; -#define FE_LED0 (1<<0) -#define FE_WIDE (1<<1) /* Wide data transfers */ -#define FE_ULTRA (1<<2) /* Ultra speed 20Mtrans/sec */ -#define FE_DBLR (1<<4) /* Clock doubler present */ -#define FE_QUAD (1<<5) /* Clock quadrupler present */ -#define FE_ERL (1<<6) /* Enable read line */ -#define FE_CLSE (1<<7) /* Cache line size enable */ -#define FE_WRIE (1<<8) /* Write & Invalidate enable */ -#define FE_ERMP (1<<9) /* Enable read multiple */ -#define FE_BOF (1<<10) /* Burst opcode fetch */ -#define FE_DFS (1<<11) /* DMA fifo size */ -#define FE_PFEN (1<<12) /* Prefetch enable */ -#define FE_LDSTR (1<<13) /* Load/Store supported */ -#define FE_RAM (1<<14) /* On chip RAM present */ -#define FE_VARCLK (1<<15) /* SCSI clock may vary */ -#define FE_RAM8K (1<<16) /* On chip RAM sized 8Kb */ -#define FE_64BIT (1<<17) /* Have a 64-bit PCI interface */ -#define FE_IO256 (1<<18) /* Requires full 256 bytes in PCI space */ -#define FE_NOPM (1<<19) /* Scripts handles phase mismatch */ -#define FE_LEDC (1<<20) /* Hardware control of LED */ -#define FE_DIFF (1<<21) /* Support Differential SCSI */ -#define FE_66MHZ (1<<23) /* 66MHz PCI Support */ -#define FE_DAC (1<<24) /* Support DAC cycles (64 bit addressing) */ -#define FE_ISTAT1 (1<<25) /* Have ISTAT1, MBOX0, MBOX1 registers */ -#define FE_DAC_IN_USE (1<<26) /* Platform does DAC cycles */ -#define FE_EHP (1<<27) /* 720: Even host parity */ -#define FE_MUX (1<<28) /* 720: Multiplexed bus */ -#define FE_EA (1<<29) /* 720: Enable Ack */ - -#define FE_CACHE_SET (FE_ERL|FE_CLSE|FE_WRIE|FE_ERMP) -#define FE_SCSI_SET (FE_WIDE|FE_ULTRA|FE_DBLR|FE_QUAD|F_CLK80) -#define FE_SPECIAL_SET (FE_CACHE_SET|FE_BOF|FE_DFS|FE_LDSTR|FE_PFEN|FE_RAM) -}; - - -/* -** Driver setup structure. -** -** This structure is initialized from linux config options. -** It can be overridden at boot-up by the boot command line. -*/ -#define SCSI_NCR_MAX_EXCLUDES 8 -struct ncr_driver_setup { - u8 master_parity; - u8 scsi_parity; - u8 disconnection; - u8 special_features; - u8 force_sync_nego; - u8 reverse_probe; - u8 pci_fix_up; - u8 use_nvram; - u8 verbose; - u8 default_tags; - u16 default_sync; - u16 debug; - u8 burst_max; - u8 led_pin; - u8 max_wide; - u8 settle_delay; - u8 diff_support; - u8 irqm; - u8 bus_check; - u8 optimize; - u8 recovery; - u8 host_id; - u16 iarb; - u32 excludes[SCSI_NCR_MAX_EXCLUDES]; - char tag_ctrl[100]; -}; - -/* -** Initial setup. -** Can be overriden at startup by a command line. -*/ -#define SCSI_NCR_DRIVER_SETUP \ -{ \ - SCSI_NCR_SETUP_MASTER_PARITY, \ - SCSI_NCR_SETUP_SCSI_PARITY, \ - SCSI_NCR_SETUP_DISCONNECTION, \ - SCSI_NCR_SETUP_SPECIAL_FEATURES, \ - SCSI_NCR_SETUP_FORCE_SYNC_NEGO, \ - 0, \ - 0, \ - 1, \ - 0, \ - SCSI_NCR_SETUP_DEFAULT_TAGS, \ - SCSI_NCR_SETUP_DEFAULT_SYNC, \ - 0x00, \ - 7, \ - 0, \ - 1, \ - SCSI_NCR_SETUP_SETTLE_TIME, \ - 0, \ - 0, \ - 1, \ - 0, \ - 0, \ - 255, \ - 0x00 \ -} - -/* -** Boot fail safe setup. -** Override initial setup from boot command line: -** ncr53c8xx=safe:y -*/ -#define SCSI_NCR_DRIVER_SAFE_SETUP \ -{ \ - 0, \ - 1, \ - 0, \ - 0, \ - 0, \ - 0, \ - 0, \ - 1, \ - 2, \ - 0, \ - 255, \ - 0x00, \ - 255, \ - 0, \ - 0, \ - 10, \ - 1, \ - 1, \ - 1, \ - 0, \ - 0, \ - 255 \ -} - -/**************** ORIGINAL CONTENT of ncrreg.h from FreeBSD ******************/ - -/*----------------------------------------------------------------- -** -** The ncr 53c810 register structure. -** -**----------------------------------------------------------------- -*/ - -struct ncr_reg { -/*00*/ u8 nc_scntl0; /* full arb., ena parity, par->ATN */ - -/*01*/ u8 nc_scntl1; /* no reset */ - #define ISCON 0x10 /* connected to scsi */ - #define CRST 0x08 /* force reset */ - #define IARB 0x02 /* immediate arbitration */ - -/*02*/ u8 nc_scntl2; /* no disconnect expected */ - #define SDU 0x80 /* cmd: disconnect will raise error */ - #define CHM 0x40 /* sta: chained mode */ - #define WSS 0x08 /* sta: wide scsi send [W]*/ - #define WSR 0x01 /* sta: wide scsi received [W]*/ - -/*03*/ u8 nc_scntl3; /* cnf system clock dependent */ - #define EWS 0x08 /* cmd: enable wide scsi [W]*/ - #define ULTRA 0x80 /* cmd: ULTRA enable */ - /* bits 0-2, 7 rsvd for C1010 */ - -/*04*/ u8 nc_scid; /* cnf host adapter scsi address */ - #define RRE 0x40 /* r/w:e enable response to resel. */ - #define SRE 0x20 /* r/w:e enable response to select */ - -/*05*/ u8 nc_sxfer; /* ### Sync speed and count */ - /* bits 6-7 rsvd for C1010 */ - -/*06*/ u8 nc_sdid; /* ### Destination-ID */ - -/*07*/ u8 nc_gpreg; /* ??? IO-Pins */ - -/*08*/ u8 nc_sfbr; /* ### First byte in phase */ - -/*09*/ u8 nc_socl; - #define CREQ 0x80 /* r/w: SCSI-REQ */ - #define CACK 0x40 /* r/w: SCSI-ACK */ - #define CBSY 0x20 /* r/w: SCSI-BSY */ - #define CSEL 0x10 /* r/w: SCSI-SEL */ - #define CATN 0x08 /* r/w: SCSI-ATN */ - #define CMSG 0x04 /* r/w: SCSI-MSG */ - #define CC_D 0x02 /* r/w: SCSI-C_D */ - #define CI_O 0x01 /* r/w: SCSI-I_O */ - -/*0a*/ u8 nc_ssid; - -/*0b*/ u8 nc_sbcl; - -/*0c*/ u8 nc_dstat; - #define DFE 0x80 /* sta: dma fifo empty */ - #define MDPE 0x40 /* int: master data parity error */ - #define BF 0x20 /* int: script: bus fault */ - #define ABRT 0x10 /* int: script: command aborted */ - #define SSI 0x08 /* int: script: single step */ - #define SIR 0x04 /* int: script: interrupt instruct. */ - #define IID 0x01 /* int: script: illegal instruct. */ - -/*0d*/ u8 nc_sstat0; - #define ILF 0x80 /* sta: data in SIDL register lsb */ - #define ORF 0x40 /* sta: data in SODR register lsb */ - #define OLF 0x20 /* sta: data in SODL register lsb */ - #define AIP 0x10 /* sta: arbitration in progress */ - #define LOA 0x08 /* sta: arbitration lost */ - #define WOA 0x04 /* sta: arbitration won */ - #define IRST 0x02 /* sta: scsi reset signal */ - #define SDP 0x01 /* sta: scsi parity signal */ - -/*0e*/ u8 nc_sstat1; - #define FF3210 0xf0 /* sta: bytes in the scsi fifo */ - -/*0f*/ u8 nc_sstat2; - #define ILF1 0x80 /* sta: data in SIDL register msb[W]*/ - #define ORF1 0x40 /* sta: data in SODR register msb[W]*/ - #define OLF1 0x20 /* sta: data in SODL register msb[W]*/ - #define DM 0x04 /* sta: DIFFSENS mismatch (895/6 only) */ - #define LDSC 0x02 /* sta: disconnect & reconnect */ - -/*10*/ u8 nc_dsa; /* --> Base page */ -/*11*/ u8 nc_dsa1; -/*12*/ u8 nc_dsa2; -/*13*/ u8 nc_dsa3; - -/*14*/ u8 nc_istat; /* --> Main Command and status */ - #define CABRT 0x80 /* cmd: abort current operation */ - #define SRST 0x40 /* mod: reset chip */ - #define SIGP 0x20 /* r/w: message from host to ncr */ - #define SEM 0x10 /* r/w: message between host + ncr */ - #define CON 0x08 /* sta: connected to scsi */ - #define INTF 0x04 /* sta: int on the fly (reset by wr)*/ - #define SIP 0x02 /* sta: scsi-interrupt */ - #define DIP 0x01 /* sta: host/script interrupt */ - -/*15*/ u8 nc_istat1; /* 896 and later cores only */ - #define FLSH 0x04 /* sta: chip is flushing */ - #define SRUN 0x02 /* sta: scripts are running */ - #define SIRQD 0x01 /* r/w: disable INT pin */ - -/*16*/ u8 nc_mbox0; /* 896 and later cores only */ -/*17*/ u8 nc_mbox1; /* 896 and later cores only */ - -/*18*/ u8 nc_ctest0; - #define EHP 0x04 /* 720 even host parity */ -/*19*/ u8 nc_ctest1; - -/*1a*/ u8 nc_ctest2; - #define CSIGP 0x40 - /* bits 0-2,7 rsvd for C1010 */ - -/*1b*/ u8 nc_ctest3; - #define FLF 0x08 /* cmd: flush dma fifo */ - #define CLF 0x04 /* cmd: clear dma fifo */ - #define FM 0x02 /* mod: fetch pin mode */ - #define WRIE 0x01 /* mod: write and invalidate enable */ - /* bits 4-7 rsvd for C1010 */ - -/*1c*/ u32 nc_temp; /* ### Temporary stack */ - -/*20*/ u8 nc_dfifo; -/*21*/ u8 nc_ctest4; - #define MUX 0x80 /* 720 host bus multiplex mode */ - #define BDIS 0x80 /* mod: burst disable */ - #define MPEE 0x08 /* mod: master parity error enable */ - -/*22*/ u8 nc_ctest5; - #define DFS 0x20 /* mod: dma fifo size */ - /* bits 0-1, 3-7 rsvd for C1010 */ -/*23*/ u8 nc_ctest6; - -/*24*/ u32 nc_dbc; /* ### Byte count and command */ -/*28*/ u32 nc_dnad; /* ### Next command register */ -/*2c*/ u32 nc_dsp; /* --> Script Pointer */ -/*30*/ u32 nc_dsps; /* --> Script pointer save/opcode#2 */ - -/*34*/ u8 nc_scratcha; /* Temporary register a */ -/*35*/ u8 nc_scratcha1; -/*36*/ u8 nc_scratcha2; -/*37*/ u8 nc_scratcha3; - -/*38*/ u8 nc_dmode; - #define BL_2 0x80 /* mod: burst length shift value +2 */ - #define BL_1 0x40 /* mod: burst length shift value +1 */ - #define ERL 0x08 /* mod: enable read line */ - #define ERMP 0x04 /* mod: enable read multiple */ - #define BOF 0x02 /* mod: burst op code fetch */ - -/*39*/ u8 nc_dien; -/*3a*/ u8 nc_sbr; - -/*3b*/ u8 nc_dcntl; /* --> Script execution control */ - #define CLSE 0x80 /* mod: cache line size enable */ - #define PFF 0x40 /* cmd: pre-fetch flush */ - #define PFEN 0x20 /* mod: pre-fetch enable */ - #define EA 0x20 /* mod: 720 enable-ack */ - #define SSM 0x10 /* mod: single step mode */ - #define IRQM 0x08 /* mod: irq mode (1 = totem pole !) */ - #define STD 0x04 /* cmd: start dma mode */ - #define IRQD 0x02 /* mod: irq disable */ - #define NOCOM 0x01 /* cmd: protect sfbr while reselect */ - /* bits 0-1 rsvd for C1010 */ - -/*3c*/ u32 nc_adder; - -/*40*/ u16 nc_sien; /* -->: interrupt enable */ -/*42*/ u16 nc_sist; /* <--: interrupt status */ - #define SBMC 0x1000/* sta: SCSI Bus Mode Change (895/6 only) */ - #define STO 0x0400/* sta: timeout (select) */ - #define GEN 0x0200/* sta: timeout (general) */ - #define HTH 0x0100/* sta: timeout (handshake) */ - #define MA 0x80 /* sta: phase mismatch */ - #define CMP 0x40 /* sta: arbitration complete */ - #define SEL 0x20 /* sta: selected by another device */ - #define RSL 0x10 /* sta: reselected by another device*/ - #define SGE 0x08 /* sta: gross error (over/underflow)*/ - #define UDC 0x04 /* sta: unexpected disconnect */ - #define RST 0x02 /* sta: scsi bus reset detected */ - #define PAR 0x01 /* sta: scsi parity error */ - -/*44*/ u8 nc_slpar; -/*45*/ u8 nc_swide; -/*46*/ u8 nc_macntl; -/*47*/ u8 nc_gpcntl; -/*48*/ u8 nc_stime0; /* cmd: timeout for select&handshake*/ -/*49*/ u8 nc_stime1; /* cmd: timeout user defined */ -/*4a*/ u16 nc_respid; /* sta: Reselect-IDs */ - -/*4c*/ u8 nc_stest0; - -/*4d*/ u8 nc_stest1; - #define SCLK 0x80 /* Use the PCI clock as SCSI clock */ - #define DBLEN 0x08 /* clock doubler running */ - #define DBLSEL 0x04 /* clock doubler selected */ - - -/*4e*/ u8 nc_stest2; - #define ROF 0x40 /* reset scsi offset (after gross error!) */ - #define DIF 0x20 /* 720 SCSI differential mode */ - #define EXT 0x02 /* extended filtering */ - -/*4f*/ u8 nc_stest3; - #define TE 0x80 /* c: tolerAnt enable */ - #define HSC 0x20 /* c: Halt SCSI Clock */ - #define CSF 0x02 /* c: clear scsi fifo */ - -/*50*/ u16 nc_sidl; /* Lowlevel: latched from scsi data */ -/*52*/ u8 nc_stest4; - #define SMODE 0xc0 /* SCSI bus mode (895/6 only) */ - #define SMODE_HVD 0x40 /* High Voltage Differential */ - #define SMODE_SE 0x80 /* Single Ended */ - #define SMODE_LVD 0xc0 /* Low Voltage Differential */ - #define LCKFRQ 0x20 /* Frequency Lock (895/6 only) */ - /* bits 0-5 rsvd for C1010 */ - -/*53*/ u8 nc_53_; -/*54*/ u16 nc_sodl; /* Lowlevel: data out to scsi data */ -/*56*/ u8 nc_ccntl0; /* Chip Control 0 (896) */ - #define ENPMJ 0x80 /* Enable Phase Mismatch Jump */ - #define PMJCTL 0x40 /* Phase Mismatch Jump Control */ - #define ENNDJ 0x20 /* Enable Non Data PM Jump */ - #define DISFC 0x10 /* Disable Auto FIFO Clear */ - #define DILS 0x02 /* Disable Internal Load/Store */ - #define DPR 0x01 /* Disable Pipe Req */ - -/*57*/ u8 nc_ccntl1; /* Chip Control 1 (896) */ - #define ZMOD 0x80 /* High Impedance Mode */ - #define DIC 0x10 /* Disable Internal Cycles */ - #define DDAC 0x08 /* Disable Dual Address Cycle */ - #define XTIMOD 0x04 /* 64-bit Table Ind. Indexing Mode */ - #define EXTIBMV 0x02 /* Enable 64-bit Table Ind. BMOV */ - #define EXDBMV 0x01 /* Enable 64-bit Direct BMOV */ - -/*58*/ u16 nc_sbdl; /* Lowlevel: data from scsi data */ -/*5a*/ u16 nc_5a_; - -/*5c*/ u8 nc_scr0; /* Working register B */ -/*5d*/ u8 nc_scr1; /* */ -/*5e*/ u8 nc_scr2; /* */ -/*5f*/ u8 nc_scr3; /* */ - -/*60*/ u8 nc_scrx[64]; /* Working register C-R */ -/*a0*/ u32 nc_mmrs; /* Memory Move Read Selector */ -/*a4*/ u32 nc_mmws; /* Memory Move Write Selector */ -/*a8*/ u32 nc_sfs; /* Script Fetch Selector */ -/*ac*/ u32 nc_drs; /* DSA Relative Selector */ -/*b0*/ u32 nc_sbms; /* Static Block Move Selector */ -/*b4*/ u32 nc_dbms; /* Dynamic Block Move Selector */ -/*b8*/ u32 nc_dnad64; /* DMA Next Address 64 */ -/*bc*/ u16 nc_scntl4; /* C1010 only */ - #define U3EN 0x80 /* Enable Ultra 3 */ - #define AIPEN 0x40 /* Allow check upper byte lanes */ - #define XCLKH_DT 0x08 /* Extra clock of data hold on DT - transfer edge */ - #define XCLKH_ST 0x04 /* Extra clock of data hold on ST - transfer edge */ - -/*be*/ u8 nc_aipcntl0; /* Epat Control 1 C1010 only */ -/*bf*/ u8 nc_aipcntl1; /* AIP Control C1010_66 Only */ - -/*c0*/ u32 nc_pmjad1; /* Phase Mismatch Jump Address 1 */ -/*c4*/ u32 nc_pmjad2; /* Phase Mismatch Jump Address 2 */ -/*c8*/ u8 nc_rbc; /* Remaining Byte Count */ -/*c9*/ u8 nc_rbc1; /* */ -/*ca*/ u8 nc_rbc2; /* */ -/*cb*/ u8 nc_rbc3; /* */ - -/*cc*/ u8 nc_ua; /* Updated Address */ -/*cd*/ u8 nc_ua1; /* */ -/*ce*/ u8 nc_ua2; /* */ -/*cf*/ u8 nc_ua3; /* */ -/*d0*/ u32 nc_esa; /* Entry Storage Address */ -/*d4*/ u8 nc_ia; /* Instruction Address */ -/*d5*/ u8 nc_ia1; -/*d6*/ u8 nc_ia2; -/*d7*/ u8 nc_ia3; -/*d8*/ u32 nc_sbc; /* SCSI Byte Count (3 bytes only) */ -/*dc*/ u32 nc_csbc; /* Cumulative SCSI Byte Count */ - - /* Following for C1010 only */ -/*e0*/ u16 nc_crcpad; /* CRC Value */ -/*e2*/ u8 nc_crccntl0; /* CRC control register */ - #define SNDCRC 0x10 /* Send CRC Request */ -/*e3*/ u8 nc_crccntl1; /* CRC control register */ -/*e4*/ u32 nc_crcdata; /* CRC data register */ -/*e8*/ u32 nc_e8_; /* rsvd */ -/*ec*/ u32 nc_ec_; /* rsvd */ -/*f0*/ u16 nc_dfbc; /* DMA FIFO byte count */ - -}; - -/*----------------------------------------------------------- -** -** Utility macros for the script. -** -**----------------------------------------------------------- -*/ - -#define REGJ(p,r) (offsetof(struct ncr_reg, p ## r)) -#define REG(r) REGJ (nc_, r) - -typedef u32 ncrcmd; - -/*----------------------------------------------------------- -** -** SCSI phases -** -** DT phases illegal for ncr driver. -** -**----------------------------------------------------------- -*/ - -#define SCR_DATA_OUT 0x00000000 -#define SCR_DATA_IN 0x01000000 -#define SCR_COMMAND 0x02000000 -#define SCR_STATUS 0x03000000 -#define SCR_DT_DATA_OUT 0x04000000 -#define SCR_DT_DATA_IN 0x05000000 -#define SCR_MSG_OUT 0x06000000 -#define SCR_MSG_IN 0x07000000 - -#define SCR_ILG_OUT 0x04000000 -#define SCR_ILG_IN 0x05000000 - -/*----------------------------------------------------------- -** -** Data transfer via SCSI. -** -**----------------------------------------------------------- -** -** MOVE_ABS (LEN) -** <> -** -** MOVE_IND (LEN) -** <> -** -** MOVE_TBL -** <> -** -**----------------------------------------------------------- -*/ - -#define OPC_MOVE 0x08000000 - -#define SCR_MOVE_ABS(l) ((0x00000000 | OPC_MOVE) | (l)) -#define SCR_MOVE_IND(l) ((0x20000000 | OPC_MOVE) | (l)) -#define SCR_MOVE_TBL (0x10000000 | OPC_MOVE) - -#define SCR_CHMOV_ABS(l) ((0x00000000) | (l)) -#define SCR_CHMOV_IND(l) ((0x20000000) | (l)) -#define SCR_CHMOV_TBL (0x10000000) - -struct scr_tblmove { - u32 size; - u32 addr; -}; - -/*----------------------------------------------------------- -** -** Selection -** -**----------------------------------------------------------- -** -** SEL_ABS | SCR_ID (0..15) [ | REL_JMP] -** <> -** -** SEL_TBL | << dnad_offset>> [ | REL_JMP] -** <> -** -**----------------------------------------------------------- -*/ - -#define SCR_SEL_ABS 0x40000000 -#define SCR_SEL_ABS_ATN 0x41000000 -#define SCR_SEL_TBL 0x42000000 -#define SCR_SEL_TBL_ATN 0x43000000 - - -#ifdef SCSI_NCR_BIG_ENDIAN -struct scr_tblsel { - u8 sel_scntl3; - u8 sel_id; - u8 sel_sxfer; - u8 sel_scntl4; -}; -#else -struct scr_tblsel { - u8 sel_scntl4; - u8 sel_sxfer; - u8 sel_id; - u8 sel_scntl3; -}; -#endif - -#define SCR_JMP_REL 0x04000000 -#define SCR_ID(id) (((u32)(id)) << 16) - -/*----------------------------------------------------------- -** -** Waiting for Disconnect or Reselect -** -**----------------------------------------------------------- -** -** WAIT_DISC -** dummy: <> -** -** WAIT_RESEL -** <> -** -**----------------------------------------------------------- -*/ - -#define SCR_WAIT_DISC 0x48000000 -#define SCR_WAIT_RESEL 0x50000000 - -/*----------------------------------------------------------- -** -** Bit Set / Reset -** -**----------------------------------------------------------- -** -** SET (flags {|.. }) -** -** CLR (flags {|.. }) -** -**----------------------------------------------------------- -*/ - -#define SCR_SET(f) (0x58000000 | (f)) -#define SCR_CLR(f) (0x60000000 | (f)) - -#define SCR_CARRY 0x00000400 -#define SCR_TRG 0x00000200 -#define SCR_ACK 0x00000040 -#define SCR_ATN 0x00000008 - - - - -/*----------------------------------------------------------- -** -** Memory to memory move -** -**----------------------------------------------------------- -** -** COPY (bytecount) -** << source_address >> -** << destination_address >> -** -** SCR_COPY sets the NO FLUSH option by default. -** SCR_COPY_F does not set this option. -** -** For chips which do not support this option, -** ncr_copy_and_bind() will remove this bit. -**----------------------------------------------------------- -*/ - -#define SCR_NO_FLUSH 0x01000000 - -#define SCR_COPY(n) (0xc0000000 | SCR_NO_FLUSH | (n)) -#define SCR_COPY_F(n) (0xc0000000 | (n)) - -/*----------------------------------------------------------- -** -** Register move and binary operations -** -**----------------------------------------------------------- -** -** SFBR_REG (reg, op, data) reg = SFBR op data -** << 0 >> -** -** REG_SFBR (reg, op, data) SFBR = reg op data -** << 0 >> -** -** REG_REG (reg, op, data) reg = reg op data -** << 0 >> -** -**----------------------------------------------------------- -** On 810A, 860, 825A, 875, 895 and 896 chips the content -** of SFBR register can be used as data (SCR_SFBR_DATA). -** The 896 has additionnal IO registers starting at -** offset 0x80. Bit 7 of register offset is stored in -** bit 7 of the SCRIPTS instruction first DWORD. -**----------------------------------------------------------- -*/ - -#define SCR_REG_OFS(ofs) ((((ofs) & 0x7f) << 16ul) + ((ofs) & 0x80)) - -#define SCR_SFBR_REG(reg,op,data) \ - (0x68000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) - -#define SCR_REG_SFBR(reg,op,data) \ - (0x70000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) - -#define SCR_REG_REG(reg,op,data) \ - (0x78000000 | (SCR_REG_OFS(REG(reg))) | (op) | (((data)&0xff)<<8ul)) - - -#define SCR_LOAD 0x00000000 -#define SCR_SHL 0x01000000 -#define SCR_OR 0x02000000 -#define SCR_XOR 0x03000000 -#define SCR_AND 0x04000000 -#define SCR_SHR 0x05000000 -#define SCR_ADD 0x06000000 -#define SCR_ADDC 0x07000000 - -#define SCR_SFBR_DATA (0x00800000>>8ul) /* Use SFBR as data */ - -/*----------------------------------------------------------- -** -** FROM_REG (reg) SFBR = reg -** << 0 >> -** -** TO_REG (reg) reg = SFBR -** << 0 >> -** -** LOAD_REG (reg, data) reg = -** << 0 >> -** -** LOAD_SFBR(data) SFBR = -** << 0 >> -** -**----------------------------------------------------------- -*/ - -#define SCR_FROM_REG(reg) \ - SCR_REG_SFBR(reg,SCR_OR,0) - -#define SCR_TO_REG(reg) \ - SCR_SFBR_REG(reg,SCR_OR,0) - -#define SCR_LOAD_REG(reg,data) \ - SCR_REG_REG(reg,SCR_LOAD,data) - -#define SCR_LOAD_SFBR(data) \ - (SCR_REG_SFBR (gpreg, SCR_LOAD, data)) - -/*----------------------------------------------------------- -** -** LOAD from memory to register. -** STORE from register to memory. -** -** Only supported by 810A, 860, 825A, 875, 895 and 896. -** -**----------------------------------------------------------- -** -** LOAD_ABS (LEN) -** <> -** -** LOAD_REL (LEN) (DSA relative) -** <> -** -**----------------------------------------------------------- -*/ - -#define SCR_REG_OFS2(ofs) (((ofs) & 0xff) << 16ul) -#define SCR_NO_FLUSH2 0x02000000 -#define SCR_DSA_REL2 0x10000000 - -#define SCR_LOAD_R(reg, how, n) \ - (0xe1000000 | how | (SCR_REG_OFS2(REG(reg))) | (n)) - -#define SCR_STORE_R(reg, how, n) \ - (0xe0000000 | how | (SCR_REG_OFS2(REG(reg))) | (n)) - -#define SCR_LOAD_ABS(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2, n) -#define SCR_LOAD_REL(reg, n) SCR_LOAD_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2, n) -#define SCR_LOAD_ABS_F(reg, n) SCR_LOAD_R(reg, 0, n) -#define SCR_LOAD_REL_F(reg, n) SCR_LOAD_R(reg, SCR_DSA_REL2, n) - -#define SCR_STORE_ABS(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2, n) -#define SCR_STORE_REL(reg, n) SCR_STORE_R(reg, SCR_NO_FLUSH2|SCR_DSA_REL2,n) -#define SCR_STORE_ABS_F(reg, n) SCR_STORE_R(reg, 0, n) -#define SCR_STORE_REL_F(reg, n) SCR_STORE_R(reg, SCR_DSA_REL2, n) - - -/*----------------------------------------------------------- -** -** Waiting for Disconnect or Reselect -** -**----------------------------------------------------------- -** -** JUMP [ | IFTRUE/IFFALSE ( ... ) ] -** <
> -** -** JUMPR [ | IFTRUE/IFFALSE ( ... ) ] -** <> -** -** CALL [ | IFTRUE/IFFALSE ( ... ) ] -** <
> -** -** CALLR [ | IFTRUE/IFFALSE ( ... ) ] -** <> -** -** RETURN [ | IFTRUE/IFFALSE ( ... ) ] -** <> -** -** INT [ | IFTRUE/IFFALSE ( ... ) ] -** <> -** -** INT_FLY [ | IFTRUE/IFFALSE ( ... ) ] -** <> -** -** Conditions: -** WHEN (phase) -** IF (phase) -** CARRYSET -** DATA (data, mask) -** -**----------------------------------------------------------- -*/ - -#define SCR_NO_OP 0x80000000 -#define SCR_JUMP 0x80080000 -#define SCR_JUMP64 0x80480000 -#define SCR_JUMPR 0x80880000 -#define SCR_CALL 0x88080000 -#define SCR_CALLR 0x88880000 -#define SCR_RETURN 0x90080000 -#define SCR_INT 0x98080000 -#define SCR_INT_FLY 0x98180000 - -#define IFFALSE(arg) (0x00080000 | (arg)) -#define IFTRUE(arg) (0x00000000 | (arg)) - -#define WHEN(phase) (0x00030000 | (phase)) -#define IF(phase) (0x00020000 | (phase)) - -#define DATA(D) (0x00040000 | ((D) & 0xff)) -#define MASK(D,M) (0x00040000 | (((M ^ 0xff) & 0xff) << 8ul)|((D) & 0xff)) - -#define CARRYSET (0x00200000) - -/*----------------------------------------------------------- -** -** SCSI constants. -** -**----------------------------------------------------------- -*/ - -/* -** Messages -*/ - -#define M_COMPLETE COMMAND_COMPLETE -#define M_EXTENDED EXTENDED_MESSAGE -#define M_SAVE_DP SAVE_POINTERS -#define M_RESTORE_DP RESTORE_POINTERS -#define M_DISCONNECT DISCONNECT -#define M_ID_ERROR INITIATOR_ERROR -#define M_ABORT ABORT_TASK_SET -#define M_REJECT MESSAGE_REJECT -#define M_NOOP NOP -#define M_PARITY MSG_PARITY_ERROR -#define M_LCOMPLETE LINKED_CMD_COMPLETE -#define M_FCOMPLETE LINKED_FLG_CMD_COMPLETE -#define M_RESET TARGET_RESET -#define M_ABORT_TAG ABORT_TASK -#define M_CLEAR_QUEUE CLEAR_TASK_SET -#define M_INIT_REC INITIATE_RECOVERY -#define M_REL_REC RELEASE_RECOVERY -#define M_TERMINATE (0x11) -#define M_SIMPLE_TAG SIMPLE_QUEUE_TAG -#define M_HEAD_TAG HEAD_OF_QUEUE_TAG -#define M_ORDERED_TAG ORDERED_QUEUE_TAG -#define M_IGN_RESIDUE IGNORE_WIDE_RESIDUE -#define M_IDENTIFY (0x80) - -#define M_X_MODIFY_DP EXTENDED_MODIFY_DATA_POINTER -#define M_X_SYNC_REQ EXTENDED_SDTR -#define M_X_WIDE_REQ EXTENDED_WDTR -#define M_X_PPR_REQ EXTENDED_PPR - -/* -** Status -*/ - -#define S_GOOD (0x00) -#define S_CHECK_COND (0x02) -#define S_COND_MET (0x04) -#define S_BUSY (0x08) -#define S_INT (0x10) -#define S_INT_COND_MET (0x14) -#define S_CONFLICT (0x18) -#define S_TERMINATED (0x20) -#define S_QUEUE_FULL (0x28) -#define S_ILLEGAL (0xff) -#define S_SENSE (0x80) - -/* - * End of ncrreg from FreeBSD - */ - -#endif /* defined SYM53C8XX_DEFS_H */ -- cgit v1.2.3 From 7b32b8e018d8f8cc94c808a5fa84a3f889441b91 Mon Sep 17 00:00:00 2001 From: Matthew Wilcox Date: Fri, 16 Dec 2005 21:11:37 -0700 Subject: [SCSI] Missing const in sr_vendor Fix compile warnings with current scsi-misc git tree Signed-off-by: Matthew Wilcox Signed-off-by: James Bottomley --- drivers/scsi/sr_vendor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sr_vendor.c b/drivers/scsi/sr_vendor.c index 78274dc91f5..9dde8df2f5c 100644 --- a/drivers/scsi/sr_vendor.c +++ b/drivers/scsi/sr_vendor.c @@ -68,8 +68,8 @@ void sr_vendor_init(Scsi_CD *cd) #ifndef CONFIG_BLK_DEV_SR_VENDOR cd->vendor = VENDOR_SCSI3; #else - char *vendor = cd->device->vendor; - char *model = cd->device->model; + const char *vendor = cd->device->vendor; + const char *model = cd->device->model; /* default */ cd->vendor = VENDOR_SCSI3; -- cgit v1.2.3 From 352dd1df32e672be4cff71132eb9c06a257872fe Mon Sep 17 00:00:00 2001 From: Brian Gerst Date: Tue, 27 Dec 2005 23:43:31 -0500 Subject: gitignore: misc files Ignore all files generated from *_shipped files, plus a few others. Signed-off-by: Brian Gerst Signed-off-by: Sam Ravnborg --- drivers/scsi/.gitignore | 3 +++ drivers/scsi/aic7xxx/.gitignore | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 drivers/scsi/.gitignore create mode 100644 drivers/scsi/aic7xxx/.gitignore (limited to 'drivers/scsi') diff --git a/drivers/scsi/.gitignore b/drivers/scsi/.gitignore new file mode 100644 index 00000000000..b385af31435 --- /dev/null +++ b/drivers/scsi/.gitignore @@ -0,0 +1,3 @@ +53c700_d.h +53c7xx_d.h +53c7xx_u.h diff --git a/drivers/scsi/aic7xxx/.gitignore b/drivers/scsi/aic7xxx/.gitignore new file mode 100644 index 00000000000..b8ee24d5748 --- /dev/null +++ b/drivers/scsi/aic7xxx/.gitignore @@ -0,0 +1,6 @@ +aic79xx_reg.h +aic79xx_reg_print.c +aic79xx_seq.h +aic7xxx_reg.h +aic7xxx_reg_print.c +aic7xxx_seq.h -- cgit v1.2.3 From 5f123fbd80f4f788554636f02bf73e40f914e0d6 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Fri, 11 Nov 2005 14:43:07 +0100 Subject: [PATCH] merge kobject_uevent and kobject_hotplug The distinction between hotplug and uevent does not make sense these days, netlink events are the default. udev depends entirely on netlink uevents. Only during early boot and in initramfs, /sbin/hotplug is needed. So merge the two functions and provide only one interface without all the options. The netlink layer got a nice generic interface with named slots recently, which is probably a better facility to plug events for subsystem specific events. Also the new poll() interface to /proc/mounts is a nicer way to notify about changes than sending events through the core. The uevents should only be used for driver core related requests to userspace now. Signed-off-by: Kay Sievers Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/ipr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index fa2cb3582cf..bf44a409ba0 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -2132,7 +2132,7 @@ restart: } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - kobject_uevent(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE, NULL); + kobject_hotplug(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE); LEAVE; } -- cgit v1.2.3 From 312c004d36ce6c739512bac83b452f4c20ab1f62 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Wed, 16 Nov 2005 09:00:00 +0100 Subject: [PATCH] driver core: replace "hotplug" by "uevent" Leave the overloaded "hotplug" word to susbsystems which are handling real devices. The driver core does not "plug" anything, it just exports the state to userspace and generates events. Signed-off-by: Kay Sievers Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/ipr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index bf44a409ba0..07ddf9a3875 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -2132,7 +2132,7 @@ restart: } spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); - kobject_hotplug(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE); + kobject_uevent(&ioa_cfg->host->shost_classdev.kobj, KOBJ_CHANGE); LEAVE; } -- cgit v1.2.3 From 98e4c28b7ec390c2dad6a4c69d69629c0f7e8b10 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Mon, 14 Nov 2005 21:21:18 +0100 Subject: [PATCH] pcmcia: new suspend core Move the suspend and resume methods out of the event handler, and into special functions. Also use these functions for pre- and post-reset, as almost all drivers already do, and the remaining ones can easily be converted. Bugfix to include/pcmcia/ds.c Signed-off-by: Andrew Morton Signed-off-by: Dominik Brodowski --- drivers/scsi/pcmcia/aha152x_stub.c | 48 ++++++++++------- drivers/scsi/pcmcia/fdomain_stub.c | 42 +++++++++------ drivers/scsi/pcmcia/nsp_cs.c | 102 ++++++++++++++++++++----------------- drivers/scsi/pcmcia/qlogic_stub.c | 59 ++++++++++++--------- drivers/scsi/pcmcia/sym53c500_cs.c | 69 ++++++++++++++----------- 5 files changed, 186 insertions(+), 134 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index 7c530649983..82988a3e35e 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c @@ -272,11 +272,37 @@ static void aha152x_release_cs(dev_link_t *link) link->state &= ~DEV_CONFIG; } +static int aha152x_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int aha152x_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + scsi_info_t *info = link->priv; + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + Scsi_Cmnd tmp; + pcmcia_request_configuration(link->handle, &link->conf); + tmp.device->host = info->host; + aha152x_host_reset(&tmp); + } + + return 0; +} + static int aha152x_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; - scsi_info_t *info = link->priv; DEBUG(0, "aha152x_event(0x%06x)\n", event); @@ -290,24 +316,6 @@ static int aha152x_event(event_t event, int priority, link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; aha152x_config_cs(link); break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - Scsi_Cmnd tmp; - pcmcia_request_configuration(link->handle, &link->conf); - tmp.device->host = info->host; - aha152x_host_reset(&tmp); - } - break; } return 0; } @@ -331,6 +339,8 @@ static struct pcmcia_driver aha152x_cs_driver = { .event = aha152x_event, .detach = aha152x_detach, .id_table = aha152x_ids, + .suspend = aha152x_suspend, + .resume = aha152x_resume, }; static int __init init_aha152x_cs(void) diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index db8f5cd85ff..9e1d68c1469 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c @@ -256,6 +256,30 @@ static void fdomain_release(dev_link_t *link) /*====================================================================*/ +static int fdomain_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int fdomain_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + fdomain_16x0_bus_reset(NULL); + } + + return 0; +} + static int fdomain_event(event_t event, int priority, event_callback_args_t *args) { @@ -273,22 +297,6 @@ static int fdomain_event(event_t event, int priority, link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; fdomain_config(link); break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - pcmcia_request_configuration(link->handle, &link->conf); - fdomain_16x0_bus_reset(NULL); - } - break; } return 0; } /* fdomain_event */ @@ -311,6 +319,8 @@ static struct pcmcia_driver fdomain_cs_driver = { .event = fdomain_event, .detach = fdomain_detach, .id_table = fdomain_ids, + .suspend = fdomain_suspend, + .resume = fdomain_resume, }; static int __init init_fdomain_cs(void) diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 050ea13ff80..870e87180d1 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -2021,6 +2021,59 @@ static void nsp_cs_release(dev_link_t *link) #endif } /* nsp_cs_release */ +static int nsp_cs_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + scsi_info_t *info = link->priv; + nsp_hw_data *data; + + link->state |= DEV_SUSPEND; + + nsp_dbg(NSP_DEBUG_INIT, "event: suspend"); + + if (info->host != NULL) { + nsp_msg(KERN_INFO, "clear SDTR status"); + + data = (nsp_hw_data *)info->host->hostdata; + + nsphw_init_sync(data); + } + + info->stop = 1; + + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int nsp_cs_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + scsi_info_t *info = link->priv; + nsp_hw_data *data; + + nsp_dbg(NSP_DEBUG_INIT, "event: resume"); + + link->state &= ~DEV_SUSPEND; + + if (link->state & DEV_CONFIG) + pcmcia_request_configuration(link->handle, &link->conf); + + info->stop = 0; + + if (info->host != NULL) { + nsp_msg(KERN_INFO, "reset host and bus"); + + data = (nsp_hw_data *)info->host->hostdata; + + nsphw_init (data); + nsp_bus_reset(data); + } + + return 0; +} + /*====================================================================== The card status event handler. Mostly, this schedules other @@ -2039,8 +2092,6 @@ static int nsp_cs_event(event_t event, event_callback_args_t *args) { dev_link_t *link = args->client_data; - scsi_info_t *info = link->priv; - nsp_hw_data *data; nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event); @@ -2062,51 +2113,6 @@ static int nsp_cs_event(event_t event, #endif nsp_cs_config(link); break; - - case CS_EVENT_PM_SUSPEND: - nsp_dbg(NSP_DEBUG_INIT, "event: suspend"); - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - /* Mark the device as stopped, to block IO until later */ - nsp_dbg(NSP_DEBUG_INIT, "event: reset physical"); - - if (info->host != NULL) { - nsp_msg(KERN_INFO, "clear SDTR status"); - - data = (nsp_hw_data *)info->host->hostdata; - - nsphw_init_sync(data); - } - - info->stop = 1; - if (link->state & DEV_CONFIG) { - pcmcia_release_configuration(link->handle); - } - break; - - case CS_EVENT_PM_RESUME: - nsp_dbg(NSP_DEBUG_INIT, "event: resume"); - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - nsp_dbg(NSP_DEBUG_INIT, "event: reset"); - if (link->state & DEV_CONFIG) { - pcmcia_request_configuration(link->handle, &link->conf); - } - info->stop = 0; - - if (info->host != NULL) { - nsp_msg(KERN_INFO, "reset host and bus"); - - data = (nsp_hw_data *)info->host->hostdata; - - nsphw_init (data); - nsp_bus_reset(data); - } - - break; - default: nsp_dbg(NSP_DEBUG_INIT, "event: unknown"); break; @@ -2140,6 +2146,8 @@ static struct pcmcia_driver nsp_driver = { .event = nsp_cs_event, .detach = nsp_cs_detach, .id_table = nsp_cs_ids, + .suspend = nsp_cs_suspend, + .resume = nsp_cs_resume, }; #endif diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index bb091a45a88..2541a999a0e 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c @@ -349,6 +349,40 @@ static void qlogic_release(dev_link_t *link) /*====================================================================*/ +static int qlogic_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int qlogic_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + scsi_info_t *info = link->priv; + + pcmcia_request_configuration(link->handle, &link->conf); + if ((info->manf_id == MANFID_MACNICA) || + (info->manf_id == MANFID_PIONEER) || + (info->manf_id == 0x0098)) { + outb(0x80, link->io.BasePort1 + 0xd); + outb(0x24, link->io.BasePort1 + 0x9); + outb(0x04, link->io.BasePort1 + 0xd); + } + /* Ugggglllyyyy!!! */ + qlogicfas408_bus_reset(NULL); + } + + return 0; +} + static int qlogic_event(event_t event, int priority, event_callback_args_t * args) { dev_link_t *link = args->client_data; @@ -365,29 +399,6 @@ static int qlogic_event(event_t event, int priority, event_callback_args_t * arg link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; qlogic_config(link); break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - scsi_info_t *info = link->priv; - pcmcia_request_configuration(link->handle, &link->conf); - if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { - outb(0x80, link->io.BasePort1 + 0xd); - outb(0x24, link->io.BasePort1 + 0x9); - outb(0x04, link->io.BasePort1 + 0xd); - } - /* Ugggglllyyyy!!! */ - qlogicfas408_bus_reset(NULL); - } - break; } return 0; } /* qlogic_event */ @@ -423,6 +434,8 @@ static struct pcmcia_driver qlogic_cs_driver = { .event = qlogic_event, .detach = qlogic_detach, .id_table = qlogic_ids, + .suspend = qlogic_suspend, + .resume = qlogic_resume, }; static int __init init_qlogic_cs(void) diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index 98b64b2aa8e..c4e3e2294c6 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c @@ -872,11 +872,48 @@ cs_failed: return; } /* SYM53C500_config */ +static int sym53c500_suspend(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + + link->state |= DEV_SUSPEND; + if (link->state & DEV_CONFIG) + pcmcia_release_configuration(link->handle); + + return 0; +} + +static int sym53c500_resume(struct pcmcia_device *dev) +{ + dev_link_t *link = dev_to_instance(dev); + struct scsi_info_t *info = link->priv; + + link->state &= ~DEV_SUSPEND; + if (link->state & DEV_CONFIG) { + pcmcia_request_configuration(link->handle, &link->conf); + + /* See earlier comment about manufacturer IDs. */ + if ((info->manf_id == MANFID_MACNICA) || + (info->manf_id == MANFID_PIONEER) || + (info->manf_id == 0x0098)) { + outb(0x80, link->io.BasePort1 + 0xd); + outb(0x24, link->io.BasePort1 + 0x9); + outb(0x04, link->io.BasePort1 + 0xd); + } + /* + * If things don't work after a "resume", + * this is a good place to start looking. + */ + SYM53C500_int_host_reset(link->io.BasePort1); + } + + return 0; +} + static int SYM53C500_event(event_t event, int priority, event_callback_args_t *args) { dev_link_t *link = args->client_data; - struct scsi_info_t *info = link->priv; DEBUG(1, "SYM53C500_event(0x%06x)\n", event); @@ -890,34 +927,6 @@ SYM53C500_event(event_t event, int priority, event_callback_args_t *args) link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; SYM53C500_config(link); break; - case CS_EVENT_PM_SUSPEND: - link->state |= DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_RESET_PHYSICAL: - if (link->state & DEV_CONFIG) - pcmcia_release_configuration(link->handle); - break; - case CS_EVENT_PM_RESUME: - link->state &= ~DEV_SUSPEND; - /* Fall through... */ - case CS_EVENT_CARD_RESET: - if (link->state & DEV_CONFIG) { - pcmcia_request_configuration(link->handle, &link->conf); - /* See earlier comment about manufacturer IDs. */ - if ((info->manf_id == MANFID_MACNICA) || - (info->manf_id == MANFID_PIONEER) || - (info->manf_id == 0x0098)) { - outb(0x80, link->io.BasePort1 + 0xd); - outb(0x24, link->io.BasePort1 + 0x9); - outb(0x04, link->io.BasePort1 + 0xd); - } - /* - * If things don't work after a "resume", - * this is a good place to start looking. - */ - SYM53C500_int_host_reset(link->io.BasePort1); - } - break; } return 0; } /* SYM53C500_event */ @@ -1012,6 +1021,8 @@ static struct pcmcia_driver sym53c500_cs_driver = { .event = SYM53C500_event, .detach = SYM53C500_detach, .id_table = sym53c500_ids, + .suspend = sym53c500_suspend, + .resume = sym53c500_resume, }; static int __init -- cgit v1.2.3 From cc3b4866bee996c922e875b8c8efe9f0d8803aae Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Mon, 14 Nov 2005 21:23:14 +0100 Subject: [PATCH] pcmcia: unify detach, REMOVAL_EVENT handlers into one remove callback Unify the "detach" and REMOVAL_EVENT handlers to one "remove" function. Old functionality is preserved, for the moment. Signed-off-by: Dominik Brodowski --- drivers/scsi/pcmcia/aha152x_stub.c | 17 +++++------------ drivers/scsi/pcmcia/fdomain_stub.c | 17 +++++------------ drivers/scsi/pcmcia/nsp_cs.c | 23 ++++++----------------- drivers/scsi/pcmcia/nsp_cs.h | 2 +- drivers/scsi/pcmcia/qlogic_stub.c | 17 +++++------------ drivers/scsi/pcmcia/sym53c500_cs.c | 15 ++++----------- 6 files changed, 26 insertions(+), 65 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index 82988a3e35e..3128ba8c57a 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c @@ -99,7 +99,7 @@ static int aha152x_event(event_t event, int priority, event_callback_args_t *args); static dev_link_t *aha152x_attach(void); -static void aha152x_detach(dev_link_t *); +static void aha152x_detach(struct pcmcia_device *p_dev); static dev_link_t *dev_list; static dev_info_t dev_info = "aha152x_cs"; @@ -138,7 +138,7 @@ static dev_link_t *aha152x_attach(void) ret = pcmcia_register_client(&link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); - aha152x_detach(link); + aha152x_detach(link->handle); return NULL; } @@ -147,8 +147,9 @@ static dev_link_t *aha152x_attach(void) /*====================================================================*/ -static void aha152x_detach(dev_link_t *link) +static void aha152x_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); dev_link_t **linkp; DEBUG(0, "aha152x_detach(0x%p)\n", link); @@ -162,9 +163,6 @@ static void aha152x_detach(dev_link_t *link) if (link->state & DEV_CONFIG) aha152x_release_cs(link); - if (link->handle) - pcmcia_deregister_client(link->handle); - /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); @@ -307,11 +305,6 @@ static int aha152x_event(event_t event, int priority, DEBUG(0, "aha152x_event(0x%06x)\n", event); switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - aha152x_release_cs(link); - break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; aha152x_config_cs(link); @@ -337,7 +330,7 @@ static struct pcmcia_driver aha152x_cs_driver = { }, .attach = aha152x_attach, .event = aha152x_event, - .detach = aha152x_detach, + .remove = aha152x_detach, .id_table = aha152x_ids, .suspend = aha152x_suspend, .resume = aha152x_resume, diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 9e1d68c1469..5842c938fff 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c @@ -84,7 +84,7 @@ static int fdomain_event(event_t event, int priority, event_callback_args_t *args); static dev_link_t *fdomain_attach(void); -static void fdomain_detach(dev_link_t *); +static void fdomain_detach(struct pcmcia_device *p_dev); static dev_link_t *dev_list = NULL; @@ -124,7 +124,7 @@ static dev_link_t *fdomain_attach(void) ret = pcmcia_register_client(&link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); - fdomain_detach(link); + fdomain_detach(link->handle); return NULL; } @@ -133,8 +133,9 @@ static dev_link_t *fdomain_attach(void) /*====================================================================*/ -static void fdomain_detach(dev_link_t *link) +static void fdomain_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); dev_link_t **linkp; DEBUG(0, "fdomain_detach(0x%p)\n", link); @@ -148,9 +149,6 @@ static void fdomain_detach(dev_link_t *link) if (link->state & DEV_CONFIG) fdomain_release(link); - if (link->handle) - pcmcia_deregister_client(link->handle); - /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); @@ -288,11 +286,6 @@ static int fdomain_event(event_t event, int priority, DEBUG(1, "fdomain_event(0x%06x)\n", event); switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - fdomain_release(link); - break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; fdomain_config(link); @@ -317,7 +310,7 @@ static struct pcmcia_driver fdomain_cs_driver = { }, .attach = fdomain_attach, .event = fdomain_event, - .detach = fdomain_detach, + .remove = fdomain_detach, .id_table = fdomain_ids, .suspend = fdomain_suspend, .resume = fdomain_resume, diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index 870e87180d1..e40a8c22aa9 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -1646,7 +1646,7 @@ static dev_link_t *nsp_cs_attach(void) ret = pcmcia_register_client(&link->handle, &client_reg); if (ret != CS_SUCCESS) { cs_error(link->handle, RegisterClient, ret); - nsp_cs_detach(link); + nsp_cs_detach(link->handle); return NULL; } @@ -1662,8 +1662,9 @@ static dev_link_t *nsp_cs_attach(void) structures are freed. Otherwise, the structures will be freed when the device is released. ======================================================================*/ -static void nsp_cs_detach(dev_link_t *link) +static void nsp_cs_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); dev_link_t **linkp; nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); @@ -1678,12 +1679,9 @@ static void nsp_cs_detach(dev_link_t *link) return; } - if (link->state & DEV_CONFIG) + if (link->state & DEV_CONFIG) { + ((scsi_info_t *)link->priv)->stop = 1; nsp_cs_release(link); - - /* Break the link with Card Services */ - if (link->handle) { - pcmcia_deregister_client(link->handle); } /* Unlink device structure, free bits */ @@ -2096,15 +2094,6 @@ static int nsp_cs_event(event_t event, nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event); switch (event) { - case CS_EVENT_CARD_REMOVAL: - nsp_dbg(NSP_DEBUG_INIT, "event: remove"); - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) { - ((scsi_info_t *)link->priv)->stop = 1; - nsp_cs_release(link); - } - break; - case CS_EVENT_CARD_INSERTION: nsp_dbg(NSP_DEBUG_INIT, "event: insert"); link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; @@ -2144,7 +2133,7 @@ static struct pcmcia_driver nsp_driver = { }, .attach = nsp_cs_attach, .event = nsp_cs_event, - .detach = nsp_cs_detach, + .remove = nsp_cs_detach, .id_table = nsp_cs_ids, .suspend = nsp_cs_suspend, .resume = nsp_cs_resume, diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index f8b94308271..d276c469edf 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -297,7 +297,7 @@ typedef struct _nsp_hw_data { /* Card service functions */ static dev_link_t *nsp_cs_attach (void); -static void nsp_cs_detach (dev_link_t *link); +static void nsp_cs_detach (struct pcmcia_device *p_dev); static void nsp_cs_release(dev_link_t *link); static void nsp_cs_config (dev_link_t *link); static int nsp_cs_event (event_t event, int priority, event_callback_args_t *args); diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index 2541a999a0e..8351dc234ff 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c @@ -101,7 +101,7 @@ static void qlogic_release(dev_link_t *link); static int qlogic_event(event_t event, int priority, event_callback_args_t * args); static dev_link_t *qlogic_attach(void); -static void qlogic_detach(dev_link_t *); +static void qlogic_detach(struct pcmcia_device *p_dev); static dev_link_t *dev_list = NULL; @@ -198,7 +198,7 @@ static dev_link_t *qlogic_attach(void) ret = pcmcia_register_client(&link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); - qlogic_detach(link); + qlogic_detach(link->handle); return NULL; } @@ -207,8 +207,9 @@ static dev_link_t *qlogic_attach(void) /*====================================================================*/ -static void qlogic_detach(dev_link_t * link) +static void qlogic_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); dev_link_t **linkp; DEBUG(0, "qlogic_detach(0x%p)\n", link); @@ -223,9 +224,6 @@ static void qlogic_detach(dev_link_t * link) if (link->state & DEV_CONFIG) qlogic_release(link); - if (link->handle) - pcmcia_deregister_client(link->handle); - /* Unlink device structure, free bits */ *linkp = link->next; kfree(link->priv); @@ -390,11 +388,6 @@ static int qlogic_event(event_t event, int priority, event_callback_args_t * arg DEBUG(1, "qlogic_event(0x%06x)\n", event); switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - qlogic_release(link); - break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; qlogic_config(link); @@ -432,7 +425,7 @@ static struct pcmcia_driver qlogic_cs_driver = { }, .attach = qlogic_attach, .event = qlogic_event, - .detach = qlogic_detach, + .remove = qlogic_detach, .id_table = qlogic_ids, .suspend = qlogic_suspend, .resume = qlogic_resume, diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index c4e3e2294c6..a0f8e2691f9 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c @@ -918,11 +918,6 @@ SYM53C500_event(event_t event, int priority, event_callback_args_t *args) DEBUG(1, "SYM53C500_event(0x%06x)\n", event); switch (event) { - case CS_EVENT_CARD_REMOVAL: - link->state &= ~DEV_PRESENT; - if (link->state & DEV_CONFIG) - SYM53C500_release(link); - break; case CS_EVENT_CARD_INSERTION: link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; SYM53C500_config(link); @@ -932,8 +927,9 @@ SYM53C500_event(event_t event, int priority, event_callback_args_t *args) } /* SYM53C500_event */ static void -SYM53C500_detach(dev_link_t *link) +SYM53C500_detach(struct pcmcia_device *p_dev) { + dev_link_t *link = dev_to_instance(p_dev); dev_link_t **linkp; DEBUG(0, "SYM53C500_detach(0x%p)\n", link); @@ -948,9 +944,6 @@ SYM53C500_detach(dev_link_t *link) if (link->state & DEV_CONFIG) SYM53C500_release(link); - if (link->handle) - pcmcia_deregister_client(link->handle); - /* Unlink device structure, free bits. */ *linkp = link->next; kfree(link->priv); @@ -993,7 +986,7 @@ SYM53C500_attach(void) ret = pcmcia_register_client(&link->handle, &client_reg); if (ret != 0) { cs_error(link->handle, RegisterClient, ret); - SYM53C500_detach(link); + SYM53C500_detach(link->handle); return NULL; } @@ -1019,7 +1012,7 @@ static struct pcmcia_driver sym53c500_cs_driver = { }, .attach = SYM53C500_attach, .event = SYM53C500_event, - .detach = SYM53C500_detach, + .remove = SYM53C500_detach, .id_table = sym53c500_ids, .suspend = sym53c500_suspend, .resume = sym53c500_resume, -- cgit v1.2.3 From b463581154f3f3eecda27cae60df813fefcd84d3 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Mon, 14 Nov 2005 21:25:35 +0100 Subject: [PATCH] pcmcia: remove dev_list from drivers The linked list of devices managed by each PCMCIA driver is, in very most cases, unused. Therefore, remove it from many drivers. Signed-off-by: Dominik Brodowski --- drivers/scsi/pcmcia/fdomain_stub.c | 30 ++++++++---------------------- drivers/scsi/pcmcia/nsp_cs.c | 19 +------------------ drivers/scsi/pcmcia/qlogic_stub.c | 16 +--------------- drivers/scsi/pcmcia/sym53c500_cs.c | 14 +------------- 4 files changed, 11 insertions(+), 68 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 5842c938fff..538fedb9792 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c @@ -87,8 +87,6 @@ static dev_link_t *fdomain_attach(void); static void fdomain_detach(struct pcmcia_device *p_dev); -static dev_link_t *dev_list = NULL; - static dev_info_t dev_info = "fdomain_cs"; static dev_link_t *fdomain_attach(void) @@ -116,8 +114,7 @@ static dev_link_t *fdomain_attach(void) link->conf.Present = PRESENT_OPTION; /* Register with Card Services */ - link->next = dev_list; - dev_list = link; + link->next = NULL; client_reg.dev_info = &dev_info; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; @@ -135,24 +132,14 @@ static dev_link_t *fdomain_attach(void) static void fdomain_detach(struct pcmcia_device *p_dev) { - dev_link_t *link = dev_to_instance(p_dev); - dev_link_t **linkp; + dev_link_t *link = dev_to_instance(p_dev); - DEBUG(0, "fdomain_detach(0x%p)\n", link); - - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) - if (*linkp == link) break; - if (*linkp == NULL) - return; - - if (link->state & DEV_CONFIG) - fdomain_release(link); - - /* Unlink device structure, free bits */ - *linkp = link->next; - kfree(link->priv); - + DEBUG(0, "fdomain_detach(0x%p)\n", link); + + if (link->state & DEV_CONFIG) + fdomain_release(link); + + kfree(link->priv); } /* fdomain_detach */ /*====================================================================*/ @@ -324,7 +311,6 @@ static int __init init_fdomain_cs(void) static void __exit exit_fdomain_cs(void) { pcmcia_unregister_driver(&fdomain_cs_driver); - BUG_ON(dev_list != NULL); } module_init(init_fdomain_cs); diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index e40a8c22aa9..e48e9fb3c58 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -104,7 +104,6 @@ static struct scsi_host_template nsp_driver_template = { #endif }; -static dev_link_t *dev_list = NULL; static dev_info_t dev_info = {"nsp_cs"}; static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ @@ -1638,8 +1637,7 @@ static dev_link_t *nsp_cs_attach(void) /* Register with Card Services */ - link->next = dev_list; - dev_list = link; + link->next = NULL; client_reg.dev_info = &dev_info; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; @@ -1665,30 +1663,16 @@ static dev_link_t *nsp_cs_attach(void) static void nsp_cs_detach(struct pcmcia_device *p_dev) { dev_link_t *link = dev_to_instance(p_dev); - dev_link_t **linkp; nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { - if (*linkp == link) { - break; - } - } - if (*linkp == NULL) { - return; - } - if (link->state & DEV_CONFIG) { ((scsi_info_t *)link->priv)->stop = 1; nsp_cs_release(link); } - /* Unlink device structure, free bits */ - *linkp = link->next; kfree(link->priv); link->priv = NULL; - } /* nsp_cs_detach */ @@ -2168,7 +2152,6 @@ static void __exit nsp_cs_exit(void) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) pcmcia_unregister_driver(&nsp_driver); - BUG_ON(dev_list != NULL); #else unregister_pcmcia_driver(&dev_info); /* XXX: this really needs to move into generic code.. */ diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index 8351dc234ff..e10281a6e5f 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c @@ -104,8 +104,6 @@ static dev_link_t *qlogic_attach(void); static void qlogic_detach(struct pcmcia_device *p_dev); -static dev_link_t *dev_list = NULL; - static dev_info_t dev_info = "qlogic_cs"; static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host, @@ -190,8 +188,7 @@ static dev_link_t *qlogic_attach(void) link->conf.Present = PRESENT_OPTION; /* Register with Card Services */ - link->next = dev_list; - dev_list = link; + link->next = NULL; client_reg.dev_info = &dev_info; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; @@ -210,22 +207,12 @@ static dev_link_t *qlogic_attach(void) static void qlogic_detach(struct pcmcia_device *p_dev) { dev_link_t *link = dev_to_instance(p_dev); - dev_link_t **linkp; DEBUG(0, "qlogic_detach(0x%p)\n", link); - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) - if (*linkp == link) - break; - if (*linkp == NULL) - return; - if (link->state & DEV_CONFIG) qlogic_release(link); - /* Unlink device structure, free bits */ - *linkp = link->next; kfree(link->priv); } /* qlogic_detach */ @@ -439,7 +426,6 @@ static int __init init_qlogic_cs(void) static void __exit exit_qlogic_cs(void) { pcmcia_unregister_driver(&qlogic_cs_driver); - BUG_ON(dev_list != NULL); } MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index a0f8e2691f9..87d50b33475 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c @@ -232,7 +232,6 @@ enum Phase { * Global (within this module) variables other than * sym53c500_driver_template (the scsi_host_template). */ -static dev_link_t *dev_list; static dev_info_t dev_info = "sym53c500_cs"; /* ================================================================== */ @@ -930,22 +929,12 @@ static void SYM53C500_detach(struct pcmcia_device *p_dev) { dev_link_t *link = dev_to_instance(p_dev); - dev_link_t **linkp; DEBUG(0, "SYM53C500_detach(0x%p)\n", link); - /* Locate device structure */ - for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) - if (*linkp == link) - break; - if (*linkp == NULL) - return; - if (link->state & DEV_CONFIG) SYM53C500_release(link); - /* Unlink device structure, free bits. */ - *linkp = link->next; kfree(link->priv); link->priv = NULL; } /* SYM53C500_detach */ @@ -978,8 +967,7 @@ SYM53C500_attach(void) link->conf.Present = PRESENT_OPTION; /* Register with Card Services */ - link->next = dev_list; - dev_list = link; + link->next = NULL; client_reg.dev_info = &dev_info; client_reg.Version = 0x0210; client_reg.event_callback_args.client_data = link; -- cgit v1.2.3 From f8cfa618dccbdc6dab5297f75779566a388a98fd Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Mon, 14 Nov 2005 21:25:51 +0100 Subject: [PATCH] pcmcia: unify attach, EVENT_CARD_INSERTION handlers into one probe callback Unify the EVENT_CARD_INSERTION and "attach" callbacks to one unified probe() callback. As all in-kernel drivers are changed to this new callback, there will be no temporary backwards-compatibility. Inside a probe() function, each driver _must_ set struct pcmcia_device *p_dev->instance and instance->handle correctly. With these patches, the basic driver interface for 16-bit PCMCIA drivers now has the classic four callbacks known also from other buses: int (*probe) (struct pcmcia_device *dev); void (*remove) (struct pcmcia_device *dev); int (*suspend) (struct pcmcia_device *dev); int (*resume) (struct pcmcia_device *dev); Signed-off-by: Dominik Brodowski --- drivers/scsi/pcmcia/aha152x_stub.c | 52 +++++++---------------------- drivers/scsi/pcmcia/fdomain_stub.c | 56 +++++++------------------------ drivers/scsi/pcmcia/nsp_cs.c | 67 +++++--------------------------------- drivers/scsi/pcmcia/nsp_cs.h | 2 -- drivers/scsi/pcmcia/qlogic_stub.c | 49 ++++++---------------------- drivers/scsi/pcmcia/sym53c500_cs.c | 53 ++++++------------------------ 6 files changed, 51 insertions(+), 228 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c index 3128ba8c57a..0c9edb7051f 100644 --- a/drivers/scsi/pcmcia/aha152x_stub.c +++ b/drivers/scsi/pcmcia/aha152x_stub.c @@ -95,27 +95,21 @@ typedef struct scsi_info_t { } scsi_info_t; static void aha152x_release_cs(dev_link_t *link); -static int aha152x_event(event_t event, int priority, - event_callback_args_t *args); - -static dev_link_t *aha152x_attach(void); static void aha152x_detach(struct pcmcia_device *p_dev); +static void aha152x_config_cs(dev_link_t *link); static dev_link_t *dev_list; -static dev_info_t dev_info = "aha152x_cs"; -static dev_link_t *aha152x_attach(void) +static int aha152x_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; - client_reg_t client_reg; dev_link_t *link; - int ret; DEBUG(0, "aha152x_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) return NULL; + if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; @@ -129,20 +123,13 @@ static dev_link_t *aha152x_attach(void) link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - /* Register with Card Services */ - link->next = dev_list; - dev_list = link; - client_reg.dev_info = &dev_info; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - cs_error(link->handle, RegisterClient, ret); - aha152x_detach(link->handle); - return NULL; - } - - return link; + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + aha152x_config_cs(link); + + return 0; } /* aha152x_attach */ /*====================================================================*/ @@ -297,22 +284,6 @@ static int aha152x_resume(struct pcmcia_device *dev) return 0; } -static int aha152x_event(event_t event, int priority, - event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - - DEBUG(0, "aha152x_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - aha152x_config_cs(link); - break; - } - return 0; -} - static struct pcmcia_device_id aha152x_ids[] = { PCMCIA_DEVICE_PROD_ID123("New Media", "SCSI", "Bus Toaster", 0xcdf7e4cc, 0x35f26476, 0xa8851d6e), PCMCIA_DEVICE_PROD_ID123("NOTEWORTHY", "SCSI", "Bus Toaster", 0xad89c6e8, 0x35f26476, 0xa8851d6e), @@ -328,8 +299,7 @@ static struct pcmcia_driver aha152x_cs_driver = { .drv = { .name = "aha152x_cs", }, - .attach = aha152x_attach, - .event = aha152x_event, + .probe = aha152x_attach, .remove = aha152x_detach, .id_table = aha152x_ids, .suspend = aha152x_suspend, diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 538fedb9792..788c58d805f 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c @@ -80,27 +80,19 @@ typedef struct scsi_info_t { static void fdomain_release(dev_link_t *link); -static int fdomain_event(event_t event, int priority, - event_callback_args_t *args); - -static dev_link_t *fdomain_attach(void); static void fdomain_detach(struct pcmcia_device *p_dev); +static void fdomain_config(dev_link_t *link); - -static dev_info_t dev_info = "fdomain_cs"; - -static dev_link_t *fdomain_attach(void) +static int fdomain_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; - client_reg_t client_reg; dev_link_t *link; - int ret; - + DEBUG(0, "fdomain_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); - if (!info) return NULL; + if (!info) return -ENOMEM; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; link->io.NumPorts1 = 0x10; @@ -113,19 +105,13 @@ static dev_link_t *fdomain_attach(void) link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - /* Register with Card Services */ - link->next = NULL; - client_reg.dev_info = &dev_info; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - cs_error(link->handle, RegisterClient, ret); - fdomain_detach(link->handle); - return NULL; - } - - return link; + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + fdomain_config(link); + + return 0; } /* fdomain_attach */ /*====================================================================*/ @@ -265,23 +251,6 @@ static int fdomain_resume(struct pcmcia_device *dev) return 0; } -static int fdomain_event(event_t event, int priority, - event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - - DEBUG(1, "fdomain_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - fdomain_config(link); - break; - } - return 0; -} /* fdomain_event */ - - static struct pcmcia_device_id fdomain_ids[] = { PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88, 0x859cad20), PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e), @@ -295,8 +264,7 @@ static struct pcmcia_driver fdomain_cs_driver = { .drv = { .name = "fdomain_cs", }, - .attach = fdomain_attach, - .event = fdomain_event, + .probe = fdomain_attach, .remove = fdomain_detach, .id_table = fdomain_ids, .suspend = fdomain_suspend, diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index e48e9fb3c58..9e3ab3fd535 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c @@ -104,8 +104,6 @@ static struct scsi_host_template nsp_driver_template = { #endif }; -static dev_info_t dev_info = {"nsp_cs"}; - static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ @@ -1595,19 +1593,17 @@ static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt) configure the card at this point -- we wait until we receive a card insertion event. ======================================================================*/ -static dev_link_t *nsp_cs_attach(void) +static int nsp_cs_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; - client_reg_t client_reg; dev_link_t *link; - int ret; nsp_hw_data *data = &nsp_data_base; nsp_dbg(NSP_DEBUG_INIT, "in"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); - if (info == NULL) { return NULL; } + if (info == NULL) { return -ENOMEM; } memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; @@ -1635,22 +1631,14 @@ static dev_link_t *nsp_cs_attach(void) link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; + link->handle = p_dev; + p_dev->instance = link; - /* Register with Card Services */ - link->next = NULL; - client_reg.dev_info = &dev_info; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != CS_SUCCESS) { - cs_error(link->handle, RegisterClient, ret); - nsp_cs_detach(link->handle); - return NULL; - } - + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + nsp_cs_config(link); nsp_dbg(NSP_DEBUG_INIT, "link=0x%p", link); - return link; + return 0; } /* nsp_cs_attach */ @@ -2056,44 +2044,6 @@ static int nsp_cs_resume(struct pcmcia_device *dev) return 0; } -/*====================================================================== - - The card status event handler. Mostly, this schedules other - stuff to run after an event is received. A CARD_REMOVAL event - also sets some flags to discourage the net drivers from trying - to talk to the card any more. - - When a CARD_REMOVAL event is received, we immediately set a flag - to block future accesses to this device. All the functions that - actually access the device should check this flag to make sure - the card is still present. - -======================================================================*/ -static int nsp_cs_event(event_t event, - int priority, - event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - - nsp_dbg(NSP_DEBUG_INIT, "in, event=0x%08x", event); - - switch (event) { - case CS_EVENT_CARD_INSERTION: - nsp_dbg(NSP_DEBUG_INIT, "event: insert"); - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,68)) - info->bus = args->bus; -#endif - nsp_cs_config(link); - break; - default: - nsp_dbg(NSP_DEBUG_INIT, "event: unknown"); - break; - } - nsp_dbg(NSP_DEBUG_INIT, "end"); - return 0; -} /* nsp_cs_event */ - /*======================================================================* * module entry point *====================================================================*/ @@ -2115,8 +2065,7 @@ static struct pcmcia_driver nsp_driver = { .drv = { .name = "nsp_cs", }, - .attach = nsp_cs_attach, - .event = nsp_cs_event, + .probe = nsp_cs_attach, .remove = nsp_cs_detach, .id_table = nsp_cs_ids, .suspend = nsp_cs_suspend, diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h index d276c469edf..b66b140a745 100644 --- a/drivers/scsi/pcmcia/nsp_cs.h +++ b/drivers/scsi/pcmcia/nsp_cs.h @@ -296,11 +296,9 @@ typedef struct _nsp_hw_data { */ /* Card service functions */ -static dev_link_t *nsp_cs_attach (void); static void nsp_cs_detach (struct pcmcia_device *p_dev); static void nsp_cs_release(dev_link_t *link); static void nsp_cs_config (dev_link_t *link); -static int nsp_cs_event (event_t event, int priority, event_callback_args_t *args); /* Linux SCSI subsystem specific functions */ static struct Scsi_Host *nsp_detect (struct scsi_host_template *sht); diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index e10281a6e5f..dce7e687fd4 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c @@ -98,13 +98,8 @@ typedef struct scsi_info_t { } scsi_info_t; static void qlogic_release(dev_link_t *link); -static int qlogic_event(event_t event, int priority, event_callback_args_t * args); - -static dev_link_t *qlogic_attach(void); static void qlogic_detach(struct pcmcia_device *p_dev); - - -static dev_info_t dev_info = "qlogic_cs"; +static void qlogic_config(dev_link_t * link); static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host, dev_link_t *link, int qbase, int qlirq) @@ -161,19 +156,17 @@ free_scsi_host: err: return NULL; } -static dev_link_t *qlogic_attach(void) +static int qlogic_attach(struct pcmcia_device *p_dev) { scsi_info_t *info; - client_reg_t client_reg; dev_link_t *link; - int ret; DEBUG(0, "qlogic_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) - return NULL; + return -ENOMEM; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; @@ -187,19 +180,13 @@ static dev_link_t *qlogic_attach(void) link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - /* Register with Card Services */ - link->next = NULL; - client_reg.dev_info = &dev_info; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - cs_error(link->handle, RegisterClient, ret); - qlogic_detach(link->handle); - return NULL; - } + link->handle = p_dev; + p_dev->instance = link; + + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + qlogic_config(link); - return link; + return 0; } /* qlogic_attach */ /*====================================================================*/ @@ -368,21 +355,6 @@ static int qlogic_resume(struct pcmcia_device *dev) return 0; } -static int qlogic_event(event_t event, int priority, event_callback_args_t * args) -{ - dev_link_t *link = args->client_data; - - DEBUG(1, "qlogic_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - qlogic_config(link); - break; - } - return 0; -} /* qlogic_event */ - static struct pcmcia_device_id qlogic_ids[] = { PCMCIA_DEVICE_PROD_ID12("EIger Labs", "PCMCIA-to-SCSI Adapter", 0x88395fa7, 0x33b7a5e6), PCMCIA_DEVICE_PROD_ID12("EPSON", "SCSI-2 PC Card SC200", 0xd361772f, 0x299d1751), @@ -410,8 +382,7 @@ static struct pcmcia_driver qlogic_cs_driver = { .drv = { .name = "qlogic_cs", }, - .attach = qlogic_attach, - .event = qlogic_event, + .probe = qlogic_attach, .remove = qlogic_detach, .id_table = qlogic_ids, .suspend = qlogic_suspend, diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index 87d50b33475..3a4dd6f5b81 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c @@ -228,14 +228,6 @@ enum Phase { /* ================================================================== */ -/* -* Global (within this module) variables other than -* sym53c500_driver_template (the scsi_host_template). -*/ -static dev_info_t dev_info = "sym53c500_cs"; - -/* ================================================================== */ - static void chip_init(int io_port) { @@ -909,22 +901,6 @@ static int sym53c500_resume(struct pcmcia_device *dev) return 0; } -static int -SYM53C500_event(event_t event, int priority, event_callback_args_t *args) -{ - dev_link_t *link = args->client_data; - - DEBUG(1, "SYM53C500_event(0x%06x)\n", event); - - switch (event) { - case CS_EVENT_CARD_INSERTION: - link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; - SYM53C500_config(link); - break; - } - return 0; -} /* SYM53C500_event */ - static void SYM53C500_detach(struct pcmcia_device *p_dev) { @@ -939,20 +915,18 @@ SYM53C500_detach(struct pcmcia_device *p_dev) link->priv = NULL; } /* SYM53C500_detach */ -static dev_link_t * -SYM53C500_attach(void) +static int +SYM53C500_attach(struct pcmcia_device *p_dev) { struct scsi_info_t *info; - client_reg_t client_reg; dev_link_t *link; - int ret; DEBUG(0, "SYM53C500_attach()\n"); /* Create new SCSI device */ info = kmalloc(sizeof(*info), GFP_KERNEL); if (!info) - return NULL; + return -ENOMEM; memset(info, 0, sizeof(*info)); link = &info->link; link->priv = info; @@ -966,19 +940,13 @@ SYM53C500_attach(void) link->conf.IntType = INT_MEMORY_AND_IO; link->conf.Present = PRESENT_OPTION; - /* Register with Card Services */ - link->next = NULL; - client_reg.dev_info = &dev_info; - client_reg.Version = 0x0210; - client_reg.event_callback_args.client_data = link; - ret = pcmcia_register_client(&link->handle, &client_reg); - if (ret != 0) { - cs_error(link->handle, RegisterClient, ret); - SYM53C500_detach(link->handle); - return NULL; - } + link->handle = p_dev; + p_dev->instance = link; - return link; + link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; + SYM53C500_config(link); + + return 0; } /* SYM53C500_attach */ MODULE_AUTHOR("Bob Tracy "); @@ -998,8 +966,7 @@ static struct pcmcia_driver sym53c500_cs_driver = { .drv = { .name = "sym53c500_cs", }, - .attach = SYM53C500_attach, - .event = SYM53C500_event, + .probe = SYM53C500_attach, .remove = SYM53C500_detach, .id_table = sym53c500_ids, .suspend = sym53c500_suspend, -- cgit v1.2.3 From 8ffdc6550c47f75ca4e6c9f30a2a89063e035cf2 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 6 Jan 2006 09:49:03 +0100 Subject: [BLOCK] add @uptodate to end_that_request_last() and @error to rq_end_io_fn() add @uptodate argument to end_that_request_last() and @error to rq_end_io_fn(). there's no generic way to pass error code to request completion function, making generic error handling of non-fs request difficult (rq->errors is driver-specific and each driver uses it differently). this patch adds @uptodate to end_that_request_last() and @error to rq_end_io_fn(). for fs requests, this doesn't really matter, so just using the same uptodate argument used in the last call to end_that_request_first() should suffice. imho, this can also help the generic command-carrying request jens is working on. Signed-off-by: tejun heo Signed-Off-By: Jens Axboe --- drivers/scsi/ide-scsi.c | 4 ++-- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/sd.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 4cb1f3ed910..3c688ef5466 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c @@ -1046,7 +1046,7 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) /* kill current request */ blkdev_dequeue_request(req); - end_that_request_last(req); + end_that_request_last(req, 0); if (req->flags & REQ_SENSE) kfree(scsi->pc->buffer); kfree(scsi->pc); @@ -1056,7 +1056,7 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd) /* now nuke the drive queue */ while ((req = elv_next_request(drive->queue))) { blkdev_dequeue_request(req); - end_that_request_last(req); + end_that_request_last(req, 0); } HWGROUP(drive)->rq = NULL; diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index a7f3f0c84db..53551f1dfe2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -791,7 +791,7 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int uptodate, spin_lock_irqsave(q->queue_lock, flags); if (blk_rq_tagged(req)) blk_queue_end_tag(q, req); - end_that_request_last(req); + end_that_request_last(req, uptodate); spin_unlock_irqrestore(q->queue_lock, flags); /* diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 3d3ad7d1b77..d651150ee76 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -748,7 +748,7 @@ static void sd_end_flush(request_queue_t *q, struct request *flush_rq) * force journal abort of barriers */ end_that_request_first(rq, -EOPNOTSUPP, rq->hard_nr_sectors); - end_that_request_last(rq); + end_that_request_last(rq, -EOPNOTSUPP); } } -- cgit v1.2.3 From 461d4e90c8cd049718884cd17c955e231140d3be Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 6 Jan 2006 09:52:55 +0100 Subject: [BLOCK] update SCSI to use new blk_ordered for barriers All ordered request related stuff delegated to HLD. Midlayer now doens't deal with ordered setting or prepare_flush callback. sd.c updated to deal with blk_queue_ordered setting. Currently, ordered tag isn't used as SCSI midlayer cannot guarantee request ordering. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- drivers/scsi/hosts.c | 9 -------- drivers/scsi/scsi_lib.c | 46 --------------------------------------- drivers/scsi/sd.c | 58 +++++++++++++++++-------------------------------- 3 files changed, 20 insertions(+), 93 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 5b9c2c5a7f0..66783c860a1 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -347,17 +347,8 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) shost->cmd_per_lun = sht->cmd_per_lun; shost->unchecked_isa_dma = sht->unchecked_isa_dma; shost->use_clustering = sht->use_clustering; - shost->ordered_flush = sht->ordered_flush; shost->ordered_tag = sht->ordered_tag; - /* - * hosts/devices that do queueing must support ordered tags - */ - if (shost->can_queue > 1 && shost->ordered_flush) { - printk(KERN_ERR "scsi: ordered flushes don't support queueing\n"); - shost->ordered_flush = 0; - } - if (sht->max_host_blocked) shost->max_host_blocked = sht->max_host_blocked; else diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 53551f1dfe2..7a38b101976 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -932,9 +932,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes, int sense_valid = 0; int sense_deferred = 0; - if (blk_complete_barrier_rq(q, req, good_bytes >> 9)) - return; - /* * Free up any indirection buffers we allocated for DMA purposes. * For the case of a READ, we need to copy the data out of the @@ -1199,38 +1196,6 @@ static int scsi_init_io(struct scsi_cmnd *cmd) return BLKPREP_KILL; } -static int scsi_prepare_flush_fn(request_queue_t *q, struct request *rq) -{ - struct scsi_device *sdev = q->queuedata; - struct scsi_driver *drv; - - if (sdev->sdev_state == SDEV_RUNNING) { - drv = *(struct scsi_driver **) rq->rq_disk->private_data; - - if (drv->prepare_flush) - return drv->prepare_flush(q, rq); - } - - return 0; -} - -static void scsi_end_flush_fn(request_queue_t *q, struct request *rq) -{ - struct scsi_device *sdev = q->queuedata; - struct request *flush_rq = rq->end_io_data; - struct scsi_driver *drv; - - if (flush_rq->errors) { - printk("scsi: barrier error, disabling flush support\n"); - blk_queue_ordered(q, QUEUE_ORDERED_NONE); - } - - if (sdev->sdev_state == SDEV_RUNNING) { - drv = *(struct scsi_driver **) rq->rq_disk->private_data; - drv->end_flush(q, rq); - } -} - static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk, sector_t *error_sector) { @@ -1703,17 +1668,6 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) blk_queue_segment_boundary(q, shost->dma_boundary); blk_queue_issue_flush_fn(q, scsi_issue_flush_fn); - /* - * ordered tags are superior to flush ordering - */ - if (shost->ordered_tag) - blk_queue_ordered(q, QUEUE_ORDERED_TAG); - else if (shost->ordered_flush) { - blk_queue_ordered(q, QUEUE_ORDERED_FLUSH); - q->prepare_flush_fn = scsi_prepare_flush_fn; - q->end_flush_fn = scsi_end_flush_fn; - } - if (!shost->use_clustering) clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); return q; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index d651150ee76..2eefc9eb5da 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -121,8 +121,7 @@ static void sd_shutdown(struct device *dev); static void sd_rescan(struct device *); static int sd_init_command(struct scsi_cmnd *); static int sd_issue_flush(struct device *, sector_t *); -static void sd_end_flush(request_queue_t *, struct request *); -static int sd_prepare_flush(request_queue_t *, struct request *); +static void sd_prepare_flush(request_queue_t *, struct request *); static void sd_read_capacity(struct scsi_disk *sdkp, char *diskname, unsigned char *buffer); @@ -137,8 +136,6 @@ static struct scsi_driver sd_template = { .rescan = sd_rescan, .init_command = sd_init_command, .issue_flush = sd_issue_flush, - .prepare_flush = sd_prepare_flush, - .end_flush = sd_end_flush, }; /* @@ -729,42 +726,13 @@ static int sd_issue_flush(struct device *dev, sector_t *error_sector) return ret; } -static void sd_end_flush(request_queue_t *q, struct request *flush_rq) +static void sd_prepare_flush(request_queue_t *q, struct request *rq) { - struct request *rq = flush_rq->end_io_data; - struct scsi_cmnd *cmd = rq->special; - unsigned int bytes = rq->hard_nr_sectors << 9; - - if (!flush_rq->errors) { - spin_unlock(q->queue_lock); - scsi_io_completion(cmd, bytes, 0); - spin_lock(q->queue_lock); - } else if (blk_barrier_postflush(rq)) { - spin_unlock(q->queue_lock); - scsi_io_completion(cmd, 0, bytes); - spin_lock(q->queue_lock); - } else { - /* - * force journal abort of barriers - */ - end_that_request_first(rq, -EOPNOTSUPP, rq->hard_nr_sectors); - end_that_request_last(rq, -EOPNOTSUPP); - } -} - -static int sd_prepare_flush(request_queue_t *q, struct request *rq) -{ - struct scsi_device *sdev = q->queuedata; - struct scsi_disk *sdkp = dev_get_drvdata(&sdev->sdev_gendev); - - if (!sdkp || !sdkp->WCE) - return 0; - memset(rq->cmd, 0, sizeof(rq->cmd)); - rq->flags |= REQ_BLOCK_PC | REQ_SOFTBARRIER; + rq->flags |= REQ_BLOCK_PC; rq->timeout = SD_TIMEOUT; rq->cmd[0] = SYNCHRONIZE_CACHE; - return 1; + rq->cmd_len = 10; } static void sd_rescan(struct device *dev) @@ -1462,6 +1430,7 @@ static int sd_revalidate_disk(struct gendisk *disk) struct scsi_disk *sdkp = scsi_disk(disk); struct scsi_device *sdp = sdkp->device; unsigned char *buffer; + unsigned ordered; SCSI_LOG_HLQUEUE(3, printk("sd_revalidate_disk: disk=%s\n", disk->disk_name)); @@ -1498,7 +1467,20 @@ static int sd_revalidate_disk(struct gendisk *disk) sd_read_write_protect_flag(sdkp, disk->disk_name, buffer); sd_read_cache_type(sdkp, disk->disk_name, buffer); } - + + /* + * We now have all cache related info, determine how we deal + * with ordered requests. Note that as the current SCSI + * dispatch function can alter request order, we cannot use + * QUEUE_ORDERED_TAG_* even when ordered tag is supported. + */ + if (sdkp->WCE) + ordered = QUEUE_ORDERED_DRAIN_FLUSH; + else + ordered = QUEUE_ORDERED_DRAIN; + + blk_queue_ordered(sdkp->disk->queue, ordered, sd_prepare_flush); + set_capacity(disk, sdkp->capacity); kfree(buffer); @@ -1598,6 +1580,7 @@ static int sd_probe(struct device *dev) strcpy(gd->devfs_name, sdp->devfs_name); gd->private_data = &sdkp->driver; + gd->queue = sdkp->device->request_queue; sd_revalidate_disk(gd); @@ -1605,7 +1588,6 @@ static int sd_probe(struct device *dev) gd->flags = GENHD_FL_DRIVERFS; if (sdp->removable) gd->flags |= GENHD_FL_REMOVABLE; - gd->queue = sdkp->device->request_queue; dev_set_drvdata(dev, sdkp); add_disk(gd); -- cgit v1.2.3 From 007365ad60387df30f02f01fdc2b6e6432f6c265 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 6 Jan 2006 09:53:52 +0100 Subject: [BLOCK] scsi: add FUA support to sd Add FUA support for barriers to SCSI disk. Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- drivers/scsi/sd.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 2eefc9eb5da..32d4d8d7b9f 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -102,6 +102,7 @@ struct scsi_disk { u8 write_prot; unsigned WCE : 1; /* state of disk WCE bit */ unsigned RCD : 1; /* state of disk RCD bit, unused */ + unsigned DPOFUA : 1; /* state of disk DPOFUA bit */ }; static DEFINE_IDR(sd_index_idr); @@ -343,6 +344,7 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) if (block > 0xffffffff) { SCpnt->cmnd[0] += READ_16 - READ_6; + SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0; SCpnt->cmnd[2] = sizeof(block) > 4 ? (unsigned char) (block >> 56) & 0xff : 0; SCpnt->cmnd[3] = sizeof(block) > 4 ? (unsigned char) (block >> 48) & 0xff : 0; SCpnt->cmnd[4] = sizeof(block) > 4 ? (unsigned char) (block >> 40) & 0xff : 0; @@ -362,6 +364,7 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) this_count = 0xffff; SCpnt->cmnd[0] += READ_10 - READ_6; + SCpnt->cmnd[1] |= blk_fua_rq(rq) ? 0x8 : 0; SCpnt->cmnd[2] = (unsigned char) (block >> 24) & 0xff; SCpnt->cmnd[3] = (unsigned char) (block >> 16) & 0xff; SCpnt->cmnd[4] = (unsigned char) (block >> 8) & 0xff; @@ -370,6 +373,17 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) SCpnt->cmnd[7] = (unsigned char) (this_count >> 8) & 0xff; SCpnt->cmnd[8] = (unsigned char) this_count & 0xff; } else { + if (unlikely(blk_fua_rq(rq))) { + /* + * This happens only if this drive failed + * 10byte rw command with ILLEGAL_REQUEST + * during operation and thus turned off + * use_10_for_rw. + */ + printk(KERN_ERR "sd: FUA write on READ/WRITE(6) drive\n"); + return 0; + } + SCpnt->cmnd[1] |= (unsigned char) ((block >> 16) & 0x1f); SCpnt->cmnd[2] = (unsigned char) ((block >> 8) & 0xff); SCpnt->cmnd[3] = (unsigned char) block & 0xff; @@ -1395,10 +1409,18 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname, sdkp->RCD = 0; } + sdkp->DPOFUA = (data.device_specific & 0x10) != 0; + if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) { + printk(KERN_NOTICE "SCSI device %s: uses " + "READ/WRITE(6), disabling FUA\n", diskname); + sdkp->DPOFUA = 0; + } + ct = sdkp->RCD + 2*sdkp->WCE; - printk(KERN_NOTICE "SCSI device %s: drive cache: %s\n", - diskname, types[ct]); + printk(KERN_NOTICE "SCSI device %s: drive cache: %s%s\n", + diskname, types[ct], + sdkp->DPOFUA ? " w/ FUA" : ""); return; } @@ -1475,7 +1497,8 @@ static int sd_revalidate_disk(struct gendisk *disk) * QUEUE_ORDERED_TAG_* even when ordered tag is supported. */ if (sdkp->WCE) - ordered = QUEUE_ORDERED_DRAIN_FLUSH; + ordered = sdkp->DPOFUA + ? QUEUE_ORDERED_DRAIN_FUA : QUEUE_ORDERED_DRAIN_FLUSH; else ordered = QUEUE_ORDERED_DRAIN; -- cgit v1.2.3 From 93c9338713d4e11102cd09b4670ad42a336b06a3 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 6 Jan 2006 09:55:00 +0100 Subject: [BLOCK] update libata to use new blk_ordered for barriers Reflect changes in SCSI midlayer and updated to use new ordered request implementation Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- drivers/scsi/ahci.c | 1 - drivers/scsi/ata_piix.c | 1 - drivers/scsi/sata_mv.c | 1 - drivers/scsi/sata_nv.c | 1 - drivers/scsi/sata_promise.c | 1 - drivers/scsi/sata_sil.c | 1 - drivers/scsi/sata_sil24.c | 1 - drivers/scsi/sata_sis.c | 1 - drivers/scsi/sata_svw.c | 1 - drivers/scsi/sata_sx4.c | 1 - drivers/scsi/sata_uli.c | 1 - drivers/scsi/sata_via.c | 1 - drivers/scsi/sata_vsc.c | 1 - 13 files changed, 13 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 887eaa2a3eb..d113290b5fc 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c @@ -214,7 +214,6 @@ static struct scsi_host_template ahci_sht = { .dma_boundary = AHCI_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations ahci_ops = { diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 0ea27873b9f..4b647eefc9a 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c @@ -185,7 +185,6 @@ static struct scsi_host_template piix_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations piix_pata_ops = { diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index b2bf16a9bf4..cd54244058b 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c @@ -374,7 +374,6 @@ static struct scsi_host_template mv_sht = { .dma_boundary = MV_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations mv5_ops = { diff --git a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c index 4954896dfdb..c0cf52cb975 100644 --- a/drivers/scsi/sata_nv.c +++ b/drivers/scsi/sata_nv.c @@ -235,7 +235,6 @@ static struct scsi_host_template nv_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations nv_ops = { diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index da7fa04b8a7..3d1ea09a06a 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c @@ -114,7 +114,6 @@ static struct scsi_host_template pdc_ata_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations pdc_sata_ops = { diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index d2053487c73..b017f85e6d6 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c @@ -147,7 +147,6 @@ static struct scsi_host_template sil_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations sil_ops = { diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index a0ad3ed2200..923130185a9 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c @@ -292,7 +292,6 @@ static struct scsi_host_template sil24_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, /* NCQ not supported yet */ }; static const struct ata_port_operations sil24_ops = { diff --git a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c index 32e12620b16..2df8c5632ac 100644 --- a/drivers/scsi/sata_sis.c +++ b/drivers/scsi/sata_sis.c @@ -99,7 +99,6 @@ static struct scsi_host_template sis_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations sis_ops = { diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c index 6e7f7c83a75..668373590aa 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c @@ -303,7 +303,6 @@ static struct scsi_host_template k2_sata_sht = { .proc_info = k2_sata_proc_info, #endif .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; diff --git a/drivers/scsi/sata_sx4.c b/drivers/scsi/sata_sx4.c index 94b253b80da..bc87c16c80d 100644 --- a/drivers/scsi/sata_sx4.c +++ b/drivers/scsi/sata_sx4.c @@ -194,7 +194,6 @@ static struct scsi_host_template pdc_sata_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations pdc_20621_ops = { diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c index b2422a0f25c..9635ca70097 100644 --- a/drivers/scsi/sata_uli.c +++ b/drivers/scsi/sata_uli.c @@ -87,7 +87,6 @@ static struct scsi_host_template uli_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations uli_ops = { diff --git a/drivers/scsi/sata_via.c b/drivers/scsi/sata_via.c index c76215692da..6d5b0a794cf 100644 --- a/drivers/scsi/sata_via.c +++ b/drivers/scsi/sata_via.c @@ -106,7 +106,6 @@ static struct scsi_host_template svia_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; static const struct ata_port_operations svia_sata_ops = { diff --git a/drivers/scsi/sata_vsc.c b/drivers/scsi/sata_vsc.c index fcfa486965b..2e2c3b7acb0 100644 --- a/drivers/scsi/sata_vsc.c +++ b/drivers/scsi/sata_vsc.c @@ -235,7 +235,6 @@ static struct scsi_host_template vsc_sata_sht = { .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, - .ordered_flush = 1, }; -- cgit v1.2.3 From 9a3dccc42556537a48f39ee9a9e7ab90a933f766 Mon Sep 17 00:00:00 2001 From: Tejun Heo Date: Fri, 6 Jan 2006 09:56:18 +0100 Subject: [BLOCK] add FUA support to libata Signed-off-by: Tejun Heo Signed-off-by: Jens Axboe --- drivers/scsi/libata-core.c | 31 +++++++++++++++++++++++++------ drivers/scsi/libata-scsi.c | 32 ++++++++++++++++++++++++++------ drivers/scsi/libata.h | 4 +++- 3 files changed, 54 insertions(+), 13 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 9ea10258791..bdfb0a88cd6 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -562,16 +562,28 @@ static const u8 ata_rw_cmds[] = { ATA_CMD_WRITE_MULTI, ATA_CMD_READ_MULTI_EXT, ATA_CMD_WRITE_MULTI_EXT, + 0, + 0, + 0, + ATA_CMD_WRITE_MULTI_FUA_EXT, /* pio */ ATA_CMD_PIO_READ, ATA_CMD_PIO_WRITE, ATA_CMD_PIO_READ_EXT, ATA_CMD_PIO_WRITE_EXT, + 0, + 0, + 0, + 0, /* dma */ ATA_CMD_READ, ATA_CMD_WRITE, ATA_CMD_READ_EXT, - ATA_CMD_WRITE_EXT + ATA_CMD_WRITE_EXT, + 0, + 0, + 0, + ATA_CMD_WRITE_FUA_EXT }; /** @@ -584,25 +596,32 @@ static const u8 ata_rw_cmds[] = { * LOCKING: * caller. */ -void ata_rwcmd_protocol(struct ata_queued_cmd *qc) +int ata_rwcmd_protocol(struct ata_queued_cmd *qc) { struct ata_taskfile *tf = &qc->tf; struct ata_device *dev = qc->dev; + u8 cmd; - int index, lba48, write; + int index, fua, lba48, write; + fua = (tf->flags & ATA_TFLAG_FUA) ? 4 : 0; lba48 = (tf->flags & ATA_TFLAG_LBA48) ? 2 : 0; write = (tf->flags & ATA_TFLAG_WRITE) ? 1 : 0; if (dev->flags & ATA_DFLAG_PIO) { tf->protocol = ATA_PROT_PIO; - index = dev->multi_count ? 0 : 4; + index = dev->multi_count ? 0 : 8; } else { tf->protocol = ATA_PROT_DMA; - index = 8; + index = 16; } - tf->command = ata_rw_cmds[index + lba48 + write]; + cmd = ata_rw_cmds[index + fua + lba48 + write]; + if (cmd) { + tf->command = cmd; + return 0; + } + return -1; } static const char * const xfer_mode_str[] = { diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index e0439be4b57..2c644cbb6e9 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -1080,11 +1080,13 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm scsicmd[0] == WRITE_16) tf->flags |= ATA_TFLAG_WRITE; - /* Calculate the SCSI LBA and transfer length. */ + /* Calculate the SCSI LBA, transfer length and FUA. */ switch (scsicmd[0]) { case READ_10: case WRITE_10: scsi_10_lba_len(scsicmd, &block, &n_block); + if (unlikely(scsicmd[1] & (1 << 3))) + tf->flags |= ATA_TFLAG_FUA; break; case READ_6: case WRITE_6: @@ -1099,6 +1101,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm case READ_16: case WRITE_16: scsi_16_lba_len(scsicmd, &block, &n_block); + if (unlikely(scsicmd[1] & (1 << 3))) + tf->flags |= ATA_TFLAG_FUA; break; default: DPRINTK("no-byte command\n"); @@ -1142,7 +1146,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm tf->device |= (block >> 24) & 0xf; } - ata_rwcmd_protocol(qc); + if (unlikely(ata_rwcmd_protocol(qc) < 0)) + goto invalid_fld; qc->nsect = n_block; tf->nsect = n_block & 0xff; @@ -1160,7 +1165,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc, const u8 *scsicm if ((block >> 28) || (n_block > 256)) goto out_of_range; - ata_rwcmd_protocol(qc); + if (unlikely(ata_rwcmd_protocol(qc) < 0)) + goto invalid_fld; /* Convert LBA to CHS */ track = (u32)block / dev->sectors; @@ -1695,6 +1701,7 @@ static unsigned int ata_msense_rw_recovery(u8 **ptr_io, const u8 *last) unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, unsigned int buflen) { + struct ata_device *dev = args->dev; u8 *scsicmd = args->cmd->cmnd, *p, *last; const u8 sat_blk_desc[] = { 0, 0, 0, 0, /* number of blocks: sat unspecified */ @@ -1703,6 +1710,7 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, }; u8 pg, spg; unsigned int ebd, page_control, six_byte, output_len, alloc_len, minlen; + u8 dpofua; VPRINTK("ENTER\n"); @@ -1771,9 +1779,17 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, if (minlen < 1) return 0; + + dpofua = 0; + if (ata_id_has_fua(args->id) && dev->flags & ATA_DFLAG_LBA48 && + (!(dev->flags & ATA_DFLAG_PIO) || dev->multi_count)) + dpofua = 1 << 4; + if (six_byte) { output_len--; rbuf[0] = output_len; + if (minlen > 2) + rbuf[2] |= dpofua; if (ebd) { if (minlen > 3) rbuf[3] = sizeof(sat_blk_desc); @@ -1786,6 +1802,8 @@ unsigned int ata_scsiop_mode_sense(struct ata_scsi_args *args, u8 *rbuf, rbuf[0] = output_len >> 8; if (minlen > 1) rbuf[1] = output_len; + if (minlen > 3) + rbuf[3] |= dpofua; if (ebd) { if (minlen > 7) rbuf[7] = sizeof(sat_blk_desc); @@ -2446,7 +2464,7 @@ int ata_scsi_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) if (xlat_func) ata_scsi_translate(ap, dev, cmd, done, xlat_func); else - ata_scsi_simulate(dev->id, cmd, done); + ata_scsi_simulate(ap, dev, cmd, done); } else ata_scsi_translate(ap, dev, cmd, done, atapi_xlat); @@ -2469,14 +2487,16 @@ out_unlock: * spin_lock_irqsave(host_set lock) */ -void ata_scsi_simulate(u16 *id, +void ata_scsi_simulate(struct ata_port *ap, struct ata_device *dev, struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) { struct ata_scsi_args args; const u8 *scsicmd = cmd->cmnd; - args.id = id; + args.ap = ap; + args.dev = dev; + args.id = dev->id; args.cmd = cmd; args.done = done; diff --git a/drivers/scsi/libata.h b/drivers/scsi/libata.h index 251e53bdc6e..e03ce48b7b4 100644 --- a/drivers/scsi/libata.h +++ b/drivers/scsi/libata.h @@ -32,6 +32,8 @@ #define DRV_VERSION "1.20" /* must be exactly four chars */ struct ata_scsi_args { + struct ata_port *ap; + struct ata_device *dev; u16 *id; struct scsi_cmnd *cmd; void (*done)(struct scsi_cmnd *); @@ -41,7 +43,7 @@ struct ata_scsi_args { extern int atapi_enabled; extern struct ata_queued_cmd *ata_qc_new_init(struct ata_port *ap, struct ata_device *dev); -extern void ata_rwcmd_protocol(struct ata_queued_cmd *qc); +extern int ata_rwcmd_protocol(struct ata_queued_cmd *qc); extern void ata_qc_free(struct ata_queued_cmd *qc); extern int ata_qc_issue(struct ata_queued_cmd *qc); extern int ata_check_atapi_dma(struct ata_queued_cmd *qc); -- cgit v1.2.3 From e650c305ec3178818b317dad37a6d9c7fa8ba28d Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 6 Jan 2006 12:38:30 +0100 Subject: [SCSI] scsi_end_async() needs to take an uptodate parameter Signed-off-by: Jens Axboe --- drivers/scsi/scsi_lib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 7a38b101976..ba93d6e66d4 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -308,7 +308,7 @@ struct scsi_io_context { static kmem_cache_t *scsi_io_context_cache; -static void scsi_end_async(struct request *req) +static void scsi_end_async(struct request *req, int uptodate) { struct scsi_io_context *sioc = req->end_io_data; -- cgit v1.2.3 From 347a8dc3b815f0c0fa62a1df075184ffe4cbdcf1 Mon Sep 17 00:00:00 2001 From: Martin Schwidefsky Date: Fri, 6 Jan 2006 00:19:28 -0800 Subject: [PATCH] s390: cleanup Kconfig Sanitize some s390 Kconfig options. We have ARCH_S390, ARCH_S390X, ARCH_S390_31, 64BIT, S390_SUPPORT and COMPAT. Replace these 6 options by S390, 64BIT and COMPAT. Signed-off-by: Martin Schwidefsky Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 4c42065dea8..9e8254f0256 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -1815,7 +1815,7 @@ config SCSI_SUNESP config ZFCP tristate "FCP host bus adapter driver for IBM eServer zSeries" - depends on ARCH_S390 && QDIO && SCSI + depends on S390 && QDIO && SCSI select SCSI_FC_ATTRS help If you want to access SCSI devices attached to your IBM eServer -- cgit v1.2.3 From 6a19b41b35bf45fc27a46dccf26005b3f44c1aa1 Mon Sep 17 00:00:00 2001 From: Marko Kohtala Date: Fri, 6 Jan 2006 00:19:49 -0800 Subject: [PATCH] parport: Kconfig dependency fixes Make drivers that use directly PC parport HW depend on PARPORT_PC rather than HW independent PARPORT. Signed-off-by: Marko Kohtala Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/Kconfig | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 9e8254f0256..3c606cf8c8c 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig @@ -914,7 +914,7 @@ config SCSI_INIA100 config SCSI_PPA tristate "IOMEGA parallel port (ppa - older drives)" - depends on SCSI && PARPORT + depends on SCSI && PARPORT_PC ---help--- This driver supports older versions of IOMEGA's parallel port ZIP drive (a 100 MB removable media device). @@ -941,7 +941,7 @@ config SCSI_PPA config SCSI_IMM tristate "IOMEGA parallel port (imm - newer drives)" - depends on SCSI && PARPORT + depends on SCSI && PARPORT_PC ---help--- This driver supports newer versions of IOMEGA's parallel port ZIP drive (a 100 MB removable media device). @@ -968,7 +968,7 @@ config SCSI_IMM config SCSI_IZIP_EPP16 bool "ppa/imm option - Use slow (but safe) EPP-16" - depends on PARPORT && (SCSI_PPA || SCSI_IMM) + depends on SCSI_PPA || SCSI_IMM ---help--- EPP (Enhanced Parallel Port) is a standard for parallel ports which allows them to act as expansion buses that can handle up to 64 @@ -983,7 +983,7 @@ config SCSI_IZIP_EPP16 config SCSI_IZIP_SLOW_CTR bool "ppa/imm option - Assume slow parport control register" - depends on PARPORT && (SCSI_PPA || SCSI_IMM) + depends on SCSI_PPA || SCSI_IMM help Some parallel ports are known to have excessive delays between changing the parallel port control register and good data being -- cgit v1.2.3 From 9b847548663ef1039dd49f0eb4463d001e596bc3 Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Fri, 6 Jan 2006 09:28:07 +0100 Subject: [PATCH] Suspend support for libata This patch adds suspend patch to libata, and ata_piix in particular. For most low level drivers, they should just need to add the 4 hooks to work. As I can only test ata_piix, I didn't enable it for more though. Suspend support is the single most important feature on a notebook, and most new notebooks have sata drives. It's quite embarrassing that we _still_ do not support this. Right now, it's perfectly possible to suspend the drive in mid-transfer. Signed-off-by: Jens Axboe Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/ata_piix.c | 4 ++ drivers/scsi/libata-core.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ drivers/scsi/libata-scsi.c | 16 +++++++ drivers/scsi/scsi_sysfs.c | 31 ++++++++++++ 4 files changed, 165 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 0ea27873b9f..f7963034002 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c @@ -166,6 +166,8 @@ static struct pci_driver piix_pci_driver = { .id_table = piix_pci_tbl, .probe = piix_init_one, .remove = ata_pci_remove_one, + .suspend = ata_pci_device_suspend, + .resume = ata_pci_device_resume, }; static struct scsi_host_template piix_sht = { @@ -186,6 +188,8 @@ static struct scsi_host_template piix_sht = { .slave_configure = ata_scsi_slave_config, .bios_param = ata_std_bios_param, .ordered_flush = 1, + .resume = ata_scsi_device_resume, + .suspend = ata_scsi_device_suspend, }; static const struct ata_port_operations piix_pata_ops = { diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 9ea10258791..9c66d405939 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -4154,6 +4154,96 @@ err_out: * Inherited from caller. */ +/* + * Execute a 'simple' command, that only consists of the opcode 'cmd' itself, + * without filling any other registers + */ +static int ata_do_simple_cmd(struct ata_port *ap, struct ata_device *dev, + u8 cmd) +{ + struct ata_taskfile tf; + int err; + + ata_tf_init(ap, &tf, dev->devno); + + tf.command = cmd; + tf.flags |= ATA_TFLAG_DEVICE; + tf.protocol = ATA_PROT_NODATA; + + err = ata_exec_internal(ap, dev, &tf, DMA_NONE, NULL, 0); + if (err) + printk(KERN_ERR "%s: ata command failed: %d\n", + __FUNCTION__, err); + + return err; +} + +static int ata_flush_cache(struct ata_port *ap, struct ata_device *dev) +{ + u8 cmd; + + if (!ata_try_flush_cache(dev)) + return 0; + + if (ata_id_has_flush_ext(dev->id)) + cmd = ATA_CMD_FLUSH_EXT; + else + cmd = ATA_CMD_FLUSH; + + return ata_do_simple_cmd(ap, dev, cmd); +} + +static int ata_standby_drive(struct ata_port *ap, struct ata_device *dev) +{ + return ata_do_simple_cmd(ap, dev, ATA_CMD_STANDBYNOW1); +} + +static int ata_start_drive(struct ata_port *ap, struct ata_device *dev) +{ + return ata_do_simple_cmd(ap, dev, ATA_CMD_IDLEIMMEDIATE); +} + +/** + * ata_device_resume - wakeup a previously suspended devices + * + * Kick the drive back into action, by sending it an idle immediate + * command and making sure its transfer mode matches between drive + * and host. + * + */ +int ata_device_resume(struct ata_port *ap, struct ata_device *dev) +{ + if (ap->flags & ATA_FLAG_SUSPENDED) { + ap->flags &= ~ATA_FLAG_SUSPENDED; + ata_set_mode(ap); + } + if (!ata_dev_present(dev)) + return 0; + if (dev->class == ATA_DEV_ATA) + ata_start_drive(ap, dev); + + return 0; +} + +/** + * ata_device_suspend - prepare a device for suspend + * + * Flush the cache on the drive, if appropriate, then issue a + * standbynow command. + * + */ +int ata_device_suspend(struct ata_port *ap, struct ata_device *dev) +{ + if (!ata_dev_present(dev)) + return 0; + if (dev->class == ATA_DEV_ATA) + ata_flush_cache(ap, dev); + + ata_standby_drive(ap, dev); + ap->flags |= ATA_FLAG_SUSPENDED; + return 0; +} + int ata_port_start (struct ata_port *ap) { struct device *dev = ap->host_set->dev; @@ -4902,6 +4992,23 @@ int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits *bits) return (tmp == bits->val) ? 1 : 0; } + +int ata_pci_device_suspend(struct pci_dev *pdev, pm_message_t state) +{ + pci_save_state(pdev); + pci_disable_device(pdev); + pci_set_power_state(pdev, PCI_D3hot); + return 0; +} + +int ata_pci_device_resume(struct pci_dev *pdev) +{ + pci_set_power_state(pdev, PCI_D0); + pci_restore_state(pdev); + pci_enable_device(pdev); + pci_set_master(pdev); + return 0; +} #endif /* CONFIG_PCI */ @@ -5005,4 +5112,11 @@ EXPORT_SYMBOL_GPL(ata_pci_host_stop); EXPORT_SYMBOL_GPL(ata_pci_init_native_mode); EXPORT_SYMBOL_GPL(ata_pci_init_one); EXPORT_SYMBOL_GPL(ata_pci_remove_one); +EXPORT_SYMBOL_GPL(ata_pci_device_suspend); +EXPORT_SYMBOL_GPL(ata_pci_device_resume); #endif /* CONFIG_PCI */ + +EXPORT_SYMBOL_GPL(ata_device_suspend); +EXPORT_SYMBOL_GPL(ata_device_resume); +EXPORT_SYMBOL_GPL(ata_scsi_device_suspend); +EXPORT_SYMBOL_GPL(ata_scsi_device_resume); diff --git a/drivers/scsi/libata-scsi.c b/drivers/scsi/libata-scsi.c index e0439be4b57..c1ebede14a4 100644 --- a/drivers/scsi/libata-scsi.c +++ b/drivers/scsi/libata-scsi.c @@ -396,6 +396,22 @@ void ata_dump_status(unsigned id, struct ata_taskfile *tf) } } +int ata_scsi_device_resume(struct scsi_device *sdev) +{ + struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; + struct ata_device *dev = &ap->device[sdev->id]; + + return ata_device_resume(ap, dev); +} + +int ata_scsi_device_suspend(struct scsi_device *sdev) +{ + struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; + struct ata_device *dev = &ap->device[sdev->id]; + + return ata_device_suspend(ap, dev); +} + /** * ata_to_sense_error - convert ATA error to SCSI error * @id: ATA device number diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 15842b1f0f4..ea7f3a43357 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -263,9 +263,40 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv) return (sdp->inq_periph_qual == SCSI_INQ_PQ_CON)? 1: 0; } +static int scsi_bus_suspend(struct device * dev, pm_message_t state) +{ + struct scsi_device *sdev = to_scsi_device(dev); + struct scsi_host_template *sht = sdev->host->hostt; + int err; + + err = scsi_device_quiesce(sdev); + if (err) + return err; + + if (sht->suspend) + err = sht->suspend(sdev); + + return err; +} + +static int scsi_bus_resume(struct device * dev) +{ + struct scsi_device *sdev = to_scsi_device(dev); + struct scsi_host_template *sht = sdev->host->hostt; + int err = 0; + + if (sht->resume) + err = sht->resume(sdev); + + scsi_device_resume(sdev); + return err; +} + struct bus_type scsi_bus_type = { .name = "scsi", .match = scsi_bus_match, + .suspend = scsi_bus_suspend, + .resume = scsi_bus_resume, }; int scsi_sysfs_register(void) -- cgit v1.2.3 From cc5d0189b9ba95260857a5018a1c2fef90008507 Mon Sep 17 00:00:00 2001 From: Benjamin Herrenschmidt Date: Tue, 13 Dec 2005 18:01:21 +1100 Subject: [PATCH] powerpc: Remove device_node addrs/n_addr The pre-parsed addrs/n_addrs fields in struct device_node are finally gone. Remove the dodgy heuristics that did that parsing at boot and remove the fields themselves since we now have a good replacement with the new OF parsing code. This patch also fixes a bunch of drivers to use the new code instead, so that at least pmac32, pseries, iseries and g5 defconfigs build. Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Paul Mackerras --- drivers/scsi/mac53c94.c | 22 ++++++++++++++-------- drivers/scsi/mesh.c | 3 ++- 2 files changed, 16 insertions(+), 9 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c index 932dcf0366e..311a4122bd7 100644 --- a/drivers/scsi/mac53c94.c +++ b/drivers/scsi/mac53c94.c @@ -432,11 +432,12 @@ static int mac53c94_probe(struct macio_dev *mdev, const struct of_device_id *mat struct Scsi_Host *host; void *dma_cmd_space; unsigned char *clkprop; - int proplen; + int proplen, rc = -ENODEV; if (macio_resource_count(mdev) != 2 || macio_irq_count(mdev) != 2) { - printk(KERN_ERR "mac53c94: expected 2 addrs and intrs (got %d/%d)\n", - node->n_addrs, node->n_intrs); + printk(KERN_ERR "mac53c94: expected 2 addrs and intrs" + " (got %d/%d)\n", + macio_resource_count(mdev), macio_irq_count(mdev)); return -ENODEV; } @@ -448,6 +449,7 @@ static int mac53c94_probe(struct macio_dev *mdev, const struct of_device_id *mat host = scsi_host_alloc(&mac53c94_template, sizeof(struct fsc_state)); if (host == NULL) { printk(KERN_ERR "mac53c94: couldn't register host"); + rc = -ENOMEM; goto out_release; } @@ -486,6 +488,7 @@ static int mac53c94_probe(struct macio_dev *mdev, const struct of_device_id *mat if (dma_cmd_space == 0) { printk(KERN_ERR "mac53c94: couldn't allocate dma " "command space for %s\n", node->full_name); + rc = -ENOMEM; goto out_free; } state->dma_cmds = (struct dbdma_cmd *)DBDMA_ALIGN(dma_cmd_space); @@ -495,18 +498,21 @@ static int mac53c94_probe(struct macio_dev *mdev, const struct of_device_id *mat mac53c94_init(state); - if (request_irq(state->intr, do_mac53c94_interrupt, 0, "53C94", state)) { + if (request_irq(state->intr, do_mac53c94_interrupt, 0, "53C94",state)) { printk(KERN_ERR "mac53C94: can't get irq %d for %s\n", state->intr, node->full_name); goto out_free_dma; } - /* XXX FIXME: handle failure */ - scsi_add_host(host, &mdev->ofdev.dev); - scsi_scan_host(host); + rc = scsi_add_host(host, &mdev->ofdev.dev); + if (rc != 0) + goto out_release_irq; + scsi_scan_host(host); return 0; + out_release_irq: + free_irq(state->intr, state); out_free_dma: kfree(state->dma_cmd_space); out_free: @@ -518,7 +524,7 @@ static int mac53c94_probe(struct macio_dev *mdev, const struct of_device_id *mat out_release: macio_release_resources(mdev); - return -ENODEV; + return rc; } static int mac53c94_remove(struct macio_dev *mdev) diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c index bdccf73cf9f..d6d2125f904 100644 --- a/drivers/scsi/mesh.c +++ b/drivers/scsi/mesh.c @@ -1869,7 +1869,8 @@ static int mesh_probe(struct macio_dev *mdev, const struct of_device_id *match) if (macio_resource_count(mdev) != 2 || macio_irq_count(mdev) != 2) { printk(KERN_ERR "mesh: expected 2 addrs and 2 intrs" - " (got %d,%d)\n", mesh->n_addrs, mesh->n_intrs); + " (got %d,%d)\n", macio_resource_count(mdev), + macio_irq_count(mdev)); return -ENODEV; } -- cgit v1.2.3 From a885c8c4316e1c1d2d2c8755da3f3d14f852528d Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Sun, 8 Jan 2006 01:02:50 -0800 Subject: [PATCH] Add block_device_operations.getgeo block device method HDIO_GETGEO is implemented in most block drivers, and all of them have to duplicate the code to copy the structure to userspace, as well as getting the start sector. This patch moves that to common code [1] and adds a ->getgeo method to fill out the raw kernel hd_geometry structure. For many drivers this means ->ioctl can go away now. [1] the s390 block drivers are odd in this respect. xpram sets ->start to 4 always which seems more than odd, and the dasd driver shifts the start offset around, probably because of it's non-standard sector size. Signed-off-by: Christoph Hellwig Cc: Jens Axboe Cc: Cc: Jeff Dike Cc: Paolo Giarrusso Cc: Bartlomiej Zolnierkiewicz Cc: Neil Brown Cc: Markus Lidel Cc: Russell King Cc: David Woodhouse Cc: Martin Schwidefsky Cc: James Bottomley Signed-off-by: Adrian Bunk Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/sd.c | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 32d4d8d7b9f..4c5127ed379 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -527,7 +527,7 @@ static int sd_release(struct inode *inode, struct file *filp) return 0; } -static int sd_hdio_getgeo(struct block_device *bdev, struct hd_geometry __user *loc) +static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) { struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); struct scsi_device *sdp = sdkp->device; @@ -545,15 +545,9 @@ static int sd_hdio_getgeo(struct block_device *bdev, struct hd_geometry __user * else scsicam_bios_param(bdev, sdkp->capacity, diskinfo); - if (put_user(diskinfo[0], &loc->heads)) - return -EFAULT; - if (put_user(diskinfo[1], &loc->sectors)) - return -EFAULT; - if (put_user(diskinfo[2], &loc->cylinders)) - return -EFAULT; - if (put_user((unsigned)get_start_sect(bdev), - (unsigned long __user *)&loc->start)) - return -EFAULT; + geo->heads = diskinfo[0]; + geo->sectors = diskinfo[1]; + geo->cylinders = diskinfo[2]; return 0; } @@ -593,12 +587,6 @@ static int sd_ioctl(struct inode * inode, struct file * filp, if (!scsi_block_when_processing_errors(sdp) || !error) return error; - if (cmd == HDIO_GETGEO) { - if (!arg) - return -EINVAL; - return sd_hdio_getgeo(bdev, p); - } - /* * Send SCSI addressing ioctls directly to mid level, send other * ioctls to block level and then onto mid level if they can't be @@ -800,6 +788,7 @@ static struct block_device_operations sd_fops = { .open = sd_open, .release = sd_release, .ioctl = sd_ioctl, + .getgeo = sd_getgeo, #ifdef CONFIG_COMPAT .compat_ioctl = sd_compat_ioctl, #endif -- cgit v1.2.3 From e9368f8288338c25d8a339c91b15e17ebf33752d Mon Sep 17 00:00:00 2001 From: Russell King Date: Mon, 9 Jan 2006 13:56:42 +0000 Subject: [ARM] Remove asm/irq.h includes from ARM drivers Many ARM drivers do not need to include asm/irq.h - remove this unnecessary include from some ARM drivers. Signed-off-by: Russell King --- drivers/scsi/arm/acornscsi.c | 1 - drivers/scsi/arm/arxescsi.c | 1 - drivers/scsi/arm/cumana_1.c | 1 - drivers/scsi/arm/cumana_2.c | 1 - drivers/scsi/arm/eesox.c | 1 - drivers/scsi/arm/powertec.c | 1 - 6 files changed, 6 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c index 09ed05727bc..dda5a5f79c5 100644 --- a/drivers/scsi/arm/acornscsi.c +++ b/drivers/scsi/arm/acornscsi.c @@ -146,7 +146,6 @@ #include #include -#include #include #include "../scsi.h" diff --git a/drivers/scsi/arm/arxescsi.c b/drivers/scsi/arm/arxescsi.c index 804125e35fc..a2894015670 100644 --- a/drivers/scsi/arm/arxescsi.c +++ b/drivers/scsi/arm/arxescsi.c @@ -33,7 +33,6 @@ #include #include -#include #include #include "../scsi.h" diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c index 81e266be26d..e6c9491dc5c 100644 --- a/drivers/scsi/arm/cumana_1.c +++ b/drivers/scsi/arm/cumana_1.c @@ -13,7 +13,6 @@ #include #include -#include #include #include "../scsi.h" diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c index 3a7a46b0dc4..583d2d8c833 100644 --- a/drivers/scsi/arm/cumana_2.c +++ b/drivers/scsi/arm/cumana_2.c @@ -31,7 +31,6 @@ #include #include #include -#include #include #include "../scsi.h" diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c index 4d1e8f52c92..3ffec7efc9d 100644 --- a/drivers/scsi/arm/eesox.c +++ b/drivers/scsi/arm/eesox.c @@ -35,7 +35,6 @@ #include #include -#include #include #include #include diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c index 3333d7b3913..3113bdcedb1 100644 --- a/drivers/scsi/arm/powertec.c +++ b/drivers/scsi/arm/powertec.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include "../scsi.h" -- cgit v1.2.3 From 1aea6434eebd25e532d2e5ddabf2733af4e1ff0b Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 9 Jan 2006 16:03:03 +0100 Subject: [SCSI] Kill the SCSI softirq handling This patch moves the SCSI softirq handling to the block layer version. There should be no functional changes. Signed-off-by: Jens Axboe --- drivers/scsi/scsi.c | 109 ++++------------------------------------------- drivers/scsi/scsi_lib.c | 36 ++++++++++++++++ drivers/scsi/scsi_priv.h | 1 + 3 files changed, 45 insertions(+), 101 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 180676d7115..ee5f4dfdab1 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -69,7 +69,6 @@ #include "scsi_logging.h" static void scsi_done(struct scsi_cmnd *cmd); -static int scsi_retry_command(struct scsi_cmnd *cmd); /* * Definitions and constants. @@ -752,7 +751,7 @@ static void scsi_done(struct scsi_cmnd *cmd) * isn't running --- used by scsi_times_out */ void __scsi_done(struct scsi_cmnd *cmd) { - unsigned long flags; + struct request *rq = cmd->request; /* * Set the serial numbers back to zero @@ -763,71 +762,14 @@ void __scsi_done(struct scsi_cmnd *cmd) if (cmd->result) atomic_inc(&cmd->device->ioerr_cnt); + BUG_ON(!rq); + /* - * Next, enqueue the command into the done queue. - * It is a per-CPU queue, so we just disable local interrupts - * and need no spinlock. + * The uptodate/nbytes values don't matter, as we allow partial + * completes and thus will check this in the softirq callback */ - local_irq_save(flags); - list_add_tail(&cmd->eh_entry, &__get_cpu_var(scsi_done_q)); - raise_softirq_irqoff(SCSI_SOFTIRQ); - local_irq_restore(flags); -} - -/** - * scsi_softirq - Perform post-interrupt processing of finished SCSI commands. - * - * This is the consumer of the done queue. - * - * This is called with all interrupts enabled. This should reduce - * interrupt latency, stack depth, and reentrancy of the low-level - * drivers. - */ -static void scsi_softirq(struct softirq_action *h) -{ - int disposition; - LIST_HEAD(local_q); - - local_irq_disable(); - list_splice_init(&__get_cpu_var(scsi_done_q), &local_q); - local_irq_enable(); - - while (!list_empty(&local_q)) { - struct scsi_cmnd *cmd = list_entry(local_q.next, - struct scsi_cmnd, eh_entry); - /* The longest time any command should be outstanding is the - * per command timeout multiplied by the number of retries. - * - * For a typical command, this is 2.5 minutes */ - unsigned long wait_for - = cmd->allowed * cmd->timeout_per_command; - list_del_init(&cmd->eh_entry); - - disposition = scsi_decide_disposition(cmd); - if (disposition != SUCCESS && - time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) { - sdev_printk(KERN_ERR, cmd->device, - "timing out command, waited %lus\n", - wait_for/HZ); - disposition = SUCCESS; - } - - scsi_log_completion(cmd, disposition); - switch (disposition) { - case SUCCESS: - scsi_finish_command(cmd); - break; - case NEEDS_RETRY: - scsi_retry_command(cmd); - break; - case ADD_TO_MLQUEUE: - scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY); - break; - default: - if (!scsi_eh_scmd_add(cmd, 0)) - scsi_finish_command(cmd); - } - } + rq->completion_data = cmd; + blk_complete_request(rq); } /* @@ -840,7 +782,7 @@ static void scsi_softirq(struct softirq_action *h) * level drivers should not become re-entrant as a result of * this. */ -static int scsi_retry_command(struct scsi_cmnd *cmd) +int scsi_retry_command(struct scsi_cmnd *cmd) { /* * Restore the SCSI command state. @@ -1273,38 +1215,6 @@ int scsi_device_cancel(struct scsi_device *sdev, int recovery) } EXPORT_SYMBOL(scsi_device_cancel); -#ifdef CONFIG_HOTPLUG_CPU -static int scsi_cpu_notify(struct notifier_block *self, - unsigned long action, void *hcpu) -{ - int cpu = (unsigned long)hcpu; - - switch(action) { - case CPU_DEAD: - /* Drain scsi_done_q. */ - local_irq_disable(); - list_splice_init(&per_cpu(scsi_done_q, cpu), - &__get_cpu_var(scsi_done_q)); - raise_softirq_irqoff(SCSI_SOFTIRQ); - local_irq_enable(); - break; - default: - break; - } - return NOTIFY_OK; -} - -static struct notifier_block __devinitdata scsi_cpu_nb = { - .notifier_call = scsi_cpu_notify, -}; - -#define register_scsi_cpu() register_cpu_notifier(&scsi_cpu_nb) -#define unregister_scsi_cpu() unregister_cpu_notifier(&scsi_cpu_nb) -#else -#define register_scsi_cpu() -#define unregister_scsi_cpu() -#endif /* CONFIG_HOTPLUG_CPU */ - MODULE_DESCRIPTION("SCSI core"); MODULE_LICENSE("GPL"); @@ -1338,8 +1248,6 @@ static int __init init_scsi(void) INIT_LIST_HEAD(&per_cpu(scsi_done_q, i)); devfs_mk_dir("scsi"); - open_softirq(SCSI_SOFTIRQ, scsi_softirq, NULL); - register_scsi_cpu(); printk(KERN_NOTICE "SCSI subsystem initialized\n"); return 0; @@ -1367,7 +1275,6 @@ static void __exit exit_scsi(void) devfs_remove("scsi"); scsi_exit_procfs(); scsi_exit_queue(); - unregister_scsi_cpu(); } subsys_initcall(init_scsi); diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ba93d6e66d4..00c9bf383e2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1493,6 +1493,41 @@ static void scsi_kill_request(struct request *req, request_queue_t *q) __scsi_done(cmd); } +static void scsi_softirq_done(struct request *rq) +{ + struct scsi_cmnd *cmd = rq->completion_data; + unsigned long wait_for = cmd->allowed * cmd->timeout_per_command; + int disposition; + + INIT_LIST_HEAD(&cmd->eh_entry); + + disposition = scsi_decide_disposition(cmd); + if (disposition != SUCCESS && + time_before(cmd->jiffies_at_alloc + wait_for, jiffies)) { + sdev_printk(KERN_ERR, cmd->device, + "timing out command, waited %lus\n", + wait_for/HZ); + disposition = SUCCESS; + } + + scsi_log_completion(cmd, disposition); + + switch (disposition) { + case SUCCESS: + scsi_finish_command(cmd); + break; + case NEEDS_RETRY: + scsi_retry_command(cmd); + break; + case ADD_TO_MLQUEUE: + scsi_queue_insert(cmd, SCSI_MLQUEUE_DEVICE_BUSY); + break; + default: + if (!scsi_eh_scmd_add(cmd, 0)) + scsi_finish_command(cmd); + } +} + /* * Function: scsi_request_fn() * @@ -1667,6 +1702,7 @@ struct request_queue *scsi_alloc_queue(struct scsi_device *sdev) blk_queue_bounce_limit(q, scsi_calculate_bounce_limit(shost)); blk_queue_segment_boundary(q, shost->dma_boundary); blk_queue_issue_flush_fn(q, scsi_issue_flush_fn); + blk_queue_softirq_done(q, scsi_softirq_done); if (!shost->use_clustering) clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags); diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index f04e7e11f57..14a6198cb8d 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -44,6 +44,7 @@ extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq); extern void __scsi_release_request(struct scsi_request *sreq); extern void __scsi_done(struct scsi_cmnd *cmd); +extern int scsi_retry_command(struct scsi_cmnd *cmd); #ifdef CONFIG_SCSI_LOGGING void scsi_log_send(struct scsi_cmnd *cmd); void scsi_log_completion(struct scsi_cmnd *cmd, int disposition); -- cgit v1.2.3 From b887030aec0971a47ca97a18e93ff446bc7d049e Mon Sep 17 00:00:00 2001 From: Andrew Chew Date: Wed, 4 Jan 2006 19:13:04 -0800 Subject: [PATCH] sata_nv, spurious interrupts at system startup with MAXTOR 6H500F0 drive This patch works around a problem with spurious interrupts seen at boot time when a MAXTOR 6H500F0 drive is present. An ATA interrupt condition is mysteriously present at start of day. If we took too long in issuing the first command, the kernel would basically get tired of the spurious interrupts and turn the interrupt off. Issuing the first command essentially causes the interrupt condition to get acknowledged. I haven't seen this happen with any other drives. What I basically do is ack ATA status by reading it regardless of whether we're expecting to have to handle an interrupt. This clears the start-of-day anomalous interrupt condition, and keeps the kernel from disabling that interrupt due to too many spurious interrupts. Also, I fixed a bug where hotplug interrupts weren't getting acknowledged as handled in the ISR. This was not the cause of the spurious interrupts, but it's the right thing to do anyway. Signed-Off-By: Andrew Chew Signed-off-by: Jeff Garzik --- drivers/scsi/sata_nv.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sata_nv.c b/drivers/scsi/sata_nv.c index c0cf52cb975..bbbb55eeb73 100644 --- a/drivers/scsi/sata_nv.c +++ b/drivers/scsi/sata_nv.c @@ -29,6 +29,12 @@ * NV-specific details such as register offsets, SATA phy location, * hotplug info, etc. * + * 0.10 + * - Fixed spurious interrupts issue seen with the Maxtor 6H500F0 500GB + * drive. Also made the check_hotplug() callbacks return whether there + * was a hotplug interrupt or not. This was not the source of the + * spurious interrupts, but is the right thing to do anyway. + * * 0.09 * - Fixed bug introduced by 0.08's MCP51 and MCP55 support. * @@ -124,10 +130,10 @@ static void nv_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val); static void nv_host_stop (struct ata_host_set *host_set); static void nv_enable_hotplug(struct ata_probe_ent *probe_ent); static void nv_disable_hotplug(struct ata_host_set *host_set); -static void nv_check_hotplug(struct ata_host_set *host_set); +static int nv_check_hotplug(struct ata_host_set *host_set); static void nv_enable_hotplug_ck804(struct ata_probe_ent *probe_ent); static void nv_disable_hotplug_ck804(struct ata_host_set *host_set); -static void nv_check_hotplug_ck804(struct ata_host_set *host_set); +static int nv_check_hotplug_ck804(struct ata_host_set *host_set); enum nv_host_type { @@ -176,7 +182,7 @@ struct nv_host_desc enum nv_host_type host_type; void (*enable_hotplug)(struct ata_probe_ent *probe_ent); void (*disable_hotplug)(struct ata_host_set *host_set); - void (*check_hotplug)(struct ata_host_set *host_set); + int (*check_hotplug)(struct ata_host_set *host_set); }; static struct nv_host_desc nv_device_tbl[] = { @@ -309,12 +315,16 @@ static irqreturn_t nv_interrupt (int irq, void *dev_instance, qc = ata_qc_from_tag(ap, ap->active_tag); if (qc && (!(qc->tf.ctl & ATA_NIEN))) handled += ata_host_intr(ap, qc); + else + // No request pending? Clear interrupt status + // anyway, in case there's one pending. + ap->ops->check_status(ap); } } if (host->host_desc->check_hotplug) - host->host_desc->check_hotplug(host_set); + handled += host->host_desc->check_hotplug(host_set); spin_unlock_irqrestore(&host_set->lock, flags); @@ -497,7 +507,7 @@ static void nv_disable_hotplug(struct ata_host_set *host_set) outb(intr_mask, host_set->ports[0]->ioaddr.scr_addr + NV_INT_ENABLE); } -static void nv_check_hotplug(struct ata_host_set *host_set) +static int nv_check_hotplug(struct ata_host_set *host_set) { u8 intr_status; @@ -522,7 +532,11 @@ static void nv_check_hotplug(struct ata_host_set *host_set) if (intr_status & NV_INT_STATUS_SDEV_REMOVED) printk(KERN_WARNING "nv_sata: " "Secondary device removed\n"); + + return 1; } + + return 0; } static void nv_enable_hotplug_ck804(struct ata_probe_ent *probe_ent) @@ -560,7 +574,7 @@ static void nv_disable_hotplug_ck804(struct ata_host_set *host_set) pci_write_config_byte(pdev, NV_MCP_SATA_CFG_20, regval); } -static void nv_check_hotplug_ck804(struct ata_host_set *host_set) +static int nv_check_hotplug_ck804(struct ata_host_set *host_set) { u8 intr_status; @@ -585,7 +599,11 @@ static void nv_check_hotplug_ck804(struct ata_host_set *host_set) if (intr_status & NV_INT_STATUS_SDEV_REMOVED) printk(KERN_WARNING "nv_sata: " "Secondary device removed\n"); + + return 1; } + + return 0; } static int __init nv_init(void) -- cgit v1.2.3 From 41ed16fa47350661da01443b8241bf6ca8080fd7 Mon Sep 17 00:00:00 2001 From: Hugh Dickins Date: Mon, 9 Jan 2006 20:46:49 +0000 Subject: [PATCH] Fix sg_page_malloc() memset sg_page_malloc should clear the data buffer, not that extent of mem_map. This fixes Jesper's sg_page_free "Bad page states" Signed-off-by: Hugh Dickins Signed-off-by: Linus Torvalds --- drivers/scsi/sg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 221e96e2620..78aad9582bc 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -2493,7 +2493,7 @@ sg_page_malloc(int rqSz, int lowDma, int *retSzp) } if (resp) { if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) - memset(resp, 0, resSz); + memset(page_address(resp), 0, resSz); if (retSzp) *retSzp = resSz; } -- cgit v1.2.3 From 7ff92053ddff48d9d7908a353bd85f893944463e Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Mon, 9 Jan 2006 20:52:17 -0800 Subject: [PATCH] don't include ioctl32.h in drivers These days ioctl32.h is only used for communication of fs/compat.c and fs/compat_ioctl.c and doesn't contain anything of interest to drivers. Remove inclusion in various drivers. Signed-off-by: Christoph Hellwig Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/aacraid/linit.c | 1 - drivers/scsi/ch.c | 1 - drivers/scsi/megaraid/megaraid_mm.h | 1 - 3 files changed, 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 3cb68af9045..9b9062f0246 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -46,7 +46,6 @@ #include #include #include -#include #include #include #include diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index 0920220f331..4299fabca55 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include /* here are all the ioctls */ diff --git a/drivers/scsi/megaraid/megaraid_mm.h b/drivers/scsi/megaraid/megaraid_mm.h index eb8c390a0fa..3d9e67d6849 100644 --- a/drivers/scsi/megaraid/megaraid_mm.h +++ b/drivers/scsi/megaraid/megaraid_mm.h @@ -22,7 +22,6 @@ #include #include #include -#include #include "mbox_defs.h" #include "megaraid_ioctl.h" -- cgit v1.2.3 From b4290a23cfa9040e2f0de5ab57d6ea65abaf053b Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 12 Jan 2006 01:06:12 -0800 Subject: [PATCH] m68k: namespace pollution fix (custom->amiga_custom) in amigahw.h custom renamed to amiga_custom, in drivers with few instances the same replacement, in the rest - #define custom amiga_custom in driver itself Signed-off-by: Al Viro Cc: Roman Zippel Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/blz1230.c | 4 ++-- drivers/scsi/blz2060.c | 4 ++-- drivers/scsi/cyberstorm.c | 4 ++-- drivers/scsi/cyberstormII.c | 4 ++-- drivers/scsi/fastlane.c | 4 ++-- drivers/scsi/oktagon_esp.c | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/blz1230.c b/drivers/scsi/blz1230.c index 763e409a1ff..3867ac2de4c 100644 --- a/drivers/scsi/blz1230.c +++ b/drivers/scsi/blz1230.c @@ -224,7 +224,7 @@ static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp) static void dma_dump_state(struct NCR_ESP *esp) { ESPLOG(("intreq:<%04x>, intena:<%04x>\n", - custom.intreqr, custom.intenar)); + amiga_custom.intreqr, amiga_custom.intenar)); } void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length) @@ -298,7 +298,7 @@ static int dma_irq_p(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) diff --git a/drivers/scsi/blz2060.c b/drivers/scsi/blz2060.c index d72d05fffdf..4ebe69e3275 100644 --- a/drivers/scsi/blz2060.c +++ b/drivers/scsi/blz2060.c @@ -190,7 +190,7 @@ static int dma_can_transfer(struct NCR_ESP *esp, Scsi_Cmnd *sp) static void dma_dump_state(struct NCR_ESP *esp) { ESPLOG(("intreq:<%04x>, intena:<%04x>\n", - custom.intreqr, custom.intenar)); + amiga_custom.intreqr, amiga_custom.intenar)); } static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length) @@ -251,7 +251,7 @@ static void dma_led_on(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) diff --git a/drivers/scsi/cyberstorm.c b/drivers/scsi/cyberstorm.c index f9b940e5643..a4a4fac5c0a 100644 --- a/drivers/scsi/cyberstorm.c +++ b/drivers/scsi/cyberstorm.c @@ -223,7 +223,7 @@ static void dma_dump_state(struct NCR_ESP *esp) esp->esp_id, ((struct cyber_dma_registers *) (esp->dregs))->cond_reg)); ESPLOG(("intreq:<%04x>, intena:<%04x>\n", - custom.intreqr, custom.intenar)); + amiga_custom.intreqr, amiga_custom.intenar)); } static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length) @@ -322,7 +322,7 @@ static void dma_led_on(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) diff --git a/drivers/scsi/cyberstormII.c b/drivers/scsi/cyberstormII.c index a3caabfd755..3a803d73bc5 100644 --- a/drivers/scsi/cyberstormII.c +++ b/drivers/scsi/cyberstormII.c @@ -200,7 +200,7 @@ static void dma_dump_state(struct NCR_ESP *esp) esp->esp_id, ((struct cyberII_dma_registers *) (esp->dregs))->cond_reg)); ESPLOG(("intreq:<%04x>, intena:<%04x>\n", - custom.intreqr, custom.intenar)); + amiga_custom.intreqr, amiga_custom.intenar)); } static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length) @@ -259,7 +259,7 @@ static void dma_led_on(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) diff --git a/drivers/scsi/fastlane.c b/drivers/scsi/fastlane.c index ccee68b52f7..8ae9c406a83 100644 --- a/drivers/scsi/fastlane.c +++ b/drivers/scsi/fastlane.c @@ -268,7 +268,7 @@ static void dma_dump_state(struct NCR_ESP *esp) esp->esp_id, ((struct fastlane_dma_registers *) (esp->dregs))->cond_reg)); ESPLOG(("intreq:<%04x>, intena:<%04x>\n", - custom.intreqr, custom.intenar)); + amiga_custom.intreqr, amiga_custom.intenar)); } static void dma_init_read(struct NCR_ESP *esp, __u32 addr, int length) @@ -368,7 +368,7 @@ static void dma_led_on(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) diff --git a/drivers/scsi/oktagon_esp.c b/drivers/scsi/oktagon_esp.c index 5d9c9ada814..dee426f8c07 100644 --- a/drivers/scsi/oktagon_esp.c +++ b/drivers/scsi/oktagon_esp.c @@ -490,7 +490,7 @@ static void dma_led_on(struct NCR_ESP *esp) static int dma_ports_p(struct NCR_ESP *esp) { - return ((custom.intenar) & IF_PORTS); + return ((amiga_custom.intenar) & IF_PORTS); } static void dma_setup(struct NCR_ESP *esp, __u32 addr, int count, int write) -- cgit v1.2.3 From 641940611478df8b63f581310b9d51806dda3212 Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 12 Jan 2006 01:06:14 -0800 Subject: [PATCH] m68k: oktagon makefile fix oktagon_esp is described as modular. However, drivers/scsi/Makefile doesn't handle it right - it's multi-object module, with one of the parts being built from .S. Current makefile tries to declare each part a module of its own; that not only wouldn't work (oktagon_io.o doesn't have the right parts for that), it actually doesn't even build since kbuild doesn't believe in single-object modules built from .S. Turned into proper multi-object module... Signed-off-by: Al Viro Cc: Roman Zippel Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index f062ea0f813..6e0c059df6a 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -45,7 +45,7 @@ obj-$(CONFIG_CYBERSTORMII_SCSI) += NCR53C9x.o cyberstormII.o obj-$(CONFIG_BLZ2060_SCSI) += NCR53C9x.o blz2060.o obj-$(CONFIG_BLZ1230_SCSI) += NCR53C9x.o blz1230.o obj-$(CONFIG_FASTLANE_SCSI) += NCR53C9x.o fastlane.o -obj-$(CONFIG_OKTAGON_SCSI) += NCR53C9x.o oktagon_esp.o oktagon_io.o +obj-$(CONFIG_OKTAGON_SCSI) += NCR53C9x.o oktagon_esp_mod.o obj-$(CONFIG_ATARI_SCSI) += atari_scsi.o obj-$(CONFIG_MAC_SCSI) += mac_scsi.o obj-$(CONFIG_SCSI_MAC_ESP) += mac_esp.o NCR53C9x.o @@ -164,6 +164,7 @@ CFLAGS_ncr53c8xx.o := $(ncr53c8xx-flags-y) $(ncr53c8xx-flags-m) zalon7xx-objs := zalon.o ncr53c8xx.o NCR_Q720_mod-objs := NCR_Q720.o ncr53c8xx.o libata-objs := libata-core.o libata-scsi.o +oktagon_esp_mod-objs := oktagon_esp.o oktagon_io.o # Files generated that shall be removed upon make clean clean-files := 53c7xx_d.h 53c700_d.h \ -- cgit v1.2.3 From a5d361fc24b75ea51e219367ee32c64422a2134f Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 12 Jan 2006 01:06:34 -0800 Subject: [PATCH] m68k: NULL noise removal Signed-off-by: Al Viro Cc: Roman Zippel Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/wd33c93.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c index fd63add6a57..fb53eeaee61 100644 --- a/drivers/scsi/wd33c93.c +++ b/drivers/scsi/wd33c93.c @@ -465,7 +465,7 @@ wd33c93_execute(struct Scsi_Host *instance) */ cmd = (struct scsi_cmnd *) hostdata->input_Q; - prev = 0; + prev = NULL; while (cmd) { if (!(hostdata->busy[cmd->device->id] & (1 << cmd->device->lun))) break; @@ -1569,7 +1569,7 @@ wd33c93_abort(struct scsi_cmnd * cmd) */ tmp = (struct scsi_cmnd *) hostdata->input_Q; - prev = 0; + prev = NULL; while (tmp) { if (tmp == cmd) { if (prev) -- cgit v1.2.3 From 3c9757b7c28161e073e7f408978b7ed01925924c Mon Sep 17 00:00:00 2001 From: Al Viro Date: Thu, 12 Jan 2006 01:06:40 -0800 Subject: [PATCH] m68k: fix PIO case in esp we always set ->SCp.ptr to physical address of buffer; for DMA that's just what we need, but we end up using it as virtual address in PIO case of esp_do_data(), with obvious breakage as soon as memory mapping becomes non-trivial. The fix is obvious. Signed-off-by: Al Viro Cc: Roman Zippel Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/NCR53C9x.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/NCR53C9x.c b/drivers/scsi/NCR53C9x.c index 640590bd014..c7dd0154d01 100644 --- a/drivers/scsi/NCR53C9x.c +++ b/drivers/scsi/NCR53C9x.c @@ -1799,6 +1799,7 @@ static int esp_do_data(struct NCR_ESP *esp, struct ESP_regs *eregs) */ int oldphase, i = 0; /* or where we left off last time ?? esp->current_data ?? */ int fifocnt = 0; + unsigned char *p = phys_to_virt((unsigned long)SCptr->SCp.ptr); oldphase = esp_read(eregs->esp_status) & ESP_STAT_PMASK; @@ -1860,7 +1861,7 @@ static int esp_do_data(struct NCR_ESP *esp, struct ESP_regs *eregs) /* read fifo */ for(j=0;jSCp.ptr[i++] = esp_read(eregs->esp_fdata); + p[i++] = esp_read(eregs->esp_fdata); ESPDATA(("(%d) ", i)); @@ -1882,7 +1883,7 @@ static int esp_do_data(struct NCR_ESP *esp, struct ESP_regs *eregs) /* fill fifo */ for(j=0;jesp_fdata, SCptr->SCp.ptr[i++]); + esp_write(eregs->esp_fdata, p[i++]); /* how many left if this goes out ?? */ hmuch -= this_count; -- cgit v1.2.3 From 8e32ca49ef2eb5bfec1444b5e731cc2d35111519 Mon Sep 17 00:00:00 2001 From: "Moore, Eric" Date: Wed, 4 Jan 2006 14:58:43 -0700 Subject: [SCSI] raid_class.c - adding RAID10 and RAID10 defines Adding defines for RAID10 and RAID50 levels, in preparation of adding RAID Transport support in the mpt fusion drivers. (BTW: IME is RAID10, and IM is RAID1). Signed-off-by: Eric Moore Signed-off-by: James Bottomley --- drivers/scsi/raid_class.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/raid_class.c b/drivers/scsi/raid_class.c index 5ec5f44602a..50c398aab55 100644 --- a/drivers/scsi/raid_class.c +++ b/drivers/scsi/raid_class.c @@ -148,9 +148,11 @@ static struct { { RAID_LEVEL_LINEAR, "linear" }, { RAID_LEVEL_0, "raid0" }, { RAID_LEVEL_1, "raid1" }, + { RAID_LEVEL_10, "raid10" }, { RAID_LEVEL_3, "raid3" }, { RAID_LEVEL_4, "raid4" }, { RAID_LEVEL_5, "raid5" }, + { RAID_LEVEL_50, "raid50" }, { RAID_LEVEL_6, "raid6" }, }; -- cgit v1.2.3 From bdd70f2cebce0f5172350aab37c057c3b66494ac Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Thu, 5 Jan 2006 23:39:18 +0100 Subject: [SCSI] scsi_transport_spi.c: make print_nego() static Signed-off-by: Adrian Bunk Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 46da6fe10ad..86306d681b6 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -1075,7 +1075,7 @@ static const char * const extended_msgs[] = { /* 0x04 */ "Parallel Protocol Request" }; -void print_nego(const unsigned char *msg, int per, int off, int width) +static void print_nego(const unsigned char *msg, int per, int off, int width) { if (per) { char buf[20]; -- cgit v1.2.3 From 455c53ec61a6c96d7b21b72ad1fa26ac89824e8e Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Fri, 6 Jan 2006 20:21:28 +0100 Subject: [SCSI] lpfc_scsi.c: make lpfc_get_scsi_buf() static Signed-off-by: Adrian Bunk Acked-by: James Smart Signed-off-by: James Bottomley --- drivers/scsi/lpfc/lpfc_scsi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 9ee8218404c..dafabeefc5b 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c @@ -150,7 +150,7 @@ lpfc_new_scsi_buf(struct lpfc_hba * phba) return psb; } -struct lpfc_scsi_buf* +static struct lpfc_scsi_buf* lpfc_get_scsi_buf(struct lpfc_hba * phba) { struct lpfc_scsi_buf * lpfc_cmd = NULL; -- cgit v1.2.3 From 8e0df4a757db82a571f3a179108b62d09258eaf2 Mon Sep 17 00:00:00 2001 From: Andrew Vasquez Date: Mon, 9 Jan 2006 10:17:40 -0800 Subject: [SCSI] qla2xxx: Kconfig: two fixes Original From: Adrian Bunk Here's a composite patch with Adrian's original additions and help-text with the new Kconfig variable SCSI_QLA_FC. Signed-off-by: James Bottomley --- drivers/scsi/Makefile | 2 +- drivers/scsi/qla2xxx/Kconfig | 20 ++++++++++++-------- drivers/scsi/qla2xxx/Makefile | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index f062ea0f813..b9d2bb88787 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile @@ -80,7 +80,7 @@ obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas408.o qlogicfas.o obj-$(CONFIG_PCMCIA_QLOGIC) += qlogicfas408.o obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o -obj-$(CONFIG_SCSI_QLA2XXX) += qla2xxx/ +obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx/ obj-$(CONFIG_SCSI_LPFC) += lpfc/ obj-$(CONFIG_SCSI_PAS16) += pas16.o obj-$(CONFIG_SCSI_SEAGATE) += seagate.o diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig index 5205c4e7d6f..02cc79474e8 100644 --- a/drivers/scsi/qla2xxx/Kconfig +++ b/drivers/scsi/qla2xxx/Kconfig @@ -1,4 +1,4 @@ -config SCSI_QLA2XXX +config SCSI_QLA_FC tristate "QLogic QLA2XXX Fibre Channel Support" depends on PCI && SCSI select SCSI_FC_ATTRS @@ -28,43 +28,47 @@ config SCSI_QLA2XXX config SCSI_QLA2XXX_EMBEDDED_FIRMWARE bool " Use firmware-loader modules (DEPRECATED)" - depends on SCSI_QLA2XXX + depends on SCSI_QLA_FC + help + This option offers you the deprecated firmware-loader + modules that have been obsoleted by the usage of the + Firmware Loader interface in the qla2xxx driver. config SCSI_QLA21XX tristate " Build QLogic ISP2100 firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 21xx (ISP2100) host adapter family. config SCSI_QLA22XX tristate " Build QLogic ISP2200 firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 22xx (ISP2200) host adapter family. config SCSI_QLA2300 tristate " Build QLogic ISP2300 firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 2300 (ISP2300 and ISP2312) host adapter family. config SCSI_QLA2322 tristate " Build QLogic ISP2322 firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 2322 (ISP2322) host adapter family. config SCSI_QLA6312 tristate " Build QLogic ISP63xx firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 63xx (ISP6312 and ISP6322) host adapter family. config SCSI_QLA24XX tristate " Build QLogic ISP24xx firmware-module" - depends on SCSI_QLA2XXX_EMBEDDED_FIRMWARE + depends on SCSI_QLA_FC && SCSI_QLA2XXX_EMBEDDED_FIRMWARE ---help--- This driver supports the QLogic 24xx (ISP2422 and ISP2432) host adapter family. diff --git a/drivers/scsi/qla2xxx/Makefile b/drivers/scsi/qla2xxx/Makefile index 40c0de12588..d028bc50ccf 100644 --- a/drivers/scsi/qla2xxx/Makefile +++ b/drivers/scsi/qla2xxx/Makefile @@ -3,7 +3,7 @@ EXTRA_CFLAGS += -DUNIQUE_FW_NAME qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \ qla_dbg.o qla_sup.o qla_rscn.o qla_attr.o -obj-$(CONFIG_SCSI_QLA2XXX) += qla2xxx.o +obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o qla2100-y := ql2100.o ql2100_fw.o qla2200-y := ql2200.o ql2200_fw.o -- cgit v1.2.3 From dacee84b070c4e705a5b6446f1f0a6a6e2f8d7a4 Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Tue, 10 Jan 2006 12:11:42 -0600 Subject: [SCSI] aic7xxx: fix timer handling bug The driver is doing a rather stupid mod_timer allegedly to "give request sense more time to complete". This is illegal and pointless, so just eliminate it. Also eliminate all the other uses of struct timer_list in the driver, which are mostly bogus. Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/Kconfig.aic7xxx | 4 ++-- drivers/scsi/aic7xxx/aic7xxx_osm.c | 28 ++++++++++++++-------------- drivers/scsi/aic7xxx/aic7xxx_osm.h | 25 ------------------------- 3 files changed, 16 insertions(+), 41 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/Kconfig.aic7xxx b/drivers/scsi/aic7xxx/Kconfig.aic7xxx index ac8de03c9fa..6c2c395554f 100644 --- a/drivers/scsi/aic7xxx/Kconfig.aic7xxx +++ b/drivers/scsi/aic7xxx/Kconfig.aic7xxx @@ -42,13 +42,13 @@ config AIC7XXX_CMDS_PER_DEVICE config AIC7XXX_RESET_DELAY_MS int "Initial bus reset delay in milli-seconds" depends on SCSI_AIC7XXX - default "15000" + default "5000" ---help--- The number of milliseconds to delay after an initial bus reset. The bus settle delay following all error recovery actions is dictated by the SCSI layer and is not affected by this value. - Default: 15000 (15 seconds) + Default: 5000 (5 seconds) config AIC7XXX_PROBE_EISA_VL bool "Probe for EISA and VL AIC7XXX Adapters" diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index fd389e9f946..051970efba6 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -375,7 +375,7 @@ static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc, struct scsi_cmnd *cmd); static void ahc_linux_sem_timeout(u_long arg); static void ahc_linux_freeze_simq(struct ahc_softc *ahc); -static void ahc_linux_release_simq(u_long arg); +static void ahc_linux_release_simq(struct ahc_softc *ahc); static int ahc_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag); static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc); static u_int ahc_linux_user_tagdepth(struct ahc_softc *ahc, @@ -1073,7 +1073,6 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa return (ENOMEM); *((struct ahc_softc **)host->hostdata) = ahc; - ahc_lock(ahc, &s); ahc->platform_data->host = host; host->can_queue = AHC_MAX_QUEUE; host->cmd_per_lun = 2; @@ -1084,7 +1083,9 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa host->max_lun = AHC_NUM_LUNS; host->max_channel = (ahc->features & AHC_TWIN) ? 1 : 0; host->sg_tablesize = AHC_NSEG; + ahc_lock(ahc, &s); ahc_set_unit(ahc, ahc_linux_unit++); + ahc_unlock(ahc, &s); sprintf(buf, "scsi%d", host->host_no); new_name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT); if (new_name != NULL) { @@ -1094,7 +1095,6 @@ ahc_linux_register_host(struct ahc_softc *ahc, struct scsi_host_template *templa host->unique_id = ahc->unit; ahc_linux_initialize_scsi_bus(ahc); ahc_intr_enable(ahc, TRUE); - ahc_unlock(ahc, &s); host->transportt = ahc_linux_transport_template; @@ -1120,10 +1120,13 @@ ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc) { int i; int numtarg; + unsigned long s; i = 0; numtarg = 0; + ahc_lock(ahc, &s); + if (aic7xxx_no_reset != 0) ahc->flags &= ~(AHC_RESET_BUS_A|AHC_RESET_BUS_B); @@ -1170,16 +1173,12 @@ ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc) ahc_update_neg_request(ahc, &devinfo, tstate, tinfo, AHC_NEG_ALWAYS); } + ahc_unlock(ahc, &s); /* Give the bus some time to recover */ if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) { ahc_linux_freeze_simq(ahc); - init_timer(&ahc->platform_data->reset_timer); - ahc->platform_data->reset_timer.data = (u_long)ahc; - ahc->platform_data->reset_timer.expires = - jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000; - ahc->platform_data->reset_timer.function = - ahc_linux_release_simq; - add_timer(&ahc->platform_data->reset_timer); + msleep(AIC7XXX_RESET_DELAY); + ahc_linux_release_simq(ahc); } } @@ -2059,6 +2058,9 @@ ahc_linux_sem_timeout(u_long arg) static void ahc_linux_freeze_simq(struct ahc_softc *ahc) { + unsigned long s; + + ahc_lock(ahc, &s); ahc->platform_data->qfrozen++; if (ahc->platform_data->qfrozen == 1) { scsi_block_requests(ahc->platform_data->host); @@ -2068,17 +2070,15 @@ ahc_linux_freeze_simq(struct ahc_softc *ahc) CAM_LUN_WILDCARD, SCB_LIST_NULL, ROLE_INITIATOR, CAM_REQUEUE_REQ); } + ahc_unlock(ahc, &s); } static void -ahc_linux_release_simq(u_long arg) +ahc_linux_release_simq(struct ahc_softc *ahc) { - struct ahc_softc *ahc; u_long s; int unblock_reqs; - ahc = (struct ahc_softc *)arg; - unblock_reqs = 0; ahc_lock(ahc, &s); if (ahc->platform_data->qfrozen > 0) diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h index f2a95447142..e0edacae895 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.h +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h @@ -223,9 +223,6 @@ int ahc_dmamap_unload(struct ahc_softc *, bus_dma_tag_t, bus_dmamap_t); */ #define ahc_dmamap_sync(ahc, dma_tag, dmamap, offset, len, op) -/************************** Timer DataStructures ******************************/ -typedef struct timer_list ahc_timer_t; - /********************************** Includes **********************************/ #ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT #define AIC_DEBUG_REGISTERS 1 @@ -235,30 +232,9 @@ typedef struct timer_list ahc_timer_t; #include "aic7xxx.h" /***************************** Timer Facilities *******************************/ -#define ahc_timer_init init_timer -#define ahc_timer_stop del_timer_sync -typedef void ahc_linux_callback_t (u_long); -static __inline void ahc_timer_reset(ahc_timer_t *timer, int usec, - ahc_callback_t *func, void *arg); -static __inline void ahc_scb_timer_reset(struct scb *scb, u_int usec); - -static __inline void -ahc_timer_reset(ahc_timer_t *timer, int usec, ahc_callback_t *func, void *arg) -{ - struct ahc_softc *ahc; - - ahc = (struct ahc_softc *)arg; - del_timer(timer); - timer->data = (u_long)arg; - timer->expires = jiffies + (usec * HZ)/1000000; - timer->function = (ahc_linux_callback_t*)func; - add_timer(timer); -} - static __inline void ahc_scb_timer_reset(struct scb *scb, u_int usec) { - mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000); } /***************************** SMP support ************************************/ @@ -393,7 +369,6 @@ struct ahc_platform_data { spinlock_t spin_lock; u_int qfrozen; - struct timer_list reset_timer; struct semaphore eh_sem; struct Scsi_Host *host; /* pointer to scsi host */ #define AHC_LINUX_NOIRQ ((uint32_t)~0) -- cgit v1.2.3 From 0b9506723826c68b50fa33e345700ddcac1bed36 Mon Sep 17 00:00:00 2001 From: Arjan van de Ven Date: Wed, 11 Jan 2006 13:16:10 +0100 Subject: [SCSI] turn most scsi semaphores into mutexes the scsi layer is using semaphores in a mutex way, this patch converts these into using mutexes instead Signed-off-by: Arjan van de Ven Signed-off-by: James Bottomley --- drivers/scsi/ch.c | 33 ++++++++++++++++---------------- drivers/scsi/dpt_i2o.c | 35 +++++++++++++++++----------------- drivers/scsi/hosts.c | 8 ++++---- drivers/scsi/iscsi_tcp.c | 37 ++++++++++++++++++------------------ drivers/scsi/iscsi_tcp.h | 2 +- drivers/scsi/megaraid.c | 6 +++--- drivers/scsi/megaraid.h | 4 ++-- drivers/scsi/megaraid/megaraid_sas.c | 7 ++++--- drivers/scsi/scsi.c | 13 +++++++------ drivers/scsi/scsi_proc.c | 11 ++++++----- drivers/scsi/scsi_scan.c | 16 ++++++++-------- drivers/scsi/scsi_sysfs.c | 4 ++-- drivers/scsi/scsi_transport_iscsi.c | 17 +++++++++-------- drivers/scsi/sd.c | 21 ++++++++++---------- drivers/scsi/sr.c | 17 +++++++++-------- drivers/scsi/st.c | 17 +++++++++-------- 16 files changed, 129 insertions(+), 119 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c index 4299fabca55..c3f27285db1 100644 --- a/drivers/scsi/ch.c +++ b/drivers/scsi/ch.c @@ -22,6 +22,7 @@ #include #include #include /* here are all the ioctls */ +#include #include #include @@ -111,7 +112,7 @@ typedef struct { u_int counts[CH_TYPES]; u_int unit_attention; u_int voltags; - struct semaphore lock; + struct mutex lock; } scsi_changer; static LIST_HEAD(ch_devlist); @@ -565,7 +566,7 @@ static int ch_gstatus(scsi_changer *ch, int type, unsigned char __user *dest) u_char data[16]; unsigned int i; - down(&ch->lock); + mutex_lock(&ch->lock); for (i = 0; i < ch->counts[type]; i++) { if (0 != ch_read_element_status (ch, ch->firsts[type]+i,data)) { @@ -582,7 +583,7 @@ static int ch_gstatus(scsi_changer *ch, int type, unsigned char __user *dest) if (0 != retval) break; } - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -687,11 +688,11 @@ static int ch_ioctl(struct inode * inode, struct file * file, dprintk("CHIOPOSITION: invalid parameter\n"); return -EBADSLT; } - down(&ch->lock); + mutex_lock(&ch->lock); retval = ch_position(ch,0, ch->firsts[pos.cp_type] + pos.cp_unit, pos.cp_flags & CP_INVERT); - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -708,12 +709,12 @@ static int ch_ioctl(struct inode * inode, struct file * file, return -EBADSLT; } - down(&ch->lock); + mutex_lock(&ch->lock); retval = ch_move(ch,0, ch->firsts[mv.cm_fromtype] + mv.cm_fromunit, ch->firsts[mv.cm_totype] + mv.cm_tounit, mv.cm_flags & CM_INVERT); - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -731,14 +732,14 @@ static int ch_ioctl(struct inode * inode, struct file * file, return -EBADSLT; } - down(&ch->lock); + mutex_lock(&ch->lock); retval = ch_exchange (ch,0, ch->firsts[mv.ce_srctype] + mv.ce_srcunit, ch->firsts[mv.ce_fdsttype] + mv.ce_fdstunit, ch->firsts[mv.ce_sdsttype] + mv.ce_sdstunit, mv.ce_flags & CE_INVERT1, mv.ce_flags & CE_INVERT2); - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -772,7 +773,7 @@ static int ch_ioctl(struct inode * inode, struct file * file, buffer = kmalloc(512, GFP_KERNEL | GFP_DMA); if (!buffer) return -ENOMEM; - down(&ch->lock); + mutex_lock(&ch->lock); voltag_retry: memset(cmd,0,sizeof(cmd)); @@ -823,7 +824,7 @@ static int ch_ioctl(struct inode * inode, struct file * file, goto voltag_retry; } kfree(buffer); - up(&ch->lock); + mutex_unlock(&ch->lock); if (copy_to_user(argp, &cge, sizeof (cge))) return -EFAULT; @@ -832,9 +833,9 @@ static int ch_ioctl(struct inode * inode, struct file * file, case CHIOINITELEM: { - down(&ch->lock); + mutex_lock(&ch->lock); retval = ch_init_elem(ch); - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -851,12 +852,12 @@ static int ch_ioctl(struct inode * inode, struct file * file, return -EBADSLT; } elem = ch->firsts[csv.csv_type] + csv.csv_unit; - down(&ch->lock); + mutex_lock(&ch->lock); retval = ch_set_voltag(ch, elem, csv.csv_flags & CSV_AVOLTAG, csv.csv_flags & CSV_CLEARTAG, csv.csv_voltag); - up(&ch->lock); + mutex_unlock(&ch->lock); return retval; } @@ -929,7 +930,7 @@ static int ch_probe(struct device *dev) memset(ch,0,sizeof(*ch)); ch->minor = ch_devcount; sprintf(ch->name,"ch%d",ch->minor); - init_MUTEX(&ch->lock); + mutex_init(&ch->lock); ch->device = sd; ch_readconfig(ch); if (init) diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index 6252b9ddc01..cdeb30b0462 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -61,6 +61,7 @@ MODULE_DESCRIPTION("Adaptec I2O RAID Driver"); #include #include #include +#include #include /* for boot_cpu_data */ #include @@ -106,7 +107,7 @@ static dpt_sig_S DPTI_sig = { *============================================================================ */ -static DECLARE_MUTEX(adpt_configuration_lock); +static DEFINE_MUTEX(adpt_configuration_lock); static struct i2o_sys_tbl *sys_tbl = NULL; static int sys_tbl_ind = 0; @@ -537,13 +538,13 @@ static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, of */ // Find HBA (host bus adapter) we are looking for - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); for (pHba = hba_chain; pHba; pHba = pHba->next) { if (pHba->host == host) { break; /* found adapter */ } } - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); if (pHba == NULL) { return 0; } @@ -958,7 +959,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev } memset(pHba, 0, sizeof(adpt_hba)); - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); if(hba_chain != NULL){ for(p = hba_chain; p->next; p = p->next); @@ -971,7 +972,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev sprintf(pHba->name, "dpti%d", hba_count); hba_count++; - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); pHba->pDev = pDev; pHba->base_addr_phys = base_addr0_phys; @@ -1027,7 +1028,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba) struct adpt_device* pNext; - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); // scsi_unregister calls our adpt_release which // does a quiese if(pHba->host){ @@ -1046,7 +1047,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba) } hba_count--; - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); iounmap(pHba->base_addr_virt); pci_release_regions(pHba->pDev); @@ -1549,7 +1550,7 @@ static int adpt_i2o_parse_lct(adpt_hba* pHba) static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d) { - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); d->controller=pHba; d->owner=NULL; d->next=pHba->devices; @@ -1560,7 +1561,7 @@ static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d) pHba->devices=d; *d->dev_name = 0; - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); return 0; } @@ -1575,24 +1576,24 @@ static int adpt_open(struct inode *inode, struct file *file) if (minor >= hba_count) { return -ENXIO; } - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); for (pHba = hba_chain; pHba; pHba = pHba->next) { if (pHba->unit == minor) { break; /* found adapter */ } } if (pHba == NULL) { - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); return -ENXIO; } // if(pHba->in_use){ - // up(&adpt_configuration_lock); + // mutex_unlock(&adpt_configuration_lock); // return -EBUSY; // } pHba->in_use = 1; - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); return 0; } @@ -1606,13 +1607,13 @@ static int adpt_close(struct inode *inode, struct file *file) if (minor >= hba_count) { return -ENXIO; } - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); for (pHba = hba_chain; pHba; pHba = pHba->next) { if (pHba->unit == minor) { break; /* found adapter */ } } - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); if (pHba == NULL) { return -ENXIO; } @@ -1910,13 +1911,13 @@ static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, if (minor >= DPTI_MAX_HBA){ return -ENXIO; } - down(&adpt_configuration_lock); + mutex_lock(&adpt_configuration_lock); for (pHba = hba_chain; pHba; pHba = pHba->next) { if (pHba->unit == minor) { break; /* found adapter */ } } - up(&adpt_configuration_lock); + mutex_unlock(&adpt_configuration_lock); if(pHba == NULL){ return -ENXIO; } diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 66783c860a1..58810792349 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c @@ -156,16 +156,16 @@ EXPORT_SYMBOL(scsi_host_set_state); void scsi_remove_host(struct Scsi_Host *shost) { unsigned long flags; - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); spin_lock_irqsave(shost->host_lock, flags); if (scsi_host_set_state(shost, SHOST_CANCEL)) if (scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY)) { spin_unlock_irqrestore(shost->host_lock, flags); - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); return; } spin_unlock_irqrestore(shost->host_lock, flags); - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); scsi_forget_host(shost); scsi_proc_host_rm(shost); @@ -320,7 +320,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) INIT_LIST_HEAD(&shost->starved_list); init_waitqueue_head(&shost->host_wait); - init_MUTEX(&shost->scan_mutex); + mutex_init(&shost->scan_mutex); shost->host_no = scsi_host_next_hn++; /* XXX(hch): still racy */ shost->dma_channel = 0xff; diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 10bcf42cb65..1067d77da10 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -2300,10 +2301,10 @@ iscsi_xmitworker(void *data) /* * serialize Xmit worker on a per-connection basis. */ - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); if (iscsi_data_xmit(conn)) schedule_work(&conn->xmitwork); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); } #define FAILURE_BAD_HOST 1 @@ -2367,11 +2368,11 @@ iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1); spin_unlock(&session->lock); - if (!in_interrupt() && !down_trylock(&conn->xmitsema)) { + if (!in_interrupt() && mutex_trylock(&conn->xmitmutex)) { spin_unlock_irq(host->host_lock); if (iscsi_data_xmit(conn)) schedule_work(&conn->xmitwork); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); spin_lock_irq(host->host_lock); } else schedule_work(&conn->xmitwork); @@ -2531,7 +2532,7 @@ iscsi_conn_create(iscsi_sessionh_t sessionh, uint32_t conn_idx) goto max_recv_dlenght_alloc_fail; init_timer(&conn->tmabort_timer); - init_MUTEX(&conn->xmitsema); + mutex_init(&conn->xmitmutex); init_waitqueue_head(&conn->ehwait); return iscsi_handle(conn); @@ -2561,7 +2562,7 @@ iscsi_conn_destroy(iscsi_connh_t connh) struct iscsi_conn *conn = iscsi_ptr(connh); struct iscsi_session *session = conn->session; - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); set_bit(SUSPEND_BIT, &conn->suspend_tx); if (conn->c_stage == ISCSI_CONN_INITIAL_STAGE && conn->sock) { struct sock *sk = conn->sock->sk; @@ -2592,7 +2593,7 @@ iscsi_conn_destroy(iscsi_connh_t connh) } spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); /* * Block until all in-progress commands for this connection @@ -2796,7 +2797,7 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag) set_bit(SUSPEND_BIT, &conn->suspend_rx); write_unlock_bh(&sk->sk_callback_lock); - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); spin_lock_irqsave(session->host->host_lock, flags); spin_lock(&session->lock); @@ -2878,7 +2879,7 @@ iscsi_conn_stop(iscsi_connh_t connh, int flag) conn->datadgst_en = 0; } } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); } static int @@ -3029,12 +3030,12 @@ iscsi_eh_abort(struct scsi_cmnd *sc) * 1) connection-level failure; * 2) recovery due protocol error; */ - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); spin_lock_bh(&session->lock); if (session->state != ISCSI_STATE_LOGGED_IN) { if (session->state == ISCSI_STATE_TERMINATE) { spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto failed; } spin_unlock_bh(&session->lock); @@ -3052,7 +3053,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) * 2) session was re-open during time out of ctask. */ spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto success; } conn->tmabort_state = TMABORT_INITIAL; @@ -3107,7 +3108,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) conn->tmabort_state == TMABORT_SUCCESS) { conn->tmabort_state = TMABORT_INITIAL; spin_unlock_bh(&session->lock); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); goto success; } conn->tmabort_state = TMABORT_INITIAL; @@ -3116,7 +3117,7 @@ iscsi_eh_abort(struct scsi_cmnd *sc) spin_unlock_bh(&session->lock); } } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); /* @@ -3182,7 +3183,7 @@ failed: exit: del_timer_sync(&conn->tmabort_timer); - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); if (conn->sock) { struct sock *sk = conn->sock->sk; @@ -3190,7 +3191,7 @@ exit: iscsi_ctask_cleanup(conn, ctask); write_unlock_bh(&sk->sk_callback_lock); } - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); return rc; } @@ -3601,9 +3602,9 @@ iscsi_conn_send_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, char *data, struct iscsi_conn *conn = iscsi_ptr(connh); int rc; - down(&conn->xmitsema); + mutex_lock(&conn->xmitmutex); rc = iscsi_conn_send_generic(conn, hdr, data, data_size); - up(&conn->xmitsema); + mutex_unlock(&conn->xmitmutex); return rc; } diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h index 855f2dfd18a..9badafe8820 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -158,7 +158,7 @@ struct iscsi_conn { struct kfifo *mgmtqueue; /* mgmt (control) xmit queue */ struct kfifo *xmitqueue; /* data-path cmd queue */ struct work_struct xmitwork; /* per-conn. xmit workqueue */ - struct semaphore xmitsema; /* serializes connection xmit, + struct mutex xmitmutex; /* serializes connection xmit, * access to kfifos: * * xmitqueue, writequeue, * * immqueue, mgmtqueue */ diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 4a6feb1e5e3..d101a8a6f4e 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -4479,7 +4479,7 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) * serialized. This is so because we want to reserve maximum number of * available command ids for the I/O commands. */ - down(&adapter->int_mtx); + mutex_lock(&adapter->int_mtx); scb = &adapter->int_scb; memset(scb, 0, sizeof(scb_t)); @@ -4527,7 +4527,7 @@ mega_internal_command(adapter_t *adapter, megacmd_t *mc, mega_passthru *pthru) mc->cmd, mc->opcode, mc->subopcode, scmd->result); } - up(&adapter->int_mtx); + mutex_unlock(&adapter->int_mtx); return rval; } @@ -4866,7 +4866,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) adapter->has_64bit_addr = 0; } - init_MUTEX(&adapter->int_mtx); + mutex_init(&adapter->int_mtx); init_completion(&adapter->int_waitq); adapter->this_id = DEFAULT_INITIATOR_ID; diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h index 6f907802574..4b3e0d6e5af 100644 --- a/drivers/scsi/megaraid.h +++ b/drivers/scsi/megaraid.h @@ -2,7 +2,7 @@ #define __MEGARAID_H__ #include - +#include #define MEGARAID_VERSION \ "v2.00.3 (Release Date: Wed Feb 19 08:51:30 EST 2003)\n" @@ -889,7 +889,7 @@ typedef struct { scb_t int_scb; Scsi_Cmnd int_scmd; - struct semaphore int_mtx; /* To synchronize the internal + struct mutex int_mtx; /* To synchronize the internal commands */ struct completion int_waitq; /* wait queue for internal cmds */ diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index 3c32e69afcd..c0bb8061401 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -72,7 +73,7 @@ MODULE_DEVICE_TABLE(pci, megasas_pci_table); static int megasas_mgmt_majorno; static struct megasas_mgmt_info megasas_mgmt_info; static struct fasync_struct *megasas_async_queue; -static DECLARE_MUTEX(megasas_async_queue_mutex); +static DEFINE_MUTEX(megasas_async_queue_mutex); /** * megasas_get_cmd - Get a command from the free pool @@ -2362,11 +2363,11 @@ static int megasas_mgmt_fasync(int fd, struct file *filep, int mode) { int rc; - down(&megasas_async_queue_mutex); + mutex_lock(&megasas_async_queue_mutex); rc = fasync_helper(fd, filep, mode, &megasas_async_queue); - up(&megasas_async_queue_mutex); + mutex_unlock(&megasas_async_queue_mutex); if (rc >= 0) { /* For sanity check when we get ioctl */ diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index ee5f4dfdab1..245ca99a641 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -209,7 +210,7 @@ static struct scsi_host_cmd_pool scsi_cmd_dma_pool = { .gfp_mask = __GFP_DMA, }; -static DECLARE_MUTEX(host_cmd_pool_mutex); +static DEFINE_MUTEX(host_cmd_pool_mutex); static struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask) @@ -330,7 +331,7 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost) * Select a command slab for this host and create it if not * yet existant. */ - down(&host_cmd_pool_mutex); + mutex_lock(&host_cmd_pool_mutex); pool = (shost->unchecked_isa_dma ? &scsi_cmd_dma_pool : &scsi_cmd_pool); if (!pool->users) { pool->slab = kmem_cache_create(pool->name, @@ -342,7 +343,7 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost) pool->users++; shost->cmd_pool = pool; - up(&host_cmd_pool_mutex); + mutex_unlock(&host_cmd_pool_mutex); /* * Get one backup command for this host. @@ -359,7 +360,7 @@ int scsi_setup_command_freelist(struct Scsi_Host *shost) kmem_cache_destroy(pool->slab); return -ENOMEM; fail: - up(&host_cmd_pool_mutex); + mutex_unlock(&host_cmd_pool_mutex); return -ENOMEM; } @@ -381,10 +382,10 @@ void scsi_destroy_command_freelist(struct Scsi_Host *shost) kmem_cache_free(shost->cmd_pool->slab, cmd); } - down(&host_cmd_pool_mutex); + mutex_lock(&host_cmd_pool_mutex); if (!--shost->cmd_pool->users) kmem_cache_destroy(shost->cmd_pool->slab); - up(&host_cmd_pool_mutex); + mutex_unlock(&host_cmd_pool_mutex); } #ifdef CONFIG_SCSI_LOGGING diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c index a50958b1b6e..1b5711e714a 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ static struct proc_dir_entry *proc_scsi; /* Protect sht->present and sht->proc_dir */ -static DECLARE_MUTEX(global_host_template_sem); +static DEFINE_MUTEX(global_host_template_mutex); static int proc_scsi_read(char *buffer, char **start, off_t offset, int length, int *eof, void *data) @@ -83,7 +84,7 @@ void scsi_proc_hostdir_add(struct scsi_host_template *sht) if (!sht->proc_info) return; - down(&global_host_template_sem); + mutex_lock(&global_host_template_mutex); if (!sht->present++) { sht->proc_dir = proc_mkdir(sht->proc_name, proc_scsi); if (!sht->proc_dir) @@ -92,7 +93,7 @@ void scsi_proc_hostdir_add(struct scsi_host_template *sht) else sht->proc_dir->owner = sht->module; } - up(&global_host_template_sem); + mutex_unlock(&global_host_template_mutex); } void scsi_proc_hostdir_rm(struct scsi_host_template *sht) @@ -100,12 +101,12 @@ void scsi_proc_hostdir_rm(struct scsi_host_template *sht) if (!sht->proc_info) return; - down(&global_host_template_sem); + mutex_lock(&global_host_template_mutex); if (!--sht->present && sht->proc_dir) { remove_proc_entry(sht->proc_name, proc_scsi); sht->proc_dir = NULL; } - up(&global_host_template_sem); + mutex_unlock(&global_host_template_mutex); } void scsi_proc_host_add(struct Scsi_Host *shost) diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 05ebb9cef96..edcd80b749c 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -1289,14 +1289,14 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, return ERR_PTR(-ENOMEM); get_device(&starget->dev); - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); if (scsi_host_scan_allowed(shost)) { res = scsi_probe_and_add_lun(starget, lun, NULL, &sdev, 1, hostdata); if (res != SCSI_SCAN_LUN_PRESENT) sdev = ERR_PTR(-ENODEV); } - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); scsi_target_reap(starget); put_device(&starget->dev); @@ -1404,10 +1404,10 @@ void scsi_scan_target(struct device *parent, unsigned int channel, { struct Scsi_Host *shost = dev_to_shost(parent); - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); if (scsi_host_scan_allowed(shost)) __scsi_scan_target(parent, channel, id, lun, rescan); - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); } EXPORT_SYMBOL(scsi_scan_target); @@ -1454,7 +1454,7 @@ int scsi_scan_host_selected(struct Scsi_Host *shost, unsigned int channel, ((lun != SCAN_WILD_CARD) && (lun > shost->max_lun))) return -EINVAL; - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); if (scsi_host_scan_allowed(shost)) { if (channel == SCAN_WILD_CARD) for (channel = 0; channel <= shost->max_channel; @@ -1464,7 +1464,7 @@ int scsi_scan_host_selected(struct Scsi_Host *shost, unsigned int channel, else scsi_scan_channel(shost, channel, id, lun, rescan); } - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); return 0; } @@ -1522,7 +1522,7 @@ struct scsi_device *scsi_get_host_dev(struct Scsi_Host *shost) struct scsi_device *sdev = NULL; struct scsi_target *starget; - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); if (!scsi_host_scan_allowed(shost)) goto out; starget = scsi_alloc_target(&shost->shost_gendev, 0, shost->this_id); @@ -1536,7 +1536,7 @@ struct scsi_device *scsi_get_host_dev(struct Scsi_Host *shost) } put_device(&starget->dev); out: - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); return sdev; } EXPORT_SYMBOL(scsi_get_host_dev); diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index ea7f3a43357..2cb962751a7 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -745,9 +745,9 @@ void scsi_remove_device(struct scsi_device *sdev) { struct Scsi_Host *shost = sdev->host; - down(&shost->scan_mutex); + mutex_lock(&shost->scan_mutex); __scsi_remove_device(sdev); - up(&shost->scan_mutex); + mutex_unlock(&shost->scan_mutex); } EXPORT_SYMBOL(scsi_remove_device); diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index e08462d50c9..50ed88f98f4 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -46,7 +47,7 @@ struct iscsi_internal { struct list_head sessions; /* * lock to serialize access to the sessions list which must - * be taken after the rx_queue_sema + * be taken after the rx_queue_mutex */ spinlock_t session_lock; /* @@ -70,7 +71,7 @@ struct iscsi_internal { /* * list of registered transports and lock that must * be held while accessing list. The iscsi_transport_lock must - * be acquired after the rx_queue_sema. + * be acquired after the rx_queue_mutex. */ static LIST_HEAD(iscsi_transports); static DEFINE_SPINLOCK(iscsi_transport_lock); @@ -145,7 +146,7 @@ static DECLARE_TRANSPORT_CLASS(iscsi_connection_class, static struct sock *nls; static int daemon_pid; -static DECLARE_MUTEX(rx_queue_sema); +static DEFINE_MUTEX(rx_queue_mutex); struct mempool_zone { mempool_t *pool; @@ -881,7 +882,7 @@ iscsi_if_rx(struct sock *sk, int len) { struct sk_buff *skb; - down(&rx_queue_sema); + mutex_lock(&rx_queue_mutex); while ((skb = skb_dequeue(&sk->sk_receive_queue)) != NULL) { while (skb->len >= NLMSG_SPACE(0)) { int err; @@ -923,7 +924,7 @@ iscsi_if_rx(struct sock *sk, int len) } kfree_skb(skb); } - up(&rx_queue_sema); + mutex_unlock(&rx_queue_mutex); } /* @@ -1159,7 +1160,7 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) BUG_ON(!tt); - down(&rx_queue_sema); + mutex_lock(&rx_queue_mutex); priv = iscsi_if_transport_lookup(tt); BUG_ON (!priv); @@ -1167,7 +1168,7 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) spin_lock_irqsave(&priv->session_lock, flags); if (!list_empty(&priv->sessions)) { spin_unlock_irqrestore(&priv->session_lock, flags); - up(&rx_queue_sema); + mutex_unlock(&rx_queue_mutex); return -EPERM; } spin_unlock_irqrestore(&priv->session_lock, flags); @@ -1181,7 +1182,7 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) sysfs_remove_group(&priv->cdev.kobj, &iscsi_transport_group); class_device_unregister(&priv->cdev); - up(&rx_queue_sema); + mutex_unlock(&rx_queue_mutex); return 0; } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 4c5127ed379..fbd8e1bbad3 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -111,7 +112,7 @@ static DEFINE_SPINLOCK(sd_index_lock); /* This semaphore is used to mediate the 0->1 reference get in the * face of object destruction (i.e. we can't allow a get on an * object after last put) */ -static DECLARE_MUTEX(sd_ref_sem); +static DEFINE_MUTEX(sd_ref_mutex); static int sd_revalidate_disk(struct gendisk *disk); static void sd_rw_intr(struct scsi_cmnd * SCpnt); @@ -193,9 +194,9 @@ static struct scsi_disk *scsi_disk_get(struct gendisk *disk) { struct scsi_disk *sdkp; - down(&sd_ref_sem); + mutex_lock(&sd_ref_mutex); sdkp = __scsi_disk_get(disk); - up(&sd_ref_sem); + mutex_unlock(&sd_ref_mutex); return sdkp; } @@ -203,11 +204,11 @@ static struct scsi_disk *scsi_disk_get_from_dev(struct device *dev) { struct scsi_disk *sdkp; - down(&sd_ref_sem); + mutex_lock(&sd_ref_mutex); sdkp = dev_get_drvdata(dev); if (sdkp) sdkp = __scsi_disk_get(sdkp->disk); - up(&sd_ref_sem); + mutex_unlock(&sd_ref_mutex); return sdkp; } @@ -215,10 +216,10 @@ static void scsi_disk_put(struct scsi_disk *sdkp) { struct scsi_device *sdev = sdkp->device; - down(&sd_ref_sem); + mutex_lock(&sd_ref_mutex); kref_put(&sdkp->kref, scsi_disk_release); scsi_device_put(sdev); - up(&sd_ref_sem); + mutex_unlock(&sd_ref_mutex); } /** @@ -1635,10 +1636,10 @@ static int sd_remove(struct device *dev) del_gendisk(sdkp->disk); sd_shutdown(dev); - down(&sd_ref_sem); + mutex_lock(&sd_ref_mutex); dev_set_drvdata(dev, NULL); kref_put(&sdkp->kref, scsi_disk_release); - up(&sd_ref_sem); + mutex_unlock(&sd_ref_mutex); return 0; } @@ -1647,7 +1648,7 @@ static int sd_remove(struct device *dev) * scsi_disk_release - Called to free the scsi_disk structure * @kref: pointer to embedded kref * - * sd_ref_sem must be held entering this routine. Because it is + * sd_ref_mutex must be held entering this routine. Because it is * called on last put, you should always use the scsi_disk_get() * scsi_disk_put() helpers which manipulate the semaphore directly * and never do a direct kref_put(). diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index a4d9be7c687..ec73223ad2e 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -90,7 +91,7 @@ static DEFINE_SPINLOCK(sr_index_lock); /* This semaphore is used to mediate the 0->1 reference get in the * face of object destruction (i.e. we can't allow a get on an * object after last put) */ -static DECLARE_MUTEX(sr_ref_sem); +static DEFINE_MUTEX(sr_ref_mutex); static int sr_open(struct cdrom_device_info *, int); static void sr_release(struct cdrom_device_info *); @@ -133,7 +134,7 @@ static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk) { struct scsi_cd *cd = NULL; - down(&sr_ref_sem); + mutex_lock(&sr_ref_mutex); if (disk->private_data == NULL) goto out; cd = scsi_cd(disk); @@ -146,7 +147,7 @@ static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk) kref_put(&cd->kref, sr_kref_release); cd = NULL; out: - up(&sr_ref_sem); + mutex_unlock(&sr_ref_mutex); return cd; } @@ -154,10 +155,10 @@ static inline void scsi_cd_put(struct scsi_cd *cd) { struct scsi_device *sdev = cd->device; - down(&sr_ref_sem); + mutex_lock(&sr_ref_mutex); kref_put(&cd->kref, sr_kref_release); scsi_device_put(sdev); - up(&sr_ref_sem); + mutex_unlock(&sr_ref_mutex); } /* @@ -845,7 +846,7 @@ static int sr_packet(struct cdrom_device_info *cdi, * sr_kref_release - Called to free the scsi_cd structure * @kref: pointer to embedded kref * - * sr_ref_sem must be held entering this routine. Because it is + * sr_ref_mutex must be held entering this routine. Because it is * called on last put, you should always use the scsi_cd_get() * scsi_cd_put() helpers which manipulate the semaphore directly * and never do a direct kref_put(). @@ -874,9 +875,9 @@ static int sr_remove(struct device *dev) del_gendisk(cd->disk); - down(&sr_ref_sem); + mutex_lock(&sr_ref_mutex); kref_put(&cd->kref, sr_kref_release); - up(&sr_ref_sem); + mutex_unlock(&sr_ref_mutex); return 0; } diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index c4aade8f534..6e4a36af58c 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -38,6 +38,7 @@ static const char *verstr = "20050830"; #include #include #include +#include #include #include @@ -220,7 +221,7 @@ static void scsi_tape_release(struct kref *); #define to_scsi_tape(obj) container_of(obj, struct scsi_tape, kref) -static DECLARE_MUTEX(st_ref_sem); +static DEFINE_MUTEX(st_ref_mutex); #include "osst_detect.h" @@ -237,7 +238,7 @@ static struct scsi_tape *scsi_tape_get(int dev) { struct scsi_tape *STp = NULL; - down(&st_ref_sem); + mutex_lock(&st_ref_mutex); write_lock(&st_dev_arr_lock); if (dev < st_dev_max && scsi_tapes != NULL) @@ -259,7 +260,7 @@ out_put: STp = NULL; out: write_unlock(&st_dev_arr_lock); - up(&st_ref_sem); + mutex_unlock(&st_ref_mutex); return STp; } @@ -267,10 +268,10 @@ static void scsi_tape_put(struct scsi_tape *STp) { struct scsi_device *sdev = STp->device; - down(&st_ref_sem); + mutex_lock(&st_ref_mutex); kref_put(&STp->kref, scsi_tape_release); scsi_device_put(sdev); - up(&st_ref_sem); + mutex_unlock(&st_ref_mutex); } struct st_reject_data { @@ -4141,9 +4142,9 @@ static int st_remove(struct device *dev) } } - down(&st_ref_sem); + mutex_lock(&st_ref_mutex); kref_put(&tpnt->kref, scsi_tape_release); - up(&st_ref_sem); + mutex_unlock(&st_ref_mutex); return 0; } } @@ -4156,7 +4157,7 @@ static int st_remove(struct device *dev) * scsi_tape_release - Called to free the Scsi_Tape structure * @kref: pointer to embedded kref * - * st_ref_sem must be held entering this routine. Because it is + * st_ref_mutex must be held entering this routine. Because it is * called on last put, you should always use the scsi_tape_get() * scsi_tape_put() helpers which manipulate the semaphore directly * and never do a direct kref_put(). -- cgit v1.2.3 From 33b114e935a2202206e224dd2c695cee5a5986bf Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 11 Jan 2006 14:20:43 +0100 Subject: [SCSI] sas: clear parent->rphy in sas_rphy_delete We need to clear the backpointer on rphy removal, else we'll run into problems with host removal after a device has been hot unplugged. Signed-off-by: Christoph Hellwig Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_sas.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index edabbd05d25..357b52f5f99 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -697,6 +697,8 @@ sas_rphy_delete(struct sas_rphy *rphy) list_del(&rphy->list); spin_unlock(&sas_host->lock); + parent->rphy = NULL; + put_device(&parent->dev); } EXPORT_SYMBOL(sas_rphy_delete); -- cgit v1.2.3 From 6e289a9023d589c24f86b29186d324215cdc9947 Mon Sep 17 00:00:00 2001 From: Mark Haverkamp Date: Wed, 11 Jan 2006 09:28:07 -0800 Subject: [SCSI] aacraid: Fix default FIB size Received from Mark Salyzyn. If the adapter has not instructed us otherwise that it can handle a 'large' FIB, then it can handle at most a 2KB FIB. Signed-off-by: Mark Haverkamp Signed-off-by: James Bottomley --- drivers/scsi/aacraid/commctrl.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index ef623bd965f..4fe79cd7c95 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c @@ -85,6 +85,10 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg) if (size < le16_to_cpu(kfib->header.SenderSize)) size = le16_to_cpu(kfib->header.SenderSize); if (size > dev->max_fib_size) { + if (size > 2048) { + retval = -EINVAL; + goto cleanup; + } /* Highjack the hw_fib */ hw_fib = fibptr->hw_fib; hw_fib_pa = fibptr->hw_fib_pa; -- cgit v1.2.3 From 7686f132653fa3d52d45c3f021215f714094f1ca Mon Sep 17 00:00:00 2001 From: Mark Haverkamp Date: Wed, 11 Jan 2006 09:28:16 -0800 Subject: [SCSI] aacraid: better sysfs adapter information Received from Mark Salyzyn. Provide more accurate adapter information. Allows the Adapter Firmware to override the Adapter product information. Signed-off-by: Mark Haverkamp Signed-off-by: James Bottomley --- drivers/scsi/aacraid/linit.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 9b9062f0246..d183a072a9d 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -574,7 +574,15 @@ static ssize_t aac_show_model(struct class_device *class_dev, struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata; int len; - len = snprintf(buf, PAGE_SIZE, "%s\n", + if (dev->supplement_adapter_info.AdapterTypeText[0]) { + char * cp = dev->supplement_adapter_info.AdapterTypeText; + while (*cp && *cp != ' ') + ++cp; + while (*cp == ' ') + ++cp; + len = snprintf(buf, PAGE_SIZE, "%s\n", cp); + } else + len = snprintf(buf, PAGE_SIZE, "%s\n", aac_drivers[dev->cardtype].model); return len; } @@ -585,7 +593,15 @@ static ssize_t aac_show_vendor(struct class_device *class_dev, struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata; int len; - len = snprintf(buf, PAGE_SIZE, "%s\n", + if (dev->supplement_adapter_info.AdapterTypeText[0]) { + char * cp = dev->supplement_adapter_info.AdapterTypeText; + while (*cp && *cp != ' ') + ++cp; + len = snprintf(buf, PAGE_SIZE, "%.*s\n", + (int)(cp - (char *)dev->supplement_adapter_info.AdapterTypeText), + dev->supplement_adapter_info.AdapterTypeText); + } else + len = snprintf(buf, PAGE_SIZE, "%s\n", aac_drivers[dev->cardtype].vname); return len; } -- cgit v1.2.3 From db39363c029cd9e74661ef059a17785d1c62a851 Mon Sep 17 00:00:00 2001 From: Mark Haverkamp Date: Wed, 11 Jan 2006 09:28:29 -0800 Subject: [SCSI] aacraid: 17 element sg performance update Received From Mark Salyzyn. The Jaguar and Corsair class of adapters (2410, 2810, 2610, 21610, CERC) perform better (about 10% better read performance, write performance neutral) with current Firmware if the OS limits the number of scatter gather elements to 17 per request. Signed-off-by: Mark Haverkamp Signed-off-by: James Bottomley --- drivers/scsi/aacraid/aacraid.h | 7 +++++++ drivers/scsi/aacraid/linit.c | 15 +++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 30fd8d6e3f3..66dbb6d2c50 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h @@ -531,6 +531,13 @@ struct aac_driver_ident */ #define AAC_QUIRK_MASTER 0x0008 +/* + * Some adapter firmware perform poorly when it must split up scatter gathers + * in order to deal with the limits of the underlying CHIM. This limit in this + * class of adapters is 17 scatter gather elements. + */ +#define AAC_QUIRK_17SG 0x0010 + /* * The adapter interface specs all queues to be located in the same * physically contigous block. The host structure that defines the diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index d183a072a9d..0bf5f9a943e 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -200,10 +200,10 @@ static struct aac_driver_ident aac_drivers[] = { { aac_rkt_init, "aacraid", "ADAPTEC ", "Callisto ", 2, AAC_QUIRK_MASTER }, /* Jupiter Platform */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-2020SA ", 1 }, /* ASR-2020SA SATA PCI-X ZCR (Skyhawk) */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-2025SA ", 1 }, /* ASR-2025SA SATA SO-DIMM PCI-X ZCR (Terminator) */ - { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2410SA SATA ", 1 }, /* AAR-2410SA PCI SATA 4ch (Jaguar II) */ - { aac_rx_init, "aacraid", "DELL ", "CERC SR2 ", 1 }, /* CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) */ - { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2810SA SATA ", 1 }, /* AAR-2810SA PCI SATA 8ch (Corsair-8) */ - { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-21610SA SATA", 1 }, /* AAR-21610SA PCI SATA 16ch (Corsair-16) */ + { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2410SA SATA ", 1, AAC_QUIRK_17SG }, /* AAR-2410SA PCI SATA 4ch (Jaguar II) */ + { aac_rx_init, "aacraid", "DELL ", "CERC SR2 ", 1, AAC_QUIRK_17SG }, /* CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) */ + { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2810SA SATA ", 1, AAC_QUIRK_17SG }, /* AAR-2810SA PCI SATA 8ch (Corsair-8) */ + { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-21610SA SATA", 1, AAC_QUIRK_17SG }, /* AAR-21610SA PCI SATA 16ch (Corsair-16) */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-2026ZCR ", 1 }, /* ESD SO-DIMM PCI-X SATA ZCR (Prowler) */ { aac_rx_init, "aacraid", "ADAPTEC ", "AAR-2610SA ", 1 }, /* SATA 6Ch (Bearcat) */ { aac_rx_init, "aacraid", "ADAPTEC ", "ASR-2240S ", 1 }, /* ASR-2240S (SabreExpress) */ @@ -853,6 +853,13 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, = (aac->scsi_host_ptr->sg_tablesize * 8) + 112; } + if ((aac_drivers[index].quirks & AAC_QUIRK_17SG) && + (aac->scsi_host_ptr->sg_tablesize > 17)) { + aac->scsi_host_ptr->sg_tablesize = 17; + aac->scsi_host_ptr->max_sectors + = (aac->scsi_host_ptr->sg_tablesize * 8) + 112; + } + /* * Firware printf works only with older firmware. */ -- cgit v1.2.3 From 6171b5eff2ef3f84333af652e8c7b0838bf72945 Mon Sep 17 00:00:00 2001 From: Mark Haverkamp Date: Wed, 11 Jan 2006 09:28:57 -0800 Subject: [SCSI] aacraid: README update Received From Mark Salyzyn. Move the README from the driver directory to the Documentation directory. Updated the documentation, added descriptions for cards that were missing. Signed-off-by: Mark Haverkamp Signed-off-by: James Bottomley --- drivers/scsi/aacraid/README | 74 --------------------------------------------- 1 file changed, 74 deletions(-) delete mode 100644 drivers/scsi/aacraid/README (limited to 'drivers/scsi') diff --git a/drivers/scsi/aacraid/README b/drivers/scsi/aacraid/README deleted file mode 100644 index 4193865d419..00000000000 --- a/drivers/scsi/aacraid/README +++ /dev/null @@ -1,74 +0,0 @@ -AACRAID Driver for Linux (take two) - -Introduction -------------------------- -The aacraid driver adds support for Adaptec (http://www.adaptec.com) -RAID controllers. This is a major rewrite from the original -Adaptec supplied driver. It has signficantly cleaned up both the code -and the running binary size (the module is less than half the size of -the original). - -Supported Cards/Chipsets -------------------------- - Adaptec 2020S - Adaptec 2025S - Adaptec 2120S - Adaptec 2130S - Adaptec 2200S - Adaptec 2230S - Adaptec 2240S - Adaptec 2410SA - Adaptec 2610SA - Adaptec 2810SA - Adaptec 21610SA - Adaptec 3230S - Adaptec 3240S - Adaptec 4000SAS - Adaptec 4005SAS - Adaptec 4800SAS - Adaptec 4805SAS - Adaptec 5400S - Dell PERC 2 Quad Channel - Dell PERC 2/Si - Dell PERC 3/Si - Dell PERC 3/Di - Dell CERC 2 - HP NetRAID-4M - Legend S220 - Legend S230 - IBM ServeRAID 8i - ICP 9014R0 - ICP 9024R0 - ICP 9047MA - ICP 9087MA - ICP 9085LI - ICP 5085AU - -People -------------------------- -Alan Cox -Christoph Hellwig (updates for new-style PCI probing and SCSI host registration, - small cleanups/fixes) -Matt Domsch (revision ioctl, adapter messages) -Deanna Bonds (non-DASD support, PAE fibs and 64 bit, added new adaptec controllers - added new ioctls, changed scsi interface to use new error handler, - increased the number of fibs and outstanding commands to a container) - - (fixed 64bit and 64G memory model, changed confusing naming convention - where fibs that go to the hardware are consistently called hw_fibs and - not just fibs like the name of the driver tracking structure) -Mark Salyzyn Fixed panic issues and added some new product ids for upcoming hbas. Performance tuning, card failover and bug mitigations. - -Original Driver -------------------------- -Adaptec Unix OEM Product Group - -Mailing List -------------------------- -linux-scsi@vger.kernel.org (Interested parties troll here) -Also note this is very different to Brian's original driver -so don't expect him to support it. -Adaptec does support this driver. Contact either tech support or Mark Salyzyn. - -Original by Brian Boerner February 2001 -Rewritten by Alan Cox, November 2001 -- cgit v1.2.3 From bcc1e382bce8de4f26182c6447916f9c82b0fbe5 Mon Sep 17 00:00:00 2001 From: Chuck Ebbert <76306.1226@compuserve.com> Date: Wed, 11 Jan 2006 23:58:40 -0500 Subject: [SCSI] Mask capabilities for SCSI-1 CD drive SCSI-1 CD drives can't do MRW or be opened for writing, so mask off those capabilities. Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com> Acked-by: Jens Axboe Signed-off-by: James Bottomley --- drivers/scsi/sr.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index ec73223ad2e..18a3b756c63 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -763,8 +763,9 @@ static void get_capabilities(struct scsi_cd *cd) /* failed, drive doesn't have capabilities mode page */ cd->cdi.speed = 1; cd->cdi.mask |= (CDC_CD_R | CDC_CD_RW | CDC_DVD_R | - CDC_DVD | CDC_DVD_RAM | - CDC_SELECT_DISC | CDC_SELECT_SPEED); + CDC_DVD | CDC_DVD_RAM | + CDC_SELECT_DISC | CDC_SELECT_SPEED | + CDC_MRW | CDC_MRW_W | CDC_RAM); kfree(buffer); printk("%s: scsi-1 drive\n", cd->cdi.name); return; -- cgit v1.2.3 From 5e46631b04382ef14255467288052f29cb77daeb Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 12 Jan 2006 12:04:28 +0100 Subject: [SCSI] aic7xxx/aic79xx: New device ids Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx_pci.c | 24 +++++++++++++++--------- drivers/scsi/aic7xxx/aic79xx_pci.h | 5 +++-- drivers/scsi/aic7xxx/aic7xxx_pci.c | 24 +++++++++++++++++++++--- drivers/scsi/aic7xxx/aic7xxx_pci.h | 1 + 4 files changed, 40 insertions(+), 14 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.c b/drivers/scsi/aic7xxx/aic79xx_pci.c index 2131db60018..196a6344b03 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.c +++ b/drivers/scsi/aic7xxx/aic79xx_pci.c @@ -38,9 +38,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#77 $ - * - * $FreeBSD$ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx_pci.c#89 $ */ #ifdef __linux__ @@ -114,6 +112,13 @@ struct ahd_pci_identity ahd_pci_ident_table [] = "Adaptec 29320ALP Ultra320 SCSI adapter", ahd_aic7901_setup }, + /* aic7901A based controllers */ + { + ID_AHA_29320LP, + ID_ALL_MASK, + "Adaptec 29320LP Ultra320 SCSI adapter", + ahd_aic7901A_setup + }, /* aic7902 based controllers */ { ID_AHA_29320, @@ -127,12 +132,6 @@ struct ahd_pci_identity ahd_pci_ident_table [] = "Adaptec 29320B Ultra320 SCSI adapter", ahd_aic7902_setup }, - { - ID_AHA_29320LP, - ID_ALL_MASK, - "Adaptec 29320LP Ultra320 SCSI adapter", - ahd_aic7901A_setup - }, { ID_AHA_39320, ID_ALL_MASK, @@ -145,6 +144,12 @@ struct ahd_pci_identity ahd_pci_ident_table [] = "Adaptec 39320 Ultra320 SCSI adapter", ahd_aic7902_setup }, + { + ID_AHA_39320_B_DELL, + ID_ALL_MASK, + "Adaptec (Dell OEM) 39320 Ultra320 SCSI adapter", + ahd_aic7902_setup + }, { ID_AHA_39320A, ID_ALL_MASK, @@ -668,6 +673,7 @@ ahd_configure_termination(struct ahd_softc *ahd, u_int adapter_control) * Now set the termination based on what we found. */ sxfrctl1 = ahd_inb(ahd, SXFRCTL1) & ~STPWEN; + ahd->flags &= ~AHD_TERM_ENB_A; if ((termctl & FLX_TERMCTL_ENPRILOW) != 0) { ahd->flags |= AHD_TERM_ENB_A; sxfrctl1 |= STPWEN; diff --git a/drivers/scsi/aic7xxx/aic79xx_pci.h b/drivers/scsi/aic7xxx/aic79xx_pci.h index b5cfeabdfec..da45153668c 100644 --- a/drivers/scsi/aic7xxx/aic79xx_pci.h +++ b/drivers/scsi/aic7xxx/aic79xx_pci.h @@ -53,14 +53,15 @@ #define ID_AHA_29320ALP 0x8017900500449005ull #define ID_AIC7901A 0x801E9005FFFF9005ull -#define ID_AHA_29320 0x8012900500429005ull -#define ID_AHA_29320B 0x8013900500439005ull #define ID_AHA_29320LP 0x8014900500449005ull #define ID_AIC7902 0x801F9005FFFF9005ull #define ID_AIC7902_B 0x801D9005FFFF9005ull #define ID_AHA_39320 0x8010900500409005ull +#define ID_AHA_29320 0x8012900500429005ull +#define ID_AHA_29320B 0x8013900500439005ull #define ID_AHA_39320_B 0x8015900500409005ull +#define ID_AHA_39320_B_DELL 0x8015900501681028ull #define ID_AHA_39320A 0x8016900500409005ull #define ID_AHA_39320D 0x8011900500419005ull #define ID_AHA_39320D_B 0x801C900500419005ull diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.c b/drivers/scsi/aic7xxx/aic7xxx_pci.c index b3b2e2237eb..5f586140e05 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.c +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.c @@ -39,9 +39,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#69 $ - * - * $FreeBSD$ + * $Id: //depot/aic7xxx/aic7xxx/aic7xxx_pci.c#79 $ */ #ifdef __linux__ @@ -393,6 +391,12 @@ struct ahc_pci_identity ahc_pci_ident_table [] = "Adaptec aic7892 Ultra160 SCSI adapter (ARO)", ahc_aic7892_setup }, + { + ID_AHA_2915_30LP, + ID_ALL_MASK, + "Adaptec 2915/30LP Ultra160 SCSI adapter", + ahc_aic7892_setup + }, /* aic7895 based controllers */ { ID_AHA_2940U_DUAL, @@ -1193,9 +1197,19 @@ ahc_pci_test_register_access(struct ahc_softc *ahc) * use for this test. */ hcntrl = ahc_inb(ahc, HCNTRL); + if (hcntrl == 0xFF) goto fail; + if ((hcntrl & CHIPRST) != 0) { + /* + * The chip has not been initialized since + * PCI/EISA/VLB bus reset. Don't trust + * "left over BIOS data". + */ + ahc->flags |= AHC_NO_BIOS_INIT; + } + /* * Next create a situation where write combining * or read prefetching could be initiated by the @@ -1307,6 +1321,10 @@ check_extport(struct ahc_softc *ahc, u_int *sxfrctl1) sd.sd_chip = C56_66; } ahc_release_seeprom(&sd); + + /* Remember the SEEPROM type for later */ + if (sd.sd_chip == C56_66) + ahc->flags |= AHC_LARGE_SEEPROM; } if (!have_seeprom) { diff --git a/drivers/scsi/aic7xxx/aic7xxx_pci.h b/drivers/scsi/aic7xxx/aic7xxx_pci.h index be27fcb2034..263f85da405 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_pci.h +++ b/drivers/scsi/aic7xxx/aic7xxx_pci.h @@ -105,6 +105,7 @@ #define ID_AHA_29160C 0x0080900562209005ull #define ID_AHA_29160B 0x00809005E2209005ull #define ID_AHA_19160B 0x0081900562A19005ull +#define ID_AHA_2915_30LP 0x0082900502109005ull #define ID_AIC7896 0x005F9005FFFF9005ull #define ID_AIC7896_ARO 0x00539005FFFF9005ull -- cgit v1.2.3 From 66a0683e4620f087e41e79d4d2be6c5a06bb206b Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 12 Jan 2006 12:05:46 +0100 Subject: [SCSI] aic79xx: Use struct map_node Use struct map_node instead of separate variables. Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx.h | 27 +++++++++++++++++---------- drivers/scsi/aic7xxx/aic79xx_core.c | 30 +++++++++++++++++------------- drivers/scsi/aic7xxx/aic79xx_inline.h | 34 ++++++++++++++++++++++++---------- 3 files changed, 58 insertions(+), 33 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index 653fb0b42ae..ac3d07a2a28 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h @@ -37,7 +37,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#95 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.h#108 $ * * $FreeBSD$ */ @@ -1062,6 +1062,7 @@ struct ahd_softc { struct scb_data scb_data; struct hardware_scb *next_queued_hscb; + struct map_node *next_queued_hscb_map; /* * SCBs that have been sent to the controller @@ -1140,10 +1141,6 @@ struct ahd_softc { ahd_flag flags; struct seeprom_config *seep_config; - /* Values to store in the SEQCTL register for pause and unpause */ - uint8_t unpause; - uint8_t pause; - /* Command Queues */ uint16_t qoutfifonext; uint16_t qoutfifonext_valid_tag; @@ -1151,6 +1148,17 @@ struct ahd_softc { uint16_t qinfifo[AHD_SCB_MAX]; uint16_t *qoutfifo; + /* + * Our qfreeze count. The sequencer compares + * this value with its own counter to determine + * whether to allow selections to occur. + */ + uint16_t qfreeze_cnt; + + /* Values to store in the SEQCTL register for pause and unpause */ + uint8_t unpause; + uint8_t pause; + /* Critical Section Data */ struct cs *critical_sections; u_int num_critical_sections; @@ -1197,8 +1205,7 @@ struct ahd_softc { */ bus_dma_tag_t parent_dmat; bus_dma_tag_t shared_data_dmat; - bus_dmamap_t shared_data_dmamap; - dma_addr_t shared_data_busaddr; + struct map_node shared_data_map; /* Information saved through suspend/resume cycles */ struct ahd_suspend_state suspend_state; @@ -1296,9 +1303,9 @@ struct ahd_devinfo { }; /****************************** PCI Structures ********************************/ -#define AHD_PCI_IOADDR0 PCIR_MAPS /* I/O BAR*/ -#define AHD_PCI_MEMADDR (PCIR_MAPS + 4) /* Memory BAR */ -#define AHD_PCI_IOADDR1 (PCIR_MAPS + 12)/* Second I/O BAR */ +#define AHD_PCI_IOADDR0 PCIR_BAR(0) /* I/O BAR*/ +#define AHD_PCI_MEMADDR PCIR_BAR(1) /* Memory BAR */ +#define AHD_PCI_IOADDR1 PCIR_BAR(3) /* Second I/O BAR */ typedef int (ahd_device_setup_t)(struct ahd_softc *); diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 4e8f00df978..55c44bf5405 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c @@ -5203,13 +5203,13 @@ ahd_free(struct ahd_softc *ahd) /* FALLTHROUGH */ case 4: ahd_dmamap_unload(ahd, ahd->shared_data_dmat, - ahd->shared_data_dmamap); + ahd->shared_data_map.dmamap); /* FALLTHROUGH */ case 3: ahd_dmamem_free(ahd, ahd->shared_data_dmat, ahd->qoutfifo, - ahd->shared_data_dmamap); + ahd->shared_data_map.dmamap); ahd_dmamap_destroy(ahd, ahd->shared_data_dmat, - ahd->shared_data_dmamap); + ahd->shared_data_map.dmamap); /* FALLTHROUGH */ case 2: ahd_dma_tag_destroy(ahd, ahd->shared_data_dmat); @@ -6088,7 +6088,6 @@ static const char *termstat_strings[] = { int ahd_init(struct ahd_softc *ahd) { - uint8_t *base_vaddr; uint8_t *next_vaddr; dma_addr_t next_baddr; size_t driver_data_size; @@ -6178,20 +6177,23 @@ ahd_init(struct ahd_softc *ahd) /* Allocation of driver data */ if (ahd_dmamem_alloc(ahd, ahd->shared_data_dmat, - (void **)&base_vaddr, - BUS_DMA_NOWAIT, &ahd->shared_data_dmamap) != 0) { + (void **)&ahd->shared_data_map.vaddr, + BUS_DMA_NOWAIT, + &ahd->shared_data_map.dmamap) != 0) { return (ENOMEM); } ahd->init_level++; /* And permanently map it in */ - ahd_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap, - base_vaddr, driver_data_size, ahd_dmamap_cb, - &ahd->shared_data_busaddr, /*flags*/0); - ahd->qoutfifo = (uint16_t *)base_vaddr; + ahd_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, + ahd->shared_data_map.vaddr, driver_data_size, + ahd_dmamap_cb, &ahd->shared_data_map.physaddr, + /*flags*/0); + ahd->qoutfifo = (uint16_t *)ahd->shared_data_map.vaddr; next_vaddr = (uint8_t *)&ahd->qoutfifo[AHD_QOUT_SIZE]; - next_baddr = ahd->shared_data_busaddr + AHD_QOUT_SIZE*sizeof(uint16_t); + next_baddr = ahd->shared_data_map.physaddr + + AHD_QOUT_SIZE*sizeof(uint16_t); if ((ahd->features & AHD_TARGETMODE) != 0) { ahd->targetcmds = (struct target_cmd *)next_vaddr; next_vaddr += AHD_TMODE_CMDS * sizeof(struct target_cmd); @@ -6212,6 +6214,7 @@ ahd_init(struct ahd_softc *ahd) * specially from the DMA safe memory chunk used for the QOUTFIFO. */ ahd->next_queued_hscb = (struct hardware_scb *)next_vaddr; + ahd->next_queued_hscb_map = &ahd->shared_data_map; ahd->next_queued_hscb->hscb_busaddr = ahd_htole32(next_baddr); ahd->init_level++; @@ -6557,12 +6560,13 @@ ahd_chip_init(struct ahd_softc *ahd) /* * The Freeze Count is 0. */ + ahd->qfreeze_cnt = 0; ahd_outw(ahd, QFREEZE_COUNT, 0); /* * Tell the sequencer where it can find our arrays in memory. */ - busaddr = ahd->shared_data_busaddr; + busaddr = ahd->shared_data_map.physaddr; ahd_outb(ahd, SHARED_DATA_ADDR, busaddr & 0xFF); ahd_outb(ahd, SHARED_DATA_ADDR + 1, (busaddr >> 8) & 0xFF); ahd_outb(ahd, SHARED_DATA_ADDR + 2, (busaddr >> 16) & 0xFF); @@ -9651,7 +9655,7 @@ ahd_run_tqinfifo(struct ahd_softc *ahd, int paused) cmd->cmd_valid = 0; ahd_dmamap_sync(ahd, ahd->shared_data_dmat, - ahd->shared_data_dmamap, + ahd->shared_data_map.dmamap, ahd_targetcmd_offset(ahd, ahd->tqinfifonext), sizeof(struct target_cmd), BUS_DMASYNC_PREREAD); diff --git a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h index d80bc5161fb..2b7ff989f3d 100644 --- a/drivers/scsi/aic7xxx/aic79xx_inline.h +++ b/drivers/scsi/aic7xxx/aic79xx_inline.h @@ -37,7 +37,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#51 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#58 $ * * $FreeBSD$ */ @@ -522,12 +522,21 @@ do { \ static __inline uint16_t ahd_inw(struct ahd_softc *ahd, u_int port) { + /* + * Read high byte first as some registers increment + * or have other side effects when the low byte is + * read. + */ return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port)); } static __inline void ahd_outw(struct ahd_softc *ahd, u_int port, u_int value) { + /* + * Write low byte first to accomodate registers + * such as PRGMCNT where the order maters. + */ ahd_outb(ahd, port, value & 0xFF); ahd_outb(ahd, port+1, (value >> 8) & 0xFF); } @@ -684,7 +693,7 @@ ahd_inb_scbram(struct ahd_softc *ahd, u_int offset) * Razor #528 */ value = ahd_inb(ahd, offset); - if ((ahd->flags & AHD_PCIX_SCBRAM_RD_BUG) != 0) + if ((ahd->bugs & AHD_PCIX_SCBRAM_RD_BUG) != 0) ahd_inb(ahd, MODE_PTR); return (value); } @@ -727,7 +736,8 @@ ahd_lookup_scb(struct ahd_softc *ahd, u_int tag) static __inline void ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb) { - struct hardware_scb *q_hscb; + struct hardware_scb *q_hscb; + struct map_node *q_hscb_map; uint32_t saved_hscb_busaddr; /* @@ -743,6 +753,7 @@ ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb) * locate the correct SCB by SCB_TAG. */ q_hscb = ahd->next_queued_hscb; + q_hscb_map = ahd->next_queued_hscb_map; saved_hscb_busaddr = q_hscb->hscb_busaddr; memcpy(q_hscb, scb->hscb, sizeof(*scb->hscb)); q_hscb->hscb_busaddr = saved_hscb_busaddr; @@ -750,7 +761,9 @@ ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb) /* Now swap HSCB pointers. */ ahd->next_queued_hscb = scb->hscb; + ahd->next_queued_hscb_map = scb->hscb_map; scb->hscb = q_hscb; + scb->hscb_map = q_hscb_map; /* Now define the mapping from tag to SCB in the scbindex */ ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb; @@ -824,8 +837,9 @@ static __inline int ahd_intr(struct ahd_softc *ahd); static __inline void ahd_sync_qoutfifo(struct ahd_softc *ahd, int op) { - ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap, - /*offset*/0, /*len*/AHC_SCB_MAX * sizeof(uint16_t), op); + ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, + /*offset*/0, + /*len*/AHD_SCB_MAX * sizeof(uint16_t), op); } static __inline void @@ -834,7 +848,7 @@ ahd_sync_tqinfifo(struct ahd_softc *ahd, int op) #ifdef AHD_TARGET_MODE if ((ahd->flags & AHD_TARGETROLE) != 0) { ahd_dmamap_sync(ahd, ahd->shared_data_dmat, - ahd->shared_data_dmamap, + ahd->shared_data_map.dmamap, ahd_targetcmd_offset(ahd, 0), sizeof(struct target_cmd) * AHD_TMODE_CMDS, op); @@ -854,9 +868,9 @@ ahd_check_cmdcmpltqueues(struct ahd_softc *ahd) u_int retval; retval = 0; - ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap, - /*offset*/ahd->qoutfifonext, /*len*/2, - BUS_DMASYNC_POSTREAD); + ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, + /*offset*/ahd->qoutfifonext * sizeof(*ahd->qoutfifo), + /*len*/sizeof(*ahd->qoutfifo), BUS_DMASYNC_POSTREAD); if ((ahd->qoutfifo[ahd->qoutfifonext] & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) retval |= AHD_RUN_QOUTFIFO; @@ -864,7 +878,7 @@ ahd_check_cmdcmpltqueues(struct ahd_softc *ahd) if ((ahd->flags & AHD_TARGETROLE) != 0 && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) { ahd_dmamap_sync(ahd, ahd->shared_data_dmat, - ahd->shared_data_dmamap, + ahd->shared_data_map.dmamap, ahd_targetcmd_offset(ahd, ahd->tqinfifofnext), /*len*/sizeof(struct target_cmd), BUS_DMASYNC_POSTREAD); -- cgit v1.2.3 From ba62cd2d01e401faa5d5a25fa8e990d0b1a1996a Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 12 Jan 2006 12:07:02 +0100 Subject: [SCSI] aic79xx: Sanitize inb/outb handling This patch coalesces inb/outb calls to the approriate word or long form. Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx_core.c | 80 ++++++++++--------------------------- 1 file changed, 21 insertions(+), 59 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 55c44bf5405..35b51e1979f 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c @@ -387,8 +387,7 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) u_int fifo_mode; u_int i; - scbid = (ahd_inb(ahd, GSFIFO+1) << 8) - | ahd_inb(ahd, GSFIFO); + scbid = ahd_inw(ahd, GSFIFO); scb = ahd_lookup_scb(ahd, scbid); if (scb == NULL) { printf("%s: Warning - GSFIFO SCB %d invalid\n", @@ -748,7 +747,7 @@ ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb) * Advertise the segment to the hardware. */ dfcntrl = ahd_inb(ahd, DFCNTRL)|PRELOADEN|HDMAEN; - if ((ahd->features & AHD_NEW_DFCNTRL_OPTS)!=0) { + if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0) { /* * Use SCSIENWRDIS so that SCSIEN * is never modified by this @@ -1060,7 +1059,7 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_outb(ahd, SAVED_LUN, 0); ahd_outb(ahd, SEQ_FLAGS, 0); ahd_assert_atn(ahd); - scb->flags &= ~(SCB_PACKETIZED); + scb->flags &= ~SCB_PACKETIZED; scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT; ahd_freeze_devq(ahd, scb); ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); @@ -2310,8 +2309,7 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) "PRGMCNT == 0x%x\n", ahd_lookup_phase_entry(lastphase)->phasemsg, aborted, - ahd_inb(ahd, PRGMCNT) - | (ahd_inb(ahd, PRGMCNT+1) << 8)); + ahd_inw(ahd, PRGMCNT)); ahd_dump_card_state(ahd); } /* Always restart the sequencer. */ @@ -2474,8 +2472,7 @@ ahd_clear_critical_section(struct ahd_softc *ahd) u_int i; ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); - seqaddr = ahd_inb(ahd, CURADDR) - | (ahd_inb(ahd, CURADDR+1) << 8); + seqaddr = ahd_inw(ahd, CURADDR); cs = ahd->critical_sections; for (i = 0; i < ahd->num_critical_sections; i++, cs++) { @@ -4909,10 +4906,7 @@ ahd_reinitialize_dataptrs(struct ahd_softc *ahd) * Determine initial values for data_addr and data_cnt * for resuming the data phase. */ - sgptr = (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 3) << 24) - | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 2) << 16) - | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 1) << 8) - | ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR); + sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR); sgptr &= SG_PTR_MASK; resid = (ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT + 2) << 16) @@ -4930,10 +4924,7 @@ ahd_reinitialize_dataptrs(struct ahd_softc *ahd) dataptr = ahd_le64toh(sg->addr) + (ahd_le32toh(sg->len) & AHD_SG_LEN_MASK) - resid; - ahd_outb(ahd, HADDR + 7, dataptr >> 56); - ahd_outb(ahd, HADDR + 6, dataptr >> 48); - ahd_outb(ahd, HADDR + 5, dataptr >> 40); - ahd_outb(ahd, HADDR + 4, dataptr >> 32); + ahd_outl(ahd, HADDR + 4, dataptr >> 32); } else { struct ahd_dma_seg *sg; @@ -4948,10 +4939,7 @@ ahd_reinitialize_dataptrs(struct ahd_softc *ahd) ahd_outb(ahd, HADDR + 4, (ahd_le32toh(sg->len) & ~AHD_SG_LEN_MASK) >> 24); } - ahd_outb(ahd, HADDR + 3, dataptr >> 24); - ahd_outb(ahd, HADDR + 2, dataptr >> 16); - ahd_outb(ahd, HADDR + 1, dataptr >> 8); - ahd_outb(ahd, HADDR, dataptr); + ahd_outl(ahd, HADDR, dataptr); ahd_outb(ahd, HCNT + 2, resid >> 16); ahd_outb(ahd, HCNT + 1, resid >> 8); ahd_outb(ahd, HCNT, resid); @@ -6567,14 +6555,8 @@ ahd_chip_init(struct ahd_softc *ahd) * Tell the sequencer where it can find our arrays in memory. */ busaddr = ahd->shared_data_map.physaddr; - ahd_outb(ahd, SHARED_DATA_ADDR, busaddr & 0xFF); - ahd_outb(ahd, SHARED_DATA_ADDR + 1, (busaddr >> 8) & 0xFF); - ahd_outb(ahd, SHARED_DATA_ADDR + 2, (busaddr >> 16) & 0xFF); - ahd_outb(ahd, SHARED_DATA_ADDR + 3, (busaddr >> 24) & 0xFF); - ahd_outb(ahd, QOUTFIFO_NEXT_ADDR, busaddr & 0xFF); - ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 1, (busaddr >> 8) & 0xFF); - ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 2, (busaddr >> 16) & 0xFF); - ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 3, (busaddr >> 24) & 0xFF); + ahd_outl(ahd, SHARED_DATA_ADDR, busaddr); + ahd_outl(ahd, QOUTFIFO_NEXT_ADDR, busaddr); /* * Setup the allowed SCSI Sequences based on operational mode. @@ -6623,10 +6605,7 @@ ahd_chip_init(struct ahd_softc *ahd) * Tell the sequencer which SCB will be the next one it receives. */ busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF); + ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr); /* * Default to coalescing disabled. @@ -7159,10 +7138,7 @@ ahd_qinfifo_requeue(struct ahd_softc *ahd, struct scb *prev_scb, uint32_t busaddr; busaddr = ahd_le32toh(scb->hscb->hscb_busaddr); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF); + ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr); } else { prev_scb->hscb->next_hscb_busaddr = scb->hscb->hscb_busaddr; ahd_sync_scb(ahd, prev_scb, @@ -7269,10 +7245,7 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, */ ahd->qinfifonext = qinstart; busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF); - ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF); + ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr); while (qinpos != qintail) { scb = ahd_lookup_scb(ahd, ahd->qinfifo[qinpos]); @@ -7743,7 +7716,7 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) */ ahd_clear_msg_state(ahd); ahd_outb(ahd, SIMODE1, - ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST|ENBUSFREE)); + ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST)); if (initiate_reset) ahd_reset_current_bus(ahd); @@ -8321,8 +8294,7 @@ ahd_dumpseq(struct ahd_softc* ahd) max_prog = 2048; ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM); - ahd_outb(ahd, PRGMCNT, 0); - ahd_outb(ahd, PRGMCNT+1, 0); + ahd_outw(ahd, PRGMCNT, 0); for (i = 0; i < max_prog; i++) { uint8_t ins_bytes[4]; @@ -8437,8 +8409,7 @@ ahd_loadseq(struct ahd_softc *ahd) downloaded = 0; skip_addr = 0; ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM); - ahd_outb(ahd, PRGMCNT, 0); - ahd_outb(ahd, PRGMCNT+1, 0); + ahd_outw(ahd, PRGMCNT, 0); for (i = 0; i < sizeof(seqprog)/4; i++) { if (ahd_check_patch(ahd, &cur_patch, i, &skip_addr) == 0) { @@ -8731,7 +8702,7 @@ ahd_dump_card_state(struct ahd_softc *ahd) printf(">>>>>>>>>>>>>>>>>> Dump Card State Begins <<<<<<<<<<<<<<<<<\n" "%s: Dumping Card State at program address 0x%x Mode 0x%x\n", ahd_name(ahd), - ahd_inb(ahd, CURADDR) | (ahd_inb(ahd, CURADDR+1) << 8), + ahd_inw(ahd, CURADDR), ahd_build_mode_state(ahd, ahd->saved_src_mode, ahd->saved_dst_mode)); if (paused) @@ -9427,13 +9398,9 @@ ahd_handle_en_lun(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb) if ((ahd->features & AHD_MULTI_TID) != 0) { u_int targid_mask; - targid_mask = ahd_inb(ahd, TARGID) - | (ahd_inb(ahd, TARGID + 1) << 8); - + targid_mask = ahd_inw(ahd, TARGID); targid_mask |= target_mask; - ahd_outb(ahd, TARGID, targid_mask); - ahd_outb(ahd, TARGID+1, (targid_mask >> 8)); - + ahd_outw(ahd, TARGID, targid_mask); ahd_update_scsiid(ahd, targid_mask); } else { u_int our_id; @@ -9547,14 +9514,9 @@ ahd_handle_en_lun(struct ahd_softc *ahd, struct cam_sim *sim, union ccb *ccb) if (ahd->features & AHD_MULTI_TID) { u_int targid_mask; - targid_mask = ahd_inb(ahd, TARGID) - | (ahd_inb(ahd, TARGID + 1) - << 8); - + targid_mask = ahd_inw(ahd, TARGID); targid_mask &= ~target_mask; - ahd_outb(ahd, TARGID, targid_mask); - ahd_outb(ahd, TARGID+1, - (targid_mask >> 8)); + ahd_outw(ahd, TARGID, targid_mask); ahd_update_scsiid(ahd, targid_mask); } } -- cgit v1.2.3 From 11668bb673c41ec169a85d0b52c538a1c11d29e1 Mon Sep 17 00:00:00 2001 From: Hannes Reinecke Date: Thu, 12 Jan 2006 12:08:06 +0100 Subject: [SCSI] aic79xx: Sequencer update Update sequencer code to Adaptec version 2.0.12-6.3.9. Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx.h | 12 +- drivers/scsi/aic7xxx/aic79xx.reg | 60 +- drivers/scsi/aic7xxx/aic79xx.seq | 241 ++++- drivers/scsi/aic7xxx/aic79xx_core.c | 665 +++++++----- drivers/scsi/aic7xxx/aic79xx_inline.h | 6 +- drivers/scsi/aic7xxx/aic79xx_osm.c | 62 +- drivers/scsi/aic7xxx/aic79xx_reg.h_shipped | 646 +++++------ drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped | 507 ++++----- drivers/scsi/aic7xxx/aic79xx_seq.h_shipped | 1250 +++++++++++----------- 9 files changed, 1911 insertions(+), 1538 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index ac3d07a2a28..2cfdbef447d 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h @@ -75,8 +75,7 @@ struct scb_platform_data; #define INITIATOR_WILDCARD (~0) #define SCB_LIST_NULL 0xFF00 #define SCB_LIST_NULL_LE (ahd_htole16(SCB_LIST_NULL)) -#define QOUTFIFO_ENTRY_VALID 0x8000 -#define QOUTFIFO_ENTRY_VALID_LE (ahd_htole16(0x8000)) +#define QOUTFIFO_ENTRY_VALID 0x80 #define SCBID_IS_NULL(scbid) (((scbid) & 0xFF00 ) == SCB_LIST_NULL) #define SCSIID_TARGET(ahd, scsiid) \ @@ -1053,6 +1052,13 @@ typedef uint8_t ahd_mode_state; typedef void ahd_callback_t (void *); +struct ahd_completion +{ + uint16_t tag; + uint8_t sg_status; + uint8_t valid_tag; +}; + struct ahd_softc { bus_space_tag_t tags[2]; bus_space_handle_t bshs[2]; @@ -1142,11 +1148,11 @@ struct ahd_softc { struct seeprom_config *seep_config; /* Command Queues */ + struct ahd_completion *qoutfifo; uint16_t qoutfifonext; uint16_t qoutfifonext_valid_tag; uint16_t qinfifonext; uint16_t qinfifo[AHD_SCB_MAX]; - uint16_t *qoutfifo; /* * Our qfreeze count. The sequencer compares diff --git a/drivers/scsi/aic7xxx/aic79xx.reg b/drivers/scsi/aic7xxx/aic79xx.reg index cca58edc864..3a3204703b1 100644 --- a/drivers/scsi/aic7xxx/aic79xx.reg +++ b/drivers/scsi/aic7xxx/aic79xx.reg @@ -39,7 +39,7 @@ * * $FreeBSD$ */ -VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $" +VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $" /* * This file is processed by the aic7xxx_asm utility for use in assembling @@ -65,13 +65,6 @@ VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $" mvi MODE_PTR, MK_MODE(src, dst); \ } -#define TOGGLE_DFF_MODE \ - if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \ - call toggle_dff_mode_work_around; \ - } else { \ - xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); \ - } - #define RESTORE_MODE(mode) \ if ((ahd->bugs & AHD_SET_MODE_BUG) != 0) { \ mov mode call set_mode_work_around; \ @@ -1199,7 +1192,7 @@ register TARGPCISTAT { /* * LQ Packet In - * The last LQ Packet received + * The last LQ Packet recieved */ register LQIN { address 0x020 @@ -3542,10 +3535,34 @@ scratch_ram { COMPLETE_DMA_SCB_HEAD { size 2 } - /* Counting semaphore to prevent new select-outs */ + /* + * tail of list of SCBs that have + * completed but need to be uploaded + * to the host prior to being completed. + */ + COMPLETE_DMA_SCB_TAIL { + size 2 + } + /* + * head of list of SCBs that have + * been uploaded to the host, but cannot + * be completed until the QFREEZE is in + * full effect (i.e. no selections pending). + */ + COMPLETE_ON_QFREEZE_HEAD { + size 2 + } + /* + * Counting semaphore to prevent new select-outs + * The queue is frozen so long as the sequencer + * and kernel freeze counts differ. + */ QFREEZE_COUNT { size 2 } + KERNEL_QFREEZE_COUNT { + size 2 + } /* * Mode to restore on legacy idle loop exit. */ @@ -3624,6 +3641,17 @@ scratch_ram { QOUTFIFO_ENTRY_VALID_TAG { size 1 } + /* + * Kernel and sequencer offsets into the queue of + * incoming target mode command descriptors. The + * queue is full when the KERNEL_TQINPOS == TQINPOS. + */ + KERNEL_TQINPOS { + size 1 + } + TQINPOS { + size 1 + } /* * Base address of our shared data with the kernel driver in host * memory. This includes the qoutfifo and target mode @@ -3639,17 +3667,6 @@ scratch_ram { QOUTFIFO_NEXT_ADDR { size 4 } - /* - * Kernel and sequencer offsets into the queue of - * incoming target mode command descriptors. The - * queue is full when the KERNEL_TQINPOS == TQINPOS. - */ - KERNEL_TQINPOS { - size 1 - } - TQINPOS { - size 1 - } ARG_1 { size 1 mask SEND_MSG 0x80 @@ -3951,6 +3968,7 @@ const SG_PREFETCH_ADDR_MASK download const SG_SIZEOF download const PKT_OVERRUN_BUFOFFSET download const SCB_TRANSFER_SIZE download +const CACHELINE_MASK download /* * BIOS SCB offsets diff --git a/drivers/scsi/aic7xxx/aic79xx.seq b/drivers/scsi/aic7xxx/aic79xx.seq index 65339bc1ca9..bef1f9d369b 100644 --- a/drivers/scsi/aic7xxx/aic79xx.seq +++ b/drivers/scsi/aic7xxx/aic79xx.seq @@ -40,7 +40,7 @@ * $FreeBSD$ */ -VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#99 $" +VERSION = "$Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $" PATCH_ARG_LIST = "struct ahd_softc *ahd" PREFIX = "ahd_" @@ -68,13 +68,47 @@ no_error_set: } SET_MODE(M_SCSI, M_SCSI) test SCSISEQ0, ENSELO|ENARBO jnz idle_loop_checkbus; - test SEQ_FLAGS2, SELECTOUT_QFROZEN jnz idle_loop_checkbus; + test SEQ_FLAGS2, SELECTOUT_QFROZEN jz check_waiting_list; + /* + * If the kernel has caught up with us, thaw the queue. + */ + mov A, KERNEL_QFREEZE_COUNT; + cmp QFREEZE_COUNT, A jne check_frozen_completions; + mov A, KERNEL_QFREEZE_COUNT[1]; + cmp QFREEZE_COUNT[1], A jne check_frozen_completions; + and SEQ_FLAGS2, ~SELECTOUT_QFROZEN; + jmp check_waiting_list; +check_frozen_completions: + test SSTAT0, SELDO|SELINGO jnz idle_loop_checkbus; +BEGIN_CRITICAL; + /* + * If we have completions stalled waiting for the qfreeze + * to take effect, move them over to the complete_scb list + * now that no selections are pending. + */ + cmp COMPLETE_ON_QFREEZE_HEAD[1],SCB_LIST_NULL je idle_loop_checkbus; + /* + * Find the end of the qfreeze list. The first element has + * to be treated specially. + */ + bmov SCBPTR, COMPLETE_ON_QFREEZE_HEAD, 2; + cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je join_lists; + /* + * Now the normal loop. + */ + bmov SCBPTR, SCB_NEXT_COMPLETE, 2; + cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL jne . - 1; +join_lists: + bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2; + bmov COMPLETE_SCB_HEAD, COMPLETE_ON_QFREEZE_HEAD, 2; + mvi COMPLETE_ON_QFREEZE_HEAD[1], SCB_LIST_NULL; + jmp idle_loop_checkbus; +check_waiting_list: cmp WAITING_TID_HEAD[1], SCB_LIST_NULL je idle_loop_checkbus; /* * ENSELO is cleared by a SELDO, so we must test for SELDO * one last time. */ -BEGIN_CRITICAL; test SSTAT0, SELDO jnz select_out; END_CRITICAL; call start_selection; @@ -90,6 +124,13 @@ idle_loop_check_nonpackreq: test SSTAT2, NONPACKREQ jz . + 2; call unexpected_nonpkt_phase_find_ctxt; if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) { + /* + * On Rev A. hardware, the busy LED is only + * turned on automaically during selections + * and re-selections. Make the LED status + * more useful by forcing it to be on so + * long as one of our data FIFOs is active. + */ and A, FIFO0FREE|FIFO1FREE, DFFSTAT; cmp A, FIFO0FREE|FIFO1FREE jne . + 3; and SBLKCTL, ~DIAGLEDEN|DIAGLEDON; @@ -101,9 +142,9 @@ idle_loop_check_nonpackreq: call idle_loop_cchan; jmp idle_loop; -BEGIN_CRITICAL; idle_loop_gsfifo: SET_MODE(M_SCSI, M_SCSI) +BEGIN_CRITICAL; idle_loop_gsfifo_in_scsi_mode: test LQISTAT2, LQIGSAVAIL jz return; /* @@ -152,11 +193,15 @@ END_CRITICAL; idle_loop_service_fifos: SET_MODE(M_DFF0, M_DFF0) +BEGIN_CRITICAL; test LONGJMP_ADDR[1], INVALID_ADDR jnz idle_loop_next_fifo; call longjmp; +END_CRITICAL; idle_loop_next_fifo: SET_MODE(M_DFF1, M_DFF1) +BEGIN_CRITICAL; test LONGJMP_ADDR[1], INVALID_ADDR jz longjmp; +END_CRITICAL; return: ret; @@ -170,7 +215,6 @@ BEGIN_CRITICAL; test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle; test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog; test CCSCBCTL, CCSCBDONE jz return; -END_CRITICAL; /* FALLTHROUGH */ scbdma_tohost_done: test CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone; @@ -180,26 +224,18 @@ scbdma_tohost_done: * bad SCSI status (currently only for underruns), we * queue the SCB for normal completion. Otherwise, we * wait until any select-out activity has halted, and - * then notify the host so that the transaction can be - * dealt with. + * then queue the completion. */ - test SCB_SCSI_STATUS, 0xff jnz scbdma_notify_host; and CCSCBCTL, ~(CCARREN|CCSCBEN); bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2; + cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL jne . + 2; + mvi COMPLETE_DMA_SCB_TAIL[1], SCB_LIST_NULL; + test SCB_SCSI_STATUS, 0xff jz scbdma_queue_completion; + bmov SCB_NEXT_COMPLETE, COMPLETE_ON_QFREEZE_HEAD, 2; + bmov COMPLETE_ON_QFREEZE_HEAD, SCBPTR, 2 ret; +scbdma_queue_completion: bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2; bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret; -scbdma_notify_host: - SET_MODE(M_SCSI, M_SCSI) - test SCSISEQ0, ENSELO jnz return; - test SSTAT0, (SELDO|SELINGO) jnz return; - SET_MODE(M_CCHAN, M_CCHAN) - /* - * Remove SCB and notify host. - */ - and CCSCBCTL, ~(CCARREN|CCSCBEN); - bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2; - SET_SEQINTCODE(BAD_SCB_STATUS) - ret; fill_qoutfifo_dmadone: and CCSCBCTL, ~(CCARREN|CCSCBEN); call qoutfifo_updated; @@ -208,6 +244,7 @@ fill_qoutfifo_dmadone: test QOFF_CTLSTA, SDSCB_ROLLOVR jz return; bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4; xor QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret; +END_CRITICAL; qoutfifo_updated: /* @@ -324,14 +361,15 @@ fill_qoutfifo: * Keep track of the SCBs we are dmaing just * in case the DMA fails or is aborted. */ - mov A, QOUTFIFO_ENTRY_VALID_TAG; bmov COMPLETE_SCB_DMAINPROG_HEAD, COMPLETE_SCB_HEAD, 2; mvi CCSCBCTL, CCSCBRESET; bmov SCBHADDR, QOUTFIFO_NEXT_ADDR, 4; + mov A, QOUTFIFO_NEXT_ADDR; bmov SCBPTR, COMPLETE_SCB_HEAD, 2; fill_qoutfifo_loop: - mov CCSCBRAM, SCBPTR; - or CCSCBRAM, A, SCBPTR[1]; + bmov CCSCBRAM, SCBPTR, 2; + mov CCSCBRAM, SCB_SGPTR[0]; + mov CCSCBRAM, QOUTFIFO_ENTRY_VALID_TAG; mov NONE, SDSCB_QOFF; inc INT_COALESCING_CMDCOUNT; add CMDS_PENDING, -1; @@ -339,6 +377,18 @@ fill_qoutfifo_loop: cmp SCB_NEXT_COMPLETE[1], SCB_LIST_NULL je fill_qoutfifo_done; cmp CCSCBADDR, CCSCBADDR_MAX je fill_qoutfifo_done; test QOFF_CTLSTA, SDSCB_ROLLOVR jnz fill_qoutfifo_done; + /* + * Don't cross an ADB or Cachline boundary when DMA'ing + * completion entries. In PCI mode, at least in 32/33 + * configurations, the SCB DMA engine may lose its place + * in the data-stream should the target force a retry on + * something other than an 8byte aligned boundary. In + * PCI-X mode, we do this to avoid split transactions since + * many chipsets seem to be unable to format proper split + * completions to continue the data transfer. + */ + add SINDEX, A, CCSCBADDR; + test SINDEX, CACHELINE_MASK jz fill_qoutfifo_done; bmov SCBPTR, SCB_NEXT_COMPLETE, 2; jmp fill_qoutfifo_loop; fill_qoutfifo_done: @@ -354,7 +404,6 @@ dma_complete_scb: bmov SCBPTR, COMPLETE_DMA_SCB_HEAD, 2; bmov SCBHADDR, SCB_BUSADDR, 4; mvi CCARREN|CCSCBEN|CCSCBRESET jmp dma_scb; -END_CRITICAL; /* * Either post or fetch an SCB from host memory. The caller @@ -371,9 +420,19 @@ dma_scb: mvi SCBHCNT, SCB_TRANSFER_SIZE; mov CCSCBCTL, SINDEX ret; -BEGIN_CRITICAL; setjmp: - bmov LONGJMP_ADDR, STACK, 2 ret; + /* + * At least on the A, a return in the same + * instruction as the bmov results in a return + * to the caller, not to the new address at the + * top of the stack. Since we want the latter + * (we use setjmp to register a handler from an + * interrupt context but not invoke that handler + * until we return to our idle loop), use a + * separate ret instruction. + */ + bmov LONGJMP_ADDR, STACK, 2; + ret; setjmp_inline: bmov LONGJMP_ADDR, STACK, 2; longjmp: @@ -392,11 +451,6 @@ set_mode_work_around: mvi SEQINTCTL, INTVEC1DSL; mov MODE_PTR, SINDEX; clr SEQINTCTL ret; - -toggle_dff_mode_work_around: - mvi SEQINTCTL, INTVEC1DSL; - xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); - clr SEQINTCTL ret; } @@ -490,6 +544,21 @@ allocate_fifo1: SET_SRC_MODE M_SCSI; SET_DST_MODE M_SCSI; select_in: + if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) { + /* + * On Rev A. hardware, the busy LED is only + * turned on automaically during selections + * and re-selections. Make the LED status + * more useful by forcing it to be on from + * the point of selection until our idle + * loop determines that neither of our FIFOs + * are busy. This handles the non-packetized + * case nicely as we will not return to the + * idle loop until the busfree at the end of + * each transaction. + */ + or SBLKCTL, DIAGLEDEN|DIAGLEDON; + } if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) { /* * Test to ensure that the bus has not @@ -528,6 +597,21 @@ SET_SRC_MODE M_SCSI; SET_DST_MODE M_SCSI; select_out: BEGIN_CRITICAL; + if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) { + /* + * On Rev A. hardware, the busy LED is only + * turned on automaically during selections + * and re-selections. Make the LED status + * more useful by forcing it to be on from + * the point of re-selection until our idle + * loop determines that neither of our FIFOs + * are busy. This handles the non-packetized + * case nicely as we will not return to the + * idle loop until the busfree at the end of + * each transaction. + */ + or SBLKCTL, DIAGLEDEN|DIAGLEDON; + } /* Clear out all SCBs that have been successfully sent. */ if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) { /* @@ -1000,15 +1084,9 @@ not_found_ITloop: /* * We received a "command complete" message. Put the SCB on the complete * queue and trigger a completion interrupt via the idle loop. Before doing - * so, check to see if there - * is a residual or the status byte is something other than STATUS_GOOD (0). - * In either of these conditions, we upload the SCB back to the host so it can - * process this information. In the case of a non zero status byte, we - * additionally interrupt the kernel driver synchronously, allowing it to - * decide if sense should be retrieved. If the kernel driver wishes to request - * sense, it will fill the kernel SCB with a request sense command, requeue - * it to the QINFIFO and tell us not to post to the QOUTFIFO by setting - * RETURN_1 to SEND_SENSE. + * so, check to see if there is a residual or the status byte is something + * other than STATUS_GOOD (0). In either of these conditions, we upload the + * SCB back to the host so it can process this information. */ mesgin_complete: @@ -1053,6 +1131,7 @@ complete_nomsg: call queue_scb_completion; jmp await_busfree; +BEGIN_CRITICAL; freeze_queue: /* Cancel any pending select-out. */ test SSTAT0, SELDO|SELINGO jnz . + 2; @@ -1063,6 +1142,7 @@ freeze_queue: adc QFREEZE_COUNT[1], A; or SEQ_FLAGS2, SELECTOUT_QFROZEN; mov A, ACCUM_SAVE ret; +END_CRITICAL; /* * Complete the current FIFO's SCB if data for this same @@ -1085,8 +1165,10 @@ queue_scb_completion: test SCB_SGPTR, SG_FULL_RESID jnz upload_scb;/* Never xfered */ test SCB_RESIDUAL_SGPTR, SG_LIST_NULL jz upload_scb; complete: +BEGIN_CRITICAL; bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2; bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret; +END_CRITICAL; bad_status: cmp SCB_SCSI_STATUS, STATUS_PKT_SENSE je upload_scb; call freeze_queue; @@ -1097,9 +1179,18 @@ upload_scb: * it on the host. */ bmov SCB_TAG, SCBPTR, 2; - bmov SCB_NEXT_COMPLETE, COMPLETE_DMA_SCB_HEAD, 2; +BEGIN_CRITICAL; + or SCB_SGPTR, SG_STATUS_VALID; + mvi SCB_NEXT_COMPLETE[1], SCB_LIST_NULL; + cmp COMPLETE_DMA_SCB_HEAD[1], SCB_LIST_NULL jne add_dma_scb_tail; bmov COMPLETE_DMA_SCB_HEAD, SCBPTR, 2; - or SCB_SGPTR, SG_STATUS_VALID ret; + bmov COMPLETE_DMA_SCB_TAIL, SCBPTR, 2 ret; +add_dma_scb_tail: + bmov REG0, SCBPTR, 2; + bmov SCBPTR, COMPLETE_DMA_SCB_TAIL, 2; + bmov SCB_NEXT_COMPLETE, REG0, 2; + bmov COMPLETE_DMA_SCB_TAIL, REG0, 2 ret; +END_CRITICAL; /* * Is it a disconnect message? Set a flag in the SCB to remind us @@ -1146,8 +1237,18 @@ SET_DST_MODE M_DFF1; await_busfree_clrchn: mvi DFFSXFRCTL, CLRCHN; await_busfree_not_m_dff: - call clear_target_state; + /* clear target specific flags */ + mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT; test SSTAT1,REQINIT|BUSFREE jz .; + /* + * We only set BUSFREE status once either a new + * phase has been detected or we are really + * BUSFREE. This allows the driver to know + * that we are active on the bus even though + * no identified transaction exists should a + * timeout occur while awaiting busfree. + */ + mvi LASTPHASE, P_BUSFREE; test SSTAT1, BUSFREE jnz idle_loop; SET_SEQINTCODE(MISSED_BUSFREE) @@ -1202,11 +1303,6 @@ msgin_rdptrs_get_fifo: call allocate_fifo; jmp mesgin_done; -clear_target_state: - mvi LASTPHASE, P_BUSFREE; - /* clear target specific flags */ - mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT ret; - phase_lock: if ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0) { /* @@ -1297,6 +1393,47 @@ service_fifo: /* Are we actively fetching segments? */ test CCSGCTL, CCSGENACK jnz return; + /* + * Should the other FIFO get the S/G cache first? If + * both FIFOs have been allocated since we last checked + * any FIFO, it is important that we service a FIFO + * that is not actively on the bus first. This guarantees + * that a FIFO will be freed to handle snapshot requests for + * any FIFO that is still on the bus. Chips with RTI do not + * perform snapshots, so don't bother with this test there. + */ + if ((ahd->features & AHD_RTI) == 0) { + /* + * If we're not still receiving SCSI data, + * it is safe to allocate the S/G cache to + * this FIFO. + */ + test DFCNTRL, SCSIEN jz idle_sgfetch_start; + + /* + * Switch to the other FIFO. Non-RTI chips + * also have the "set mode" bug, so we must + * disable interrupts during the switch. + */ + mvi SEQINTCTL, INTVEC1DSL; + xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); + + /* + * If the other FIFO needs loading, then it + * must not have claimed the S/G cache yet + * (SG_CACHE_AVAIL would have been cleared in + * the orginal FIFO mode and we test this above). + * Return to the idle loop so we can process the + * FIFO not currently on the bus first. + */ + test SG_STATE, LOADING_NEEDED jz idle_sgfetch_okay; + clr SEQINTCTL ret; +idle_sgfetch_okay: + xor MODE_PTR, MK_MODE(M_DFF1, M_DFF1); + clr SEQINTCTL; + } + +idle_sgfetch_start: /* * We fetch a "cacheline aligned" and sized amount of data * so we don't end up referencing a non-existant page. @@ -1308,7 +1445,7 @@ service_fifo: mvi SGHCNT, SG_PREFETCH_CNT; if ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0) { /* - * Need two instruction between "touches" of SGHADDR. + * Need two instructions between "touches" of SGHADDR. */ nop; } @@ -1658,7 +1795,7 @@ export seq_isr: * savepointer in the current FIFO. We do this so that * a pending CTXTDONE or SAVEPTR is visible in the active * FIFO. This status is the only way we can detect if we - * have lost the race (e.g. host paused us) and our attepts + * have lost the race (e.g. host paused us) and our attempts * to disable the channel occurred after all REQs were * already seen and acked (REQINIT never comes true). */ @@ -1667,7 +1804,7 @@ export seq_isr: test DFCNTRL, DIRECTION jz interrupt_return; and DFCNTRL, ~SCSIEN; snapshot_wait_data_valid: - test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz snapshot_data_valid; + test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz interrupt_return; test SSTAT1, REQINIT jz snapshot_wait_data_valid; snapshot_data_valid: or DFCNTRL, SCSIEN; @@ -1834,7 +1971,6 @@ pkt_saveptrs_check_status: dec SCB_FIFO_USE_COUNT; test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle; mvi DFFSXFRCTL, CLRCHN ret; -END_CRITICAL; /* * LAST_SEG_DONE status has been seen in the current FIFO. @@ -1843,7 +1979,6 @@ END_CRITICAL; * Check for overrun and see if we can complete this command. */ pkt_last_seg_done: -BEGIN_CRITICAL; /* * Mark transfer as completed. */ diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 35b51e1979f..db8f5ce99ee 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c @@ -37,9 +37,7 @@ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#202 $ - * - * $FreeBSD$ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.c#247 $ */ #ifdef __linux__ @@ -332,6 +330,14 @@ ahd_restart(struct ahd_softc *ahd) ahd_outb(ahd, SCSISEQ1, ahd_inb(ahd, SCSISEQ_TEMPLATE) & (ENSELI|ENRSELI|ENAUTOATNP)); ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN); + + /* + * Clear any pending sequencer interrupt. It is no + * longer relevant since we're resetting the Program + * Counter. + */ + ahd_outb(ahd, CLRINT, CLRSEQINT); + ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET); ahd_unpause(ahd); } @@ -373,13 +379,7 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) saved_modes = ahd_save_modes(ahd); /* - * Complete any SCBs that just finished being - * DMA'ed into the qoutfifo. - */ - ahd_run_qoutfifo(ahd); - - /* - * Flush the good status FIFO for compelted packetized commands. + * Flush the good status FIFO for completed packetized commands. */ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); saved_scbptr = ahd_get_scbptr(ahd); @@ -400,22 +400,33 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) * the host before completing the command. */ fifo_mode = 0; +rescan_fifos: for (i = 0; i < 2; i++) { /* Toggle to the other mode. */ fifo_mode ^= 1; ahd_set_modes(ahd, fifo_mode, fifo_mode); + if (ahd_scb_active_in_fifo(ahd, scb) == 0) continue; ahd_run_data_fifo(ahd, scb); /* - * Clearing this transaction in this FIFO may - * cause a CFG4DATA for this same transaction - * to assert in the other FIFO. Make sure we - * loop one more time and check the other FIFO. + * Running this FIFO may cause a CFG4DATA for + * this same transaction to assert in the other + * FIFO or a new snapshot SAVEPTRS interrupt + * in this FIFO. Even running a FIFO may not + * clear the transaction if we are still waiting + * for data to drain to the host. We must loop + * until the transaction is not active in either + * FIFO just to be sure. Reset our loop counter + * so we will visit both FIFOs again before + * declaring this transaction finished. We + * also delay a bit so that status has a chance + * to change before we look at this FIFO again. */ - i = 0; + ahd_delay(200); + goto rescan_fifos; } ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); ahd_set_scbptr(ahd, scbid); @@ -428,19 +439,28 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) /* * The transfer completed with a residual. * Place this SCB on the complete DMA list - * so that we Update our in-core copy of the + * so that we update our in-core copy of the * SCB before completing the command. */ ahd_outb(ahd, SCB_SCSI_STATUS, 0); ahd_outb(ahd, SCB_SGPTR, ahd_inb_scbram(ahd, SCB_SGPTR) | SG_STATUS_VALID); - ahd_outw(ahd, SCB_TAG, SCB_GET_TAG(scb)); + ahd_outw(ahd, SCB_TAG, scbid); + ahd_outw(ahd, SCB_NEXT_COMPLETE, SCB_LIST_NULL); comp_head = ahd_inw(ahd, COMPLETE_DMA_SCB_HEAD); - ahd_outw(ahd, SCB_NEXT_COMPLETE, comp_head); - if (SCBID_IS_NULL(comp_head)) - ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, - SCB_GET_TAG(scb)); + if (SCBID_IS_NULL(comp_head)) { + ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, scbid); + ahd_outw(ahd, COMPLETE_DMA_SCB_TAIL, scbid); + } else { + u_int tail; + + tail = ahd_inw(ahd, COMPLETE_DMA_SCB_TAIL); + ahd_set_scbptr(ahd, tail); + ahd_outw(ahd, SCB_NEXT_COMPLETE, scbid); + ahd_outw(ahd, COMPLETE_DMA_SCB_TAIL, scbid); + ahd_set_scbptr(ahd, scbid); + } } else ahd_complete_scb(ahd, scb); } @@ -464,9 +484,22 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) break; ahd_delay(200); } - if ((ccscbctl & CCSCBDIR) != 0) + /* + * We leave the sequencer to cleanup in the case of DMA's to + * update the qoutfifo. In all other cases (DMA's to the + * chip or a push of an SCB from the COMPLETE_DMA_SCB list), + * we disable the DMA engine so that the sequencer will not + * attempt to handle the DMA completion. + */ + if ((ccscbctl & CCSCBDIR) != 0 || (ccscbctl & ARRDONE) != 0) ahd_outb(ahd, CCSCBCTL, ccscbctl & ~(CCARREN|CCSCBEN)); + /* + * Complete any SCBs that just finished + * being DMA'ed into the qoutfifo. + */ + ahd_run_qoutfifo(ahd); + saved_scbptr = ahd_get_scbptr(ahd); /* * Manually update/complete any completed SCBs that are waiting to be @@ -493,6 +526,24 @@ ahd_flush_qoutfifo(struct ahd_softc *ahd) scbid = next_scbid; } ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, SCB_LIST_NULL); + ahd_outw(ahd, COMPLETE_DMA_SCB_TAIL, SCB_LIST_NULL); + + scbid = ahd_inw(ahd, COMPLETE_ON_QFREEZE_HEAD); + while (!SCBID_IS_NULL(scbid)) { + + ahd_set_scbptr(ahd, scbid); + next_scbid = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE); + scb = ahd_lookup_scb(ahd, scbid); + if (scb == NULL) { + printf("%s: Warning - Complete Qfrz SCB %d invalid\n", + ahd_name(ahd), scbid); + continue; + } + + ahd_complete_scb(ahd, scb); + scbid = next_scbid; + } + ahd_outw(ahd, COMPLETE_ON_QFREEZE_HEAD, SCB_LIST_NULL); scbid = ahd_inw(ahd, COMPLETE_SCB_HEAD); while (!SCBID_IS_NULL(scbid)) { @@ -557,150 +608,146 @@ ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb) { u_int seqintsrc; - while (1) { - seqintsrc = ahd_inb(ahd, SEQINTSRC); - if ((seqintsrc & CFG4DATA) != 0) { - uint32_t datacnt; - uint32_t sgptr; - - /* - * Clear full residual flag. - */ - sgptr = ahd_inl_scbram(ahd, SCB_SGPTR) & ~SG_FULL_RESID; - ahd_outb(ahd, SCB_SGPTR, sgptr); + seqintsrc = ahd_inb(ahd, SEQINTSRC); + if ((seqintsrc & CFG4DATA) != 0) { + uint32_t datacnt; + uint32_t sgptr; - /* - * Load datacnt and address. - */ - datacnt = ahd_inl_scbram(ahd, SCB_DATACNT); - if ((datacnt & AHD_DMA_LAST_SEG) != 0) { - sgptr |= LAST_SEG; - ahd_outb(ahd, SG_STATE, 0); - } else - ahd_outb(ahd, SG_STATE, LOADING_NEEDED); - ahd_outq(ahd, HADDR, ahd_inq_scbram(ahd, SCB_DATAPTR)); - ahd_outl(ahd, HCNT, datacnt & AHD_SG_LEN_MASK); - ahd_outb(ahd, SG_CACHE_PRE, sgptr); - ahd_outb(ahd, DFCNTRL, PRELOADEN|SCSIEN|HDMAEN); + /* + * Clear full residual flag. + */ + sgptr = ahd_inl_scbram(ahd, SCB_SGPTR) & ~SG_FULL_RESID; + ahd_outb(ahd, SCB_SGPTR, sgptr); - /* - * Initialize Residual Fields. - */ - ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, datacnt >> 24); - ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr & SG_PTR_MASK); + /* + * Load datacnt and address. + */ + datacnt = ahd_inl_scbram(ahd, SCB_DATACNT); + if ((datacnt & AHD_DMA_LAST_SEG) != 0) { + sgptr |= LAST_SEG; + ahd_outb(ahd, SG_STATE, 0); + } else + ahd_outb(ahd, SG_STATE, LOADING_NEEDED); + ahd_outq(ahd, HADDR, ahd_inq_scbram(ahd, SCB_DATAPTR)); + ahd_outl(ahd, HCNT, datacnt & AHD_SG_LEN_MASK); + ahd_outb(ahd, SG_CACHE_PRE, sgptr); + ahd_outb(ahd, DFCNTRL, PRELOADEN|SCSIEN|HDMAEN); - /* - * Mark the SCB as having a FIFO in use. - */ - ahd_outb(ahd, SCB_FIFO_USE_COUNT, - ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) + 1); + /* + * Initialize Residual Fields. + */ + ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, datacnt >> 24); + ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr & SG_PTR_MASK); - /* - * Install a "fake" handler for this FIFO. - */ - ahd_outw(ahd, LONGJMP_ADDR, 0); + /* + * Mark the SCB as having a FIFO in use. + */ + ahd_outb(ahd, SCB_FIFO_USE_COUNT, + ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) + 1); - /* - * Notify the hardware that we have satisfied - * this sequencer interrupt. - */ - ahd_outb(ahd, CLRSEQINTSRC, CLRCFG4DATA); - } else if ((seqintsrc & SAVEPTRS) != 0) { - uint32_t sgptr; - uint32_t resid; + /* + * Install a "fake" handler for this FIFO. + */ + ahd_outw(ahd, LONGJMP_ADDR, 0); - if ((ahd_inb(ahd, LONGJMP_ADDR+1)&INVALID_ADDR) != 0) { - /* - * Snapshot Save Pointers. Clear - * the snapshot and continue. - */ - ahd_outb(ahd, DFFSXFRCTL, CLRCHN); - continue; - } + /* + * Notify the hardware that we have satisfied + * this sequencer interrupt. + */ + ahd_outb(ahd, CLRSEQINTSRC, CLRCFG4DATA); + } else if ((seqintsrc & SAVEPTRS) != 0) { + uint32_t sgptr; + uint32_t resid; + if ((ahd_inb(ahd, LONGJMP_ADDR+1)&INVALID_ADDR) != 0) { /* - * Disable S/G fetch so the DMA engine - * is available to future users. + * Snapshot Save Pointers. All that + * is necessary to clear the snapshot + * is a CLRCHN. */ - if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) - ahd_outb(ahd, CCSGCTL, 0); - ahd_outb(ahd, SG_STATE, 0); + goto clrchn; + } - /* - * Flush the data FIFO. Strickly only - * necessary for Rev A parts. - */ - ahd_outb(ahd, DFCNTRL, - ahd_inb(ahd, DFCNTRL) | FIFOFLUSH); + /* + * Disable S/G fetch so the DMA engine + * is available to future users. + */ + if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) + ahd_outb(ahd, CCSGCTL, 0); + ahd_outb(ahd, SG_STATE, 0); - /* - * Calculate residual. - */ - sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR); - resid = ahd_inl(ahd, SHCNT); - resid |= - ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT+3) << 24; - ahd_outl(ahd, SCB_RESIDUAL_DATACNT, resid); - if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG) == 0) { - /* - * Must back up to the correct S/G element. - * Typically this just means resetting our - * low byte to the offset in the SG_CACHE, - * but if we wrapped, we have to correct - * the other bytes of the sgptr too. - */ - if ((ahd_inb(ahd, SG_CACHE_SHADOW) & 0x80) != 0 - && (sgptr & 0x80) == 0) - sgptr -= 0x100; - sgptr &= ~0xFF; - sgptr |= ahd_inb(ahd, SG_CACHE_SHADOW) - & SG_ADDR_MASK; - ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr); - ahd_outb(ahd, SCB_RESIDUAL_DATACNT + 3, 0); - } else if ((resid & AHD_SG_LEN_MASK) == 0) { - ahd_outb(ahd, SCB_RESIDUAL_SGPTR, - sgptr | SG_LIST_NULL); - } - /* - * Save Pointers. - */ - ahd_outq(ahd, SCB_DATAPTR, ahd_inq(ahd, SHADDR)); - ahd_outl(ahd, SCB_DATACNT, resid); - ahd_outl(ahd, SCB_SGPTR, sgptr); - ahd_outb(ahd, CLRSEQINTSRC, CLRSAVEPTRS); - ahd_outb(ahd, SEQIMODE, - ahd_inb(ahd, SEQIMODE) | ENSAVEPTRS); - /* - * If the data is to the SCSI bus, we are - * done, otherwise wait for FIFOEMP. - */ - if ((ahd_inb(ahd, DFCNTRL) & DIRECTION) != 0) - break; - } else if ((ahd_inb(ahd, SG_STATE) & LOADING_NEEDED) != 0) { - uint32_t sgptr; - uint64_t data_addr; - uint32_t data_len; - u_int dfcntrl; + /* + * Flush the data FIFO. Strickly only + * necessary for Rev A parts. + */ + ahd_outb(ahd, DFCNTRL, ahd_inb(ahd, DFCNTRL) | FIFOFLUSH); + /* + * Calculate residual. + */ + sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR); + resid = ahd_inl(ahd, SHCNT); + resid |= ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT+3) << 24; + ahd_outl(ahd, SCB_RESIDUAL_DATACNT, resid); + if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG) == 0) { /* - * Disable S/G fetch so the DMA engine - * is available to future users. + * Must back up to the correct S/G element. + * Typically this just means resetting our + * low byte to the offset in the SG_CACHE, + * but if we wrapped, we have to correct + * the other bytes of the sgptr too. */ - if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) { - ahd_outb(ahd, CCSGCTL, 0); - ahd_outb(ahd, SG_STATE, LOADING_NEEDED); - } + if ((ahd_inb(ahd, SG_CACHE_SHADOW) & 0x80) != 0 + && (sgptr & 0x80) == 0) + sgptr -= 0x100; + sgptr &= ~0xFF; + sgptr |= ahd_inb(ahd, SG_CACHE_SHADOW) + & SG_ADDR_MASK; + ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr); + ahd_outb(ahd, SCB_RESIDUAL_DATACNT + 3, 0); + } else if ((resid & AHD_SG_LEN_MASK) == 0) { + ahd_outb(ahd, SCB_RESIDUAL_SGPTR, + sgptr | SG_LIST_NULL); + } + /* + * Save Pointers. + */ + ahd_outq(ahd, SCB_DATAPTR, ahd_inq(ahd, SHADDR)); + ahd_outl(ahd, SCB_DATACNT, resid); + ahd_outl(ahd, SCB_SGPTR, sgptr); + ahd_outb(ahd, CLRSEQINTSRC, CLRSAVEPTRS); + ahd_outb(ahd, SEQIMODE, + ahd_inb(ahd, SEQIMODE) | ENSAVEPTRS); + /* + * If the data is to the SCSI bus, we are + * done, otherwise wait for FIFOEMP. + */ + if ((ahd_inb(ahd, DFCNTRL) & DIRECTION) != 0) + goto clrchn; + } else if ((ahd_inb(ahd, SG_STATE) & LOADING_NEEDED) != 0) { + uint32_t sgptr; + uint64_t data_addr; + uint32_t data_len; + u_int dfcntrl; - /* - * Wait for the DMA engine to notice that the - * host transfer is enabled and that there is - * space in the S/G FIFO for new segments before - * loading more segments. - */ - if ((ahd_inb(ahd, DFSTATUS) & PRELOAD_AVAIL) == 0) - continue; - if ((ahd_inb(ahd, DFCNTRL) & HDMAENACK) == 0) - continue; + /* + * Disable S/G fetch so the DMA engine + * is available to future users. We won't + * be using the DMA engine to load segments. + */ + if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) { + ahd_outb(ahd, CCSGCTL, 0); + ahd_outb(ahd, SG_STATE, LOADING_NEEDED); + } + + /* + * Wait for the DMA engine to notice that the + * host transfer is enabled and that there is + * space in the S/G FIFO for new segments before + * loading more segments. + */ + if ((ahd_inb(ahd, DFSTATUS) & PRELOAD_AVAIL) != 0 + && (ahd_inb(ahd, DFCNTRL) & HDMAENACK) != 0) { /* * Determine the offset of the next S/G @@ -756,35 +803,44 @@ ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb) dfcntrl |= SCSIENWRDIS; } ahd_outb(ahd, DFCNTRL, dfcntrl); - } else if ((ahd_inb(ahd, SG_CACHE_SHADOW) - & LAST_SEG_DONE) != 0) { - - /* - * Transfer completed to the end of SG list - * and has flushed to the host. - */ - ahd_outb(ahd, SCB_SGPTR, - ahd_inb_scbram(ahd, SCB_SGPTR) | SG_LIST_NULL); - break; - } else if ((ahd_inb(ahd, DFSTATUS) & FIFOEMP) != 0) { - break; } - ahd_delay(200); + } else if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG_DONE) != 0) { + + /* + * Transfer completed to the end of SG list + * and has flushed to the host. + */ + ahd_outb(ahd, SCB_SGPTR, + ahd_inb_scbram(ahd, SCB_SGPTR) | SG_LIST_NULL); + goto clrchn; + } else if ((ahd_inb(ahd, DFSTATUS) & FIFOEMP) != 0) { +clrchn: + /* + * Clear any handler for this FIFO, decrement + * the FIFO use count for the SCB, and release + * the FIFO. + */ + ahd_outb(ahd, LONGJMP_ADDR + 1, INVALID_ADDR); + ahd_outb(ahd, SCB_FIFO_USE_COUNT, + ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) - 1); + ahd_outb(ahd, DFFSXFRCTL, CLRCHN); } - /* - * Clear any handler for this FIFO, decrement - * the FIFO use count for the SCB, and release - * the FIFO. - */ - ahd_outb(ahd, LONGJMP_ADDR + 1, INVALID_ADDR); - ahd_outb(ahd, SCB_FIFO_USE_COUNT, - ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) - 1); - ahd_outb(ahd, DFFSXFRCTL, CLRCHN); } +/* + * Look for entries in the QoutFIFO that have completed. + * The valid_tag completion field indicates the validity + * of the entry - the valid value toggles each time through + * the queue. We use the sg_status field in the completion + * entry to avoid referencing the hscb if the completion + * occurred with no errors and no residual. sg_status is + * a copy of the first byte (little endian) of the sgptr + * hscb field. + */ void ahd_run_qoutfifo(struct ahd_softc *ahd) { + struct ahd_completion *completion; struct scb *scb; u_int scb_index; @@ -792,11 +848,13 @@ ahd_run_qoutfifo(struct ahd_softc *ahd) panic("ahd_run_qoutfifo recursion"); ahd->flags |= AHD_RUNNING_QOUTFIFO; ahd_sync_qoutfifo(ahd, BUS_DMASYNC_POSTREAD); - while ((ahd->qoutfifo[ahd->qoutfifonext] - & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) { + for (;;) { + completion = &ahd->qoutfifo[ahd->qoutfifonext]; + + if (completion->valid_tag != ahd->qoutfifonext_valid_tag) + break; - scb_index = ahd_le16toh(ahd->qoutfifo[ahd->qoutfifonext] - & ~QOUTFIFO_ENTRY_VALID_LE); + scb_index = ahd_le16toh(completion->tag); scb = ahd_lookup_scb(ahd, scb_index); if (scb == NULL) { printf("%s: WARNING no command for scb %d " @@ -804,12 +862,15 @@ ahd_run_qoutfifo(struct ahd_softc *ahd) ahd_name(ahd), scb_index, ahd->qoutfifonext); ahd_dump_card_state(ahd); - } else - ahd_complete_scb(ahd, scb); + } else if ((completion->sg_status & SG_STATUS_VALID) != 0) { + ahd_handle_scb_status(ahd, scb); + } else { + ahd_done(ahd, scb); + } ahd->qoutfifonext = (ahd->qoutfifonext+1) & (AHD_QOUT_SIZE-1); if (ahd->qoutfifonext == 0) - ahd->qoutfifonext_valid_tag ^= QOUTFIFO_ENTRY_VALID_LE; + ahd->qoutfifonext_valid_tag ^= QOUTFIFO_ENTRY_VALID; } ahd->flags &= ~AHD_RUNNING_QOUTFIFO; } @@ -875,26 +936,6 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) ahd_name(ahd), seqintcode); #endif switch (seqintcode) { - case BAD_SCB_STATUS: - { - struct scb *scb; - u_int scbid; - int cmds_pending; - - scbid = ahd_get_scbptr(ahd); - scb = ahd_lookup_scb(ahd, scbid); - if (scb != NULL) { - ahd_complete_scb(ahd, scb); - } else { - printf("%s: WARNING no command for scb %d " - "(bad status)\n", ahd_name(ahd), scbid); - ahd_dump_card_state(ahd); - } - cmds_pending = ahd_inw(ahd, CMDS_PENDING); - if (cmds_pending > 0) - ahd_outw(ahd, CMDS_PENDING, cmds_pending - 1); - break; - } case ENTERING_NONPACK: { struct scb *scb; @@ -1502,9 +1543,6 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) && (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) != 0) scb = NULL; - /* Make sure the sequencer is in a safe location. */ - ahd_clear_critical_section(ahd); - if ((status0 & IOERR) != 0) { u_int now_lvd; @@ -1520,26 +1558,35 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) ahd_setup_iocell_workaround(ahd); ahd_unpause(ahd); } else if ((status0 & OVERRUN) != 0) { + printf("%s: SCSI offset overrun detected. Resetting bus.\n", ahd_name(ahd)); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/TRUE); } else if ((status & SCSIRSTI) != 0) { + printf("%s: Someone reset channel A\n", ahd_name(ahd)); ahd_reset_channel(ahd, 'A', /*Initiate Reset*/FALSE); } else if ((status & SCSIPERR) != 0) { + + /* Make sure the sequencer is in a safe location. */ + ahd_clear_critical_section(ahd); + ahd_handle_transmission_error(ahd); } else if (lqostat0 != 0) { + printf("%s: lqostat0 == 0x%x!\n", ahd_name(ahd), lqostat0); ahd_outb(ahd, CLRLQOINT0, lqostat0); - if ((ahd->bugs & AHD_CLRLQO_AUTOCLR_BUG) != 0) { + if ((ahd->bugs & AHD_CLRLQO_AUTOCLR_BUG) != 0) ahd_outb(ahd, CLRLQOINT1, 0); - } } else if ((status & SELTO) != 0) { u_int scbid; /* Stop the selection */ ahd_outb(ahd, SCSISEQ0, 0); + /* Make sure the sequencer is in a safe location. */ + ahd_clear_critical_section(ahd); + /* No more pending messages */ ahd_clear_msg_state(ahd); @@ -1572,24 +1619,27 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) scbid); } #endif - /* - * Force a renegotiation with this target just in - * case the cable was pulled and will later be - * re-attached. The target may forget its negotiation - * settings with us should it attempt to reselect - * during the interruption. The target will not issue - * a unit attention in this case, so we must always - * renegotiate. - */ ahd_scb_devinfo(ahd, &devinfo, scb); - ahd_force_renegotiation(ahd, &devinfo); ahd_set_transaction_status(scb, CAM_SEL_TIMEOUT); ahd_freeze_devq(ahd, scb); + + /* + * Cancel any pending transactions on the device + * now that it seems to be missing. This will + * also revert us to async/narrow transfers until + * we can renegotiate with the device. + */ + ahd_handle_devreset(ahd, &devinfo, + CAM_LUN_WILDCARD, + CAM_SEL_TIMEOUT, + "Selection Timeout", + /*verbose_level*/1); } ahd_outb(ahd, CLRINT, CLRSCSIINT); ahd_iocell_first_selection(ahd); ahd_unpause(ahd); } else if ((status0 & (SELDI|SELDO)) != 0) { + ahd_iocell_first_selection(ahd); ahd_unpause(ahd); } else if (status3 != 0) { @@ -1597,6 +1647,10 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) ahd_name(ahd), status3); ahd_outb(ahd, CLRSINT3, status3); } else if ((lqistat1 & (LQIPHASE_LQ|LQIPHASE_NLQ)) != 0) { + + /* Make sure the sequencer is in a safe location. */ + ahd_clear_critical_section(ahd); + ahd_handle_lqiphase_error(ahd, lqistat1); } else if ((lqistat1 & LQICRCI_NLQ) != 0) { /* @@ -1621,6 +1675,9 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) */ ahd_outb(ahd, SCSISEQ0, 0); + /* Make sure the sequencer is in a safe location. */ + ahd_clear_critical_section(ahd); + /* * Determine what we were up to at the time of * the busfree. @@ -1658,7 +1715,16 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) clear_fifo = 0; packetized = (lqostat1 & LQOBUSFREE) != 0; if (!packetized - && ahd_inb(ahd, LASTPHASE) == P_BUSFREE) + && ahd_inb(ahd, LASTPHASE) == P_BUSFREE + && (ahd_inb(ahd, SSTAT0) & SELDI) == 0 + && ((ahd_inb(ahd, SSTAT0) & SELDO) == 0 + || (ahd_inb(ahd, SCSISEQ0) & ENSELO) == 0)) + /* + * Assume packetized if we are not + * on the bus in a non-packetized + * capacity and any pending selection + * was a packetized selection. + */ packetized = 1; break; } @@ -3193,14 +3259,25 @@ ahd_update_neg_table(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_PRECOMP_MASK; if ((ahd->features & AHD_NEW_IOCELL_OPTS) != 0 - && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0) { + && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0 + && (ppr_opts & MSG_EXT_PPR_IU_REQ) == 0) { /* * Slow down our CRC interval to be - * compatible with devices that can't - * handle a CRC at full speed. + * compatible with non-packetized + * U160 devices that can't handle a + * CRC at full speed. */ con_opts |= ENSLOWCRC; } + + if ((ahd->bugs & AHD_PACED_NEGTABLE_BUG) != 0) { + /* + * On H2A4, revert to a slower slewrate + * on non-paced transfers. + */ + iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= + ~AHD_SLEWRATE_MASK; + } } ahd_outb(ahd, ANNEXCOL, AHD_ANNEXCOL_PRECOMP_SLEW); @@ -3289,11 +3366,15 @@ ahd_update_pending_scbs(struct ahd_softc *ahd) * Force the sequencer to reinitialize the selection for * the command at the head of the execution queue if it * has already been setup. The negotiation changes may - * effect whether we select-out with ATN. + * effect whether we select-out with ATN. It is only + * safe to clear ENSELO when the bus is not free and no + * selection is in progres or completed. */ saved_modes = ahd_save_modes(ahd); ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); - ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO); + if ((ahd_inb(ahd, SCSISIGI) & BSYI) != 0 + && (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) == 0) + ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO); saved_scbptr = ahd_get_scbptr(ahd); /* Ensure that the hscbs down on the card match the new information */ for (scb_tag = 0; scb_tag < ahd->scb_data.maxhscbs; scb_tag++) { @@ -4999,13 +5080,14 @@ ahd_handle_devreset(struct ahd_softc *ahd, struct ahd_devinfo *devinfo, ahd_set_width(ahd, devinfo, MSG_EXT_WDTR_BUS_8_BIT, AHD_TRANS_CUR, /*paused*/TRUE); ahd_set_syncrate(ahd, devinfo, /*period*/0, /*offset*/0, - /*ppr_options*/0, AHD_TRANS_CUR, /*paused*/TRUE); + /*ppr_options*/0, AHD_TRANS_CUR, + /*paused*/TRUE); - ahd_send_async(ahd, devinfo->channel, devinfo->target, - lun, AC_SENT_BDR, NULL); + if (status != CAM_SEL_TIMEOUT) + ahd_send_async(ahd, devinfo->channel, devinfo->target, + CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); - if (message != NULL - && (verbose_level <= bootverbose)) + if (message != NULL && bootverbose) printf("%s: %s on %c:%d. %d SCBs aborted\n", ahd_name(ahd), message, devinfo->channel, devinfo->target, found); } @@ -5963,16 +6045,13 @@ ahd_alloc_scbs(struct ahd_softc *ahd) newcount = MIN(scb_data->sense_left, scb_data->scbs_left); newcount = MIN(newcount, scb_data->sgs_left); newcount = MIN(newcount, (AHD_SCB_MAX_ALLOC - scb_data->numscbs)); - scb_data->sense_left -= newcount; - scb_data->scbs_left -= newcount; - scb_data->sgs_left -= newcount; for (i = 0; i < newcount; i++) { - u_int col_tag; - struct scb_platform_data *pdata; + u_int col_tag; #ifndef __linux__ int error; #endif + next_scb = (struct scb *)malloc(sizeof(*next_scb), M_DEVBUF, M_NOWAIT); if (next_scb == NULL) @@ -6029,6 +6108,9 @@ ahd_alloc_scbs(struct ahd_softc *ahd) sense_data += AHD_SENSE_BUFSIZE; sense_busaddr += AHD_SENSE_BUFSIZE; scb_data->numscbs++; + scb_data->sense_left--; + scb_data->scbs_left--; + scb_data->sgs_left--; } } @@ -6143,7 +6225,7 @@ ahd_init(struct ahd_softc *ahd) * for the target mode role, we must additionally provide space for * the incoming target command fifo. */ - driver_data_size = AHD_SCB_MAX * sizeof(uint16_t) + driver_data_size = AHD_SCB_MAX * sizeof(*ahd->qoutfifo) + sizeof(struct hardware_scb); if ((ahd->features & AHD_TARGETMODE) != 0) driver_data_size += AHD_TMODE_CMDS * sizeof(struct target_cmd); @@ -6178,10 +6260,10 @@ ahd_init(struct ahd_softc *ahd) ahd->shared_data_map.vaddr, driver_data_size, ahd_dmamap_cb, &ahd->shared_data_map.physaddr, /*flags*/0); - ahd->qoutfifo = (uint16_t *)ahd->shared_data_map.vaddr; + ahd->qoutfifo = (struct ahd_completion *)ahd->shared_data_map.vaddr; next_vaddr = (uint8_t *)&ahd->qoutfifo[AHD_QOUT_SIZE]; next_baddr = ahd->shared_data_map.physaddr - + AHD_QOUT_SIZE*sizeof(uint16_t); + + AHD_QOUT_SIZE*sizeof(struct ahd_completion); if ((ahd->features & AHD_TARGETMODE) != 0) { ahd->targetcmds = (struct target_cmd *)next_vaddr; next_vaddr += AHD_TMODE_CMDS * sizeof(struct target_cmd); @@ -6508,10 +6590,10 @@ ahd_chip_init(struct ahd_softc *ahd) /* All of our queues are empty */ ahd->qoutfifonext = 0; - ahd->qoutfifonext_valid_tag = QOUTFIFO_ENTRY_VALID_LE; - ahd_outb(ahd, QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID >> 8); + ahd->qoutfifonext_valid_tag = QOUTFIFO_ENTRY_VALID; + ahd_outb(ahd, QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID); for (i = 0; i < AHD_QOUT_SIZE; i++) - ahd->qoutfifo[i] = 0; + ahd->qoutfifo[i].valid_tag = 0; ahd_sync_qoutfifo(ahd, BUS_DMASYNC_PREREAD); ahd->qinfifonext = 0; @@ -6544,12 +6626,15 @@ ahd_chip_init(struct ahd_softc *ahd) ahd_outw(ahd, COMPLETE_SCB_HEAD, SCB_LIST_NULL); ahd_outw(ahd, COMPLETE_SCB_DMAINPROG_HEAD, SCB_LIST_NULL); ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, SCB_LIST_NULL); + ahd_outw(ahd, COMPLETE_DMA_SCB_TAIL, SCB_LIST_NULL); + ahd_outw(ahd, COMPLETE_ON_QFREEZE_HEAD, SCB_LIST_NULL); /* * The Freeze Count is 0. */ ahd->qfreeze_cnt = 0; ahd_outw(ahd, QFREEZE_COUNT, 0); + ahd_outw(ahd, KERNEL_QFREEZE_COUNT, 0); /* * Tell the sequencer where it can find our arrays in memory. @@ -6909,43 +6994,34 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) { u_int intstat; u_int maxloops; - u_int qfreeze_cnt; maxloops = 1000; ahd->flags |= AHD_ALL_INTERRUPTS; ahd_pause(ahd); /* - * Increment the QFreeze Count so that the sequencer - * will not start new selections. We do this only + * Freeze the outgoing selections. We do this only * until we are safely paused without further selections * pending. */ - ahd_outw(ahd, QFREEZE_COUNT, ahd_inw(ahd, QFREEZE_COUNT) + 1); + ahd->qfreeze_cnt--; + ahd_outw(ahd, KERNEL_QFREEZE_COUNT, ahd->qfreeze_cnt); ahd_outb(ahd, SEQ_FLAGS2, ahd_inb(ahd, SEQ_FLAGS2) | SELECTOUT_QFROZEN); do { - struct scb *waiting_scb; ahd_unpause(ahd); + /* + * Give the sequencer some time to service + * any active selections. + */ + ahd_delay(500); + ahd_intr(ahd); ahd_pause(ahd); - ahd_clear_critical_section(ahd); intstat = ahd_inb(ahd, INTSTAT); - ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); - if ((ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) == 0) - ahd_outb(ahd, SCSISEQ0, - ahd_inb(ahd, SCSISEQ0) & ~ENSELO); - /* - * In the non-packetized case, the sequencer (for Rev A), - * relies on ENSELO remaining set after SELDO. The hardware - * auto-clears ENSELO in the packetized case. - */ - waiting_scb = ahd_lookup_scb(ahd, - ahd_inw(ahd, WAITING_TID_HEAD)); - if (waiting_scb != NULL - && (waiting_scb->flags & SCB_PACKETIZED) == 0 - && (ahd_inb(ahd, SSTAT0) & (SELDO|SELINGO)) != 0) - ahd_outb(ahd, SCSISEQ0, - ahd_inb(ahd, SCSISEQ0) | ENSELO); + if ((intstat & INT_PEND) == 0) { + ahd_clear_critical_section(ahd); + intstat = ahd_inb(ahd, INTSTAT); + } } while (--maxloops && (intstat != 0xFF || (ahd->features & AHD_REMOVABLE) == 0) && ((intstat & INT_PEND) != 0 @@ -6956,17 +7032,8 @@ ahd_pause_and_flushwork(struct ahd_softc *ahd) printf("Infinite interrupt loop, INTSTAT = %x", ahd_inb(ahd, INTSTAT)); } - qfreeze_cnt = ahd_inw(ahd, QFREEZE_COUNT); - if (qfreeze_cnt == 0) { - printf("%s: ahd_pause_and_flushwork with 0 qfreeze count!\n", - ahd_name(ahd)); - } else { - qfreeze_cnt--; - } - ahd_outw(ahd, QFREEZE_COUNT, qfreeze_cnt); - if (qfreeze_cnt == 0) - ahd_outb(ahd, SEQ_FLAGS2, - ahd_inb(ahd, SEQ_FLAGS2) & ~SELECTOUT_QFROZEN); + ahd->qfreeze_cnt++; + ahd_outw(ahd, KERNEL_QFREEZE_COUNT, ahd->qfreeze_cnt); ahd_flush_qoutfifo(ahd); @@ -7307,6 +7374,7 @@ ahd_search_qinfifo(struct ahd_softc *ahd, int target, char channel, * appropriate, traverse the SCBs of each "their id" * looking for matches. */ + ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); savedscbptr = ahd_get_scbptr(ahd); tid_next = ahd_inw(ahd, WAITING_TID_HEAD); tid_prev = SCB_LIST_NULL; @@ -7376,7 +7444,7 @@ ahd_search_scb_list(struct ahd_softc *ahd, int target, char channel, u_int prev; int found; - AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK); + AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); found = 0; prev = SCB_LIST_NULL; next = *list_head; @@ -7443,7 +7511,7 @@ static void ahd_stitch_tid_list(struct ahd_softc *ahd, u_int tid_prev, u_int tid_cur, u_int tid_next) { - AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK); + AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); if (SCBID_IS_NULL(tid_cur)) { @@ -7483,7 +7551,7 @@ ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid, { u_int tail_offset; - AHD_ASSERT_MODES(ahd, AHD_MODE_CCHAN_MSK, AHD_MODE_CCHAN_MSK); + AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK); if (!SCBID_IS_NULL(prev)) { ahd_set_scbptr(ahd, prev); ahd_outw(ahd, SCB_NEXT, next); @@ -7887,30 +7955,35 @@ ahd_handle_scb_status(struct ahd_softc *ahd, struct scb *scb) void ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb) { - struct hardware_scb *hscb; - u_int qfreeze_cnt; + struct hardware_scb *hscb; + int paused; /* * The sequencer freezes its select-out queue * anytime a SCSI status error occurs. We must - * handle the error and decrement the QFREEZE count - * to allow the sequencer to continue. + * handle the error and increment our qfreeze count + * to allow the sequencer to continue. We don't + * bother clearing critical sections here since all + * operations are on data structures that the sequencer + * is not touching once the queue is frozen. */ hscb = scb->hscb; + if (ahd_is_paused(ahd)) { + paused = 1; + } else { + paused = 0; + ahd_pause(ahd); + } + /* Freeze the queue until the client sees the error. */ ahd_freeze_devq(ahd, scb); ahd_freeze_scb(scb); - qfreeze_cnt = ahd_inw(ahd, QFREEZE_COUNT); - if (qfreeze_cnt == 0) { - printf("%s: Bad status with 0 qfreeze count!\n", ahd_name(ahd)); - } else { - qfreeze_cnt--; - ahd_outw(ahd, QFREEZE_COUNT, qfreeze_cnt); - } - if (qfreeze_cnt == 0) - ahd_outb(ahd, SEQ_FLAGS2, - ahd_inb(ahd, SEQ_FLAGS2) & ~SELECTOUT_QFROZEN); + ahd->qfreeze_cnt++; + ahd_outw(ahd, KERNEL_QFREEZE_COUNT, ahd->qfreeze_cnt); + + if (paused == 0) + ahd_unpause(ahd); /* Don't want to clobber the original sense code */ if ((scb->flags & SCB_SENSE) != 0) { @@ -8323,13 +8396,14 @@ ahd_loadseq(struct ahd_softc *ahd) u_int sg_prefetch_cnt_limit; u_int sg_prefetch_align; u_int sg_size; + u_int cacheline_mask; uint8_t download_consts[DOWNLOAD_CONST_COUNT]; if (bootverbose) printf("%s: Downloading Sequencer Program...", ahd_name(ahd)); -#if DOWNLOAD_CONST_COUNT != 7 +#if DOWNLOAD_CONST_COUNT != 8 #error "Download Const Mismatch" #endif /* @@ -8365,6 +8439,9 @@ ahd_loadseq(struct ahd_softc *ahd) /* Round down to the nearest power of 2. */ while (powerof2(sg_prefetch_align) == 0) sg_prefetch_align--; + + cacheline_mask = sg_prefetch_align - 1; + /* * If the cacheline boundary is greater than half our prefetch RAM * we risk not being able to fetch even a single complete S/G @@ -8405,6 +8482,7 @@ ahd_loadseq(struct ahd_softc *ahd) download_consts[PKT_OVERRUN_BUFOFFSET] = (ahd->overrun_buf - (uint8_t *)ahd->qoutfifo) / 256; download_consts[SCB_TRANSFER_SIZE] = SCB_TRANSFER_SIZE_1BYTE_LUN; + download_consts[CACHELINE_MASK] = cacheline_mask; cur_patch = patches; downloaded = 0; skip_addr = 0; @@ -8818,6 +8896,15 @@ ahd_dump_card_state(struct ahd_softc *ahd) scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE); } printf("\n"); + printf("Sequencer On QFreeze and Complete list: "); + scb_index = ahd_inw(ahd, COMPLETE_ON_QFREEZE_HEAD); + i = 0; + while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) { + ahd_set_scbptr(ahd, scb_index); + printf("%d ", scb_index); + scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE); + } + printf("\n"); ahd_set_scbptr(ahd, saved_scb_index); dffstat = ahd_inb(ahd, DFFSTAT); for (i = 0; i < 2; i++) { @@ -9052,7 +9139,7 @@ ahd_wait_seeprom(struct ahd_softc *ahd) { int cnt; - cnt = 20; + cnt = 5000; while ((ahd_inb(ahd, SEESTAT) & (SEEARBACK|SEEBUSY)) != 0 && --cnt) ahd_delay(5); diff --git a/drivers/scsi/aic7xxx/aic79xx_inline.h b/drivers/scsi/aic7xxx/aic79xx_inline.h index 2b7ff989f3d..91c4f7f484b 100644 --- a/drivers/scsi/aic7xxx/aic79xx_inline.h +++ b/drivers/scsi/aic7xxx/aic79xx_inline.h @@ -839,7 +839,7 @@ ahd_sync_qoutfifo(struct ahd_softc *ahd, int op) { ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, /*offset*/0, - /*len*/AHD_SCB_MAX * sizeof(uint16_t), op); + /*len*/AHD_SCB_MAX * sizeof(struct ahd_completion), op); } static __inline void @@ -871,8 +871,8 @@ ahd_check_cmdcmpltqueues(struct ahd_softc *ahd) ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap, /*offset*/ahd->qoutfifonext * sizeof(*ahd->qoutfifo), /*len*/sizeof(*ahd->qoutfifo), BUS_DMASYNC_POSTREAD); - if ((ahd->qoutfifo[ahd->qoutfifonext] - & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) + if (ahd->qoutfifo[ahd->qoutfifonext].valid_tag + == ahd->qoutfifonext_valid_tag) retval |= AHD_RUN_QOUTFIFO; #ifdef AHD_TARGET_MODE if ((ahd->flags & AHD_TARGETROLE) != 0 diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index 1c8f872e2dd..2567e29960b 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -1468,6 +1468,30 @@ ahd_linux_run_command(struct ahd_softc *ahd, struct ahd_linux_device *dev, if ((tstate->auto_negotiate & mask) != 0) { scb->flags |= SCB_AUTO_NEGOTIATE; scb->hscb->control |= MK_MESSAGE; + } else if (cmd->cmnd[0] == INQUIRY + && (tinfo->curr.offset != 0 + || tinfo->curr.width != MSG_EXT_WDTR_BUS_8_BIT + || tinfo->curr.ppr_options != 0) + && (tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ)==0) { + /* + * The SCSI spec requires inquiry + * commands to complete without + * reporting unit attention conditions. + * Because of this, an inquiry command + * that occurs just after a device is + * reset will result in a data phase + * with mismatched negotiated rates. + * The core already forces a renegotiation + * for reset events that are visible to + * our controller or that we initiate, + * but a third party device reset or a + * hot-plug insertion can still cause this + * issue. Therefore, we force a re-negotiation + * for every inquiry command unless we + * are async. + */ + scb->flags |= SCB_NEGOTIATE; + scb->hscb->control |= MK_MESSAGE; } if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) != 0) { @@ -2058,6 +2082,7 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag) int paused; int wait; int disconnected; + int found; ahd_mode_state saved_modes; unsigned long flags; @@ -2176,7 +2201,8 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag) last_phase = ahd_inb(ahd, LASTPHASE); saved_scbptr = ahd_get_scbptr(ahd); active_scbptr = saved_scbptr; - if (disconnected && (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0) { + if (disconnected && ((last_phase != P_BUSFREE) || + (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0)) { struct scb *bus_scb; bus_scb = ahd_lookup_scb(ahd, active_scbptr); @@ -2194,28 +2220,41 @@ ahd_linux_queue_recovery_cmd(struct scsi_cmnd *cmd, scb_flag flag) * bus or is in the disconnected state. */ saved_scsiid = ahd_inb(ahd, SAVED_SCSIID); - if (last_phase != P_BUSFREE - && (SCB_GET_TAG(pending_scb) == active_scbptr + if (SCB_GET_TAG(pending_scb) == active_scbptr || (flag == SCB_DEVICE_RESET - && SCSIID_TARGET(ahd, saved_scsiid) == scmd_id(cmd)))) { + && SCSIID_TARGET(ahd, saved_scsiid) == scmd_id(cmd))) { /* * We're active on the bus, so assert ATN * and hope that the target responds. */ pending_scb = ahd_lookup_scb(ahd, active_scbptr); - pending_scb->flags |= SCB_RECOVERY_SCB|flag; + pending_scb->flags |= SCB_RECOVERY_SCB|SCB_DEVICE_RESET; ahd_outb(ahd, MSG_OUT, HOST_MSG); ahd_outb(ahd, SCSISIGO, last_phase|ATNO); - scmd_printk(KERN_INFO, cmd, "Device is active, asserting ATN\n"); + scmd_printk(KERN_INFO, cmd, "BDR message in message buffer\n"); wait = TRUE; + } else if (last_phase != P_BUSFREE + && ahd_inb(ahd, SCSIPHASE) == 0) { + /* + * SCB is not identified, there + * is no pending REQ, and the sequencer + * has not seen a busfree. Looks like + * a stuck connection waiting to + * go busfree. Reset the bus. + */ + found = ahd_reset_channel(ahd, cmd->device->channel + 'A', + /*Initiate Reset*/TRUE); + printf("%s: Issued Channel %c Bus Reset. " + "%d SCBs aborted\n", ahd_name(ahd), + cmd->device->channel + 'A', found); } else if (disconnected) { /* * Actually re-queue this SCB in an attempt * to select the device before it reconnects. */ - pending_scb->flags |= SCB_RECOVERY_SCB|SCB_ABORT; + pending_scb->flags |= SCB_RECOVERY_SCB|flag; ahd_set_scbptr(ahd, SCB_GET_TAG(pending_scb)); pending_scb->hscb->cdb_len = 0; pending_scb->hscb->task_attribute = 0; @@ -2296,16 +2335,17 @@ done: timer.expires = jiffies + (5 * HZ); timer.function = ahd_linux_sem_timeout; add_timer(&timer); - printf("Recovery code sleeping\n"); + printf("%s: Recovery code sleeping\n", ahd_name(ahd)); down(&ahd->platform_data->eh_sem); - printf("Recovery code awake\n"); + printf("%s: Recovery code awake\n", ahd_name(ahd)); ret = del_timer_sync(&timer); if (ret == 0) { - printf("Timer Expired\n"); + printf("%s: Timer Expired (active %d)\n", + ahd_name(ahd), dev->active); retval = FAILED; } } - ahd_unlock(ahd, &flags); + ahd_unlock(ahd, &flags); return (retval); } diff --git a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped index c01ac39090d..8763b158856 100644 --- a/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped +++ b/drivers/scsi/aic7xxx/aic79xx_reg.h_shipped @@ -2,8 +2,8 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $ - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $ */ typedef int (ahd_reg_print_t)(u_int, u_int *, u_int); typedef struct ahd_reg_parse_entry { @@ -83,17 +83,17 @@ ahd_reg_print_t ahd_hs_mailbox_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_clrseqintstat_print; +ahd_reg_print_t ahd_seqintstat_print; #else -#define ahd_clrseqintstat_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CLRSEQINTSTAT", 0x0c, regvalue, cur_col, wrap) +#define ahd_seqintstat_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SEQINTSTAT", 0x0c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_seqintstat_print; +ahd_reg_print_t ahd_clrseqintstat_print; #else -#define ahd_seqintstat_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SEQINTSTAT", 0x0c, regvalue, cur_col, wrap) +#define ahd_clrseqintstat_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CLRSEQINTSTAT", 0x0c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -412,17 +412,17 @@ ahd_reg_print_t ahd_sxfrctl0_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_businitid_print; +ahd_reg_print_t ahd_dlcount_print; #else -#define ahd_businitid_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "BUSINITID", 0x3c, regvalue, cur_col, wrap) +#define ahd_dlcount_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DLCOUNT", 0x3c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dlcount_print; +ahd_reg_print_t ahd_businitid_print; #else -#define ahd_dlcount_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DLCOUNT", 0x3c, regvalue, cur_col, wrap) +#define ahd_businitid_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "BUSINITID", 0x3c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -516,13 +516,6 @@ ahd_reg_print_t ahd_selid_print; ahd_print_register(NULL, 0, "SELID", 0x49, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sblkctl_print; -#else -#define ahd_sblkctl_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SBLKCTL", 0x4a, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_optionmode_print; #else @@ -531,10 +524,10 @@ ahd_reg_print_t ahd_optionmode_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sstat0_print; +ahd_reg_print_t ahd_sblkctl_print; #else -#define ahd_sstat0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SSTAT0", 0x4b, regvalue, cur_col, wrap) +#define ahd_sblkctl_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SBLKCTL", 0x4a, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -544,6 +537,13 @@ ahd_reg_print_t ahd_clrsint0_print; ahd_print_register(NULL, 0, "CLRSINT0", 0x4b, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_sstat0_print; +#else +#define ahd_sstat0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SSTAT0", 0x4b, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_simode0_print; #else @@ -573,17 +573,17 @@ ahd_reg_print_t ahd_sstat2_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_clrsint2_print; +ahd_reg_print_t ahd_simode2_print; #else -#define ahd_clrsint2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CLRSINT2", 0x4d, regvalue, cur_col, wrap) +#define ahd_simode2_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SIMODE2", 0x4d, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_simode2_print; +ahd_reg_print_t ahd_clrsint2_print; #else -#define ahd_simode2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SIMODE2", 0x4d, regvalue, cur_col, wrap) +#define ahd_clrsint2_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CLRSINT2", 0x4d, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -684,13 +684,6 @@ ahd_reg_print_t ahd_clrsint3_print; ahd_print_register(NULL, 0, "CLRSINT3", 0x53, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_lqomode0_print; -#else -#define ahd_lqomode0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LQOMODE0", 0x54, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_lqostat0_print; #else @@ -705,6 +698,20 @@ ahd_reg_print_t ahd_clrlqoint0_print; ahd_print_register(NULL, 0, "CLRLQOINT0", 0x54, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_lqomode0_print; +#else +#define ahd_lqomode0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "LQOMODE0", 0x54, regvalue, cur_col, wrap) +#endif + +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_lqomode1_print; +#else +#define ahd_lqomode1_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "LQOMODE1", 0x55, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_lqostat1_print; #else @@ -719,13 +726,6 @@ ahd_reg_print_t ahd_clrlqoint1_print; ahd_print_register(NULL, 0, "CLRLQOINT1", 0x55, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_lqomode1_print; -#else -#define ahd_lqomode1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LQOMODE1", 0x55, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_lqostat2_print; #else @@ -909,17 +909,17 @@ ahd_reg_print_t ahd_annexcol_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_scschkn_print; +ahd_reg_print_t ahd_annexdat_print; #else -#define ahd_scschkn_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCSCHKN", 0x66, regvalue, cur_col, wrap) +#define ahd_annexdat_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "ANNEXDAT", 0x66, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_annexdat_print; +ahd_reg_print_t ahd_scschkn_print; #else -#define ahd_annexdat_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "ANNEXDAT", 0x66, regvalue, cur_col, wrap) +#define ahd_scschkn_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SCSCHKN", 0x66, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1000,17 +1000,17 @@ ahd_reg_print_t ahd_pll400ctl1_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_pll400cnt0_print; +ahd_reg_print_t ahd_unfairness_print; #else -#define ahd_pll400cnt0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "PLL400CNT0", 0x6e, regvalue, cur_col, wrap) +#define ahd_unfairness_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "UNFAIRNESS", 0x6e, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_unfairness_print; +ahd_reg_print_t ahd_pll400cnt0_print; #else -#define ahd_unfairness_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "UNFAIRNESS", 0x6e, regvalue, cur_col, wrap) +#define ahd_pll400cnt0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "PLL400CNT0", 0x6e, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1055,13 +1055,6 @@ ahd_reg_print_t ahd_hodmaen_print; ahd_print_register(NULL, 0, "HODMAEN", 0x7a, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sghaddr_print; -#else -#define ahd_sghaddr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SGHADDR", 0x7c, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_scbhaddr_print; #else @@ -1070,10 +1063,10 @@ ahd_reg_print_t ahd_scbhaddr_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sghcnt_print; +ahd_reg_print_t ahd_sghaddr_print; #else -#define ahd_sghcnt_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SGHCNT", 0x84, regvalue, cur_col, wrap) +#define ahd_sghaddr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SGHADDR", 0x7c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1083,6 +1076,13 @@ ahd_reg_print_t ahd_scbhcnt_print; ahd_print_register(NULL, 0, "SCBHCNT", 0x84, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_sghcnt_print; +#else +#define ahd_sghcnt_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SGHCNT", 0x84, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_dff_thrsh_print; #else @@ -1153,13 +1153,6 @@ ahd_reg_print_t ahd_nsenable_print; ahd_print_register(NULL, 0, "NSENABLE", 0x91, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dchrxmsg1_print; -#else -#define ahd_dchrxmsg1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DCHRXMSG1", 0x91, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_cmcrxmsg1_print; #else @@ -1168,17 +1161,17 @@ ahd_reg_print_t ahd_cmcrxmsg1_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dchrxmsg2_print; +ahd_reg_print_t ahd_dchrxmsg1_print; #else -#define ahd_dchrxmsg2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DCHRXMSG2", 0x92, regvalue, cur_col, wrap) +#define ahd_dchrxmsg1_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DCHRXMSG1", 0x91, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ovlyrxmsg2_print; +ahd_reg_print_t ahd_dchrxmsg2_print; #else -#define ahd_ovlyrxmsg2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "OVLYRXMSG2", 0x92, regvalue, cur_col, wrap) +#define ahd_dchrxmsg2_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DCHRXMSG2", 0x92, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1195,6 +1188,13 @@ ahd_reg_print_t ahd_ost_print; ahd_print_register(NULL, 0, "OST", 0x92, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_ovlyrxmsg2_print; +#else +#define ahd_ovlyrxmsg2_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "OVLYRXMSG2", 0x92, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_dchrxmsg3_print; #else @@ -1202,6 +1202,13 @@ ahd_reg_print_t ahd_dchrxmsg3_print; ahd_print_register(NULL, 0, "DCHRXMSG3", 0x93, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_ovlyrxmsg3_print; +#else +#define ahd_ovlyrxmsg3_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "OVLYRXMSG3", 0x93, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_cmcrxmsg3_print; #else @@ -1216,13 +1223,6 @@ ahd_reg_print_t ahd_pcixctl_print; ahd_print_register(NULL, 0, "PCIXCTL", 0x93, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ovlyrxmsg3_print; -#else -#define ahd_ovlyrxmsg3_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "OVLYRXMSG3", 0x93, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_ovlyseqbcnt_print; #else @@ -1230,13 +1230,6 @@ ahd_reg_print_t ahd_ovlyseqbcnt_print; ahd_print_register(NULL, 0, "OVLYSEQBCNT", 0x94, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_cmcseqbcnt_print; -#else -#define ahd_cmcseqbcnt_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CMCSEQBCNT", 0x94, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_dchseqbcnt_print; #else @@ -1245,17 +1238,17 @@ ahd_reg_print_t ahd_dchseqbcnt_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_cmcspltstat0_print; +ahd_reg_print_t ahd_cmcseqbcnt_print; #else -#define ahd_cmcspltstat0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CMCSPLTSTAT0", 0x96, regvalue, cur_col, wrap) +#define ahd_cmcseqbcnt_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CMCSEQBCNT", 0x94, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ovlyspltstat0_print; +ahd_reg_print_t ahd_cmcspltstat0_print; #else -#define ahd_ovlyspltstat0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "OVLYSPLTSTAT0", 0x96, regvalue, cur_col, wrap) +#define ahd_cmcspltstat0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CMCSPLTSTAT0", 0x96, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1266,10 +1259,10 @@ ahd_reg_print_t ahd_dchspltstat0_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dchspltstat1_print; +ahd_reg_print_t ahd_ovlyspltstat0_print; #else -#define ahd_dchspltstat1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DCHSPLTSTAT1", 0x97, regvalue, cur_col, wrap) +#define ahd_ovlyspltstat0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "OVLYSPLTSTAT0", 0x96, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1286,6 +1279,13 @@ ahd_reg_print_t ahd_ovlyspltstat1_print; ahd_print_register(NULL, 0, "OVLYSPLTSTAT1", 0x97, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_dchspltstat1_print; +#else +#define ahd_dchspltstat1_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DCHSPLTSTAT1", 0x97, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_sgrxmsg0_print; #else @@ -1378,17 +1378,17 @@ ahd_reg_print_t ahd_sgspltstat0_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sfunct_print; +ahd_reg_print_t ahd_sgspltstat1_print; #else -#define ahd_sfunct_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SFUNCT", 0x9f, regvalue, cur_col, wrap) +#define ahd_sgspltstat1_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SGSPLTSTAT1", 0x9f, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_sgspltstat1_print; +ahd_reg_print_t ahd_sfunct_print; #else -#define ahd_sgspltstat1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SGSPLTSTAT1", 0x9f, regvalue, cur_col, wrap) +#define ahd_sfunct_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SFUNCT", 0x9f, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1504,17 +1504,17 @@ ahd_reg_print_t ahd_ccsgaddr_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ccscbaddr_print; +ahd_reg_print_t ahd_ccscbadr_bk_print; #else -#define ahd_ccscbaddr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CCSCBADDR", 0xac, regvalue, cur_col, wrap) +#define ahd_ccscbadr_bk_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CCSCBADR_BK", 0xac, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ccscbadr_bk_print; +ahd_reg_print_t ahd_ccscbaddr_print; #else -#define ahd_ccscbadr_bk_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CCSCBADR_BK", 0xac, regvalue, cur_col, wrap) +#define ahd_ccscbaddr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CCSCBADDR", 0xac, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1525,17 +1525,17 @@ ahd_reg_print_t ahd_cmc_rambist_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ccsgctl_print; +ahd_reg_print_t ahd_ccscbctl_print; #else -#define ahd_ccsgctl_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CCSGCTL", 0xad, regvalue, cur_col, wrap) +#define ahd_ccscbctl_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CCSCBCTL", 0xad, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_ccscbctl_print; +ahd_reg_print_t ahd_ccsgctl_print; #else -#define ahd_ccscbctl_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CCSCBCTL", 0xad, regvalue, cur_col, wrap) +#define ahd_ccsgctl_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CCSGCTL", 0xad, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1706,13 +1706,6 @@ ahd_reg_print_t ahd_wrtbiascalc_print; ahd_print_register(NULL, 0, "WRTBIASCALC", 0xc7, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dfptrs_print; -#else -#define ahd_dfptrs_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DFPTRS", 0xc8, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_rcvrbiascalc_print; #else @@ -1721,10 +1714,10 @@ ahd_reg_print_t ahd_rcvrbiascalc_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_dfbkptr_print; +ahd_reg_print_t ahd_dfptrs_print; #else -#define ahd_dfbkptr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DFBKPTR", 0xc9, regvalue, cur_col, wrap) +#define ahd_dfptrs_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DFPTRS", 0xc8, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1734,6 +1727,13 @@ ahd_reg_print_t ahd_skewcalc_print; ahd_print_register(NULL, 0, "SKEWCALC", 0xc9, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_dfbkptr_print; +#else +#define ahd_dfbkptr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "DFBKPTR", 0xc9, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_dfdbctl_print; #else @@ -1826,17 +1826,17 @@ ahd_reg_print_t ahd_dindex_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_brkaddr1_print; +ahd_reg_print_t ahd_brkaddr0_print; #else -#define ahd_brkaddr1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "BRKADDR1", 0xe6, regvalue, cur_col, wrap) +#define ahd_brkaddr0_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "BRKADDR0", 0xe6, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_brkaddr0_print; +ahd_reg_print_t ahd_brkaddr1_print; #else -#define ahd_brkaddr0_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "BRKADDR0", 0xe6, regvalue, cur_col, wrap) +#define ahd_brkaddr1_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "BRKADDR1", 0xe6, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1888,13 +1888,6 @@ ahd_reg_print_t ahd_stack_print; ahd_print_register(NULL, 0, "STACK", 0xf2, regvalue, cur_col, wrap) #endif -#if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_curaddr_print; -#else -#define ahd_curaddr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CURADDR", 0xf4, regvalue, cur_col, wrap) -#endif - #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_intvec1_addr_print; #else @@ -1903,10 +1896,10 @@ ahd_reg_print_t ahd_intvec1_addr_print; #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_intvec2_addr_print; +ahd_reg_print_t ahd_curaddr_print; #else -#define ahd_intvec2_addr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INTVEC2_ADDR", 0xf6, regvalue, cur_col, wrap) +#define ahd_curaddr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "CURADDR", 0xf4, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -1916,6 +1909,13 @@ ahd_reg_print_t ahd_lastaddr_print; ahd_print_register(NULL, 0, "LASTADDR", 0xf6, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_intvec2_addr_print; +#else +#define ahd_intvec2_addr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "INTVEC2_ADDR", 0xf6, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_longjmp_addr_print; #else @@ -1993,193 +1993,214 @@ ahd_reg_print_t ahd_complete_dma_scb_head_print; ahd_print_register(NULL, 0, "COMPLETE_DMA_SCB_HEAD", 0x12c, regvalue, cur_col, wrap) #endif +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_complete_dma_scb_tail_print; +#else +#define ahd_complete_dma_scb_tail_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "COMPLETE_DMA_SCB_TAIL", 0x12e, regvalue, cur_col, wrap) +#endif + +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_complete_on_qfreeze_head_print; +#else +#define ahd_complete_on_qfreeze_head_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "COMPLETE_ON_QFREEZE_HEAD", 0x130, regvalue, cur_col, wrap) +#endif + #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_qfreeze_count_print; #else #define ahd_qfreeze_count_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "QFREEZE_COUNT", 0x12e, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "QFREEZE_COUNT", 0x132, regvalue, cur_col, wrap) +#endif + +#if AIC_DEBUG_REGISTERS +ahd_reg_print_t ahd_kernel_qfreeze_count_print; +#else +#define ahd_kernel_qfreeze_count_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "KERNEL_QFREEZE_COUNT", 0x134, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_saved_mode_print; #else #define ahd_saved_mode_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SAVED_MODE", 0x130, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SAVED_MODE", 0x136, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_msg_out_print; #else #define ahd_msg_out_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "MSG_OUT", 0x131, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "MSG_OUT", 0x137, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_dmaparams_print; #else #define ahd_dmaparams_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "DMAPARAMS", 0x132, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "DMAPARAMS", 0x138, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_seq_flags_print; #else #define ahd_seq_flags_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SEQ_FLAGS", 0x133, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SEQ_FLAGS", 0x139, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_saved_scsiid_print; #else #define ahd_saved_scsiid_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SAVED_SCSIID", 0x134, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SAVED_SCSIID", 0x13a, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_saved_lun_print; #else #define ahd_saved_lun_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SAVED_LUN", 0x135, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SAVED_LUN", 0x13b, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_lastphase_print; #else #define ahd_lastphase_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LASTPHASE", 0x136, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "LASTPHASE", 0x13c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_qoutfifo_entry_valid_tag_print; #else #define ahd_qoutfifo_entry_valid_tag_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "QOUTFIFO_ENTRY_VALID_TAG", 0x137, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "QOUTFIFO_ENTRY_VALID_TAG", 0x13d, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_shared_data_addr_print; +ahd_reg_print_t ahd_kernel_tqinpos_print; #else -#define ahd_shared_data_addr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SHARED_DATA_ADDR", 0x138, regvalue, cur_col, wrap) +#define ahd_kernel_tqinpos_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "KERNEL_TQINPOS", 0x13e, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_qoutfifo_next_addr_print; +ahd_reg_print_t ahd_tqinpos_print; #else -#define ahd_qoutfifo_next_addr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "QOUTFIFO_NEXT_ADDR", 0x13c, regvalue, cur_col, wrap) +#define ahd_tqinpos_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "TQINPOS", 0x13f, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_kernel_tqinpos_print; +ahd_reg_print_t ahd_shared_data_addr_print; #else -#define ahd_kernel_tqinpos_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "KERNEL_TQINPOS", 0x140, regvalue, cur_col, wrap) +#define ahd_shared_data_addr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "SHARED_DATA_ADDR", 0x140, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS -ahd_reg_print_t ahd_tqinpos_print; +ahd_reg_print_t ahd_qoutfifo_next_addr_print; #else -#define ahd_tqinpos_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "TQINPOS", 0x141, regvalue, cur_col, wrap) +#define ahd_qoutfifo_next_addr_print(regvalue, cur_col, wrap) \ + ahd_print_register(NULL, 0, "QOUTFIFO_NEXT_ADDR", 0x144, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_arg_1_print; #else #define ahd_arg_1_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "ARG_1", 0x142, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "ARG_1", 0x148, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_arg_2_print; #else #define ahd_arg_2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "ARG_2", 0x143, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "ARG_2", 0x149, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_last_msg_print; #else #define ahd_last_msg_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LAST_MSG", 0x144, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "LAST_MSG", 0x14a, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_scsiseq_template_print; #else #define ahd_scsiseq_template_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SCSISEQ_TEMPLATE", 0x145, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SCSISEQ_TEMPLATE", 0x14b, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_initiator_tag_print; #else #define ahd_initiator_tag_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INITIATOR_TAG", 0x146, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "INITIATOR_TAG", 0x14c, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_seq_flags2_print; #else #define ahd_seq_flags2_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "SEQ_FLAGS2", 0x147, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "SEQ_FLAGS2", 0x14d, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_allocfifo_scbptr_print; #else #define ahd_allocfifo_scbptr_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", 0x148, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", 0x14e, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_int_coalescing_timer_print; #else #define ahd_int_coalescing_timer_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INT_COALESCING_TIMER", 0x14a, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "INT_COALESCING_TIMER", 0x150, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_int_coalescing_maxcmds_print; #else #define ahd_int_coalescing_maxcmds_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INT_COALESCING_MAXCMDS", 0x14c, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "INT_COALESCING_MAXCMDS", 0x152, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_int_coalescing_mincmds_print; #else #define ahd_int_coalescing_mincmds_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INT_COALESCING_MINCMDS", 0x14d, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "INT_COALESCING_MINCMDS", 0x153, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_cmds_pending_print; #else #define ahd_cmds_pending_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CMDS_PENDING", 0x14e, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "CMDS_PENDING", 0x154, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_int_coalescing_cmdcount_print; #else #define ahd_int_coalescing_cmdcount_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "INT_COALESCING_CMDCOUNT", 0x150, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "INT_COALESCING_CMDCOUNT", 0x156, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_local_hs_mailbox_print; #else #define ahd_local_hs_mailbox_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "LOCAL_HS_MAILBOX", 0x151, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "LOCAL_HS_MAILBOX", 0x157, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS ahd_reg_print_t ahd_cmdsize_table_print; #else #define ahd_cmdsize_table_print(regvalue, cur_col, wrap) \ - ahd_print_register(NULL, 0, "CMDSIZE_TABLE", 0x152, regvalue, cur_col, wrap) + ahd_print_register(NULL, 0, "CMDSIZE_TABLE", 0x158, regvalue, cur_col, wrap) #endif #if AIC_DEBUG_REGISTERS @@ -2434,13 +2455,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define HOST_TQINPOS 0x80 #define ENINT_COALESCE 0x40 -#define CLRSEQINTSTAT 0x0c -#define CLRSEQ_SWTMRTO 0x10 -#define CLRSEQ_SEQINT 0x08 -#define CLRSEQ_SCSIINT 0x04 -#define CLRSEQ_PCIINT 0x02 -#define CLRSEQ_SPLTINT 0x01 - #define SEQINTSTAT 0x0c #define SEQ_SWTMRTO 0x10 #define SEQ_SEQINT 0x08 @@ -2448,6 +2462,13 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SEQ_PCIINT 0x02 #define SEQ_SPLTINT 0x01 +#define CLRSEQINTSTAT 0x0c +#define CLRSEQ_SWTMRTO 0x10 +#define CLRSEQ_SEQINT 0x08 +#define CLRSEQ_SCSIINT 0x04 +#define CLRSEQ_PCIINT 0x02 +#define CLRSEQ_SPLTINT 0x01 + #define SWTIMER 0x0e #define SNSCB_QOFF 0x10 @@ -2623,10 +2644,10 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define BIOSCANCELEN 0x10 #define SPIOEN 0x08 -#define BUSINITID 0x3c - #define DLCOUNT 0x3c +#define BUSINITID 0x3c + #define SXFRCTL1 0x3d #define BITBUCKET 0x80 #define ENSACHK 0x40 @@ -2693,13 +2714,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SELID_MASK 0xf0 #define ONEBIT 0x08 -#define SBLKCTL 0x4a -#define DIAGLEDEN 0x80 -#define DIAGLEDON 0x40 -#define ENAB40 0x08 -#define ENAB20 0x04 -#define SELWIDE 0x02 - #define OPTIONMODE 0x4a #define OPTIONMODE_DEFAULTS 0x02 #define BIOSCANCTL 0x80 @@ -2709,15 +2723,12 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define ENDGFORMCHK 0x04 #define AUTO_MSGOUT_DE 0x02 -#define SSTAT0 0x4b -#define TARGET 0x80 -#define SELDO 0x40 -#define SELDI 0x20 -#define SELINGO 0x10 -#define IOERR 0x08 -#define OVERRUN 0x04 -#define SPIORDY 0x02 -#define ARBDO 0x01 +#define SBLKCTL 0x4a +#define DIAGLEDEN 0x80 +#define DIAGLEDON 0x40 +#define ENAB40 0x08 +#define ENAB20 0x04 +#define SELWIDE 0x02 #define CLRSINT0 0x4b #define CLRSELDO 0x40 @@ -2728,6 +2739,16 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CLRSPIORDY 0x02 #define CLRARBDO 0x01 +#define SSTAT0 0x4b +#define TARGET 0x80 +#define SELDO 0x40 +#define SELDI 0x20 +#define SELINGO 0x10 +#define IOERR 0x08 +#define OVERRUN 0x04 +#define SPIORDY 0x02 +#define ARBDO 0x01 + #define SIMODE0 0x4b #define ENSELDO 0x40 #define ENSELDI 0x20 @@ -2768,17 +2789,17 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define BUSFREE_DFF0 0x80 #define BUSFREE_LQO 0x40 +#define SIMODE2 0x4d +#define ENWIDE_RES 0x04 +#define ENSDONE 0x02 +#define ENDMADONE 0x01 + #define CLRSINT2 0x4d #define CLRNONPACKREQ 0x20 #define CLRWIDE_RES 0x04 #define CLRSDONE 0x02 #define CLRDMADONE 0x01 -#define SIMODE2 0x4d -#define ENWIDE_RES 0x04 -#define ENSDONE 0x02 -#define ENDMADONE 0x01 - #define PERRDIAG 0x4e #define HIZERO 0x80 #define HIPERR 0x40 @@ -2871,13 +2892,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CLRNTRAMPERR 0x02 #define CLROSRAMPERR 0x01 -#define LQOMODE0 0x54 -#define ENLQOTARGSCBPERR 0x10 -#define ENLQOSTOPT2 0x08 -#define ENLQOATNLQ 0x04 -#define ENLQOATNPKT 0x02 -#define ENLQOTCRC 0x01 - #define LQOSTAT0 0x54 #define LQOTARGSCBPERR 0x10 #define LQOSTOPT2 0x08 @@ -2892,6 +2906,20 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CLRLQOATNPKT 0x02 #define CLRLQOTCRC 0x01 +#define LQOMODE0 0x54 +#define ENLQOTARGSCBPERR 0x10 +#define ENLQOSTOPT2 0x08 +#define ENLQOATNLQ 0x04 +#define ENLQOATNPKT 0x02 +#define ENLQOTCRC 0x01 + +#define LQOMODE1 0x55 +#define ENLQOINITSCBPERR 0x10 +#define ENLQOSTOPI2 0x08 +#define ENLQOBADQAS 0x04 +#define ENLQOBUSFREE 0x02 +#define ENLQOPHACHGINPKT 0x01 + #define LQOSTAT1 0x55 #define LQOINITSCBPERR 0x10 #define LQOSTOPI2 0x08 @@ -2906,13 +2934,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CLRLQOBUSFREE 0x02 #define CLRLQOPHACHGINPKT 0x01 -#define LQOMODE1 0x55 -#define ENLQOINITSCBPERR 0x10 -#define ENLQOSTOPI2 0x08 -#define ENLQOBADQAS 0x04 -#define ENLQOBUSFREE 0x02 -#define ENLQOPHACHGINPKT 0x01 - #define LQOSTAT2 0x56 #define LQOPKT 0xe0 #define LQOWAITFIFO 0x10 @@ -3028,6 +3049,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define ANNEXCOL 0x65 +#define ANNEXDAT 0x66 + #define SCSCHKN 0x66 #define STSELSKIDDIS 0x40 #define CURRFIFODEF 0x20 @@ -3037,8 +3060,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SHVALIDSTDIS 0x02 #define LSTSGCLRDIS 0x01 -#define ANNEXDAT 0x66 - #define IOWNID 0x67 #define PLL960CTL0 0x68 @@ -3071,10 +3092,10 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define PLL_CNTCLR 0x40 #define PLL_RST 0x01 -#define PLL400CNT0 0x6e - #define UNFAIRNESS 0x6e +#define PLL400CNT0 0x6e + #define HADDR 0x70 #define PLLDELAY 0x70 @@ -3088,14 +3109,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define HODMAEN 0x7a -#define SGHADDR 0x7c - #define SCBHADDR 0x7c -#define SGHCNT 0x84 +#define SGHADDR 0x7c #define SCBHCNT 0x84 +#define SGHCNT 0x84 + #define DFF_THRSH 0x88 #define WR_DFTHRSH 0x70 #define RD_DFTHRSH 0x07 @@ -3113,8 +3134,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define RD_DFTHRSH_63 0x03 #define RD_DFTHRSH_50 0x02 #define RD_DFTHRSH_25 0x01 -#define WR_DFTHRSH_MIN 0x00 #define RD_DFTHRSH_MIN 0x00 +#define WR_DFTHRSH_MIN 0x00 #define ROMADDR 0x8a @@ -3150,20 +3171,22 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define DCH1NSEN 0x02 #define DCH0NSEN 0x01 -#define DCHRXMSG1 0x91 - #define CMCRXMSG1 0x91 -#define DCHRXMSG2 0x92 +#define DCHRXMSG1 0x91 -#define OVLYRXMSG2 0x92 +#define DCHRXMSG2 0x92 #define CMCRXMSG2 0x92 #define OST 0x92 +#define OVLYRXMSG2 0x92 + #define DCHRXMSG3 0x93 +#define OVLYRXMSG3 0x93 + #define CMCRXMSG3 0x93 #define PCIXCTL 0x93 @@ -3175,26 +3198,24 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define TSCSERREN 0x02 #define CMPABCDIS 0x01 -#define OVLYRXMSG3 0x93 - #define OVLYSEQBCNT 0x94 -#define CMCSEQBCNT 0x94 - #define DCHSEQBCNT 0x94 -#define CMCSPLTSTAT0 0x96 +#define CMCSEQBCNT 0x94 -#define OVLYSPLTSTAT0 0x96 +#define CMCSPLTSTAT0 0x96 #define DCHSPLTSTAT0 0x96 -#define DCHSPLTSTAT1 0x97 +#define OVLYSPLTSTAT0 0x96 #define CMCSPLTSTAT1 0x97 #define OVLYSPLTSTAT1 0x97 +#define DCHSPLTSTAT1 0x97 + #define SGRXMSG0 0x98 #define CDNUM 0xf8 #define CFNUM 0x07 @@ -3244,13 +3265,13 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define RXSCEMSG 0x02 #define RXSPLTRSP 0x01 +#define SGSPLTSTAT1 0x9f +#define RXDATABUCKET 0x01 + #define SFUNCT 0x9f #define TEST_GROUP 0xf0 #define TEST_NUM 0x0f -#define SGSPLTSTAT1 0x9f -#define RXDATABUCKET 0x01 - #define DF0PCISTAT 0xa0 #define REG0 0xa0 @@ -3299,10 +3320,10 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CCSGADDR 0xac -#define CCSCBADDR 0xac - #define CCSCBADR_BK 0xac +#define CCSCBADDR 0xac + #define CMC_RAMBIST 0xad #define SG_ELEMENT_SIZE 0x80 #define SCBRAMBIST_FAIL 0x40 @@ -3311,14 +3332,6 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CMC_BUFFER_BIST_FAIL 0x02 #define CMC_BUFFER_BIST_EN 0x01 -#define CCSGCTL 0xad -#define CCSGEN 0x0c -#define CCSGDONE 0x80 -#define SG_CACHE_AVAIL 0x10 -#define CCSGENACK 0x08 -#define SG_FETCH_REQ 0x02 -#define CCSGRESET 0x01 - #define CCSCBCTL 0xad #define CCSCBDONE 0x80 #define ARRDONE 0x40 @@ -3327,6 +3340,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CCSCBDIR 0x04 #define CCSCBRESET 0x01 +#define CCSGCTL 0xad +#define CCSGEN 0x0c +#define CCSGDONE 0x80 +#define SG_CACHE_AVAIL 0x10 +#define CCSGENACK 0x08 +#define SG_FETCH_REQ 0x02 +#define CCSGRESET 0x01 + #define CCSGRAM 0xb0 #define FLEXADR 0xb0 @@ -3356,8 +3377,8 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SEEDAT 0xbc #define SEECTL 0xbe -#define SEEOP_EWEN 0x40 #define SEEOP_WALL 0x40 +#define SEEOP_EWEN 0x40 #define SEEOP_EWDS 0x40 #define SEEOPCODE 0x70 #define SEERST 0x02 @@ -3414,14 +3435,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define WRTBIASCALC 0xc7 -#define DFPTRS 0xc8 - #define RCVRBIASCALC 0xc8 -#define DFBKPTR 0xc9 +#define DFPTRS 0xc8 #define SKEWCALC 0xc9 +#define DFBKPTR 0xc9 + #define DFDBCTL 0xcb #define DFF_CIO_WR_RDY 0x20 #define DFF_CIO_RD_RDY 0x10 @@ -3475,11 +3496,11 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define DINDEX 0xe4 +#define BRKADDR0 0xe6 + #define BRKADDR1 0xe6 #define BRKDIS 0x80 -#define BRKADDR0 0xe6 - #define ALLONES 0xe8 #define ALLZEROS 0xea @@ -3494,14 +3515,14 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define STACK 0xf2 -#define CURADDR 0xf4 - #define INTVEC1_ADDR 0xf4 -#define INTVEC2_ADDR 0xf6 +#define CURADDR 0xf4 #define LASTADDR 0xf6 +#define INTVEC2_ADDR 0xf6 + #define LONGJMP_ADDR 0xf8 #define ACCUM_SAVE 0xfa @@ -3524,25 +3545,31 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define COMPLETE_DMA_SCB_HEAD 0x12c -#define QFREEZE_COUNT 0x12e +#define COMPLETE_DMA_SCB_TAIL 0x12e + +#define COMPLETE_ON_QFREEZE_HEAD 0x130 + +#define QFREEZE_COUNT 0x132 -#define SAVED_MODE 0x130 +#define KERNEL_QFREEZE_COUNT 0x134 -#define MSG_OUT 0x131 +#define SAVED_MODE 0x136 -#define DMAPARAMS 0x132 +#define MSG_OUT 0x137 + +#define DMAPARAMS 0x138 #define PRELOADEN 0x80 #define WIDEODD 0x40 #define SCSIEN 0x20 #define SDMAEN 0x10 #define SDMAENACK 0x10 -#define HDMAENACK 0x08 #define HDMAEN 0x08 +#define HDMAENACK 0x08 #define DIRECTION 0x04 #define FIFOFLUSH 0x02 #define FIFORESET 0x01 -#define SEQ_FLAGS 0x133 +#define SEQ_FLAGS 0x139 #define NOT_IDENTIFIED 0x80 #define NO_CDB_SENT 0x40 #define TARGET_CMD_IS_TAGGED 0x40 @@ -3553,11 +3580,11 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SPHASE_PENDING 0x02 #define NO_DISCONNECT 0x01 -#define SAVED_SCSIID 0x134 +#define SAVED_SCSIID 0x13a -#define SAVED_LUN 0x135 +#define SAVED_LUN 0x13b -#define LASTPHASE 0x136 +#define LASTPHASE 0x13c #define PHASE_MASK 0xe0 #define CDI 0x80 #define IOI 0x40 @@ -3572,18 +3599,18 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define P_DATAOUT_DT 0x20 #define P_DATAOUT 0x00 -#define QOUTFIFO_ENTRY_VALID_TAG 0x137 +#define QOUTFIFO_ENTRY_VALID_TAG 0x13d -#define SHARED_DATA_ADDR 0x138 +#define KERNEL_TQINPOS 0x13e -#define QOUTFIFO_NEXT_ADDR 0x13c +#define TQINPOS 0x13f -#define KERNEL_TQINPOS 0x140 +#define SHARED_DATA_ADDR 0x140 -#define TQINPOS 0x141 +#define QOUTFIFO_NEXT_ADDR 0x144 -#define ARG_1 0x142 -#define RETURN_1 0x142 +#define ARG_1 0x148 +#define RETURN_1 0x148 #define SEND_MSG 0x80 #define SEND_SENSE 0x40 #define SEND_REJ 0x20 @@ -3593,12 +3620,12 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define CONT_MSG_LOOP_READ 0x03 #define CONT_MSG_LOOP_TARG 0x02 -#define ARG_2 0x143 -#define RETURN_2 0x143 +#define ARG_2 0x149 +#define RETURN_2 0x149 -#define LAST_MSG 0x144 +#define LAST_MSG 0x14a -#define SCSISEQ_TEMPLATE 0x145 +#define SCSISEQ_TEMPLATE 0x14b #define MANUALCTL 0x40 #define ENSELI 0x20 #define ENRSELI 0x10 @@ -3606,27 +3633,27 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define ENAUTOATNP 0x02 #define ALTSTIM 0x01 -#define INITIATOR_TAG 0x146 +#define INITIATOR_TAG 0x14c -#define SEQ_FLAGS2 0x147 +#define SEQ_FLAGS2 0x14d #define SELECTOUT_QFROZEN 0x04 #define TARGET_MSG_PENDING 0x02 -#define ALLOCFIFO_SCBPTR 0x148 +#define ALLOCFIFO_SCBPTR 0x14e -#define INT_COALESCING_TIMER 0x14a +#define INT_COALESCING_TIMER 0x150 -#define INT_COALESCING_MAXCMDS 0x14c +#define INT_COALESCING_MAXCMDS 0x152 -#define INT_COALESCING_MINCMDS 0x14d +#define INT_COALESCING_MINCMDS 0x153 -#define CMDS_PENDING 0x14e +#define CMDS_PENDING 0x154 -#define INT_COALESCING_CMDCOUNT 0x150 +#define INT_COALESCING_CMDCOUNT 0x156 -#define LOCAL_HS_MAILBOX 0x151 +#define LOCAL_HS_MAILBOX 0x157 -#define CMDSIZE_TABLE 0x152 +#define CMDSIZE_TABLE 0x158 #define SCB_BASE 0x180 @@ -3701,6 +3728,16 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SCB_DISCONNECTED_LISTS 0x1b8 +#define AHD_TIMER_MAX_US 0x18ffe7 +#define AHD_TIMER_MAX_TICKS 0xffff +#define AHD_SENSE_BUFSIZE 0x100 +#define BUS_8_BIT 0x00 +#define TARGET_CMD_CMPLT 0xfe +#define SEEOP_WRAL_ADDR 0x40 +#define AHD_AMPLITUDE_DEF 0x07 +#define AHD_PRECOMP_CUTBACK_37 0x07 +#define AHD_PRECOMP_SHIFT 0x00 +#define AHD_ANNEXCOL_PRECOMP_SLEW 0x04 #define AHD_TIMER_US_PER_TICK 0x19 #define SCB_TRANSFER_SIZE_FULL_LUN 0x38 #define STATUS_QUEUE_FULL 0x28 @@ -3724,28 +3761,18 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define B_CURRFIFO_0 0x02 #define LUNLEN_SINGLE_LEVEL_LUN 0x0f #define NVRAM_SCB_OFFSET 0x2c -#define AHD_TIMER_MAX_US 0x18ffe7 -#define AHD_TIMER_MAX_TICKS 0xffff #define STATUS_PKT_SENSE 0xff #define CMD_GROUP_CODE_SHIFT 0x05 -#define AHD_SENSE_BUFSIZE 0x100 #define MAX_OFFSET_PACED_BUG 0x7f -#define BUS_8_BIT 0x00 #define STIMESEL_BUG_ADJ 0x08 #define STIMESEL_MIN 0x18 #define STIMESEL_SHIFT 0x03 #define CCSGRAM_MAXSEGS 0x10 #define INVALID_ADDR 0x80 -#define TARGET_CMD_CMPLT 0xfe -#define SEEOP_WRAL_ADDR 0x40 #define SEEOP_ERAL_ADDR 0x80 -#define AHD_AMPLITUDE_DEF 0x07 #define AHD_SLEWRATE_DEF_REVB 0x08 -#define AHD_PRECOMP_CUTBACK_37 0x07 #define AHD_PRECOMP_CUTBACK_17 0x04 -#define AHD_PRECOMP_SHIFT 0x00 #define AHD_PRECOMP_MASK 0x07 -#define AHD_ANNEXCOL_PRECOMP_SLEW 0x04 #define SRC_MODE_SHIFT 0x00 #define PKT_OVERRUN_BUFSIZE 0x200 #define SCB_TRANSFER_SIZE_1BYTE_LUN 0x30 @@ -3761,6 +3788,7 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; /* Downloaded Constant Definitions */ +#define CACHELINE_MASK 0x07 #define SCB_TRANSFER_SIZE 0x06 #define PKT_OVERRUN_BUFOFFSET 0x05 #define SG_SIZEOF 0x04 @@ -3768,9 +3796,9 @@ ahd_reg_print_t ahd_scb_disconnected_lists_print; #define SG_PREFETCH_ALIGN_MASK 0x02 #define SG_PREFETCH_CNT_LIMIT 0x01 #define SG_PREFETCH_CNT 0x00 -#define DOWNLOAD_CONST_COUNT 0x07 +#define DOWNLOAD_CONST_COUNT 0x08 /* Exported Labels */ -#define LABEL_seq_isr 0x269 -#define LABEL_timer_isr 0x265 +#define LABEL_seq_isr 0x285 +#define LABEL_timer_isr 0x281 diff --git a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped index 3098a757e3d..a4137c98537 100644 --- a/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped +++ b/drivers/scsi/aic7xxx/aic79xx_reg_print.c_shipped @@ -2,8 +2,8 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $ - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#118 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#75 $ */ #include "aic79xx_osm.h" @@ -172,21 +172,6 @@ ahd_hs_mailbox_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x0b, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t CLRSEQINTSTAT_parse_table[] = { - { "CLRSEQ_SPLTINT", 0x01, 0x01 }, - { "CLRSEQ_PCIINT", 0x02, 0x02 }, - { "CLRSEQ_SCSIINT", 0x04, 0x04 }, - { "CLRSEQ_SEQINT", 0x08, 0x08 }, - { "CLRSEQ_SWTMRTO", 0x10, 0x10 } -}; - -int -ahd_clrseqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(CLRSEQINTSTAT_parse_table, 5, "CLRSEQINTSTAT", - 0x0c, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t SEQINTSTAT_parse_table[] = { { "SEQ_SPLTINT", 0x01, 0x01 }, { "SEQ_PCIINT", 0x02, 0x02 }, @@ -202,6 +187,21 @@ ahd_seqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x0c, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t CLRSEQINTSTAT_parse_table[] = { + { "CLRSEQ_SPLTINT", 0x01, 0x01 }, + { "CLRSEQ_PCIINT", 0x02, 0x02 }, + { "CLRSEQ_SCSIINT", 0x04, 0x04 }, + { "CLRSEQ_SEQINT", 0x08, 0x08 }, + { "CLRSEQ_SWTMRTO", 0x10, 0x10 } +}; + +int +ahd_clrseqintstat_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(CLRSEQINTSTAT_parse_table, 5, "CLRSEQINTSTAT", + 0x0c, regvalue, cur_col, wrap)); +} + int ahd_swtimer_print(u_int regvalue, u_int *cur_col, u_int wrap) { @@ -670,16 +670,16 @@ ahd_sxfrctl0_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_businitid_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dlcount_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "BUSINITID", + return (ahd_print_register(NULL, 0, "DLCOUNT", 0x3c, regvalue, cur_col, wrap)); } int -ahd_dlcount_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_businitid_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "DLCOUNT", + return (ahd_print_register(NULL, 0, "BUSINITID", 0x3c, regvalue, cur_col, wrap)); } @@ -859,21 +859,6 @@ ahd_selid_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x49, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t SBLKCTL_parse_table[] = { - { "SELWIDE", 0x02, 0x02 }, - { "ENAB20", 0x04, 0x04 }, - { "ENAB40", 0x08, 0x08 }, - { "DIAGLEDON", 0x40, 0x40 }, - { "DIAGLEDEN", 0x80, 0x80 } -}; - -int -ahd_sblkctl_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(SBLKCTL_parse_table, 5, "SBLKCTL", - 0x4a, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t OPTIONMODE_parse_table[] = { { "AUTO_MSGOUT_DE", 0x02, 0x02 }, { "ENDGFORMCHK", 0x04, 0x04 }, @@ -891,22 +876,19 @@ ahd_optionmode_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x4a, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t SSTAT0_parse_table[] = { - { "ARBDO", 0x01, 0x01 }, - { "SPIORDY", 0x02, 0x02 }, - { "OVERRUN", 0x04, 0x04 }, - { "IOERR", 0x08, 0x08 }, - { "SELINGO", 0x10, 0x10 }, - { "SELDI", 0x20, 0x20 }, - { "SELDO", 0x40, 0x40 }, - { "TARGET", 0x80, 0x80 } +static ahd_reg_parse_entry_t SBLKCTL_parse_table[] = { + { "SELWIDE", 0x02, 0x02 }, + { "ENAB20", 0x04, 0x04 }, + { "ENAB40", 0x08, 0x08 }, + { "DIAGLEDON", 0x40, 0x40 }, + { "DIAGLEDEN", 0x80, 0x80 } }; int -ahd_sstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_sblkctl_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(SSTAT0_parse_table, 8, "SSTAT0", - 0x4b, regvalue, cur_col, wrap)); + return (ahd_print_register(SBLKCTL_parse_table, 5, "SBLKCTL", + 0x4a, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t CLRSINT0_parse_table[] = { @@ -926,6 +908,24 @@ ahd_clrsint0_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x4b, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t SSTAT0_parse_table[] = { + { "ARBDO", 0x01, 0x01 }, + { "SPIORDY", 0x02, 0x02 }, + { "OVERRUN", 0x04, 0x04 }, + { "IOERR", 0x08, 0x08 }, + { "SELINGO", 0x10, 0x10 }, + { "SELDI", 0x20, 0x20 }, + { "SELDO", 0x40, 0x40 }, + { "TARGET", 0x80, 0x80 } +}; + +int +ahd_sstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(SSTAT0_parse_table, 8, "SSTAT0", + 0x4b, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t SIMODE0_parse_table[] = { { "ENARBDO", 0x01, 0x01 }, { "ENSPIORDY", 0x02, 0x02 }, @@ -998,30 +998,30 @@ ahd_sstat2_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x4d, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t CLRSINT2_parse_table[] = { - { "CLRDMADONE", 0x01, 0x01 }, - { "CLRSDONE", 0x02, 0x02 }, - { "CLRWIDE_RES", 0x04, 0x04 }, - { "CLRNONPACKREQ", 0x20, 0x20 } +static ahd_reg_parse_entry_t SIMODE2_parse_table[] = { + { "ENDMADONE", 0x01, 0x01 }, + { "ENSDONE", 0x02, 0x02 }, + { "ENWIDE_RES", 0x04, 0x04 } }; int -ahd_clrsint2_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_simode2_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(CLRSINT2_parse_table, 4, "CLRSINT2", + return (ahd_print_register(SIMODE2_parse_table, 3, "SIMODE2", 0x4d, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t SIMODE2_parse_table[] = { - { "ENDMADONE", 0x01, 0x01 }, - { "ENSDONE", 0x02, 0x02 }, - { "ENWIDE_RES", 0x04, 0x04 } +static ahd_reg_parse_entry_t CLRSINT2_parse_table[] = { + { "CLRDMADONE", 0x01, 0x01 }, + { "CLRSDONE", 0x02, 0x02 }, + { "CLRWIDE_RES", 0x04, 0x04 }, + { "CLRNONPACKREQ", 0x20, 0x20 } }; int -ahd_simode2_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_clrsint2_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(SIMODE2_parse_table, 3, "SIMODE2", + return (ahd_print_register(CLRSINT2_parse_table, 4, "CLRSINT2", 0x4d, regvalue, cur_col, wrap)); } @@ -1220,21 +1220,6 @@ ahd_clrsint3_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x53, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t LQOMODE0_parse_table[] = { - { "ENLQOTCRC", 0x01, 0x01 }, - { "ENLQOATNPKT", 0x02, 0x02 }, - { "ENLQOATNLQ", 0x04, 0x04 }, - { "ENLQOSTOPT2", 0x08, 0x08 }, - { "ENLQOTARGSCBPERR", 0x10, 0x10 } -}; - -int -ahd_lqomode0_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(LQOMODE0_parse_table, 5, "LQOMODE0", - 0x54, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t LQOSTAT0_parse_table[] = { { "LQOTCRC", 0x01, 0x01 }, { "LQOATNPKT", 0x02, 0x02 }, @@ -1265,6 +1250,36 @@ ahd_clrlqoint0_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x54, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t LQOMODE0_parse_table[] = { + { "ENLQOTCRC", 0x01, 0x01 }, + { "ENLQOATNPKT", 0x02, 0x02 }, + { "ENLQOATNLQ", 0x04, 0x04 }, + { "ENLQOSTOPT2", 0x08, 0x08 }, + { "ENLQOTARGSCBPERR", 0x10, 0x10 } +}; + +int +ahd_lqomode0_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(LQOMODE0_parse_table, 5, "LQOMODE0", + 0x54, regvalue, cur_col, wrap)); +} + +static ahd_reg_parse_entry_t LQOMODE1_parse_table[] = { + { "ENLQOPHACHGINPKT", 0x01, 0x01 }, + { "ENLQOBUSFREE", 0x02, 0x02 }, + { "ENLQOBADQAS", 0x04, 0x04 }, + { "ENLQOSTOPI2", 0x08, 0x08 }, + { "ENLQOINITSCBPERR", 0x10, 0x10 } +}; + +int +ahd_lqomode1_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(LQOMODE1_parse_table, 5, "LQOMODE1", + 0x55, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t LQOSTAT1_parse_table[] = { { "LQOPHACHGINPKT", 0x01, 0x01 }, { "LQOBUSFREE", 0x02, 0x02 }, @@ -1295,21 +1310,6 @@ ahd_clrlqoint1_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x55, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t LQOMODE1_parse_table[] = { - { "ENLQOPHACHGINPKT", 0x01, 0x01 }, - { "ENLQOBUSFREE", 0x02, 0x02 }, - { "ENLQOBADQAS", 0x04, 0x04 }, - { "ENLQOSTOPI2", 0x08, 0x08 }, - { "ENLQOINITSCBPERR", 0x10, 0x10 } -}; - -int -ahd_lqomode1_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(LQOMODE1_parse_table, 5, "LQOMODE1", - 0x55, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t LQOSTAT2_parse_table[] = { { "LQOSTOP0", 0x01, 0x01 }, { "LQOPHACHGOUTPKT", 0x02, 0x02 }, @@ -1594,6 +1594,13 @@ ahd_annexcol_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x65, regvalue, cur_col, wrap)); } +int +ahd_annexdat_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(NULL, 0, "ANNEXDAT", + 0x66, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t SCSCHKN_parse_table[] = { { "LSTSGCLRDIS", 0x01, 0x01 }, { "SHVALIDSTDIS", 0x02, 0x02 }, @@ -1611,13 +1618,6 @@ ahd_scschkn_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x66, regvalue, cur_col, wrap)); } -int -ahd_annexdat_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(NULL, 0, "ANNEXDAT", - 0x66, regvalue, cur_col, wrap)); -} - int ahd_iownid_print(u_int regvalue, u_int *cur_col, u_int wrap) { @@ -1728,16 +1728,16 @@ ahd_pll400ctl1_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_pll400cnt0_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_unfairness_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "PLL400CNT0", + return (ahd_print_register(NULL, 0, "UNFAIRNESS", 0x6e, regvalue, cur_col, wrap)); } int -ahd_unfairness_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_pll400cnt0_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "UNFAIRNESS", + return (ahd_print_register(NULL, 0, "PLL400CNT0", 0x6e, regvalue, cur_col, wrap)); } @@ -1788,30 +1788,30 @@ ahd_hodmaen_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_sghaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_scbhaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SGHADDR", + return (ahd_print_register(NULL, 0, "SCBHADDR", 0x7c, regvalue, cur_col, wrap)); } int -ahd_scbhaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_sghaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SCBHADDR", + return (ahd_print_register(NULL, 0, "SGHADDR", 0x7c, regvalue, cur_col, wrap)); } int -ahd_sghcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_scbhcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SGHCNT", + return (ahd_print_register(NULL, 0, "SCBHCNT", 0x84, regvalue, cur_col, wrap)); } int -ahd_scbhcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_sghcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SCBHCNT", + return (ahd_print_register(NULL, 0, "SGHCNT", 0x84, regvalue, cur_col, wrap)); } @@ -1950,25 +1950,25 @@ ahd_nsenable_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x91, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t DCHRXMSG1_parse_table[] = { +static ahd_reg_parse_entry_t CMCRXMSG1_parse_table[] = { { "CBNUM", 0xff, 0xff } }; int -ahd_dchrxmsg1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_cmcrxmsg1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(DCHRXMSG1_parse_table, 1, "DCHRXMSG1", + return (ahd_print_register(CMCRXMSG1_parse_table, 1, "CMCRXMSG1", 0x91, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t CMCRXMSG1_parse_table[] = { +static ahd_reg_parse_entry_t DCHRXMSG1_parse_table[] = { { "CBNUM", 0xff, 0xff } }; int -ahd_cmcrxmsg1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dchrxmsg1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(CMCRXMSG1_parse_table, 1, "CMCRXMSG1", + return (ahd_print_register(DCHRXMSG1_parse_table, 1, "DCHRXMSG1", 0x91, regvalue, cur_col, wrap)); } @@ -1983,17 +1983,6 @@ ahd_dchrxmsg2_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x92, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t OVLYRXMSG2_parse_table[] = { - { "MINDEX", 0xff, 0xff } -}; - -int -ahd_ovlyrxmsg2_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(OVLYRXMSG2_parse_table, 1, "OVLYRXMSG2", - 0x92, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t CMCRXMSG2_parse_table[] = { { "MINDEX", 0xff, 0xff } }; @@ -2012,6 +2001,17 @@ ahd_ost_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x92, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t OVLYRXMSG2_parse_table[] = { + { "MINDEX", 0xff, 0xff } +}; + +int +ahd_ovlyrxmsg2_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(OVLYRXMSG2_parse_table, 1, "OVLYRXMSG2", + 0x92, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t DCHRXMSG3_parse_table[] = { { "MCLASS", 0x0f, 0x0f } }; @@ -2023,6 +2023,17 @@ ahd_dchrxmsg3_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x93, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t OVLYRXMSG3_parse_table[] = { + { "MCLASS", 0x0f, 0x0f } +}; + +int +ahd_ovlyrxmsg3_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(OVLYRXMSG3_parse_table, 1, "OVLYRXMSG3", + 0x93, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t CMCRXMSG3_parse_table[] = { { "MCLASS", 0x0f, 0x0f } }; @@ -2051,17 +2062,6 @@ ahd_pcixctl_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x93, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t OVLYRXMSG3_parse_table[] = { - { "MCLASS", 0x0f, 0x0f } -}; - -int -ahd_ovlyrxmsg3_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(OVLYRXMSG3_parse_table, 1, "OVLYRXMSG3", - 0x93, regvalue, cur_col, wrap)); -} - int ahd_ovlyseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) { @@ -2070,16 +2070,16 @@ ahd_ovlyseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_cmcseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dchseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "CMCSEQBCNT", + return (ahd_print_register(NULL, 0, "DCHSEQBCNT", 0x94, regvalue, cur_col, wrap)); } int -ahd_dchseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_cmcseqbcnt_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "DCHSEQBCNT", + return (ahd_print_register(NULL, 0, "CMCSEQBCNT", 0x94, regvalue, cur_col, wrap)); } @@ -2101,7 +2101,7 @@ ahd_cmcspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x96, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t OVLYSPLTSTAT0_parse_table[] = { +static ahd_reg_parse_entry_t DCHSPLTSTAT0_parse_table[] = { { "RXSPLTRSP", 0x01, 0x01 }, { "RXSCEMSG", 0x02, 0x02 }, { "RXOVRUN", 0x04, 0x04 }, @@ -2113,13 +2113,13 @@ static ahd_reg_parse_entry_t OVLYSPLTSTAT0_parse_table[] = { }; int -ahd_ovlyspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dchspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(OVLYSPLTSTAT0_parse_table, 8, "OVLYSPLTSTAT0", + return (ahd_print_register(DCHSPLTSTAT0_parse_table, 8, "DCHSPLTSTAT0", 0x96, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t DCHSPLTSTAT0_parse_table[] = { +static ahd_reg_parse_entry_t OVLYSPLTSTAT0_parse_table[] = { { "RXSPLTRSP", 0x01, 0x01 }, { "RXSCEMSG", 0x02, 0x02 }, { "RXOVRUN", 0x04, 0x04 }, @@ -2131,42 +2131,42 @@ static ahd_reg_parse_entry_t DCHSPLTSTAT0_parse_table[] = { }; int -ahd_dchspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_ovlyspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(DCHSPLTSTAT0_parse_table, 8, "DCHSPLTSTAT0", + return (ahd_print_register(OVLYSPLTSTAT0_parse_table, 8, "OVLYSPLTSTAT0", 0x96, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t DCHSPLTSTAT1_parse_table[] = { +static ahd_reg_parse_entry_t CMCSPLTSTAT1_parse_table[] = { { "RXDATABUCKET", 0x01, 0x01 } }; int -ahd_dchspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_cmcspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(DCHSPLTSTAT1_parse_table, 1, "DCHSPLTSTAT1", + return (ahd_print_register(CMCSPLTSTAT1_parse_table, 1, "CMCSPLTSTAT1", 0x97, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t CMCSPLTSTAT1_parse_table[] = { +static ahd_reg_parse_entry_t OVLYSPLTSTAT1_parse_table[] = { { "RXDATABUCKET", 0x01, 0x01 } }; int -ahd_cmcspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_ovlyspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(CMCSPLTSTAT1_parse_table, 1, "CMCSPLTSTAT1", + return (ahd_print_register(OVLYSPLTSTAT1_parse_table, 1, "OVLYSPLTSTAT1", 0x97, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t OVLYSPLTSTAT1_parse_table[] = { +static ahd_reg_parse_entry_t DCHSPLTSTAT1_parse_table[] = { { "RXDATABUCKET", 0x01, 0x01 } }; int -ahd_ovlyspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dchspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(OVLYSPLTSTAT1_parse_table, 1, "OVLYSPLTSTAT1", + return (ahd_print_register(DCHSPLTSTAT1_parse_table, 1, "DCHSPLTSTAT1", 0x97, regvalue, cur_col, wrap)); } @@ -2320,26 +2320,26 @@ ahd_sgspltstat0_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x9e, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t SFUNCT_parse_table[] = { - { "TEST_NUM", 0x0f, 0x0f }, - { "TEST_GROUP", 0xf0, 0xf0 } +static ahd_reg_parse_entry_t SGSPLTSTAT1_parse_table[] = { + { "RXDATABUCKET", 0x01, 0x01 } }; int -ahd_sfunct_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_sgspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(SFUNCT_parse_table, 2, "SFUNCT", + return (ahd_print_register(SGSPLTSTAT1_parse_table, 1, "SGSPLTSTAT1", 0x9f, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t SGSPLTSTAT1_parse_table[] = { - { "RXDATABUCKET", 0x01, 0x01 } +static ahd_reg_parse_entry_t SFUNCT_parse_table[] = { + { "TEST_NUM", 0x0f, 0x0f }, + { "TEST_GROUP", 0xf0, 0xf0 } }; int -ahd_sgspltstat1_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_sfunct_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(SGSPLTSTAT1_parse_table, 1, "SGSPLTSTAT1", + return (ahd_print_register(SFUNCT_parse_table, 2, "SFUNCT", 0x9f, regvalue, cur_col, wrap)); } @@ -2537,16 +2537,16 @@ ahd_ccsgaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_ccscbaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_ccscbadr_bk_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "CCSCBADDR", + return (ahd_print_register(NULL, 0, "CCSCBADR_BK", 0xac, regvalue, cur_col, wrap)); } int -ahd_ccscbadr_bk_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_ccscbaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "CCSCBADR_BK", + return (ahd_print_register(NULL, 0, "CCSCBADDR", 0xac, regvalue, cur_col, wrap)); } @@ -2566,22 +2566,6 @@ ahd_cmc_rambist_print(u_int regvalue, u_int *cur_col, u_int wrap) 0xad, regvalue, cur_col, wrap)); } -static ahd_reg_parse_entry_t CCSGCTL_parse_table[] = { - { "CCSGRESET", 0x01, 0x01 }, - { "SG_FETCH_REQ", 0x02, 0x02 }, - { "CCSGENACK", 0x08, 0x08 }, - { "SG_CACHE_AVAIL", 0x10, 0x10 }, - { "CCSGDONE", 0x80, 0x80 }, - { "CCSGEN", 0x0c, 0x0c } -}; - -int -ahd_ccsgctl_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(CCSGCTL_parse_table, 6, "CCSGCTL", - 0xad, regvalue, cur_col, wrap)); -} - static ahd_reg_parse_entry_t CCSCBCTL_parse_table[] = { { "CCSCBRESET", 0x01, 0x01 }, { "CCSCBDIR", 0x04, 0x04 }, @@ -2598,6 +2582,22 @@ ahd_ccscbctl_print(u_int regvalue, u_int *cur_col, u_int wrap) 0xad, regvalue, cur_col, wrap)); } +static ahd_reg_parse_entry_t CCSGCTL_parse_table[] = { + { "CCSGRESET", 0x01, 0x01 }, + { "SG_FETCH_REQ", 0x02, 0x02 }, + { "CCSGENACK", 0x08, 0x08 }, + { "SG_CACHE_AVAIL", 0x10, 0x10 }, + { "CCSGDONE", 0x80, 0x80 }, + { "CCSGEN", 0x0c, 0x0c } +}; + +int +ahd_ccsgctl_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(CCSGCTL_parse_table, 6, "CCSGCTL", + 0xad, regvalue, cur_col, wrap)); +} + int ahd_ccsgram_print(u_int regvalue, u_int *cur_col, u_int wrap) { @@ -2841,30 +2841,30 @@ ahd_wrtbiascalc_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_dfptrs_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_rcvrbiascalc_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "DFPTRS", + return (ahd_print_register(NULL, 0, "RCVRBIASCALC", 0xc8, regvalue, cur_col, wrap)); } int -ahd_rcvrbiascalc_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dfptrs_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "RCVRBIASCALC", + return (ahd_print_register(NULL, 0, "DFPTRS", 0xc8, regvalue, cur_col, wrap)); } int -ahd_dfbkptr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_skewcalc_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "DFBKPTR", + return (ahd_print_register(NULL, 0, "SKEWCALC", 0xc9, regvalue, cur_col, wrap)); } int -ahd_skewcalc_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_dfbkptr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SKEWCALC", + return (ahd_print_register(NULL, 0, "DFBKPTR", 0xc9, regvalue, cur_col, wrap)); } @@ -3001,6 +3001,13 @@ ahd_dindex_print(u_int regvalue, u_int *cur_col, u_int wrap) 0xe4, regvalue, cur_col, wrap)); } +int +ahd_brkaddr0_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(NULL, 0, "BRKADDR0", + 0xe6, regvalue, cur_col, wrap)); +} + static ahd_reg_parse_entry_t BRKADDR1_parse_table[] = { { "BRKDIS", 0x80, 0x80 } }; @@ -3012,13 +3019,6 @@ ahd_brkaddr1_print(u_int regvalue, u_int *cur_col, u_int wrap) 0xe6, regvalue, cur_col, wrap)); } -int -ahd_brkaddr0_print(u_int regvalue, u_int *cur_col, u_int wrap) -{ - return (ahd_print_register(NULL, 0, "BRKADDR0", - 0xe6, regvalue, cur_col, wrap)); -} - int ahd_allones_print(u_int regvalue, u_int *cur_col, u_int wrap) { @@ -3069,30 +3069,30 @@ ahd_stack_print(u_int regvalue, u_int *cur_col, u_int wrap) } int -ahd_curaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_intvec1_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "CURADDR", + return (ahd_print_register(NULL, 0, "INTVEC1_ADDR", 0xf4, regvalue, cur_col, wrap)); } int -ahd_intvec1_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_curaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "INTVEC1_ADDR", + return (ahd_print_register(NULL, 0, "CURADDR", 0xf4, regvalue, cur_col, wrap)); } int -ahd_intvec2_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_lastaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "INTVEC2_ADDR", + return (ahd_print_register(NULL, 0, "LASTADDR", 0xf6, regvalue, cur_col, wrap)); } int -ahd_lastaddr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_intvec2_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "LASTADDR", + return (ahd_print_register(NULL, 0, "INTVEC2_ADDR", 0xf6, regvalue, cur_col, wrap)); } @@ -3173,25 +3173,46 @@ ahd_complete_dma_scb_head_print(u_int regvalue, u_int *cur_col, u_int wrap) 0x12c, regvalue, cur_col, wrap)); } +int +ahd_complete_dma_scb_tail_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(NULL, 0, "COMPLETE_DMA_SCB_TAIL", + 0x12e, regvalue, cur_col, wrap)); +} + +int +ahd_complete_on_qfreeze_head_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(NULL, 0, "COMPLETE_ON_QFREEZE_HEAD", + 0x130, regvalue, cur_col, wrap)); +} + int ahd_qfreeze_count_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "QFREEZE_COUNT", - 0x12e, regvalue, cur_col, wrap)); + 0x132, regvalue, cur_col, wrap)); +} + +int +ahd_kernel_qfreeze_count_print(u_int regvalue, u_int *cur_col, u_int wrap) +{ + return (ahd_print_register(NULL, 0, "KERNEL_QFREEZE_COUNT", + 0x134, regvalue, cur_col, wrap)); } int ahd_saved_mode_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "SAVED_MODE", - 0x130, regvalue, cur_col, wrap)); + 0x136, regvalue, cur_col, wrap)); } int ahd_msg_out_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "MSG_OUT", - 0x131, regvalue, cur_col, wrap)); + 0x137, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t DMAPARAMS_parse_table[] = { @@ -3211,7 +3232,7 @@ int ahd_dmaparams_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(DMAPARAMS_parse_table, 10, "DMAPARAMS", - 0x132, regvalue, cur_col, wrap)); + 0x138, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t SEQ_FLAGS_parse_table[] = { @@ -3230,21 +3251,21 @@ int ahd_seq_flags_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(SEQ_FLAGS_parse_table, 9, "SEQ_FLAGS", - 0x133, regvalue, cur_col, wrap)); + 0x139, regvalue, cur_col, wrap)); } int ahd_saved_scsiid_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "SAVED_SCSIID", - 0x134, regvalue, cur_col, wrap)); + 0x13a, regvalue, cur_col, wrap)); } int ahd_saved_lun_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "SAVED_LUN", - 0x135, regvalue, cur_col, wrap)); + 0x13b, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t LASTPHASE_parse_table[] = { @@ -3267,42 +3288,42 @@ int ahd_lastphase_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(LASTPHASE_parse_table, 13, "LASTPHASE", - 0x136, regvalue, cur_col, wrap)); + 0x13c, regvalue, cur_col, wrap)); } int ahd_qoutfifo_entry_valid_tag_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "QOUTFIFO_ENTRY_VALID_TAG", - 0x137, regvalue, cur_col, wrap)); + 0x13d, regvalue, cur_col, wrap)); } int -ahd_shared_data_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_kernel_tqinpos_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "SHARED_DATA_ADDR", - 0x138, regvalue, cur_col, wrap)); + return (ahd_print_register(NULL, 0, "KERNEL_TQINPOS", + 0x13e, regvalue, cur_col, wrap)); } int -ahd_qoutfifo_next_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_tqinpos_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "QOUTFIFO_NEXT_ADDR", - 0x13c, regvalue, cur_col, wrap)); + return (ahd_print_register(NULL, 0, "TQINPOS", + 0x13f, regvalue, cur_col, wrap)); } int -ahd_kernel_tqinpos_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_shared_data_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "KERNEL_TQINPOS", + return (ahd_print_register(NULL, 0, "SHARED_DATA_ADDR", 0x140, regvalue, cur_col, wrap)); } int -ahd_tqinpos_print(u_int regvalue, u_int *cur_col, u_int wrap) +ahd_qoutfifo_next_addr_print(u_int regvalue, u_int *cur_col, u_int wrap) { - return (ahd_print_register(NULL, 0, "TQINPOS", - 0x141, regvalue, cur_col, wrap)); + return (ahd_print_register(NULL, 0, "QOUTFIFO_NEXT_ADDR", + 0x144, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t ARG_1_parse_table[] = { @@ -3320,21 +3341,21 @@ int ahd_arg_1_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(ARG_1_parse_table, 8, "ARG_1", - 0x142, regvalue, cur_col, wrap)); + 0x148, regvalue, cur_col, wrap)); } int ahd_arg_2_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "ARG_2", - 0x143, regvalue, cur_col, wrap)); + 0x149, regvalue, cur_col, wrap)); } int ahd_last_msg_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "LAST_MSG", - 0x144, regvalue, cur_col, wrap)); + 0x14a, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t SCSISEQ_TEMPLATE_parse_table[] = { @@ -3350,14 +3371,14 @@ int ahd_scsiseq_template_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(SCSISEQ_TEMPLATE_parse_table, 6, "SCSISEQ_TEMPLATE", - 0x145, regvalue, cur_col, wrap)); + 0x14b, regvalue, cur_col, wrap)); } int ahd_initiator_tag_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "INITIATOR_TAG", - 0x146, regvalue, cur_col, wrap)); + 0x14c, regvalue, cur_col, wrap)); } static ahd_reg_parse_entry_t SEQ_FLAGS2_parse_table[] = { @@ -3369,63 +3390,63 @@ int ahd_seq_flags2_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(SEQ_FLAGS2_parse_table, 2, "SEQ_FLAGS2", - 0x147, regvalue, cur_col, wrap)); + 0x14d, regvalue, cur_col, wrap)); } int ahd_allocfifo_scbptr_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "ALLOCFIFO_SCBPTR", - 0x148, regvalue, cur_col, wrap)); + 0x14e, regvalue, cur_col, wrap)); } int ahd_int_coalescing_timer_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "INT_COALESCING_TIMER", - 0x14a, regvalue, cur_col, wrap)); + 0x150, regvalue, cur_col, wrap)); } int ahd_int_coalescing_maxcmds_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "INT_COALESCING_MAXCMDS", - 0x14c, regvalue, cur_col, wrap)); + 0x152, regvalue, cur_col, wrap)); } int ahd_int_coalescing_mincmds_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "INT_COALESCING_MINCMDS", - 0x14d, regvalue, cur_col, wrap)); + 0x153, regvalue, cur_col, wrap)); } int ahd_cmds_pending_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "CMDS_PENDING", - 0x14e, regvalue, cur_col, wrap)); + 0x154, regvalue, cur_col, wrap)); } int ahd_int_coalescing_cmdcount_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "INT_COALESCING_CMDCOUNT", - 0x150, regvalue, cur_col, wrap)); + 0x156, regvalue, cur_col, wrap)); } int ahd_local_hs_mailbox_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "LOCAL_HS_MAILBOX", - 0x151, regvalue, cur_col, wrap)); + 0x157, regvalue, cur_col, wrap)); } int ahd_cmdsize_table_print(u_int regvalue, u_int *cur_col, u_int wrap) { return (ahd_print_register(NULL, 0, "CMDSIZE_TABLE", - 0x152, regvalue, cur_col, wrap)); + 0x158, regvalue, cur_col, wrap)); } int diff --git a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped index 77c471f934e..b1e5365be23 100644 --- a/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped +++ b/drivers/scsi/aic7xxx/aic79xx_seq.h_shipped @@ -2,215 +2,228 @@ * DO NOT EDIT - This file is automatically generated * from the following source files: * - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#94 $ - * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#70 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.seq#119 $ + * $Id: //depot/aic7xxx/aic7xxx/aic79xx.reg#76 $ */ static uint8_t seqprog[] = { 0xff, 0x02, 0x06, 0x78, - 0x00, 0xea, 0x50, 0x59, + 0x00, 0xea, 0x64, 0x59, 0x01, 0xea, 0x04, 0x30, 0xff, 0x04, 0x0c, 0x78, - 0x19, 0xea, 0x50, 0x59, + 0x19, 0xea, 0x64, 0x59, 0x19, 0xea, 0x04, 0x00, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x60, 0x3a, 0x1a, 0x68, - 0x04, 0x47, 0x1b, 0x68, - 0xff, 0x21, 0x1b, 0x70, - 0x40, 0x4b, 0x92, 0x69, - 0x00, 0xe2, 0x54, 0x59, - 0x40, 0x4b, 0x92, 0x69, - 0x20, 0x4b, 0x82, 0x69, - 0xfc, 0x42, 0x24, 0x78, - 0x10, 0x40, 0x24, 0x78, - 0x00, 0xe2, 0xc4, 0x5d, - 0x20, 0x4d, 0x28, 0x78, - 0x00, 0xe2, 0xc4, 0x5d, + 0x60, 0x3a, 0x3a, 0x68, + 0x04, 0x4d, 0x35, 0x78, + 0x01, 0x34, 0xc1, 0x31, + 0x00, 0x32, 0x21, 0x60, + 0x01, 0x35, 0xc1, 0x31, + 0x00, 0x33, 0x21, 0x60, + 0xfb, 0x4d, 0x9b, 0x0a, + 0x00, 0xe2, 0x34, 0x40, + 0x50, 0x4b, 0x3a, 0x68, + 0xff, 0x31, 0x3b, 0x70, + 0x02, 0x30, 0x51, 0x31, + 0xff, 0x8d, 0x2d, 0x70, + 0x02, 0x8c, 0x51, 0x31, + 0xff, 0x8d, 0x29, 0x60, + 0x02, 0x28, 0x19, 0x33, + 0x02, 0x30, 0x51, 0x32, + 0xff, 0xea, 0x62, 0x02, + 0x00, 0xe2, 0x3a, 0x40, + 0xff, 0x21, 0x3b, 0x70, + 0x40, 0x4b, 0xaa, 0x69, + 0x00, 0xe2, 0x68, 0x59, + 0x40, 0x4b, 0xaa, 0x69, + 0x20, 0x4b, 0x96, 0x69, + 0xfc, 0x42, 0x44, 0x78, + 0x10, 0x40, 0x44, 0x78, + 0x00, 0xe2, 0xfc, 0x5d, + 0x20, 0x4d, 0x48, 0x78, + 0x00, 0xe2, 0xfc, 0x5d, 0x30, 0x3f, 0xc0, 0x09, - 0x30, 0xe0, 0x30, 0x60, + 0x30, 0xe0, 0x50, 0x60, 0x7f, 0x4a, 0x94, 0x08, - 0x00, 0xe2, 0x32, 0x40, + 0x00, 0xe2, 0x52, 0x40, 0xc0, 0x4a, 0x94, 0x00, - 0x00, 0xe2, 0x3e, 0x58, - 0x00, 0xe2, 0x56, 0x58, - 0x00, 0xe2, 0x66, 0x58, + 0x00, 0xe2, 0x5e, 0x58, + 0x00, 0xe2, 0x76, 0x58, + 0x00, 0xe2, 0x86, 0x58, 0x00, 0xe2, 0x06, 0x40, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x01, 0x52, 0x64, 0x78, + 0x01, 0x52, 0x84, 0x78, 0x02, 0x58, 0x50, 0x31, 0xff, 0xea, 0x10, 0x0b, - 0xff, 0x97, 0x4f, 0x78, - 0x50, 0x4b, 0x4a, 0x68, + 0xff, 0x97, 0x6f, 0x78, + 0x50, 0x4b, 0x6a, 0x68, 0xbf, 0x3a, 0x74, 0x08, - 0x14, 0xea, 0x50, 0x59, + 0x14, 0xea, 0x64, 0x59, 0x14, 0xea, 0x04, 0x00, 0x08, 0x92, 0x25, 0x03, - 0xff, 0x90, 0x3f, 0x68, - 0x00, 0xe2, 0x56, 0x5b, - 0x00, 0xe2, 0x3e, 0x40, - 0x00, 0xea, 0x44, 0x59, + 0xff, 0x90, 0x5f, 0x68, + 0x00, 0xe2, 0x76, 0x5b, + 0x00, 0xe2, 0x5e, 0x40, + 0x00, 0xea, 0x5e, 0x59, 0x01, 0xea, 0x00, 0x30, - 0x80, 0xf9, 0x5e, 0x68, - 0x00, 0xe2, 0x42, 0x59, - 0x11, 0xea, 0x44, 0x59, + 0x80, 0xf9, 0x7e, 0x68, + 0x00, 0xe2, 0x5c, 0x59, + 0x11, 0xea, 0x5e, 0x59, 0x11, 0xea, 0x00, 0x00, - 0x80, 0xf9, 0x42, 0x79, + 0x80, 0xf9, 0x5c, 0x79, 0xff, 0xea, 0xd4, 0x0d, - 0x22, 0xea, 0x44, 0x59, + 0x22, 0xea, 0x5e, 0x59, 0x22, 0xea, 0x00, 0x00, - 0x10, 0x16, 0x70, 0x78, - 0x01, 0x0b, 0xa2, 0x32, + 0x10, 0x16, 0x90, 0x78, 0x10, 0x16, 0x2c, 0x00, - 0x18, 0xad, 0x00, 0x79, - 0x04, 0xad, 0xca, 0x68, - 0x80, 0xad, 0x64, 0x78, - 0x10, 0xad, 0x98, 0x78, - 0xff, 0x88, 0x83, 0x68, + 0x01, 0x0b, 0xae, 0x32, + 0x18, 0xad, 0x12, 0x79, + 0x04, 0xad, 0xdc, 0x68, + 0x80, 0xad, 0x84, 0x78, + 0x10, 0xad, 0xaa, 0x78, 0xe7, 0xad, 0x5a, 0x09, 0x02, 0x8c, 0x59, 0x32, + 0xff, 0x8d, 0xa1, 0x60, + 0xff, 0xea, 0x5e, 0x02, + 0xff, 0x88, 0xa7, 0x78, + 0x02, 0x30, 0x19, 0x33, + 0x02, 0xa8, 0x60, 0x36, 0x02, 0x28, 0x19, 0x33, 0x02, 0xa8, 0x50, 0x36, - 0x33, 0xea, 0x44, 0x59, - 0x33, 0xea, 0x00, 0x00, - 0x40, 0x3a, 0x64, 0x68, - 0x50, 0x4b, 0x64, 0x68, - 0x22, 0xea, 0x44, 0x59, - 0x22, 0xea, 0x00, 0x00, - 0xe7, 0xad, 0x5a, 0x09, - 0x02, 0x8c, 0x59, 0x32, - 0x1a, 0xea, 0x50, 0x59, - 0x1a, 0xea, 0x04, 0x00, - 0xff, 0xea, 0xd4, 0x0d, 0xe7, 0xad, 0x5a, 0x09, - 0x00, 0xe2, 0xa6, 0x58, + 0x00, 0xe2, 0xb8, 0x58, 0xff, 0xea, 0x56, 0x02, - 0x04, 0x7c, 0x78, 0x32, - 0x20, 0x16, 0x64, 0x78, - 0x04, 0x38, 0x79, 0x32, - 0x80, 0x37, 0x6f, 0x16, - 0xff, 0x2d, 0xb5, 0x60, - 0xff, 0x29, 0xb5, 0x60, - 0x40, 0x51, 0xc5, 0x78, - 0xff, 0x4f, 0xb5, 0x68, - 0xff, 0x4d, 0xc1, 0x19, - 0x00, 0x4e, 0xd5, 0x19, - 0x00, 0xe2, 0xc4, 0x50, - 0x01, 0x4c, 0xc1, 0x31, - 0x00, 0x50, 0xd5, 0x19, - 0x00, 0xe2, 0xc4, 0x48, - 0x80, 0x18, 0x64, 0x78, - 0x02, 0x4a, 0x1d, 0x30, + 0x04, 0x7c, 0x88, 0x32, + 0x20, 0x16, 0x84, 0x78, + 0x04, 0x40, 0x89, 0x32, + 0x80, 0x3d, 0x7b, 0x16, + 0xff, 0x2d, 0xc7, 0x60, + 0xff, 0x29, 0xc7, 0x60, + 0x40, 0x57, 0xd7, 0x78, + 0xff, 0x55, 0xc7, 0x68, + 0xff, 0x53, 0xc1, 0x19, + 0x00, 0x54, 0xd5, 0x19, + 0x00, 0xe2, 0xd6, 0x50, + 0x01, 0x52, 0xc1, 0x31, + 0x00, 0x56, 0xd5, 0x19, + 0x00, 0xe2, 0xd6, 0x48, + 0x80, 0x18, 0x84, 0x78, + 0x02, 0x50, 0x1d, 0x30, 0x10, 0xea, 0x18, 0x00, 0x60, 0x18, 0x30, 0x00, 0x7f, 0x18, 0x30, 0x0c, 0x02, 0xea, 0x02, 0x00, - 0xff, 0xea, 0xa0, 0x0a, + 0xff, 0xea, 0xac, 0x0a, 0x80, 0x18, 0x30, 0x04, - 0x40, 0xad, 0x64, 0x78, + 0x40, 0xad, 0x84, 0x78, 0xe7, 0xad, 0x5a, 0x09, 0x02, 0xa8, 0x40, 0x31, 0xff, 0xea, 0xc0, 0x09, - 0x01, 0x4e, 0x9d, 0x1a, - 0x00, 0x4f, 0x9f, 0x22, + 0x01, 0x54, 0xa9, 0x1a, + 0x00, 0x55, 0xab, 0x22, 0x01, 0x94, 0x6d, 0x33, - 0x01, 0xea, 0x20, 0x33, + 0xff, 0xea, 0x20, 0x0b, 0x04, 0xac, 0x49, 0x32, 0xff, 0xea, 0x5a, 0x03, 0xff, 0xea, 0x5e, 0x03, 0x01, 0x10, 0xd4, 0x31, - 0x10, 0x92, 0xf5, 0x68, + 0x10, 0x92, 0x07, 0x69, 0x3d, 0x93, 0xc5, 0x29, 0xfe, 0xe2, 0xc4, 0x09, 0x01, 0xea, 0xc6, 0x01, 0x02, 0xe2, 0xc8, 0x31, 0x02, 0xec, 0x50, 0x31, 0x02, 0xa0, 0xda, 0x31, - 0xff, 0xa9, 0xf4, 0x70, + 0xff, 0xa9, 0x06, 0x71, 0x02, 0xa0, 0x58, 0x37, - 0xff, 0x21, 0xfd, 0x70, + 0xff, 0x21, 0x0f, 0x71, 0x02, 0x22, 0x51, 0x31, 0x02, 0xa0, 0x5c, 0x33, 0x02, 0xa0, 0x44, 0x36, 0x02, 0xa0, 0x40, 0x32, 0x02, 0xa0, 0x44, 0x36, - 0x04, 0x47, 0x05, 0x69, - 0x40, 0x16, 0x30, 0x69, - 0xff, 0x2d, 0x35, 0x61, - 0xff, 0x29, 0x65, 0x70, - 0x01, 0x37, 0xc1, 0x31, + 0x04, 0x4d, 0x17, 0x69, + 0x40, 0x16, 0x48, 0x69, + 0xff, 0x2d, 0x4d, 0x61, + 0xff, 0x29, 0x85, 0x70, 0x02, 0x28, 0x55, 0x32, 0x01, 0xea, 0x5a, 0x01, - 0x04, 0x3c, 0xf9, 0x30, + 0x04, 0x44, 0xf9, 0x30, + 0x01, 0x44, 0xc1, 0x31, 0x02, 0x28, 0x51, 0x31, - 0x01, 0xa8, 0x60, 0x31, - 0x00, 0xa9, 0x60, 0x01, + 0x02, 0xa8, 0x60, 0x31, + 0x01, 0xa4, 0x61, 0x31, + 0x01, 0x3d, 0x61, 0x31, 0x01, 0x14, 0xd4, 0x31, - 0x01, 0x50, 0xa1, 0x1a, - 0xff, 0x4e, 0x9d, 0x1a, - 0xff, 0x4f, 0x9f, 0x22, - 0xff, 0x8d, 0x29, 0x71, - 0x80, 0xac, 0x28, 0x71, - 0x20, 0x16, 0x28, 0x69, + 0x01, 0x56, 0xad, 0x1a, + 0xff, 0x54, 0xa9, 0x1a, + 0xff, 0x55, 0xab, 0x22, + 0xff, 0x8d, 0x41, 0x71, + 0x80, 0xac, 0x40, 0x71, + 0x20, 0x16, 0x40, 0x69, + 0x00, 0xac, 0xc4, 0x19, + 0x07, 0xe2, 0x40, 0xf9, 0x02, 0x8c, 0x51, 0x31, - 0x00, 0xe2, 0x12, 0x41, + 0x00, 0xe2, 0x24, 0x41, 0x01, 0xac, 0x08, 0x31, 0x09, 0xea, 0x5a, 0x01, 0x02, 0x8c, 0x51, 0x32, 0xff, 0xea, 0x1a, 0x07, 0x04, 0x24, 0xf9, 0x30, - 0x1d, 0xea, 0x3a, 0x41, + 0x1d, 0xea, 0x52, 0x41, 0x02, 0x2c, 0x51, 0x31, 0x04, 0xa8, 0xf9, 0x30, - 0x19, 0xea, 0x3a, 0x41, + 0x19, 0xea, 0x52, 0x41, 0x06, 0xea, 0x08, 0x81, 0x01, 0xe2, 0x5a, 0x35, - 0x02, 0xf2, 0xf0, 0x35, + 0x02, 0xf2, 0xf0, 0x31, + 0xff, 0xea, 0xd4, 0x0d, 0x02, 0xf2, 0xf0, 0x31, 0x02, 0xf8, 0xe4, 0x35, 0x80, 0xea, 0xb2, 0x01, 0x01, 0xe2, 0x00, 0x30, 0xff, 0xea, 0xb2, 0x0d, - 0x80, 0xea, 0xb2, 0x01, - 0x11, 0x00, 0x00, 0x10, - 0xff, 0xea, 0xb2, 0x0d, 0x01, 0xe2, 0x04, 0x30, 0x01, 0xea, 0x04, 0x34, 0x02, 0x20, 0xbd, 0x30, 0x02, 0x20, 0xb9, 0x30, 0x02, 0x20, 0x51, 0x31, 0x4c, 0x93, 0xd7, 0x28, - 0x10, 0x92, 0x63, 0x79, + 0x10, 0x92, 0x77, 0x79, 0x01, 0x6b, 0xc0, 0x30, 0x02, 0x64, 0xc8, 0x00, 0x40, 0x3a, 0x74, 0x04, - 0x00, 0xe2, 0x56, 0x58, - 0x33, 0xea, 0x44, 0x59, + 0x00, 0xe2, 0x76, 0x58, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, 0x30, 0x3f, 0xc0, 0x09, - 0x30, 0xe0, 0x64, 0x61, - 0x20, 0x3f, 0x7a, 0x69, - 0x10, 0x3f, 0x64, 0x79, + 0x30, 0xe0, 0x78, 0x61, + 0x20, 0x3f, 0x8e, 0x69, + 0x10, 0x3f, 0x78, 0x79, 0x02, 0xea, 0x7e, 0x00, - 0x00, 0xea, 0x44, 0x59, + 0x00, 0xea, 0x5e, 0x59, 0x01, 0xea, 0x00, 0x30, - 0x02, 0x48, 0x51, 0x35, + 0x02, 0x4e, 0x51, 0x35, 0x01, 0xea, 0x7e, 0x00, - 0x11, 0xea, 0x44, 0x59, + 0x11, 0xea, 0x5e, 0x59, 0x11, 0xea, 0x00, 0x00, - 0x02, 0x48, 0x51, 0x35, + 0x02, 0x4e, 0x51, 0x35, + 0xc0, 0x4a, 0x94, 0x00, + 0x04, 0x41, 0x9c, 0x79, 0x08, 0xea, 0x98, 0x00, 0x08, 0x57, 0xae, 0x00, 0x08, 0x3c, 0x78, 0x00, - 0xf0, 0x49, 0x68, 0x0a, + 0xf0, 0x49, 0x74, 0x0a, 0x0f, 0x67, 0xc0, 0x09, - 0x00, 0x34, 0x69, 0x02, + 0x00, 0x3a, 0x75, 0x02, 0x20, 0xea, 0x96, 0x00, - 0x00, 0xe2, 0xf8, 0x41, - 0x40, 0x3a, 0xae, 0x69, + 0x00, 0xe2, 0x14, 0x42, + 0xc0, 0x4a, 0x94, 0x00, + 0x40, 0x3a, 0xc8, 0x69, 0x02, 0x55, 0x06, 0x68, - 0x02, 0x56, 0xae, 0x69, - 0xff, 0x5b, 0xae, 0x61, + 0x02, 0x56, 0xc8, 0x69, + 0xff, 0x5b, 0xc8, 0x61, 0x02, 0x20, 0x51, 0x31, 0x80, 0xea, 0xb2, 0x01, 0x44, 0xea, 0x00, 0x00, @@ -218,237 +231,246 @@ static uint8_t seqprog[] = { 0x33, 0xea, 0x00, 0x00, 0xff, 0xea, 0xb2, 0x09, 0xff, 0xe0, 0xc0, 0x19, - 0xff, 0xe0, 0xb0, 0x79, + 0xff, 0xe0, 0xca, 0x79, 0x02, 0xac, 0x51, 0x31, - 0x00, 0xe2, 0xa6, 0x41, + 0x00, 0xe2, 0xc0, 0x41, 0x02, 0x5e, 0x50, 0x31, 0x02, 0xa8, 0xb8, 0x30, 0x02, 0x5c, 0x50, 0x31, - 0xff, 0xad, 0xc1, 0x71, + 0xff, 0xad, 0xdb, 0x71, 0x02, 0xac, 0x41, 0x31, 0x02, 0x22, 0x51, 0x31, 0x02, 0xa0, 0x5c, 0x33, 0x02, 0xa0, 0x44, 0x32, - 0x00, 0xe2, 0xca, 0x41, - 0x10, 0x92, 0xcb, 0x69, + 0x00, 0xe2, 0xe4, 0x41, + 0x10, 0x92, 0xe5, 0x69, 0x3d, 0x93, 0xc9, 0x29, 0x01, 0xe4, 0xc8, 0x01, 0x01, 0xea, 0xca, 0x01, 0xff, 0xea, 0xda, 0x01, 0x02, 0x20, 0x51, 0x31, 0x02, 0xae, 0x41, 0x32, - 0xff, 0x21, 0xd3, 0x61, + 0xff, 0x21, 0xed, 0x61, 0xff, 0xea, 0x46, 0x02, 0x02, 0x5c, 0x50, 0x31, 0x40, 0xea, 0x96, 0x00, - 0x02, 0x56, 0xcc, 0x6d, - 0x01, 0x55, 0xcc, 0x6d, - 0x10, 0x92, 0xdf, 0x79, - 0x10, 0x40, 0xe8, 0x69, - 0x01, 0x56, 0xe8, 0x79, + 0x02, 0x56, 0x04, 0x6e, + 0x01, 0x55, 0x04, 0x6e, + 0x10, 0x92, 0xf9, 0x79, + 0x10, 0x40, 0x02, 0x6a, + 0x01, 0x56, 0x02, 0x7a, 0xff, 0x97, 0x07, 0x78, - 0x13, 0xea, 0x50, 0x59, + 0x13, 0xea, 0x64, 0x59, 0x13, 0xea, 0x04, 0x00, 0x00, 0xe2, 0x06, 0x40, 0xbf, 0x3a, 0x74, 0x08, + 0x04, 0x41, 0x08, 0x7a, 0x08, 0xea, 0x98, 0x00, 0x08, 0x57, 0xae, 0x00, - 0x01, 0x93, 0x69, 0x32, - 0x01, 0x94, 0x6b, 0x32, - 0x40, 0xea, 0x66, 0x02, + 0x01, 0x93, 0x75, 0x32, + 0x01, 0x94, 0x77, 0x32, + 0x40, 0xea, 0x72, 0x02, 0x08, 0x3c, 0x78, 0x00, - 0x80, 0xea, 0x62, 0x02, - 0x00, 0xe2, 0xb8, 0x5b, - 0x01, 0x36, 0xc1, 0x31, - 0x9f, 0xe0, 0x4c, 0x7c, - 0x80, 0xe0, 0x0c, 0x72, - 0xa0, 0xe0, 0x44, 0x72, - 0xc0, 0xe0, 0x3a, 0x72, - 0xe0, 0xe0, 0x74, 0x72, - 0x01, 0xea, 0x50, 0x59, + 0x80, 0xea, 0x6e, 0x02, + 0x00, 0xe2, 0xe2, 0x5b, + 0x01, 0x3c, 0xc1, 0x31, + 0x9f, 0xe0, 0x84, 0x7c, + 0x80, 0xe0, 0x28, 0x72, + 0xa0, 0xe0, 0x64, 0x72, + 0xc0, 0xe0, 0x5a, 0x72, + 0xe0, 0xe0, 0x94, 0x72, + 0x01, 0xea, 0x64, 0x59, 0x01, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xf8, 0x41, - 0x80, 0x33, 0x13, 0x7a, - 0x03, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0x14, 0x42, + 0x80, 0x39, 0x2f, 0x7a, + 0x03, 0xea, 0x64, 0x59, 0x03, 0xea, 0x04, 0x00, - 0xee, 0x00, 0x1a, 0x6a, + 0xee, 0x00, 0x36, 0x6a, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x02, 0xa8, 0x90, 0x32, - 0x00, 0xe2, 0x6a, 0x59, + 0x02, 0xa8, 0x9c, 0x32, + 0x00, 0xe2, 0x7e, 0x59, 0xef, 0x96, 0xd5, 0x19, - 0x00, 0xe2, 0x2a, 0x52, + 0x00, 0xe2, 0x46, 0x52, 0x09, 0x80, 0xe1, 0x30, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0x30, 0x42, + 0x00, 0xe2, 0x4c, 0x42, 0x01, 0x96, 0xd1, 0x30, 0x10, 0x80, 0x89, 0x31, 0x20, 0xea, 0x32, 0x00, - 0xbf, 0x33, 0x67, 0x0a, - 0x20, 0x19, 0x32, 0x6a, - 0x02, 0x4d, 0xf8, 0x69, - 0x40, 0x33, 0x67, 0x02, - 0x00, 0xe2, 0xf8, 0x41, - 0x80, 0x33, 0xb5, 0x6a, + 0xbf, 0x39, 0x73, 0x0a, + 0x10, 0x4c, 0x56, 0x6a, + 0x20, 0x19, 0x4e, 0x6a, + 0x20, 0x19, 0x52, 0x6a, + 0x02, 0x4d, 0x14, 0x6a, + 0x40, 0x39, 0x73, 0x02, + 0x00, 0xe2, 0x14, 0x42, + 0x80, 0x39, 0xd5, 0x6a, 0x01, 0x44, 0x10, 0x33, 0x08, 0x92, 0x25, 0x03, - 0x00, 0xe2, 0xf8, 0x41, + 0x00, 0xe2, 0x14, 0x42, 0x10, 0xea, 0x80, 0x00, - 0x01, 0x31, 0xc5, 0x31, - 0x80, 0xe2, 0x60, 0x62, - 0x10, 0x92, 0x85, 0x6a, + 0x01, 0x37, 0xc5, 0x31, + 0x80, 0xe2, 0x80, 0x62, + 0x10, 0x92, 0xa5, 0x6a, 0xc0, 0x94, 0xc5, 0x01, - 0x40, 0x92, 0x51, 0x6a, + 0x40, 0x92, 0x71, 0x6a, 0xbf, 0xe2, 0xc4, 0x09, - 0x20, 0x92, 0x65, 0x7a, + 0x20, 0x92, 0x85, 0x7a, 0x01, 0xe2, 0x88, 0x30, - 0x00, 0xe2, 0xb8, 0x5b, - 0xa0, 0x36, 0x6d, 0x62, + 0x00, 0xe2, 0xe2, 0x5b, + 0xa0, 0x3c, 0x8d, 0x62, 0x23, 0x92, 0x89, 0x08, - 0x00, 0xe2, 0xb8, 0x5b, - 0xa0, 0x36, 0x6d, 0x62, - 0x00, 0xa8, 0x64, 0x42, - 0xff, 0xe2, 0x64, 0x62, - 0x00, 0xe2, 0x84, 0x42, + 0x00, 0xe2, 0xe2, 0x5b, + 0xa0, 0x3c, 0x8d, 0x62, + 0x00, 0xa8, 0x84, 0x42, + 0xff, 0xe2, 0x84, 0x62, + 0x00, 0xe2, 0xa4, 0x42, 0x40, 0xea, 0x98, 0x00, 0x01, 0xe2, 0x88, 0x30, - 0x00, 0xe2, 0xb8, 0x5b, - 0xa0, 0x36, 0x43, 0x72, + 0x00, 0xe2, 0xe2, 0x5b, + 0xa0, 0x3c, 0x63, 0x72, 0x40, 0xea, 0x98, 0x00, - 0x01, 0x31, 0x89, 0x32, - 0x08, 0xea, 0x62, 0x02, - 0x00, 0xe2, 0xf8, 0x41, - 0xe0, 0xea, 0xd4, 0x5b, - 0x80, 0xe0, 0xc0, 0x6a, - 0x04, 0xe0, 0x66, 0x73, - 0x02, 0xe0, 0x96, 0x73, - 0x00, 0xea, 0x1e, 0x73, - 0x03, 0xe0, 0xa6, 0x73, - 0x23, 0xe0, 0x96, 0x72, - 0x08, 0xe0, 0xbc, 0x72, - 0x00, 0xe2, 0xb8, 0x5b, - 0x07, 0xea, 0x50, 0x59, + 0x01, 0x37, 0x95, 0x32, + 0x08, 0xea, 0x6e, 0x02, + 0x00, 0xe2, 0x14, 0x42, + 0xe0, 0xea, 0xfe, 0x5b, + 0x80, 0xe0, 0xe0, 0x6a, + 0x04, 0xe0, 0x92, 0x73, + 0x02, 0xe0, 0xc4, 0x73, + 0x00, 0xea, 0x3e, 0x73, + 0x03, 0xe0, 0xd4, 0x73, + 0x23, 0xe0, 0xb6, 0x72, + 0x08, 0xe0, 0xdc, 0x72, + 0x00, 0xe2, 0xe2, 0x5b, + 0x07, 0xea, 0x64, 0x59, 0x07, 0xea, 0x04, 0x00, - 0x08, 0x42, 0xf9, 0x71, - 0x04, 0x42, 0x93, 0x62, - 0x01, 0x43, 0x89, 0x30, - 0x00, 0xe2, 0x84, 0x42, + 0x08, 0x48, 0x15, 0x72, + 0x04, 0x48, 0xb3, 0x62, + 0x01, 0x49, 0x89, 0x30, + 0x00, 0xe2, 0xa4, 0x42, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0x84, 0x42, - 0x01, 0x00, 0x60, 0x32, - 0x33, 0xea, 0x44, 0x59, + 0x00, 0xe2, 0xa4, 0x42, + 0x01, 0x00, 0x6c, 0x32, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x4c, 0x34, 0xc1, 0x28, + 0x4c, 0x3a, 0xc1, 0x28, 0x01, 0x64, 0xc0, 0x31, - 0x00, 0x30, 0x45, 0x59, - 0x01, 0x30, 0x01, 0x30, - 0x01, 0xe0, 0xba, 0x7a, - 0xa0, 0xea, 0xca, 0x5b, - 0x01, 0xa0, 0xba, 0x62, - 0x01, 0x84, 0xaf, 0x7a, - 0x01, 0x95, 0xbd, 0x6a, - 0x05, 0xea, 0x50, 0x59, + 0x00, 0x36, 0x5f, 0x59, + 0x01, 0x36, 0x01, 0x30, + 0x01, 0xe0, 0xda, 0x7a, + 0xa0, 0xea, 0xf4, 0x5b, + 0x01, 0xa0, 0xda, 0x62, + 0x01, 0x84, 0xcf, 0x7a, + 0x01, 0x95, 0xdd, 0x6a, + 0x05, 0xea, 0x64, 0x59, 0x05, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xbc, 0x42, - 0x03, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0xdc, 0x42, + 0x03, 0xea, 0x64, 0x59, 0x03, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xbc, 0x42, - 0x07, 0xea, 0xdc, 0x5b, + 0x00, 0xe2, 0xdc, 0x42, + 0x07, 0xea, 0x06, 0x5c, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0xf8, 0x41, - 0x3f, 0xe0, 0x6a, 0x0a, - 0xc0, 0x34, 0xc1, 0x09, - 0x00, 0x35, 0x51, 0x01, + 0x00, 0xe2, 0x14, 0x42, + 0x3f, 0xe0, 0x76, 0x0a, + 0xc0, 0x3a, 0xc1, 0x09, + 0x00, 0x3b, 0x51, 0x01, 0xff, 0xea, 0x52, 0x09, - 0x30, 0x34, 0xc5, 0x09, + 0x30, 0x3a, 0xc5, 0x09, 0x3d, 0xe2, 0xc4, 0x29, 0xb8, 0xe2, 0xc4, 0x19, 0x01, 0xea, 0xc6, 0x01, 0x02, 0xe2, 0xc8, 0x31, 0x02, 0xec, 0x40, 0x31, - 0xff, 0xa1, 0xdc, 0x72, + 0xff, 0xa1, 0xfc, 0x72, 0x02, 0xe8, 0xda, 0x31, 0x02, 0xa0, 0x50, 0x31, - 0x00, 0xe2, 0xfe, 0x42, - 0x80, 0x33, 0x67, 0x02, + 0x00, 0xe2, 0x1e, 0x43, + 0x80, 0x39, 0x73, 0x02, 0x01, 0x44, 0xd4, 0x31, - 0x00, 0xe2, 0xb8, 0x5b, - 0x01, 0x33, 0x67, 0x02, - 0xe0, 0x36, 0x19, 0x63, - 0x02, 0x33, 0x67, 0x02, - 0x20, 0x46, 0x12, 0x63, + 0x00, 0xe2, 0xe2, 0x5b, + 0x01, 0x39, 0x73, 0x02, + 0xe0, 0x3c, 0x39, 0x63, + 0x02, 0x39, 0x73, 0x02, + 0x20, 0x46, 0x32, 0x63, 0xff, 0xea, 0x52, 0x09, - 0xa8, 0xea, 0xca, 0x5b, - 0x04, 0x92, 0xf9, 0x7a, - 0x01, 0x34, 0xc1, 0x31, - 0x00, 0x93, 0xf9, 0x62, - 0x01, 0x35, 0xc1, 0x31, - 0x00, 0x94, 0x03, 0x73, + 0xa8, 0xea, 0xf4, 0x5b, + 0x04, 0x92, 0x19, 0x7b, + 0x01, 0x3a, 0xc1, 0x31, + 0x00, 0x93, 0x19, 0x63, + 0x01, 0x3b, 0xc1, 0x31, + 0x00, 0x94, 0x23, 0x73, 0x01, 0xa9, 0x52, 0x11, - 0xff, 0xa9, 0xee, 0x6a, - 0x00, 0xe2, 0x12, 0x43, - 0x10, 0x33, 0x67, 0x02, - 0x04, 0x92, 0x13, 0x7b, + 0xff, 0xa9, 0x0e, 0x6b, + 0x00, 0xe2, 0x32, 0x43, + 0x10, 0x39, 0x73, 0x02, + 0x04, 0x92, 0x33, 0x7b, 0xfb, 0x92, 0x25, 0x0b, - 0xff, 0xea, 0x66, 0x0a, - 0x01, 0xa4, 0x0d, 0x6b, - 0x02, 0xa8, 0x90, 0x32, - 0x00, 0xe2, 0x6a, 0x59, - 0x10, 0x92, 0xbd, 0x7a, - 0xff, 0xea, 0xdc, 0x5b, - 0x00, 0xe2, 0xbc, 0x42, - 0x04, 0xea, 0x50, 0x59, + 0xff, 0xea, 0x72, 0x0a, + 0x01, 0xa4, 0x2d, 0x6b, + 0x02, 0xa8, 0x9c, 0x32, + 0x00, 0xe2, 0x7e, 0x59, + 0x10, 0x92, 0xdd, 0x7a, + 0xff, 0xea, 0x06, 0x5c, + 0x00, 0xe2, 0xdc, 0x42, + 0x04, 0xea, 0x64, 0x59, 0x04, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xbc, 0x42, - 0x04, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0xdc, 0x42, + 0x04, 0xea, 0x64, 0x59, 0x04, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xf8, 0x41, - 0x08, 0x92, 0xb5, 0x7a, - 0xc0, 0x33, 0x29, 0x7b, - 0x80, 0x33, 0xb5, 0x6a, - 0xff, 0x88, 0x29, 0x6b, - 0x40, 0x33, 0xb5, 0x6a, - 0x10, 0x92, 0x2f, 0x7b, - 0x0a, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0x14, 0x42, + 0x08, 0x92, 0xd5, 0x7a, + 0xc0, 0x39, 0x49, 0x7b, + 0x80, 0x39, 0xd5, 0x6a, + 0xff, 0x88, 0x49, 0x6b, + 0x40, 0x39, 0xd5, 0x6a, + 0x10, 0x92, 0x4f, 0x7b, + 0x0a, 0xea, 0x64, 0x59, 0x0a, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x4e, 0x5b, - 0x00, 0xe2, 0x82, 0x43, - 0x50, 0x4b, 0x36, 0x6b, + 0x00, 0xe2, 0x6e, 0x5b, + 0x00, 0xe2, 0xae, 0x43, + 0x50, 0x4b, 0x56, 0x6b, 0xbf, 0x3a, 0x74, 0x08, 0x01, 0xe0, 0xf4, 0x31, 0xff, 0xea, 0xc0, 0x09, - 0x01, 0x2e, 0x5d, 0x1a, - 0x00, 0x2f, 0x5f, 0x22, - 0x04, 0x47, 0x8f, 0x02, + 0x01, 0x32, 0x65, 0x1a, + 0x00, 0x33, 0x67, 0x22, + 0x04, 0x4d, 0x9b, 0x02, 0x01, 0xfa, 0xc0, 0x35, - 0x02, 0xa8, 0x84, 0x32, + 0x02, 0xa8, 0x90, 0x32, 0x02, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x02, 0x42, 0x51, 0x31, - 0xff, 0x90, 0x65, 0x68, - 0xff, 0x88, 0x5b, 0x6b, - 0x01, 0xa4, 0x57, 0x6b, - 0x02, 0xa4, 0x5f, 0x6b, - 0x01, 0x84, 0x5f, 0x7b, + 0x02, 0x48, 0x51, 0x31, + 0xff, 0x90, 0x85, 0x68, + 0xff, 0x88, 0x7b, 0x6b, + 0x01, 0xa4, 0x77, 0x6b, + 0x02, 0xa4, 0x7f, 0x6b, + 0x01, 0x84, 0x7f, 0x7b, 0x02, 0x28, 0x19, 0x33, 0x02, 0xa8, 0x50, 0x36, - 0xff, 0x88, 0x5f, 0x73, - 0x00, 0xe2, 0x32, 0x5b, + 0xff, 0x88, 0x7f, 0x73, + 0x00, 0xe2, 0x52, 0x5b, 0x02, 0xa8, 0x20, 0x33, - 0x02, 0x2c, 0x19, 0x33, + 0x04, 0xa4, 0x49, 0x03, + 0xff, 0xea, 0x1a, 0x03, + 0xff, 0x2d, 0x8b, 0x63, 0x02, 0xa8, 0x58, 0x32, - 0x04, 0xa4, 0x49, 0x07, - 0xc0, 0x33, 0xb5, 0x6a, + 0x02, 0xa8, 0x5c, 0x36, + 0x02, 0xa8, 0x40, 0x31, + 0x02, 0x2e, 0x51, 0x31, + 0x02, 0xa0, 0x18, 0x33, + 0x02, 0xa0, 0x5c, 0x36, + 0xc0, 0x39, 0xd5, 0x6a, 0x04, 0x92, 0x25, 0x03, - 0x20, 0x92, 0x83, 0x6b, + 0x20, 0x92, 0xaf, 0x6b, 0x02, 0xa8, 0x40, 0x31, - 0xc0, 0x34, 0xc1, 0x09, - 0x00, 0x35, 0x51, 0x01, + 0xc0, 0x3a, 0xc1, 0x09, + 0x00, 0x3b, 0x51, 0x01, 0xff, 0xea, 0x52, 0x09, - 0x30, 0x34, 0xc5, 0x09, + 0x30, 0x3a, 0xc5, 0x09, 0x3d, 0xe2, 0xc4, 0x29, 0xb8, 0xe2, 0xc4, 0x19, 0x01, 0xea, 0xc6, 0x01, @@ -458,69 +480,75 @@ static uint8_t seqprog[] = { 0xf7, 0x57, 0xae, 0x08, 0x08, 0xea, 0x98, 0x00, 0x01, 0x44, 0xd4, 0x31, - 0xee, 0x00, 0x8c, 0x6b, + 0xee, 0x00, 0xb8, 0x6b, 0x02, 0xea, 0xb4, 0x00, - 0x00, 0xe2, 0xb4, 0x5b, - 0x09, 0x4c, 0x8e, 0x7b, + 0xc0, 0xea, 0x72, 0x02, + 0x09, 0x4c, 0xba, 0x7b, + 0x01, 0xea, 0x78, 0x02, 0x08, 0x4c, 0x06, 0x68, - 0x0b, 0xea, 0x50, 0x59, + 0x0b, 0xea, 0x64, 0x59, 0x0b, 0xea, 0x04, 0x00, 0x01, 0x44, 0xd4, 0x31, - 0x20, 0x33, 0xf9, 0x79, - 0x00, 0xe2, 0x9e, 0x5b, - 0x00, 0xe2, 0xf8, 0x41, - 0x01, 0x84, 0xa3, 0x7b, + 0x20, 0x39, 0x15, 0x7a, + 0x00, 0xe2, 0xcc, 0x5b, + 0x00, 0xe2, 0x14, 0x42, + 0x01, 0x84, 0xd1, 0x7b, 0x01, 0xa4, 0x49, 0x07, 0x08, 0x60, 0x30, 0x33, 0x08, 0x80, 0x41, 0x37, - 0xdf, 0x33, 0x67, 0x0a, - 0xee, 0x00, 0xb0, 0x6b, + 0xdf, 0x39, 0x73, 0x0a, + 0xee, 0x00, 0xde, 0x6b, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, - 0x00, 0xe2, 0x6a, 0x59, - 0x00, 0xe2, 0xbc, 0x42, - 0x01, 0xea, 0x6c, 0x02, - 0xc0, 0xea, 0x66, 0x06, - 0xff, 0x42, 0xc4, 0x6b, - 0x01, 0x41, 0xb8, 0x6b, - 0x02, 0x41, 0xb8, 0x7b, - 0xff, 0x42, 0xc4, 0x6b, - 0x01, 0x41, 0xb8, 0x6b, - 0x02, 0x41, 0xb8, 0x7b, - 0xff, 0x42, 0xc4, 0x7b, - 0x04, 0x4c, 0xb8, 0x6b, - 0xe0, 0x41, 0x6c, 0x0e, + 0x00, 0xe2, 0x7e, 0x59, + 0x00, 0xe2, 0xdc, 0x42, + 0xff, 0x42, 0xee, 0x6b, + 0x01, 0x41, 0xe2, 0x6b, + 0x02, 0x41, 0xe2, 0x7b, + 0xff, 0x42, 0xee, 0x6b, + 0x01, 0x41, 0xe2, 0x6b, + 0x02, 0x41, 0xe2, 0x7b, + 0xff, 0x42, 0xee, 0x7b, + 0x04, 0x4c, 0xe2, 0x6b, + 0xe0, 0x41, 0x78, 0x0e, 0x01, 0x44, 0xd4, 0x31, - 0xff, 0x42, 0xcc, 0x7b, - 0x04, 0x4c, 0xcc, 0x6b, - 0xe0, 0x41, 0x6c, 0x0a, - 0xe0, 0x36, 0xf9, 0x61, + 0xff, 0x42, 0xf6, 0x7b, + 0x04, 0x4c, 0xf6, 0x6b, + 0xe0, 0x41, 0x78, 0x0a, + 0xe0, 0x3c, 0x15, 0x62, 0xff, 0xea, 0xca, 0x09, 0x01, 0xe2, 0xc8, 0x31, 0x01, 0x46, 0xda, 0x35, 0x01, 0x44, 0xd4, 0x35, 0x10, 0xea, 0x80, 0x00, - 0x01, 0xe2, 0x62, 0x36, - 0x04, 0xa6, 0xe4, 0x7b, + 0x01, 0xe2, 0x6e, 0x36, + 0x04, 0xa6, 0x0e, 0x7c, 0xff, 0xea, 0x5a, 0x09, 0xff, 0xea, 0x4c, 0x0d, - 0x01, 0xa6, 0x02, 0x6c, - 0x10, 0xad, 0x64, 0x78, - 0x80, 0xad, 0xfa, 0x6b, - 0x08, 0xad, 0x64, 0x68, + 0x01, 0xa6, 0x3a, 0x6c, + 0x10, 0xad, 0x84, 0x78, + 0x80, 0xad, 0x32, 0x6c, + 0x08, 0xad, 0x84, 0x68, + 0x20, 0x19, 0x26, 0x7c, + 0x80, 0xea, 0xb2, 0x01, + 0x11, 0x00, 0x00, 0x10, + 0x02, 0xa6, 0x22, 0x7c, + 0xff, 0xea, 0xb2, 0x0d, + 0x11, 0x00, 0x00, 0x10, + 0xff, 0xea, 0xb2, 0x09, 0x04, 0x84, 0xf9, 0x30, 0x00, 0xea, 0x08, 0x81, 0xff, 0xea, 0xd4, 0x09, 0x02, 0x84, 0xf9, 0x88, 0x0d, 0xea, 0x5a, 0x01, 0x04, 0xa6, 0x4c, 0x05, - 0x04, 0xa6, 0x64, 0x78, + 0x04, 0xa6, 0x84, 0x78, 0xff, 0xea, 0x5a, 0x09, 0x03, 0x84, 0x59, 0x89, 0x03, 0xea, 0x4c, 0x01, - 0x80, 0x1a, 0x64, 0x78, - 0x08, 0x19, 0x64, 0x78, + 0x80, 0x1a, 0x84, 0x78, + 0x08, 0x19, 0x84, 0x78, 0x08, 0xb0, 0xe0, 0x30, 0x04, 0xb0, 0xe0, 0x30, 0x03, 0xb0, 0xf0, 0x30, @@ -533,259 +561,259 @@ static uint8_t seqprog[] = { 0x00, 0x86, 0x0d, 0x23, 0x00, 0x87, 0x0f, 0x23, 0x01, 0x84, 0xc5, 0x31, - 0x80, 0x83, 0x25, 0x7c, + 0x80, 0x83, 0x5d, 0x7c, 0x02, 0xe2, 0xc4, 0x01, 0xff, 0xea, 0x4c, 0x09, 0x01, 0xe2, 0x36, 0x30, 0xc8, 0x19, 0x32, 0x00, 0x88, 0x19, 0x32, 0x00, 0x01, 0xac, 0xd4, 0x99, - 0x00, 0xe2, 0x64, 0x50, + 0x00, 0xe2, 0x84, 0x50, 0xfe, 0xa6, 0x4c, 0x0d, 0x0b, 0x98, 0xe1, 0x30, 0xfd, 0xa4, 0x49, 0x09, - 0x80, 0xa3, 0x39, 0x7c, + 0x80, 0xa3, 0x71, 0x7c, 0x02, 0xa4, 0x48, 0x01, 0x01, 0xa4, 0x36, 0x30, 0xa8, 0xea, 0x32, 0x00, 0xfd, 0xa4, 0x49, 0x0b, 0x05, 0xa3, 0x07, 0x33, - 0x80, 0x83, 0x45, 0x6c, + 0x80, 0x83, 0x7d, 0x6c, 0x02, 0xea, 0x4c, 0x05, 0xff, 0xea, 0x4c, 0x0d, - 0x00, 0xe2, 0x3e, 0x59, - 0x02, 0xa6, 0xe6, 0x6b, + 0x00, 0xe2, 0x56, 0x59, + 0x02, 0xa6, 0x10, 0x6c, 0x80, 0xf9, 0xf2, 0x05, - 0xc0, 0x33, 0x53, 0x7c, - 0x03, 0xea, 0x50, 0x59, + 0xc0, 0x39, 0x8b, 0x7c, + 0x03, 0xea, 0x64, 0x59, 0x03, 0xea, 0x04, 0x00, - 0x20, 0x33, 0x77, 0x7c, - 0x01, 0x84, 0x5d, 0x6c, - 0x06, 0xea, 0x50, 0x59, + 0x20, 0x39, 0xaf, 0x7c, + 0x01, 0x84, 0x95, 0x6c, + 0x06, 0xea, 0x64, 0x59, 0x06, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x7a, 0x44, - 0x01, 0x00, 0x60, 0x32, - 0xee, 0x00, 0x66, 0x6c, + 0x00, 0xe2, 0xb2, 0x44, + 0x01, 0x00, 0x6c, 0x32, + 0xee, 0x00, 0x9e, 0x6c, 0x05, 0xea, 0xb4, 0x00, - 0x33, 0xea, 0x44, 0x59, + 0x33, 0xea, 0x5e, 0x59, 0x33, 0xea, 0x00, 0x00, 0x80, 0x3d, 0x7a, 0x00, - 0xfc, 0x42, 0x68, 0x7c, + 0xfc, 0x42, 0xa0, 0x7c, 0x7f, 0x3d, 0x7a, 0x08, - 0x00, 0x30, 0x45, 0x59, - 0x01, 0x30, 0x01, 0x30, - 0x09, 0xea, 0x50, 0x59, + 0x00, 0x36, 0x5f, 0x59, + 0x01, 0x36, 0x01, 0x30, + 0x09, 0xea, 0x64, 0x59, 0x09, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xf8, 0x41, - 0x01, 0xa4, 0x5d, 0x6c, - 0x00, 0xe2, 0x30, 0x5c, - 0x20, 0x33, 0x67, 0x02, - 0x01, 0x00, 0x60, 0x32, - 0x02, 0xa6, 0x82, 0x7c, - 0x00, 0xe2, 0x46, 0x5c, - 0x00, 0xe2, 0x56, 0x58, - 0x00, 0xe2, 0x66, 0x58, - 0x00, 0xe2, 0x3a, 0x58, - 0x00, 0x30, 0x45, 0x59, - 0x01, 0x30, 0x01, 0x30, - 0x20, 0x19, 0x82, 0x6c, - 0x00, 0xe2, 0xb2, 0x5c, - 0x04, 0x19, 0x9c, 0x6c, + 0x00, 0xe2, 0x14, 0x42, + 0x01, 0xa4, 0x95, 0x6c, + 0x00, 0xe2, 0x68, 0x5c, + 0x20, 0x39, 0x73, 0x02, + 0x01, 0x00, 0x6c, 0x32, + 0x02, 0xa6, 0xba, 0x7c, + 0x00, 0xe2, 0x7e, 0x5c, + 0x00, 0xe2, 0x76, 0x58, + 0x00, 0xe2, 0x86, 0x58, + 0x00, 0xe2, 0x5a, 0x58, + 0x00, 0x36, 0x5f, 0x59, + 0x01, 0x36, 0x01, 0x30, + 0x20, 0x19, 0xba, 0x6c, + 0x00, 0xe2, 0xea, 0x5c, + 0x04, 0x19, 0xd4, 0x6c, 0x02, 0x19, 0x32, 0x00, - 0x01, 0x84, 0x9d, 0x7c, - 0x01, 0x1b, 0x96, 0x7c, - 0x01, 0x1a, 0x9c, 0x6c, - 0x00, 0xe2, 0x4c, 0x44, - 0x80, 0x4b, 0xa2, 0x6c, - 0x01, 0x4c, 0x9e, 0x7c, - 0x03, 0x42, 0x4c, 0x6c, - 0x00, 0xe2, 0xe0, 0x5b, + 0x01, 0x84, 0xd5, 0x7c, + 0x01, 0x1b, 0xce, 0x7c, + 0x01, 0x1a, 0xd4, 0x6c, + 0x00, 0xe2, 0x84, 0x44, + 0x80, 0x4b, 0xda, 0x6c, + 0x01, 0x4c, 0xd6, 0x7c, + 0x03, 0x42, 0x84, 0x6c, + 0x00, 0xe2, 0x0a, 0x5c, 0x80, 0xf9, 0xf2, 0x01, - 0x04, 0x33, 0xf9, 0x79, - 0x00, 0xe2, 0xf8, 0x41, - 0x08, 0x5d, 0xba, 0x6c, - 0x00, 0xe2, 0x56, 0x58, - 0x00, 0x30, 0x45, 0x59, - 0x01, 0x30, 0x01, 0x30, - 0x02, 0x1b, 0xaa, 0x7c, - 0x08, 0x5d, 0xb8, 0x7c, + 0x04, 0x39, 0x15, 0x7a, + 0x00, 0xe2, 0x14, 0x42, + 0x08, 0x5d, 0xf2, 0x6c, + 0x00, 0xe2, 0x76, 0x58, + 0x00, 0x36, 0x5f, 0x59, + 0x01, 0x36, 0x01, 0x30, + 0x02, 0x1b, 0xe2, 0x7c, + 0x08, 0x5d, 0xf0, 0x7c, 0x03, 0x68, 0x00, 0x37, 0x01, 0x84, 0x09, 0x07, - 0x80, 0x1b, 0xc4, 0x7c, - 0x80, 0x84, 0xc5, 0x6c, + 0x80, 0x1b, 0xfc, 0x7c, + 0x80, 0x84, 0xfd, 0x6c, 0xff, 0x85, 0x0b, 0x1b, 0xff, 0x86, 0x0d, 0x23, 0xff, 0x87, 0x0f, 0x23, 0xf8, 0x1b, 0x08, 0x0b, 0xff, 0xea, 0x06, 0x0b, 0x03, 0x68, 0x00, 0x37, - 0x00, 0xe2, 0xc4, 0x58, + 0x00, 0xe2, 0xd6, 0x58, 0x10, 0xea, 0x18, 0x00, 0xf9, 0xd9, 0xb2, 0x0d, 0x01, 0xd9, 0xb2, 0x05, 0x01, 0x52, 0x48, 0x31, - 0x20, 0xa4, 0xee, 0x7c, - 0x20, 0x5b, 0xee, 0x7c, - 0x80, 0xf9, 0xfc, 0x7c, + 0x20, 0xa4, 0x26, 0x7d, + 0x20, 0x5b, 0x26, 0x7d, + 0x80, 0xf9, 0x34, 0x7d, 0x02, 0xea, 0xb4, 0x00, 0x11, 0x00, 0x00, 0x10, - 0x04, 0x19, 0x08, 0x7d, + 0x04, 0x19, 0x40, 0x7d, 0xdf, 0x19, 0x32, 0x08, - 0x60, 0x5b, 0xe6, 0x6c, - 0x01, 0x4c, 0xe2, 0x7c, + 0x60, 0x5b, 0x40, 0x6d, + 0x01, 0x4c, 0x1a, 0x7d, 0x20, 0x19, 0x32, 0x00, 0x01, 0xd9, 0xb2, 0x05, 0x02, 0xea, 0xb4, 0x00, 0x01, 0xd9, 0xb2, 0x05, - 0x10, 0x5b, 0x00, 0x6d, - 0x08, 0x5b, 0x0a, 0x6d, - 0x20, 0x5b, 0xfa, 0x6c, - 0x02, 0x5b, 0x2a, 0x6d, - 0x0e, 0xea, 0x50, 0x59, + 0x10, 0x5b, 0x38, 0x6d, + 0x08, 0x5b, 0x42, 0x6d, + 0x20, 0x5b, 0x32, 0x6d, + 0x02, 0x5b, 0x62, 0x6d, + 0x0e, 0xea, 0x64, 0x59, 0x0e, 0xea, 0x04, 0x00, - 0x80, 0xf9, 0xea, 0x6c, + 0x80, 0xf9, 0x22, 0x6d, 0xdf, 0x5c, 0xb8, 0x08, 0x01, 0xd9, 0xb2, 0x05, - 0x01, 0xa4, 0xe5, 0x6d, - 0x00, 0xe2, 0x30, 0x5c, - 0x00, 0xe2, 0x34, 0x5d, + 0x01, 0xa4, 0x1d, 0x6e, + 0x00, 0xe2, 0x68, 0x5c, + 0x00, 0xe2, 0x6c, 0x5d, 0x01, 0x90, 0x21, 0x1b, 0x01, 0xd9, 0xb2, 0x05, - 0x00, 0xe2, 0x32, 0x5b, + 0x00, 0xe2, 0x52, 0x5b, 0xf3, 0x96, 0xd5, 0x19, - 0x00, 0xe2, 0x18, 0x55, - 0x80, 0x96, 0x19, 0x6d, - 0x0f, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0x50, 0x55, + 0x80, 0x96, 0x51, 0x6d, + 0x0f, 0xea, 0x64, 0x59, 0x0f, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x20, 0x45, + 0x00, 0xe2, 0x58, 0x45, 0x04, 0x8c, 0xe1, 0x30, 0x01, 0xea, 0xf2, 0x00, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0xff, 0x97, 0x27, 0x7d, - 0x14, 0xea, 0x50, 0x59, + 0xff, 0x97, 0x5f, 0x7d, + 0x14, 0xea, 0x64, 0x59, 0x14, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x96, 0x5d, + 0x00, 0xe2, 0xce, 0x5d, 0x01, 0xd9, 0xb2, 0x05, 0x09, 0x80, 0xe1, 0x30, 0x02, 0xea, 0x36, 0x00, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0x8e, 0x5d, + 0x00, 0xe2, 0xc6, 0x5d, 0x01, 0xd9, 0xb2, 0x05, - 0x02, 0xa6, 0x44, 0x7d, - 0x00, 0xe2, 0x3e, 0x59, - 0x20, 0x5b, 0x52, 0x6d, - 0xfc, 0x42, 0x3e, 0x7d, - 0x10, 0x40, 0x40, 0x6d, - 0x20, 0x4d, 0x42, 0x7d, - 0x08, 0x5d, 0x52, 0x6d, - 0x02, 0xa6, 0xe6, 0x6b, - 0x00, 0xe2, 0x3e, 0x59, - 0x20, 0x5b, 0x52, 0x6d, - 0x01, 0x1b, 0x72, 0x6d, - 0xfc, 0x42, 0x4e, 0x7d, - 0x10, 0x40, 0x50, 0x6d, - 0x20, 0x4d, 0x64, 0x78, - 0x08, 0x5d, 0x64, 0x78, + 0x02, 0xa6, 0x7c, 0x7d, + 0x00, 0xe2, 0x56, 0x59, + 0x20, 0x5b, 0x8a, 0x6d, + 0xfc, 0x42, 0x76, 0x7d, + 0x10, 0x40, 0x78, 0x6d, + 0x20, 0x4d, 0x7a, 0x7d, + 0x08, 0x5d, 0x8a, 0x6d, + 0x02, 0xa6, 0x10, 0x6c, + 0x00, 0xe2, 0x56, 0x59, + 0x20, 0x5b, 0x8a, 0x6d, + 0x01, 0x1b, 0xaa, 0x6d, + 0xfc, 0x42, 0x86, 0x7d, + 0x10, 0x40, 0x88, 0x6d, + 0x20, 0x4d, 0x84, 0x78, + 0x08, 0x5d, 0x84, 0x78, 0x02, 0x19, 0x32, 0x00, 0x01, 0x5b, 0x40, 0x31, - 0x00, 0xe2, 0xb2, 0x5c, - 0x00, 0xe2, 0x9e, 0x5b, + 0x00, 0xe2, 0xea, 0x5c, + 0x00, 0xe2, 0xcc, 0x5b, 0x20, 0xea, 0xb6, 0x00, - 0x00, 0xe2, 0xe0, 0x5b, + 0x00, 0xe2, 0x0a, 0x5c, 0x20, 0x5c, 0xb8, 0x00, - 0x04, 0x19, 0x68, 0x6d, - 0x01, 0x1a, 0x68, 0x6d, - 0x00, 0xe2, 0x3e, 0x59, - 0x01, 0x1a, 0x64, 0x78, + 0x04, 0x19, 0xa0, 0x6d, + 0x01, 0x1a, 0xa0, 0x6d, + 0x00, 0xe2, 0x56, 0x59, + 0x01, 0x1a, 0x84, 0x78, 0x80, 0xf9, 0xf2, 0x01, - 0x20, 0xa0, 0xcc, 0x7d, + 0x20, 0xa0, 0x04, 0x7e, 0xff, 0x90, 0x21, 0x1b, - 0x08, 0x92, 0x43, 0x6b, + 0x08, 0x92, 0x63, 0x6b, 0x02, 0xea, 0xb4, 0x04, 0x01, 0xa4, 0x49, 0x03, - 0x40, 0x5b, 0x82, 0x6d, - 0x00, 0xe2, 0x3e, 0x59, - 0x40, 0x5b, 0x82, 0x6d, - 0x04, 0x5d, 0xe6, 0x7d, - 0x01, 0x1a, 0xe6, 0x7d, - 0x20, 0x4d, 0x64, 0x78, - 0x40, 0x5b, 0xcc, 0x7d, - 0x04, 0x5d, 0xe6, 0x7d, - 0x01, 0x1a, 0xe6, 0x7d, + 0x40, 0x5b, 0xba, 0x6d, + 0x00, 0xe2, 0x56, 0x59, + 0x40, 0x5b, 0xba, 0x6d, + 0x04, 0x5d, 0x1e, 0x7e, + 0x01, 0x1a, 0x1e, 0x7e, + 0x20, 0x4d, 0x84, 0x78, + 0x40, 0x5b, 0x04, 0x7e, + 0x04, 0x5d, 0x1e, 0x7e, + 0x01, 0x1a, 0x1e, 0x7e, 0x80, 0xf9, 0xf2, 0x01, 0xff, 0x90, 0x21, 0x1b, - 0x08, 0x92, 0x43, 0x6b, + 0x08, 0x92, 0x63, 0x6b, 0x02, 0xea, 0xb4, 0x04, - 0x00, 0xe2, 0x3e, 0x59, - 0x01, 0x1b, 0x64, 0x78, + 0x00, 0xe2, 0x56, 0x59, + 0x01, 0x1b, 0x84, 0x78, 0x80, 0xf9, 0xf2, 0x01, 0x02, 0xea, 0xb4, 0x04, - 0x00, 0xe2, 0x3e, 0x59, - 0x01, 0x1b, 0xaa, 0x6d, - 0x40, 0x5b, 0xb8, 0x7d, - 0x01, 0x1b, 0xaa, 0x6d, + 0x00, 0xe2, 0x56, 0x59, + 0x01, 0x1b, 0xe2, 0x6d, + 0x40, 0x5b, 0xf0, 0x7d, + 0x01, 0x1b, 0xe2, 0x6d, 0x02, 0x19, 0x32, 0x00, - 0x01, 0x1a, 0x64, 0x78, + 0x01, 0x1a, 0x84, 0x78, 0x80, 0xf9, 0xf2, 0x01, 0xff, 0xea, 0x10, 0x03, 0x08, 0x92, 0x25, 0x03, - 0x00, 0xe2, 0x42, 0x43, - 0x01, 0x1a, 0xb4, 0x7d, - 0x40, 0x5b, 0xb0, 0x7d, - 0x01, 0x1a, 0x9e, 0x6d, - 0xfc, 0x42, 0x64, 0x78, - 0x01, 0x1a, 0xb8, 0x6d, - 0x10, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0x62, 0x43, + 0x01, 0x1a, 0xec, 0x7d, + 0x40, 0x5b, 0xe8, 0x7d, + 0x01, 0x1a, 0xd6, 0x6d, + 0xfc, 0x42, 0x84, 0x78, + 0x01, 0x1a, 0xf0, 0x6d, + 0x10, 0xea, 0x64, 0x59, 0x10, 0xea, 0x04, 0x00, - 0xfc, 0x42, 0x64, 0x78, - 0x10, 0x40, 0xbe, 0x6d, - 0x20, 0x4d, 0x64, 0x78, - 0x40, 0x5b, 0x9e, 0x6d, - 0x01, 0x1a, 0x64, 0x78, + 0xfc, 0x42, 0x84, 0x78, + 0x10, 0x40, 0xf6, 0x6d, + 0x20, 0x4d, 0x84, 0x78, + 0x40, 0x5b, 0xd6, 0x6d, + 0x01, 0x1a, 0x84, 0x78, 0x01, 0x90, 0x21, 0x1b, 0x30, 0x3f, 0xc0, 0x09, - 0x30, 0xe0, 0x64, 0x60, - 0x40, 0x4b, 0x64, 0x68, + 0x30, 0xe0, 0x84, 0x60, + 0x40, 0x4b, 0x84, 0x68, 0xff, 0xea, 0x52, 0x01, - 0xee, 0x00, 0xd2, 0x6d, + 0xee, 0x00, 0x0c, 0x6e, 0x80, 0xf9, 0xf2, 0x01, 0xff, 0x90, 0x21, 0x1b, 0x02, 0xea, 0xb4, 0x00, 0x20, 0xea, 0x9a, 0x00, - 0xf3, 0x42, 0xde, 0x6d, - 0x12, 0xea, 0x50, 0x59, + 0xf3, 0x42, 0x16, 0x6e, + 0x12, 0xea, 0x64, 0x59, 0x12, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xf8, 0x41, - 0x0d, 0xea, 0x50, 0x59, + 0x00, 0xe2, 0x14, 0x42, + 0x0d, 0xea, 0x64, 0x59, 0x0d, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0xf8, 0x41, + 0x00, 0xe2, 0x14, 0x42, 0x01, 0x90, 0x21, 0x1b, - 0x11, 0xea, 0x50, 0x59, + 0x11, 0xea, 0x64, 0x59, 0x11, 0xea, 0x04, 0x00, - 0x00, 0xe2, 0x32, 0x5b, + 0x00, 0xe2, 0x52, 0x5b, 0x08, 0x5a, 0xb4, 0x00, - 0x00, 0xe2, 0x0c, 0x5e, + 0x00, 0xe2, 0x44, 0x5e, 0xa8, 0xea, 0x32, 0x00, - 0x00, 0xe2, 0x3e, 0x59, - 0x80, 0x1a, 0xfa, 0x7d, - 0x00, 0xe2, 0x0c, 0x5e, + 0x00, 0xe2, 0x56, 0x59, + 0x80, 0x1a, 0x32, 0x7e, + 0x00, 0xe2, 0x44, 0x5e, 0x80, 0x19, 0x32, 0x00, - 0x40, 0x5b, 0x00, 0x6e, - 0x08, 0x5a, 0x00, 0x7e, - 0x20, 0x4d, 0x64, 0x78, + 0x40, 0x5b, 0x38, 0x6e, + 0x08, 0x5a, 0x38, 0x7e, + 0x20, 0x4d, 0x84, 0x78, 0x02, 0x84, 0x09, 0x03, - 0x40, 0x5b, 0xcc, 0x7d, + 0x40, 0x5b, 0x04, 0x7e, 0xff, 0x90, 0x21, 0x1b, 0x80, 0xf9, 0xf2, 0x01, - 0x08, 0x92, 0x43, 0x6b, + 0x08, 0x92, 0x63, 0x6b, 0x02, 0xea, 0xb4, 0x04, - 0x01, 0x38, 0xe1, 0x30, - 0x05, 0x39, 0xe3, 0x98, + 0x01, 0x40, 0xe1, 0x30, + 0x05, 0x41, 0xe3, 0x98, 0x01, 0xe0, 0xf4, 0x31, 0xff, 0xea, 0xc0, 0x09, - 0x00, 0x3a, 0xe5, 0x20, - 0x00, 0x3b, 0xe7, 0x20, + 0x00, 0x42, 0xe5, 0x20, + 0x00, 0x43, 0xe7, 0x20, 0x01, 0xfa, 0xc0, 0x31, 0x04, 0xea, 0xe8, 0x30, 0xff, 0xea, 0xf0, 0x08, @@ -794,12 +822,20 @@ static uint8_t seqprog[] = { }; typedef int ahd_patch_func_t (struct ahd_softc *ahd); +static ahd_patch_func_t ahd_patch23_func; + +static int +ahd_patch23_func(struct ahd_softc *ahd) +{ + return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0); +} + static ahd_patch_func_t ahd_patch22_func; static int ahd_patch22_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0); + return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0); } static ahd_patch_func_t ahd_patch21_func; @@ -807,7 +843,7 @@ static ahd_patch_func_t ahd_patch21_func; static int ahd_patch21_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0); + return ((ahd->flags & AHD_INITIATORROLE) != 0); } static ahd_patch_func_t ahd_patch20_func; @@ -815,7 +851,7 @@ static ahd_patch_func_t ahd_patch20_func; static int ahd_patch20_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_RTI) == 0); + return ((ahd->flags & AHD_TARGETROLE) != 0); } static ahd_patch_func_t ahd_patch19_func; @@ -823,7 +859,7 @@ static ahd_patch_func_t ahd_patch19_func; static int ahd_patch19_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_INITIATORROLE) != 0); + return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0); } static ahd_patch_func_t ahd_patch18_func; @@ -831,7 +867,7 @@ static ahd_patch_func_t ahd_patch18_func; static int ahd_patch18_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_TARGETROLE) != 0); + return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0); } static ahd_patch_func_t ahd_patch17_func; @@ -839,7 +875,7 @@ static ahd_patch_func_t ahd_patch17_func; static int ahd_patch17_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0); + return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0); } static ahd_patch_func_t ahd_patch16_func; @@ -847,7 +883,7 @@ static ahd_patch_func_t ahd_patch16_func; static int ahd_patch16_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0); + return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0); } static ahd_patch_func_t ahd_patch15_func; @@ -855,7 +891,7 @@ static ahd_patch_func_t ahd_patch15_func; static int ahd_patch15_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0); + return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0); } static ahd_patch_func_t ahd_patch14_func; @@ -863,7 +899,7 @@ static ahd_patch_func_t ahd_patch14_func; static int ahd_patch14_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0); + return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0); } static ahd_patch_func_t ahd_patch13_func; @@ -871,7 +907,7 @@ static ahd_patch_func_t ahd_patch13_func; static int ahd_patch13_func(struct ahd_softc *ahd) { - return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0); + return ((ahd->features & AHD_RTI) == 0); } static ahd_patch_func_t ahd_patch12_func; @@ -879,7 +915,7 @@ static ahd_patch_func_t ahd_patch12_func; static int ahd_patch12_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0); + return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0); } static ahd_patch_func_t ahd_patch11_func; @@ -887,7 +923,7 @@ static ahd_patch_func_t ahd_patch11_func; static int ahd_patch11_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0); + return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0); } static ahd_patch_func_t ahd_patch10_func; @@ -895,7 +931,7 @@ static ahd_patch_func_t ahd_patch10_func; static int ahd_patch10_func(struct ahd_softc *ahd) { - return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0); + return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0); } static ahd_patch_func_t ahd_patch9_func; @@ -903,7 +939,7 @@ static ahd_patch_func_t ahd_patch9_func; static int ahd_patch9_func(struct ahd_softc *ahd) { - return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0); + return ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0); } static ahd_patch_func_t ahd_patch8_func; @@ -992,147 +1028,149 @@ static struct patch { { ahd_patch0_func, 5, 1, 1 }, { ahd_patch2_func, 6, 1, 2 }, { ahd_patch0_func, 7, 1, 1 }, - { ahd_patch3_func, 20, 5, 1 }, - { ahd_patch2_func, 29, 1, 2 }, - { ahd_patch0_func, 30, 1, 1 }, - { ahd_patch1_func, 37, 1, 2 }, - { ahd_patch0_func, 38, 1, 1 }, - { ahd_patch2_func, 43, 1, 2 }, - { ahd_patch0_func, 44, 1, 1 }, - { ahd_patch2_func, 47, 1, 2 }, - { ahd_patch0_func, 48, 1, 1 }, - { ahd_patch2_func, 51, 1, 2 }, - { ahd_patch0_func, 52, 1, 1 }, - { ahd_patch2_func, 65, 1, 2 }, - { ahd_patch0_func, 66, 1, 1 }, - { ahd_patch2_func, 69, 1, 2 }, - { ahd_patch0_func, 70, 1, 1 }, - { ahd_patch1_func, 73, 1, 2 }, - { ahd_patch0_func, 74, 1, 1 }, - { ahd_patch4_func, 107, 1, 1 }, - { ahd_patch2_func, 162, 6, 1 }, - { ahd_patch1_func, 168, 2, 1 }, - { ahd_patch5_func, 170, 1, 1 }, - { ahd_patch2_func, 179, 1, 2 }, - { ahd_patch0_func, 180, 1, 1 }, - { ahd_patch6_func, 181, 2, 2 }, - { ahd_patch0_func, 183, 6, 3 }, - { ahd_patch2_func, 186, 1, 2 }, - { ahd_patch0_func, 187, 1, 1 }, - { ahd_patch2_func, 190, 1, 2 }, - { ahd_patch0_func, 191, 1, 1 }, - { ahd_patch7_func, 193, 2, 1 }, - { ahd_patch5_func, 201, 16, 2 }, - { ahd_patch0_func, 217, 1, 1 }, - { ahd_patch8_func, 237, 2, 1 }, - { ahd_patch1_func, 241, 1, 2 }, - { ahd_patch0_func, 242, 1, 1 }, - { ahd_patch7_func, 245, 2, 1 }, - { ahd_patch1_func, 259, 1, 2 }, - { ahd_patch0_func, 260, 1, 1 }, - { ahd_patch1_func, 263, 1, 2 }, - { ahd_patch0_func, 264, 1, 1 }, - { ahd_patch2_func, 267, 1, 2 }, - { ahd_patch0_func, 268, 1, 1 }, - { ahd_patch1_func, 323, 1, 2 }, - { ahd_patch0_func, 324, 1, 1 }, - { ahd_patch2_func, 332, 1, 2 }, - { ahd_patch0_func, 333, 1, 1 }, - { ahd_patch2_func, 336, 1, 2 }, - { ahd_patch0_func, 337, 1, 1 }, - { ahd_patch1_func, 343, 1, 2 }, - { ahd_patch0_func, 344, 1, 1 }, - { ahd_patch1_func, 346, 1, 2 }, - { ahd_patch0_func, 347, 1, 1 }, - { ahd_patch9_func, 366, 1, 1 }, - { ahd_patch9_func, 369, 1, 1 }, - { ahd_patch9_func, 371, 1, 1 }, - { ahd_patch9_func, 383, 1, 1 }, - { ahd_patch1_func, 393, 1, 2 }, - { ahd_patch0_func, 394, 1, 1 }, - { ahd_patch1_func, 396, 1, 2 }, - { ahd_patch0_func, 397, 1, 1 }, - { ahd_patch1_func, 405, 1, 2 }, - { ahd_patch0_func, 406, 1, 1 }, - { ahd_patch2_func, 419, 1, 2 }, - { ahd_patch0_func, 420, 1, 1 }, - { ahd_patch10_func, 450, 1, 1 }, - { ahd_patch1_func, 457, 1, 2 }, - { ahd_patch0_func, 458, 1, 1 }, - { ahd_patch2_func, 470, 1, 2 }, - { ahd_patch0_func, 471, 1, 1 }, - { ahd_patch11_func, 476, 6, 2 }, - { ahd_patch0_func, 482, 1, 1 }, - { ahd_patch12_func, 505, 1, 1 }, - { ahd_patch13_func, 514, 1, 1 }, - { ahd_patch14_func, 515, 1, 2 }, - { ahd_patch0_func, 516, 1, 1 }, - { ahd_patch15_func, 519, 1, 1 }, - { ahd_patch14_func, 520, 1, 1 }, - { ahd_patch16_func, 531, 1, 2 }, - { ahd_patch0_func, 532, 1, 1 }, - { ahd_patch1_func, 551, 1, 2 }, - { ahd_patch0_func, 552, 1, 1 }, - { ahd_patch1_func, 555, 1, 2 }, - { ahd_patch0_func, 556, 1, 1 }, - { ahd_patch2_func, 561, 1, 2 }, - { ahd_patch0_func, 562, 1, 1 }, - { ahd_patch2_func, 566, 1, 2 }, - { ahd_patch0_func, 567, 1, 1 }, - { ahd_patch1_func, 568, 1, 2 }, - { ahd_patch0_func, 569, 1, 1 }, - { ahd_patch2_func, 580, 1, 2 }, - { ahd_patch0_func, 581, 1, 1 }, - { ahd_patch17_func, 585, 1, 1 }, - { ahd_patch18_func, 590, 1, 1 }, - { ahd_patch19_func, 591, 2, 1 }, - { ahd_patch18_func, 595, 1, 2 }, - { ahd_patch0_func, 596, 1, 1 }, - { ahd_patch2_func, 599, 1, 2 }, - { ahd_patch0_func, 600, 1, 1 }, - { ahd_patch2_func, 615, 1, 2 }, - { ahd_patch0_func, 616, 1, 1 }, - { ahd_patch20_func, 617, 14, 1 }, - { ahd_patch1_func, 635, 1, 2 }, - { ahd_patch0_func, 636, 1, 1 }, - { ahd_patch20_func, 637, 1, 1 }, - { ahd_patch1_func, 649, 1, 2 }, - { ahd_patch0_func, 650, 1, 1 }, - { ahd_patch1_func, 657, 1, 2 }, - { ahd_patch0_func, 658, 1, 1 }, - { ahd_patch17_func, 681, 1, 1 }, - { ahd_patch17_func, 719, 1, 1 }, - { ahd_patch1_func, 730, 1, 2 }, - { ahd_patch0_func, 731, 1, 1 }, - { ahd_patch1_func, 748, 1, 2 }, - { ahd_patch0_func, 749, 1, 1 }, - { ahd_patch1_func, 751, 1, 2 }, - { ahd_patch0_func, 752, 1, 1 }, - { ahd_patch1_func, 755, 1, 2 }, - { ahd_patch0_func, 756, 1, 1 }, - { ahd_patch21_func, 758, 1, 2 }, - { ahd_patch0_func, 759, 2, 1 }, - { ahd_patch22_func, 762, 4, 2 }, - { ahd_patch0_func, 766, 1, 1 }, - { ahd_patch22_func, 774, 11, 1 } + { ahd_patch3_func, 36, 5, 1 }, + { ahd_patch2_func, 45, 1, 2 }, + { ahd_patch0_func, 46, 1, 1 }, + { ahd_patch1_func, 53, 1, 2 }, + { ahd_patch0_func, 54, 1, 1 }, + { ahd_patch2_func, 59, 1, 2 }, + { ahd_patch0_func, 60, 1, 1 }, + { ahd_patch2_func, 63, 1, 2 }, + { ahd_patch0_func, 64, 1, 1 }, + { ahd_patch2_func, 67, 1, 2 }, + { ahd_patch0_func, 68, 1, 1 }, + { ahd_patch4_func, 116, 1, 1 }, + { ahd_patch2_func, 175, 3, 1 }, + { ahd_patch1_func, 178, 2, 1 }, + { ahd_patch5_func, 180, 1, 1 }, + { ahd_patch2_func, 189, 1, 2 }, + { ahd_patch0_func, 190, 1, 1 }, + { ahd_patch6_func, 191, 2, 2 }, + { ahd_patch0_func, 193, 6, 3 }, + { ahd_patch2_func, 196, 1, 2 }, + { ahd_patch0_func, 197, 1, 1 }, + { ahd_patch2_func, 200, 1, 2 }, + { ahd_patch0_func, 201, 1, 1 }, + { ahd_patch3_func, 203, 1, 1 }, + { ahd_patch7_func, 204, 3, 1 }, + { ahd_patch3_func, 213, 1, 1 }, + { ahd_patch5_func, 214, 16, 2 }, + { ahd_patch0_func, 230, 1, 1 }, + { ahd_patch8_func, 250, 2, 1 }, + { ahd_patch1_func, 254, 1, 2 }, + { ahd_patch0_func, 255, 1, 1 }, + { ahd_patch7_func, 258, 3, 1 }, + { ahd_patch1_func, 273, 1, 2 }, + { ahd_patch0_func, 274, 1, 1 }, + { ahd_patch1_func, 277, 1, 2 }, + { ahd_patch0_func, 278, 1, 1 }, + { ahd_patch2_func, 281, 1, 2 }, + { ahd_patch0_func, 282, 1, 1 }, + { ahd_patch9_func, 295, 2, 2 }, + { ahd_patch0_func, 297, 1, 1 }, + { ahd_patch1_func, 339, 1, 2 }, + { ahd_patch0_func, 340, 1, 1 }, + { ahd_patch2_func, 348, 1, 2 }, + { ahd_patch0_func, 349, 1, 1 }, + { ahd_patch2_func, 352, 1, 2 }, + { ahd_patch0_func, 353, 1, 1 }, + { ahd_patch1_func, 359, 1, 2 }, + { ahd_patch0_func, 360, 1, 1 }, + { ahd_patch1_func, 362, 1, 2 }, + { ahd_patch0_func, 363, 1, 1 }, + { ahd_patch10_func, 382, 1, 1 }, + { ahd_patch10_func, 385, 1, 1 }, + { ahd_patch10_func, 387, 1, 1 }, + { ahd_patch10_func, 399, 1, 1 }, + { ahd_patch1_func, 409, 1, 2 }, + { ahd_patch0_func, 410, 1, 1 }, + { ahd_patch1_func, 412, 1, 2 }, + { ahd_patch0_func, 413, 1, 1 }, + { ahd_patch1_func, 421, 1, 2 }, + { ahd_patch0_func, 422, 1, 1 }, + { ahd_patch2_func, 435, 1, 2 }, + { ahd_patch0_func, 436, 1, 1 }, + { ahd_patch11_func, 472, 1, 1 }, + { ahd_patch1_func, 480, 1, 2 }, + { ahd_patch0_func, 481, 1, 1 }, + { ahd_patch2_func, 493, 1, 2 }, + { ahd_patch0_func, 494, 1, 1 }, + { ahd_patch12_func, 497, 6, 2 }, + { ahd_patch0_func, 503, 1, 1 }, + { ahd_patch13_func, 524, 7, 1 }, + { ahd_patch14_func, 533, 1, 1 }, + { ahd_patch15_func, 542, 1, 1 }, + { ahd_patch16_func, 543, 1, 2 }, + { ahd_patch0_func, 544, 1, 1 }, + { ahd_patch17_func, 547, 1, 1 }, + { ahd_patch16_func, 548, 1, 1 }, + { ahd_patch18_func, 559, 1, 2 }, + { ahd_patch0_func, 560, 1, 1 }, + { ahd_patch1_func, 579, 1, 2 }, + { ahd_patch0_func, 580, 1, 1 }, + { ahd_patch1_func, 583, 1, 2 }, + { ahd_patch0_func, 584, 1, 1 }, + { ahd_patch2_func, 589, 1, 2 }, + { ahd_patch0_func, 590, 1, 1 }, + { ahd_patch2_func, 594, 1, 2 }, + { ahd_patch0_func, 595, 1, 1 }, + { ahd_patch1_func, 596, 1, 2 }, + { ahd_patch0_func, 597, 1, 1 }, + { ahd_patch2_func, 608, 1, 2 }, + { ahd_patch0_func, 609, 1, 1 }, + { ahd_patch19_func, 613, 1, 1 }, + { ahd_patch20_func, 618, 1, 1 }, + { ahd_patch21_func, 619, 2, 1 }, + { ahd_patch20_func, 623, 1, 2 }, + { ahd_patch0_func, 624, 1, 1 }, + { ahd_patch2_func, 627, 1, 2 }, + { ahd_patch0_func, 628, 1, 1 }, + { ahd_patch2_func, 643, 1, 2 }, + { ahd_patch0_func, 644, 1, 1 }, + { ahd_patch13_func, 645, 14, 1 }, + { ahd_patch1_func, 663, 1, 2 }, + { ahd_patch0_func, 664, 1, 1 }, + { ahd_patch13_func, 665, 1, 1 }, + { ahd_patch1_func, 677, 1, 2 }, + { ahd_patch0_func, 678, 1, 1 }, + { ahd_patch1_func, 685, 1, 2 }, + { ahd_patch0_func, 686, 1, 1 }, + { ahd_patch19_func, 709, 1, 1 }, + { ahd_patch19_func, 747, 1, 1 }, + { ahd_patch1_func, 758, 1, 2 }, + { ahd_patch0_func, 759, 1, 1 }, + { ahd_patch1_func, 776, 1, 2 }, + { ahd_patch0_func, 777, 1, 1 }, + { ahd_patch1_func, 779, 1, 2 }, + { ahd_patch0_func, 780, 1, 1 }, + { ahd_patch1_func, 783, 1, 2 }, + { ahd_patch0_func, 784, 1, 1 }, + { ahd_patch22_func, 786, 1, 2 }, + { ahd_patch0_func, 787, 2, 1 }, + { ahd_patch23_func, 790, 4, 2 }, + { ahd_patch0_func, 794, 1, 1 }, + { ahd_patch23_func, 802, 11, 1 } }; static struct cs { uint16_t begin; uint16_t end; } critical_sections[] = { - { 11, 12 }, - { 13, 14 }, - { 29, 42 }, - { 56, 59 }, - { 101, 128 }, - { 129, 157 }, - { 159, 162 }, - { 170, 178 }, - { 201, 250 }, - { 681, 697 }, - { 697, 711 }, - { 721, 725 } + { 17, 28 }, + { 29, 30 }, + { 47, 58 }, + { 61, 63 }, + { 65, 66 }, + { 72, 92 }, + { 110, 137 }, + { 138, 175 }, + { 180, 188 }, + { 213, 264 }, + { 425, 433 }, + { 443, 445 }, + { 448, 457 }, + { 709, 739 }, + { 749, 753 } }; static const int num_critical_sections = sizeof(critical_sections) -- cgit v1.2.3 From cd2f1e6980157638f66f427d577a1c368fd4dc12 Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Thu, 12 Jan 2006 12:07:13 -0600 Subject: [SCSI] aic79xx: bump version to 3.0 This takes us past the old 1.x version of the SCSI driver and the 2.x version of the aic website version to reflect the full incorporation of both branches. Signed-off-by: James Bottomley --- drivers/scsi/aic7xxx/aic79xx_osm.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h index bc44222d6cc..cb74fccc810 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.h +++ b/drivers/scsi/aic7xxx/aic79xx_osm.h @@ -252,7 +252,7 @@ ahd_scb_timer_reset(struct scb *scb, u_int usec) /***************************** SMP support ************************************/ #include -#define AIC79XX_DRIVER_VERSION "1.3.11" +#define AIC79XX_DRIVER_VERSION "3.0" /*************************** Device Data Structures ***************************/ /* -- cgit v1.2.3 From 745caf71d99c5d4ff4c9e4c0f74e64c429fed531 Mon Sep 17 00:00:00 2001 From: Petr Vandrovec Date: Wed, 11 Jan 2006 11:31:07 -0800 Subject: [SCSI] Pass proper device from BusLogic to SCSI layer While trying to get SUSE's SLES9 working on system with more than 4GB we've noticed that SCSI layer happilly passes addresses over 4GB to the buslogic driver, which is quite a big problem as buslogic can generate only 32bit busmastering cycles. Fortunately in the current kernels this problem does not exist anymore as SCSI layer now assumes 4GB capable device by default, but it is still good idea to pass correct device structure to the SCSI layer. If nothing else, /sys/block/sda/device now points to /sys/devices/pci0000:00/0000:00:10.0/host0/... instead of /sys/devices/platform/host0/... like it did in the past. Change does nothing for ISA based BusLogic adapters, they'll still end under platform (and they are probably broken for long time as I do not see anything forcing ISA 16MB limit for them). Signed-off-by: Petr Vandrovec Signed-off-by: Andrew Morton Signed-off-by: James Bottomley --- drivers/scsi/BusLogic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index 9d6040bfa06..1c459343292 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -2216,6 +2216,7 @@ static int __init BusLogic_init(void) HostAdapter->PCI_Address = ProbeInfo->PCI_Address; HostAdapter->Bus = ProbeInfo->Bus; HostAdapter->Device = ProbeInfo->Device; + HostAdapter->PCI_Device = ProbeInfo->PCI_Device; HostAdapter->IRQ_Channel = ProbeInfo->IRQ_Channel; HostAdapter->AddressCount = BusLogic_HostAdapterAddressCount[HostAdapter->HostAdapterType]; /* @@ -2296,7 +2297,7 @@ static int __init BusLogic_init(void) scsi_host_put(Host); } else { BusLogic_InitializeHostStructure(HostAdapter, Host); - scsi_add_host(Host, NULL); + scsi_add_host(Host, HostAdapter->PCI_Device ? &HostAdapter->PCI_Device->dev : NULL); scsi_scan_host(Host); BusLogicHostAdapterCount++; } -- cgit v1.2.3 From bbbe3a41f7ee529f7f4fdcc1bc1157234bac0766 Mon Sep 17 00:00:00 2001 From: Russell King Date: Thu, 5 Jan 2006 14:44:46 +0000 Subject: [PATCH] Add Pseudo LLD bus_type probe and remove methods Signed-off-by: Russell King Signed-off-by: Greg Kroah-Hartman --- drivers/scsi/scsi_debug.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c index 3ded9daaf4a..0e529f8171c 100644 --- a/drivers/scsi/scsi_debug.c +++ b/drivers/scsi/scsi_debug.c @@ -221,8 +221,6 @@ static struct bus_type pseudo_lld_bus; static struct device_driver sdebug_driverfs_driver = { .name = sdebug_proc_name, .bus = &pseudo_lld_bus, - .probe = sdebug_driver_probe, - .remove = sdebug_driver_remove, }; static const int check_condition_result = @@ -1796,6 +1794,8 @@ static int pseudo_lld_bus_match(struct device *dev, static struct bus_type pseudo_lld_bus = { .name = "pseudo", .match = pseudo_lld_bus_match, + .probe = sdebug_driver_probe, + .remove = sdebug_driver_remove, }; static void sdebug_release_adapter(struct device * dev) -- cgit v1.2.3 From d4054239929479907f20b9d68c905589125ad343 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 4 Jan 2006 13:45:20 +0100 Subject: [SCSI] sas: fix removal of devices behind expanders We need to iterate over all children when removing and expander, else stale objects will be around after host removal. This fixes the oops Eric Moore saw when removing and reloading mptsas. Also don't try the scsi_remove_target call unless operating on an end device. The current unconditional call is harmless but confusing. Signed-off-by: Christoph Hellwig Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_sas.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 357b52f5f99..e950435a11d 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -687,7 +687,17 @@ sas_rphy_delete(struct sas_rphy *rphy) struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); - scsi_remove_target(dev); + switch (rphy->identify.device_type) { + case SAS_END_DEVICE: + scsi_remove_target(dev); + break; + case SAS_EDGE_EXPANDER_DEVICE: + case SAS_FANOUT_EXPANDER_DEVICE: + device_for_each_child(dev, NULL, do_sas_phy_delete); + break; + default: + break; + } transport_remove_device(dev); device_del(dev); -- cgit v1.2.3 From 776b23a0363d99ca402edc1aba1db8099b747b33 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Fri, 6 Jan 2006 18:34:07 +0100 Subject: [SCSI] always handle REQ_BLOCK_PC requests in common code LLDDs should never see REQ_BLOCK_PC requests, we can handle them just fine in the core code. There is a small behaviour change in that some check in sr's rw_intr are bypassed, but I consider the old behaviour a bug. Mike found this cleanup opportunity and provdided early patches, so all the credit goes to him, even if I redid the patches from scratch beause that was easier than forward-porting the old patches. Signed-off-by: Christoph Hellwig Signed-off-by: James Bottomley --- drivers/scsi/scsi_lib.c | 16 ++++++++-------- drivers/scsi/sd.c | 42 +++++------------------------------------- drivers/scsi/sr.c | 21 --------------------- drivers/scsi/st.c | 25 ------------------------- 4 files changed, 13 insertions(+), 91 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 00c9bf383e2..3574ba935af 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -1212,7 +1212,7 @@ static int scsi_issue_flush_fn(request_queue_t *q, struct gendisk *disk, return -EOPNOTSUPP; } -static void scsi_generic_done(struct scsi_cmnd *cmd) +static void scsi_blk_pc_done(struct scsi_cmnd *cmd) { BUG_ON(!blk_pc_request(cmd->request)); /* @@ -1224,7 +1224,7 @@ static void scsi_generic_done(struct scsi_cmnd *cmd) scsi_io_completion(cmd, cmd->bufflen, 0); } -void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) +static void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) { struct request *req = cmd->request; @@ -1241,8 +1241,8 @@ void scsi_setup_blk_pc_cmnd(struct scsi_cmnd *cmd) cmd->transfersize = req->data_len; cmd->allowed = req->retries; cmd->timeout_per_command = req->timeout; + cmd->done = scsi_blk_pc_done; } -EXPORT_SYMBOL_GPL(scsi_setup_blk_pc_cmnd); static int scsi_prep_fn(struct request_queue *q, struct request *req) { @@ -1339,7 +1339,6 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) * happening now. */ if (req->flags & (REQ_CMD | REQ_BLOCK_PC)) { - struct scsi_driver *drv; int ret; /* @@ -1371,16 +1370,17 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req) /* * Initialize the actual SCSI command for this request. */ - if (req->rq_disk) { + if (req->flags & REQ_BLOCK_PC) { + scsi_setup_blk_pc_cmnd(cmd); + } else if (req->rq_disk) { + struct scsi_driver *drv; + drv = *(struct scsi_driver **)req->rq_disk->private_data; if (unlikely(!drv->init_command(cmd))) { scsi_release_buffers(cmd); scsi_put_command(cmd); goto kill; } - } else { - scsi_setup_blk_pc_cmnd(cmd); - cmd->done = scsi_generic_done; } } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index fbd8e1bbad3..930db398d10 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -232,34 +232,12 @@ static void scsi_disk_put(struct scsi_disk *sdkp) **/ static int sd_init_command(struct scsi_cmnd * SCpnt) { - unsigned int this_count, timeout; - struct gendisk *disk; - sector_t block; struct scsi_device *sdp = SCpnt->device; struct request *rq = SCpnt->request; - - timeout = sdp->timeout; - - /* - * SG_IO from block layer already setup, just copy cdb basically - */ - if (blk_pc_request(rq)) { - scsi_setup_blk_pc_cmnd(SCpnt); - if (rq->timeout) - timeout = rq->timeout; - - goto queue; - } - - /* - * we only do REQ_CMD and REQ_BLOCK_PC - */ - if (!blk_fs_request(rq)) - return 0; - - disk = rq->rq_disk; - block = rq->sector; - this_count = SCpnt->request_bufflen >> 9; + struct gendisk *disk = rq->rq_disk; + sector_t block = rq->sector; + unsigned int this_count = SCpnt->request_bufflen >> 9; + unsigned int timeout = sdp->timeout; SCSI_LOG_HLQUEUE(1, printk("sd_init_command: disk=%s, block=%llu, " "count=%d\n", disk->disk_name, @@ -402,8 +380,6 @@ static int sd_init_command(struct scsi_cmnd * SCpnt) SCpnt->transfersize = sdp->sector_size; SCpnt->underflow = this_count << 9; SCpnt->allowed = SD_MAX_RETRIES; - -queue: SCpnt->timeout_per_command = timeout; /* @@ -837,15 +813,7 @@ static void sd_rw_intr(struct scsi_cmnd * SCpnt) relatively rare error condition, no care is taken to avoid unnecessary additional work such as memcpy's that could be avoided. */ - - /* - * If SG_IO from block layer then set good_bytes to stop retries; - * else if errors, check them, and if necessary prepare for - * (partial) retries. - */ - if (blk_pc_request(SCpnt->request)) - good_bytes = this_count; - else if (driver_byte(result) != 0 && + if (driver_byte(result) != 0 && sense_valid && !sense_deferred) { switch (sshdr.sense_key) { case MEDIUM_ERROR: diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 18a3b756c63..dd8050392d0 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -238,8 +238,6 @@ static void rw_intr(struct scsi_cmnd * SCpnt) case ILLEGAL_REQUEST: if (!(SCpnt->sense_buffer[0] & 0x90)) break; - if (!blk_fs_request(SCpnt->request)) - break; error_sector = (SCpnt->sense_buffer[3] << 24) | (SCpnt->sense_buffer[4] << 16) | (SCpnt->sense_buffer[5] << 8) | @@ -317,23 +315,6 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) return 0; } - /* - * these are already setup, just copy cdb basically - */ - if (SCpnt->request->flags & REQ_BLOCK_PC) { - scsi_setup_blk_pc_cmnd(SCpnt); - - if (SCpnt->timeout_per_command) - timeout = SCpnt->timeout_per_command; - - goto queue; - } - - if (!(SCpnt->request->flags & REQ_CMD)) { - blk_dump_rq_flags(SCpnt->request, "sr unsup command"); - return 0; - } - /* * we do lazy blocksize switching (when reading XA sectors, * see CDROMREADMODE2 ioctl) @@ -422,8 +403,6 @@ static int sr_init_command(struct scsi_cmnd * SCpnt) */ SCpnt->transfersize = cd->device->sector_size; SCpnt->underflow = this_count << 9; - -queue: SCpnt->allowed = MAX_RETRIES; SCpnt->timeout_per_command = timeout; diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c index 6e4a36af58c..13b1d3aac26 100644 --- a/drivers/scsi/st.c +++ b/drivers/scsi/st.c @@ -194,7 +194,6 @@ static int sgl_unmap_user_pages(struct scatterlist *, const unsigned int, int); static int st_probe(struct device *); static int st_remove(struct device *); -static int st_init_command(struct scsi_cmnd *); static void do_create_driverfs_files(void); static void do_remove_driverfs_files(void); @@ -207,7 +206,6 @@ static struct scsi_driver st_template = { .probe = st_probe, .remove = st_remove, }, - .init_command = st_init_command, }; static int st_compression(struct scsi_tape *, int); @@ -4181,29 +4179,6 @@ static void scsi_tape_release(struct kref *kref) return; } -static void st_intr(struct scsi_cmnd *SCpnt) -{ - /* - * The caller should be checking the request's errors - * value. - */ - scsi_io_completion(SCpnt, SCpnt->bufflen, 0); -} - -/* - * st_init_command: only called via the scsi_cmd_ioctl (block SG_IO) - * interface for REQ_BLOCK_PC commands. - */ -static int st_init_command(struct scsi_cmnd *SCpnt) -{ - if (!(SCpnt->request->flags & REQ_BLOCK_PC)) - return 0; - - scsi_setup_blk_pc_cmnd(SCpnt); - SCpnt->done = st_intr; - return 1; -} - static int __init init_st(void) { validate_options(); -- cgit v1.2.3 From a09c6311217e8fb079c967427d009fe23f2e420e Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 11 Jan 2006 14:28:06 +0100 Subject: [SCSI] sr: split sr_audio_ioctl into specific helpers split each ioctl handled in sr_audio_ioctl into a function of it's own. This cleans the code up nicely, and allows various places in sr_ioctl to call these helpers directly instead of going through the multiplexer. Signed-off-by: Christoph Hellwig Acked-by: Jens Axboe Signed-off-by: James Bottomley --- drivers/scsi/sr_ioctl.c | 202 ++++++++++++++++++++++++++---------------------- 1 file changed, 111 insertions(+), 91 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c index 6e45ac3c43c..5d02ff4db6c 100644 --- a/drivers/scsi/sr_ioctl.c +++ b/drivers/scsi/sr_ioctl.c @@ -31,6 +31,79 @@ static int xa_test = 0; module_param(xa_test, int, S_IRUGO | S_IWUSR); +/* primitive to determine whether we need to have GFP_DMA set based on + * the status of the unchecked_isa_dma flag in the host structure */ +#define SR_GFP_DMA(cd) (((cd)->device->host->unchecked_isa_dma) ? GFP_DMA : 0) + + +static int sr_read_tochdr(struct cdrom_device_info *cdi, + struct cdrom_tochdr *tochdr) +{ + struct scsi_cd *cd = cdi->handle; + struct packet_command cgc; + int result; + unsigned char *buffer; + + buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); + if (!buffer) + return -ENOMEM; + + memset(&cgc, 0, sizeof(struct packet_command)); + cgc.timeout = IOCTL_TIMEOUT; + cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; + cgc.cmd[8] = 12; /* LSB of length */ + cgc.buffer = buffer; + cgc.buflen = 12; + cgc.quiet = 1; + cgc.data_direction = DMA_FROM_DEVICE; + + result = sr_do_ioctl(cd, &cgc); + + tochdr->cdth_trk0 = buffer[2]; + tochdr->cdth_trk1 = buffer[3]; + + kfree(buffer); + return result; +} + +static int sr_read_tocentry(struct cdrom_device_info *cdi, + struct cdrom_tocentry *tocentry) +{ + struct scsi_cd *cd = cdi->handle; + struct packet_command cgc; + int result; + unsigned char *buffer; + + buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); + if (!buffer) + return -ENOMEM; + + memset(&cgc, 0, sizeof(struct packet_command)); + cgc.timeout = IOCTL_TIMEOUT; + cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; + cgc.cmd[1] |= (tocentry->cdte_format == CDROM_MSF) ? 0x02 : 0; + cgc.cmd[6] = tocentry->cdte_track; + cgc.cmd[8] = 12; /* LSB of length */ + cgc.buffer = buffer; + cgc.buflen = 12; + cgc.data_direction = DMA_FROM_DEVICE; + + result = sr_do_ioctl(cd, &cgc); + + tocentry->cdte_ctrl = buffer[5] & 0xf; + tocentry->cdte_adr = buffer[5] >> 4; + tocentry->cdte_datamode = (tocentry->cdte_ctrl & 0x04) ? 1 : 0; + if (tocentry->cdte_format == CDROM_MSF) { + tocentry->cdte_addr.msf.minute = buffer[9]; + tocentry->cdte_addr.msf.second = buffer[10]; + tocentry->cdte_addr.msf.frame = buffer[11]; + } else + tocentry->cdte_addr.lba = (((((buffer[8] << 8) + buffer[9]) << 8) + + buffer[10]) << 8) + buffer[11]; + + kfree(buffer); + return result; +} #define IOCTL_RETRIES 3 @@ -45,7 +118,8 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti struct packet_command cgc; int ntracks, ret; - if ((ret = sr_audio_ioctl(cdi, CDROMREADTOCHDR, &tochdr))) + ret = sr_read_tochdr(cdi, &tochdr); + if (ret) return ret; ntracks = tochdr.cdth_trk1 - tochdr.cdth_trk0 + 1; @@ -60,9 +134,11 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti trk1_te.cdte_track = ti->cdti_trk1; trk1_te.cdte_format = CDROM_MSF; - if ((ret = sr_audio_ioctl(cdi, CDROMREADTOCENTRY, &trk0_te))) + ret = sr_read_tocentry(cdi, &trk0_te); + if (ret) return ret; - if ((ret = sr_audio_ioctl(cdi, CDROMREADTOCENTRY, &trk1_te))) + ret = sr_read_tocentry(cdi, &trk1_te); + if (ret) return ret; memset(&cgc, 0, sizeof(struct packet_command)); @@ -78,6 +154,30 @@ static int sr_fake_playtrkind(struct cdrom_device_info *cdi, struct cdrom_ti *ti return sr_do_ioctl(cdi->handle, &cgc); } +static int sr_play_trkind(struct cdrom_device_info *cdi, + struct cdrom_ti *ti) + +{ + struct scsi_cd *cd = cdi->handle; + struct packet_command cgc; + int result; + + memset(&cgc, 0, sizeof(struct packet_command)); + cgc.timeout = IOCTL_TIMEOUT; + cgc.cmd[0] = GPCMD_PLAYAUDIO_TI; + cgc.cmd[4] = ti->cdti_trk0; + cgc.cmd[5] = ti->cdti_ind0; + cgc.cmd[7] = ti->cdti_trk1; + cgc.cmd[8] = ti->cdti_ind1; + cgc.data_direction = DMA_NONE; + + result = sr_do_ioctl(cd, &cgc); + if (result == -EDRIVE_CANT_DO_THIS) + result = sr_fake_playtrkind(cdi, ti); + + return result; +} + /* We do our own retries because we want to know what the specific error code is. Normally the UNIT_ATTENTION code will automatically clear after one error */ @@ -229,13 +329,14 @@ int sr_disk_status(struct cdrom_device_info *cdi) int i, rc, have_datatracks = 0; /* look for data tracks */ - if (0 != (rc = sr_audio_ioctl(cdi, CDROMREADTOCHDR, &toc_h))) + rc = sr_read_tochdr(cdi, &toc_h); + if (rc) return (rc == -ENOMEDIUM) ? CDS_NO_DISC : CDS_NO_INFO; for (i = toc_h.cdth_trk0; i <= toc_h.cdth_trk1; i++) { toc_e.cdte_track = i; toc_e.cdte_format = CDROM_LBA; - if (sr_audio_ioctl(cdi, CDROMREADTOCENTRY, &toc_e)) + if (sr_read_tocentry(cdi, &toc_e)) return CDS_NO_INFO; if (toc_e.cdte_ctrl & CDROM_DATA_TRACK) { have_datatracks = 1; @@ -262,10 +363,6 @@ int sr_get_last_session(struct cdrom_device_info *cdi, return 0; } -/* primitive to determine whether we need to have GFP_DMA set based on - * the status of the unchecked_isa_dma flag in the host structure */ -#define SR_GFP_DMA(cd) (((cd)->device->host->unchecked_isa_dma) ? GFP_DMA : 0) - int sr_get_mcn(struct cdrom_device_info *cdi, struct cdrom_mcn *mcn) { Scsi_CD *cd = cdi->handle; @@ -329,93 +426,16 @@ int sr_select_speed(struct cdrom_device_info *cdi, int speed) int sr_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, void *arg) { - Scsi_CD *cd = cdi->handle; - struct packet_command cgc; - int result; - unsigned char *buffer = kmalloc(32, GFP_KERNEL | SR_GFP_DMA(cd)); - - if (!buffer) - return -ENOMEM; - - memset(&cgc, 0, sizeof(struct packet_command)); - cgc.timeout = IOCTL_TIMEOUT; - switch (cmd) { case CDROMREADTOCHDR: - { - struct cdrom_tochdr *tochdr = (struct cdrom_tochdr *) arg; - - cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; - cgc.cmd[8] = 12; /* LSB of length */ - cgc.buffer = buffer; - cgc.buflen = 12; - cgc.quiet = 1; - cgc.data_direction = DMA_FROM_DEVICE; - - result = sr_do_ioctl(cd, &cgc); - - tochdr->cdth_trk0 = buffer[2]; - tochdr->cdth_trk1 = buffer[3]; - - break; - } - + return sr_read_tochdr(cdi, arg); case CDROMREADTOCENTRY: - { - struct cdrom_tocentry *tocentry = (struct cdrom_tocentry *) arg; - - cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; - cgc.cmd[1] |= (tocentry->cdte_format == CDROM_MSF) ? 0x02 : 0; - cgc.cmd[6] = tocentry->cdte_track; - cgc.cmd[8] = 12; /* LSB of length */ - cgc.buffer = buffer; - cgc.buflen = 12; - cgc.data_direction = DMA_FROM_DEVICE; - - result = sr_do_ioctl(cd, &cgc); - - tocentry->cdte_ctrl = buffer[5] & 0xf; - tocentry->cdte_adr = buffer[5] >> 4; - tocentry->cdte_datamode = (tocentry->cdte_ctrl & 0x04) ? 1 : 0; - if (tocentry->cdte_format == CDROM_MSF) { - tocentry->cdte_addr.msf.minute = buffer[9]; - tocentry->cdte_addr.msf.second = buffer[10]; - tocentry->cdte_addr.msf.frame = buffer[11]; - } else - tocentry->cdte_addr.lba = (((((buffer[8] << 8) + buffer[9]) << 8) - + buffer[10]) << 8) + buffer[11]; - - break; - } - - case CDROMPLAYTRKIND: { - struct cdrom_ti* ti = (struct cdrom_ti*)arg; - - cgc.cmd[0] = GPCMD_PLAYAUDIO_TI; - cgc.cmd[4] = ti->cdti_trk0; - cgc.cmd[5] = ti->cdti_ind0; - cgc.cmd[7] = ti->cdti_trk1; - cgc.cmd[8] = ti->cdti_ind1; - cgc.data_direction = DMA_NONE; - - result = sr_do_ioctl(cd, &cgc); - if (result == -EDRIVE_CANT_DO_THIS) - result = sr_fake_playtrkind(cdi, ti); - - break; - } - + return sr_read_tocentry(cdi, arg); + case CDROMPLAYTRKIND: + return sr_play_trkind(cdi, arg); default: - result = -EINVAL; + return -EINVAL; } - -#if 0 - if (result) - printk("DEBUG: sr_audio: result for ioctl %x: %x\n", cmd, result); -#endif - - kfree(buffer); - return result; } /* ----------------------------------------------------------------------- -- cgit v1.2.3 From 6b7281d0a0f8f99d39808088a036459f6f7906a6 Mon Sep 17 00:00:00 2001 From: Andreas Herrmann Date: Fri, 13 Jan 2006 02:16:54 +0100 Subject: [SCSI] fc transport: add permanent_port_name fc_host attribute Add fc_host attribute permanent_port_name which is used to show the port name of the primary port - the port that initially logged into the fabric. For a virtual port (registered via the primary port with FDISC command) it is useful to know not only its (virtual) port name but also the permanent port name. Signed-off-by: Andreas Herrmann Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_fc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 685b997306c..625f4a664d0 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -295,6 +295,7 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, */ fc_host_node_name(shost) = -1; fc_host_port_name(shost) = -1; + fc_host_permanent_port_name(shost) = -1; fc_host_supported_classes(shost) = FC_COS_UNSPECIFIED; memset(fc_host_supported_fc4s(shost), 0, sizeof(fc_host_supported_fc4s(shost))); @@ -795,6 +796,8 @@ static FC_CLASS_DEVICE_ATTR(host, supported_speeds, S_IRUGO, fc_private_host_rd_attr_cast(node_name, "0x%llx\n", 20, unsigned long long); fc_private_host_rd_attr_cast(port_name, "0x%llx\n", 20, unsigned long long); +fc_private_host_rd_attr_cast(permanent_port_name, "0x%llx\n", 20, + unsigned long long); fc_private_host_rd_attr(symbolic_name, "%s\n", (FC_SYMBOLIC_NAME_SIZE +1)); fc_private_host_rd_attr(maxframe_size, "%u bytes\n", 20); fc_private_host_rd_attr(serial_number, "%s\n", (FC_SERIAL_NUMBER_SIZE +1)); @@ -1160,6 +1163,7 @@ fc_attach_transport(struct fc_function_template *ft) count=0; SETUP_HOST_ATTRIBUTE_RD(node_name); SETUP_HOST_ATTRIBUTE_RD(port_name); + SETUP_HOST_ATTRIBUTE_RD(permanent_port_name); SETUP_HOST_ATTRIBUTE_RD(supported_classes); SETUP_HOST_ATTRIBUTE_RD(supported_fc4s); SETUP_HOST_ATTRIBUTE_RD(symbolic_name); -- cgit v1.2.3 From 560c26c8345509619c3575331b99b329b5de1054 Mon Sep 17 00:00:00 2001 From: Jack Hammer Date: Fri, 13 Jan 2006 10:06:50 -0500 Subject: [SCSI] ips: Mode Sense (Caching Page ) fix To avoid the "sda: got wrong page" message, the ServeRAID driver should be setting flags indicating that the Mode Sense commands are not supported. Signed-off-by: Jack Hammer Signed-off-by: James Bottomley --- drivers/scsi/ips.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 3882d48a42b..e5e1ca44e1e 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c @@ -1319,6 +1319,9 @@ ips_slave_configure(struct scsi_device * SDptr) min = ha->max_cmds - 1; scsi_adjust_queue_depth(SDptr, MSG_ORDERED_TAG, min); } + + SDptr->skip_ms_page_8 = 1; + SDptr->skip_ms_page_3f = 1; return 0; } #endif -- cgit v1.2.3 From 9638d89a75776abc614c29cdeece0cc874ea2a4c Mon Sep 17 00:00:00 2001 From: "Salyzyn, Mark" Date: Thu, 12 Jan 2006 08:31:57 -0500 Subject: [SCSI] I2O: move pci_request_regions() just behind pci_enable_device() The problem in dpt_i2o could be the pci config space accesses it triggers as it loads, dangerous to do if there is any I/O activity going on in the other driver (probable if a boot driver I guess). I approve this patch to dpt_i2o.c, and am applying it to the Adaptec branch of the driver. Thanks for the investigation Ryoji. --- In linux 2.6.15, data transfer does hang when both dpt_i2o and i2o_block drivers are loaded. It seems that location of pci_request_regions() are wrong. I moved it just behind pci_enable_device() like other drivers, and it becomes fine. Signed-off-by: Ryoji Kamei Signed-off-by: James Bottomley --- drivers/scsi/dpt_i2o.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index cdeb30b0462..6e6b293dcb2 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c @@ -899,6 +899,12 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev if(pci_enable_device(pDev)) { return -EINVAL; } + + if (pci_request_regions(pDev, "dpt_i2o")) { + PERROR("dpti: adpt_config_hba: pci request region failed\n"); + return -EINVAL; + } + pci_set_master(pDev); if (pci_set_dma_mask(pDev, 0xffffffffffffffffULL) && pci_set_dma_mask(pDev, 0xffffffffULL)) @@ -924,10 +930,6 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev raptorFlag = TRUE; } - if (pci_request_regions(pDev, "dpt_i2o")) { - PERROR("dpti: adpt_config_hba: pci request region failed\n"); - return -EINVAL; - } base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size); if (!base_addr_virt) { pci_release_regions(pDev); -- cgit v1.2.3 From d158d26167a3f6a910ec3e0eda23cc0cd437c689 Mon Sep 17 00:00:00 2001 From: Jes Sorensen Date: Fri, 13 Jan 2006 16:05:44 -0800 Subject: [SCSI] sem2mutex: scsi_transport_spi.c Convert the SCSI transport class code to use a mutex rather than a semaphore. Signed-off-by: Jes Sorensen Signed-off-by: Ingo Molnar Signed-off-by: Andrew Morton Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_spi.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c index 86306d681b6..7ee95eb83dd 100644 --- a/drivers/scsi/scsi_transport_spi.c +++ b/drivers/scsi/scsi_transport_spi.c @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include "scsi_priv.h" #include @@ -48,7 +48,7 @@ /* Private data accessors (keep these out of the header file) */ #define spi_dv_pending(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_pending) -#define spi_dv_sem(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_sem) +#define spi_dv_mutex(x) (((struct spi_transport_attrs *)&(x)->starget_data)->dv_mutex) struct spi_internal { struct scsi_transport_template t; @@ -242,7 +242,7 @@ static int spi_setup_transport_attrs(struct transport_container *tc, spi_hold_mcs(starget) = 0; spi_dv_pending(starget) = 0; spi_initial_dv(starget) = 0; - init_MUTEX(&spi_dv_sem(starget)); + mutex_init(&spi_dv_mutex(starget)); return 0; } @@ -915,7 +915,7 @@ spi_dv_device(struct scsi_device *sdev) scsi_target_quiesce(starget); spi_dv_pending(starget) = 1; - down(&spi_dv_sem(starget)); + mutex_lock(&spi_dv_mutex(starget)); starget_printk(KERN_INFO, starget, "Beginning Domain Validation\n"); @@ -923,7 +923,7 @@ spi_dv_device(struct scsi_device *sdev) starget_printk(KERN_INFO, starget, "Ending Domain Validation\n"); - up(&spi_dv_sem(starget)); + mutex_unlock(&spi_dv_mutex(starget)); spi_dv_pending(starget) = 0; scsi_target_resume(starget); -- cgit v1.2.3 From e02f3f59225d8c3b2a0ad0dc941a09865e27da61 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Fri, 13 Jan 2006 19:04:00 +0100 Subject: [SCSI] remove target parent limitiation When James Smart fixed the issue of the userspace scan atributes crashing the system with the FC transport class he added a patch to let the transport class check if the parent is valid for a given transport class. When adding support for the integrated raid of fusion sas devices we ran into a problem with that, as it didn't allow adding virtual raid volumes without the transport class knowing about it. So this patch adds a user_scan attribute instead, that takes over from scsi_scan_host_selected if the transport class sets it and thus lets the transport class control the user-initiated scanning. As this plugs the hole about user-initiated scanning the target_parent hook goes away and we rely on callers of the scanning routines to do something sensible. For SAS this meant I had to switch from a spinlock to a mutex to synchronize the topology linked lists, in FC they were completely unsynchronized which seems wrong. Signed-off-by: Christoph Hellwig Signed-off-by: James Bottomley --- drivers/scsi/scsi_priv.h | 6 ------ drivers/scsi/scsi_proc.c | 6 +++++- drivers/scsi/scsi_scan.c | 16 ++------------- drivers/scsi/scsi_sysfs.c | 5 ++++- drivers/scsi/scsi_transport_fc.c | 22 ++++++++++++-------- drivers/scsi/scsi_transport_sas.c | 42 ++++++++++++++++++++++----------------- 6 files changed, 49 insertions(+), 48 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h index 14a6198cb8d..27c48274e8c 100644 --- a/drivers/scsi/scsi_priv.h +++ b/drivers/scsi/scsi_priv.h @@ -26,12 +26,6 @@ struct Scsi_Host; #define SCSI_SENSE_VALID(scmd) \ (((scmd)->sense_buffer[0] & 0x70) == 0x70) -/* - * Special value for scanning to specify scanning or rescanning of all - * possible channels, (target) ids, or luns on a given shost. - */ -#define SCAN_WILD_CARD ~0 - /* hosts.c */ extern int scsi_init_hosts(void); extern void scsi_exit_hosts(void); diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c index 1b5711e714a..07be62bbaae 100644 --- a/drivers/scsi/scsi_proc.c +++ b/drivers/scsi/scsi_proc.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "scsi_priv.h" #include "scsi_logging.h" @@ -200,7 +201,10 @@ static int scsi_add_single_device(uint host, uint channel, uint id, uint lun) if (IS_ERR(shost)) return PTR_ERR(shost); - error = scsi_scan_host_selected(shost, channel, id, lun, 1); + if (shost->transportt->user_scan) + error = shost->transportt->user_scan(shost, channel, id, lun); + else + error = scsi_scan_host_selected(shost, channel, id, lun, 1); scsi_host_put(shost); return error; } diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index edcd80b749c..752fb5da3de 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c @@ -334,19 +334,6 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, struct scsi_target *starget; struct scsi_target *found_target; - /* - * Obtain the real parent from the transport. The transport - * is allowed to fail (no error) if there is nothing at that - * target id. - */ - if (shost->transportt->target_parent) { - spin_lock_irqsave(shost->host_lock, flags); - parent = shost->transportt->target_parent(shost, channel, id); - spin_unlock_irqrestore(shost->host_lock, flags); - if (!parent) - return NULL; - } - starget = kmalloc(size, GFP_KERNEL); if (!starget) { printk(KERN_ERR "%s: allocation failure\n", __FUNCTION__); @@ -1283,8 +1270,9 @@ struct scsi_device *__scsi_add_device(struct Scsi_Host *shost, uint channel, struct scsi_device *sdev; struct device *parent = &shost->shost_gendev; int res; - struct scsi_target *starget = scsi_alloc_target(parent, channel, id); + struct scsi_target *starget; + starget = scsi_alloc_target(parent, channel, id); if (!starget) return ERR_PTR(-ENOMEM); diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 2cb962751a7..a77b32deaf8 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -106,7 +106,10 @@ static int scsi_scan(struct Scsi_Host *shost, const char *str) return -EINVAL; if (check_set(&lun, s3)) return -EINVAL; - res = scsi_scan_host_selected(shost, channel, id, lun, 1); + if (shost->transportt->user_scan) + res = shost->transportt->user_scan(shost, channel, id, lun); + else + res = scsi_scan_host_selected(shost, channel, id, lun, 1); return res; } diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 625f4a664d0..f2c9acf11bd 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -1093,17 +1093,23 @@ static int fc_rport_match(struct attribute_container *cont, /* * Must be called with shost->host_lock held */ -static struct device *fc_target_parent(struct Scsi_Host *shost, - int channel, uint id) +static int fc_user_scan(struct Scsi_Host *shost, uint channel, + uint id, uint lun) { struct fc_rport *rport; - list_for_each_entry(rport, &fc_host_rports(shost), peers) - if ((rport->channel == channel) && - (rport->scsi_target_id == id)) - return &rport->dev; + list_for_each_entry(rport, &fc_host_rports(shost), peers) { + if (rport->scsi_target_id == -1) + continue; - return NULL; + if ((channel == SCAN_WILD_CARD || channel == rport->channel) && + (id == SCAN_WILD_CARD || id == rport->scsi_target_id)) { + scsi_scan_target(&rport->dev, rport->channel, + rport->scsi_target_id, lun, 1); + } + } + + return 0; } struct scsi_transport_template * @@ -1142,7 +1148,7 @@ fc_attach_transport(struct fc_function_template *ft) /* Transport uses the shost workq for scsi scanning */ i->t.create_work_queue = 1; - i->t.target_parent = fc_target_parent; + i->t.user_scan = fc_user_scan; /* * Setup SCSI Target Attributes. diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index e950435a11d..fb6641b42df 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -62,7 +63,7 @@ struct sas_internal { struct sas_host_attrs { struct list_head rphy_list; - spinlock_t lock; + struct mutex lock; u32 next_target_id; }; #define to_sas_host_attrs(host) ((struct sas_host_attrs *)(host)->shost_data) @@ -165,7 +166,7 @@ static int sas_host_setup(struct transport_container *tc, struct device *dev, struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); INIT_LIST_HEAD(&sas_host->rphy_list); - spin_lock_init(&sas_host->lock); + mutex_init(&sas_host->lock); sas_host->next_target_id = 0; return 0; } @@ -626,7 +627,7 @@ int sas_rphy_add(struct sas_rphy *rphy) transport_add_device(&rphy->dev); transport_configure_device(&rphy->dev); - spin_lock(&sas_host->lock); + mutex_lock(&sas_host->lock); list_add_tail(&rphy->list, &sas_host->rphy_list); if (identify->device_type == SAS_END_DEVICE && (identify->target_port_protocols & @@ -634,7 +635,7 @@ int sas_rphy_add(struct sas_rphy *rphy) rphy->scsi_target_id = sas_host->next_target_id++; else rphy->scsi_target_id = -1; - spin_unlock(&sas_host->lock); + mutex_unlock(&sas_host->lock); if (rphy->scsi_target_id != -1) { scsi_scan_target(&rphy->dev, parent->number, @@ -661,9 +662,9 @@ void sas_rphy_free(struct sas_rphy *rphy) struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); - spin_lock(&sas_host->lock); + mutex_lock(&sas_host->lock); list_del(&rphy->list); - spin_unlock(&sas_host->lock); + mutex_unlock(&sas_host->lock); transport_destroy_device(&rphy->dev); put_device(rphy->dev.parent); @@ -703,9 +704,9 @@ sas_rphy_delete(struct sas_rphy *rphy) device_del(dev); transport_destroy_device(dev); - spin_lock(&sas_host->lock); + mutex_lock(&sas_host->lock); list_del(&rphy->list); - spin_unlock(&sas_host->lock); + mutex_unlock(&sas_host->lock); parent->rphy = NULL; @@ -731,23 +732,28 @@ EXPORT_SYMBOL(scsi_is_sas_rphy); * SCSI scan helper */ -static struct device *sas_target_parent(struct Scsi_Host *shost, - int channel, uint id) +static int sas_user_scan(struct Scsi_Host *shost, uint channel, + uint id, uint lun) { struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); struct sas_rphy *rphy; - struct device *dev = NULL; - spin_lock(&sas_host->lock); + mutex_lock(&sas_host->lock); list_for_each_entry(rphy, &sas_host->rphy_list, list) { struct sas_phy *parent = dev_to_phy(rphy->dev.parent); - if (parent->number == channel && - rphy->scsi_target_id == id) - dev = &rphy->dev; + + if (rphy->scsi_target_id == -1) + continue; + + if ((channel == SCAN_WILD_CARD || channel == parent->number) && + (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) { + scsi_scan_target(&rphy->dev, parent->number, + rphy->scsi_target_id, lun, 1); + } } - spin_unlock(&sas_host->lock); + mutex_unlock(&sas_host->lock); - return dev; + return 0; } @@ -792,7 +798,7 @@ sas_attach_transport(struct sas_function_template *ft) return NULL; memset(i, 0, sizeof(struct sas_internal)); - i->t.target_parent = sas_target_parent; + i->t.user_scan = sas_user_scan; i->t.host_attrs.ac.attrs = &i->host_attrs[0]; i->t.host_attrs.ac.class = &sas_host_class.class; -- cgit v1.2.3 From e6bc863cf25f30ed8e2a4d41b76d5688f8efaee9 Mon Sep 17 00:00:00 2001 From: "Moore, Eric" Date: Fri, 13 Jan 2006 16:33:59 -0700 Subject: [SCSI] scsi_transport_sas: mapping the rphy channel equal to the port identifier We will be mapping the RAID volumes in mptsas to a reserved channel that is one larger than the anticapated number of ports on the direct attached host adapter. Signed-off-by: Eric Moore Signed-off-by: James Bottomley --- drivers/scsi/scsi_transport_sas.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index fb6641b42df..a3e0b7bc2d7 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c @@ -638,7 +638,7 @@ int sas_rphy_add(struct sas_rphy *rphy) mutex_unlock(&sas_host->lock); if (rphy->scsi_target_id != -1) { - scsi_scan_target(&rphy->dev, parent->number, + scsi_scan_target(&rphy->dev, parent->port_identifier, rphy->scsi_target_id, ~0, 0); } @@ -745,9 +745,9 @@ static int sas_user_scan(struct Scsi_Host *shost, uint channel, if (rphy->scsi_target_id == -1) continue; - if ((channel == SCAN_WILD_CARD || channel == parent->number) && + if ((channel == SCAN_WILD_CARD || channel == parent->port_identifier) && (id == SCAN_WILD_CARD || id == rphy->scsi_target_id)) { - scsi_scan_target(&rphy->dev, parent->number, + scsi_scan_target(&rphy->dev, parent->port_identifier, rphy->scsi_target_id, lun, 1); } } -- cgit v1.2.3 From a12e25bd59e36d12dcd026ffa3c65d48b5cf5442 Mon Sep 17 00:00:00 2001 From: Jes Sorensen Date: Wed, 11 Jan 2006 08:39:45 -0500 Subject: [SCSI] sem2mutex 3w-[x9]xxx Convert a the 3w-9xxx.c and 3w-xxxx.c drivers to use mutexes instead of semaphores. Untested, but compiles and looks obviously correct. Signed-off-by: Jes Sorensen Signed-off-by: James Bottomley --- drivers/scsi/3w-9xxx.c | 7 ++++--- drivers/scsi/3w-9xxx.h | 2 +- drivers/scsi/3w-xxxx.c | 7 ++++--- drivers/scsi/3w-xxxx.h | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 3ff74f47224..31c49754227 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -615,7 +616,7 @@ static int twa_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int void __user *argp = (void __user *)arg; /* Only let one of these through at a time */ - if (down_interruptible(&tw_dev->ioctl_sem)) { + if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) { retval = TW_IOCTL_ERROR_OS_EINTR; goto out; } @@ -852,7 +853,7 @@ out3: /* Now free ioctl buf memory */ dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_Ioctl_Buf_Apache) - 1, cpu_addr, dma_handle); out2: - up(&tw_dev->ioctl_sem); + mutex_unlock(&tw_dev->ioctl_lock); out: return retval; } /* End twa_chrdev_ioctl() */ @@ -1182,7 +1183,7 @@ static int twa_initialize_device_extension(TW_Device_Extension *tw_dev) tw_dev->error_sequence_id = 1; tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; - init_MUTEX(&tw_dev->ioctl_sem); + mutex_init(&tw_dev->ioctl_lock); init_waitqueue_head(&tw_dev->ioctl_wqueue); retval = 0; diff --git a/drivers/scsi/3w-9xxx.h b/drivers/scsi/3w-9xxx.h index 46f22cdc829..1b16d57f031 100644 --- a/drivers/scsi/3w-9xxx.h +++ b/drivers/scsi/3w-9xxx.h @@ -672,7 +672,7 @@ typedef struct TAG_TW_Device_Extension { u32 ioctl_msec; int chrdev_request_id; wait_queue_head_t ioctl_wqueue; - struct semaphore ioctl_sem; + struct mutex ioctl_lock; char aen_clobber; unsigned short working_srl; unsigned short working_branch; diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c index 283f6d25892..25f678d0780 100644 --- a/drivers/scsi/3w-xxxx.c +++ b/drivers/scsi/3w-xxxx.c @@ -203,6 +203,7 @@ #include #include #include +#include #include #include #include @@ -888,7 +889,7 @@ static int tw_chrdev_ioctl(struct inode *inode, struct file *file, unsigned int dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl()\n"); /* Only let one of these through at a time */ - if (down_interruptible(&tw_dev->ioctl_sem)) + if (mutex_lock_interruptible(&tw_dev->ioctl_lock)) return -EINTR; /* First copy down the buffer length */ @@ -1029,7 +1030,7 @@ out2: /* Now free ioctl buf memory */ dma_free_coherent(&tw_dev->tw_pci_dev->dev, data_buffer_length_adjusted+sizeof(TW_New_Ioctl) - 1, cpu_addr, dma_handle); out: - up(&tw_dev->ioctl_sem); + mutex_unlock(&tw_dev->ioctl_lock); return retval; } /* End tw_chrdev_ioctl() */ @@ -1270,7 +1271,7 @@ static int tw_initialize_device_extension(TW_Device_Extension *tw_dev) tw_dev->pending_tail = TW_Q_START; tw_dev->chrdev_request_id = TW_IOCTL_CHRDEV_FREE; - init_MUTEX(&tw_dev->ioctl_sem); + mutex_init(&tw_dev->ioctl_lock); init_waitqueue_head(&tw_dev->ioctl_wqueue); return 0; diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h index 4f81fc39ec5..31fe5ea1592 100644 --- a/drivers/scsi/3w-xxxx.h +++ b/drivers/scsi/3w-xxxx.h @@ -420,7 +420,7 @@ typedef struct TAG_TW_Device_Extension { u32 max_sector_count; u32 aen_count; struct Scsi_Host *host; - struct semaphore ioctl_sem; + struct mutex ioctl_lock; unsigned short aen_queue[TW_Q_LENGTH]; unsigned char aen_head; unsigned char aen_tail; -- cgit v1.2.3 From 42f72aa9e5bc969a34e5989fc00e7e2d71e8a95b Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Fri, 13 Jan 2006 18:05:35 -0600 Subject: [SCSI] iscsi: whitespace cleanup Remove extra whitespaces. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 1067d77da10..49d6dd5572c 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -687,7 +687,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) switch(conn->in.opcode) { case ISCSI_OP_LOGIN_RSP: case ISCSI_OP_TEXT_RSP: - case ISCSI_OP_LOGOUT_RSP: + case ISCSI_OP_LOGOUT_RSP: rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)hdr); if (rc) @@ -728,12 +728,12 @@ iscsi_hdr_recv(struct iscsi_conn *conn) } spin_unlock(&session->lock); break; - case ISCSI_OP_NOOP_IN: + case ISCSI_OP_NOOP_IN: if (hdr->ttt != ISCSI_RESERVED_TAG) { rc = ISCSI_ERR_PROTO; break; } - rc = iscsi_check_assign_cmdsn(session, + rc = iscsi_check_assign_cmdsn(session, (struct iscsi_nopin*)hdr); if (rc) break; @@ -768,7 +768,7 @@ iscsi_hdr_recv(struct iscsi_conn *conn) if (!rc && hdr->ttt != ISCSI_RESERVED_TAG) rc = iscsi_recv_pdu(iscsi_handle(conn), hdr, NULL, 0); - } else + } else rc = ISCSI_ERR_PROTO; break; case ISCSI_OP_REJECT: @@ -930,7 +930,7 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) sc->request_bufflen, ctask->data_offset); if (rc == -EAGAIN) return rc; - if (conn->datadgst_en) + if (conn->datadgst_en) iscsi_recv_digest_update(conn, sc->request_buffer, i); rc = 0; goto done; @@ -1025,7 +1025,7 @@ iscsi_data_recv(struct iscsi_conn *conn) conn->in.hdr = &conn->hdr; conn->senselen = (conn->data[0] << 8) | conn->data[1]; rc = iscsi_cmd_rsp(conn, conn->in.ctask); - if (!rc && conn->datadgst_en) + if (!rc && conn->datadgst_en) iscsi_recv_digest_update(conn, conn->data, conn->in.datalen); } @@ -1052,7 +1052,7 @@ iscsi_data_recv(struct iscsi_conn *conn) rc = iscsi_recv_pdu(iscsi_handle(conn), conn->in.hdr, conn->data, conn->in.datalen); - if (!rc && conn->datadgst_en && + if (!rc && conn->datadgst_en && conn->in.opcode != ISCSI_OP_LOGIN_RSP) iscsi_recv_digest_update(conn, conn->data, conn->in.datalen); @@ -1681,7 +1681,7 @@ iscsi_cmd_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, zero_data(ctask->hdr.dlength); } - iscsi_buf_init_virt(&ctask->headbuf, (char*)&ctask->hdr, + iscsi_buf_init_virt(&ctask->headbuf, (char*)&ctask->hdr, sizeof(struct iscsi_hdr)); conn->scsicmd_pdus_cnt++; } @@ -1747,7 +1747,7 @@ static inline int handle_xmstate_r_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { ctask->xmstate &= ~XMSTATE_R_HDR; - if (conn->hdrdgst_en) + if (conn->hdrdgst_en) iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext); if (!iscsi_sendhdr(conn, &ctask->headbuf, 0)) { BUG_ON(ctask->xmstate != XMSTATE_IDLE); @@ -1761,7 +1761,7 @@ static inline int handle_xmstate_w_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) { ctask->xmstate &= ~XMSTATE_W_HDR; - if (conn->hdrdgst_en) + if (conn->hdrdgst_en) iscsi_hdr_digest(conn, &ctask->headbuf, (u8*)ctask->hdrext); if (iscsi_sendhdr(conn, &ctask->headbuf, ctask->imm_count)) { ctask->xmstate |= XMSTATE_W_HDR; @@ -2149,7 +2149,7 @@ unsolicit_head_again: solicit_head_again: r2t = ctask->r2t; if (conn->hdrdgst_en) - iscsi_hdr_digest(conn, &r2t->headbuf, + iscsi_hdr_digest(conn, &r2t->headbuf, (u8*)r2t->dtask->hdrext); if (iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count)) { ctask->xmstate &= ~XMSTATE_SOL_DATA; -- cgit v1.2.3 From bf310b8f582bddec20c27e32ffbaf8e2c91e147c Mon Sep 17 00:00:00 2001 From: "zhenyu.z.wang@intel.com" Date: Fri, 13 Jan 2006 18:05:38 -0600 Subject: [SCSI] iscsi: data under/over flow fix We need to check the ISCSI_FLAG_DATA_* flags. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 49d6dd5572c..550ff66ba9e 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -357,7 +357,7 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) struct scsi_cmnd *sc = ctask->sc; conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1; - if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) { + if (rhdr->flags & ISCSI_FLAG_DATA_UNDERFLOW) { int res_count = be32_to_cpu(rhdr->residual_count); if (res_count > 0 && @@ -367,9 +367,7 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } else sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - } else if (rhdr->flags & ISCSI_FLAG_CMD_BIDI_UNDERFLOW) - sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status; - else if (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW) { + } else if (rhdr->flags & ISCSI_FLAG_DATA_OVERFLOW) { sc->resid = be32_to_cpu(rhdr->residual_count); sc->result = (DID_OK << 16) | rhdr->cmd_status; } else -- cgit v1.2.3 From 3e97c7e6cda933e3a1b518a8100d155c532a3cfc Mon Sep 17 00:00:00 2001 From: "zhenyu.z.wang@intel.com" Date: Fri, 13 Jan 2006 18:05:41 -0600 Subject: [SCSI] iscsi: host locking fix We should be taking the host_lock instead of the conn lock when checking host_busy. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 550ff66ba9e..cd1491e5236 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -2559,6 +2559,7 @@ iscsi_conn_destroy(iscsi_connh_t connh) { struct iscsi_conn *conn = iscsi_ptr(connh); struct iscsi_session *session = conn->session; + unsigned long flags; mutex_lock(&conn->xmitmutex); set_bit(SUSPEND_BIT, &conn->suspend_tx); @@ -2598,12 +2599,12 @@ iscsi_conn_destroy(iscsi_connh_t connh) * time out or fail. */ for (;;) { - spin_lock_bh(&conn->lock); + spin_lock_irqsave(session->host->host_lock, flags); if (!session->host->host_busy) { /* OK for ERL == 0 */ - spin_unlock_bh(&conn->lock); + spin_unlock_irqrestore(session->host->host_lock, flags); break; } - spin_unlock_bh(&conn->lock); + spin_unlock_irqrestore(session->host->host_lock, flags); msleep_interruptible(500); printk("conn_destroy(): host_busy %d host_failed %d\n", session->host->host_busy, session->host->host_failed); -- cgit v1.2.3 From 56851698c23430f0f291d6e50da344e6b414f3b9 Mon Sep 17 00:00:00 2001 From: FUJITA Tomonori Date: Fri, 13 Jan 2006 18:05:44 -0600 Subject: [SCSI] iscsi: data digest page cache usage fix Users can write to a page while we are sending it and making digest calculations. This ends up causing us to retry the command when a digest error is later reported. By using sock_no_sendpage when data digests are calculated we can avoid a lot of (not all but it helps) the retries becuase sock_no_sendpage is not zero copy. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 16 +++++++++------- drivers/scsi/iscsi_tcp.h | 2 ++ 2 files changed, 11 insertions(+), 7 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index cd1491e5236..5e8b3135574 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -1318,15 +1318,15 @@ iscsi_conn_restore_callbacks(struct iscsi_conn *conn) * to use tcp_sendmsg(). */ static inline int -iscsi_send(struct socket *sk, struct iscsi_buf *buf, int size, int flags) +iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) { + struct socket *sk = conn->sock; int res; if ((int)buf->sg.offset >= 0) { int offset = buf->sg.offset + buf->sent; - /* tcp_sendpage */ - res = sk->ops->sendpage(sk, buf->sg.page, offset, size, flags); + res = conn->sendpage(sk, buf->sg.page, offset, size, flags); } else { struct msghdr msg; @@ -1354,7 +1354,6 @@ iscsi_send(struct socket *sk, struct iscsi_buf *buf, int size, int flags) static inline int iscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen) { - struct socket *sk = conn->sock; int flags = 0; /* MSG_DONTWAIT; */ int res, size; @@ -1363,7 +1362,7 @@ iscsi_sendhdr(struct iscsi_conn *conn, struct iscsi_buf *buf, int datalen) if (buf->sent + size != buf->sg.length || datalen) flags |= MSG_MORE; - res = iscsi_send(sk, buf, size, flags); + res = iscsi_send(conn, buf, size, flags); debug_tcp("sendhdr %d bytes, sent %d res %d\n", size, buf->sent, res); if (res >= 0) { conn->txdata_octets += res; @@ -1394,7 +1393,6 @@ static inline int iscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf, int *count, int *sent) { - struct socket *sk = conn->sock; int flags = 0; /* MSG_DONTWAIT; */ int res, size; @@ -1405,7 +1403,7 @@ iscsi_sendpage(struct iscsi_conn *conn, struct iscsi_buf *buf, if (buf->sent + size != buf->sg.length || *count != size) flags |= MSG_MORE; - res = iscsi_send(sk, buf, size, flags); + res = iscsi_send(conn, buf, size, flags); debug_tcp("sendpage: %d bytes, sent %d left %d sent %d res %d\n", size, buf->sent, *count, *sent, res); if (res >= 0) { @@ -2713,6 +2711,8 @@ iscsi_conn_bind(iscsi_sessionh_t sessionh, iscsi_connh_t connh, */ iscsi_conn_set_callbacks(conn); + conn->sendpage = conn->sock->ops->sendpage; + /* * set receive state machine into initial state */ @@ -3467,6 +3467,8 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param, if (conn->data_rx_tfm) crypto_free_tfm(conn->data_rx_tfm); } + conn->sendpage = conn->datadgst_en ? + sock_no_sendpage : conn->sock->ops->sendpage; break; case ISCSI_PARAM_INITIAL_R2T_EN: session->initial_r2t_en = value; diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h index 9badafe8820..c8bb5b0bcb4 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -191,6 +191,8 @@ struct iscsi_conn { uint32_t sendpage_failures_cnt; uint32_t discontiguous_hdr_cnt; uint32_t eh_abort_cnt; + + ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int); }; struct iscsi_session { -- cgit v1.2.3 From 7cae5159dd2623300cf9820865bfbf6dcdb7c1b9 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 13 Jan 2006 18:05:47 -0600 Subject: [SCSI] iscsi: add high mem support From Mike Christie and FUJITA Tomonori : We cannot use page_address becuase some pages could be highmem. Instead, we can use sock_no_sendpage which does kmap for us. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 84 +++++++++++++++++------------------------------- drivers/scsi/iscsi_tcp.h | 2 +- 2 files changed, 31 insertions(+), 55 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 5e8b3135574..0acc4b235d9 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -87,35 +87,32 @@ iscsi_buf_init_virt(struct iscsi_buf *ibuf, char *vbuf, int size) { sg_init_one(&ibuf->sg, (u8 *)vbuf, size); ibuf->sent = 0; + ibuf->use_sendmsg = 0; } static inline void iscsi_buf_init_iov(struct iscsi_buf *ibuf, char *vbuf, int size) { - ibuf->sg.page = (void*)vbuf; - ibuf->sg.offset = (unsigned int)-1; + ibuf->sg.page = virt_to_page(vbuf); + ibuf->sg.offset = offset_in_page(vbuf); ibuf->sg.length = size; ibuf->sent = 0; -} - -static inline void* -iscsi_buf_iov_base(struct iscsi_buf *ibuf) -{ - return (char*)ibuf->sg.page + ibuf->sent; + ibuf->use_sendmsg = 1; } static inline void iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg) { + ibuf->sg.page = sg->page; + ibuf->sg.offset = sg->offset; + ibuf->sg.length = sg->length; /* * Fastpath: sg element fits into single page */ - if (sg->length + sg->offset <= PAGE_SIZE && page_count(sg->page) >= 2) { - ibuf->sg.page = sg->page; - ibuf->sg.offset = sg->offset; - ibuf->sg.length = sg->length; - } else - iscsi_buf_init_iov(ibuf, page_address(sg->page), sg->length); + if (sg->length + sg->offset <= PAGE_SIZE && page_count(sg->page) >= 2) + ibuf->use_sendmsg = 0; + else + ibuf->use_sendmsg = 1; ibuf->sent = 0; } @@ -1311,35 +1308,25 @@ iscsi_conn_restore_callbacks(struct iscsi_conn *conn) * @buf: buffer to write from * @size: actual size to write * @flags: socket's flags - * - * Notes: - * depending on buffer will use tcp_sendpage() or tcp_sendmsg(). - * buf->sg.offset == -1 tells us that buffer is non S/G and forces - * to use tcp_sendmsg(). */ static inline int iscsi_send(struct iscsi_conn *conn, struct iscsi_buf *buf, int size, int flags) { struct socket *sk = conn->sock; - int res; - - if ((int)buf->sg.offset >= 0) { - int offset = buf->sg.offset + buf->sent; - - res = conn->sendpage(sk, buf->sg.page, offset, size, flags); - } else { - struct msghdr msg; - - buf->iov.iov_base = iscsi_buf_iov_base(buf); - buf->iov.iov_len = size; - - memset(&msg, 0, sizeof(struct msghdr)); - - /* tcp_sendmsg */ - res = kernel_sendmsg(sk, &msg, &buf->iov, 1, size); - } + int offset = buf->sg.offset + buf->sent; - return res; + /* + * if we got use_sg=0 or are sending something we kmallocd + * then we did not have to do kmap (kmap returns page_address) + * + * if we got use_sg > 0, but had to drop down, we do not + * set clustering so this should only happen for that + * slab case. + */ + if (buf->use_sendmsg) + return sock_no_sendpage(sk, buf->sg.page, offset, size, flags); + else + return conn->sendpage(sk, buf->sg.page, offset, size, flags); } /** @@ -1431,19 +1418,6 @@ iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) ctask->digest_count = 4; } -static inline void -iscsi_buf_data_digest_update(struct iscsi_conn *conn, struct iscsi_buf *buf) -{ - struct scatterlist sg; - - if (buf->sg.offset != -1) - crypto_digest_update(conn->data_tx_tfm, &buf->sg, 1); - else { - sg_init_one(&sg, (char *)buf->sg.page, buf->sg.length); - crypto_digest_update(conn->data_tx_tfm, &sg, 1); - } -} - static inline int iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, struct iscsi_buf *buf, uint32_t *digest, int final) @@ -1806,7 +1780,8 @@ handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) return -EAGAIN; } if (conn->datadgst_en) - iscsi_buf_data_digest_update(conn, &ctask->sendbuf); + crypto_digest_update(conn->data_tx_tfm, + &ctask->sendbuf.sg, 1); if (!ctask->imm_count) break; @@ -1891,7 +1866,8 @@ handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) * so pass it */ if (conn->datadgst_en && ctask->sent - start > 0) - iscsi_buf_data_digest_update(conn, &ctask->sendbuf); + crypto_digest_update(conn->data_tx_tfm, + &ctask->sendbuf.sg, 1); if (!ctask->data_count) break; @@ -1969,7 +1945,7 @@ solicit_again: BUG_ON(r2t->data_count < 0); if (conn->datadgst_en) - iscsi_buf_data_digest_update(conn, &r2t->sendbuf); + crypto_digest_update(conn->data_tx_tfm, &r2t->sendbuf.sg, 1); if (r2t->data_count) { BUG_ON(ctask->sc->use_sg == 0); @@ -2051,7 +2027,7 @@ handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) } if (conn->datadgst_en) { - iscsi_buf_data_digest_update(conn, &ctask->sendbuf); + crypto_digest_update(conn->data_tx_tfm, &ctask->sendbuf.sg, 1); /* imm data? */ if (!dtask) { if (iscsi_digest_final_send(conn, ctask, &ctask->immbuf, diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h index c8bb5b0bcb4..f95e61b76f7 100644 --- a/drivers/scsi/iscsi_tcp.h +++ b/drivers/scsi/iscsi_tcp.h @@ -242,8 +242,8 @@ struct iscsi_session { struct iscsi_buf { struct scatterlist sg; - struct kvec iov; unsigned int sent; + char use_sendmsg; }; struct iscsi_data_task { -- cgit v1.2.3 From 7b8631b53bea286b68847a939b87135198335b66 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 13 Jan 2006 18:05:50 -0600 Subject: [SCSI] iscsi: seperate iscsi interface from setup functions This is the second version of the patch to address Christoph's comments. Instead of doing the lib, I just kept everything in scsi_trnapsort_iscsi.c like the FC and SPI class. This was becuase the driver model and sysfs class is tied to the session and connection setup so separating did not buy very much at this time. The reason for this patch was becuase HW iscsi LLDs like qla4xxx cannot use the iscsi class becuase the scsi_host was tied to the interface and class code. This patch just seperates the session from scsi host so that LLDs that allocate the host per some resource like pci device can still use the class. This is also fixes a couple refcount bugs that can be triggered when users have a sysfs file open, close the session, then read or write to the file. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 118 +++-- drivers/scsi/scsi_transport_iscsi.c | 845 +++++++++++++++++++----------------- 2 files changed, 510 insertions(+), 453 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 0acc4b235d9..e31d350e6b6 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -2435,17 +2435,20 @@ iscsi_pool_free(struct iscsi_queue *q, void **items) kfree(items); } -static iscsi_connh_t -iscsi_conn_create(iscsi_sessionh_t sessionh, uint32_t conn_idx) +static struct iscsi_cls_conn * +iscsi_conn_create(struct Scsi_Host *shost, uint32_t conn_idx) { - struct iscsi_session *session = iscsi_ptr(sessionh); - struct iscsi_conn *conn = NULL; + struct iscsi_session *session = iscsi_hostdata(shost->hostdata); + struct iscsi_conn *conn; + struct iscsi_cls_conn *cls_conn; - conn = kmalloc(sizeof(struct iscsi_conn), GFP_KERNEL); - if (conn == NULL) - goto conn_alloc_fail; - memset(conn, 0, sizeof(struct iscsi_conn)); + cls_conn = iscsi_create_conn(hostdata_session(shost->hostdata), + conn_idx); + if (!cls_conn) + return NULL; + conn = cls_conn->dd_data; + memset(conn, 0, sizeof(struct iscsi_conn)); conn->c_stage = ISCSI_CONN_INITIAL_STAGE; conn->in_progress = IN_PROGRESS_WAIT_HEADER; conn->id = conn_idx; @@ -2507,7 +2510,7 @@ iscsi_conn_create(iscsi_sessionh_t sessionh, uint32_t conn_idx) mutex_init(&conn->xmitmutex); init_waitqueue_head(&conn->ehwait); - return iscsi_handle(conn); + return cls_conn; max_recv_dlenght_alloc_fail: spin_lock_bh(&session->lock); @@ -2523,15 +2526,14 @@ immqueue_alloc_fail: writequeue_alloc_fail: kfifo_free(conn->xmitqueue); xmitqueue_alloc_fail: - kfree(conn); -conn_alloc_fail: - return iscsi_handle(NULL); + iscsi_destroy_conn(cls_conn); + return NULL; } static void -iscsi_conn_destroy(iscsi_connh_t connh) +iscsi_conn_destroy(struct iscsi_cls_conn *cls_conn) { - struct iscsi_conn *conn = iscsi_ptr(connh); + struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_session *session = conn->session; unsigned long flags; @@ -2626,7 +2628,8 @@ iscsi_conn_destroy(iscsi_connh_t connh) kfifo_free(conn->writequeue); kfifo_free(conn->immqueue); kfifo_free(conn->mgmtqueue); - kfree(conn); + + iscsi_destroy_conn(cls_conn); } static int @@ -3257,17 +3260,23 @@ static struct scsi_host_template iscsi_sht = { .this_id = -1, }; -static iscsi_sessionh_t -iscsi_session_create(uint32_t initial_cmdsn, struct Scsi_Host *host) +static struct iscsi_transport iscsi_tcp_transport; + +static struct Scsi_Host * +iscsi_session_create(struct scsi_transport_template *scsit, + uint32_t initial_cmdsn) { - int cmd_i; + struct Scsi_Host *shost; struct iscsi_session *session; + int cmd_i; - session = iscsi_hostdata(host->hostdata); - memset(session, 0, sizeof(struct iscsi_session)); + shost = iscsi_transport_create_session(scsit, &iscsi_tcp_transport); + if (!shost) + return NULL; - session->host = host; - session->id = host->host_no; + session = iscsi_hostdata(shost->hostdata); + memset(session, 0, sizeof(struct iscsi_session)); + session->host = shost; session->state = ISCSI_STATE_LOGGED_IN; session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX; session->cmds_max = ISCSI_XMIT_CMDS_MAX; @@ -3311,7 +3320,7 @@ iscsi_session_create(uint32_t initial_cmdsn, struct Scsi_Host *host) if (iscsi_r2tpool_alloc(session)) goto r2tpool_alloc_fail; - return iscsi_handle(session); + return shost; r2tpool_alloc_fail: for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) @@ -3321,15 +3330,15 @@ immdata_alloc_fail: mgmtpool_alloc_fail: iscsi_pool_free(&session->cmdpool, (void**)session->cmds); cmdpool_alloc_fail: - return iscsi_handle(NULL); + return NULL; } static void -iscsi_session_destroy(iscsi_sessionh_t sessionh) +iscsi_session_destroy(struct Scsi_Host *shost) { + struct iscsi_session *session = iscsi_hostdata(shost->hostdata); int cmd_i; struct iscsi_data_task *dtask, *n; - struct iscsi_session *session = iscsi_ptr(sessionh); for (cmd_i = 0; cmd_i < session->cmds_max; cmd_i++) { struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; @@ -3345,6 +3354,8 @@ iscsi_session_destroy(iscsi_sessionh_t sessionh) iscsi_r2tpool_free(session); iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); iscsi_pool_free(&session->cmdpool, (void**)session->cmds); + + iscsi_transport_destroy_session(shost); } static int @@ -3493,25 +3504,12 @@ iscsi_conn_set_param(iscsi_connh_t connh, enum iscsi_param param, } static int -iscsi_conn_get_param(iscsi_connh_t connh, enum iscsi_param param, - uint32_t *value) +iscsi_session_get_param(struct Scsi_Host *shost, + enum iscsi_param param, uint32_t *value) { - struct iscsi_conn *conn = iscsi_ptr(connh); - struct iscsi_session *session = conn->session; + struct iscsi_session *session = iscsi_hostdata(shost->hostdata); switch(param) { - case ISCSI_PARAM_MAX_RECV_DLENGTH: - *value = conn->max_recv_dlength; - break; - case ISCSI_PARAM_MAX_XMIT_DLENGTH: - *value = conn->max_xmit_dlength; - break; - case ISCSI_PARAM_HDRDGST_EN: - *value = conn->hdrdgst_en; - break; - case ISCSI_PARAM_DATADGST_EN: - *value = conn->datadgst_en; - break; case ISCSI_PARAM_INITIAL_R2T_EN: *value = session->initial_r2t_en; break; @@ -3549,6 +3547,31 @@ iscsi_conn_get_param(iscsi_connh_t connh, enum iscsi_param param, return 0; } +static int +iscsi_conn_get_param(void *data, enum iscsi_param param, uint32_t *value) +{ + struct iscsi_conn *conn = data; + + switch(param) { + case ISCSI_PARAM_MAX_RECV_DLENGTH: + *value = conn->max_recv_dlength; + break; + case ISCSI_PARAM_MAX_XMIT_DLENGTH: + *value = conn->max_xmit_dlength; + break; + case ISCSI_PARAM_HDRDGST_EN: + *value = conn->hdrdgst_en; + break; + case ISCSI_PARAM_DATADGST_EN: + *value = conn->datadgst_en; + break; + default: + return ISCSI_ERR_PARAM_NOT_FOUND; + } + + return 0; +} + static void iscsi_conn_get_stats(iscsi_connh_t connh, struct iscsi_stats *stats) { @@ -3593,6 +3616,7 @@ static struct iscsi_transport iscsi_tcp_transport = { | CAP_DATADGST, .host_template = &iscsi_sht, .hostdata_size = sizeof(struct iscsi_session), + .conndata_size = sizeof(struct iscsi_conn), .max_conn = 1, .max_cmd_len = ISCSI_TCP_MAX_CMD_LEN, .create_session = iscsi_session_create, @@ -3601,7 +3625,8 @@ static struct iscsi_transport iscsi_tcp_transport = { .bind_conn = iscsi_conn_bind, .destroy_conn = iscsi_conn_destroy, .set_param = iscsi_conn_set_param, - .get_param = iscsi_conn_get_param, + .get_conn_param = iscsi_conn_get_param, + .get_session_param = iscsi_session_get_param, .start_conn = iscsi_conn_start, .stop_conn = iscsi_conn_stop, .send_pdu = iscsi_conn_send_pdu, @@ -3611,8 +3636,6 @@ static struct iscsi_transport iscsi_tcp_transport = { static int __init iscsi_tcp_init(void) { - int error; - if (iscsi_max_lun < 1) { printk(KERN_ERR "Invalid max_lun value of %u\n", iscsi_max_lun); return -EINVAL; @@ -3625,11 +3648,10 @@ iscsi_tcp_init(void) if (!taskcache) return -ENOMEM; - error = iscsi_register_transport(&iscsi_tcp_transport); - if (error) + if (!iscsi_register_transport(&iscsi_tcp_transport)) kmem_cache_destroy(taskcache); - return error; + return 0; } static void __exit diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 50ed88f98f4..45e31635a59 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -21,12 +21,9 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include -#include -#include #include #include #include - #include #include #include @@ -45,11 +42,6 @@ struct iscsi_internal { * List of sessions for this transport */ struct list_head sessions; - /* - * lock to serialize access to the sessions list which must - * be taken after the rx_queue_mutex - */ - spinlock_t session_lock; /* * based on transport capabilities, at register time we set these * bits to tell the transport class it wants attributes displayed @@ -157,7 +149,7 @@ struct mempool_zone { spinlock_t freelock; }; -static struct mempool_zone z_reply; +static struct mempool_zone *z_reply; /* * Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time @@ -172,50 +164,270 @@ static struct mempool_zone z_reply; #define Z_MAX_ERROR 16 #define Z_HIWAT_ERROR 12 -struct iscsi_if_conn { - struct list_head conn_list; /* item in connlist */ - struct list_head session_list; /* item in session->connections */ - iscsi_connh_t connh; - int active; /* must be accessed with the connlock */ - struct Scsi_Host *host; /* originated shost */ - struct device dev; /* sysfs transport/container device */ - struct iscsi_transport *transport; - struct mempool_zone z_error; - struct mempool_zone z_pdu; - struct list_head freequeue; -}; +static LIST_HEAD(connlist); +static DEFINE_SPINLOCK(connlock); -#define iscsi_dev_to_if_conn(_dev) \ - container_of(_dev, struct iscsi_if_conn, dev) +/* + * The following functions can be used by LLDs that allocate + * their own scsi_hosts or by software iscsi LLDs + */ +static void iscsi_session_release(struct device *dev) +{ + struct iscsi_cls_session *session = iscsi_dev_to_session(dev); + struct iscsi_transport *transport = session->transport; + struct Scsi_Host *shost; -#define iscsi_cdev_to_if_conn(_cdev) \ - iscsi_dev_to_if_conn(_cdev->dev) + shost = iscsi_session_to_shost(session); + scsi_host_put(shost); + kfree(session); + module_put(transport->owner); +} -static LIST_HEAD(connlist); -static DEFINE_SPINLOCK(connlock); +static int iscsi_is_session_dev(const struct device *dev) +{ + return dev->release == iscsi_session_release; +} -struct iscsi_if_session { - struct list_head list; /* item in session_list */ - struct list_head connections; - iscsi_sessionh_t sessionh; - struct iscsi_transport *transport; - struct device dev; /* sysfs transport/container device */ -}; +/** + * iscsi_create_session - create iscsi class session + * @shost: scsi host + * @transport: iscsi transport + * + * This can be called from a LLD or iscsi_transport + **/ +struct iscsi_cls_session * +iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport) +{ + struct iscsi_cls_session *session; + int err; + + if (!try_module_get(transport->owner)) + return NULL; + + session = kzalloc(sizeof(*session), GFP_KERNEL); + if (!session) + goto module_put; + session->transport = transport; + + /* this is released in the dev's release function */ + scsi_host_get(shost); + snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", shost->host_no); + session->dev.parent = &shost->shost_gendev; + session->dev.release = iscsi_session_release; + err = device_register(&session->dev); + if (err) { + dev_printk(KERN_ERR, &session->dev, "iscsi: could not " + "register session's dev\n"); + goto free_session; + } + transport_register_device(&session->dev); + + return session; + +free_session: + kfree(session); +module_put: + module_put(transport->owner); + return NULL; +} + +EXPORT_SYMBOL_GPL(iscsi_create_session); + +/** + * iscsi_destroy_session - destroy iscsi session + * @session: iscsi_session + * + * Can be called by a LLD or iscsi_transport. There must not be + * any running connections. + **/ +int iscsi_destroy_session(struct iscsi_cls_session *session) +{ + transport_unregister_device(&session->dev); + device_unregister(&session->dev); + return 0; +} + +EXPORT_SYMBOL_GPL(iscsi_destroy_session); + +static void iscsi_conn_release(struct device *dev) +{ + struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); + struct device *parent = conn->dev.parent; + + kfree(conn); + put_device(parent); +} + +static int iscsi_is_conn_dev(const struct device *dev) +{ + return dev->release == iscsi_conn_release; +} + +/** + * iscsi_create_conn - create iscsi class connection + * @session: iscsi cls session + * @cid: connection id + * + * This can be called from a LLD or iscsi_transport. The connection + * is child of the session so cid must be unique for all connections + * on the session. + **/ +struct iscsi_cls_conn * +iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) +{ + struct iscsi_transport *transport = session->transport; + struct Scsi_Host *shost = iscsi_session_to_shost(session); + struct iscsi_cls_conn *conn; + int err; + + conn = kzalloc(sizeof(*conn) + transport->conndata_size, GFP_KERNEL); + if (!conn) + return NULL; + + if (transport->conndata_size) + conn->dd_data = &conn[1]; + + INIT_LIST_HEAD(&conn->conn_list); + conn->transport = transport; + + /* this is released in the dev's release function */ + if (!get_device(&session->dev)) + goto free_conn; + snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", + shost->host_no, cid); + conn->dev.parent = &session->dev; + conn->dev.release = iscsi_conn_release; + err = device_register(&conn->dev); + if (err) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: could not register " + "connection's dev\n"); + goto release_parent_ref; + } + transport_register_device(&conn->dev); + return conn; + +release_parent_ref: + put_device(&session->dev); +free_conn: + kfree(conn); + return NULL; +} + +EXPORT_SYMBOL_GPL(iscsi_create_conn); + +/** + * iscsi_destroy_conn - destroy iscsi class connection + * @session: iscsi cls session + * + * This can be called from a LLD or iscsi_transport. + **/ +int iscsi_destroy_conn(struct iscsi_cls_conn *conn) +{ + transport_unregister_device(&conn->dev); + device_unregister(&conn->dev); + return 0; +} + +EXPORT_SYMBOL_GPL(iscsi_destroy_conn); + +/* + * These functions are used only by software iscsi_transports + * which do not allocate and more their scsi_hosts since this + * is initiated from userspace. + */ + +/* + * iSCSI Session's hostdata organization: + * + * *------------------* <== hostdata_session(host->hostdata) + * | ptr to class sess| + * |------------------| <== iscsi_hostdata(host->hostdata) + * | transport's data | + * *------------------* + */ + +#define hostdata_privsize(_t) (sizeof(unsigned long) + _t->hostdata_size + \ + _t->hostdata_size % sizeof(unsigned long)) + +#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata)) + +/** + * iscsi_transport_create_session - create iscsi cls session and host + * scsit: scsi transport template + * transport: iscsi transport template + * + * This can be used by software iscsi_transports that allocate + * a session per scsi host. + **/ +struct Scsi_Host * +iscsi_transport_create_session(struct scsi_transport_template *scsit, + struct iscsi_transport *transport) +{ + struct iscsi_cls_session *session; + struct Scsi_Host *shost; + + shost = scsi_host_alloc(transport->host_template, + hostdata_privsize(transport)); + if (!shost) { + printk(KERN_ERR "iscsi: can not allocate SCSI host for " + "session\n"); + return NULL; + } + + shost->max_id = 1; + shost->max_channel = 0; + shost->max_lun = transport->max_lun; + shost->max_cmd_len = transport->max_cmd_len; + shost->transportt = scsit; + + if (scsi_add_host(shost, NULL)) + goto free_host; + + session = iscsi_create_session(shost, transport); + if (!session) + goto remove_host; -#define iscsi_dev_to_if_session(_dev) \ - container_of(_dev, struct iscsi_if_session, dev) + *(unsigned long*)shost->hostdata = (unsigned long)session; + return shost; + +remove_host: + scsi_remove_host(shost); +free_host: + scsi_host_put(shost); + return NULL; +} -#define iscsi_cdev_to_if_session(_cdev) \ - iscsi_dev_to_if_session(_cdev->dev) +EXPORT_SYMBOL_GPL(iscsi_transport_create_session); -#define iscsi_if_session_to_shost(_session) \ - dev_to_shost(_session->dev.parent) +/** + * iscsi_transport_destroy_session - destroy session and scsi host + * shost: scsi host + * + * This can be used by software iscsi_transports that allocate + * a session per scsi host. + **/ +int iscsi_transport_destroy_session(struct Scsi_Host *shost) +{ + struct iscsi_cls_session *session; -static struct iscsi_if_conn* + scsi_remove_host(shost); + session = hostdata_session(shost->hostdata); + iscsi_destroy_session(session); + /* ref from host alloc */ + scsi_host_put(shost); + return 0; +} + +EXPORT_SYMBOL_GPL(iscsi_transport_destroy_session); + +/* + * iscsi interface functions + */ +static struct iscsi_cls_conn* iscsi_if_find_conn(uint64_t key) { unsigned long flags; - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; spin_lock_irqsave(&connlock, flags); list_for_each_entry(conn, &connlist, conn_list) @@ -250,7 +462,7 @@ static inline struct list_head *skb_to_lh(struct sk_buff *skb) } static void* -mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) +mempool_zone_alloc_skb(unsigned int gfp_mask, void *pool_data) { struct mempool_zone *zone = pool_data; @@ -282,14 +494,21 @@ mempool_zone_complete(struct mempool_zone *zone) spin_unlock_irqrestore(&zone->freelock, flags); } -static int -mempool_zone_init(struct mempool_zone *zp, unsigned max, unsigned size, - unsigned hiwat) +static struct mempool_zone * +mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) { + struct mempool_zone *zp; + + zp = kzalloc(sizeof(*zp), GFP_KERNEL); + if (!zp) + return NULL; + zp->pool = mempool_create(max, mempool_zone_alloc_skb, mempool_zone_free_skb, zp); - if (!zp->pool) - return -ENOMEM; + if (!zp->pool) { + kfree(zp); + return NULL; + } zp->size = size; zp->hiwat = hiwat; @@ -298,9 +517,14 @@ mempool_zone_init(struct mempool_zone *zp, unsigned max, unsigned size, spin_lock_init(&zp->freelock); atomic_set(&zp->allocated, 0); - return 0; + return zp; } +static void mempool_zone_destroy(struct mempool_zone *zp) +{ + mempool_destroy(zp->pool); + kfree(zp); +} static struct sk_buff* mempool_zone_get_skb(struct mempool_zone *zone) @@ -340,7 +564,7 @@ int iscsi_recv_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, struct nlmsghdr *nlh; struct sk_buff *skb; struct iscsi_uevent *ev; - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; char *pdu; int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) + data_size); @@ -348,13 +572,13 @@ int iscsi_recv_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, conn = iscsi_if_find_conn(connh); BUG_ON(!conn); - mempool_zone_complete(&conn->z_pdu); + mempool_zone_complete(conn->z_pdu); - skb = mempool_zone_get_skb(&conn->z_pdu); + skb = mempool_zone_get_skb(conn->z_pdu); if (!skb) { iscsi_conn_error(connh, ISCSI_ERR_CONN_FAILED); - printk(KERN_ERR "iscsi%d: can not deliver control PDU: OOM\n", - conn->host->host_no); + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not deliver " + "control PDU: OOM\n"); return -ENOMEM; } @@ -363,14 +587,14 @@ int iscsi_recv_pdu(iscsi_connh_t connh, struct iscsi_hdr *hdr, memset(ev, 0, sizeof(*ev)); ev->transport_handle = iscsi_handle(conn->transport); ev->type = ISCSI_KEVENT_RECV_PDU; - if (atomic_read(&conn->z_pdu.allocated) >= conn->z_pdu.hiwat) + if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) ev->iferror = -ENOMEM; ev->r.recv_req.conn_handle = connh; pdu = (char*)ev + sizeof(*ev); memcpy(pdu, hdr, sizeof(struct iscsi_hdr)); memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size); - return iscsi_unicast_skb(&conn->z_pdu, skb); + return iscsi_unicast_skb(conn->z_pdu, skb); } EXPORT_SYMBOL_GPL(iscsi_recv_pdu); @@ -379,18 +603,18 @@ void iscsi_conn_error(iscsi_connh_t connh, enum iscsi_err error) struct nlmsghdr *nlh; struct sk_buff *skb; struct iscsi_uevent *ev; - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; int len = NLMSG_SPACE(sizeof(*ev)); conn = iscsi_if_find_conn(connh); BUG_ON(!conn); - mempool_zone_complete(&conn->z_error); + mempool_zone_complete(conn->z_error); - skb = mempool_zone_get_skb(&conn->z_error); + skb = mempool_zone_get_skb(conn->z_error); if (!skb) { - printk(KERN_ERR "iscsi%d: gracefully ignored conn error (%d)\n", - conn->host->host_no, error); + dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored " + "conn error (%d)\n", error); return; } @@ -398,15 +622,15 @@ void iscsi_conn_error(iscsi_connh_t connh, enum iscsi_err error) ev = NLMSG_DATA(nlh); ev->transport_handle = iscsi_handle(conn->transport); ev->type = ISCSI_KEVENT_CONN_ERROR; - if (atomic_read(&conn->z_error.allocated) >= conn->z_error.hiwat) + if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat) ev->iferror = -ENOMEM; ev->r.connerror.error = error; ev->r.connerror.conn_handle = connh; - iscsi_unicast_skb(&conn->z_error, skb); + iscsi_unicast_skb(conn->z_error, skb); - printk(KERN_INFO "iscsi%d: detected conn error (%d)\n", - conn->host->host_no, error); + dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", + error); } EXPORT_SYMBOL_GPL(iscsi_conn_error); @@ -420,9 +644,9 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, int flags = multi ? NLM_F_MULTI : 0; int t = done ? NLMSG_DONE : type; - mempool_zone_complete(&z_reply); + mempool_zone_complete(z_reply); - skb = mempool_zone_get_skb(&z_reply); + skb = mempool_zone_get_skb(z_reply); /* * FIXME: * user is supposed to react on iferror == -ENOMEM; @@ -433,366 +657,197 @@ iscsi_if_send_reply(int pid, int seq, int type, int done, int multi, nlh = __nlmsg_put(skb, pid, seq, t, (len - sizeof(*nlh)), 0); nlh->nlmsg_flags = flags; memcpy(NLMSG_DATA(nlh), payload, size); - return iscsi_unicast_skb(&z_reply, skb); + return iscsi_unicast_skb(z_reply, skb); } -/* - * iSCSI Session's hostdata organization: - * - * *------------------* <== host->hostdata - * | transport | - * |------------------| <== iscsi_hostdata(host->hostdata) - * | transport's data | - * |------------------| <== hostdata_session(host->hostdata) - * | interface's data | - * *------------------* - */ +static int +iscsi_if_get_stats(struct iscsi_transport *transport, struct sk_buff *skb, + struct nlmsghdr *nlh) +{ + struct iscsi_uevent *ev = NLMSG_DATA(nlh); + struct iscsi_stats *stats; + struct sk_buff *skbstat; + struct iscsi_cls_conn *conn; + struct nlmsghdr *nlhstat; + struct iscsi_uevent *evstat; + int len = NLMSG_SPACE(sizeof(*ev) + + sizeof(struct iscsi_stats) + + sizeof(struct iscsi_stats_custom) * + ISCSI_STATS_CUSTOM_MAX); + int err = 0; -#define hostdata_privsize(_t) (sizeof(unsigned long) + _t->hostdata_size + \ - _t->hostdata_size % sizeof(unsigned long) + \ - sizeof(struct iscsi_if_session)) + conn = iscsi_if_find_conn(ev->u.get_stats.conn_handle); + if (!conn) + return -EEXIST; -#define hostdata_session(_hostdata) ((void*)_hostdata + sizeof(unsigned long) + \ - ((struct iscsi_transport *) \ - iscsi_ptr(*(uint64_t *)_hostdata))->hostdata_size) + do { + int actual_size; -static void iscsi_if_session_dev_release(struct device *dev) -{ - struct iscsi_if_session *session = iscsi_dev_to_if_session(dev); - struct iscsi_transport *transport = session->transport; - struct Scsi_Host *shost = iscsi_if_session_to_shost(session); - struct iscsi_if_conn *conn, *tmp; - unsigned long flags; + mempool_zone_complete(conn->z_pdu); - /* now free connections */ - spin_lock_irqsave(&connlock, flags); - list_for_each_entry_safe(conn, tmp, &session->connections, - session_list) { - list_del(&conn->session_list); - mempool_destroy(conn->z_pdu.pool); - mempool_destroy(conn->z_error.pool); - kfree(conn); - } - spin_unlock_irqrestore(&connlock, flags); - scsi_host_put(shost); - module_put(transport->owner); + skbstat = mempool_zone_get_skb(conn->z_pdu); + if (!skbstat) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not " + "deliver stats: OOM\n"); + return -ENOMEM; + } + + nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0, + (len - sizeof(*nlhstat)), 0); + evstat = NLMSG_DATA(nlhstat); + memset(evstat, 0, sizeof(*evstat)); + evstat->transport_handle = iscsi_handle(conn->transport); + evstat->type = nlh->nlmsg_type; + if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat) + evstat->iferror = -ENOMEM; + evstat->u.get_stats.conn_handle = + ev->u.get_stats.conn_handle; + stats = (struct iscsi_stats *) + ((char*)evstat + sizeof(*evstat)); + memset(stats, 0, sizeof(*stats)); + + transport->get_stats(ev->u.get_stats.conn_handle, stats); + actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) + + sizeof(struct iscsi_stats) + + sizeof(struct iscsi_stats_custom) * + stats->custom_length); + actual_size -= sizeof(*nlhstat); + actual_size = NLMSG_LENGTH(actual_size); + skb_trim(skb, NLMSG_ALIGN(actual_size)); + nlhstat->nlmsg_len = actual_size; + + err = iscsi_unicast_skb(conn->z_pdu, skbstat); + } while (err < 0 && err != -ECONNREFUSED); + + return err; } static int iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) { struct iscsi_transport *transport = priv->iscsi_transport; - struct iscsi_if_session *session; struct Scsi_Host *shost; - unsigned long flags; - int error; - - if (!try_module_get(transport->owner)) - return -EPERM; - shost = scsi_host_alloc(transport->host_template, - hostdata_privsize(transport)); - if (!shost) { - ev->r.c_session_ret.session_handle = iscsi_handle(NULL); - printk(KERN_ERR "iscsi: can not allocate SCSI host for " - "session\n"); - error = -ENOMEM; - goto out_module_put; - } - shost->max_id = 1; - shost->max_channel = 0; - shost->max_lun = transport->max_lun; - shost->max_cmd_len = transport->max_cmd_len; - shost->transportt = &priv->t; - - /* store struct iscsi_transport in hostdata */ - *(uint64_t*)shost->hostdata = ev->transport_handle; + if (!transport->create_session) + return -EINVAL; - ev->r.c_session_ret.session_handle = transport->create_session( - ev->u.c_session.initial_cmdsn, shost); - if (ev->r.c_session_ret.session_handle == iscsi_handle(NULL)) { - error = 0; - goto out_host_put; - } + shost = transport->create_session(&priv->t, + ev->u.c_session.initial_cmdsn); + if (!shost) + return -ENOMEM; - /* host_no becomes assigned SID */ + ev->r.c_session_ret.session_handle = iscsi_handle(iscsi_hostdata(shost->hostdata)); ev->r.c_session_ret.sid = shost->host_no; - /* initialize session */ - session = hostdata_session(shost->hostdata); - INIT_LIST_HEAD(&session->connections); - INIT_LIST_HEAD(&session->list); - session->sessionh = ev->r.c_session_ret.session_handle; - session->transport = transport; - - error = scsi_add_host(shost, NULL); - if (error) - goto out_destroy_session; - - /* - * this is released in the dev's release function) - */ - scsi_host_get(shost); - snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", shost->host_no); - session->dev.parent = &shost->shost_gendev; - session->dev.release = iscsi_if_session_dev_release; - error = device_register(&session->dev); - if (error) { - printk(KERN_ERR "iscsi: could not register session%d's dev\n", - shost->host_no); - goto out_remove_host; - } - transport_register_device(&session->dev); - - /* add this session to the list of active sessions */ - spin_lock_irqsave(&priv->session_lock, flags); - list_add(&session->list, &priv->sessions); - spin_unlock_irqrestore(&priv->session_lock, flags); - return 0; - -out_remove_host: - scsi_remove_host(shost); -out_destroy_session: - transport->destroy_session(ev->r.c_session_ret.session_handle); - ev->r.c_session_ret.session_handle = iscsi_handle(NULL); -out_host_put: - scsi_host_put(shost); -out_module_put: - module_put(transport->owner); - return error; } static int iscsi_if_destroy_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) { struct iscsi_transport *transport = priv->iscsi_transport; + struct Scsi_Host *shost; - struct iscsi_if_session *session; - unsigned long flags; - struct iscsi_if_conn *conn; - int error = 0; + + if (!transport->destroy_session) + return -EINVAL; shost = scsi_host_lookup(ev->u.d_session.sid); if (shost == ERR_PTR(-ENXIO)) return -EEXIST; - session = hostdata_session(shost->hostdata); - /* check if we have active connections */ - spin_lock_irqsave(&connlock, flags); - list_for_each_entry(conn, &session->connections, session_list) { - if (conn->active) { - printk(KERN_ERR "iscsi%d: can not destroy session: " - "has active connection (%p)\n", - shost->host_no, iscsi_ptr(conn->connh)); - spin_unlock_irqrestore(&connlock, flags); - error = EIO; - goto out_release_ref; - } - } - spin_unlock_irqrestore(&connlock, flags); - - scsi_remove_host(shost); - transport->destroy_session(ev->u.d_session.session_handle); - transport_unregister_device(&session->dev); - device_unregister(&session->dev); - - /* remove this session from the list of active sessions */ - spin_lock_irqsave(&priv->session_lock, flags); - list_del(&session->list); - spin_unlock_irqrestore(&priv->session_lock, flags); - - /* ref from host alloc */ - scsi_host_put(shost); -out_release_ref: - /* ref from host lookup */ - scsi_host_put(shost); - return error; -} - -static void iscsi_if_conn_dev_release(struct device *dev) -{ - struct iscsi_if_conn *conn = iscsi_dev_to_if_conn(dev); - struct Scsi_Host *shost = conn->host; - - scsi_host_put(shost); + if (transport->destroy_session) + transport->destroy_session(shost); + /* ref from host lookup */ + scsi_host_put(shost); + return 0; } static int -iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) -{ - struct iscsi_if_session *session; +iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev){ struct Scsi_Host *shost; - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; unsigned long flags; - int error; + + if (!transport->create_conn) + return -EINVAL; shost = scsi_host_lookup(ev->u.c_conn.sid); if (shost == ERR_PTR(-ENXIO)) return -EEXIST; - session = hostdata_session(shost->hostdata); - conn = kmalloc(sizeof(struct iscsi_if_conn), GFP_KERNEL); - if (!conn) { - error = -ENOMEM; - goto out_release_ref; - } - memset(conn, 0, sizeof(struct iscsi_if_conn)); - INIT_LIST_HEAD(&conn->session_list); - INIT_LIST_HEAD(&conn->conn_list); - conn->host = shost; - conn->transport = transport; + conn = transport->create_conn(shost, ev->u.c_conn.cid); + if (!conn) + goto release_ref; - error = mempool_zone_init(&conn->z_pdu, Z_MAX_PDU, + conn->z_pdu = mempool_zone_init(Z_MAX_PDU, NLMSG_SPACE(sizeof(struct iscsi_uevent) + sizeof(struct iscsi_hdr) + DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), Z_HIWAT_PDU); - if (error) { - printk(KERN_ERR "iscsi%d: can not allocate pdu zone for new " - "conn\n", shost->host_no); - goto out_free_conn; + if (!conn->z_pdu) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " + "pdu zone for new conn\n"); + goto destroy_conn; } - error = mempool_zone_init(&conn->z_error, Z_MAX_ERROR, + + conn->z_error = mempool_zone_init(Z_MAX_ERROR, NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_ERROR); - if (error) { - printk(KERN_ERR "iscsi%d: can not allocate error zone for " - "new conn\n", shost->host_no); - goto out_free_pdu_pool; - } - - ev->r.handle = transport->create_conn(ev->u.c_conn.session_handle, - ev->u.c_conn.cid); - if (!ev->r.handle) { - error = -ENODEV; - goto out_free_error_pool; + if (!conn->z_error) { + dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " + "error zone for new conn\n"); + goto free_pdu_pool; } - conn->connh = ev->r.handle; - - /* - * this is released in the dev's release function - */ - if (!scsi_host_get(shost)) - goto out_destroy_conn; - snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", - shost->host_no, ev->u.c_conn.cid); - conn->dev.parent = &session->dev; - conn->dev.release = iscsi_if_conn_dev_release; - error = device_register(&conn->dev); - if (error) { - printk(KERN_ERR "iscsi%d: could not register connections%u " - "dev\n", shost->host_no, ev->u.c_conn.cid); - goto out_release_parent_ref; - } - transport_register_device(&conn->dev); + ev->r.handle = conn->connh = iscsi_handle(conn->dd_data); spin_lock_irqsave(&connlock, flags); list_add(&conn->conn_list, &connlist); - list_add(&conn->session_list, &session->connections); conn->active = 1; spin_unlock_irqrestore(&connlock, flags); scsi_host_put(shost); return 0; -out_release_parent_ref: +free_pdu_pool: + mempool_zone_destroy(conn->z_pdu); +destroy_conn: + if (transport->destroy_conn) + transport->destroy_conn(conn->dd_data); +release_ref: scsi_host_put(shost); -out_destroy_conn: - transport->destroy_conn(ev->r.handle); -out_free_error_pool: - mempool_destroy(conn->z_error.pool); -out_free_pdu_pool: - mempool_destroy(conn->z_pdu.pool); -out_free_conn: - kfree(conn); -out_release_ref: - scsi_host_put(shost); - return error; + return -ENOMEM; } static int iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) { unsigned long flags; - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; + struct mempool_zone *z_error, *z_pdu; conn = iscsi_if_find_conn(ev->u.d_conn.conn_handle); if (!conn) return -EEXIST; - transport->destroy_conn(ev->u.d_conn.conn_handle); + if (!transport->destroy_conn) + return -EINVAL; spin_lock_irqsave(&connlock, flags); conn->active = 0; list_del(&conn->conn_list); spin_unlock_irqrestore(&connlock, flags); - transport_unregister_device(&conn->dev); - device_unregister(&conn->dev); - return 0; -} - -static int -iscsi_if_get_stats(struct iscsi_transport *transport, struct sk_buff *skb, - struct nlmsghdr *nlh) -{ - struct iscsi_uevent *ev = NLMSG_DATA(nlh); - struct iscsi_stats *stats; - struct sk_buff *skbstat; - struct iscsi_if_conn *conn; - struct nlmsghdr *nlhstat; - struct iscsi_uevent *evstat; - int len = NLMSG_SPACE(sizeof(*ev) + - sizeof(struct iscsi_stats) + - sizeof(struct iscsi_stats_custom) * - ISCSI_STATS_CUSTOM_MAX); - int err = 0; - - conn = iscsi_if_find_conn(ev->u.get_stats.conn_handle); - if (!conn) - return -EEXIST; - - do { - int actual_size; - - mempool_zone_complete(&conn->z_pdu); - - skbstat = mempool_zone_get_skb(&conn->z_pdu); - if (!skbstat) { - printk(KERN_ERR "iscsi%d: can not deliver stats: OOM\n", - conn->host->host_no); - return -ENOMEM; - } - - nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0, - (len - sizeof(*nlhstat)), 0); - evstat = NLMSG_DATA(nlhstat); - memset(evstat, 0, sizeof(*evstat)); - evstat->transport_handle = iscsi_handle(conn->transport); - evstat->type = nlh->nlmsg_type; - if (atomic_read(&conn->z_pdu.allocated) >= conn->z_pdu.hiwat) - evstat->iferror = -ENOMEM; - evstat->u.get_stats.conn_handle = - ev->u.get_stats.conn_handle; - stats = (struct iscsi_stats *) - ((char*)evstat + sizeof(*evstat)); - memset(stats, 0, sizeof(*stats)); + z_pdu = conn->z_pdu; + z_error = conn->z_error; - transport->get_stats(ev->u.get_stats.conn_handle, stats); - actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) + - sizeof(struct iscsi_stats) + - sizeof(struct iscsi_stats_custom) * - stats->custom_length); - actual_size -= sizeof(*nlhstat); - actual_size = NLMSG_LENGTH(actual_size); - skb_trim(skb, NLMSG_ALIGN(actual_size)); - nlhstat->nlmsg_len = actual_size; + if (transport->destroy_conn) + transport->destroy_conn(conn); - err = iscsi_unicast_skb(&conn->z_pdu, skbstat); - } while (err < 0 && err != -ECONNREFUSED); + mempool_zone_destroy(z_pdu); + mempool_zone_destroy(z_error); - return err; + return 0; } static int @@ -916,8 +971,8 @@ iscsi_if_rx(struct sock *sk, int len) err = iscsi_if_send_reply( NETLINK_CREDS(skb)->pid, nlh->nlmsg_seq, nlh->nlmsg_type, 0, 0, ev, sizeof(*ev)); - if (atomic_read(&z_reply.allocated) >= - z_reply.hiwat) + if (atomic_read(&z_reply->allocated) >= + z_reply->hiwat) ev->iferror = -ENOMEM; } while (err < 0 && err != -ECONNREFUSED); skb_pull(skb, rlen); @@ -927,6 +982,9 @@ iscsi_if_rx(struct sock *sk, int len) mutex_unlock(&rx_queue_mutex); } +#define iscsi_cdev_to_conn(_cdev) \ + iscsi_dev_to_conn(_cdev->dev) + /* * iSCSI connection attrs */ @@ -935,12 +993,10 @@ static ssize_t \ show_conn_int_param_##param(struct class_device *cdev, char *buf) \ { \ uint32_t value = 0; \ - struct iscsi_if_conn *conn = iscsi_cdev_to_if_conn(cdev); \ - struct iscsi_internal *priv; \ + struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \ + struct iscsi_transport *t = conn->transport; \ \ - priv = to_iscsi_internal(conn->host->transportt); \ - if (priv->param_mask & (1 << param)) \ - priv->iscsi_transport->get_param(conn->connh, param, &value); \ + t->get_conn_param(conn->dd_data, param, &value); \ return snprintf(buf, 20, format"\n", value); \ } @@ -955,6 +1011,9 @@ iscsi_conn_int_attr(data_digest, ISCSI_PARAM_DATADGST_EN, "%d"); iscsi_conn_int_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN, "%d"); iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d"); +#define iscsi_cdev_to_session(_cdev) \ + iscsi_dev_to_session(_cdev->dev) + /* * iSCSI session attrs */ @@ -963,20 +1022,11 @@ static ssize_t \ show_session_int_param_##param(struct class_device *cdev, char *buf) \ { \ uint32_t value = 0; \ - struct iscsi_if_session *session = iscsi_cdev_to_if_session(cdev); \ - struct Scsi_Host *shost = iscsi_if_session_to_shost(session); \ - struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \ - struct iscsi_if_conn *conn = NULL; \ - unsigned long flags; \ - \ - spin_lock_irqsave(&connlock, flags); \ - if (!list_empty(&session->connections)) \ - conn = list_entry(session->connections.next, \ - struct iscsi_if_conn, session_list); \ - spin_unlock_irqrestore(&connlock, flags); \ + struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \ + struct Scsi_Host *shost = iscsi_session_to_shost(session); \ + struct iscsi_transport *t = session->transport; \ \ - if (conn && (priv->param_mask & (1 << param))) \ - priv->iscsi_transport->get_param(conn->connh, param, &value);\ + t->get_session_param(shost, param, &value); \ return snprintf(buf, 20, format"\n", value); \ } @@ -1005,23 +1055,18 @@ iscsi_session_int_attr(erl, ISCSI_PARAM_ERL, "%d"); count++; \ } -static int iscsi_is_session_dev(const struct device *dev) -{ - return dev->release == iscsi_if_session_dev_release; -} - static int iscsi_session_match(struct attribute_container *cont, struct device *dev) { - struct iscsi_if_session *session; + struct iscsi_cls_session *session; struct Scsi_Host *shost; struct iscsi_internal *priv; if (!iscsi_is_session_dev(dev)) return 0; - session = iscsi_dev_to_if_session(dev); - shost = iscsi_if_session_to_shost(session); + session = iscsi_dev_to_session(dev); + shost = iscsi_session_to_shost(session); if (!shost->transportt) return 0; @@ -1032,23 +1077,21 @@ static int iscsi_session_match(struct attribute_container *cont, return &priv->session_cont.ac == cont; } -static int iscsi_is_conn_dev(const struct device *dev) -{ - return dev->release == iscsi_if_conn_dev_release; -} - static int iscsi_conn_match(struct attribute_container *cont, struct device *dev) { - struct iscsi_if_conn *conn; + struct iscsi_cls_session *session; + struct iscsi_cls_conn *conn; struct Scsi_Host *shost; struct iscsi_internal *priv; if (!iscsi_is_conn_dev(dev)) return 0; - conn = iscsi_dev_to_if_conn(dev); - shost = conn->host; + conn = iscsi_dev_to_conn(dev); + session = iscsi_dev_to_session(conn->dev.parent); + shost = iscsi_session_to_shost(session); + if (!shost->transportt) return 0; @@ -1059,7 +1102,8 @@ static int iscsi_conn_match(struct attribute_container *cont, return &priv->conn_cont.ac == cont; } -int iscsi_register_transport(struct iscsi_transport *tt) +struct scsi_transport_template * +iscsi_register_transport(struct iscsi_transport *tt) { struct iscsi_internal *priv; unsigned long flags; @@ -1069,15 +1113,14 @@ int iscsi_register_transport(struct iscsi_transport *tt) priv = iscsi_if_transport_lookup(tt); if (priv) - return -EEXIST; + return NULL; priv = kmalloc(sizeof(*priv), GFP_KERNEL); if (!priv) - return -ENOMEM; + return NULL; memset(priv, 0, sizeof(*priv)); INIT_LIST_HEAD(&priv->list); INIT_LIST_HEAD(&priv->sessions); - spin_lock_init(&priv->session_lock); priv->iscsi_transport = tt; priv->cdev.class = &iscsi_transport_class; @@ -1143,13 +1186,13 @@ int iscsi_register_transport(struct iscsi_transport *tt) spin_unlock_irqrestore(&iscsi_transport_lock, flags); printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name); - return 0; + return &priv->t; unregister_cdev: class_device_unregister(&priv->cdev); free_priv: kfree(priv); - return err; + return NULL; } EXPORT_SYMBOL_GPL(iscsi_register_transport); @@ -1165,14 +1208,6 @@ int iscsi_unregister_transport(struct iscsi_transport *tt) priv = iscsi_if_transport_lookup(tt); BUG_ON (!priv); - spin_lock_irqsave(&priv->session_lock, flags); - if (!list_empty(&priv->sessions)) { - spin_unlock_irqrestore(&priv->session_lock, flags); - mutex_unlock(&rx_queue_mutex); - return -EPERM; - } - spin_unlock_irqrestore(&priv->session_lock, flags); - spin_lock_irqsave(&iscsi_transport_lock, flags); list_del(&priv->list); spin_unlock_irqrestore(&iscsi_transport_lock, flags); @@ -1195,14 +1230,14 @@ iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr) if (event == NETLINK_URELEASE && n->protocol == NETLINK_ISCSI && n->pid) { - struct iscsi_if_conn *conn; + struct iscsi_cls_conn *conn; unsigned long flags; - mempool_zone_complete(&z_reply); + mempool_zone_complete(z_reply); spin_lock_irqsave(&connlock, flags); list_for_each_entry(conn, &connlist, conn_list) { - mempool_zone_complete(&conn->z_error); - mempool_zone_complete(&conn->z_pdu); + mempool_zone_complete(conn->z_error); + mempool_zone_complete(conn->z_pdu); } spin_unlock_irqrestore(&connlock, flags); } @@ -1235,15 +1270,15 @@ static __init int iscsi_transport_init(void) goto unregister_session_class; nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx, - THIS_MODULE); + THIS_MODULE); if (!nls) { err = -ENOBUFS; goto unregister_notifier; } - err = mempool_zone_init(&z_reply, Z_MAX_REPLY, + z_reply = mempool_zone_init(Z_MAX_REPLY, NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY); - if (!err) + if (z_reply) return 0; sock_release(nls->sk_socket); @@ -1260,7 +1295,7 @@ unregister_transport_class: static void __exit iscsi_transport_exit(void) { - mempool_destroy(z_reply.pool); + mempool_zone_destroy(z_reply); sock_release(nls->sk_socket); netlink_unregister_notifier(&iscsi_nl_notifier); transport_class_unregister(&iscsi_connection_class); -- cgit v1.2.3 From 55e3299d9eca01fb2351c5d37e222872b7c6e0af Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 13 Jan 2006 18:05:53 -0600 Subject: [SCSI] iscsi: fix 4k stack iscsi setups When we run the xmit code from queuecomand the stack trace gets too deep. The patch runs the xmit code from the scsi_host work queue. This fixes 4k stack and xfs support and should fix the st and sg stack usage bugs. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 19 +++++-------------- drivers/scsi/scsi_transport_iscsi.c | 1 + 2 files changed, 6 insertions(+), 14 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index e31d350e6b6..4e4b1061a5e 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -525,7 +525,7 @@ iscsi_r2t_rsp(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) __kfifo_put(ctask->r2tqueue, (void*)&r2t, sizeof(void*)); __kfifo_put(conn->writequeue, (void*)&ctask, sizeof(void*)); - schedule_work(&conn->xmitwork); + scsi_queue_work(session->host, &conn->xmitwork); conn->r2t_pdus_cnt++; spin_unlock(&session->lock); @@ -1267,7 +1267,7 @@ iscsi_write_space(struct sock *sk) conn->old_write_space(sk); debug_tcp("iscsi_write_space: cid %d\n", conn->id); clear_bit(SUSPEND_BIT, &conn->suspend_tx); - schedule_work(&conn->xmitwork); + scsi_queue_work(conn->session->host, &conn->xmitwork); } static void @@ -2275,7 +2275,7 @@ iscsi_xmitworker(void *data) */ mutex_lock(&conn->xmitmutex); if (iscsi_data_xmit(conn)) - schedule_work(&conn->xmitwork); + scsi_queue_work(conn->session->host, &conn->xmitwork); mutex_unlock(&conn->xmitmutex); } @@ -2340,15 +2340,7 @@ iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *)) session->cmdsn, session->max_cmdsn - session->exp_cmdsn + 1); spin_unlock(&session->lock); - if (!in_interrupt() && mutex_trylock(&conn->xmitmutex)) { - spin_unlock_irq(host->host_lock); - if (iscsi_data_xmit(conn)) - schedule_work(&conn->xmitwork); - mutex_unlock(&conn->xmitmutex); - spin_lock_irq(host->host_lock); - } else - schedule_work(&conn->xmitwork); - + scsi_queue_work(host, &conn->xmitwork); return 0; reject: @@ -2942,8 +2934,7 @@ iscsi_conn_send_generic(struct iscsi_conn *conn, struct iscsi_hdr *hdr, else __kfifo_put(conn->mgmtqueue, (void*)&mtask, sizeof(void*)); - schedule_work(&conn->xmitwork); - + scsi_queue_work(session->host, &conn->xmitwork); return 0; } diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 45e31635a59..59a1c9d9d3b 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c @@ -379,6 +379,7 @@ iscsi_transport_create_session(struct scsi_transport_template *scsit, shost->max_lun = transport->max_lun; shost->max_cmd_len = transport->max_cmd_len; shost->transportt = scsit; + shost->transportt->create_work_queue = 1; if (scsi_add_host(shost, NULL)) goto free_host; -- cgit v1.2.3 From a1e80c20e1ac751dbdd88dee989e9a19c22c4a84 Mon Sep 17 00:00:00 2001 From: Mike Christie Date: Fri, 13 Jan 2006 18:05:56 -0600 Subject: [SCSI] iscsi: use pageslab From: FUJITA Tomonori and zhenyu.z.wang@intel.com: We cannot handle filesystems like XFS becuase of the pages they are sending us. We had thought page_count could be used to work around this, but the correct test is for PageSlab. The proper solution is to figure out what type of pages filesystems can use so we do not have to add tests like this or handle it in the block layer for all network block drivers but the issue still has not been resolved on fs-devel so we are sending this patch as a temporary fix. This is last patch just in case it is Nakd with the explanation that we need to push the correct fix through fs-devel, mm or the block layer. The rest of the patchset can live without the patch, but the driver will not work with filesystems like XFS. Signed-off-by: Alex Aizman Signed-off-by: Dmitry Yusupov Signed-off-by: Mike Christie Signed-off-by: James Bottomley --- drivers/scsi/iscsi_tcp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 4e4b1061a5e..1b495afe6d1 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -109,7 +109,7 @@ iscsi_buf_init_sg(struct iscsi_buf *ibuf, struct scatterlist *sg) /* * Fastpath: sg element fits into single page */ - if (sg->length + sg->offset <= PAGE_SIZE && page_count(sg->page) >= 2) + if (sg->length + sg->offset <= PAGE_SIZE && !PageSlab(sg->page)) ibuf->use_sendmsg = 0; else ibuf->use_sendmsg = 1; -- cgit v1.2.3 From dad9c8c15dbe4eac0ab086c74cdb256ec2fb0b70 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:04:49 -0800 Subject: [SCSI] qla2xxx: Reference proper node/port names in fc_host class. The initial-control-block references are not always correct as the use-node-name qualifier during NVRAM configuration will cause the firmware to use the portname as a base for the nodename. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_attr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 2efca52dff5..b17ee62dd1a 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c @@ -541,7 +541,7 @@ struct fc_function_template qla2xxx_transport_functions = { void qla2x00_init_host_attr(scsi_qla_host_t *ha) { - fc_host_node_name(ha->host) = wwn_to_u64(ha->init_cb->node_name); - fc_host_port_name(ha->host) = wwn_to_u64(ha->init_cb->port_name); + fc_host_node_name(ha->host) = wwn_to_u64(ha->node_name); + fc_host_port_name(ha->host) = wwn_to_u64(ha->port_name); fc_host_supported_classes(ha->host) = FC_COS_CLASS3; } -- cgit v1.2.3 From 9403688e9bca54b55bfcea51053c8af537beba0a Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:04:54 -0800 Subject: [SCSI] qla2xxx: Correct FC4 feature assignment during RFF_ID. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_gs.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index cd6f7c3cfe6..0e8ada08104 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c @@ -538,6 +538,7 @@ qla2x00_rff_id(scsi_qla_host_t *ha) ct_req->req.rff_id.port_id[1] = ha->d_id.b.area; ct_req->req.rff_id.port_id[2] = ha->d_id.b.al_pa; + ct_req->req.rff_id.fc4_feature = BIT_1; ct_req->req.rff_id.fc4_type = 0x08; /* SCSI - FCP */ /* Execute MS IOCB */ -- cgit v1.2.3 From e038a1be22bef90795c5239d1563609b89c3aa18 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:04:59 -0800 Subject: [SCSI] qla2xxx: Drop noisy 'UNDERRUN' status message. There's no point in displaying the message during a valid underrun case. Limit the message to potentially problematic cases. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_isr.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 5181d966fec..8a539dd4875 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -963,15 +963,16 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) break; case CS_DATA_UNDERRUN: - DEBUG2(printk(KERN_INFO - "scsi(%ld:%d:%d) UNDERRUN status detected 0x%x-0x%x.\n", - ha->host_no, cp->device->id, cp->device->lun, comp_status, - scsi_status)); - resid = resid_len; if (scsi_status & SS_RESIDUAL_UNDER) { cp->resid = resid; CMD_RESID_LEN(cp) = resid; + } else { + DEBUG2(printk(KERN_INFO + "scsi(%ld:%d:%d) UNDERRUN status detected " + "0x%x-0x%x.\n", ha->host_no, cp->device->id, + cp->device->lun, comp_status, scsi_status)); + } /* -- cgit v1.2.3 From 03ab2eabed74708c0c74163723007e8e72244219 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:05 -0800 Subject: [SCSI] qla2xxx: Use msleep() as delay during ISP polling. Mailbox commands are polled for completion during ISP initialization. During potentially 'long' mailbox commands (i.e. fabric login), we really don't want a busy-wait delay to potentially trigger a (benign) soft-lockup BUG(). Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_mbx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 9746cd1e664..f90e68de0a8 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -196,7 +196,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) /* Check for pending interrupts. */ qla2x00_poll(ha); - udelay(10); /* v4.27 */ + msleep(10); } /* while */ } -- cgit v1.2.3 From 5998983113c1c9158c1ce66ff26a212aceaf7e5c Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:10 -0800 Subject: [SCSI] qla2xxx: Correct excessive delay during LOAD-RISC-RAM mailbox command. Problem report (against 2.4.x driver) from Jeff Layton : An OEM noticed that the U6 qla2200 driver would hang for around 2 minutes at boot time and then proceed normally. I found that the delay was occurring when loading the new firmware into the card, and was due to a schedule_timeout(10) added to the bottom of the polling loop. Some testing showed that the load ram operation on the card was very quick (on the order of a couple of jiffies), but the sleep in the polling loop was making each operation take around 25-30. The attached patch corrects this by making it skip sleeping during the load ram operation, since I believe we only do that when the module is plugged in. It also skips sleeping if the mbox_int flag got set during the current loop. This corrected the hang on my test setup, and OEM also confirmed that it corrected the problem for them. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_mbx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index f90e68de0a8..3de8fee69fa 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -196,7 +196,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) /* Check for pending interrupts. */ qla2x00_poll(ha); - msleep(10); + if (command != MBC_LOAD_RISC_RAM_EXTENDED && + !ha->flags.mbox_int) + msleep(10); } /* while */ } -- cgit v1.2.3 From e978010cebcc0ac1be67caab8dfc7c1fa831406d Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:15 -0800 Subject: [SCSI] qla2xxx: Re-enable flash-part write protection on ISP24xx boards. Driver would not correctly re-enable the write-protection bits of the flash part after updates. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_sup.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index d54d2a99c3d..f4d755a643e 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c @@ -573,6 +573,9 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr, } } while (0); + /* Enable flash write-protection. */ + qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0x9c); + /* Disable flash write. */ WRT_REG_DWORD(®->ctrl_status, RD_REG_DWORD(®->ctrl_status) & ~CSRX_FLASH_ENABLE); -- cgit v1.2.3 From 210d53507e961b0f480d1a86d9a26832cc68645e Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:21 -0800 Subject: [SCSI] qla2xxx: Update firmware-dump procedure for ISP24xx. Small changes to register retrieval and order as per latest firmware specification. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_dbg.c | 105 +++++++++++++++++++++-------------------- drivers/scsi/qla2xxx/qla_dbg.h | 4 +- 2 files changed, 55 insertions(+), 54 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 5c5d2315cfa..2d9b12ffe09 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c @@ -1003,10 +1003,10 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) fw = (struct qla24xx_fw_dump *) ha->fw_dump24; rval = QLA_SUCCESS; - fw->hccr = RD_REG_DWORD(®->hccr); + fw->host_status = RD_REG_DWORD(®->host_status); /* Pause RISC. */ - if ((fw->hccr & HCCRX_RISC_PAUSE) == 0) { + if ((RD_REG_DWORD(®->hccr) & HCCRX_RISC_PAUSE) == 0) { WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET | HCCRX_CLR_HOST_INT); RD_REG_DWORD(®->hccr); /* PCI Posting. */ @@ -1021,16 +1021,54 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) } } - /* Disable interrupts. */ - WRT_REG_DWORD(®->ictrl, 0); - RD_REG_DWORD(®->ictrl); - if (rval == QLA_SUCCESS) { /* Host interface registers. */ dmp_reg = (uint32_t __iomem *)(reg + 0); for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++); + /* Disable interrupts. */ + WRT_REG_DWORD(®->ictrl, 0); + RD_REG_DWORD(®->ictrl); + + /* Shadow registers. */ + WRT_REG_DWORD(®->iobase_addr, 0x0F70); + RD_REG_DWORD(®->iobase_addr); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0000000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0100000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0200000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0300000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0400000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0500000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg); + + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); + WRT_REG_DWORD(dmp_reg, 0xB0600000); + dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); + fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg); + /* Mailbox registers. */ mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) @@ -1308,43 +1346,6 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) for (cnt = 0; cnt < 16; cnt++) *iter_reg++ = RD_REG_DWORD(dmp_reg++); - WRT_REG_DWORD(®->iobase_addr, 0x0F70); - RD_REG_DWORD(®->iobase_addr); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0000000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0100000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0200000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0300000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0400000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0500000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg); - - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); - WRT_REG_DWORD(dmp_reg, 0xB0600000); - dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); - fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg); - /* Local memory controller registers. */ iter_reg = fw->lmc_reg; WRT_REG_DWORD(®->iobase_addr, 0x3000); @@ -1677,7 +1678,7 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha) ha->fw_major_version, ha->fw_minor_version, ha->fw_subminor_version, ha->fw_attributes); - qla_uprintf(&uiter, "\nHCCR Register\n%04x\n", fw->hccr); + qla_uprintf(&uiter, "\nR2H Status Register\n%04x\n", fw->host_status); qla_uprintf(&uiter, "\nHost Interface Registers"); for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) { @@ -1687,6 +1688,14 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha) qla_uprintf(&uiter, "%08x ", fw->host_reg[cnt]); } + qla_uprintf(&uiter, "\n\nShadow Registers"); + for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) { + if (cnt % 8 == 0) + qla_uprintf(&uiter, "\n"); + + qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]); + } + qla_uprintf(&uiter, "\n\nMailbox Registers"); for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) { if (cnt % 8 == 0) @@ -1855,14 +1864,6 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha) qla_uprintf(&uiter, "%08x ", fw->risc_gp_reg[cnt]); } - qla_uprintf(&uiter, "\n\nShadow Registers"); - for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) { - if (cnt % 8 == 0) - qla_uprintf(&uiter, "\n"); - - qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]); - } - qla_uprintf(&uiter, "\n\nLMC Registers"); for (cnt = 0; cnt < sizeof(fw->lmc_reg) / 4; cnt++) { if (cnt % 8 == 0) diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index 935a59a8c05..ab6afeaa2f2 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h @@ -227,8 +227,9 @@ struct qla2100_fw_dump { #define FW_DUMP_SIZE_24XX 0x2B0000 struct qla24xx_fw_dump { - uint32_t hccr; + uint32_t host_status; uint32_t host_reg[32]; + uint32_t shadow_reg[7]; uint16_t mailbox_reg[32]; uint32_t xseq_gp_reg[128]; uint32_t xseq_0_reg[16]; @@ -250,7 +251,6 @@ struct qla24xx_fw_dump { uint32_t rcvt0_data_dma_reg[32]; uint32_t rcvt1_data_dma_reg[32]; uint32_t risc_gp_reg[128]; - uint32_t shadow_reg[7]; uint32_t lmc_reg[112]; uint32_t fpm_hdw_reg[192]; uint32_t fb_hdw_reg[176]; -- cgit v1.2.3 From c9d02acf39d9fdde18b63281944003b9ec9a3271 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:26 -0800 Subject: [SCSI] qla2xxx: Correct issue where portstate does not transition during loop-resync. If the Get Port Database call fails during local-loop update, then schedule the DPC routine to perform a rescan as the firmware would have updated the Get ID List port-entries of their new state. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_init.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 7d973bd9022..e21316a8ecf 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1939,6 +1939,9 @@ qla2x00_configure_local_loop(scsi_qla_host_t *ha) "information -- get_port_database=%x, " "loop_id=0x%04x\n", ha->host_no, rval2, new_fcport->loop_id)); + DEBUG2(printk("scsi(%ld): Scheduling resync...\n", + ha->host_no)); + set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); continue; } -- cgit v1.2.3 From f94097edf2c3ac9bc48580252c2eee52947b5e60 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:32 -0800 Subject: [SCSI] qla2xxx: Correct swing/emphasis settings for ISP24XX. Swing/emphasis settings in NVRAM were not being honoured due to the driver not converting the serial-link options from LE to host-endian format. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_init.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index e21316a8ecf..49e831561d1 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -1014,11 +1014,13 @@ qla24xx_update_fw_options(scsi_qla_host_t *ha) int rval; /* Update Serial Link options. */ - if ((ha->fw_seriallink_options24[0] & BIT_0) == 0) + if ((le16_to_cpu(ha->fw_seriallink_options24[0]) & BIT_0) == 0) return; - rval = qla2x00_set_serdes_params(ha, ha->fw_seriallink_options24[1], - ha->fw_seriallink_options24[2], ha->fw_seriallink_options24[3]); + rval = qla2x00_set_serdes_params(ha, + le16_to_cpu(ha->fw_seriallink_options24[1]), + le16_to_cpu(ha->fw_seriallink_options24[2]), + le16_to_cpu(ha->fw_seriallink_options24[3])); if (rval != QLA_SUCCESS) { qla_printk(KERN_WARNING, ha, "Unable to update Serial Link options (%x).\n", rval); -- cgit v1.2.3 From 590f98e5e8d6502cc21fdcddc90a0cc09c1f770e Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:37 -0800 Subject: [SCSI] qla2xxx: Collapse load RISC RAM implementations. Simplify essentially duplicate load RISC RAM implementation in qla2x00_load_ram_ext() and qla2x00_load_ram(). Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_gbl.h | 5 +- drivers/scsi/qla2xxx/qla_init.c | 8 ++-- drivers/scsi/qla2xxx/qla_mbx.c | 103 ++++------------------------------------ 3 files changed, 15 insertions(+), 101 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index bec81adcf4f..7872c11f06e 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -96,10 +96,7 @@ int __qla2x00_marker(scsi_qla_host_t *, uint16_t, uint16_t, uint8_t); * Global Function Prototypes in qla_mbx.c source file. */ extern int -qla2x00_load_ram(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t); - -extern int -qla2x00_load_ram_ext(scsi_qla_host_t *, dma_addr_t, uint32_t, uint32_t); +qla2x00_load_ram(scsi_qla_host_t *, dma_addr_t, uint32_t, uint32_t); extern int qla2x00_execute_fw(scsi_qla_host_t *, uint32_t); diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 49e831561d1..b4fbef5bf40 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -3672,8 +3672,8 @@ qla24xx_load_risc_flash(scsi_qla_host_t *ha, uint32_t *srisc_addr) for (i = 0; i < dlen; i++) dcode[i] = swab32(dcode[i]); - rval = qla2x00_load_ram_ext(ha, ha->request_dma, - risc_addr, dlen); + rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr, + dlen); if (rval) { DEBUG(printk("scsi(%ld):[ERROR] Failed to load " "segment %d of firmware\n", ha->host_no, @@ -3873,8 +3873,8 @@ qla24xx_load_risc(scsi_qla_host_t *ha, uint32_t *srisc_addr) for (i = 0; i < dlen; i++) dcode[i] = swab32(fwcode[i]); - rval = qla2x00_load_ram_ext(ha, ha->request_dma, - risc_addr, dlen); + rval = qla2x00_load_ram(ha, ha->request_dma, risc_addr, + dlen); if (rval) { DEBUG(printk("scsi(%ld):[ERROR] Failed to load " "segment %d of firmware\n", ha->host_no, diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 3de8fee69fa..3099b379de9 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c @@ -327,113 +327,30 @@ qla2x00_mailbox_command(scsi_qla_host_t *ha, mbx_cmd_t *mcp) return rval; } -/* - * qla2x00_load_ram - * Load adapter RAM using DMA. - * - * Input: - * ha = adapter block pointer. - * - * Returns: - * qla2x00 local function return status code. - * - * Context: - * Kernel context. - */ int -qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint16_t risc_addr, - uint16_t risc_code_size) +qla2x00_load_ram(scsi_qla_host_t *ha, dma_addr_t req_dma, uint32_t risc_addr, + uint32_t risc_code_size) { int rval; mbx_cmd_t mc; mbx_cmd_t *mcp = &mc; - uint32_t req_len; - dma_addr_t nml_dma; - uint32_t nml_len; - uint32_t normalized; - - DEBUG11(printk("qla2x00_load_ram(%ld): entered.\n", - ha->host_no);) - req_len = risc_code_size; - nml_dma = 0; - nml_len = 0; - - normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma, - &nml_len); - - /* Load first segment */ - mcp->mb[0] = MBC_LOAD_RISC_RAM; - mcp->mb[1] = risc_addr; - mcp->mb[2] = MSW(req_dma); - mcp->mb[3] = LSW(req_dma); - mcp->mb[4] = (uint16_t)req_len; - mcp->mb[6] = MSW(MSD(req_dma)); - mcp->mb[7] = LSW(MSD(req_dma)); - mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; - mcp->in_mb = MBX_0; - mcp->tov = 30; - mcp->flags = 0; - rval = qla2x00_mailbox_command(ha, mcp); - - /* Load second segment - if necessary */ - if (normalized && (rval == QLA_SUCCESS)) { - mcp->mb[0] = MBC_LOAD_RISC_RAM; - mcp->mb[1] = risc_addr + (uint16_t)req_len; - mcp->mb[2] = MSW(nml_dma); - mcp->mb[3] = LSW(nml_dma); - mcp->mb[4] = (uint16_t)nml_len; - mcp->mb[6] = MSW(MSD(nml_dma)); - mcp->mb[7] = LSW(MSD(nml_dma)); - mcp->out_mb = MBX_7|MBX_6|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; - mcp->in_mb = MBX_0; - mcp->tov = 30; - mcp->flags = 0; - rval = qla2x00_mailbox_command(ha, mcp); - } + DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); - if (rval == QLA_SUCCESS) { - /* Empty */ - DEBUG11(printk("qla2x00_load_ram(%ld): done.\n", ha->host_no);) + if (MSW(risc_addr) || IS_QLA24XX(ha) || IS_QLA25XX(ha)) { + mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED; + mcp->mb[8] = MSW(risc_addr); + mcp->out_mb = MBX_8|MBX_0; } else { - /* Empty */ - DEBUG2_3_11(printk("qla2x00_load_ram(%ld): failed. rval=%x " - "mb[0]=%x.\n", ha->host_no, rval, mcp->mb[0]);) + mcp->mb[0] = MBC_LOAD_RISC_RAM; + mcp->out_mb = MBX_0; } - return rval; -} - -/* - * qla2x00_load_ram_ext - * Load adapter extended RAM using DMA. - * - * Input: - * ha = adapter block pointer. - * - * Returns: - * qla2x00 local function return status code. - * - * Context: - * Kernel context. - */ -int -qla2x00_load_ram_ext(scsi_qla_host_t *ha, dma_addr_t req_dma, - uint32_t risc_addr, uint32_t risc_code_size) -{ - int rval; - mbx_cmd_t mc; - mbx_cmd_t *mcp = &mc; - - DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); - - mcp->mb[0] = MBC_LOAD_RISC_RAM_EXTENDED; mcp->mb[1] = LSW(risc_addr); mcp->mb[2] = MSW(req_dma); mcp->mb[3] = LSW(req_dma); mcp->mb[6] = MSW(MSD(req_dma)); mcp->mb[7] = LSW(MSD(req_dma)); - mcp->mb[8] = MSW(risc_addr); - mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; + mcp->out_mb |= MBX_7|MBX_6|MBX_3|MBX_2|MBX_1; if (IS_QLA24XX(ha) || IS_QLA25XX(ha)) { mcp->mb[4] = MSW(risc_code_size); mcp->mb[5] = LSW(risc_code_size); -- cgit v1.2.3 From bc8fb3cb9e208de0d69223f68058714b78f83833 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:42 -0800 Subject: [SCSI] qla2xxx: Correct execution-throttle setting for ISP24xx. Similarly to other ISPs, set execution throttle to maximum allowed value since 'throttling' is done on a per-lun basis via queue-depth. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_init.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index b4fbef5bf40..8635bd1ae8a 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -3407,6 +3407,8 @@ qla24xx_nvram_config(scsi_qla_host_t *ha) ha->node_name = icb->node_name; ha->port_name = icb->port_name; + icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); + ha->retry_count = le16_to_cpu(nv->login_retry_count); /* Set minimum login_timeout to 4 seconds. */ -- cgit v1.2.3 From c0eb87552654bc3e8da179c501e3e18c92ee4360 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:48 -0800 Subject: [SCSI] qla2xxx: Correct setting of FDMI supported/current port speed. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_gs.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 0e8ada08104..d620a8e8a61 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c @@ -1530,9 +1530,9 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); eiter->len = __constant_cpu_to_be16(4 + 4); if (IS_QLA25XX(ha)) - eiter->a.sup_speed = __constant_cpu_to_be32(4); - else if (IS_QLA24XX(ha)) eiter->a.sup_speed = __constant_cpu_to_be32(8); + else if (IS_QLA24XX(ha)) + eiter->a.sup_speed = __constant_cpu_to_be32(4); else if (IS_QLA23XX(ha)) eiter->a.sup_speed = __constant_cpu_to_be32(2); else @@ -1554,9 +1554,6 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) eiter->a.cur_speed = __constant_cpu_to_be32(2); break; case 3: - eiter->a.cur_speed = __constant_cpu_to_be32(8); - break; - case 4: eiter->a.cur_speed = __constant_cpu_to_be32(4); break; } -- cgit v1.2.3 From fdd52dfa3c311a2583850a2fbea99f329be861d7 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:53 -0800 Subject: [SCSI] qla2xxx: Kconfig update: Add URL to download firmware images. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/Kconfig | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig index 02cc79474e8..5758b2566d7 100644 --- a/drivers/scsi/qla2xxx/Kconfig +++ b/drivers/scsi/qla2xxx/Kconfig @@ -22,6 +22,10 @@ config SCSI_QLA_FC Upon request, the driver caches the firmware image until the driver is unloaded. + Firmware images can be retrieved from: + + ftp://ftp.qlogic.com/outgoing/linux/firmware/ + NOTE: The original method of building firmware-loader modules has been deprecated as the firmware-images will be removed from the kernel sources. -- cgit v1.2.3 From 79f89a4296ff22f09baf538d4ff2a6d0c3097a73 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:05:58 -0800 Subject: [SCSI] qla2xxx: Disable port-type RSCN handling via driver state-machine. Given the semantic changes in both the device-model and fc-transport APIs, the driver's handling of port-type RSCNs via a series of ADISCs and PLOGIs can cause series of badness ranging from unexpectedly device loss to devices not being discovered. In the interim, disable (via a module-parameter) this feature and allow RSCN management to continue to occur within the driver's DPC thread. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_gbl.h | 1 + drivers/scsi/qla2xxx/qla_init.c | 3 ++- drivers/scsi/qla2xxx/qla_isr.c | 3 ++- drivers/scsi/qla2xxx/qla_os.c | 6 ++++++ 4 files changed, 11 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 7872c11f06e..32be4c14ccc 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h @@ -62,6 +62,7 @@ extern int qlport_down_retry; extern int ql2xplogiabsentdevice; extern int ql2xloginretrycount; extern int ql2xfdmienable; +extern int ql2xprocessrscn; extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *); diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 8635bd1ae8a..a91fea69ad6 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -2653,7 +2653,8 @@ qla2x00_device_resync(scsi_qla_host_t *ha) switch (format) { case 0: - if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && + if (ql2xprocessrscn && + !IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && !IS_QLA6322(ha) && !IS_QLA24XX(ha) && !IS_QLA25XX(ha) && ha->flags.init_done) { diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 8a539dd4875..f63af081d4f 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c @@ -519,7 +519,8 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) * us, create a new entry in our rscn fcports list and handle * the event like an RSCN. */ - if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && + if (ql2xprocessrscn && + !IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && !IS_QLA6322(ha) && !IS_QLA24XX(ha) && !IS_QLA25XX(ha) && ha->flags.init_done && mb[1] != 0xffff && ((ha->operating_mode == P2P && mb[1] != 0) || diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 24304300d7b..4916847d84e 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c @@ -71,6 +71,12 @@ MODULE_PARM_DESC(ql2xfdmienable, "Enables FDMI registratons " "Default is 0 - no FDMI. 1 - perfom FDMI."); +int ql2xprocessrscn; +module_param(ql2xprocessrscn, int, S_IRUGO|S_IRUSR); +MODULE_PARM_DESC(ql2xprocessrscn, + "Option to enable port RSCN handling via a series of less" + "fabric intrusive ADISCs and PLOGIs."); + /* * SCSI host template entry points */ -- cgit v1.2.3 From fc091e03820bf67e543362bd40959701a71d0c27 Mon Sep 17 00:00:00 2001 From: "andrew.vasquez@qlogic.com" Date: Fri, 13 Jan 2006 17:06:04 -0800 Subject: [SCSI] qla2xxx: Update version number to 8.01.04-k. Signed-off-by: Andrew Vasquez Signed-off-by: James Bottomley --- drivers/scsi/qla2xxx/qla_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index f7937f7f9c6..d537192a1ed 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h @@ -7,9 +7,9 @@ /* * Driver version */ -#define QLA2XXX_VERSION "8.01.03-k" +#define QLA2XXX_VERSION "8.01.04-k" #define QLA_DRIVER_MAJOR_VER 8 #define QLA_DRIVER_MINOR_VER 1 -#define QLA_DRIVER_PATCH_VER 3 +#define QLA_DRIVER_PATCH_VER 4 #define QLA_DRIVER_BETA_VER 0 -- cgit v1.2.3 From 575c96871832e91983248aebb02fc072e5fd17c9 Mon Sep 17 00:00:00 2001 From: Adrian Bunk Date: Sun, 15 Jan 2006 02:00:17 +0100 Subject: spelling: s/appropiate/appropriate/ Signed-off-by: Adrian Bunk --- drivers/scsi/gdth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index a6deb016584..bd3ffdf6c80 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -328,7 +328,7 @@ * hdr_channel:x x - number of virtual bus for host drives * shared_access:Y disable driver reserve/release protocol to * access a shared resource from several nodes, - * appropiate controller firmware required + * appropriate controller firmware required * shared_access:N enable driver reserve/release protocol * probe_eisa_isa:Y scan for EISA/ISA controllers * probe_eisa_isa:N do not scan for EISA/ISA controllers -- cgit v1.2.3 From 3235798804ee75f09d45aee5003197930de57689 Mon Sep 17 00:00:00 2001 From: Alexey Dobriyan Date: Sun, 15 Jan 2006 02:12:54 +0100 Subject: Fix "stuct", "strut", "struc" typos Signed-off-by: Alexey Dobriyan Signed-off-by: Adrian Bunk --- drivers/scsi/FlashPoint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c index 5beed4f6d98..8d64f0bed62 100644 --- a/drivers/scsi/FlashPoint.c +++ b/drivers/scsi/FlashPoint.c @@ -149,7 +149,7 @@ typedef SCCBMGR_INFO * PSCCBMGR_INFO; #define PCI_BUS_CARD 0x03 #define VESA_BUS_CARD 0x04 -/* SCCB struc used for both SCCB and UCB manager compiles! +/* SCCB struct used for both SCCB and UCB manager compiles! * The UCB Manager treats the SCCB as it's 'native hardware structure' */ -- cgit v1.2.3 From 858119e159384308a5dde67776691a2ebf70df0f Mon Sep 17 00:00:00 2001 From: Arjan van de Ven Date: Sat, 14 Jan 2006 13:20:43 -0800 Subject: [PATCH] Unlinline a bunch of other functions Remove the "inline" keyword from a bunch of big functions in the kernel with the goal of shrinking it by 30kb to 40kb Signed-off-by: Arjan van de Ven Signed-off-by: Ingo Molnar Acked-by: Jeff Garzik Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- drivers/scsi/aic7xxx_old.c | 4 ++-- drivers/scsi/iscsi_tcp.c | 2 +- drivers/scsi/libata-core.c | 2 +- drivers/scsi/megaraid/megaraid_mbox.c | 10 +++++----- drivers/scsi/megaraid/megaraid_sas.c | 18 +++++++++--------- drivers/scsi/sr.c | 2 +- 6 files changed, 19 insertions(+), 19 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c index 33d56c34494..770f1647e4d 100644 --- a/drivers/scsi/aic7xxx_old.c +++ b/drivers/scsi/aic7xxx_old.c @@ -1290,7 +1290,7 @@ static void aic7xxx_check_scbs(struct aic7xxx_host *p, char *buffer); * ***************************************************************************/ -static inline unsigned char +static unsigned char aic_inb(struct aic7xxx_host *p, long port) { #ifdef MMAPIO @@ -1309,7 +1309,7 @@ aic_inb(struct aic7xxx_host *p, long port) #endif } -static inline void +static void aic_outb(struct aic7xxx_host *p, unsigned char val, long port) { #ifdef MMAPIO diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 1b495afe6d1..780bfcc6709 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c @@ -1418,7 +1418,7 @@ iscsi_data_digest_init(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) ctask->digest_count = 4; } -static inline int +static int iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, struct iscsi_buf *buf, uint32_t *digest, int final) { diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index f55b9b3f7b3..99bae8369ab 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -1747,7 +1747,7 @@ static const struct { { ATA_SHIFT_PIO, XFER_PIO_0 }, }; -static inline u8 base_from_shift(unsigned int shift) +static u8 base_from_shift(unsigned int shift) { int i; diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index d18a4bc2498..bf9f7f7ba35 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c @@ -1266,7 +1266,7 @@ megaraid_mbox_teardown_dma_pools(adapter_t *adapter) * return the scb from the head of the free list. NULL if there are none * available **/ -static inline scb_t * +static scb_t * megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp) { struct list_head *head = &adapter->kscb_pool; @@ -1329,7 +1329,7 @@ megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb) * * prepare the scatter-gather list */ -static inline int +static int megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb) { struct scatterlist *sgl; @@ -1402,7 +1402,7 @@ megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb) * * post the command to the controller if mailbox is availble. */ -static inline int +static int mbox_post_cmd(adapter_t *adapter, scb_t *scb) { mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter); @@ -2070,7 +2070,7 @@ megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb, * * Returns: 1 if the interrupt is valid, 0 otherwise */ -static inline int +static int megaraid_ack_sequence(adapter_t *adapter) { mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter); @@ -2208,7 +2208,7 @@ megaraid_isr(int irq, void *devp, struct pt_regs *regs) * * DMA sync if required. */ -static inline void +static void megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb) { mbox_ccb_t *ccb; diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index c0bb8061401..511ed52a580 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c @@ -81,7 +81,7 @@ static DEFINE_MUTEX(megasas_async_queue_mutex); * * Returns a free command from the pool */ -static inline struct megasas_cmd *megasas_get_cmd(struct megasas_instance +static struct megasas_cmd *megasas_get_cmd(struct megasas_instance *instance) { unsigned long flags; @@ -263,7 +263,7 @@ megasas_issue_blocked_abort_cmd(struct megasas_instance *instance, * If successful, this function returns the number of SG elements. Otherwise, * it returnes -1. */ -static inline int +static int megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp, union megasas_sgl *mfi_sgl) { @@ -311,7 +311,7 @@ megasas_make_sgl32(struct megasas_instance *instance, struct scsi_cmnd *scp, * If successful, this function returns the number of SG elements. Otherwise, * it returnes -1. */ -static inline int +static int megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp, union megasas_sgl *mfi_sgl) { @@ -360,7 +360,7 @@ megasas_make_sgl64(struct megasas_instance *instance, struct scsi_cmnd *scp, * This function prepares CDB commands. These are typcially pass-through * commands to the devices. */ -static inline int +static int megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp, struct megasas_cmd *cmd) { @@ -441,7 +441,7 @@ megasas_build_dcdb(struct megasas_instance *instance, struct scsi_cmnd *scp, * * Frames (and accompanying SGLs) for regular SCSI IOs use this function. */ -static inline int +static int megasas_build_ldio(struct megasas_instance *instance, struct scsi_cmnd *scp, struct megasas_cmd *cmd) { @@ -563,7 +563,7 @@ megasas_build_ldio(struct megasas_instance *instance, struct scsi_cmnd *scp, * @scp: SCSI command * @frame_count: [OUT] Number of frames used to prepare this command */ -static inline struct megasas_cmd *megasas_build_cmd(struct megasas_instance +static struct megasas_cmd *megasas_build_cmd(struct megasas_instance *instance, struct scsi_cmnd *scp, int *frame_count) @@ -914,7 +914,7 @@ megasas_complete_abort(struct megasas_instance *instance, * @instance: Adapter soft state * @cmd: Completed command */ -static inline void +static void megasas_unmap_sgbuf(struct megasas_instance *instance, struct megasas_cmd *cmd) { dma_addr_t buf_h; @@ -958,7 +958,7 @@ megasas_unmap_sgbuf(struct megasas_instance *instance, struct megasas_cmd *cmd) * an alternate status (as in the case of aborted * commands) */ -static inline void +static void megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, u8 alt_status) { @@ -1105,7 +1105,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd, * SCSI mid-layer instead of the status * returned by the FW */ -static inline int +static int megasas_deplete_reply_queue(struct megasas_instance *instance, u8 alt_status) { u32 status; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index dd8050392d0..997f8e30509 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -151,7 +151,7 @@ static inline struct scsi_cd *scsi_cd_get(struct gendisk *disk) return cd; } -static inline void scsi_cd_put(struct scsi_cd *cd) +static void scsi_cd_put(struct scsi_cd *cd) { struct scsi_device *sdev = cd->device; -- cgit v1.2.3 From f285757cab254470a10f711cd3cbaf9d92f7aa06 Mon Sep 17 00:00:00 2001 From: Jason Gaston Date: Mon, 9 Jan 2006 11:09:13 -0800 Subject: [PATCH] ahci: AHCI mode SATA patch for Intel ICH8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds the Intel ICH8 DID's to the ahci.c file for AHCI mode SATA support. Signed-off-by:  Jason Gaston Signed-off-by: Jeff Garzik --- drivers/scsi/ahci.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index d113290b5fc..19bd346951d 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c @@ -276,6 +276,16 @@ static const struct pci_device_id ahci_pci_tbl[] = { board_ahci }, /* ESB2 */ { PCI_VENDOR_ID_INTEL, 0x27c6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_ahci }, /* ICH7-M DH */ + { PCI_VENDOR_ID_INTEL, 0x2821, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2822, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2824, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8 */ + { PCI_VENDOR_ID_INTEL, 0x2829, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8M */ + { PCI_VENDOR_ID_INTEL, 0x282a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_ahci }, /* ICH8M */ { } /* terminate list */ }; -- cgit v1.2.3 From 88b52877fa1a8894600362a5c9addbab1fcf8b54 Mon Sep 17 00:00:00 2001 From: Oliver Weihe Date: Tue, 17 Jan 2006 07:58:42 -0500 Subject: [libata] sata_svw: add pci id --- drivers/scsi/sata_svw.c | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sata_svw.c b/drivers/scsi/sata_svw.c index 668373590aa..d8472563fde 100644 --- a/drivers/scsi/sata_svw.c +++ b/drivers/scsi/sata_svw.c @@ -470,6 +470,7 @@ static const struct pci_device_id k2_sata_pci_tbl[] = { { 0x1166, 0x0241, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, { 0x1166, 0x0242, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 8 }, { 0x1166, 0x024a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, + { 0x1166, 0x024b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, { } }; -- cgit v1.2.3 From 5a46fe89a73dc984a2b9ef0fde9b9e58bd4ff98f Mon Sep 17 00:00:00 2001 From: Yusuf Iskenderoglu Date: Tue, 17 Jan 2006 08:06:21 -0500 Subject: [libata] sata_promise: add pci id --- drivers/scsi/sata_promise.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/sata_promise.c b/drivers/scsi/sata_promise.c index 3d1ea09a06a..b0b0a69b356 100644 --- a/drivers/scsi/sata_promise.c +++ b/drivers/scsi/sata_promise.c @@ -66,6 +66,7 @@ enum { board_2037x = 0, /* FastTrak S150 TX2plus */ board_20319 = 1, /* FastTrak S150 TX4 */ board_20619 = 2, /* FastTrak TX4000 */ + board_20771 = 3, /* FastTrak TX2300 */ PDC_HAS_PATA = (1 << 1), /* PDC20375 has PATA */ @@ -190,6 +191,16 @@ static const struct ata_port_info pdc_port_info[] = { .udma_mask = 0x7f, /* udma0-6 ; FIXME */ .port_ops = &pdc_pata_ops, }, + + /* board_20771 */ + { + .sht = &pdc_ata_sht, + .host_flags = PDC_COMMON_FLAGS | ATA_FLAG_SATA, + .pio_mask = 0x1f, /* pio0-4 */ + .mwdma_mask = 0x07, /* mwdma0-2 */ + .udma_mask = 0x7f, /* udma0-6 ; FIXME */ + .port_ops = &pdc_sata_ops, + }, }; static const struct pci_device_id pdc_ata_pci_tbl[] = { @@ -226,6 +237,8 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { { PCI_VENDOR_ID_PROMISE, 0x6629, PCI_ANY_ID, PCI_ANY_ID, 0, 0, board_20619 }, + { PCI_VENDOR_ID_PROMISE, 0x3570, PCI_ANY_ID, PCI_ANY_ID, 0, 0, + board_20771 }, { } /* terminate list */ }; @@ -706,6 +719,9 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const struct pci_device_id *e case board_2037x: probe_ent->n_ports = 2; break; + case board_20771: + probe_ent->n_ports = 2; + break; case board_20619: probe_ent->n_ports = 4; -- cgit v1.2.3 From ffa29456cd316a5394cdd489de5af3bf87d3c485 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 9 Jan 2006 17:14:40 +0000 Subject: [PATCH] libata: Pre UDMA EIDE PIO mode selection I misread the spec when doing the original. I've tested the corrected version with pre UDMA drives and it now picks the right modes. This is a specific bug fix rather than an update or new feature item. Signed-off-by: Alan Cox Signed-off-by: Jeff Garzik --- drivers/scsi/libata-core.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'drivers/scsi') diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 99bae8369ab..bc48d88fef5 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -1051,18 +1051,22 @@ static unsigned int ata_pio_modes(const struct ata_device *adev) { u16 modes; - /* Usual case. Word 53 indicates word 88 is valid */ - if (adev->id[ATA_ID_FIELD_VALID] & (1 << 2)) { + /* Usual case. Word 53 indicates word 64 is valid */ + if (adev->id[ATA_ID_FIELD_VALID] & (1 << 1)) { modes = adev->id[ATA_ID_PIO_MODES] & 0x03; modes <<= 3; modes |= 0x7; return modes; } - /* If word 88 isn't valid then Word 51 holds the PIO timing number - for the maximum. Turn it into a mask and return it */ - modes = (2 << (adev->id[ATA_ID_OLD_PIO_MODES] & 0xFF)) - 1 ; + /* If word 64 isn't valid then Word 51 high byte holds the PIO timing + number for the maximum. Turn it into a mask and return it */ + modes = (2 << ((adev->id[ATA_ID_OLD_PIO_MODES] >> 8) & 0xFF)) - 1 ; return modes; + /* But wait.. there's more. Design your standards by committee and + you too can get a free iordy field to process. However its the + speeds not the modes that are supported... Note drivers using the + timing API will get this right anyway */ } struct ata_exec_internal_arg { -- cgit v1.2.3 From 1bc4ccfff8675adc3d96f91245eb7e2dc0043ca9 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Mon, 9 Jan 2006 17:18:14 +0000 Subject: [PATCH] libata: add a function to decide if we need iordy This ought to be simple but for PIO2 we have to poke around the drive data to get it 100% correct. Signed-off-by: Jeff Garzik --- drivers/scsi/libata-core.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'drivers/scsi') diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index bc48d88fef5..b42acbe0e9a 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -1168,6 +1168,39 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev, return AC_ERR_OTHER; } +/** + * ata_pio_need_iordy - check if iordy needed + * @adev: ATA device + * + * Check if the current speed of the device requires IORDY. Used + * by various controllers for chip configuration. + */ + +unsigned int ata_pio_need_iordy(const struct ata_device *adev) +{ + int pio; + int speed = adev->pio_mode - XFER_PIO_0; + + if (speed < 2) + return 0; + if (speed > 2) + return 1; + + /* If we have no drive specific rule, then PIO 2 is non IORDY */ + + if (adev->id[ATA_ID_FIELD_VALID] & 2) { /* EIDE */ + pio = adev->id[ATA_ID_EIDE_PIO]; + /* Is the speed faster than the drive allows non IORDY ? */ + if (pio) { + /* This is cycle times not frequency - watch the logic! */ + if (pio > 240) /* PIO2 is 240nS per cycle */ + return 1; + return 0; + } + } + return 0; +} + /** * ata_dev_identify - obtain IDENTIFY x DEVICE page * @ap: port on which device we wish to probe resides @@ -5126,6 +5159,7 @@ EXPORT_SYMBOL_GPL(ata_dev_id_string); EXPORT_SYMBOL_GPL(ata_dev_config); EXPORT_SYMBOL_GPL(ata_scsi_simulate); +EXPORT_SYMBOL_GPL(ata_pio_need_iordy); EXPORT_SYMBOL_GPL(ata_timing_compute); EXPORT_SYMBOL_GPL(ata_timing_merge); -- cgit v1.2.3