diff options
367 files changed, 16189 insertions, 8071 deletions
diff --git a/Documentation/ABI/testing/configfs-usb-gadget-ffs b/Documentation/ABI/testing/configfs-usb-gadget-ffs new file mode 100644 index 000000000000..14343e237e83 --- /dev/null +++ b/Documentation/ABI/testing/configfs-usb-gadget-ffs @@ -0,0 +1,9 @@ +What: /config/usb-gadget/gadget/functions/ffs.name +Date: Nov 2013 +KenelVersion: 3.13 +Description: The purpose of this directory is to create and remove it. + + A corresponding USB function instance is created/removed. + There are no attributes here. + + All parameters are set through FunctionFS. diff --git a/Documentation/ABI/testing/configfs-usb-gadget-loopback b/Documentation/ABI/testing/configfs-usb-gadget-loopback new file mode 100644 index 000000000000..852b2365a5b5 --- /dev/null +++ b/Documentation/ABI/testing/configfs-usb-gadget-loopback @@ -0,0 +1,8 @@ +What: /config/usb-gadget/gadget/functions/Loopback.name +Date: Nov 2013 +KenelVersion: 3.13 +Description: + The attributes: + + qlen - depth of loopback queue + bulk_buflen - buffer length diff --git a/Documentation/ABI/testing/configfs-usb-gadget-sourcesink b/Documentation/ABI/testing/configfs-usb-gadget-sourcesink new file mode 100644 index 000000000000..a30f3093ef6c --- /dev/null +++ b/Documentation/ABI/testing/configfs-usb-gadget-sourcesink @@ -0,0 +1,12 @@ +What: /config/usb-gadget/gadget/functions/SourceSink.name +Date: Nov 2013 +KenelVersion: 3.13 +Description: + The attributes: + + pattern - 0 (all zeros), 1 (mod63), 2 (none) + isoc_interval - 1..16 + isoc_maxpacket - 0 - 1023 (fs), 0 - 1024 (hs/ss) + isoc_mult - 0..2 (hs/ss only) + isoc_maxburst - 0..15 (ss only) + qlen - buffer length diff --git a/Documentation/ABI/testing/sysfs-bus-usb b/Documentation/ABI/testing/sysfs-bus-usb index 1430f584b266..614d451cee41 100644 --- a/Documentation/ABI/testing/sysfs-bus-usb +++ b/Documentation/ABI/testing/sysfs-bus-usb @@ -50,13 +50,19 @@ Description: This may allow the driver to support more hardware than was included in the driver's static device ID support table at compile time. The format for the device ID is: - idVendor idProduct bInterfaceClass. + idVendor idProduct bInterfaceClass RefIdVendor RefIdProduct The vendor ID and device ID fields are required, the - interface class is optional. + rest is optional. The Ref* tuple can be used to tell the + driver to use the same driver_data for the new device as + it is used for the reference device. Upon successfully adding an ID, the driver will probe for the device and attempt to bind to it. For example: # echo "8086 10f5" > /sys/bus/usb/drivers/foo/new_id + Here add a new device (0458:7045) using driver_data from + an already supported device (0458:704c): + # echo "0458 7045 0 0458 704c" > /sys/bus/usb/drivers/foo/new_id + Reading from this file will list all dynamically added device IDs in the same format, with one entry per line. For example: diff --git a/Documentation/ABI/testing/sysfs-platform-tahvo-usb b/Documentation/ABI/testing/sysfs-platform-tahvo-usb new file mode 100644 index 000000000000..f6e20ce4b538 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-platform-tahvo-usb @@ -0,0 +1,16 @@ +What: /sys/bus/platform/devices/tahvo-usb/otg_mode +Date: December 2013 +Contact: Aaro Koskinen <aaro.koskinen@iki.fi> +Description: + Set or read the current OTG mode. Valid values are "host" and + "peripheral". + + Reading: returns the current mode. + +What: /sys/bus/platform/devices/tahvo-usb/vbus +Date: December 2013 +Contact: Aaro Koskinen <aaro.koskinen@iki.fi> +Description: + Read the current VBUS state. + + Reading: returns "on" or "off". diff --git a/Documentation/devicetree/bindings/phy/bcm-phy.txt b/Documentation/devicetree/bindings/phy/bcm-phy.txt new file mode 100644 index 000000000000..3dc8b3d2ffbb --- /dev/null +++ b/Documentation/devicetree/bindings/phy/bcm-phy.txt @@ -0,0 +1,15 @@ +BROADCOM KONA USB2 PHY + +Required properties: + - compatible: brcm,kona-usb2-phy + - reg: offset and length of the PHY registers + - #phy-cells: must be 0 +Refer to phy/phy-bindings.txt for the generic PHY binding properties + +Example: + + usbphy: usb-phy@3f130000 { + compatible = "brcm,kona-usb2-phy"; + reg = <0x3f130000 0x28>; + #phy-cells = <0>; + }; diff --git a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt b/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt index b4b5b7906c88..b4b5b7906c88 100644 --- a/Documentation/devicetree/bindings/usb/ci13xxx-imx.txt +++ b/Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt diff --git a/Documentation/devicetree/bindings/usb/dwc2.txt b/Documentation/devicetree/bindings/usb/dwc2.txt index 8b60e90efe33..b8b6871f116f 100644 --- a/Documentation/devicetree/bindings/usb/dwc2.txt +++ b/Documentation/devicetree/bindings/usb/dwc2.txt @@ -7,6 +7,14 @@ Required properties: - snps,dwc2: A generic DWC2 USB controller with default parameters. - reg : Should contain 1 register range (address and length) - interrupts : Should contain 1 interrupt +- clocks: clock provider specifier +- clock-names: shall be "otg" +Refer to clk/clock-bindings.txt for generic clock consumer properties + +Optional properties: +- phys: phy provider specifier +- phy-names: shall be "device" +Refer to phy/phy-bindings.txt for generic phy consumer properties Example: @@ -14,4 +22,8 @@ Example: compatible = "ralink,rt3050-usb, snps,dwc2"; reg = <0x101c0000 40000>; interrupts = <18>; + clocks = <&usb_otg_ahb_clk>; + clock-names = "otg"; + phys = <&usbphy>; + phy-names = "usb2-phy"; }; diff --git a/Documentation/devicetree/bindings/usb/gr-udc.txt b/Documentation/devicetree/bindings/usb/gr-udc.txt new file mode 100644 index 000000000000..0c5118f7a916 --- /dev/null +++ b/Documentation/devicetree/bindings/usb/gr-udc.txt @@ -0,0 +1,28 @@ +USB Peripheral Controller driver for Aeroflex Gaisler GRUSBDC. + +The GRUSBDC USB Device Controller core is available in the GRLIB VHDL +IP core library. + +Note: In the ordinary environment for the core, a Leon SPARC system, +these properties are built from information in the AMBA plug&play. + +Required properties: + +- name : Should be "GAISLER_USBDC" or "01_021" + +- reg : Address and length of the register set for the device + +- interrupts : Interrupt numbers for this device + +Optional properties: + +- epobufsizes : An array of buffer sizes for OUT endpoints. If the property is + not present, or for endpoints outside of the array, 1024 is assumed by + the driver. + +- epibufsizes : An array of buffer sizes for IN endpoints. If the property is + not present, or for endpoints outside of the array, 1024 is assumed by + the driver. + +For further information look in the documentation for the GLIB IP core library: +http://www.gaisler.com/products/grlib/grip.pdf diff --git a/Documentation/devicetree/bindings/usb/omap-usb.txt b/Documentation/devicetree/bindings/usb/omap-usb.txt index 090e5e22bd2b..c495135115cb 100644 --- a/Documentation/devicetree/bindings/usb/omap-usb.txt +++ b/Documentation/devicetree/bindings/usb/omap-usb.txt @@ -87,6 +87,8 @@ Required properties: e.g. USB3 PHY and SATA PHY on OMAP5. "ti,control-phy-dra7usb2" - if it has power down register like USB2 PHY on DRA7 platform. + "ti,control-phy-am437usb2" - if it has power down register like USB2 PHY on + AM437 platform. - reg : Address and length of the register set for the device. It contains the address of "otghs_control" for control-phy-otghs or "power" register for other types. diff --git a/arch/arm/mach-omap1/include/mach/usb.h b/arch/arm/mach-omap1/include/mach/usb.h index 45e5ac707cbb..2c263051dc51 100644 --- a/arch/arm/mach-omap1/include/mach/usb.h +++ b/arch/arm/mach-omap1/include/mach/usb.h @@ -8,43 +8,7 @@ #define is_usb0_device(config) 0 #endif -struct omap_usb_config { - /* Configure drivers according to the connectors on your board: - * - "A" connector (rectagular) - * ... for host/OHCI use, set "register_host". - * - "B" connector (squarish) or "Mini-B" - * ... for device/gadget use, set "register_dev". - * - "Mini-AB" connector (very similar to Mini-B) - * ... for OTG use as device OR host, initialize "otg" - */ - unsigned register_host:1; - unsigned register_dev:1; - u8 otg; /* port number, 1-based: usb1 == 2 */ - - u8 hmc_mode; - - /* implicitly true if otg: host supports remote wakeup? */ - u8 rwc; - - /* signaling pins used to talk to transceiver on usbN: - * 0 == usbN unused - * 2 == usb0-only, using internal transceiver - * 3 == 3 wire bidirectional - * 4 == 4 wire bidirectional - * 6 == 6 wire unidirectional (or TLL) - */ - u8 pins[3]; - - struct platform_device *udc_device; - struct platform_device *ohci_device; - struct platform_device *otg_device; - - u32 (*usb0_init)(unsigned nwires, unsigned is_device); - u32 (*usb1_init)(unsigned nwires); - u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); - - int (*ocpi_enable)(void); -}; +#include <linux/platform_data/usb-omap1.h> void omap_otg_init(struct omap_usb_config *config); diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig index d0611b84d7f7..b901c472d7f3 100644 --- a/drivers/phy/Kconfig +++ b/drivers/phy/Kconfig @@ -57,4 +57,10 @@ config PHY_EXYNOS_DP_VIDEO help Support for Display Port PHY found on Samsung EXYNOS SoCs. +config BCM_KONA_USB2_PHY + tristate "Broadcom Kona USB2 PHY Driver" + depends on GENERIC_PHY + help + Enable this to support the Broadcom Kona USB 2.0 PHY. + endmenu diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile index 4e4adc96f753..b57c25371cca 100644 --- a/drivers/phy/Makefile +++ b/drivers/phy/Makefile @@ -3,6 +3,7 @@ # obj-$(CONFIG_GENERIC_PHY) += phy-core.o +obj-$(CONFIG_BCM_KONA_USB2_PHY) += phy-bcm-kona-usb2.o obj-$(CONFIG_PHY_EXYNOS_DP_VIDEO) += phy-exynos-dp-video.o obj-$(CONFIG_PHY_EXYNOS_MIPI_VIDEO) += phy-exynos-mipi-video.o obj-$(CONFIG_PHY_MVEBU_SATA) += phy-mvebu-sata.o diff --git a/drivers/phy/phy-bcm-kona-usb2.c b/drivers/phy/phy-bcm-kona-usb2.c new file mode 100644 index 000000000000..efc5c1a13a5d --- /dev/null +++ b/drivers/phy/phy-bcm-kona-usb2.c @@ -0,0 +1,158 @@ +/* + * phy-bcm-kona-usb2.c - Broadcom Kona USB2 Phy Driver + * + * Copyright (C) 2013 Linaro Limited + * Matt Porter <mporter@linaro.org> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * 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. + */ + +#include <linux/clk.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/phy/phy.h> +#include <linux/platform_device.h> + +#define OTGCTL (0) +#define OTGCTL_OTGSTAT2 BIT(31) +#define OTGCTL_OTGSTAT1 BIT(30) +#define OTGCTL_PRST_N_SW BIT(11) +#define OTGCTL_HRESET_N BIT(10) +#define OTGCTL_UTMI_LINE_STATE1 BIT(9) +#define OTGCTL_UTMI_LINE_STATE0 BIT(8) + +#define P1CTL (8) +#define P1CTL_SOFT_RESET BIT(1) +#define P1CTL_NON_DRIVING BIT(0) + +struct bcm_kona_usb { + void __iomem *regs; +}; + +static void bcm_kona_usb_phy_power(struct bcm_kona_usb *phy, int on) +{ + u32 val; + + val = readl(phy->regs + OTGCTL); + if (on) { + /* Configure and power PHY */ + val &= ~(OTGCTL_OTGSTAT2 | OTGCTL_OTGSTAT1 | + OTGCTL_UTMI_LINE_STATE1 | OTGCTL_UTMI_LINE_STATE0); + val |= OTGCTL_PRST_N_SW | OTGCTL_HRESET_N; + } else { + val &= ~(OTGCTL_PRST_N_SW | OTGCTL_HRESET_N); + } + writel(val, phy->regs + OTGCTL); +} + +static int bcm_kona_usb_phy_init(struct phy *gphy) +{ + struct bcm_kona_usb *phy = phy_get_drvdata(gphy); + u32 val; + + /* Soft reset PHY */ + val = readl(phy->regs + P1CTL); + val &= ~P1CTL_NON_DRIVING; + val |= P1CTL_SOFT_RESET; + writel(val, phy->regs + P1CTL); + writel(val & ~P1CTL_SOFT_RESET, phy->regs + P1CTL); + /* Reset needs to be asserted for 2ms */ + mdelay(2); + writel(val | P1CTL_SOFT_RESET, phy->regs + P1CTL); + + return 0; +} + +static int bcm_kona_usb_phy_power_on(struct phy *gphy) +{ + struct bcm_kona_usb *phy = phy_get_drvdata(gphy); + + bcm_kona_usb_phy_power(phy, 1); + + return 0; +} + +static int bcm_kona_usb_phy_power_off(struct phy *gphy) +{ + struct bcm_kona_usb *phy = phy_get_drvdata(gphy); + + bcm_kona_usb_phy_power(phy, 0); + + return 0; +} + +static struct phy_ops ops = { + .init = bcm_kona_usb_phy_init, + .power_on = bcm_kona_usb_phy_power_on, + .power_off = bcm_kona_usb_phy_power_off, + .owner = THIS_MODULE, +}; + +static int bcm_kona_usb2_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct bcm_kona_usb *phy; + struct resource *res; + struct phy *gphy; + struct phy_provider *phy_provider; + + phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL); + if (!phy) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + phy->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(phy->regs)) + return PTR_ERR(phy->regs); + + platform_set_drvdata(pdev, phy); + + gphy = devm_phy_create(dev, &ops, NULL); + if (IS_ERR(gphy)) + return PTR_ERR(gphy); + + /* The Kona PHY supports an 8-bit wide UTMI interface */ + phy_set_bus_width(gphy, 8); + + phy_set_drvdata(gphy, phy); + + phy_provider = devm_of_phy_provider_register(dev, + of_phy_simple_xlate); + if (IS_ERR(phy_provider)) + return PTR_ERR(phy_provider); + + return 0; +} + +static const struct of_device_id bcm_kona_usb2_dt_ids[] = { + { .compatible = "brcm,kona-usb2-phy" }, + { /* sentinel */ } +}; + +MODULE_DEVICE_TABLE(of, bcm_kona_usb2_dt_ids); + +static struct platform_driver bcm_kona_usb2_driver = { + .probe = bcm_kona_usb2_probe, + .driver = { + .name = "bcm-kona-usb2", + .owner = THIS_MODULE, + .of_match_table = bcm_kona_usb2_dt_ids, + }, +}; + +module_platform_driver(bcm_kona_usb2_driver); + +MODULE_ALIAS("platform:bcm-kona-usb2"); +MODULE_AUTHOR("Matt Porter <mporter@linaro.org>"); +MODULE_DESCRIPTION("BCM Kona USB 2.0 PHY driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/staging/octeon-usb/octeon-hcd.c b/drivers/staging/octeon-usb/octeon-hcd.c index d118952c0a74..47e0a91238a1 100644 --- a/drivers/staging/octeon-usb/octeon-hcd.c +++ b/drivers/staging/octeon-usb/octeon-hcd.c @@ -3498,6 +3498,7 @@ static int octeon_usb_driver_probe(struct device *dev) kfree(hcd); return -1; } + device_wakeup_enable(hcd->self.controller); dev_dbg(dev, "Registered HCD for port %d on irq %d\n", usb_num, irq); diff --git a/drivers/staging/ozwpan/ozhcd.c b/drivers/staging/ozwpan/ozhcd.c index d9c43c3282e7..efaf26f734c3 100644 --- a/drivers/staging/ozwpan/ozhcd.c +++ b/drivers/staging/ozwpan/ozhcd.c @@ -2270,6 +2270,8 @@ static int oz_plat_probe(struct platform_device *dev) usb_put_hcd(hcd); return -1; } + device_wakeup_enable(hcd->self.controller); + spin_lock_bh(&g_hcdlock); g_ozhcd = ozhcd; spin_unlock_bh(&g_hcdlock); diff --git a/drivers/usb/Kconfig b/drivers/usb/Kconfig index 7eb909aa8bc0..2e6b832e004b 100644 --- a/drivers/usb/Kconfig +++ b/drivers/usb/Kconfig @@ -94,8 +94,6 @@ source "drivers/usb/wusbcore/Kconfig" source "drivers/usb/host/Kconfig" -source "drivers/usb/musb/Kconfig" - source "drivers/usb/renesas_usbhs/Kconfig" source "drivers/usb/class/Kconfig" @@ -106,6 +104,8 @@ source "drivers/usb/image/Kconfig" endif +source "drivers/usb/musb/Kconfig" + source "drivers/usb/dwc3/Kconfig" source "drivers/usb/dwc2/Kconfig" diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 8a7eb77233b4..813d4d3a51c6 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c @@ -35,7 +35,6 @@ #include <linux/timer.h> #include <linux/errno.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/device.h> #include <linux/firmware.h> #include <linux/mutex.h> diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index 69461d653972..0dc8c06a7b5f 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c @@ -27,7 +27,6 @@ #include <linux/device.h> #include <linux/errno.h> #include <linux/firmware.h> -#include <linux/init.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index defff43950bc..5a459377574b 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c @@ -57,7 +57,6 @@ #include <linux/module.h> #include <linux/moduleparam.h> -#include <linux/init.h> #include <linux/crc32.h> #include <linux/usb.h> #include <linux/firmware.h> diff --git a/drivers/usb/atm/usbatm.c b/drivers/usb/atm/usbatm.c index 25a7bfcf666c..dada0146cd7f 100644 --- a/drivers/usb/atm/usbatm.c +++ b/drivers/usb/atm/usbatm.c @@ -170,9 +170,9 @@ struct usbatm_control { static void usbatm_atm_dev_close(struct atm_dev *atm_dev); static int usbatm_atm_open(struct atm_vcc *vcc); static void usbatm_atm_close(struct atm_vcc *vcc); -static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user * arg); +static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg); static int usbatm_atm_send(struct atm_vcc *vcc, struct sk_buff *skb); -static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page); +static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t *pos, char *page); static struct atmdev_ops usbatm_atm_devops = { .dev_close = usbatm_atm_dev_close, @@ -739,7 +739,7 @@ static void usbatm_atm_dev_close(struct atm_dev *atm_dev) usbatm_put_instance(instance); /* taken in usbatm_atm_init */ } -static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page) +static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t *pos, char *page) { struct usbatm_data *instance = atm_dev->dev_data; int left = *pos; @@ -895,7 +895,7 @@ static void usbatm_atm_close(struct atm_vcc *vcc) } static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, - void __user * arg) + void __user *arg) { struct usbatm_data *instance = atm_dev->dev_data; diff --git a/drivers/usb/c67x00/Makefile b/drivers/usb/c67x00/Makefile index b1218683c8ec..da5f314a5de0 100644 --- a/drivers/usb/c67x00/Makefile +++ b/drivers/usb/c67x00/Makefile @@ -2,8 +2,6 @@ # Makefile for Cypress C67X00 USB Controller # -ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG - obj-$(CONFIG_USB_C67X00_HCD) += c67x00.o c67x00-y := c67x00-drv.o c67x00-ll-hpi.o c67x00-hcd.o c67x00-sched.o diff --git a/drivers/usb/c67x00/c67x00-hcd.c b/drivers/usb/c67x00/c67x00-hcd.c index 75e47b860a53..20ec4eee1ac8 100644 --- a/drivers/usb/c67x00/c67x00-hcd.c +++ b/drivers/usb/c67x00/c67x00-hcd.c @@ -384,6 +384,8 @@ int c67x00_hcd_probe(struct c67x00_sie *sie) goto err2; } + device_wakeup_enable(hcd->self.controller); + spin_lock_irqsave(&sie->lock, flags); sie->private_data = c67x00; sie->irq = c67x00_hcd_irq; diff --git a/drivers/usb/c67x00/c67x00-hcd.h b/drivers/usb/c67x00/c67x00-hcd.h index e3d493d4d61a..cf8a455a6403 100644 --- a/drivers/usb/c67x00/c67x00-hcd.h +++ b/drivers/usb/c67x00/c67x00-hcd.h @@ -45,7 +45,7 @@ /* * The current implementation switches between _STD (default) and _ISO (when * isochronous transfers are scheduled), in order to optimize the throughput - * in normal cicrumstances, but also provide good isochronous behaviour. + * in normal circumstances, but also provide good isochronous behaviour. * * Bandwidth is described in bit time so with a 12MHz USB clock and 1ms * frames; there are 12000 bit times per frame. diff --git a/drivers/usb/c67x00/c67x00-ll-hpi.c b/drivers/usb/c67x00/c67x00-ll-hpi.c index 3a1ca4dfc83a..b58151841e10 100644 --- a/drivers/usb/c67x00/c67x00-ll-hpi.c +++ b/drivers/usb/c67x00/c67x00-ll-hpi.c @@ -22,6 +22,7 @@ */ #include <asm/byteorder.h> +#include <linux/delay.h> #include <linux/io.h> #include <linux/jiffies.h> #include <linux/usb/c67x00.h> @@ -62,8 +63,8 @@ struct c67x00_lcp_int_data { * HPI implementation * * The c67x00 chip also support control via SPI or HSS serial - * interfaces. However, this driver assumes that register access can - * be performed from IRQ context. While this is a safe assuption with + * interfaces. However, this driver assumes that register access can + * be performed from IRQ context. While this is a safe assumption with * the HPI interface, it is not true for the serial interfaces. */ @@ -73,13 +74,22 @@ struct c67x00_lcp_int_data { #define HPI_ADDR 2 #define HPI_STATUS 3 +/* + * According to CY7C67300 specification (tables 140 and 141) HPI read and + * write cycle duration Tcyc must be at least 6T long, where T is 1/48MHz, + * which is 125ns. + */ +#define HPI_T_CYC_NS 125 + static inline u16 hpi_read_reg(struct c67x00_device *dev, int reg) { + ndelay(HPI_T_CYC_NS); return __raw_readw(dev->hpi.base + reg * dev->hpi.regstep); } static inline void hpi_write_reg(struct c67x00_device *dev, int reg, u16 value) { + ndelay(HPI_T_CYC_NS); __raw_writew(value, dev->hpi.base + reg * dev->hpi.regstep); } diff --git a/drivers/usb/c67x00/c67x00-sched.c b/drivers/usb/c67x00/c67x00-sched.c index 892cc96466eb..7311ed61e99a 100644 --- a/drivers/usb/c67x00/c67x00-sched.c +++ b/drivers/usb/c67x00/c67x00-sched.c @@ -144,8 +144,6 @@ struct c67x00_urb_priv { /* -------------------------------------------------------------------------- */ -#ifdef DEBUG - /** * dbg_td - Dump the contents of the TD */ @@ -166,16 +164,8 @@ static void dbg_td(struct c67x00_hcd *c67x00, struct c67x00_td *td, char *msg) dev_dbg(dev, "retry_cnt: 0x%02x\n", td->retry_cnt); dev_dbg(dev, "residue: 0x%02x\n", td->residue); dev_dbg(dev, "next_td_addr: 0x%04x\n", td_next_td_addr(td)); - dev_dbg(dev, "data:"); - print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1, - td->data, td_length(td), 1); + dev_dbg(dev, "data: %*ph\n", td_length(td), td->data); } -#else /* DEBUG */ - -static inline void -dbg_td(struct c67x00_hcd *c67x00, struct c67x00_td *td, char *msg) { } - -#endif /* DEBUG */ /* -------------------------------------------------------------------------- */ /* Helper functions */ @@ -372,6 +362,13 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd, struct c67x00_hcd *c67x00 = hcd_to_c67x00_hcd(hcd); int port = get_root_port(urb->dev)-1; + /* Allocate and initialize urb private data */ + urbp = kzalloc(sizeof(*urbp), mem_flags); + if (!urbp) { + ret = -ENOMEM; + goto err_urbp; + } + spin_lock_irqsave(&c67x00->lock, flags); /* Make sure host controller is running */ @@ -384,13 +381,6 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd, if (ret) goto err_not_linked; - /* Allocate and initialize urb private data */ - urbp = kzalloc(sizeof(*urbp), mem_flags); - if (!urbp) { - ret = -ENOMEM; - goto err_urbp; - } - INIT_LIST_HEAD(&urbp->hep_node); urbp->urb = urb; urbp->port = port; @@ -453,11 +443,11 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd, return 0; err_epdata: - kfree(urbp); -err_urbp: usb_hcd_unlink_urb_from_ep(hcd, urb); err_not_linked: spin_unlock_irqrestore(&c67x00->lock, flags); + kfree(urbp); +err_urbp: return ret; } @@ -780,7 +770,8 @@ static int c67x00_add_iso_urb(struct c67x00_hcd *c67x00, struct urb *urb) ret = c67x00_create_td(c67x00, urb, td_buf, len, pid, 0, urbp->cnt); if (ret) { - printk(KERN_DEBUG "create failed: %d\n", ret); + dev_dbg(c67x00_hcd_dev(c67x00), "create failed: %d\n", + ret); urb->iso_frame_desc[urbp->cnt].actual_length = 0; urb->iso_frame_desc[urbp->cnt].status = ret; if (urbp->cnt + 1 == urb->number_of_packets) diff --git a/drivers/usb/chipidea/Makefile b/drivers/usb/chipidea/Makefile index a99d980454a6..7345d2115af2 100644 --- a/drivers/usb/chipidea/Makefile +++ b/drivers/usb/chipidea/Makefile @@ -17,5 +17,5 @@ ifneq ($(CONFIG_PCI),) endif ifneq ($(CONFIG_OF),) - obj-$(CONFIG_USB_CHIPIDEA) += ci_hdrc_imx.o usbmisc_imx.o + obj-$(CONFIG_USB_CHIPIDEA) += usbmisc_imx.o ci_hdrc_imx.o endif diff --git a/drivers/usb/chipidea/ci.h b/drivers/usb/chipidea/ci.h index 1c94fc5257f4..88b80f7728e4 100644 --- a/drivers/usb/chipidea/ci.h +++ b/drivers/usb/chipidea/ci.h @@ -26,6 +26,35 @@ #define ENDPT_MAX 32 /****************************************************************************** + * REGISTERS + *****************************************************************************/ +/* register indices */ +enum ci_hw_regs { + CAP_CAPLENGTH, + CAP_HCCPARAMS, + CAP_DCCPARAMS, + CAP_TESTMODE, + CAP_LAST = CAP_TESTMODE, + OP_USBCMD, + OP_USBSTS, + OP_USBINTR, + OP_DEVICEADDR, + OP_ENDPTLISTADDR, + OP_PORTSC, + OP_DEVLC, + OP_OTGSC, + OP_USBMODE, + OP_ENDPTSETUPSTAT, + OP_ENDPTPRIME, + OP_ENDPTFLUSH, + OP_ENDPTSTAT, + OP_ENDPTCOMPLETE, + OP_ENDPTCTRL, + /* endptctrl1..15 follow */ + OP_LAST = OP_ENDPTCTRL + ENDPT_MAX / 2, +}; + +/****************************************************************************** * STRUCTURES *****************************************************************************/ /** @@ -98,7 +127,7 @@ struct hw_bank { void __iomem *cap; void __iomem *op; size_t size; - void __iomem **regmap; + void __iomem *regmap[OP_LAST + 1]; }; /** @@ -135,6 +164,7 @@ struct hw_bank { * @id_event: indicates there is an id event, and handled at ci_otg_work * @b_sess_valid_event: indicates there is a vbus event, and handled * at ci_otg_work + * @imx28_write_fix: Freescale imx28 needs swp instruction for writing */ struct ci_hdrc { struct device *dev; @@ -173,6 +203,7 @@ struct ci_hdrc { struct dentry *debugfs; bool id_event; bool b_sess_valid_event; + bool imx28_write_fix; }; static inline struct ci_role_driver *ci_role(struct ci_hdrc *ci) @@ -209,38 +240,6 @@ static inline void ci_role_stop(struct ci_hdrc *ci) ci->roles[role]->stop(ci); } -/****************************************************************************** - * REGISTERS - *****************************************************************************/ -/* register size */ -#define REG_BITS (32) - -/* register indices */ -enum ci_hw_regs { - CAP_CAPLENGTH, - CAP_HCCPARAMS, - CAP_DCCPARAMS, - CAP_TESTMODE, - CAP_LAST = CAP_TESTMODE, - OP_USBCMD, - OP_USBSTS, - OP_USBINTR, - OP_DEVICEADDR, - OP_ENDPTLISTADDR, - OP_PORTSC, - OP_DEVLC, - OP_OTGSC, - OP_USBMODE, - OP_ENDPTSETUPSTAT, - OP_ENDPTPRIME, - OP_ENDPTFLUSH, - OP_ENDPTSTAT, - OP_ENDPTCOMPLETE, - OP_ENDPTCTRL, - /* endptctrl1..15 follow */ - OP_LAST = OP_ENDPTCTRL + ENDPT_MAX / 2, -}; - /** * hw_read: reads from a hw register * @reg: register index @@ -253,6 +252,26 @@ static inline u32 hw_read(struct ci_hdrc *ci, enum ci_hw_regs reg, u32 mask) return ioread32(ci->hw_bank.regmap[reg]) & mask; } +#ifdef CONFIG_SOC_IMX28 +static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr) +{ + __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr)); +} +#else +static inline void imx28_ci_writel(u32 val, volatile void __iomem *addr) +{ +} +#endif + +static inline void __hw_write(struct ci_hdrc *ci, u32 val, + void __iomem *addr) +{ + if (ci->imx28_write_fix) + imx28_ci_writel(val, addr); + else + iowrite32(val, addr); +} + /** * hw_write: writes to a hw register * @reg: register index @@ -266,7 +285,7 @@ static inline void hw_write(struct ci_hdrc *ci, enum ci_hw_regs reg, data = (ioread32(ci->hw_bank.regmap[reg]) & ~mask) | (data & mask); - iowrite32(data, ci->hw_bank.regmap[reg]); + __hw_write(ci, data, ci->hw_bank.regmap[reg]); } /** @@ -281,7 +300,7 @@ static inline u32 hw_test_and_clear(struct ci_hdrc *ci, enum ci_hw_regs reg, { u32 val = ioread32(ci->hw_bank.regmap[reg]) & mask; - iowrite32(val, ci->hw_bank.regmap[reg]); + __hw_write(ci, val, ci->hw_bank.regmap[reg]); return val; } diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c index bb5d976e5b81..c00f77257d36 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.c +++ b/drivers/usb/chipidea/ci_hdrc_imx.c @@ -23,6 +23,26 @@ #include "ci.h" #include "ci_hdrc_imx.h" +#define CI_HDRC_IMX_IMX28_WRITE_FIX BIT(0) + +struct ci_hdrc_imx_platform_flag { + unsigned int flags; +}; + +static const struct ci_hdrc_imx_platform_flag imx27_usb_data = { +}; + +static const struct ci_hdrc_imx_platform_flag imx28_usb_data = { + .flags = CI_HDRC_IMX_IMX28_WRITE_FIX, +}; + +static const struct of_device_id ci_hdrc_imx_dt_ids[] = { + { .compatible = "fsl,imx28-usb", .data = &imx28_usb_data}, + { .compatible = "fsl,imx27-usb", .data = &imx27_usb_data}, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ci_hdrc_imx_dt_ids); + struct ci_hdrc_imx_data { struct usb_phy *phy; struct platform_device *ci_pdev; @@ -82,6 +102,9 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) CI_HDRC_DISABLE_STREAMING, }; int ret; + const struct of_device_id *of_id = + of_match_device(ci_hdrc_imx_dt_ids, &pdev->dev); + const struct ci_hdrc_imx_platform_flag *imx_platform_flag = of_id->data; data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL); if (!data) { @@ -115,6 +138,9 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) pdata.phy = data->phy; + if (imx_platform_flag->flags & CI_HDRC_IMX_IMX28_WRITE_FIX) + pdata.flags |= CI_HDRC_IMX28_WRITE_FIX; + ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); if (ret) goto err_clk; @@ -173,12 +199,6 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev) return 0; } -static const struct of_device_id ci_hdrc_imx_dt_ids[] = { - { .compatible = "fsl,imx27-usb", }, - { /* sentinel */ } -}; -MODULE_DEVICE_TABLE(of, ci_hdrc_imx_dt_ids); - static struct platform_driver ci_hdrc_imx_driver = { .probe = ci_hdrc_imx_probe, .remove = ci_hdrc_imx_remove, diff --git a/drivers/usb/chipidea/ci_hdrc_imx.h b/drivers/usb/chipidea/ci_hdrc_imx.h index c7271590dd0a..996ec93467b2 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.h +++ b/drivers/usb/chipidea/ci_hdrc_imx.h @@ -9,6 +9,9 @@ * http://www.gnu.org/copyleft/gpl.html */ +#ifndef __DRIVER_USB_CHIPIDEA_CI_HDRC_IMX_H +#define __DRIVER_USB_CHIPIDEA_CI_HDRC_IMX_H + struct imx_usbmisc_data { int index; @@ -18,3 +21,5 @@ struct imx_usbmisc_data { int imx_usbmisc_init(struct imx_usbmisc_data *); int imx_usbmisc_init_post(struct imx_usbmisc_data *); + +#endif /* __DRIVER_USB_CHIPIDEA_CI_HDRC_IMX_H */ diff --git a/drivers/usb/chipidea/ci_hdrc_pci.c b/drivers/usb/chipidea/ci_hdrc_pci.c index d514332ac081..241ae3444fde 100644 --- a/drivers/usb/chipidea/ci_hdrc_pci.c +++ b/drivers/usb/chipidea/ci_hdrc_pci.c @@ -112,7 +112,7 @@ static void ci_hdrc_pci_remove(struct pci_dev *pdev) * * Check "pci.h" for details */ -static DEFINE_PCI_DEVICE_TABLE(ci_hdrc_pci_id_table) = { +static const struct pci_device_id ci_hdrc_pci_id_table[] = { { PCI_DEVICE(0x153F, 0x1004), .driver_data = (kernel_ulong_t)&pci_platdata, diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index 6e73f8cd60e5..33f22bc6ad7f 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -75,61 +75,54 @@ #include "otg.h" /* Controller register map */ -static uintptr_t ci_regs_nolpm[] = { - [CAP_CAPLENGTH] = 0x000UL, - [CAP_HCCPARAMS] = 0x008UL, - [CAP_DCCPARAMS] = 0x024UL, - [CAP_TESTMODE] = 0x038UL, - [OP_USBCMD] = 0x000UL, - [OP_USBSTS] = 0x004UL, - [OP_USBINTR] = 0x008UL, - [OP_DEVICEADDR] = 0x014UL, - [OP_ENDPTLISTADDR] = 0x018UL, - [OP_PORTSC] = 0x044UL, - [OP_DEVLC] = 0x084UL, - [OP_OTGSC] = 0x064UL, - [OP_USBMODE] = 0x068UL, - [OP_ENDPTSETUPSTAT] = 0x06CUL, - [OP_ENDPTPRIME] = 0x070UL, - [OP_ENDPTFLUSH] = 0x074UL, - [OP_ENDPTSTAT] = 0x078UL, - [OP_ENDPTCOMPLETE] = 0x07CUL, - [OP_ENDPTCTRL] = 0x080UL, +static const u8 ci_regs_nolpm[] = { + [CAP_CAPLENGTH] = 0x00U, + [CAP_HCCPARAMS] = 0x08U, + [CAP_DCCPARAMS] = 0x24U, + [CAP_TESTMODE] = 0x38U, + [OP_USBCMD] = 0x00U, + [OP_USBSTS] = 0x04U, + [OP_USBINTR] = 0x08U, + [OP_DEVICEADDR] = 0x14U, + [OP_ENDPTLISTADDR] = 0x18U, + [OP_PORTSC] = 0x44U, + [OP_DEVLC] = 0x84U, + [OP_OTGSC] = 0x64U, + [OP_USBMODE] = 0x68U, + [OP_ENDPTSETUPSTAT] = 0x6CU, + [OP_ENDPTPRIME] = 0x70U, + [OP_ENDPTFLUSH] = 0x74U, + [OP_ENDPTSTAT] = 0x78U, + [OP_ENDPTCOMPLETE] = 0x7CU, + [OP_ENDPTCTRL] = 0x80U, }; -static uintptr_t ci_regs_lpm[] = { - [CAP_CAPLENGTH] = 0x000UL, - [CAP_HCCPARAMS] = 0x008UL, - [CAP_DCCPARAMS] = 0x024UL, - [CAP_TESTMODE] = 0x0FCUL, - [OP_USBCMD] = 0x000UL, - [OP_USBSTS] = 0x004UL, - [OP_USBINTR] = 0x008UL, - [OP_DEVICEADDR] = 0x014UL, - [OP_ENDPTLISTADDR] = 0x018UL, - [OP_PORTSC] = 0x044UL, - [OP_DEVLC] = 0x084UL, - [OP_OTGSC] = 0x0C4UL, - [OP_USBMODE] = 0x0C8UL, - [OP_ENDPTSETUPSTAT] = 0x0D8UL, - [OP_ENDPTPRIME] = 0x0DCUL, - [OP_ENDPTFLUSH] = 0x0E0UL, - [OP_ENDPTSTAT] = 0x0E4UL, - [OP_ENDPTCOMPLETE] = 0x0E8UL, - [OP_ENDPTCTRL] = 0x0ECUL, +static const u8 ci_regs_lpm[] = { + [CAP_CAPLENGTH] = 0x00U, + [CAP_HCCPARAMS] = 0x08U, + [CAP_DCCPARAMS] = 0x24U, + [CAP_TESTMODE] = 0xFCU, + [OP_USBCMD] = 0x00U, + [OP_USBSTS] = 0x04U, + [OP_USBINTR] = 0x08U, + [OP_DEVICEADDR] = 0x14U, + [OP_ENDPTLISTADDR] = 0x18U, + [OP_PORTSC] = 0x44U, + [OP_DEVLC] = 0x84U, + [OP_OTGSC] = 0xC4U, + [OP_USBMODE] = 0xC8U, + [OP_ENDPTSETUPSTAT] = 0xD8U, + [OP_ENDPTPRIME] = 0xDCU, + [OP_ENDPTFLUSH] = 0xE0U, + [OP_ENDPTSTAT] = 0xE4U, + [OP_ENDPTCOMPLETE] = 0xE8U, + [OP_ENDPTCTRL] = 0xECU, }; static int hw_alloc_regmap(struct ci_hdrc *ci, bool is_lpm) { int i; - kfree(ci->hw_bank.regmap); - - ci->hw_bank.regmap = kzalloc((OP_LAST + 1) * sizeof(void *), - GFP_KERNEL); - if (!ci->hw_bank.regmap) - return -ENOMEM; - for (i = 0; i < OP_ENDPTCTRL; i++) ci->hw_bank.regmap[i] = (i <= CAP_LAST ? ci->hw_bank.cap : ci->hw_bank.op) + @@ -208,7 +201,8 @@ static int hw_device_init(struct ci_hdrc *ci, void __iomem *base) reg = hw_read(ci, CAP_HCCPARAMS, HCCPARAMS_LEN) >> __ffs(HCCPARAMS_LEN); ci->hw_bank.lpm = reg; - hw_alloc_regmap(ci, !!reg); + if (reg) + hw_alloc_regmap(ci, !!reg); ci->hw_bank.size = ci->hw_bank.op - ci->hw_bank.abs; ci->hw_bank.size += OP_LAST; ci->hw_bank.size /= sizeof(u32); @@ -242,7 +236,7 @@ static int hw_device_init(struct ci_hdrc *ci, void __iomem *base) static void hw_phymode_configure(struct ci_hdrc *ci) { - u32 portsc, lpm, sts; + u32 portsc, lpm, sts = 0; switch (ci->platdata->phy_mode) { case USBPHY_INTERFACE_MODE_UTMI: @@ -272,10 +266,12 @@ static void hw_phymode_configure(struct ci_hdrc *ci) if (ci->hw_bank.lpm) { hw_write(ci, OP_DEVLC, DEVLC_PTS(7) | DEVLC_PTW, lpm); - hw_write(ci, OP_DEVLC, DEVLC_STS, sts); + if (sts) + hw_write(ci, OP_DEVLC, DEVLC_STS, DEVLC_STS); } else { hw_write(ci, OP_PORTSC, PORTSC_PTS(7) | PORTSC_PTW, portsc); - hw_write(ci, OP_PORTSC, PORTSC_STS, sts); + if (sts) + hw_write(ci, OP_PORTSC, PORTSC_STS, PORTSC_STS); } } @@ -554,6 +550,8 @@ static int ci_hdrc_probe(struct platform_device *pdev) ci->dev = dev; ci->platdata = dev->platform_data; + ci->imx28_write_fix = !!(ci->platdata->flags & + CI_HDRC_IMX28_WRITE_FIX); ret = hw_device_init(ci, base); if (ret < 0) { @@ -561,6 +559,8 @@ static int ci_hdrc_probe(struct platform_device *pdev) return -ENODEV; } + hw_phymode_configure(ci); + ret = ci_usb_phy_init(ci); if (ret) { dev_err(dev, "unable to init phy: %d\n", ret); @@ -578,8 +578,6 @@ static int ci_hdrc_probe(struct platform_device *pdev) ci_get_otg_capable(ci); - hw_phymode_configure(ci); - dr_mode = ci->platdata->dr_mode; /* initialize role(s) before the interrupt is requested */ if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) { @@ -680,7 +678,6 @@ static int ci_hdrc_remove(struct platform_device *pdev) ci_role_destroy(ci); ci_hdrc_enter_lpm(ci, true); ci_usb_phy_destroy(ci); - kfree(ci->hw_bank.regmap); return 0; } diff --git a/drivers/usb/chipidea/host.c b/drivers/usb/chipidea/host.c index 526cd77563d8..a8ac6c16dac9 100644 --- a/drivers/usb/chipidea/host.c +++ b/drivers/usb/chipidea/host.c @@ -65,6 +65,7 @@ static int host_start(struct ci_hdrc *ci) ehci->caps = ci->hw_bank.cap; ehci->has_hostpc = ci->hw_bank.lpm; ehci->has_tdi_phy_lpm = ci->hw_bank.lpm; + ehci->imx28_write_fix = ci->imx28_write_fix; if (ci->platdata->reg_vbus) { ret = regulator_enable(ci->platdata->reg_vbus); diff --git a/drivers/usb/chipidea/otg.h b/drivers/usb/chipidea/otg.h index 2d9f090733bc..449bee07f4fe 100644 --- a/drivers/usb/chipidea/otg.h +++ b/drivers/usb/chipidea/otg.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Freescale Semiconductor, Inc. + * Copyright (C) 2013-2014 Freescale Semiconductor, Inc. * * Author: Peter Chen * @@ -19,12 +19,12 @@ static inline void ci_clear_otg_interrupt(struct ci_hdrc *ci, u32 bits) static inline void ci_enable_otg_interrupt(struct ci_hdrc *ci, u32 bits) { - hw_write(ci, OP_OTGSC, bits, bits); + hw_write(ci, OP_OTGSC, bits | OTGSC_INT_STATUS_BITS, bits); } static inline void ci_disable_otg_interrupt(struct ci_hdrc *ci, u32 bits) { - hw_write(ci, OP_OTGSC, bits, 0); + hw_write(ci, OP_OTGSC, bits | OTGSC_INT_STATUS_BITS, 0); } int ci_hdrc_otg_init(struct ci_hdrc *ci); diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index 69d20fbb38a2..80de2f88ed2c 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c @@ -393,6 +393,14 @@ static int add_td_to_list(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq, node->ptr->token = cpu_to_le32(length << __ffs(TD_TOTAL_BYTES)); node->ptr->token &= cpu_to_le32(TD_TOTAL_BYTES); node->ptr->token |= cpu_to_le32(TD_STATUS_ACTIVE); + if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX) { + u32 mul = hwreq->req.length / hwep->ep.maxpacket; + + if (hwreq->req.length == 0 + || hwreq->req.length % hwep->ep.maxpacket) + mul++; + node->ptr->token |= mul << __ffs(TD_MULTO); + } temp = (u32) (hwreq->req.dma + hwreq->req.actual); if (length) { @@ -515,10 +523,11 @@ static int _hardware_enqueue(struct ci_hw_ep *hwep, struct ci_hw_req *hwreq) hwep->qh.ptr->td.token &= cpu_to_le32(~(TD_STATUS_HALTED|TD_STATUS_ACTIVE)); - if (hwep->type == USB_ENDPOINT_XFER_ISOC) { + if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == RX) { u32 mul = hwreq->req.length / hwep->ep.maxpacket; - if (hwreq->req.length % hwep->ep.maxpacket) + if (hwreq->req.length == 0 + || hwreq->req.length % hwep->ep.maxpacket) mul++; hwep->qh.ptr->cap |= mul << __ffs(QH_MULT); } @@ -1173,6 +1182,12 @@ static int ep_enable(struct usb_ep *ep, if (hwep->num) cap |= QH_ZLT; cap |= (hwep->ep.maxpacket << __ffs(QH_MAX_PKT)) & QH_MAX_PKT; + /* + * For ISO-TX, we set mult at QH as the largest value, and use + * MultO at TD as real mult value. + */ + if (hwep->type == USB_ENDPOINT_XFER_ISOC && hwep->dir == TX) + cap |= 3 << __ffs(QH_MULT); hwep->qh.ptr->cap = cpu_to_le32(cap); @@ -1566,7 +1581,7 @@ static int init_eps(struct ci_hdrc *ci) * eps, maxP is set by epautoconfig() called * by gadget layer */ - hwep->ep.maxpacket = (unsigned short)~0; + usb_ep_set_maxpacket_limit(&hwep->ep, (unsigned short)~0); INIT_LIST_HEAD(&hwep->qh.queue); hwep->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL, @@ -1586,7 +1601,7 @@ static int init_eps(struct ci_hdrc *ci) else ci->ep0in = hwep; - hwep->ep.maxpacket = CTRL_PAYLOAD_MAX; + usb_ep_set_maxpacket_limit(&hwep->ep, CTRL_PAYLOAD_MAX); continue; } diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c index 8a1094b1182f..cd061abe3507 100644 --- a/drivers/usb/chipidea/usbmisc_imx.c +++ b/drivers/usb/chipidea/usbmisc_imx.c @@ -21,6 +21,10 @@ #define MX25_USB_PHY_CTRL_OFFSET 0x08 #define MX25_BM_EXTERNAL_VBUS_DIVIDER BIT(23) +#define MX27_H1_PM_BIT BIT(8) +#define MX27_H2_PM_BIT BIT(16) +#define MX27_OTG_PM_BIT BIT(24) + #define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08 #define MX53_USB_UH2_CTRL_OFFSET 0x14 #define MX53_USB_UH3_CTRL_OFFSET 0x18 @@ -68,6 +72,36 @@ static int usbmisc_imx25_post(struct imx_usbmisc_data *data) return 0; } +static int usbmisc_imx27_init(struct imx_usbmisc_data *data) +{ + unsigned long flags; + u32 val; + + switch (data->index) { + case 0: + val = MX27_OTG_PM_BIT; + break; + case 1: + val = MX27_H1_PM_BIT; + break; + case 2: + val = MX27_H2_PM_BIT; + break; + default: + return -EINVAL; + }; + + spin_lock_irqsave(&usbmisc->lock, flags); + if (data->disable_oc) + val = readl(usbmisc->base) | val; + else + val = readl(usbmisc->base) & ~val; + writel(val, usbmisc->base); + spin_unlock_irqrestore(&usbmisc->lock, flags); + + return 0; +} + static int usbmisc_imx53_init(struct imx_usbmisc_data *data) { void __iomem *reg = NULL; @@ -128,6 +162,10 @@ static const struct usbmisc_ops imx25_usbmisc_ops = { .post = usbmisc_imx25_post, }; +static const struct usbmisc_ops imx27_usbmisc_ops = { + .init = usbmisc_imx27_init, +}; + static const struct usbmisc_ops imx53_usbmisc_ops = { .init = usbmisc_imx53_init, }; @@ -162,6 +200,14 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = { .data = &imx25_usbmisc_ops, }, { + .compatible = "fsl,imx27-usbmisc", + .data = &imx27_usbmisc_ops, + }, + { + .compatible = "fsl,imx51-usbmisc", + .data = &imx53_usbmisc_ops, + }, + { .compatible = "fsl,imx53-usbmisc", .data = &imx53_usbmisc_ops, }, diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index e8404319ca68..900f7ff805ee 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c @@ -262,6 +262,7 @@ static void acm_ctrl_irq(struct urb *urb) struct usb_cdc_notification *dr = urb->transfer_buffer; unsigned char *data; int newctrl; + int difference; int retval; int status = urb->status; @@ -302,20 +303,31 @@ static void acm_ctrl_irq(struct urb *urb) tty_port_tty_hangup(&acm->port, false); } + difference = acm->ctrlin ^ newctrl; + spin_lock(&acm->read_lock); acm->ctrlin = newctrl; + acm->oldcount = acm->iocount; + + if (difference & ACM_CTRL_DSR) + acm->iocount.dsr++; + if (difference & ACM_CTRL_BRK) + acm->iocount.brk++; + if (difference & ACM_CTRL_RI) + acm->iocount.rng++; + if (difference & ACM_CTRL_DCD) + acm->iocount.dcd++; + if (difference & ACM_CTRL_FRAMING) + acm->iocount.frame++; + if (difference & ACM_CTRL_PARITY) + acm->iocount.parity++; + if (difference & ACM_CTRL_OVERRUN) + acm->iocount.overrun++; + spin_unlock(&acm->read_lock); + + if (difference) + wake_up_all(&acm->wioctl); - dev_dbg(&acm->control->dev, - "%s - input control lines: dcd%c dsr%c break%c " - "ring%c framing%c parity%c overrun%c\n", - __func__, - acm->ctrlin & ACM_CTRL_DCD ? '+' : '-', - acm->ctrlin & ACM_CTRL_DSR ? '+' : '-', - acm->ctrlin & ACM_CTRL_BRK ? '+' : '-', - acm->ctrlin & ACM_CTRL_RI ? '+' : '-', - acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-', - acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-', - acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-'); - break; + break; default: dev_dbg(&acm->control->dev, @@ -796,6 +808,72 @@ static int set_serial_info(struct acm *acm, return retval; } +static int wait_serial_change(struct acm *acm, unsigned long arg) +{ + int rv = 0; + DECLARE_WAITQUEUE(wait, current); + struct async_icount old, new; + + if (arg & (TIOCM_DSR | TIOCM_RI | TIOCM_CD )) + return -EINVAL; + do { + spin_lock_irq(&acm->read_lock); + old = acm->oldcount; + new = acm->iocount; + acm->oldcount = new; + spin_unlock_irq(&acm->read_lock); + + if ((arg & TIOCM_DSR) && + old.dsr != new.dsr) + break; + if ((arg & TIOCM_CD) && + old.dcd != new.dcd) + break; + if ((arg & TIOCM_RI) && + old.rng != new.rng) + break; + + add_wait_queue(&acm->wioctl, &wait); + set_current_state(TASK_INTERRUPTIBLE); + schedule(); + remove_wait_queue(&acm->wioctl, &wait); + if (acm->disconnected) { + if (arg & TIOCM_CD) + break; + else + rv = -ENODEV; + } else { + if (signal_pending(current)) + rv = -ERESTARTSYS; + } + } while (!rv); + + + + return rv; +} + +static int get_serial_usage(struct acm *acm, + struct serial_icounter_struct __user *count) +{ + struct serial_icounter_struct icount; + int rv = 0; + + memset(&icount, 0, sizeof(icount)); + icount.dsr = acm->iocount.dsr; + icount.rng = acm->iocount.rng; + icount.dcd = acm->iocount.dcd; + icount.frame = acm->iocount.frame; + icount.overrun = acm->iocount.overrun; + icount.parity = acm->iocount.parity; + icount.brk = acm->iocount.brk; + + if (copy_to_user(count, &icount, sizeof(icount)) > 0) + rv = -EFAULT; + + return rv; +} + static int acm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { @@ -809,6 +887,18 @@ static int acm_tty_ioctl(struct tty_struct *tty, case TIOCSSERIAL: rv = set_serial_info(acm, (struct serial_struct __user *) arg); break; + case TIOCMIWAIT: + rv = usb_autopm_get_interface(acm->control); + if (rv < 0) { + rv = -EIO; + break; + } + rv = wait_serial_change(acm, arg); + usb_autopm_put_interface(acm->control); + break; + case TIOCGICOUNT: + rv = get_serial_usage(acm, (struct serial_icounter_struct __user *) arg); + break; } return rv; @@ -1167,6 +1257,7 @@ made_compressed_probe: acm->readsize = readsize; acm->rx_buflimit = num_rx_buf; INIT_WORK(&acm->work, acm_softint); + init_waitqueue_head(&acm->wioctl); spin_lock_init(&acm->write_lock); spin_lock_init(&acm->read_lock); mutex_init(&acm->mutex); @@ -1383,6 +1474,7 @@ static void acm_disconnect(struct usb_interface *intf) device_remove_file(&acm->control->dev, &dev_attr_iCountryCodeRelDate); } + wake_up_all(&acm->wioctl); device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); usb_set_intfdata(acm->control, NULL); usb_set_intfdata(acm->data, NULL); diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index 0f76e4af600e..e38dc785808f 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h @@ -106,6 +106,9 @@ struct acm { struct work_struct work; /* work queue entry for line discipline waking up */ unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ unsigned int ctrlout; /* output control lines (DTR, RTS) */ + struct async_icount iocount; /* counters for control line changes */ + struct async_icount oldcount; /* for comparison of counter */ + wait_queue_head_t wioctl; /* for ioctl */ unsigned int writesize; /* max packet size for the output bulk endpoint */ unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ unsigned int minor; /* acm minor number */ diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 0b23a8639311..a051a7a2b1bd 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -432,6 +432,38 @@ outnl: return rv < 0 ? rv : count; } +/* + * clear WDM_READ flag and possibly submit the read urb if resp_count + * is non-zero. + * + * Called with desc->iuspin locked + */ +static int clear_wdm_read_flag(struct wdm_device *desc) +{ + int rv = 0; + + clear_bit(WDM_READ, &desc->flags); + + /* submit read urb only if the device is waiting for it */ + if (!desc->resp_count || !--desc->resp_count) + goto out; + + set_bit(WDM_RESPONDING, &desc->flags); + spin_unlock_irq(&desc->iuspin); + rv = usb_submit_urb(desc->response, GFP_KERNEL); + spin_lock_irq(&desc->iuspin); + if (rv) { + dev_err(&desc->intf->dev, + "usb_submit_urb failed with result %d\n", rv); + + /* make sure the next notification trigger a submit */ + clear_bit(WDM_RESPONDING, &desc->flags); + desc->resp_count = 0; + } +out: + return rv; +} + static ssize_t wdm_read (struct file *file, char __user *buffer, size_t count, loff_t *ppos) { @@ -503,8 +535,10 @@ retry: if (!desc->reslength) { /* zero length read */ dev_dbg(&desc->intf->dev, "%s: zero length - clearing WDM_READ\n", __func__); - clear_bit(WDM_READ, &desc->flags); + rv = clear_wdm_read_flag(desc); spin_unlock_irq(&desc->iuspin); + if (rv < 0) + goto err; goto retry; } cntr = desc->length; @@ -526,37 +560,9 @@ retry: desc->length -= cntr; /* in case we had outstanding data */ - if (!desc->length) { - clear_bit(WDM_READ, &desc->flags); - - if (--desc->resp_count) { - set_bit(WDM_RESPONDING, &desc->flags); - spin_unlock_irq(&desc->iuspin); - - rv = usb_submit_urb(desc->response, GFP_KERNEL); - if (rv) { - dev_err(&desc->intf->dev, - "%s: usb_submit_urb failed with result %d\n", - __func__, rv); - spin_lock_irq(&desc->iuspin); - clear_bit(WDM_RESPONDING, &desc->flags); - spin_unlock_irq(&desc->iuspin); - - if (rv == -ENOMEM) { - rv = schedule_work(&desc->rxwork); - if (rv) - dev_err(&desc->intf->dev, "Cannot schedule work\n"); - } else { - spin_lock_irq(&desc->iuspin); - desc->resp_count = 0; - spin_unlock_irq(&desc->iuspin); - } - } - } else - spin_unlock_irq(&desc->iuspin); - } else - spin_unlock_irq(&desc->iuspin); - + if (!desc->length) + clear_wdm_read_flag(desc); + spin_unlock_irq(&desc->iuspin); rv = cntr; err: diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index d4c47d5d7625..0924ee40a966 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c @@ -52,7 +52,6 @@ #include <linux/sched.h> #include <linux/signal.h> #include <linux/poll.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/lp.h> #include <linux/mutex.h> diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 09de131ee0cb..cfbec9c7e09e 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -21,7 +21,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index 5e847ad2f58a..2f6f93220046 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile @@ -2,8 +2,6 @@ # Makefile for USB Core files and filesystem # -ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG - usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o usbcore-y += devio.o notify.o generic.o quirks.o devices.o diff --git a/drivers/usb/core/buffer.c b/drivers/usb/core/buffer.c index 23559746be92..684ef70dc09d 100644 --- a/drivers/usb/core/buffer.c +++ b/drivers/usb/core/buffer.c @@ -2,7 +2,7 @@ * DMA memory management for framework level HCD code (hc_driver) * * This implementation plugs in through generic "usb_bus" level methods, - * and should work with all USB controllers, regardles of bus type. + * and should work with all USB controllers, regardless of bus type. */ #include <linux/module.h> diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index a6b2cabe7930..8d72f0c65937 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c @@ -3,7 +3,6 @@ #include <linux/usb/hcd.h> #include <linux/usb/quirks.h> #include <linux/module.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/device.h> #include <asm/byteorder.h> @@ -651,10 +650,6 @@ void usb_destroy_configuration(struct usb_device *dev) * * hub-only!! ... and only in reset path, or usb_new_device() * (used by real hubs and virtual root hubs) - * - * NOTE: if this is a WUSB device and is not authorized, we skip the - * whole thing. A non-authorized USB device has no - * configurations. */ int usb_get_configuration(struct usb_device *dev) { @@ -666,8 +661,6 @@ int usb_get_configuration(struct usb_device *dev) struct usb_config_descriptor *desc; cfgno = 0; - if (dev->authorized == 0) /* Not really an error */ - goto out_not_authorized; result = -ENOMEM; if (ncfg > USB_MAXCONFIG) { dev_warn(ddev, "too many configurations: %d, " @@ -751,7 +744,6 @@ int usb_get_configuration(struct usb_device *dev) err: kfree(desc); -out_not_authorized: dev->descriptor.bNumConfigurations = cfgno; err2: if (result == -ENOMEM) diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 967152a63bd3..90e18f6fa2bb 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -118,7 +118,7 @@ module_param(usbfs_memory_mb, uint, 0644); MODULE_PARM_DESC(usbfs_memory_mb, "maximum MB allowed for usbfs buffers (0 = no limit)"); -/* Hard limit, necessary to avoid aithmetic overflow */ +/* Hard limit, necessary to avoid arithmetic overflow */ #define USBFS_XFER_MAX (UINT_MAX / 2 - 1000000) static atomic_t usbfs_memory_usage; /* Total memory currently allocated */ diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 47aade2a5e74..5d01558cef66 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c @@ -37,6 +37,7 @@ * and cause the driver to probe for all devices again. */ ssize_t usb_store_new_id(struct usb_dynids *dynids, + const struct usb_device_id *id_table, struct device_driver *driver, const char *buf, size_t count) { @@ -44,11 +45,12 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids, u32 idVendor = 0; u32 idProduct = 0; unsigned int bInterfaceClass = 0; + u32 refVendor, refProduct; int fields = 0; int retval = 0; - fields = sscanf(buf, "%x %x %x", &idVendor, &idProduct, - &bInterfaceClass); + fields = sscanf(buf, "%x %x %x %x %x", &idVendor, &idProduct, + &bInterfaceClass, &refVendor, &refProduct); if (fields < 2) return -EINVAL; @@ -60,11 +62,30 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids, dynid->id.idVendor = idVendor; dynid->id.idProduct = idProduct; dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE; - if (fields == 3) { + if (fields > 2 && bInterfaceClass) { + if (bInterfaceClass > 255) + return -EINVAL; + dynid->id.bInterfaceClass = (u8)bInterfaceClass; dynid->id.match_flags |= USB_DEVICE_ID_MATCH_INT_CLASS; } + if (fields > 4) { + const struct usb_device_id *id = id_table; + + if (!id) + return -ENODEV; + + for (; id->match_flags; id++) + if (id->idVendor == refVendor && id->idProduct == refProduct) + break; + + if (id->match_flags) + dynid->id.driver_info = id->driver_info; + else + return -ENODEV; + } + spin_lock(&dynids->lock); list_add_tail(&dynid->node, &dynids->list); spin_unlock(&dynids->lock); @@ -106,7 +127,7 @@ static ssize_t new_id_store(struct device_driver *driver, { struct usb_driver *usb_drv = to_usb_driver(driver); - return usb_store_new_id(&usb_drv->dynids, driver, buf, count); + return usb_store_new_id(&usb_drv->dynids, usb_drv->id_table, driver, buf, count); } static DRIVER_ATTR_RW(new_id); @@ -839,7 +860,7 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver, return -ENODEV; new_udriver->drvwrap.for_devices = 1; - new_udriver->drvwrap.driver.name = (char *) new_udriver->name; + new_udriver->drvwrap.driver.name = new_udriver->name; new_udriver->drvwrap.driver.bus = &usb_bus_type; new_udriver->drvwrap.driver.probe = usb_probe_device; new_udriver->drvwrap.driver.remove = usb_unbind_device; @@ -900,7 +921,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner, return -ENODEV; new_driver->drvwrap.for_devices = 0; - new_driver->drvwrap.driver.name = (char *) new_driver->name; + new_driver->drvwrap.driver.name = new_driver->name; new_driver->drvwrap.driver.bus = &usb_bus_type; new_driver->drvwrap.driver.probe = usb_probe_interface; new_driver->drvwrap.driver.remove = usb_unbind_interface; diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index dfe9d0f22978..d59d99347d54 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c @@ -282,6 +282,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) if (retval != 0) goto unmap_registers; + device_wakeup_enable(hcd->self.controller); if (pci_dev_run_wake(dev)) pm_runtime_put_noidle(&dev->dev); diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 6bffb8c87bc9..199aaea6bfe0 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -44,6 +44,7 @@ #include <linux/usb.h> #include <linux/usb/hcd.h> +#include <linux/usb/phy.h> #include "usb.h" @@ -1297,7 +1298,7 @@ EXPORT_SYMBOL_GPL(usb_hcd_unlink_urb_from_ep); * DMA framework is dma_declare_coherent_memory() * * - So we use that, even though the primary requirement - * is that the memory be "local" (hence addressible + * is that the memory be "local" (hence addressable * by that device), not "coherent". * */ @@ -2588,6 +2589,24 @@ int usb_add_hcd(struct usb_hcd *hcd, int retval; struct usb_device *rhdev; + if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) { + struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0); + + if (IS_ERR(phy)) { + retval = PTR_ERR(phy); + if (retval == -EPROBE_DEFER) + return retval; + } else { + retval = usb_phy_init(phy); + if (retval) { + usb_put_phy(phy); + return retval; + } + hcd->phy = phy; + hcd->remove_phy = 1; + } + } + dev_info(hcd->self.controller, "%s\n", hcd->product_desc); /* Keep old behaviour if authorized_default is not in [0, 1]. */ @@ -2603,7 +2622,7 @@ int usb_add_hcd(struct usb_hcd *hcd, */ if ((retval = hcd_buffer_create(hcd)) != 0) { dev_dbg(hcd->self.controller, "pool alloc failed\n"); - return retval; + goto err_remove_phy; } if ((retval = usb_register_bus(&hcd->self)) < 0) @@ -2693,12 +2712,6 @@ int usb_add_hcd(struct usb_hcd *hcd, if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) usb_hcd_poll_rh_status(hcd); - /* - * Host controllers don't generate their own wakeup requests; - * they only forward requests from the root hub. Therefore - * controllers should always be enabled for remote wakeup. - */ - device_wakeup_enable(hcd->self.controller); return retval; error_create_attr_group: @@ -2734,6 +2747,12 @@ err_allocate_root_hub: usb_deregister_bus(&hcd->self); err_register_bus: hcd_buffer_destroy(hcd); +err_remove_phy: + if (hcd->remove_phy && hcd->phy) { + usb_phy_shutdown(hcd->phy); + usb_put_phy(hcd->phy); + hcd->phy = NULL; + } return retval; } EXPORT_SYMBOL_GPL(usb_add_hcd); @@ -2806,6 +2825,11 @@ void usb_remove_hcd(struct usb_hcd *hcd) usb_put_dev(hcd->self.root_hub); usb_deregister_bus(&hcd->self); hcd_buffer_destroy(hcd); + if (hcd->remove_phy && hcd->phy) { + usb_phy_shutdown(hcd->phy); + usb_put_phy(hcd->phy); + hcd->phy = NULL; + } } EXPORT_SYMBOL_GPL(usb_remove_hcd); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index bd9dc3504b51..babba885978d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -33,13 +33,6 @@ #include "hub.h" -/* if we are in debug mode, always announce new devices */ -#ifdef DEBUG -#ifndef CONFIG_USB_ANNOUNCE_NEW_DEVICES -#define CONFIG_USB_ANNOUNCE_NEW_DEVICES -#endif -#endif - #define USB_VENDOR_GENESYS_LOGIC 0x05e3 #define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 @@ -1154,7 +1147,8 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) /* Tell khubd to disconnect the device or * check for a new connection */ - if (udev || (portstatus & USB_PORT_STAT_CONNECTION)) + if (udev || (portstatus & USB_PORT_STAT_CONNECTION) || + (portstatus & USB_PORT_STAT_OVERCURRENT)) set_bit(port1, hub->change_bits); } else if (portstatus & USB_PORT_STAT_ENABLE) { @@ -1607,7 +1601,7 @@ static void hub_disconnect(struct usb_interface *intf) { struct usb_hub *hub = usb_get_intfdata(intf); struct usb_device *hdev = interface_to_usbdev(intf); - int i; + int port1; /* Take the hub off the event list and don't let it be added again */ spin_lock_irq(&hub_event_lock); @@ -1622,11 +1616,15 @@ static void hub_disconnect(struct usb_interface *intf) hub->error = 0; hub_quiesce(hub, HUB_DISCONNECT); - usb_set_intfdata (intf, NULL); + /* Avoid races with recursively_mark_NOTATTACHED() */ + spin_lock_irq(&device_state_lock); + port1 = hdev->maxchild; + hdev->maxchild = 0; + usb_set_intfdata(intf, NULL); + spin_unlock_irq(&device_state_lock); - for (i = 0; i < hdev->maxchild; i++) - usb_hub_remove_port_device(hub, i + 1); - hub->hdev->maxchild = 0; + for (; port1 > 0; --port1) + usb_hub_remove_port_device(hub, port1); if (hub->hdev->speed == USB_SPEED_HIGH) highspeed_hubs--; @@ -2235,17 +2233,13 @@ static int usb_enumerate_device(struct usb_device *udev) return err; } } - if (udev->wusb == 1 && udev->authorized == 0) { - udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); - udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); - udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); - } else { - /* read the standard strings and cache them if present */ - udev->product = usb_cache_string(udev, udev->descriptor.iProduct); - udev->manufacturer = usb_cache_string(udev, - udev->descriptor.iManufacturer); - udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); - } + + /* read the standard strings and cache them if present */ + udev->product = usb_cache_string(udev, udev->descriptor.iProduct); + udev->manufacturer = usb_cache_string(udev, + udev->descriptor.iManufacturer); + udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber); + err = usb_enumerate_device_otg(udev); if (err < 0) return err; @@ -2427,16 +2421,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev) usb_dev->authorized = 0; usb_set_configuration(usb_dev, -1); - kfree(usb_dev->product); - usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); - kfree(usb_dev->manufacturer); - usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); - kfree(usb_dev->serial); - usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); - - usb_destroy_configuration(usb_dev); - usb_dev->descriptor.bNumConfigurations = 0; - out_unauthorized: usb_unlock_device(usb_dev); return 0; @@ -2464,17 +2448,7 @@ int usb_authorize_device(struct usb_device *usb_dev) goto error_device_descriptor; } - kfree(usb_dev->product); - usb_dev->product = NULL; - kfree(usb_dev->manufacturer); - usb_dev->manufacturer = NULL; - kfree(usb_dev->serial); - usb_dev->serial = NULL; - usb_dev->authorized = 1; - result = usb_enumerate_device(usb_dev); - if (result < 0) - goto error_enumerate; /* Choose and set the configuration. This registers the interfaces * with the driver core and lets interface drivers bind to them. */ @@ -2490,7 +2464,6 @@ int usb_authorize_device(struct usb_device *usb_dev) } dev_info(&usb_dev->dev, "authorized to connect\n"); -error_enumerate: error_device_descriptor: usb_autosuspend_device(usb_dev); error_autoresume: @@ -2523,10 +2496,25 @@ static unsigned hub_is_wusb(struct usb_hub *hub) #define HUB_LONG_RESET_TIME 200 #define HUB_RESET_TIMEOUT 800 +/* + * "New scheme" enumeration causes an extra state transition to be + * exposed to an xhci host and causes USB3 devices to receive control + * commands in the default state. This has been seen to cause + * enumeration failures, so disable this enumeration scheme for USB3 + * devices. + */ +static bool use_new_scheme(struct usb_device *udev, int retry) +{ + if (udev->speed == USB_SPEED_SUPER) + return false; + + return USE_NEW_SCHEME(retry); +} + static int hub_port_reset(struct usb_hub *hub, int port1, struct usb_device *udev, unsigned int delay, bool warm); -/* Is a USB 3.0 port in the Inactive or Complinance Mode state? +/* Is a USB 3.0 port in the Inactive or Compliance Mode state? * Port worm reset is required to recover */ static bool hub_port_warm_reset_required(struct usb_hub *hub, u16 portstatus) @@ -3334,7 +3322,8 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) udev = hub->ports[port1 - 1]->child; if (udev && udev->can_submit) { - dev_warn(&intf->dev, "port %d nyet suspended\n", port1); + dev_warn(&intf->dev, "port %d not suspended yet\n", + port1); if (PMSG_IS_AUTO(msg)) return -EBUSY; } @@ -3981,6 +3970,20 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) } } +static int hub_enable_device(struct usb_device *udev) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!hcd->driver->enable_device) + return 0; + if (udev->state == USB_STATE_ADDRESS) + return 0; + if (udev->state != USB_STATE_DEFAULT) + return -EINVAL; + + return hcd->driver->enable_device(hcd, udev); +} + /* Reset device, (re)assign address, get device descriptor. * Device connection must be stable, no more debouncing needed. * Returns device in USB_STATE_ADDRESS, except on error. @@ -4093,7 +4096,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, * this area, and this is how Linux has done it for ages. * Change it cautiously. * - * NOTE: If USE_NEW_SCHEME() is true we will start by issuing + * NOTE: If use_new_scheme() is true we will start by issuing * a 64-byte GET_DESCRIPTOR request. This is what Windows does, * so it may help with some non-standards-compliant devices. * Otherwise we start with SET_ADDRESS and then try to read the @@ -4101,10 +4104,17 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, * value. */ for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { - if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) { + bool did_new_scheme = false; + + if (use_new_scheme(udev, retry_counter)) { struct usb_device_descriptor *buf; int r = 0; + did_new_scheme = true; + retval = hub_enable_device(udev); + if (retval < 0) + goto fail; + #define GET_DESCRIPTOR_BUFSIZE 64 buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO); if (!buf) { @@ -4193,7 +4203,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, * - read ep0 maxpacket even for high and low speed, */ msleep(10); - if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) + /* use_new_scheme() checks the speed which may have + * changed since the initial look so we cache the result + * in did_new_scheme + */ + if (did_new_scheme) break; } @@ -4900,7 +4914,7 @@ static void hub_events(void) static int hub_thread(void *__unused) { - /* khubd needs to be freezable to avoid intefering with USB-PERSIST + /* khubd needs to be freezable to avoid interfering with USB-PERSIST * port handover. Otherwise it might see that a full-speed device * was gone before the EHCI controller had handed its port over to * the companion full-speed controller. diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 4e4790dea343..df629a310e44 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h @@ -78,7 +78,7 @@ struct usb_hub { /** * struct usb port - kernel's representation of a usb port - * @child: usb device attatched to the port + * @child: usb device attached to the port * @dev: generic device interface * @port_owner: port's owner * @connect_type: port's connect type diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index bb315970e475..f829a1aad1c3 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c @@ -6,7 +6,6 @@ #include <linux/usb.h> #include <linux/module.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/mm.h> #include <linux/timer.h> #include <linux/ctype.h> @@ -218,7 +217,7 @@ EXPORT_SYMBOL_GPL(usb_interrupt_msg); * * Return: * If successful, 0. Otherwise a negative error number. The number of actual - * bytes transferred will be stored in the @actual_length paramater. + * bytes transferred will be stored in the @actual_length parameter. * */ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, @@ -518,7 +517,7 @@ void usb_sg_wait(struct usb_sg_request *io) io->urbs[i]->dev = io->dev; retval = usb_submit_urb(io->urbs[i], GFP_ATOMIC); - /* after we submit, let completions or cancelations fire; + /* after we submit, let completions or cancellations fire; * we handshake using io->status. */ spin_unlock_irq(&io->lock); diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 12924dbfdc2c..8f37063c0a49 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c @@ -98,9 +98,6 @@ static const struct usb_device_id usb_quirk_list[] = { /* Alcor Micro Corp. Hub */ { USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME }, - /* MicroTouch Systems touchscreen */ - { USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME }, - /* appletouch */ { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 52a97adf02a0..1236c6011c70 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c @@ -837,7 +837,7 @@ void usb_remove_sysfs_dev_files(struct usb_device *udev) device_remove_bin_file(dev, &dev_bin_attr_descriptors); } -/* Interface Accociation Descriptor fields */ +/* Interface Association Descriptor fields */ #define usb_intf_assoc_attr(field, format_string) \ static ssize_t \ iad_##field##_show(struct device *dev, struct device_attribute *attr, \ diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index e62208356c89..9ff665f1322f 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -2,7 +2,6 @@ #include <linux/string.h> #include <linux/bitops.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/log2.h> #include <linux/usb.h> #include <linux/wait.h> @@ -53,7 +52,7 @@ EXPORT_SYMBOL_GPL(usb_init_urb); * valid options for this. * * Creates an urb for the USB driver to use, initializes a few internal - * structures, incrementes the usage counter, and returns a pointer to it. + * structures, increments the usage counter, and returns a pointer to it. * * If the driver want to use this urb for interrupt, control, or bulk * endpoints, pass '0' as the number of iso packets. @@ -281,7 +280,7 @@ EXPORT_SYMBOL_GPL(usb_unanchor_urb); * * Device drivers must explicitly request that repetition, by ensuring that * some URB is always on the endpoint's queue (except possibly for short - * periods during completion callacks). When there is no longer an urb + * periods during completion callbacks). When there is no longer an urb * queued, the endpoint's bandwidth reservation is canceled. This means * drivers can use their completion handlers to ensure they keep bandwidth * they need, by reinitializing and resubmitting the just-completed urb @@ -325,10 +324,14 @@ EXPORT_SYMBOL_GPL(usb_unanchor_urb); */ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) { + static int pipetypes[4] = { + PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT + }; int xfertype, max; struct usb_device *dev; struct usb_host_endpoint *ep; int is_out; + unsigned int allowed; if (!urb || !urb->complete) return -EINVAL; @@ -436,15 +439,10 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) if (urb->transfer_buffer_length > INT_MAX) return -EMSGSIZE; -#ifdef DEBUG - /* stuff that drivers shouldn't do, but which shouldn't + /* + * stuff that drivers shouldn't do, but which shouldn't * cause problems in HCDs if they get it wrong. */ - { - unsigned int allowed; - static int pipetypes[4] = { - PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT - }; /* Check that the pipe's type matches the endpoint's type */ if (usb_pipetype(urb->pipe) != pipetypes[xfertype]) @@ -476,8 +474,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) if (allowed != urb->transfer_flags) dev_WARN(&dev->dev, "BOGUS urb flags, %x --> %x\n", urb->transfer_flags, allowed); - } -#endif + /* * Force periodic transfer intervals to be legal values that are * a power of two (so HCDs don't need to). @@ -492,9 +489,9 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) /* too small? */ switch (dev->speed) { case USB_SPEED_WIRELESS: - if (urb->interval < 6) + if ((urb->interval < 6) + && (xfertype == USB_ENDPOINT_XFER_INT)) return -EINVAL; - break; default: if (urb->interval <= 0) return -EINVAL; diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c index 4e243c37f17f..d7cb822d6eab 100644 --- a/drivers/usb/core/usb-acpi.c +++ b/drivers/usb/core/usb-acpi.c @@ -92,7 +92,7 @@ static int usb_acpi_check_port_connect_type(struct usb_device *hdev, int ret = 0; /* - * Accoding to ACPI Spec 9.13. PLD indicates whether usb port is + * According to ACPI Spec 9.13. PLD indicates whether usb port is * user visible and _UPC indicates whether it is connectable. If * the port was visible and connectable, it could be freely connected * and disconnected with USB devices. If no visible and connectable, diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c index 07dfe855dc20..f59484d43b35 100644 --- a/drivers/usb/dwc2/hcd.c +++ b/drivers/usb/dwc2/hcd.c @@ -2935,6 +2935,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, if (retval < 0) goto error3; + device_wakeup_enable(hcd->self.controller); + dwc2_hcd_dump_state(hsotg); dwc2_enable_global_interrupts(hsotg); diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig index 70fc43027a5c..e2c730fc9a90 100644 --- a/drivers/usb/dwc3/Kconfig +++ b/drivers/usb/dwc3/Kconfig @@ -70,6 +70,13 @@ config USB_DWC3_PCI One such PCIe-based platform is Synopsys' PCIe HAPS model of this IP. +config USB_DWC3_KEYSTONE + tristate "Texas Instruments Keystone2 Platforms" + default USB_DWC3 + help + Support of USB2/3 functionality in TI Keystone2 platforms. + Say 'Y' or 'M' here if you have one such device + comment "Debugging features" config USB_DWC3_DEBUG diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile index dd1760145c46..10ac3e72482e 100644 --- a/drivers/usb/dwc3/Makefile +++ b/drivers/usb/dwc3/Makefile @@ -32,3 +32,4 @@ endif obj-$(CONFIG_USB_DWC3_OMAP) += dwc3-omap.o obj-$(CONFIG_USB_DWC3_EXYNOS) += dwc3-exynos.o obj-$(CONFIG_USB_DWC3_PCI) += dwc3-pci.o +obj-$(CONFIG_USB_DWC3_KEYSTONE) += dwc3-keystone.o diff --git a/drivers/usb/dwc3/dwc3-exynos.c b/drivers/usb/dwc3/dwc3-exynos.c index 8b20c70d91e7..28c8ad79f5e6 100644 --- a/drivers/usb/dwc3/dwc3-exynos.c +++ b/drivers/usb/dwc3/dwc3-exynos.c @@ -50,6 +50,7 @@ static int dwc3_exynos_register_phys(struct dwc3_exynos *exynos) exynos->usb2_phy = pdev; pdata.type = USB_PHY_TYPE_USB2; + pdata.gpio_reset = -1; ret = platform_device_add_data(exynos->usb2_phy, &pdata, sizeof(pdata)); if (ret) diff --git a/drivers/usb/dwc3/dwc3-keystone.c b/drivers/usb/dwc3/dwc3-keystone.c new file mode 100644 index 000000000000..1fad1618df6e --- /dev/null +++ b/drivers/usb/dwc3/dwc3-keystone.c @@ -0,0 +1,202 @@ +/** + * dwc3-keystone.c - Keystone Specific Glue layer + * + * Copyright (C) 2010-2013 Texas Instruments Incorporated - http://www.ti.com + * + * Author: WingMan Kwok <w-kwok2@ti.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 of + * the License as published by the Free Software Foundation. + * + * 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. + */ + +#include <linux/clk.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/interrupt.h> +#include <linux/platform_device.h> +#include <linux/dma-mapping.h> +#include <linux/io.h> +#include <linux/of_platform.h> + +/* USBSS register offsets */ +#define USBSS_REVISION 0x0000 +#define USBSS_SYSCONFIG 0x0010 +#define USBSS_IRQ_EOI 0x0018 +#define USBSS_IRQSTATUS_RAW_0 0x0020 +#define USBSS_IRQSTATUS_0 0x0024 +#define USBSS_IRQENABLE_SET_0 0x0028 +#define USBSS_IRQENABLE_CLR_0 0x002c + +/* IRQ register bits */ +#define USBSS_IRQ_EOI_LINE(n) BIT(n) +#define USBSS_IRQ_EVENT_ST BIT(0) +#define USBSS_IRQ_COREIRQ_EN BIT(0) +#define USBSS_IRQ_COREIRQ_CLR BIT(0) + +static u64 kdwc3_dma_mask; + +struct dwc3_keystone { + struct device *dev; + struct clk *clk; + void __iomem *usbss; +}; + +static inline u32 kdwc3_readl(void __iomem *base, u32 offset) +{ + return readl(base + offset); +} + +static inline void kdwc3_writel(void __iomem *base, u32 offset, u32 value) +{ + writel(value, base + offset); +} + +static void kdwc3_enable_irqs(struct dwc3_keystone *kdwc) +{ + u32 val; + + val = kdwc3_readl(kdwc->usbss, USBSS_IRQENABLE_SET_0); + val |= USBSS_IRQ_COREIRQ_EN; + kdwc3_writel(kdwc->usbss, USBSS_IRQENABLE_SET_0, val); +} + +static void kdwc3_disable_irqs(struct dwc3_keystone *kdwc) +{ + u32 val; + + val = kdwc3_readl(kdwc->usbss, USBSS_IRQENABLE_SET_0); + val &= ~USBSS_IRQ_COREIRQ_EN; + kdwc3_writel(kdwc->usbss, USBSS_IRQENABLE_SET_0, val); +} + +static irqreturn_t dwc3_keystone_interrupt(int irq, void *_kdwc) +{ + struct dwc3_keystone *kdwc = _kdwc; + + kdwc3_writel(kdwc->usbss, USBSS_IRQENABLE_CLR_0, USBSS_IRQ_COREIRQ_CLR); + kdwc3_writel(kdwc->usbss, USBSS_IRQSTATUS_0, USBSS_IRQ_EVENT_ST); + kdwc3_writel(kdwc->usbss, USBSS_IRQENABLE_SET_0, USBSS_IRQ_COREIRQ_EN); + kdwc3_writel(kdwc->usbss, USBSS_IRQ_EOI, USBSS_IRQ_EOI_LINE(0)); + + return IRQ_HANDLED; +} + +static int kdwc3_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct device_node *node = pdev->dev.of_node; + struct dwc3_keystone *kdwc; + struct resource *res; + int error, irq; + + kdwc = devm_kzalloc(dev, sizeof(*kdwc), GFP_KERNEL); + if (!kdwc) + return -ENOMEM; + + platform_set_drvdata(pdev, kdwc); + + kdwc->dev = dev; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(dev, "missing usbss resource\n"); + return -EINVAL; + } + + kdwc->usbss = devm_ioremap_resource(dev, res); + if (IS_ERR(kdwc->usbss)) + return PTR_ERR(kdwc->usbss); + + kdwc3_dma_mask = dma_get_mask(dev); + dev->dma_mask = &kdwc3_dma_mask; + + kdwc->clk = devm_clk_get(kdwc->dev, "usb"); + + error = clk_prepare_enable(kdwc->clk); + if (error < 0) { + dev_dbg(kdwc->dev, "unable to enable usb clock, err %d\n", + error); + return error; + } + + irq = platform_get_irq(pdev, 0); + if (irq < 0) { + dev_err(&pdev->dev, "missing irq\n"); + goto err_irq; + } + + error = devm_request_irq(dev, irq, dwc3_keystone_interrupt, IRQF_SHARED, + dev_name(dev), kdwc); + if (error) { + dev_err(dev, "failed to request IRQ #%d --> %d\n", + irq, error); + goto err_irq; + } + + kdwc3_enable_irqs(kdwc); + + error = of_platform_populate(node, NULL, NULL, dev); + if (error) { + dev_err(&pdev->dev, "failed to create dwc3 core\n"); + goto err_core; + } + + return 0; + +err_core: + kdwc3_disable_irqs(kdwc); +err_irq: + clk_disable_unprepare(kdwc->clk); + + return error; +} + +static int kdwc3_remove_core(struct device *dev, void *c) +{ + struct platform_device *pdev = to_platform_device(dev); + + platform_device_unregister(pdev); + + return 0; +} + +static int kdwc3_remove(struct platform_device *pdev) +{ + struct dwc3_keystone *kdwc = platform_get_drvdata(pdev); + + kdwc3_disable_irqs(kdwc); + device_for_each_child(&pdev->dev, NULL, kdwc3_remove_core); + clk_disable_unprepare(kdwc->clk); + platform_set_drvdata(pdev, NULL); + + return 0; +} + +static const struct of_device_id kdwc3_of_match[] = { + { .compatible = "ti,keystone-dwc3", }, + {}, +}; +MODULE_DEVICE_TABLE(of, kdwc3_of_match); + +static struct platform_driver kdwc3_driver = { + .probe = kdwc3_probe, + .remove = kdwc3_remove, + .driver = { + .name = "keystone-dwc3", + .owner = THIS_MODULE, + .of_match_table = kdwc3_of_match, + }, +}; + +module_platform_driver(kdwc3_driver); + +MODULE_ALIAS("platform:keystone-dwc3"); +MODULE_AUTHOR("WingMan Kwok <w-kwok2@ti.com>"); +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("DesignWare USB3 KEYSTONE Glue Layer"); diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 7f7ea62e961b..b269dbd47fc4 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c @@ -20,7 +20,6 @@ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/interrupt.h> -#include <linux/spinlock.h> #include <linux/platform_device.h> #include <linux/platform_data/dwc3-omap.h> #include <linux/pm_runtime.h> @@ -120,9 +119,6 @@ #define USBOTGSS_UTMI_OTG_STATUS_VBUSVALID (1 << 1) struct dwc3_omap { - /* device lock */ - spinlock_t lock; - struct device *dev; int irq; @@ -280,8 +276,6 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap) struct dwc3_omap *omap = _omap; u32 reg; - spin_lock(&omap->lock); - reg = dwc3_omap_read_irqmisc_status(omap); if (reg & USBOTGSS_IRQMISC_DMADISABLECLR) { @@ -322,8 +316,6 @@ static irqreturn_t dwc3_omap_interrupt(int irq, void *_omap) dwc3_omap_write_irq0_status(omap, reg); - spin_unlock(&omap->lock); - return IRQ_HANDLED; } @@ -449,8 +441,6 @@ static int dwc3_omap_probe(struct platform_device *pdev) } } - spin_lock_init(&omap->lock); - omap->dev = dev; omap->irq = irq; omap->base = base; @@ -535,7 +525,7 @@ static int dwc3_omap_probe(struct platform_device *pdev) edev = of_extcon_get_extcon_dev(dev, 0); if (IS_ERR(edev)) { dev_vdbg(dev, "couldn't get extcon device\n"); - ret = PTR_ERR(edev); + ret = -EPROBE_DEFER; goto err2; } diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c index 31443aeedcdb..f393c183cc69 100644 --- a/drivers/usb/dwc3/dwc3-pci.c +++ b/drivers/usb/dwc3/dwc3-pci.c @@ -52,6 +52,7 @@ static int dwc3_pci_register_phys(struct dwc3_pci *glue) glue->usb2_phy = pdev; pdata.type = USB_PHY_TYPE_USB2; + pdata.gpio_reset = -1; ret = platform_device_add_data(glue->usb2_phy, &pdata, sizeof(pdata)); if (ret) @@ -182,7 +183,7 @@ static void dwc3_pci_remove(struct pci_dev *pci) pci_disable_device(pci); } -static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { +static const struct pci_device_id dwc3_pci_id_table[] = { { PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 02e44fcaf205..2da0a5a2803a 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -1650,7 +1650,7 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc, dev_vdbg(dwc->dev, "initializing %s\n", dep->name); if (epnum == 0 || epnum == 1) { - dep->endpoint.maxpacket = 512; + usb_ep_set_maxpacket_limit(&dep->endpoint, 512); dep->endpoint.maxburst = 1; dep->endpoint.ops = &dwc3_gadget_ep0_ops; if (!epnum) @@ -1658,7 +1658,7 @@ static int dwc3_gadget_init_hw_endpoints(struct dwc3 *dwc, } else { int ret; - dep->endpoint.maxpacket = 1024; + usb_ep_set_maxpacket_limit(&dep->endpoint, 1024); dep->endpoint.max_streams = 15; dep->endpoint.ops = &dwc3_gadget_ep_ops; list_add_tail(&dep->endpoint.ep_list, @@ -2597,6 +2597,12 @@ int dwc3_gadget_init(struct dwc3 *dwc) dwc->gadget.name = "dwc3-gadget"; /* + * Per databook, DWC3 needs buffer size to be aligned to MaxPacketSize + * on ep out. + */ + dwc->gadget.quirk_ep_out_aligned_size = true; + + /* * REVISIT: Here we should clear all pending IRQs to be * sure we're starting from a well known location. */ diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index f66d96ad1f51..8154165aa601 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -216,6 +216,13 @@ config USB_FOTG210_UDC Say "y" to link the driver statically, or "m" to build a dynamically linked module called "fotg210_udc". +config USB_GR_UDC + tristate "Aeroflex Gaisler GRUSBDC USB Peripheral Controller Driver" + depends on HAS_DMA + help + Select this to support Aeroflex Gaisler GRUSBDC cores from the GRLIB + VHDL IP core library. + config USB_OMAP tristate "OMAP USB Device Controller" depends on ARCH_OMAP1 @@ -294,11 +301,11 @@ config USB_PXA27X gadget drivers to also be dynamically linked. config USB_S3C_HSOTG - tristate "S3C HS/OtG USB Device controller" - depends on S3C_DEV_USB_HSOTG + depends on ARM + tristate "Designware/S3C HS/OtG USB Device controller" help - The Samsung S3C64XX USB2.0 high-speed gadget controller - integrated into the S3C64XX series SoC. + The Designware USB2.0 high-speed gadget controller + integrated into many SoCs. config USB_S3C2410 tristate "S3C2410 USB Device Controller" @@ -512,9 +519,6 @@ config USB_U_SERIAL config USB_U_ETHER tristate -config USB_U_RNDIS - tristate - config USB_F_SERIAL tristate @@ -542,6 +546,9 @@ config USB_F_RNDIS config USB_F_MASS_STORAGE tristate +config USB_F_FS + tristate + choice tristate "USB Gadget Drivers" default USB_ETH @@ -642,7 +649,6 @@ config USB_CONFIGFS_RNDIS depends on USB_CONFIGFS depends on NET select USB_U_ETHER - select USB_U_RNDIS select USB_F_RNDIS help Microsoft Windows XP bundles the "Remote NDIS" (RNDIS) protocol, @@ -690,6 +696,31 @@ config USB_CONFIGFS_MASS_STORAGE device (in much the same way as the "loop" device driver), specified as a module parameter or sysfs option. +config USB_CONFIGFS_F_LB_SS + boolean "Loopback and sourcesink function (for testing)" + depends on USB_CONFIGFS + select USB_F_SS_LB + help + Loopback function loops back a configurable number of transfers. + Sourcesink function either sinks and sources bulk data. + It also implements control requests, for "chapter 9" conformance. + Make this be the first driver you try using on top of any new + USB peripheral controller driver. Then you can use host-side + test software, like the "usbtest" driver, to put your hardware + and its driver through a basic set of functional tests. + +config USB_CONFIGFS_F_FS + boolean "Function filesystem (FunctionFS)" + depends on USB_CONFIGFS + select USB_F_FS + help + The Function Filesystem (FunctionFS) lets one create USB + composite functions in user space in the same way GadgetFS + lets one create USB gadgets in user space. This allows creation + of composite gadgets such that some of the functions are + implemented in kernel space (for instance Ethernet, serial or + mass storage) and other are implemented in user space. + config USB_ZERO tristate "Gadget Zero (DEVELOPMENT)" select USB_LIBCOMPOSITE @@ -760,7 +791,6 @@ config USB_ETH depends on NET select USB_LIBCOMPOSITE select USB_U_ETHER - select USB_U_RNDIS select USB_F_ECM select USB_F_SUBSET select CRC32 @@ -864,6 +894,7 @@ config USB_GADGETFS config USB_FUNCTIONFS tristate "Function Filesystem" select USB_LIBCOMPOSITE + select USB_F_FS select USB_FUNCTIONFS_GENERIC if !(USB_FUNCTIONFS_ETH || USB_FUNCTIONFS_RNDIS) help The Function Filesystem (FunctionFS) lets one create USB @@ -883,6 +914,8 @@ config USB_FUNCTIONFS_ETH bool "Include configuration with CDC ECM (Ethernet)" depends on USB_FUNCTIONFS && NET select USB_U_ETHER + select USB_F_ECM + select USB_F_SUBSET help Include a configuration with CDC ECM function (Ethernet) and the Function Filesystem. @@ -891,7 +924,7 @@ config USB_FUNCTIONFS_RNDIS bool "Include configuration with RNDIS (Ethernet)" depends on USB_FUNCTIONFS && NET select USB_U_ETHER - select USB_U_RNDIS + select USB_F_RNDIS help Include a configuration with RNDIS function (Ethernet) and the Filesystem. @@ -1065,7 +1098,6 @@ config USB_G_MULTI config USB_G_MULTI_RNDIS bool "RNDIS + CDC Serial + Storage configuration" depends on USB_G_MULTI - select USB_U_RNDIS select USB_F_RNDIS default y help diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile index f1af39603d4d..5f150bc1b4bc 100644 --- a/drivers/usb/gadget/Makefile +++ b/drivers/usb/gadget/Makefile @@ -7,7 +7,7 @@ ccflags-$(CONFIG_USB_GADGET_VERBOSE) += -DVERBOSE_DEBUG obj-$(CONFIG_USB_GADGET) += udc-core.o obj-$(CONFIG_USB_LIBCOMPOSITE) += libcomposite.o libcomposite-y := usbstring.o config.o epautoconf.o -libcomposite-y += composite.o functions.o configfs.o +libcomposite-y += composite.o functions.o configfs.o u_f.o obj-$(CONFIG_USB_DUMMY_HCD) += dummy_hcd.o obj-$(CONFIG_USB_NET2272) += net2272.o obj-$(CONFIG_USB_NET2280) += net2280.o @@ -35,6 +35,7 @@ mv_udc-y := mv_udc_core.o obj-$(CONFIG_USB_FUSB300) += fusb300_udc.o obj-$(CONFIG_USB_FOTG210_UDC) += fotg210-udc.o obj-$(CONFIG_USB_MV_U3D) += mv_u3d_core.o +obj-$(CONFIG_USB_GR_UDC) += gr_udc.o # USB Functions usb_f_acm-y := f_acm.o @@ -47,8 +48,6 @@ obj-$(CONFIG_USB_F_SERIAL) += usb_f_serial.o usb_f_obex-y := f_obex.o obj-$(CONFIG_USB_F_OBEX) += usb_f_obex.o obj-$(CONFIG_USB_U_ETHER) += u_ether.o -u_rndis-y := rndis.o -obj-$(CONFIG_USB_U_RNDIS) += u_rndis.o usb_f_ncm-y := f_ncm.o obj-$(CONFIG_USB_F_NCM) += usb_f_ncm.o usb_f_ecm-y := f_ecm.o @@ -59,10 +58,12 @@ usb_f_eem-y := f_eem.o obj-$(CONFIG_USB_F_EEM) += usb_f_eem.o usb_f_ecm_subset-y := f_subset.o obj-$(CONFIG_USB_F_SUBSET) += usb_f_ecm_subset.o -usb_f_rndis-y := f_rndis.o +usb_f_rndis-y := f_rndis.o rndis.o obj-$(CONFIG_USB_F_RNDIS) += usb_f_rndis.o usb_f_mass_storage-y := f_mass_storage.o storage_common.o obj-$(CONFIG_USB_F_MASS_STORAGE)+= usb_f_mass_storage.o +usb_f_fs-y := f_fs.o +obj-$(CONFIG_USB_F_FS) += usb_f_fs.o # # USB gadget drivers diff --git a/drivers/usb/gadget/acm_ms.c b/drivers/usb/gadget/acm_ms.c index 7bfa134fe0e3..a252444cc0a7 100644 --- a/drivers/usb/gadget/acm_ms.c +++ b/drivers/usb/gadget/acm_ms.c @@ -107,7 +107,7 @@ static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS; */ #define fsg_num_buffers CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS -#endif /* CONFIG_USB_DEBUG */ +#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ FSG_MODULE_PARAMETERS(/* no prefix */, fsg_mod_data); diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 54a1e2954cea..41b062eb4de0 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c @@ -40,7 +40,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -446,7 +445,7 @@ static void ep_init(struct udc_regs __iomem *regs, struct udc_ep *ep) ep->ep.ops = &udc_ep_ops; INIT_LIST_HEAD(&ep->queue); - ep->ep.maxpacket = (u16) ~0; + usb_ep_set_maxpacket_limit(&ep->ep,(u16) ~0); /* set NAK */ tmp = readl(&ep->regs->ctl); tmp |= AMD_BIT(UDC_EPCTL_SNAK); @@ -1564,12 +1563,15 @@ static void udc_setup_endpoints(struct udc *dev) } /* EP0 max packet */ if (dev->gadget.speed == USB_SPEED_FULL) { - dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_FS_EP0IN_MAX_PKT_SIZE; - dev->ep[UDC_EP0OUT_IX].ep.maxpacket = - UDC_FS_EP0OUT_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep, + UDC_FS_EP0IN_MAX_PKT_SIZE); + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep, + UDC_FS_EP0OUT_MAX_PKT_SIZE); } else if (dev->gadget.speed == USB_SPEED_HIGH) { - dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE; - dev->ep[UDC_EP0OUT_IX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep, + UDC_EP0IN_MAX_PKT_SIZE); + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep, + UDC_EP0OUT_MAX_PKT_SIZE); } /* @@ -3338,7 +3340,7 @@ static int udc_remote_wakeup(struct udc *dev) } /* PCI device parameters */ -static DEFINE_PCI_DEVICE_TABLE(pci_id) = { +static const struct pci_device_id pci_id[] = { { PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096), .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 4cc4fd6d1473..cea8c20a1425 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c @@ -21,7 +21,6 @@ #include <linux/ioport.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/interrupt.h> #include <linux/proc_fs.h> @@ -834,7 +833,7 @@ static void udc_reinit(struct at91_udc *udc) ep->ep.desc = NULL; ep->stopped = 0; ep->fifo_bank = 0; - ep->ep.maxpacket = ep->maxpacket; + usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket); ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i); /* initialize one queue per endpoint */ INIT_LIST_HEAD(&ep->queue); @@ -1759,15 +1758,15 @@ static int at91udc_probe(struct platform_device *pdev) /* newer chips have more FIFO memory than rm9200 */ if (cpu_is_at91sam9260() || cpu_is_at91sam9g20()) { - udc->ep[0].maxpacket = 64; - udc->ep[3].maxpacket = 64; - udc->ep[4].maxpacket = 512; - udc->ep[5].maxpacket = 512; + usb_ep_set_maxpacket_limit(&udc->ep[0].ep, 64); + usb_ep_set_maxpacket_limit(&udc->ep[3].ep, 64); + usb_ep_set_maxpacket_limit(&udc->ep[4].ep, 512); + usb_ep_set_maxpacket_limit(&udc->ep[5].ep, 512); } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) { - udc->ep[3].maxpacket = 64; + usb_ep_set_maxpacket_limit(&udc->ep[3].ep, 64); } else if (cpu_is_at91sam9263()) { - udc->ep[0].maxpacket = 64; - udc->ep[3].maxpacket = 64; + usb_ep_set_maxpacket_limit(&udc->ep[0].ep, 64); + usb_ep_set_maxpacket_limit(&udc->ep[3].ep, 64); } udc->udp_baseaddr = ioremap(res->start, resource_size(res)); diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index 2cb52e0438df..38bf67b1a97d 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c @@ -1012,7 +1012,7 @@ static void nop_release(struct device *dev) } -struct usb_gadget usba_gadget_template = { +static struct usb_gadget usba_gadget_template = { .ops = &usba_udc_ops, .max_speed = USB_SPEED_HIGH, .name = "atmel_usba_udc", @@ -1904,7 +1904,7 @@ static struct usba_ep * atmel_udc_of_init(struct platform_device *pdev, ep->dma_regs = udc->regs + USBA_DMA_BASE(i); ep->fifo = udc->fifo + USBA_FIFO_BASE(i); ep->ep.ops = &usba_ep_ops; - ep->ep.maxpacket = ep->fifo_size; + usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size); ep->udc = udc; INIT_LIST_HEAD(&ep->queue); @@ -1957,7 +1957,8 @@ static struct usba_ep * usba_udc_pdata(struct platform_device *pdev, ep->fifo = udc->fifo + USBA_FIFO_BASE(i); ep->ep.ops = &usba_ep_ops; ep->ep.name = pdata->ep[i].name; - ep->fifo_size = ep->ep.maxpacket = pdata->ep[i].fifo_size; + ep->fifo_size = pdata->ep[i].fifo_size; + usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size); ep->udc = udc; INIT_LIST_HEAD(&ep->queue); ep->nr_banks = pdata->ep[i].nr_banks; @@ -1995,14 +1996,12 @@ static int __init usba_udc_probe(struct platform_device *pdev) if (irq < 0) return irq; - pclk = clk_get(&pdev->dev, "pclk"); + pclk = devm_clk_get(&pdev->dev, "pclk"); if (IS_ERR(pclk)) return PTR_ERR(pclk); - hclk = clk_get(&pdev->dev, "hclk"); - if (IS_ERR(hclk)) { - ret = PTR_ERR(hclk); - goto err_get_hclk; - } + hclk = devm_clk_get(&pdev->dev, "hclk"); + if (IS_ERR(hclk)) + return PTR_ERR(hclk); spin_lock_init(&udc->lock); udc->pdev = pdev; @@ -2011,17 +2010,17 @@ static int __init usba_udc_probe(struct platform_device *pdev) udc->vbus_pin = -ENODEV; ret = -ENOMEM; - udc->regs = ioremap(regs->start, resource_size(regs)); + udc->regs = devm_ioremap(&pdev->dev, regs->start, resource_size(regs)); if (!udc->regs) { dev_err(&pdev->dev, "Unable to map I/O memory, aborting.\n"); - goto err_map_regs; + return ret; } dev_info(&pdev->dev, "MMIO registers at 0x%08lx mapped at %p\n", (unsigned long)regs->start, udc->regs); - udc->fifo = ioremap(fifo->start, resource_size(fifo)); + udc->fifo = devm_ioremap(&pdev->dev, fifo->start, resource_size(fifo)); if (!udc->fifo) { dev_err(&pdev->dev, "Unable to map FIFO, aborting.\n"); - goto err_map_fifo; + return ret; } dev_info(&pdev->dev, "FIFO at 0x%08lx mapped at %p\n", (unsigned long)fifo->start, udc->fifo); @@ -2032,7 +2031,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) ret = clk_prepare_enable(pclk); if (ret) { dev_err(&pdev->dev, "Unable to enable pclk, aborting.\n"); - goto err_clk_enable; + return ret; } toggle_bias(0); usba_writel(udc, CTRL, USBA_DISABLE_MASK); @@ -2043,22 +2042,22 @@ static int __init usba_udc_probe(struct platform_device *pdev) else udc->usba_ep = usba_udc_pdata(pdev, udc); - if (IS_ERR(udc->usba_ep)) { - ret = PTR_ERR(udc->usba_ep); - goto err_alloc_ep; - } + if (IS_ERR(udc->usba_ep)) + return PTR_ERR(udc->usba_ep); - ret = request_irq(irq, usba_udc_irq, 0, "atmel_usba_udc", udc); + ret = devm_request_irq(&pdev->dev, irq, usba_udc_irq, 0, + "atmel_usba_udc", udc); if (ret) { dev_err(&pdev->dev, "Cannot request irq %d (error %d)\n", irq, ret); - goto err_request_irq; + return ret; } udc->irq = irq; if (gpio_is_valid(udc->vbus_pin)) { if (!devm_gpio_request(&pdev->dev, udc->vbus_pin, "atmel_usba_udc")) { - ret = request_irq(gpio_to_irq(udc->vbus_pin), + ret = devm_request_irq(&pdev->dev, + gpio_to_irq(udc->vbus_pin), usba_vbus_irq, 0, "atmel_usba_udc", udc); if (ret) { @@ -2077,31 +2076,13 @@ static int __init usba_udc_probe(struct platform_device *pdev) ret = usb_add_gadget_udc(&pdev->dev, &udc->gadget); if (ret) - goto err_add_udc; + return ret; usba_init_debugfs(udc); for (i = 1; i < udc->num_ep; i++) usba_ep_init_debugfs(udc, &udc->usba_ep[i]); return 0; - -err_add_udc: - if (gpio_is_valid(udc->vbus_pin)) - free_irq(gpio_to_irq(udc->vbus_pin), udc); - - free_irq(irq, udc); -err_request_irq: -err_alloc_ep: -err_clk_enable: - iounmap(udc->fifo); -err_map_fifo: - iounmap(udc->regs); -err_map_regs: - clk_put(hclk); -err_get_hclk: - clk_put(pclk); - - return ret; } static int __exit usba_udc_remove(struct platform_device *pdev) @@ -2117,16 +2098,6 @@ static int __exit usba_udc_remove(struct platform_device *pdev) usba_ep_cleanup_debugfs(&udc->usba_ep[i]); usba_cleanup_debugfs(udc); - if (gpio_is_valid(udc->vbus_pin)) { - free_irq(gpio_to_irq(udc->vbus_pin), udc); - } - - free_irq(udc->irq, udc); - iounmap(udc->fifo); - iounmap(udc->regs); - clk_put(udc->hclk); - clk_put(udc->pclk); - return 0; } diff --git a/drivers/usb/gadget/bcm63xx_udc.c b/drivers/usb/gadget/bcm63xx_udc.c index c58fcf1ebe41..888fbb43b338 100644 --- a/drivers/usb/gadget/bcm63xx_udc.c +++ b/drivers/usb/gadget/bcm63xx_udc.c @@ -19,7 +19,6 @@ #include <linux/device.h> #include <linux/dma-mapping.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/interrupt.h> #include <linux/ioport.h> #include <linux/kconfig.h> @@ -549,7 +548,7 @@ static void bcm63xx_ep_setup(struct bcm63xx_udc *udc) if (idx < 0) continue; - udc->bep[idx].ep.maxpacket = max_pkt; + usb_ep_set_maxpacket_limit(&udc->bep[idx].ep, max_pkt); val = (idx << USBD_CSR_EP_LOG_SHIFT) | (cfg->dir << USBD_CSR_EP_DIR_SHIFT) | @@ -943,7 +942,7 @@ static int bcm63xx_init_udc_hw(struct bcm63xx_udc *udc) bep->ep.ops = &bcm63xx_udc_ep_ops; list_add_tail(&bep->ep.ep_list, &udc->gadget.ep_list); bep->halted = 0; - bep->ep.maxpacket = BCM63XX_MAX_CTRL_PKT; + usb_ep_set_maxpacket_limit(&bep->ep, BCM63XX_MAX_CTRL_PKT); bep->udc = udc; bep->ep.desc = NULL; INIT_LIST_HEAD(&bep->queue); diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 2018ba1a2172..d742bed7a5fa 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -1452,8 +1452,22 @@ unknown: struct usb_configuration *c; c = cdev->config; - if (c && c->setup) + if (!c) + goto done; + + /* try current config's setup */ + if (c->setup) { value = c->setup(c, ctrl); + goto done; + } + + /* try the only function in the current config */ + if (!list_is_singular(&c->functions)) + goto done; + f = list_first_entry(&c->functions, struct usb_function, + list); + if (f->setup) + value = f->setup(f, ctrl); } goto done; @@ -1714,7 +1728,7 @@ composite_resume(struct usb_gadget *gadget) { struct usb_composite_dev *cdev = get_gadget_data(gadget); struct usb_function *f; - u8 maxpower; + u16 maxpower; /* REVISIT: should we have config level * suspend/resume callbacks? diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 25885112fa35..7d1cc01796b6 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -4,6 +4,7 @@ #include <linux/device.h> #include <linux/usb/composite.h> #include <linux/usb/gadget_configfs.h> +#include "configfs.h" int check_user_usb_string(const char *name, struct usb_gadget_strings *stringtab_dev) @@ -564,6 +565,13 @@ static struct config_group *function_make( usb_put_function_instance(fi); return ERR_PTR(ret); } + if (fi->set_inst_name) { + ret = fi->set_inst_name(fi, instance_name); + if (ret) { + usb_put_function_instance(fi); + return ERR_PTR(ret); + } + } gi = container_of(group, struct gadget_info, functions_group); diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 8f4dae310923..8c06430dcc47 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c @@ -951,7 +951,7 @@ static void init_dummy_udc_hw(struct dummy *dum) list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list); ep->halted = ep->wedged = ep->already_seen = ep->setup_stage = 0; - ep->ep.maxpacket = ~0; + usb_ep_set_maxpacket_limit(&ep->ep, ~0); ep->ep.max_streams = 16; ep->last_io = jiffies; ep->gadget = &dum->gadget; diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c index a777f7bd11b4..0567cca1465e 100644 --- a/drivers/usb/gadget/epautoconf.c +++ b/drivers/usb/gadget/epautoconf.c @@ -11,7 +11,6 @@ #include <linux/kernel.h> #include <linux/module.h> -#include <linux/init.h> #include <linux/types.h> #include <linux/device.h> @@ -58,7 +57,7 @@ ep_matches ( return 0; /* only support ep0 for portable CONTROL traffic */ - type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; + type = usb_endpoint_type(desc); if (USB_ENDPOINT_XFER_CONTROL == type) return 0; @@ -129,7 +128,7 @@ ep_matches ( * and wants to know the maximum possible, provide the info. */ if (desc->wMaxPacketSize == 0) - desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket); + desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket_limit); /* endpoint maxpacket size is an input parameter, except for bulk * where it's an output parameter representing the full speed limit. @@ -145,7 +144,7 @@ ep_matches ( case USB_ENDPOINT_XFER_ISOC: /* ISO: limit 1023 bytes full speed, 1024 high/super speed */ - if (ep->maxpacket < max) + if (ep->maxpacket_limit < max) return 0; if (!gadget_is_dualspeed(gadget) && max > 1023) return 0; @@ -178,7 +177,7 @@ ep_matches ( /* report (variable) full speed bulk maxpacket */ if ((USB_ENDPOINT_XFER_BULK == type) && !ep_comp) { - int size = ep->maxpacket; + int size = ep->maxpacket_limit; /* min() doesn't work on bitfields with gcc-3.5 */ if (size > 64) diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c index 8d9e6f7e8f1a..798760fa7e70 100644 --- a/drivers/usb/gadget/f_ecm.c +++ b/drivers/usb/gadget/f_ecm.c @@ -691,7 +691,6 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f) int status; struct usb_ep *ep; -#ifndef USBF_ECM_INCLUDED struct f_ecm_opts *ecm_opts; if (!can_support_ecm(cdev->gadget)) @@ -715,7 +714,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f) return status; ecm_opts->bound = true; } -#endif + us = usb_gstrings_attach(cdev, ecm_strings, ARRAY_SIZE(ecm_string_defs)); if (IS_ERR(us)) @@ -834,74 +833,6 @@ fail: return status; } -#ifdef USBF_ECM_INCLUDED - -static void -ecm_old_unbind(struct usb_configuration *c, struct usb_function *f) -{ - struct f_ecm *ecm = func_to_ecm(f); - - DBG(c->cdev, "ecm unbind\n"); - - usb_free_all_descriptors(f); - - kfree(ecm->notify_req->buf); - usb_ep_free_request(ecm->notify, ecm->notify_req); - kfree(ecm); -} - -/** - * ecm_bind_config - add CDC Ethernet network link to a configuration - * @c: the configuration to support the network link - * @ethaddr: a buffer in which the ethernet address of the host side - * side of the link was recorded - * @dev: eth_dev structure - * Context: single threaded during gadget setup - * - * Returns zero on success, else negative errno. - * - * Caller must have called @gether_setup(). Caller is also responsible - * for calling @gether_cleanup() before module unload. - */ -int -ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev) -{ - struct f_ecm *ecm; - int status; - - if (!can_support_ecm(c->cdev->gadget) || !ethaddr) - return -EINVAL; - - /* allocate and initialize one new instance */ - ecm = kzalloc(sizeof *ecm, GFP_KERNEL); - if (!ecm) - return -ENOMEM; - - /* export host's Ethernet address in CDC format */ - snprintf(ecm->ethaddr, sizeof ecm->ethaddr, "%pm", ethaddr); - ecm_string_defs[1].s = ecm->ethaddr; - - ecm->port.ioport = dev; - ecm->port.cdc_filter = DEFAULT_FILTER; - - ecm->port.func.name = "cdc_ethernet"; - /* descriptors are per-instance copies */ - ecm->port.func.bind = ecm_bind; - ecm->port.func.unbind = ecm_old_unbind; - ecm->port.func.set_alt = ecm_set_alt; - ecm->port.func.get_alt = ecm_get_alt; - ecm->port.func.setup = ecm_setup; - ecm->port.func.disable = ecm_disable; - - status = usb_add_function(c, &ecm->port.func); - if (status) - kfree(ecm); - return status; -} - -#else - static inline struct f_ecm_opts *to_f_ecm_opts(struct config_item *item) { return container_of(to_config_group(item), struct f_ecm_opts, @@ -1040,5 +971,3 @@ static struct usb_function *ecm_alloc(struct usb_function_instance *fi) DECLARE_USB_FUNCTION_INIT(ecm, ecm_alloc_inst, ecm_alloc); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Brownell"); - -#endif diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 241fc873ffa4..306a2b52125c 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c @@ -22,218 +22,42 @@ #include <linux/pagemap.h> #include <linux/export.h> #include <linux/hid.h> +#include <linux/module.h> #include <asm/unaligned.h> #include <linux/usb/composite.h> #include <linux/usb/functionfs.h> +#include "u_fs.h" +#include "configfs.h" #define FUNCTIONFS_MAGIC 0xa647361 /* Chosen by a honest dice roll ;) */ - -/* Debugging ****************************************************************/ - -#ifdef VERBOSE_DEBUG -#ifndef pr_vdebug -# define pr_vdebug pr_debug -#endif /* pr_vdebug */ -# define ffs_dump_mem(prefix, ptr, len) \ - print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len) -#else -#ifndef pr_vdebug -# define pr_vdebug(...) do { } while (0) -#endif /* pr_vdebug */ -# define ffs_dump_mem(prefix, ptr, len) do { } while (0) -#endif /* VERBOSE_DEBUG */ - -#define ENTER() pr_vdebug("%s()\n", __func__) - - -/* The data structure and setup file ****************************************/ - -enum ffs_state { - /* - * Waiting for descriptors and strings. - * - * In this state no open(2), read(2) or write(2) on epfiles - * may succeed (which should not be the problem as there - * should be no such files opened in the first place). - */ - FFS_READ_DESCRIPTORS, - FFS_READ_STRINGS, - - /* - * We've got descriptors and strings. We are or have called - * functionfs_ready_callback(). functionfs_bind() may have - * been called but we don't know. - * - * This is the only state in which operations on epfiles may - * succeed. - */ - FFS_ACTIVE, - - /* - * All endpoints have been closed. This state is also set if - * we encounter an unrecoverable error. The only - * unrecoverable error is situation when after reading strings - * from user space we fail to initialise epfiles or - * functionfs_ready_callback() returns with error (<0). - * - * In this state no open(2), read(2) or write(2) (both on ep0 - * as well as epfile) may succeed (at this point epfiles are - * unlinked and all closed so this is not a problem; ep0 is - * also closed but ep0 file exists and so open(2) on ep0 must - * fail). - */ - FFS_CLOSING -}; - - -enum ffs_setup_state { - /* There is no setup request pending. */ - FFS_NO_SETUP, - /* - * User has read events and there was a setup request event - * there. The next read/write on ep0 will handle the - * request. - */ - FFS_SETUP_PENDING, - /* - * There was event pending but before user space handled it - * some other event was introduced which canceled existing - * setup. If this state is set read/write on ep0 return - * -EIDRM. This state is only set when adding event. - */ - FFS_SETUP_CANCELED -}; - - - -struct ffs_epfile; -struct ffs_function; - -struct ffs_data { - struct usb_gadget *gadget; - - /* - * Protect access read/write operations, only one read/write - * at a time. As a consequence protects ep0req and company. - * While setup request is being processed (queued) this is - * held. - */ - struct mutex mutex; - - /* - * Protect access to endpoint related structures (basically - * usb_ep_queue(), usb_ep_dequeue(), etc. calls) except for - * endpoint zero. - */ - spinlock_t eps_lock; - - /* - * XXX REVISIT do we need our own request? Since we are not - * handling setup requests immediately user space may be so - * slow that another setup will be sent to the gadget but this - * time not to us but another function and then there could be - * a race. Is that the case? Or maybe we can use cdev->req - * after all, maybe we just need some spinlock for that? - */ - struct usb_request *ep0req; /* P: mutex */ - struct completion ep0req_completion; /* P: mutex */ - int ep0req_status; /* P: mutex */ - - /* reference counter */ - atomic_t ref; - /* how many files are opened (EP0 and others) */ - atomic_t opened; - - /* EP0 state */ - enum ffs_state state; - - /* - * Possible transitions: - * + FFS_NO_SETUP -> FFS_SETUP_PENDING -- P: ev.waitq.lock - * happens only in ep0 read which is P: mutex - * + FFS_SETUP_PENDING -> FFS_NO_SETUP -- P: ev.waitq.lock - * happens only in ep0 i/o which is P: mutex - * + FFS_SETUP_PENDING -> FFS_SETUP_CANCELED -- P: ev.waitq.lock - * + FFS_SETUP_CANCELED -> FFS_NO_SETUP -- cmpxchg - */ - enum ffs_setup_state setup_state; - -#define FFS_SETUP_STATE(ffs) \ - ((enum ffs_setup_state)cmpxchg(&(ffs)->setup_state, \ - FFS_SETUP_CANCELED, FFS_NO_SETUP)) - - /* Events & such. */ - struct { - u8 types[4]; - unsigned short count; - /* XXX REVISIT need to update it in some places, or do we? */ - unsigned short can_stall; - struct usb_ctrlrequest setup; - - wait_queue_head_t waitq; - } ev; /* the whole structure, P: ev.waitq.lock */ - - /* Flags */ - unsigned long flags; -#define FFS_FL_CALL_CLOSED_CALLBACK 0 -#define FFS_FL_BOUND 1 - - /* Active function */ - struct ffs_function *func; - - /* - * Device name, write once when file system is mounted. - * Intended for user to read if she wants. - */ - const char *dev_name; - /* Private data for our user (ie. gadget). Managed by user. */ - void *private_data; - - /* filled by __ffs_data_got_descs() */ - /* - * Real descriptors are 16 bytes after raw_descs (so you need - * to skip 16 bytes (ie. ffs->raw_descs + 16) to get to the - * first full speed descriptor). raw_descs_length and - * raw_fs_descs_length do not have those 16 bytes added. - */ - const void *raw_descs; - unsigned raw_descs_length; - unsigned raw_fs_descs_length; - unsigned fs_descs_count; - unsigned hs_descs_count; - - unsigned short strings_count; - unsigned short interfaces_count; - unsigned short eps_count; - unsigned short _pad1; - - /* filled by __ffs_data_got_strings() */ - /* ids in stringtabs are set in functionfs_bind() */ - const void *raw_strings; - struct usb_gadget_strings **stringtabs; - - /* - * File system's super block, write once when file system is - * mounted. - */ - struct super_block *sb; - - /* File permissions, written once when fs is mounted */ - struct ffs_file_perms { - umode_t mode; - kuid_t uid; - kgid_t gid; - } file_perms; - - /* - * The endpoint files, filled by ffs_epfiles_create(), - * destroyed by ffs_epfiles_destroy(). - */ - struct ffs_epfile *epfiles; -}; +/* Variable Length Array Macros **********************************************/ +#define vla_group(groupname) size_t groupname##__next = 0 +#define vla_group_size(groupname) groupname##__next + +#define vla_item(groupname, type, name, n) \ + size_t groupname##_##name##__offset = ({ \ + size_t align_mask = __alignof__(type) - 1; \ + size_t offset = (groupname##__next + align_mask) & ~align_mask;\ + size_t size = (n) * sizeof(type); \ + groupname##__next = offset + size; \ + offset; \ + }) + +#define vla_item_with_sz(groupname, type, name, n) \ + size_t groupname##_##name##__sz = (n) * sizeof(type); \ + size_t groupname##_##name##__offset = ({ \ + size_t align_mask = __alignof__(type) - 1; \ + size_t offset = (groupname##__next + align_mask) & ~align_mask;\ + size_t size = groupname##_##name##__sz; \ + groupname##__next = offset + size; \ + offset; \ + }) + +#define vla_ptr(ptr, groupname, name) \ + ((void *) ((char *)ptr + groupname##_##name##__offset)) /* Reference counter handling */ static void ffs_data_get(struct ffs_data *ffs); @@ -274,15 +98,12 @@ static struct ffs_function *ffs_func_from_usb(struct usb_function *f) return container_of(f, struct ffs_function, function); } -static void ffs_func_free(struct ffs_function *func); static void ffs_func_eps_disable(struct ffs_function *func); static int __must_check ffs_func_eps_enable(struct ffs_function *func); static int ffs_func_bind(struct usb_configuration *, struct usb_function *); -static void ffs_func_unbind(struct usb_configuration *, - struct usb_function *); static int ffs_func_set_alt(struct usb_function *, unsigned, unsigned); static void ffs_func_disable(struct usb_function *); static int ffs_func_setup(struct usb_function *, @@ -335,6 +156,17 @@ ffs_sb_create_file(struct super_block *sb, const char *name, void *data, const struct file_operations *fops, struct dentry **dentry_p); +/* Devices management *******************************************************/ + +DEFINE_MUTEX(ffs_lock); +EXPORT_SYMBOL(ffs_lock); + +static struct ffs_dev *ffs_find_dev(const char *name); +static int _ffs_name_dev(struct ffs_dev *dev, const char *name); +static void *ffs_acquire_dev(const char *dev_name); +static void ffs_release_dev(struct ffs_data *ffs_data); +static int ffs_ready(struct ffs_data *ffs); +static void ffs_closed(struct ffs_data *ffs); /* Misc helper functions ****************************************************/ @@ -460,7 +292,7 @@ static ssize_t ffs_ep0_write(struct file *file, const char __user *buf, ffs->state = FFS_ACTIVE; mutex_unlock(&ffs->mutex); - ret = functionfs_ready_callback(ffs); + ret = ffs_ready(ffs); if (unlikely(ret < 0)) { ffs->state = FFS_CLOSING; return ret; @@ -753,78 +585,71 @@ static ssize_t ffs_epfile_io(struct file *file, char __user *buf, size_t len, int read) { struct ffs_epfile *epfile = file->private_data; + struct usb_gadget *gadget = epfile->ffs->gadget; struct ffs_ep *ep; char *data = NULL; - ssize_t ret; + ssize_t ret, data_len; int halt; - goto first_try; - do { - spin_unlock_irq(&epfile->ffs->eps_lock); - mutex_unlock(&epfile->mutex); + /* Are we still active? */ + if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) { + ret = -ENODEV; + goto error; + } -first_try: - /* Are we still active? */ - if (WARN_ON(epfile->ffs->state != FFS_ACTIVE)) { - ret = -ENODEV; + /* Wait for endpoint to be enabled */ + ep = epfile->ep; + if (!ep) { + if (file->f_flags & O_NONBLOCK) { + ret = -EAGAIN; goto error; } - /* Wait for endpoint to be enabled */ - ep = epfile->ep; - if (!ep) { - if (file->f_flags & O_NONBLOCK) { - ret = -EAGAIN; - goto error; - } - - if (wait_event_interruptible(epfile->wait, - (ep = epfile->ep))) { - ret = -EINTR; - goto error; - } - } - - /* Do we halt? */ - halt = !read == !epfile->in; - if (halt && epfile->isoc) { - ret = -EINVAL; + ret = wait_event_interruptible(epfile->wait, (ep = epfile->ep)); + if (ret) { + ret = -EINTR; goto error; } + } - /* Allocate & copy */ - if (!halt && !data) { - data = kzalloc(len, GFP_KERNEL); - if (unlikely(!data)) - return -ENOMEM; + /* Do we halt? */ + halt = !read == !epfile->in; + if (halt && epfile->isoc) { + ret = -EINVAL; + goto error; + } - if (!read && - unlikely(__copy_from_user(data, buf, len))) { - ret = -EFAULT; - goto error; - } - } + /* Allocate & copy */ + if (!halt) { + /* + * Controller may require buffer size to be aligned to + * maxpacketsize of an out endpoint. + */ + data_len = read ? usb_ep_align_maybe(gadget, ep->ep, len) : len; + + data = kmalloc(data_len, GFP_KERNEL); + if (unlikely(!data)) + return -ENOMEM; - /* We will be using request */ - ret = ffs_mutex_lock(&epfile->mutex, - file->f_flags & O_NONBLOCK); - if (unlikely(ret)) + if (!read && unlikely(copy_from_user(data, buf, len))) { + ret = -EFAULT; goto error; + } + } - /* - * We're called from user space, we can use _irq rather then - * _irqsave - */ - spin_lock_irq(&epfile->ffs->eps_lock); + /* We will be using request */ + ret = ffs_mutex_lock(&epfile->mutex, file->f_flags & O_NONBLOCK); + if (unlikely(ret)) + goto error; - /* - * While we were acquiring mutex endpoint got disabled - * or changed? - */ - } while (unlikely(epfile->ep != ep)); + spin_lock_irq(&epfile->ffs->eps_lock); - /* Halt */ - if (unlikely(halt)) { + if (epfile->ep != ep) { + /* In the meantime, endpoint got disabled or changed. */ + ret = -ESHUTDOWN; + spin_unlock_irq(&epfile->ffs->eps_lock); + } else if (halt) { + /* Halt */ if (likely(epfile->ep == ep) && !WARN_ON(!ep->ep)) usb_ep_set_halt(ep->ep); spin_unlock_irq(&epfile->ffs->eps_lock); @@ -837,7 +662,7 @@ first_try: req->context = &done; req->complete = ffs_epfile_io_complete; req->buf = data; - req->length = len; + req->length = data_len; ret = usb_ep_queue(ep->ep, req, GFP_ATOMIC); @@ -849,9 +674,17 @@ first_try: ret = -EINTR; usb_ep_dequeue(ep->ep, req); } else { + /* + * XXX We may end up silently droping data here. + * Since data_len (i.e. req->length) may be bigger + * than len (after being rounded up to maxpacketsize), + * we may end up with more data then user space has + * space for. + */ ret = ep->status; if (read && ret > 0 && - unlikely(copy_to_user(buf, data, ret))) + unlikely(copy_to_user(buf, data, + min_t(size_t, ret, len)))) ret = -EFAULT; } } @@ -1191,7 +1024,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, return ERR_PTR(-ENOMEM); } - ffs_dev = functionfs_acquire_dev_callback(dev_name); + ffs_dev = ffs_acquire_dev(dev_name); if (IS_ERR(ffs_dev)) { ffs_data_put(ffs); return ERR_CAST(ffs_dev); @@ -1201,7 +1034,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, rv = mount_nodev(t, flags, &data, ffs_sb_fill); if (IS_ERR(rv) && data.ffs_data) { - functionfs_release_dev_callback(data.ffs_data); + ffs_release_dev(data.ffs_data); ffs_data_put(data.ffs_data); } return rv; @@ -1214,7 +1047,7 @@ ffs_fs_kill_sb(struct super_block *sb) kill_litter_super(sb); if (sb->s_fs_info) { - functionfs_release_dev_callback(sb->s_fs_info); + ffs_release_dev(sb->s_fs_info); ffs_data_put(sb->s_fs_info); } } @@ -1327,7 +1160,7 @@ static void ffs_data_clear(struct ffs_data *ffs) ENTER(); if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags)) - functionfs_closed_callback(ffs); + ffs_closed(ffs); BUG_ON(ffs->gadget); @@ -1463,71 +1296,6 @@ static void ffs_epfiles_destroy(struct ffs_epfile *epfiles, unsigned count) kfree(epfiles); } -static int functionfs_bind_config(struct usb_composite_dev *cdev, - struct usb_configuration *c, - struct ffs_data *ffs) -{ - struct ffs_function *func; - int ret; - - ENTER(); - - func = kzalloc(sizeof *func, GFP_KERNEL); - if (unlikely(!func)) - return -ENOMEM; - - func->function.name = "Function FS Gadget"; - func->function.strings = ffs->stringtabs; - - func->function.bind = ffs_func_bind; - func->function.unbind = ffs_func_unbind; - func->function.set_alt = ffs_func_set_alt; - func->function.disable = ffs_func_disable; - func->function.setup = ffs_func_setup; - func->function.suspend = ffs_func_suspend; - func->function.resume = ffs_func_resume; - - func->conf = c; - func->gadget = cdev->gadget; - func->ffs = ffs; - ffs_data_get(ffs); - - ret = usb_add_function(c, &func->function); - if (unlikely(ret)) - ffs_func_free(func); - - return ret; -} - -static void ffs_func_free(struct ffs_function *func) -{ - struct ffs_ep *ep = func->eps; - unsigned count = func->ffs->eps_count; - unsigned long flags; - - ENTER(); - - /* cleanup after autoconfig */ - spin_lock_irqsave(&func->ffs->eps_lock, flags); - do { - if (ep->ep && ep->req) - usb_ep_free_request(ep->ep, ep->req); - ep->req = NULL; - ++ep; - } while (--count); - spin_unlock_irqrestore(&func->ffs->eps_lock, flags); - - ffs_data_put(func->ffs); - - kfree(func->eps); - /* - * eps and interfaces_nums are allocated in the same chunk so - * only one free is required. Descriptors are also allocated - * in the same chunk. - */ - - kfree(func); -} static void ffs_func_eps_disable(struct ffs_function *func) { @@ -1901,30 +1669,34 @@ static int __ffs_data_got_strings(struct ffs_data *ffs, /* Allocate everything in one chunk so there's less maintenance. */ { - struct { - struct usb_gadget_strings *stringtabs[lang_count + 1]; - struct usb_gadget_strings stringtab[lang_count]; - struct usb_string strings[lang_count*(needed_count+1)]; - } *d; unsigned i = 0; + vla_group(d); + vla_item(d, struct usb_gadget_strings *, stringtabs, + lang_count + 1); + vla_item(d, struct usb_gadget_strings, stringtab, lang_count); + vla_item(d, struct usb_string, strings, + lang_count*(needed_count+1)); + + char *vlabuf = kmalloc(vla_group_size(d), GFP_KERNEL); - d = kmalloc(sizeof *d, GFP_KERNEL); - if (unlikely(!d)) { + if (unlikely(!vlabuf)) { kfree(_data); return -ENOMEM; } - stringtabs = d->stringtabs; - t = d->stringtab; + /* Initialize the VLA pointers */ + stringtabs = vla_ptr(vlabuf, d, stringtabs); + t = vla_ptr(vlabuf, d, stringtab); i = lang_count; do { *stringtabs++ = t++; } while (--i); *stringtabs = NULL; - stringtabs = d->stringtabs; - t = d->stringtab; - s = d->strings; + /* stringtabs = vlabuf = d_stringtabs for later kfree */ + stringtabs = vla_ptr(vlabuf, d, stringtabs); + t = vla_ptr(vlabuf, d, stringtab); + s = vla_ptr(vlabuf, d, strings); strings = s; } @@ -2187,8 +1959,57 @@ static int __ffs_func_bind_do_nums(enum ffs_entity_type type, u8 *valuep, return 0; } -static int ffs_func_bind(struct usb_configuration *c, - struct usb_function *f) +static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f, + struct usb_configuration *c) +{ + struct ffs_function *func = ffs_func_from_usb(f); + struct f_fs_opts *ffs_opts = + container_of(f->fi, struct f_fs_opts, func_inst); + int ret; + + ENTER(); + + /* + * Legacy gadget triggers binding in functionfs_ready_callback, + * which already uses locking; taking the same lock here would + * cause a deadlock. + * + * Configfs-enabled gadgets however do need ffs_dev_lock. + */ + if (!ffs_opts->no_configfs) + ffs_dev_lock(); + ret = ffs_opts->dev->desc_ready ? 0 : -ENODEV; + func->ffs = ffs_opts->dev->ffs_data; + if (!ffs_opts->no_configfs) + ffs_dev_unlock(); + if (ret) + return ERR_PTR(ret); + + func->conf = c; + func->gadget = c->cdev->gadget; + + ffs_data_get(func->ffs); + + /* + * in drivers/usb/gadget/configfs.c:configfs_composite_bind() + * configurations are bound in sequence with list_for_each_entry, + * in each configuration its functions are bound in sequence + * with list_for_each_entry, so we assume no race condition + * with regard to ffs_opts->bound access + */ + if (!ffs_opts->refcnt) { + ret = functionfs_bind(func->ffs, c->cdev); + if (ret) + return ERR_PTR(ret); + } + ffs_opts->refcnt++; + func->function.strings = func->ffs->stringtabs; + + return ffs_opts; +} + +static int _ffs_func_bind(struct usb_configuration *c, + struct usb_function *f) { struct ffs_function *func = ffs_func_from_usb(f); struct ffs_data *ffs = func->ffs; @@ -2200,16 +2021,16 @@ static int ffs_func_bind(struct usb_configuration *c, int ret; /* Make it a single chunk, less management later on */ - struct { - struct ffs_ep eps[ffs->eps_count]; - struct usb_descriptor_header - *fs_descs[full ? ffs->fs_descs_count + 1 : 0]; - struct usb_descriptor_header - *hs_descs[high ? ffs->hs_descs_count + 1 : 0]; - short inums[ffs->interfaces_count]; - char raw_descs[high ? ffs->raw_descs_length - : ffs->raw_fs_descs_length]; - } *data; + vla_group(d); + vla_item_with_sz(d, struct ffs_ep, eps, ffs->eps_count); + vla_item_with_sz(d, struct usb_descriptor_header *, fs_descs, + full ? ffs->fs_descs_count + 1 : 0); + vla_item_with_sz(d, struct usb_descriptor_header *, hs_descs, + high ? ffs->hs_descs_count + 1 : 0); + vla_item_with_sz(d, short, inums, ffs->interfaces_count); + vla_item_with_sz(d, char, raw_descs, + high ? ffs->raw_descs_length : ffs->raw_fs_descs_length); + char *vlabuf; ENTER(); @@ -2217,21 +2038,28 @@ static int ffs_func_bind(struct usb_configuration *c, if (unlikely(!(full | high))) return -ENOTSUPP; - /* Allocate */ - data = kmalloc(sizeof *data, GFP_KERNEL); - if (unlikely(!data)) + /* Allocate a single chunk, less management later on */ + vlabuf = kmalloc(vla_group_size(d), GFP_KERNEL); + if (unlikely(!vlabuf)) return -ENOMEM; /* Zero */ - memset(data->eps, 0, sizeof data->eps); - memcpy(data->raw_descs, ffs->raw_descs + 16, sizeof data->raw_descs); - memset(data->inums, 0xff, sizeof data->inums); - for (ret = ffs->eps_count; ret; --ret) - data->eps[ret].num = -1; + memset(vla_ptr(vlabuf, d, eps), 0, d_eps__sz); + memcpy(vla_ptr(vlabuf, d, raw_descs), ffs->raw_descs + 16, + d_raw_descs__sz); + memset(vla_ptr(vlabuf, d, inums), 0xff, d_inums__sz); + for (ret = ffs->eps_count; ret; --ret) { + struct ffs_ep *ptr; + + ptr = vla_ptr(vlabuf, d, eps); + ptr[ret].num = -1; + } - /* Save pointers */ - func->eps = data->eps; - func->interfaces_nums = data->inums; + /* Save pointers + * d_eps == vlabuf, func->eps used to kfree vlabuf later + */ + func->eps = vla_ptr(vlabuf, d, eps); + func->interfaces_nums = vla_ptr(vlabuf, d, inums); /* * Go through all the endpoint descriptors and allocate @@ -2239,10 +2067,10 @@ static int ffs_func_bind(struct usb_configuration *c, * numbers without worrying that it may be described later on. */ if (likely(full)) { - func->function.fs_descriptors = data->fs_descs; + func->function.fs_descriptors = vla_ptr(vlabuf, d, fs_descs); ret = ffs_do_descs(ffs->fs_descs_count, - data->raw_descs, - sizeof data->raw_descs, + vla_ptr(vlabuf, d, raw_descs), + d_raw_descs__sz, __ffs_func_bind_do_descs, func); if (unlikely(ret < 0)) goto error; @@ -2251,10 +2079,10 @@ static int ffs_func_bind(struct usb_configuration *c, } if (likely(high)) { - func->function.hs_descriptors = data->hs_descs; + func->function.hs_descriptors = vla_ptr(vlabuf, d, hs_descs); ret = ffs_do_descs(ffs->hs_descs_count, - data->raw_descs + ret, - (sizeof data->raw_descs) - ret, + vla_ptr(vlabuf, d, raw_descs) + ret, + d_raw_descs__sz - ret, __ffs_func_bind_do_descs, func); if (unlikely(ret < 0)) goto error; @@ -2267,7 +2095,7 @@ static int ffs_func_bind(struct usb_configuration *c, */ ret = ffs_do_descs(ffs->fs_descs_count + (high ? ffs->hs_descs_count : 0), - data->raw_descs, sizeof data->raw_descs, + vla_ptr(vlabuf, d, raw_descs), d_raw_descs__sz, __ffs_func_bind_do_nums, func); if (unlikely(ret < 0)) goto error; @@ -2281,26 +2109,19 @@ error: return ret; } - -/* Other USB function hooks *************************************************/ - -static void ffs_func_unbind(struct usb_configuration *c, - struct usb_function *f) +static int ffs_func_bind(struct usb_configuration *c, + struct usb_function *f) { - struct ffs_function *func = ffs_func_from_usb(f); - struct ffs_data *ffs = func->ffs; + struct f_fs_opts *ffs_opts = ffs_do_functionfs_bind(f, c); - ENTER(); + if (IS_ERR(ffs_opts)) + return PTR_ERR(ffs_opts); - if (ffs->func == func) { - ffs_func_eps_disable(func); - ffs->func = NULL; - } + return _ffs_func_bind(c, f); +} - ffs_event_add(ffs, FUNCTIONFS_UNBIND); - ffs_func_free(func); -} +/* Other USB function hooks *************************************************/ static int ffs_func_set_alt(struct usb_function *f, unsigned interface, unsigned alt) @@ -2428,6 +2249,411 @@ static int ffs_func_revmap_intf(struct ffs_function *func, u8 intf) } +/* Devices management *******************************************************/ + +static LIST_HEAD(ffs_devices); + +static struct ffs_dev *_ffs_find_dev(const char *name) +{ + struct ffs_dev *dev; + + list_for_each_entry(dev, &ffs_devices, entry) { + if (!dev->name || !name) + continue; + if (strcmp(dev->name, name) == 0) + return dev; + } + + return NULL; +} + +/* + * ffs_lock must be taken by the caller of this function + */ +static struct ffs_dev *ffs_get_single_dev(void) +{ + struct ffs_dev *dev; + + if (list_is_singular(&ffs_devices)) { + dev = list_first_entry(&ffs_devices, struct ffs_dev, entry); + if (dev->single) + return dev; + } + + return NULL; +} + +/* + * ffs_lock must be taken by the caller of this function + */ +static struct ffs_dev *ffs_find_dev(const char *name) +{ + struct ffs_dev *dev; + + dev = ffs_get_single_dev(); + if (dev) + return dev; + + return _ffs_find_dev(name); +} + +/* Configfs support *********************************************************/ + +static inline struct f_fs_opts *to_ffs_opts(struct config_item *item) +{ + return container_of(to_config_group(item), struct f_fs_opts, + func_inst.group); +} + +static void ffs_attr_release(struct config_item *item) +{ + struct f_fs_opts *opts = to_ffs_opts(item); + + usb_put_function_instance(&opts->func_inst); +} + +static struct configfs_item_operations ffs_item_ops = { + .release = ffs_attr_release, +}; + +static struct config_item_type ffs_func_type = { + .ct_item_ops = &ffs_item_ops, + .ct_owner = THIS_MODULE, +}; + + +/* Function registration interface ******************************************/ + +static void ffs_free_inst(struct usb_function_instance *f) +{ + struct f_fs_opts *opts; + + opts = to_f_fs_opts(f); + ffs_dev_lock(); + ffs_free_dev(opts->dev); + ffs_dev_unlock(); + kfree(opts); +} + +#define MAX_INST_NAME_LEN 40 + +static int ffs_set_inst_name(struct usb_function_instance *fi, const char *name) +{ + struct f_fs_opts *opts; + char *ptr; + const char *tmp; + int name_len, ret; + + name_len = strlen(name) + 1; + if (name_len > MAX_INST_NAME_LEN) + return -ENAMETOOLONG; + + ptr = kstrndup(name, name_len, GFP_KERNEL); + if (!ptr) + return -ENOMEM; + + opts = to_f_fs_opts(fi); + tmp = NULL; + + ffs_dev_lock(); + + tmp = opts->dev->name_allocated ? opts->dev->name : NULL; + ret = _ffs_name_dev(opts->dev, ptr); + if (ret) { + kfree(ptr); + ffs_dev_unlock(); + return ret; + } + opts->dev->name_allocated = true; + + ffs_dev_unlock(); + + kfree(tmp); + + return 0; +} + +static struct usb_function_instance *ffs_alloc_inst(void) +{ + struct f_fs_opts *opts; + struct ffs_dev *dev; + + opts = kzalloc(sizeof(*opts), GFP_KERNEL); + if (!opts) + return ERR_PTR(-ENOMEM); + + opts->func_inst.set_inst_name = ffs_set_inst_name; + opts->func_inst.free_func_inst = ffs_free_inst; + ffs_dev_lock(); + dev = ffs_alloc_dev(); + ffs_dev_unlock(); + if (IS_ERR(dev)) { + kfree(opts); + return ERR_CAST(dev); + } + opts->dev = dev; + dev->opts = opts; + + config_group_init_type_name(&opts->func_inst.group, "", + &ffs_func_type); + return &opts->func_inst; +} + +static void ffs_free(struct usb_function *f) +{ + kfree(ffs_func_from_usb(f)); +} + +static void ffs_func_unbind(struct usb_configuration *c, + struct usb_function *f) +{ + struct ffs_function *func = ffs_func_from_usb(f); + struct ffs_data *ffs = func->ffs; + struct f_fs_opts *opts = + container_of(f->fi, struct f_fs_opts, func_inst); + struct ffs_ep *ep = func->eps; + unsigned count = ffs->eps_count; + unsigned long flags; + + ENTER(); + if (ffs->func == func) { + ffs_func_eps_disable(func); + ffs->func = NULL; + } + + if (!--opts->refcnt) + functionfs_unbind(ffs); + + /* cleanup after autoconfig */ + spin_lock_irqsave(&func->ffs->eps_lock, flags); + do { + if (ep->ep && ep->req) + usb_ep_free_request(ep->ep, ep->req); + ep->req = NULL; + ++ep; + } while (--count); + spin_unlock_irqrestore(&func->ffs->eps_lock, flags); + kfree(func->eps); + func->eps = NULL; + /* + * eps, descriptors and interfaces_nums are allocated in the + * same chunk so only one free is required. + */ + func->function.fs_descriptors = NULL; + func->function.hs_descriptors = NULL; + func->interfaces_nums = NULL; + + ffs_event_add(ffs, FUNCTIONFS_UNBIND); +} + +static struct usb_function *ffs_alloc(struct usb_function_instance *fi) +{ + struct ffs_function *func; + + ENTER(); + + func = kzalloc(sizeof(*func), GFP_KERNEL); + if (unlikely(!func)) + return ERR_PTR(-ENOMEM); + + func->function.name = "Function FS Gadget"; + + func->function.bind = ffs_func_bind; + func->function.unbind = ffs_func_unbind; + func->function.set_alt = ffs_func_set_alt; + func->function.disable = ffs_func_disable; + func->function.setup = ffs_func_setup; + func->function.suspend = ffs_func_suspend; + func->function.resume = ffs_func_resume; + func->function.free_func = ffs_free; + + return &func->function; +} + +/* + * ffs_lock must be taken by the caller of this function + */ +struct ffs_dev *ffs_alloc_dev(void) +{ + struct ffs_dev *dev; + int ret; + + if (ffs_get_single_dev()) + return ERR_PTR(-EBUSY); + + dev = kzalloc(sizeof(*dev), GFP_KERNEL); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (list_empty(&ffs_devices)) { + ret = functionfs_init(); + if (ret) { + kfree(dev); + return ERR_PTR(ret); + } + } + + list_add(&dev->entry, &ffs_devices); + + return dev; +} + +/* + * ffs_lock must be taken by the caller of this function + * The caller is responsible for "name" being available whenever f_fs needs it + */ +static int _ffs_name_dev(struct ffs_dev *dev, const char *name) +{ + struct ffs_dev *existing; + + existing = _ffs_find_dev(name); + if (existing) + return -EBUSY; + + dev->name = name; + + return 0; +} + +/* + * The caller is responsible for "name" being available whenever f_fs needs it + */ +int ffs_name_dev(struct ffs_dev *dev, const char *name) +{ + int ret; + + ffs_dev_lock(); + ret = _ffs_name_dev(dev, name); + ffs_dev_unlock(); + + return ret; +} +EXPORT_SYMBOL(ffs_name_dev); + +int ffs_single_dev(struct ffs_dev *dev) +{ + int ret; + + ret = 0; + ffs_dev_lock(); + + if (!list_is_singular(&ffs_devices)) + ret = -EBUSY; + else + dev->single = true; + + ffs_dev_unlock(); + return ret; +} +EXPORT_SYMBOL(ffs_single_dev); + +/* + * ffs_lock must be taken by the caller of this function + */ +void ffs_free_dev(struct ffs_dev *dev) +{ + list_del(&dev->entry); + if (dev->name_allocated) + kfree(dev->name); + kfree(dev); + if (list_empty(&ffs_devices)) + functionfs_cleanup(); +} + +static void *ffs_acquire_dev(const char *dev_name) +{ + struct ffs_dev *ffs_dev; + + ENTER(); + ffs_dev_lock(); + + ffs_dev = ffs_find_dev(dev_name); + if (!ffs_dev) + ffs_dev = ERR_PTR(-ENODEV); + else if (ffs_dev->mounted) + ffs_dev = ERR_PTR(-EBUSY); + else if (ffs_dev->ffs_acquire_dev_callback && + ffs_dev->ffs_acquire_dev_callback(ffs_dev)) + ffs_dev = ERR_PTR(-ENODEV); + else + ffs_dev->mounted = true; + + ffs_dev_unlock(); + return ffs_dev; +} + +static void ffs_release_dev(struct ffs_data *ffs_data) +{ + struct ffs_dev *ffs_dev; + + ENTER(); + ffs_dev_lock(); + + ffs_dev = ffs_data->private_data; + if (ffs_dev) + ffs_dev->mounted = false; + + if (ffs_dev->ffs_release_dev_callback) + ffs_dev->ffs_release_dev_callback(ffs_dev); + + ffs_dev_unlock(); +} + +static int ffs_ready(struct ffs_data *ffs) +{ + struct ffs_dev *ffs_obj; + int ret = 0; + + ENTER(); + ffs_dev_lock(); + + ffs_obj = ffs->private_data; + if (!ffs_obj) { + ret = -EINVAL; + goto done; + } + if (WARN_ON(ffs_obj->desc_ready)) { + ret = -EBUSY; + goto done; + } + + ffs_obj->desc_ready = true; + ffs_obj->ffs_data = ffs; + + if (ffs_obj->ffs_ready_callback) + ret = ffs_obj->ffs_ready_callback(ffs); + +done: + ffs_dev_unlock(); + return ret; +} + +static void ffs_closed(struct ffs_data *ffs) +{ + struct ffs_dev *ffs_obj; + + ENTER(); + ffs_dev_lock(); + + ffs_obj = ffs->private_data; + if (!ffs_obj) + goto done; + + ffs_obj->desc_ready = false; + + if (ffs_obj->ffs_closed_callback) + ffs_obj->ffs_closed_callback(ffs); + + if (!ffs_obj->opts || ffs_obj->opts->no_configfs + || !ffs_obj->opts->func_inst.group.cg_item.ci_parent) + goto done; + + unregister_gadget_item(ffs_obj->opts-> + func_inst.group.cg_item.ci_parent->ci_parent); +done: + ffs_dev_unlock(); +} + /* Misc helper functions ****************************************************/ static int ffs_mutex_lock(struct mutex *mutex, unsigned nonblock) @@ -2458,3 +2684,7 @@ static char *ffs_prepare_buffer(const char __user *buf, size_t len) return data; } + +DECLARE_USB_FUNCTION_INIT(ffs, ffs_alloc_inst, ffs_alloc); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Michal Nazarewicz"); diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 6e69a8e8d22a..a95290a1289f 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c @@ -20,6 +20,8 @@ #include <linux/sched.h> #include <linux/usb/g_hid.h> +#include "u_f.h" + static int major, minors; static struct class *hidg_class; @@ -334,20 +336,10 @@ static int f_hidg_open(struct inode *inode, struct file *fd) /*-------------------------------------------------------------------------*/ /* usb_function */ -static struct usb_request *hidg_alloc_ep_req(struct usb_ep *ep, unsigned length) +static inline struct usb_request *hidg_alloc_ep_req(struct usb_ep *ep, + unsigned length) { - struct usb_request *req; - - req = usb_ep_alloc_request(ep, GFP_ATOMIC); - if (req) { - req->length = length; - req->buf = kmalloc(length, GFP_ATOMIC); - if (!req->buf) { - usb_ep_free_request(ep, req); - req = NULL; - } - } - return req; + return alloc_ep_req(ep, length, length); } static void hidg_set_report_complete(struct usb_ep *ep, struct usb_request *req) diff --git a/drivers/usb/gadget/f_loopback.c b/drivers/usb/gadget/f_loopback.c index 4a3873a0f2d0..4557cd03f0b1 100644 --- a/drivers/usb/gadget/f_loopback.c +++ b/drivers/usb/gadget/f_loopback.c @@ -20,6 +20,7 @@ #include <linux/usb/composite.h> #include "g_zero.h" +#include "u_f.h" /* * LOOPBACK FUNCTION ... a testing vehicle for USB peripherals, @@ -119,7 +120,7 @@ static struct usb_endpoint_descriptor ss_loop_source_desc = { .wMaxPacketSize = cpu_to_le16(1024), }; -struct usb_ss_ep_comp_descriptor ss_loop_source_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_loop_source_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, .bMaxBurst = 0, @@ -135,7 +136,7 @@ static struct usb_endpoint_descriptor ss_loop_sink_desc = { .wMaxPacketSize = cpu_to_le16(1024), }; -struct usb_ss_ep_comp_descriptor ss_loop_sink_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_loop_sink_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, .bMaxBurst = 0, @@ -230,6 +231,14 @@ autoconf_fail: static void lb_free_func(struct usb_function *f) { + struct f_lb_opts *opts; + + opts = container_of(f->fi, struct f_lb_opts, func_inst); + + mutex_lock(&opts->lock); + opts->refcnt--; + mutex_unlock(&opts->lock); + usb_free_all_descriptors(f); kfree(func_to_loop(f)); } @@ -293,6 +302,11 @@ static void disable_loopback(struct f_loopback *loop) VDBG(cdev, "%s disabled\n", loop->function.name); } +static inline struct usb_request *lb_alloc_ep_req(struct usb_ep *ep, int len) +{ + return alloc_ep_req(ep, len, buflen); +} + static int enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop) { @@ -332,7 +346,7 @@ fail0: * than 'buflen' bytes each. */ for (i = 0; i < qlen && result == 0; i++) { - req = alloc_ep_req(ep, 0); + req = lb_alloc_ep_req(ep, 0); if (req) { req->complete = loopback_complete; result = usb_ep_queue(ep, req, GFP_ATOMIC); @@ -380,6 +394,11 @@ static struct usb_function *loopback_alloc(struct usb_function_instance *fi) return ERR_PTR(-ENOMEM); lb_opts = container_of(fi, struct f_lb_opts, func_inst); + + mutex_lock(&lb_opts->lock); + lb_opts->refcnt++; + mutex_unlock(&lb_opts->lock); + buflen = lb_opts->bulk_buflen; qlen = lb_opts->qlen; if (!qlen) @@ -396,6 +415,118 @@ static struct usb_function *loopback_alloc(struct usb_function_instance *fi) return &loop->function; } +static inline struct f_lb_opts *to_f_lb_opts(struct config_item *item) +{ + return container_of(to_config_group(item), struct f_lb_opts, + func_inst.group); +} + +CONFIGFS_ATTR_STRUCT(f_lb_opts); +CONFIGFS_ATTR_OPS(f_lb_opts); + +static void lb_attr_release(struct config_item *item) +{ + struct f_lb_opts *lb_opts = to_f_lb_opts(item); + + usb_put_function_instance(&lb_opts->func_inst); +} + +static struct configfs_item_operations lb_item_ops = { + .release = lb_attr_release, + .show_attribute = f_lb_opts_attr_show, + .store_attribute = f_lb_opts_attr_store, +}; + +static ssize_t f_lb_opts_qlen_show(struct f_lb_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->qlen); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_lb_opts_qlen_store(struct f_lb_opts *opts, + const char *page, size_t len) +{ + int ret; + u32 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou32(page, 0, &num); + if (ret) + goto end; + + opts->qlen = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_lb_opts_attribute f_lb_opts_qlen = + __CONFIGFS_ATTR(qlen, S_IRUGO | S_IWUSR, + f_lb_opts_qlen_show, + f_lb_opts_qlen_store); + +static ssize_t f_lb_opts_bulk_buflen_show(struct f_lb_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->bulk_buflen); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_lb_opts_bulk_buflen_store(struct f_lb_opts *opts, + const char *page, size_t len) +{ + int ret; + u32 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou32(page, 0, &num); + if (ret) + goto end; + + opts->bulk_buflen = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_lb_opts_attribute f_lb_opts_bulk_buflen = + __CONFIGFS_ATTR(buflen, S_IRUGO | S_IWUSR, + f_lb_opts_bulk_buflen_show, + f_lb_opts_bulk_buflen_store); + +static struct configfs_attribute *lb_attrs[] = { + &f_lb_opts_qlen.attr, + &f_lb_opts_bulk_buflen.attr, + NULL, +}; + +static struct config_item_type lb_func_type = { + .ct_item_ops = &lb_item_ops, + .ct_attrs = lb_attrs, + .ct_owner = THIS_MODULE, +}; + static void lb_free_instance(struct usb_function_instance *fi) { struct f_lb_opts *lb_opts; @@ -411,7 +542,14 @@ static struct usb_function_instance *loopback_alloc_instance(void) lb_opts = kzalloc(sizeof(*lb_opts), GFP_KERNEL); if (!lb_opts) return ERR_PTR(-ENOMEM); + mutex_init(&lb_opts->lock); lb_opts->func_inst.free_func_inst = lb_free_instance; + lb_opts->bulk_buflen = GZERO_BULK_BUFLEN; + lb_opts->qlen = GZERO_QLEN; + + config_group_init_type_name(&lb_opts->func_inst.group, "", + &lb_func_type); + return &lb_opts->func_inst; } DECLARE_USB_FUNCTION(Loopback, loopback_alloc_instance, loopback_alloc); diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c index 263e721c2694..36d4bb23087f 100644 --- a/drivers/usb/gadget/f_midi.c +++ b/drivers/usb/gadget/f_midi.c @@ -32,6 +32,8 @@ #include <linux/usb/audio.h> #include <linux/usb/midi.h> +#include "u_f.h" + MODULE_AUTHOR("Ben Williamson"); MODULE_LICENSE("GPL v2"); @@ -191,20 +193,10 @@ static struct usb_gadget_strings *midi_strings[] = { NULL, }; -static struct usb_request *alloc_ep_req(struct usb_ep *ep, unsigned length) +static inline struct usb_request *midi_alloc_ep_req(struct usb_ep *ep, + unsigned length) { - struct usb_request *req; - - req = usb_ep_alloc_request(ep, GFP_ATOMIC); - if (req) { - req->length = length; - req->buf = kmalloc(length, GFP_ATOMIC); - if (!req->buf) { - usb_ep_free_request(ep, req); - req = NULL; - } - } - return req; + return alloc_ep_req(ep, length, length); } static void free_ep_req(struct usb_ep *ep, struct usb_request *req) @@ -365,7 +357,7 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt) /* allocate a bunch of read buffers and queue them all at once. */ for (i = 0; i < midi->qlen && err == 0; i++) { struct usb_request *req = - alloc_ep_req(midi->out_ep, midi->buflen); + midi_alloc_ep_req(midi->out_ep, midi->buflen); if (req == NULL) return -ENOMEM; @@ -546,7 +538,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req) return; if (!req) - req = alloc_ep_req(ep, midi->buflen); + req = midi_alloc_ep_req(ep, midi->buflen); if (!req) { ERROR(midi, "gmidi_transmit: alloc_ep_request failed\n"); diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c index 1c28fe13328a..a9499fd30792 100644 --- a/drivers/usb/gadget/f_ncm.c +++ b/drivers/usb/gadget/f_ncm.c @@ -1386,7 +1386,7 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) usb_ep_free_request(ncm->notify, ncm->notify_req); } -struct usb_function *ncm_alloc(struct usb_function_instance *fi) +static struct usb_function *ncm_alloc(struct usb_function_instance *fi) { struct f_ncm *ncm; struct f_ncm_opts *opts; diff --git a/drivers/usb/gadget/f_obex.c b/drivers/usb/gadget/f_obex.c index ad39f1dacba3..aebae1853bce 100644 --- a/drivers/usb/gadget/f_obex.c +++ b/drivers/usb/gadget/f_obex.c @@ -499,7 +499,7 @@ static void obex_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_all_descriptors(f); } -struct usb_function *obex_alloc(struct usb_function_instance *fi) +static struct usb_function *obex_alloc(struct usb_function_instance *fi) { struct f_obex *obex; struct f_serial_opts *opts; diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index eb3aa817a662..f2b781773eed 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c @@ -689,7 +689,7 @@ static void pn_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_all_descriptors(f); } -struct usb_function *phonet_alloc(struct usb_function_instance *fi) +static struct usb_function *phonet_alloc(struct usb_function_instance *fi) { struct f_phonet *fp; struct f_phonet_opts *opts; diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 717ed7f95639..c11761ce5113 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c @@ -675,7 +675,6 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) int status; struct usb_ep *ep; -#ifndef USB_FRNDIS_INCLUDED struct f_rndis_opts *rndis_opts; if (!can_support_rndis(c)) @@ -697,7 +696,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) return status; rndis_opts->bound = true; } -#endif + us = usb_gstrings_attach(cdev, rndis_strings, ARRAY_SIZE(rndis_string_defs)); if (IS_ERR(us)) @@ -782,13 +781,6 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) rndis->port.open = rndis_open; rndis->port.close = rndis_close; -#ifdef USB_FRNDIS_INCLUDED - status = rndis_register(rndis_response_available, rndis); - if (status < 0) - goto fail; - rndis->config = status; -#endif - rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 0); rndis_set_host_mac(rndis->config, rndis->ethaddr); @@ -830,66 +822,6 @@ fail: return status; } -#ifdef USB_FRNDIS_INCLUDED - -static void -rndis_old_unbind(struct usb_configuration *c, struct usb_function *f) -{ - struct f_rndis *rndis = func_to_rndis(f); - - rndis_deregister(rndis->config); - - usb_free_all_descriptors(f); - - kfree(rndis->notify_req->buf); - usb_ep_free_request(rndis->notify, rndis->notify_req); - - kfree(rndis); -} - -int -rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - u32 vendorID, const char *manufacturer, struct eth_dev *dev) -{ - struct f_rndis *rndis; - int status; - - /* allocate and initialize one new instance */ - status = -ENOMEM; - rndis = kzalloc(sizeof *rndis, GFP_KERNEL); - if (!rndis) - goto fail; - - memcpy(rndis->ethaddr, ethaddr, ETH_ALEN); - rndis->vendorID = vendorID; - rndis->manufacturer = manufacturer; - - rndis->port.ioport = dev; - /* RNDIS activates when the host changes this filter */ - rndis->port.cdc_filter = 0; - - /* RNDIS has special (and complex) framing */ - rndis->port.header_len = sizeof(struct rndis_packet_msg_type); - rndis->port.wrap = rndis_add_header; - rndis->port.unwrap = rndis_rm_hdr; - - rndis->port.func.name = "rndis"; - /* descriptors are per-instance copies */ - rndis->port.func.bind = rndis_bind; - rndis->port.func.unbind = rndis_old_unbind; - rndis->port.func.set_alt = rndis_set_alt; - rndis->port.func.setup = rndis_setup; - rndis->port.func.disable = rndis_disable; - - status = usb_add_function(c, &rndis->port.func); - if (status) - kfree(rndis); -fail: - return status; -} - -#else - void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net) { struct f_rndis_opts *opts; @@ -1047,8 +979,26 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi) return &rndis->port.func; } -DECLARE_USB_FUNCTION_INIT(rndis, rndis_alloc_inst, rndis_alloc); +DECLARE_USB_FUNCTION(rndis, rndis_alloc_inst, rndis_alloc); + +static int __init rndis_mod_init(void) +{ + int ret; + + ret = rndis_init(); + if (ret) + return ret; + + return usb_function_register(&rndisusb_func); +} +module_init(rndis_mod_init); + +static void __exit rndis_mod_exit(void) +{ + usb_function_unregister(&rndisusb_func); + rndis_exit(); +} +module_exit(rndis_mod_exit); + MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Brownell"); - -#endif diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index 981113c9924d..9ecbcbf36a45 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c @@ -354,7 +354,7 @@ static void gser_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_all_descriptors(f); } -struct usb_function *gser_alloc(struct usb_function_instance *fi) +static struct usb_function *gser_alloc(struct usb_function_instance *fi) { struct f_gser *gser; struct f_serial_opts *opts; diff --git a/drivers/usb/gadget/f_sourcesink.c b/drivers/usb/gadget/f_sourcesink.c index a8895859a221..d3cd52db78fe 100644 --- a/drivers/usb/gadget/f_sourcesink.c +++ b/drivers/usb/gadget/f_sourcesink.c @@ -21,6 +21,7 @@ #include "g_zero.h" #include "gadget_chips.h" +#include "u_f.h" /* * SOURCE/SINK FUNCTION ... a primary testing vehicle for USB peripheral @@ -201,7 +202,7 @@ static struct usb_endpoint_descriptor ss_source_desc = { .wMaxPacketSize = cpu_to_le16(1024), }; -struct usb_ss_ep_comp_descriptor ss_source_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_source_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, @@ -218,7 +219,7 @@ static struct usb_endpoint_descriptor ss_sink_desc = { .wMaxPacketSize = cpu_to_le16(1024), }; -struct usb_ss_ep_comp_descriptor ss_sink_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_sink_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, @@ -236,7 +237,7 @@ static struct usb_endpoint_descriptor ss_iso_source_desc = { .bInterval = 4, }; -struct usb_ss_ep_comp_descriptor ss_iso_source_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_iso_source_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, @@ -254,7 +255,7 @@ static struct usb_endpoint_descriptor ss_iso_sink_desc = { .bInterval = 4, }; -struct usb_ss_ep_comp_descriptor ss_iso_sink_comp_desc = { +static struct usb_ss_ep_comp_descriptor ss_iso_sink_comp_desc = { .bLength = USB_DT_SS_EP_COMP_SIZE, .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, @@ -301,23 +302,9 @@ static struct usb_gadget_strings *sourcesink_strings[] = { /*-------------------------------------------------------------------------*/ -struct usb_request *alloc_ep_req(struct usb_ep *ep, int len) +static inline struct usb_request *ss_alloc_ep_req(struct usb_ep *ep, int len) { - struct usb_request *req; - - req = usb_ep_alloc_request(ep, GFP_ATOMIC); - if (req) { - if (len) - req->length = len; - else - req->length = buflen; - req->buf = kmalloc(req->length, GFP_ATOMIC); - if (!req->buf) { - usb_ep_free_request(ep, req); - req = NULL; - } - } - return req; + return alloc_ep_req(ep, len, buflen); } void free_ep_req(struct usb_ep *ep, struct usb_request *req) @@ -490,6 +477,14 @@ no_iso: static void sourcesink_free_func(struct usb_function *f) { + struct f_ss_opts *opts; + + opts = container_of(f->fi, struct f_ss_opts, func_inst); + + mutex_lock(&opts->lock); + opts->refcnt--; + mutex_unlock(&opts->lock); + usb_free_all_descriptors(f); kfree(func_to_ss(f)); } @@ -628,10 +623,10 @@ static int source_sink_start_ep(struct f_sourcesink *ss, bool is_in, break; } ep = is_in ? ss->iso_in_ep : ss->iso_out_ep; - req = alloc_ep_req(ep, size); + req = ss_alloc_ep_req(ep, size); } else { ep = is_in ? ss->in_ep : ss->out_ep; - req = alloc_ep_req(ep, 0); + req = ss_alloc_ep_req(ep, 0); } if (!req) @@ -878,6 +873,11 @@ static struct usb_function *source_sink_alloc_func( return NULL; ss_opts = container_of(fi, struct f_ss_opts, func_inst); + + mutex_lock(&ss_opts->lock); + ss_opts->refcnt++; + mutex_unlock(&ss_opts->lock); + pattern = ss_opts->pattern; isoc_interval = ss_opts->isoc_interval; isoc_maxpacket = ss_opts->isoc_maxpacket; @@ -898,6 +898,303 @@ static struct usb_function *source_sink_alloc_func( return &ss->function; } +static inline struct f_ss_opts *to_f_ss_opts(struct config_item *item) +{ + return container_of(to_config_group(item), struct f_ss_opts, + func_inst.group); +} + +CONFIGFS_ATTR_STRUCT(f_ss_opts); +CONFIGFS_ATTR_OPS(f_ss_opts); + +static void ss_attr_release(struct config_item *item) +{ + struct f_ss_opts *ss_opts = to_f_ss_opts(item); + + usb_put_function_instance(&ss_opts->func_inst); +} + +static struct configfs_item_operations ss_item_ops = { + .release = ss_attr_release, + .show_attribute = f_ss_opts_attr_show, + .store_attribute = f_ss_opts_attr_store, +}; + +static ssize_t f_ss_opts_pattern_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->pattern); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_pattern_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u8 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou8(page, 0, &num); + if (ret) + goto end; + + if (num != 0 && num != 1 && num != 2) { + ret = -EINVAL; + goto end; + } + + opts->pattern = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_pattern = + __CONFIGFS_ATTR(pattern, S_IRUGO | S_IWUSR, + f_ss_opts_pattern_show, + f_ss_opts_pattern_store); + +static ssize_t f_ss_opts_isoc_interval_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->isoc_interval); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_isoc_interval_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u8 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou8(page, 0, &num); + if (ret) + goto end; + + if (num > 16) { + ret = -EINVAL; + goto end; + } + + opts->isoc_interval = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_isoc_interval = + __CONFIGFS_ATTR(isoc_interval, S_IRUGO | S_IWUSR, + f_ss_opts_isoc_interval_show, + f_ss_opts_isoc_interval_store); + +static ssize_t f_ss_opts_isoc_maxpacket_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->isoc_maxpacket); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_isoc_maxpacket_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u16 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou16(page, 0, &num); + if (ret) + goto end; + + if (num > 1024) { + ret = -EINVAL; + goto end; + } + + opts->isoc_maxpacket = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_isoc_maxpacket = + __CONFIGFS_ATTR(isoc_maxpacket, S_IRUGO | S_IWUSR, + f_ss_opts_isoc_maxpacket_show, + f_ss_opts_isoc_maxpacket_store); + +static ssize_t f_ss_opts_isoc_mult_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->isoc_mult); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_isoc_mult_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u8 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou8(page, 0, &num); + if (ret) + goto end; + + if (num > 2) { + ret = -EINVAL; + goto end; + } + + opts->isoc_mult = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_isoc_mult = + __CONFIGFS_ATTR(isoc_mult, S_IRUGO | S_IWUSR, + f_ss_opts_isoc_mult_show, + f_ss_opts_isoc_mult_store); + +static ssize_t f_ss_opts_isoc_maxburst_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->isoc_maxburst); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_isoc_maxburst_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u8 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou8(page, 0, &num); + if (ret) + goto end; + + if (num > 15) { + ret = -EINVAL; + goto end; + } + + opts->isoc_maxburst = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_isoc_maxburst = + __CONFIGFS_ATTR(isoc_maxburst, S_IRUGO | S_IWUSR, + f_ss_opts_isoc_maxburst_show, + f_ss_opts_isoc_maxburst_store); + +static ssize_t f_ss_opts_bulk_buflen_show(struct f_ss_opts *opts, char *page) +{ + int result; + + mutex_lock(&opts->lock); + result = sprintf(page, "%d", opts->bulk_buflen); + mutex_unlock(&opts->lock); + + return result; +} + +static ssize_t f_ss_opts_bulk_buflen_store(struct f_ss_opts *opts, + const char *page, size_t len) +{ + int ret; + u32 num; + + mutex_lock(&opts->lock); + if (opts->refcnt) { + ret = -EBUSY; + goto end; + } + + ret = kstrtou32(page, 0, &num); + if (ret) + goto end; + + opts->bulk_buflen = num; + ret = len; +end: + mutex_unlock(&opts->lock); + return ret; +} + +static struct f_ss_opts_attribute f_ss_opts_bulk_buflen = + __CONFIGFS_ATTR(buflen, S_IRUGO | S_IWUSR, + f_ss_opts_bulk_buflen_show, + f_ss_opts_bulk_buflen_store); + +static struct configfs_attribute *ss_attrs[] = { + &f_ss_opts_pattern.attr, + &f_ss_opts_isoc_interval.attr, + &f_ss_opts_isoc_maxpacket.attr, + &f_ss_opts_isoc_mult.attr, + &f_ss_opts_isoc_maxburst.attr, + &f_ss_opts_bulk_buflen.attr, + NULL, +}; + +static struct config_item_type ss_func_type = { + .ct_item_ops = &ss_item_ops, + .ct_attrs = ss_attrs, + .ct_owner = THIS_MODULE, +}; + static void source_sink_free_instance(struct usb_function_instance *fi) { struct f_ss_opts *ss_opts; @@ -913,7 +1210,15 @@ static struct usb_function_instance *source_sink_alloc_inst(void) ss_opts = kzalloc(sizeof(*ss_opts), GFP_KERNEL); if (!ss_opts) return ERR_PTR(-ENOMEM); + mutex_init(&ss_opts->lock); ss_opts->func_inst.free_func_inst = source_sink_free_instance; + ss_opts->isoc_interval = GZERO_ISOC_INTERVAL; + ss_opts->isoc_maxpacket = GZERO_ISOC_MAXPACKET; + ss_opts->bulk_buflen = GZERO_BULK_BUFLEN; + + config_group_init_type_name(&ss_opts->func_inst.group, "", + &ss_func_type); + return &ss_opts->func_inst; } DECLARE_USB_FUNCTION(SourceSink, source_sink_alloc_inst, diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c index 7c8674fa7e80..f1a59190ac9a 100644 --- a/drivers/usb/gadget/f_subset.c +++ b/drivers/usb/gadget/f_subset.c @@ -301,7 +301,6 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) int status; struct usb_ep *ep; -#ifndef USB_FSUBSET_INCLUDED struct f_gether_opts *gether_opts; gether_opts = container_of(f->fi, struct f_gether_opts, func_inst); @@ -322,7 +321,7 @@ geth_bind(struct usb_configuration *c, struct usb_function *f) return status; gether_opts->bound = true; } -#endif + us = usb_gstrings_attach(cdev, geth_strings, ARRAY_SIZE(geth_string_defs)); if (IS_ERR(us)) @@ -393,61 +392,6 @@ fail: return status; } -#ifdef USB_FSUBSET_INCLUDED - -static void -geth_old_unbind(struct usb_configuration *c, struct usb_function *f) -{ - geth_string_defs[0].id = 0; - usb_free_all_descriptors(f); - kfree(func_to_geth(f)); -} - -/** - * geth_bind_config - add CDC Subset network link to a configuration - * @c: the configuration to support the network link - * @ethaddr: a buffer in which the ethernet address of the host side - * side of the link was recorded - * @dev: eth_dev structure - * Context: single threaded during gadget setup - * - * Returns zero on success, else negative errno. - * - * Caller must have called @gether_setup(). Caller is also responsible - * for calling @gether_cleanup() before module unload. - */ -int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev) -{ - struct f_gether *geth; - int status; - - /* allocate and initialize one new instance */ - geth = kzalloc(sizeof *geth, GFP_KERNEL); - if (!geth) - return -ENOMEM; - - /* export host's Ethernet address in CDC format */ - snprintf(geth->ethaddr, sizeof geth->ethaddr, "%pm", ethaddr); - geth_string_defs[1].s = geth->ethaddr; - - geth->port.ioport = dev; - geth->port.cdc_filter = DEFAULT_FILTER; - - geth->port.func.name = "cdc_subset"; - geth->port.func.bind = geth_bind; - geth->port.func.unbind = geth_old_unbind; - geth->port.func.set_alt = geth_set_alt; - geth->port.func.disable = geth_disable; - - status = usb_add_function(c, &geth->port.func); - if (status) - kfree(geth); - return status; -} - -#else - static inline struct f_gether_opts *to_f_gether_opts(struct config_item *item) { return container_of(to_config_group(item), struct f_gether_opts, @@ -573,5 +517,3 @@ static struct usb_function *geth_alloc(struct usb_function_instance *fi) DECLARE_USB_FUNCTION_INIT(geth, geth_alloc_inst, geth_alloc); MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Brownell"); - -#endif diff --git a/drivers/usb/gadget/fotg210-udc.c b/drivers/usb/gadget/fotg210-udc.c index bbbfd1948778..2d0305280e8c 100644 --- a/drivers/usb/gadget/fotg210-udc.c +++ b/drivers/usb/gadget/fotg210-udc.c @@ -1157,8 +1157,9 @@ static int fotg210_udc_probe(struct platform_device *pdev) INIT_LIST_HEAD(&ep->queue); ep->ep.name = fotg210_ep_name[i]; ep->ep.ops = &fotg210_ep_ops; + usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); } - fotg210->ep[0]->ep.maxpacket = 0x40; + usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40); fotg210->gadget.ep0 = &fotg210->ep[0]->ep; INIT_LIST_HEAD(&fotg210->gadget.ep0->ep_list); diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index 807127d56fa3..ad5483335167 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c @@ -22,7 +22,6 @@ #include <linux/module.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/ioport.h> #include <linux/types.h> #include <linux/errno.h> @@ -2429,7 +2428,7 @@ static int qe_ep_config(struct qe_udc *udc, unsigned char pipe_num) ep->ep.ops = &qe_ep_ops; ep->stopped = 1; - ep->ep.maxpacket = (unsigned short) ~0; + usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); ep->ep.desc = NULL; ep->dir = 0xff; ep->epnum = (u8)pipe_num; @@ -2717,7 +2716,7 @@ MODULE_DEVICE_TABLE(of, qe_udc_match); static struct platform_driver udc_driver = { .driver = { - .name = (char *)driver_name, + .name = driver_name, .owner = THIS_MODULE, .of_match_table = qe_udc_match, }, diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 36ac7cfba91d..15960af0f67e 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c @@ -2311,7 +2311,7 @@ static int __init struct_ep_setup(struct fsl_udc *udc, unsigned char index, /* for ep0: maxP defined in desc * for other eps, maxP is set by epautoconfig() called by gadget layer */ - ep->ep.maxpacket = (unsigned short) ~0; + usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); /* the queue lists any req for this ep */ INIT_LIST_HEAD(&ep->queue); @@ -2469,7 +2469,8 @@ static int __init fsl_udc_probe(struct platform_device *pdev) * for other eps, gadget layer called ep_enable with defined desc */ udc_controller->eps[0].ep.desc = &fsl_ep0_desc; - udc_controller->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD; + usb_ep_set_maxpacket_limit(&udc_controller->eps[0].ep, + USB_MAX_CTRL_PAYLOAD); /* setup the udc->eps[] for non-control endpoints and link * to gadget.ep_list */ @@ -2666,7 +2667,7 @@ static struct platform_driver udc_driver = { .suspend = fsl_udc_suspend, .resume = fsl_udc_resume, .driver = { - .name = (char *)driver_name, + .name = driver_name, .owner = THIS_MODULE, /* udc suspend/resume called from OTG driver */ .suspend = fsl_udc_otg_suspend, diff --git a/drivers/usb/gadget/fusb300_udc.c b/drivers/usb/gadget/fusb300_udc.c index b278abe52453..6423f1840ed9 100644 --- a/drivers/usb/gadget/fusb300_udc.c +++ b/drivers/usb/gadget/fusb300_udc.c @@ -1452,9 +1452,9 @@ static int __init fusb300_probe(struct platform_device *pdev) INIT_LIST_HEAD(&ep->queue); ep->ep.name = fusb300_ep_name[i]; ep->ep.ops = &fusb300_ep_ops; - ep->ep.maxpacket = HS_BULK_MAX_PACKET_SIZE; + usb_ep_set_maxpacket_limit(&ep->ep, HS_BULK_MAX_PACKET_SIZE); } - fusb300->ep[0]->ep.maxpacket = HS_CTL_MAX_PACKET_SIZE; + usb_ep_set_maxpacket_limit(&fusb300->ep[0]->ep, HS_CTL_MAX_PACKET_SIZE); fusb300->ep[0]->epnum = 0; fusb300->gadget.ep0 = &fusb300->ep[0]->ep; INIT_LIST_HEAD(&fusb300->gadget.ep0->ep_list); diff --git a/drivers/usb/gadget/g_ffs.c b/drivers/usb/gadget/g_ffs.c index 2344efe4f4ce..fe12e6a27448 100644 --- a/drivers/usb/gadget/g_ffs.c +++ b/drivers/usb/gadget/g_ffs.c @@ -13,14 +13,10 @@ #define pr_fmt(fmt) "g_ffs: " fmt #include <linux/module.h> -/* - * kbuild is not very cooperative with respect to linking separately - * compiled library objects into one module. So for now we won't use - * separate compilation ... ensuring init/exit sections work to shrink - * the runtime footprint, and giving us at least some parts of what - * a "gcc --combine ... part1.c part2.c part3.c ... " build would. - */ + #if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS +#include <linux/netdevice.h> + # if defined USB_ETH_RNDIS # undef USB_ETH_RNDIS # endif @@ -28,31 +24,31 @@ # define USB_ETH_RNDIS y # endif -#define USBF_ECM_INCLUDED -# include "f_ecm.c" -#define USB_FSUBSET_INCLUDED -# include "f_subset.c" +# include "u_ecm.h" +# include "u_gether.h" # ifdef USB_ETH_RNDIS -# define USB_FRNDIS_INCLUDED -# include "f_rndis.c" +# include "u_rndis.h" # include "rndis.h" # endif # include "u_ether.h" -static u8 gfs_host_mac[ETH_ALEN]; -static struct eth_dev *the_dev; +USB_ETHERNET_MODULE_PARAMETERS(); + # ifdef CONFIG_USB_FUNCTIONFS_ETH -static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev); +static int eth_bind_config(struct usb_configuration *c); +static struct usb_function_instance *fi_ecm; +static struct usb_function *f_ecm; +static struct usb_function_instance *fi_geth; +static struct usb_function *f_geth; +# endif +# ifdef CONFIG_USB_FUNCTIONFS_RNDIS +static int bind_rndis_config(struct usb_configuration *c); +static struct usb_function_instance *fi_rndis; +static struct usb_function *f_rndis; # endif -#else -# define the_dev NULL -# define gether_cleanup(dev) do { } while (0) -# define gfs_host_mac NULL -struct eth_dev; #endif -#include "f_fs.c" +#include "u_fs.h" #define DRIVER_NAME "g_ffs" #define DRIVER_DESC "USB Function Filesystem" @@ -67,19 +63,8 @@ MODULE_LICENSE("GPL"); #define GFS_MAX_DEVS 10 -struct gfs_ffs_obj { - const char *name; - bool mounted; - bool desc_ready; - struct ffs_data *ffs_data; -}; - USB_GADGET_COMPOSITE_OPTIONS(); -#if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS -USB_ETHERNET_MODULE_PARAMETERS(); -#endif - static struct usb_device_descriptor gfs_dev_desc = { .bLength = sizeof gfs_dev_desc, .bDescriptorType = USB_DT_DEVICE, @@ -146,12 +131,12 @@ static struct usb_gadget_strings *gfs_dev_strings[] = { struct gfs_configuration { struct usb_configuration c; - int (*eth)(struct usb_configuration *c, u8 *ethaddr, - struct eth_dev *dev); + int (*eth)(struct usb_configuration *c); + int num; } gfs_configurations[] = { #ifdef CONFIG_USB_FUNCTIONFS_RNDIS { - .eth = rndis_bind_config, + .eth = bind_rndis_config, }, #endif @@ -167,10 +152,15 @@ struct gfs_configuration { #endif }; +static void *functionfs_acquire_dev(struct ffs_dev *dev); +static void functionfs_release_dev(struct ffs_dev *dev); +static int functionfs_ready_callback(struct ffs_data *ffs); +static void functionfs_closed_callback(struct ffs_data *ffs); static int gfs_bind(struct usb_composite_dev *cdev); static int gfs_unbind(struct usb_composite_dev *cdev); static int gfs_do_config(struct usb_configuration *c); + static __refdata struct usb_composite_driver gfs_driver = { .name = DRIVER_NAME, .dev = &gfs_dev_desc, @@ -180,206 +170,244 @@ static __refdata struct usb_composite_driver gfs_driver = { .unbind = gfs_unbind, }; -static DEFINE_MUTEX(gfs_lock); static unsigned int missing_funcs; -static bool gfs_ether_setup; static bool gfs_registered; static bool gfs_single_func; -static struct gfs_ffs_obj *ffs_tab; +static struct usb_function_instance **fi_ffs; +static struct usb_function **f_ffs[] = { +#ifdef CONFIG_USB_FUNCTIONFS_RNDIS + NULL, +#endif + +#ifdef CONFIG_USB_FUNCTIONFS_ETH + NULL, +#endif + +#ifdef CONFIG_USB_FUNCTIONFS_GENERIC + NULL, +#endif +}; + +#define N_CONF ARRAY_SIZE(f_ffs) static int __init gfs_init(void) { + struct f_fs_opts *opts; int i; + int ret = 0; ENTER(); - if (!func_num) { + if (func_num < 2) { gfs_single_func = true; func_num = 1; } - ffs_tab = kcalloc(func_num, sizeof *ffs_tab, GFP_KERNEL); - if (!ffs_tab) - return -ENOMEM; + /* + * Allocate in one chunk for easier maintenance + */ + f_ffs[0] = kcalloc(func_num * N_CONF, sizeof(*f_ffs), GFP_KERNEL); + if (!f_ffs[0]) { + ret = -ENOMEM; + goto no_func; + } + for (i = 1; i < N_CONF; ++i) + f_ffs[i] = f_ffs[0] + i * func_num; - if (!gfs_single_func) - for (i = 0; i < func_num; i++) - ffs_tab[i].name = func_names[i]; + fi_ffs = kcalloc(func_num, sizeof(*fi_ffs), GFP_KERNEL); + if (!fi_ffs) { + ret = -ENOMEM; + goto no_func; + } + + for (i = 0; i < func_num; i++) { + fi_ffs[i] = usb_get_function_instance("ffs"); + if (IS_ERR(fi_ffs[i])) { + ret = PTR_ERR(fi_ffs[i]); + --i; + goto no_dev; + } + opts = to_f_fs_opts(fi_ffs[i]); + if (gfs_single_func) + ret = ffs_single_dev(opts->dev); + else + ret = ffs_name_dev(opts->dev, func_names[i]); + if (ret) + goto no_dev; + opts->dev->ffs_ready_callback = functionfs_ready_callback; + opts->dev->ffs_closed_callback = functionfs_closed_callback; + opts->dev->ffs_acquire_dev_callback = functionfs_acquire_dev; + opts->dev->ffs_release_dev_callback = functionfs_release_dev; + opts->no_configfs = true; + } missing_funcs = func_num; - return functionfs_init(); + return 0; +no_dev: + while (i >= 0) + usb_put_function_instance(fi_ffs[i--]); + kfree(fi_ffs); +no_func: + kfree(f_ffs[0]); + return ret; } module_init(gfs_init); static void __exit gfs_exit(void) { + int i; + ENTER(); - mutex_lock(&gfs_lock); if (gfs_registered) usb_composite_unregister(&gfs_driver); gfs_registered = false; - functionfs_cleanup(); + kfree(f_ffs[0]); + + for (i = 0; i < func_num; i++) + usb_put_function_instance(fi_ffs[i]); - mutex_unlock(&gfs_lock); - kfree(ffs_tab); + kfree(fi_ffs); } module_exit(gfs_exit); -static struct gfs_ffs_obj *gfs_find_dev(const char *dev_name) +static void *functionfs_acquire_dev(struct ffs_dev *dev) { - int i; - - ENTER(); - - if (gfs_single_func) - return &ffs_tab[0]; - - for (i = 0; i < func_num; i++) - if (strcmp(ffs_tab[i].name, dev_name) == 0) - return &ffs_tab[i]; + if (!try_module_get(THIS_MODULE)) + return ERR_PTR(-ENODEV); + + return 0; +} - return NULL; +static void functionfs_release_dev(struct ffs_dev *dev) +{ + module_put(THIS_MODULE); } +/* + * The caller of this function takes ffs_lock + */ static int functionfs_ready_callback(struct ffs_data *ffs) { - struct gfs_ffs_obj *ffs_obj; - int ret; - - ENTER(); - mutex_lock(&gfs_lock); + int ret = 0; - ffs_obj = ffs->private_data; - if (!ffs_obj) { - ret = -EINVAL; - goto done; - } + if (--missing_funcs) + return 0; - if (WARN_ON(ffs_obj->desc_ready)) { - ret = -EBUSY; - goto done; - } - ffs_obj->desc_ready = true; - ffs_obj->ffs_data = ffs; - - if (--missing_funcs) { - ret = 0; - goto done; - } + if (gfs_registered) + return -EBUSY; - if (gfs_registered) { - ret = -EBUSY; - goto done; - } gfs_registered = true; ret = usb_composite_probe(&gfs_driver); if (unlikely(ret < 0)) gfs_registered = false; - -done: - mutex_unlock(&gfs_lock); + return ret; } +/* + * The caller of this function takes ffs_lock + */ static void functionfs_closed_callback(struct ffs_data *ffs) { - struct gfs_ffs_obj *ffs_obj; - - ENTER(); - mutex_lock(&gfs_lock); - - ffs_obj = ffs->private_data; - if (!ffs_obj) - goto done; - - ffs_obj->desc_ready = false; missing_funcs++; if (gfs_registered) usb_composite_unregister(&gfs_driver); gfs_registered = false; - -done: - mutex_unlock(&gfs_lock); } -static void *functionfs_acquire_dev_callback(const char *dev_name) +/* + * It is assumed that gfs_bind is called from a context where ffs_lock is held + */ +static int gfs_bind(struct usb_composite_dev *cdev) { - struct gfs_ffs_obj *ffs_dev; +#if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS + struct net_device *net; +#endif + int ret, i; ENTER(); - mutex_lock(&gfs_lock); - - ffs_dev = gfs_find_dev(dev_name); - if (!ffs_dev) { - ffs_dev = ERR_PTR(-ENODEV); - goto done; - } - if (ffs_dev->mounted) { - ffs_dev = ERR_PTR(-EBUSY); - goto done; + if (missing_funcs) + return -ENODEV; +#if defined CONFIG_USB_FUNCTIONFS_ETH + if (can_support_ecm(cdev->gadget)) { + struct f_ecm_opts *ecm_opts; + + fi_ecm = usb_get_function_instance("ecm"); + if (IS_ERR(fi_ecm)) + return PTR_ERR(fi_ecm); + ecm_opts = container_of(fi_ecm, struct f_ecm_opts, func_inst); + net = ecm_opts->net; + } else { + struct f_gether_opts *geth_opts; + + fi_geth = usb_get_function_instance("geth"); + if (IS_ERR(fi_geth)) + return PTR_ERR(fi_geth); + geth_opts = container_of(fi_geth, struct f_gether_opts, + func_inst); + net = geth_opts->net; } - ffs_dev->mounted = true; +#endif -done: - mutex_unlock(&gfs_lock); - return ffs_dev; -} +#ifdef CONFIG_USB_FUNCTIONFS_RNDIS + { + struct f_rndis_opts *rndis_opts; -static void functionfs_release_dev_callback(struct ffs_data *ffs_data) -{ - struct gfs_ffs_obj *ffs_dev; + fi_rndis = usb_get_function_instance("rndis"); + if (IS_ERR(fi_rndis)) { + ret = PTR_ERR(fi_rndis); + goto error; + } + rndis_opts = container_of(fi_rndis, struct f_rndis_opts, + func_inst); +#ifndef CONFIG_USB_FUNCTIONFS_ETH + net = rndis_opts->net; +#endif + } +#endif - ENTER(); - mutex_lock(&gfs_lock); +#if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS + gether_set_qmult(net, qmult); + if (!gether_set_host_addr(net, host_addr)) + pr_info("using host ethernet address: %s", host_addr); + if (!gether_set_dev_addr(net, dev_addr)) + pr_info("using self ethernet address: %s", dev_addr); +#endif - ffs_dev = ffs_data->private_data; - if (ffs_dev) - ffs_dev->mounted = false; +#if defined CONFIG_USB_FUNCTIONFS_RNDIS && defined CONFIG_USB_FUNCTIONFS_ETH + gether_set_gadget(net, cdev->gadget); + ret = gether_register_netdev(net); + if (ret) + goto error_rndis; - mutex_unlock(&gfs_lock); -} + if (can_support_ecm(cdev->gadget)) { + struct f_ecm_opts *ecm_opts; -/* - * It is assumed that gfs_bind is called from a context where gfs_lock is held - */ -static int gfs_bind(struct usb_composite_dev *cdev) -{ - int ret, i; + ecm_opts = container_of(fi_ecm, struct f_ecm_opts, func_inst); + ecm_opts->bound = true; + } else { + struct f_gether_opts *geth_opts; - ENTER(); + geth_opts = container_of(fi_geth, struct f_gether_opts, + func_inst); + geth_opts->bound = true; + } - if (missing_funcs) - return -ENODEV; -#if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS - the_dev = gether_setup(cdev->gadget, dev_addr, host_addr, gfs_host_mac, - qmult); + rndis_borrow_net(fi_rndis, net); #endif - if (IS_ERR(the_dev)) { - ret = PTR_ERR(the_dev); - goto error_quick; - } - gfs_ether_setup = true; + /* TODO: gstrings_attach? */ ret = usb_string_ids_tab(cdev, gfs_strings); if (unlikely(ret < 0)) - goto error; + goto error_rndis; gfs_dev_desc.iProduct = gfs_strings[USB_GADGET_PRODUCT_IDX].id; - for (i = func_num; i--; ) { - ret = functionfs_bind(ffs_tab[i].ffs_data, cdev); - if (unlikely(ret < 0)) { - while (++i < func_num) - functionfs_unbind(ffs_tab[i].ffs_data); - goto error; - } - } - for (i = 0; i < ARRAY_SIZE(gfs_configurations); ++i) { struct gfs_configuration *c = gfs_configurations + i; int sid = USB_GADGET_FIRST_AVAIL_IDX + i; @@ -389,6 +417,8 @@ static int gfs_bind(struct usb_composite_dev *cdev) c->c.bConfigurationValue = 1 + i; c->c.bmAttributes = USB_CONFIG_ATT_SELFPOWER; + c->num = i; + ret = usb_add_config(cdev, &c->c, gfs_do_config); if (unlikely(ret < 0)) goto error_unbind; @@ -396,18 +426,24 @@ static int gfs_bind(struct usb_composite_dev *cdev) usb_composite_overwrite_options(cdev, &coverwrite); return 0; +/* TODO */ error_unbind: - for (i = 0; i < func_num; i++) - functionfs_unbind(ffs_tab[i].ffs_data); +error_rndis: +#ifdef CONFIG_USB_FUNCTIONFS_RNDIS + usb_put_function_instance(fi_rndis); error: - gether_cleanup(the_dev); -error_quick: - gfs_ether_setup = false; +#endif +#if defined CONFIG_USB_FUNCTIONFS_ETH + if (can_support_ecm(cdev->gadget)) + usb_put_function_instance(fi_ecm); + else + usb_put_function_instance(fi_geth); +#endif return ret; } /* - * It is assumed that gfs_unbind is called from a context where gfs_lock is held + * It is assumed that gfs_unbind is called from a context where ffs_lock is held */ static int gfs_unbind(struct usb_composite_dev *cdev) { @@ -415,28 +451,30 @@ static int gfs_unbind(struct usb_composite_dev *cdev) ENTER(); - /* - * We may have been called in an error recovery from - * composite_bind() after gfs_unbind() failure so we need to - * check if gfs_ffs_data is not NULL since gfs_bind() handles - * all error recovery itself. I'd rather we werent called - * from composite on orror recovery, but what you're gonna - * do...? - */ - if (gfs_ether_setup) - gether_cleanup(the_dev); - gfs_ether_setup = false; - for (i = func_num; i--; ) - if (ffs_tab[i].ffs_data) - functionfs_unbind(ffs_tab[i].ffs_data); +#ifdef CONFIG_USB_FUNCTIONFS_RNDIS + usb_put_function(f_rndis); + usb_put_function_instance(fi_rndis); +#endif + +#if defined CONFIG_USB_FUNCTIONFS_ETH + if (can_support_ecm(cdev->gadget)) { + usb_put_function(f_ecm); + usb_put_function_instance(fi_ecm); + } else { + usb_put_function(f_geth); + usb_put_function_instance(fi_geth); + } +#endif + for (i = 0; i < N_CONF * func_num; ++i) + usb_put_function(*(f_ffs[0] + i)); return 0; } /* * It is assumed that gfs_do_config is called from a context where - * gfs_lock is held + * ffs_lock is held */ static int gfs_do_config(struct usb_configuration *c) { @@ -454,15 +492,22 @@ static int gfs_do_config(struct usb_configuration *c) } if (gc->eth) { - ret = gc->eth(c, gfs_host_mac, the_dev); + ret = gc->eth(c); if (unlikely(ret < 0)) return ret; } for (i = 0; i < func_num; i++) { - ret = functionfs_bind_config(c->cdev, c, ffs_tab[i].ffs_data); - if (unlikely(ret < 0)) - return ret; + f_ffs[gc->num][i] = usb_get_function(fi_ffs[i]); + if (IS_ERR(f_ffs[gc->num][i])) { + ret = PTR_ERR(f_ffs[gc->num][i]); + goto error; + } + ret = usb_add_function(c, f_ffs[gc->num][i]); + if (ret < 0) { + usb_put_function(f_ffs[gc->num][i]); + goto error; + } } /* @@ -479,16 +524,59 @@ static int gfs_do_config(struct usb_configuration *c) c->interface[c->next_interface_id] = NULL; return 0; +error: + while (--i >= 0) { + if (!IS_ERR(f_ffs[gc->num][i])) + usb_remove_function(c, f_ffs[gc->num][i]); + usb_put_function(f_ffs[gc->num][i]); + } + return ret; } #ifdef CONFIG_USB_FUNCTIONFS_ETH -static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev) +static int eth_bind_config(struct usb_configuration *c) +{ + int status = 0; + + if (can_support_ecm(c->cdev->gadget)) { + f_ecm = usb_get_function(fi_ecm); + if (IS_ERR(f_ecm)) + return PTR_ERR(f_ecm); + + status = usb_add_function(c, f_ecm); + if (status < 0) + usb_put_function(f_ecm); + + } else { + f_geth = usb_get_function(fi_geth); + if (IS_ERR(f_geth)) + return PTR_ERR(f_geth); + + status = usb_add_function(c, f_geth); + if (status < 0) + usb_put_function(f_geth); + } + return status; +} + +#endif + +#ifdef CONFIG_USB_FUNCTIONFS_RNDIS + +static int bind_rndis_config(struct usb_configuration *c) { - return can_support_ecm(c->cdev->gadget) - ? ecm_bind_config(c, ethaddr, dev) - : geth_bind_config(c, ethaddr, dev); + int status = 0; + + f_rndis = usb_get_function(fi_rndis); + if (IS_ERR(f_rndis)) + return PTR_ERR(f_rndis); + + status = usb_add_function(c, f_rndis); + if (status < 0) + usb_put_function(f_rndis); + + return status; } #endif diff --git a/drivers/usb/gadget/g_zero.h b/drivers/usb/gadget/g_zero.h index ef3e8515272b..15f180904f8a 100644 --- a/drivers/usb/gadget/g_zero.h +++ b/drivers/usb/gadget/g_zero.h @@ -6,6 +6,11 @@ #ifndef __G_ZERO_H #define __G_ZERO_H +#define GZERO_BULK_BUFLEN 4096 +#define GZERO_QLEN 32 +#define GZERO_ISOC_INTERVAL 4 +#define GZERO_ISOC_MAXPACKET 1024 + struct usb_zero_options { unsigned pattern; unsigned isoc_interval; @@ -24,19 +29,36 @@ struct f_ss_opts { unsigned isoc_mult; unsigned isoc_maxburst; unsigned bulk_buflen; + + /* + * Read/write access to configfs attributes is handled by configfs. + * + * This is to protect the data from concurrent access by read/write + * and create symlink/remove symlink. + */ + struct mutex lock; + int refcnt; }; struct f_lb_opts { struct usb_function_instance func_inst; unsigned bulk_buflen; unsigned qlen; + + /* + * Read/write access to configfs attributes is handled by configfs. + * + * This is to protect the data from concurrent access by read/write + * and create symlink/remove symlink. + */ + struct mutex lock; + int refcnt; }; void lb_modexit(void); int lb_modinit(void); /* common utilities */ -struct usb_request *alloc_ep_req(struct usb_ep *ep, int len); void free_ep_req(struct usb_ep *ep, struct usb_request *req); void disable_endpoints(struct usb_composite_dev *cdev, struct usb_ep *in, struct usb_ep *out, diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c index f82768015715..6c85839e15ad 100644 --- a/drivers/usb/gadget/goku_udc.c +++ b/drivers/usb/gadget/goku_udc.c @@ -30,7 +30,6 @@ #include <linux/ioport.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -231,7 +230,7 @@ static void ep_reset(struct goku_udc_regs __iomem *regs, struct goku_ep *ep) } } - ep->ep.maxpacket = MAX_FIFO_SIZE; + usb_ep_set_maxpacket_limit(&ep->ep, MAX_FIFO_SIZE); ep->ep.desc = NULL; ep->stopped = 1; ep->irqs = 0; @@ -1251,7 +1250,7 @@ static void udc_reinit (struct goku_udc *dev) } dev->ep[0].reg_mode = NULL; - dev->ep[0].ep.maxpacket = MAX_EP0_SIZE; + usb_ep_set_maxpacket_limit(&dev->ep[0].ep, MAX_EP0_SIZE); list_del_init (&dev->ep[0].ep.ep_list); } @@ -1350,16 +1349,12 @@ static int goku_udc_start(struct usb_gadget *g, return 0; } -static void -stop_activity(struct goku_udc *dev, struct usb_gadget_driver *driver) +static void stop_activity(struct goku_udc *dev) { unsigned i; DBG (dev, "%s\n", __func__); - if (dev->gadget.speed == USB_SPEED_UNKNOWN) - driver = NULL; - /* disconnect gadget driver after quiesceing hw and the driver */ udc_reset (dev); for (i = 0; i < 4; i++) @@ -1377,7 +1372,7 @@ static int goku_udc_stop(struct usb_gadget *g, spin_lock_irqsave(&dev->lock, flags); dev->driver = NULL; - stop_activity(dev, driver); + stop_activity(dev); spin_unlock_irqrestore(&dev->lock, flags); return 0; @@ -1521,7 +1516,7 @@ rescan: if (unlikely(stat & INT_DEVWIDE)) { if (stat & INT_SYSERROR) { ERROR(dev, "system error\n"); - stop_activity(dev, dev->driver); + stop_activity(dev); stat = 0; handled = 1; // FIXME have a neater way to prevent re-enumeration @@ -1536,7 +1531,7 @@ rescan: } else { DBG(dev, "disconnect\n"); if (dev->gadget.speed == USB_SPEED_FULL) - stop_activity(dev, dev->driver); + stop_activity(dev); dev->ep0state = EP0_DISCONNECT; dev->int_enable = INT_DEVWIDE; writel(dev->int_enable, &dev->regs->int_enable); diff --git a/drivers/usb/gadget/gr_udc.c b/drivers/usb/gadget/gr_udc.c new file mode 100644 index 000000000000..914cbd84ee40 --- /dev/null +++ b/drivers/usb/gadget/gr_udc.c @@ -0,0 +1,2238 @@ +/* + * USB Peripheral Controller driver for Aeroflex Gaisler GRUSBDC. + * + * 2013 (c) Aeroflex Gaisler AB + * + * This driver supports GRUSBDC USB Device Controller cores available in the + * GRLIB VHDL IP core library. + * + * Full documentation of the GRUSBDC core can be found here: + * http://www.gaisler.com/products/grlib/grip.pdf + * + * 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. + * + * Contributors: + * - Andreas Larsson <andreas@gaisler.com> + * - Marko Isomaki + */ + +/* + * A GRUSBDC core can have up to 16 IN endpoints and 16 OUT endpoints each + * individually configurable to any of the four USB transfer types. This driver + * only supports cores in DMA mode. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/spinlock.h> +#include <linux/errno.h> +#include <linux/list.h> +#include <linux/interrupt.h> +#include <linux/device.h> +#include <linux/usb/ch9.h> +#include <linux/usb/gadget.h> +#include <linux/dma-mapping.h> +#include <linux/dmapool.h> +#include <linux/debugfs.h> +#include <linux/seq_file.h> +#include <linux/of_platform.h> +#include <linux/of_irq.h> +#include <linux/of_address.h> + +#include <asm/byteorder.h> + +#include "gr_udc.h" + +#define DRIVER_NAME "gr_udc" +#define DRIVER_DESC "Aeroflex Gaisler GRUSBDC USB Peripheral Controller" + +static const char driver_name[] = DRIVER_NAME; +static const char driver_desc[] = DRIVER_DESC; + +#define gr_read32(x) (ioread32be((x))) +#define gr_write32(x, v) (iowrite32be((v), (x))) + +/* USB speed and corresponding string calculated from status register value */ +#define GR_SPEED(status) \ + ((status & GR_STATUS_SP) ? USB_SPEED_FULL : USB_SPEED_HIGH) +#define GR_SPEED_STR(status) usb_speed_string(GR_SPEED(status)) + +/* Size of hardware buffer calculated from epctrl register value */ +#define GR_BUFFER_SIZE(epctrl) \ + ((((epctrl) & GR_EPCTRL_BUFSZ_MASK) >> GR_EPCTRL_BUFSZ_POS) * \ + GR_EPCTRL_BUFSZ_SCALER) + +/* ---------------------------------------------------------------------- */ +/* Debug printout functionality */ + +static const char * const gr_modestring[] = {"control", "iso", "bulk", "int"}; + +static const char *gr_ep0state_string(enum gr_ep0state state) +{ + static const char *const names[] = { + [GR_EP0_DISCONNECT] = "disconnect", + [GR_EP0_SETUP] = "setup", + [GR_EP0_IDATA] = "idata", + [GR_EP0_ODATA] = "odata", + [GR_EP0_ISTATUS] = "istatus", + [GR_EP0_OSTATUS] = "ostatus", + [GR_EP0_STALL] = "stall", + [GR_EP0_SUSPEND] = "suspend", + }; + + if (state < 0 || state >= ARRAY_SIZE(names)) + return "UNKNOWN"; + + return names[state]; +} + +#ifdef VERBOSE_DEBUG + +static void gr_dbgprint_request(const char *str, struct gr_ep *ep, + struct gr_request *req) +{ + int buflen = ep->is_in ? req->req.length : req->req.actual; + int rowlen = 32; + int plen = min(rowlen, buflen); + + dev_dbg(ep->dev->dev, "%s: 0x%p, %d bytes data%s:\n", str, req, buflen, + (buflen > plen ? " (truncated)" : "")); + print_hex_dump_debug(" ", DUMP_PREFIX_NONE, + rowlen, 4, req->req.buf, plen, false); +} + +static void gr_dbgprint_devreq(struct gr_udc *dev, u8 type, u8 request, + u16 value, u16 index, u16 length) +{ + dev_vdbg(dev->dev, "REQ: %02x.%02x v%04x i%04x l%04x\n", + type, request, value, index, length); +} +#else /* !VERBOSE_DEBUG */ + +static void gr_dbgprint_request(const char *str, struct gr_ep *ep, + struct gr_request *req) {} + +static void gr_dbgprint_devreq(struct gr_udc *dev, u8 type, u8 request, + u16 value, u16 index, u16 length) {} + +#endif /* VERBOSE_DEBUG */ + +/* ---------------------------------------------------------------------- */ +/* Debugfs functionality */ + +#ifdef CONFIG_USB_GADGET_DEBUG_FS + +static void gr_seq_ep_show(struct seq_file *seq, struct gr_ep *ep) +{ + u32 epctrl = gr_read32(&ep->regs->epctrl); + u32 epstat = gr_read32(&ep->regs->epstat); + int mode = (epctrl & GR_EPCTRL_TT_MASK) >> GR_EPCTRL_TT_POS; + struct gr_request *req; + + seq_printf(seq, "%s:\n", ep->ep.name); + seq_printf(seq, " mode = %s\n", gr_modestring[mode]); + seq_printf(seq, " halted: %d\n", !!(epctrl & GR_EPCTRL_EH)); + seq_printf(seq, " disabled: %d\n", !!(epctrl & GR_EPCTRL_ED)); + seq_printf(seq, " valid: %d\n", !!(epctrl & GR_EPCTRL_EV)); + seq_printf(seq, " dma_start = %d\n", ep->dma_start); + seq_printf(seq, " stopped = %d\n", ep->stopped); + seq_printf(seq, " wedged = %d\n", ep->wedged); + seq_printf(seq, " callback = %d\n", ep->callback); + seq_printf(seq, " maxpacket = %d\n", ep->ep.maxpacket); + seq_printf(seq, " bytes_per_buffer = %d\n", ep->bytes_per_buffer); + if (mode == 1 || mode == 3) + seq_printf(seq, " nt = %d\n", + (epctrl & GR_EPCTRL_NT_MASK) >> GR_EPCTRL_NT_POS); + + seq_printf(seq, " Buffer 0: %s %s%d\n", + epstat & GR_EPSTAT_B0 ? "valid" : "invalid", + epstat & GR_EPSTAT_BS ? " " : "selected ", + (epstat & GR_EPSTAT_B0CNT_MASK) >> GR_EPSTAT_B0CNT_POS); + seq_printf(seq, " Buffer 1: %s %s%d\n", + epstat & GR_EPSTAT_B1 ? "valid" : "invalid", + epstat & GR_EPSTAT_BS ? "selected " : " ", + (epstat & GR_EPSTAT_B1CNT_MASK) >> GR_EPSTAT_B1CNT_POS); + + if (list_empty(&ep->queue)) { + seq_puts(seq, " Queue: empty\n\n"); + return; + } + + seq_puts(seq, " Queue:\n"); + list_for_each_entry(req, &ep->queue, queue) { + struct gr_dma_desc *desc; + struct gr_dma_desc *next; + + seq_printf(seq, " 0x%p: 0x%p %d %d\n", req, + &req->req.buf, req->req.actual, req->req.length); + + next = req->first_desc; + do { + desc = next; + next = desc->next_desc; + seq_printf(seq, " %c 0x%p (0x%08x): 0x%05x 0x%08x\n", + desc == req->curr_desc ? 'c' : ' ', + desc, desc->paddr, desc->ctrl, desc->data); + } while (desc != req->last_desc); + } + seq_puts(seq, "\n"); +} + + +static int gr_seq_show(struct seq_file *seq, void *v) +{ + struct gr_udc *dev = seq->private; + u32 control = gr_read32(&dev->regs->control); + u32 status = gr_read32(&dev->regs->status); + struct gr_ep *ep; + + seq_printf(seq, "usb state = %s\n", + usb_state_string(dev->gadget.state)); + seq_printf(seq, "address = %d\n", + (control & GR_CONTROL_UA_MASK) >> GR_CONTROL_UA_POS); + seq_printf(seq, "speed = %s\n", GR_SPEED_STR(status)); + seq_printf(seq, "ep0state = %s\n", gr_ep0state_string(dev->ep0state)); + seq_printf(seq, "irq_enabled = %d\n", dev->irq_enabled); + seq_printf(seq, "remote_wakeup = %d\n", dev->remote_wakeup); + seq_printf(seq, "test_mode = %d\n", dev->test_mode); + seq_puts(seq, "\n"); + + list_for_each_entry(ep, &dev->ep_list, ep_list) + gr_seq_ep_show(seq, ep); + + return 0; +} + +static int gr_dfs_open(struct inode *inode, struct file *file) +{ + return single_open(file, gr_seq_show, inode->i_private); +} + +static const struct file_operations gr_dfs_fops = { + .owner = THIS_MODULE, + .open = gr_dfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void gr_dfs_create(struct gr_udc *dev) +{ + const char *name = "gr_udc_state"; + + dev->dfs_root = debugfs_create_dir(dev_name(dev->dev), NULL); + if (IS_ERR(dev->dfs_root)) { + dev_err(dev->dev, "Failed to create debugfs directory\n"); + return; + } + dev->dfs_state = debugfs_create_file(name, 0444, dev->dfs_root, + dev, &gr_dfs_fops); + if (IS_ERR(dev->dfs_state)) + dev_err(dev->dev, "Failed to create debugfs file %s\n", name); +} + +static void gr_dfs_delete(struct gr_udc *dev) +{ + /* Handles NULL and ERR pointers internally */ + debugfs_remove(dev->dfs_state); + debugfs_remove(dev->dfs_root); +} + +#else /* !CONFIG_USB_GADGET_DEBUG_FS */ + +static void gr_dfs_create(struct gr_udc *dev) {} +static void gr_dfs_delete(struct gr_udc *dev) {} + +#endif /* CONFIG_USB_GADGET_DEBUG_FS */ + +/* ---------------------------------------------------------------------- */ +/* DMA and request handling */ + +/* Allocates a new struct gr_dma_desc, sets paddr and zeroes the rest */ +static struct gr_dma_desc *gr_alloc_dma_desc(struct gr_ep *ep, gfp_t gfp_flags) +{ + dma_addr_t paddr; + struct gr_dma_desc *dma_desc; + + dma_desc = dma_pool_alloc(ep->dev->desc_pool, gfp_flags, &paddr); + if (!dma_desc) { + dev_err(ep->dev->dev, "Could not allocate from DMA pool\n"); + return NULL; + } + + memset(dma_desc, 0, sizeof(*dma_desc)); + dma_desc->paddr = paddr; + + return dma_desc; +} + +static inline void gr_free_dma_desc(struct gr_udc *dev, + struct gr_dma_desc *desc) +{ + dma_pool_free(dev->desc_pool, desc, (dma_addr_t)desc->paddr); +} + +/* Frees the chain of struct gr_dma_desc for the given request */ +static void gr_free_dma_desc_chain(struct gr_udc *dev, struct gr_request *req) +{ + struct gr_dma_desc *desc; + struct gr_dma_desc *next; + + next = req->first_desc; + if (!next) + return; + + do { + desc = next; + next = desc->next_desc; + gr_free_dma_desc(dev, desc); + } while (desc != req->last_desc); + + req->first_desc = NULL; + req->curr_desc = NULL; + req->last_desc = NULL; +} + +static void gr_ep0_setup(struct gr_udc *dev, struct gr_request *req); + +/* + * Frees allocated resources and calls the appropriate completion function/setup + * package handler for a finished request. + * + * Must be called with dev->lock held and irqs disabled. + */ +static void gr_finish_request(struct gr_ep *ep, struct gr_request *req, + int status) + __releases(&dev->lock) + __acquires(&dev->lock) +{ + struct gr_udc *dev; + + list_del_init(&req->queue); + + if (likely(req->req.status == -EINPROGRESS)) + req->req.status = status; + else + status = req->req.status; + + dev = ep->dev; + usb_gadget_unmap_request(&dev->gadget, &req->req, ep->is_in); + gr_free_dma_desc_chain(dev, req); + + if (ep->is_in) /* For OUT, actual gets updated bit by bit */ + req->req.actual = req->req.length; + + if (!status) { + if (ep->is_in) + gr_dbgprint_request("SENT", ep, req); + else + gr_dbgprint_request("RECV", ep, req); + } + + /* Prevent changes to ep->queue during callback */ + ep->callback = 1; + if (req == dev->ep0reqo && !status) { + if (req->setup) + gr_ep0_setup(dev, req); + else + dev_err(dev->dev, + "Unexpected non setup packet on ep0in\n"); + } else if (req->req.complete) { + spin_unlock(&dev->lock); + + req->req.complete(&ep->ep, &req->req); + + spin_lock(&dev->lock); + } + ep->callback = 0; +} + +static struct usb_request *gr_alloc_request(struct usb_ep *_ep, gfp_t gfp_flags) +{ + struct gr_request *req; + + req = kzalloc(sizeof(*req), gfp_flags); + if (!req) + return NULL; + + INIT_LIST_HEAD(&req->queue); + + return &req->req; +} + +/* + * Starts DMA for endpoint ep if there are requests in the queue. + * + * Must be called with dev->lock held and with !ep->stopped. + */ +static void gr_start_dma(struct gr_ep *ep) +{ + struct gr_request *req; + u32 dmactrl; + + if (list_empty(&ep->queue)) { + ep->dma_start = 0; + return; + } + + req = list_first_entry(&ep->queue, struct gr_request, queue); + + /* A descriptor should already have been allocated */ + BUG_ON(!req->curr_desc); + + wmb(); /* Make sure all is settled before handing it over to DMA */ + + /* Set the descriptor pointer in the hardware */ + gr_write32(&ep->regs->dmaaddr, req->curr_desc->paddr); + + /* Announce available descriptors */ + dmactrl = gr_read32(&ep->regs->dmactrl); + gr_write32(&ep->regs->dmactrl, dmactrl | GR_DMACTRL_DA); + + ep->dma_start = 1; +} + +/* + * Finishes the first request in the ep's queue and, if available, starts the + * next request in queue. + * + * Must be called with dev->lock held, irqs disabled and with !ep->stopped. + */ +static void gr_dma_advance(struct gr_ep *ep, int status) +{ + struct gr_request *req; + + req = list_first_entry(&ep->queue, struct gr_request, queue); + gr_finish_request(ep, req, status); + gr_start_dma(ep); /* Regardless of ep->dma_start */ +} + +/* + * Abort DMA for an endpoint. Sets the abort DMA bit which causes an ongoing DMA + * transfer to be canceled and clears GR_DMACTRL_DA. + * + * Must be called with dev->lock held. + */ +static void gr_abort_dma(struct gr_ep *ep) +{ + u32 dmactrl; + + dmactrl = gr_read32(&ep->regs->dmactrl); + gr_write32(&ep->regs->dmactrl, dmactrl | GR_DMACTRL_AD); +} + +/* + * Allocates and sets up a struct gr_dma_desc and putting it on the descriptor + * chain. + * + * Size is not used for OUT endpoints. Hardware can not be instructed to handle + * smaller buffer than MAXPL in the OUT direction. + */ +static int gr_add_dma_desc(struct gr_ep *ep, struct gr_request *req, + dma_addr_t data, unsigned size, gfp_t gfp_flags) +{ + struct gr_dma_desc *desc; + + desc = gr_alloc_dma_desc(ep, gfp_flags); + if (!desc) + return -ENOMEM; + + desc->data = data; + if (ep->is_in) + desc->ctrl = + (GR_DESC_IN_CTRL_LEN_MASK & size) | GR_DESC_IN_CTRL_EN; + else + desc->ctrl = GR_DESC_OUT_CTRL_IE; + + if (!req->first_desc) { + req->first_desc = desc; + req->curr_desc = desc; + } else { + req->last_desc->next_desc = desc; + req->last_desc->next = desc->paddr; + req->last_desc->ctrl |= GR_DESC_OUT_CTRL_NX; + } + req->last_desc = desc; + + return 0; +} + +/* + * Sets up a chain of struct gr_dma_descriptors pointing to buffers that + * together covers req->req.length bytes of the buffer at DMA address + * req->req.dma for the OUT direction. + * + * The first descriptor in the chain is enabled, the rest disabled. The + * interrupt handler will later enable them one by one when needed so we can + * find out when the transfer is finished. For OUT endpoints, all descriptors + * therefore generate interrutps. + */ +static int gr_setup_out_desc_list(struct gr_ep *ep, struct gr_request *req, + gfp_t gfp_flags) +{ + u16 bytes_left; /* Bytes left to provide descriptors for */ + u16 bytes_used; /* Bytes accommodated for */ + int ret = 0; + + req->first_desc = NULL; /* Signals that no allocation is done yet */ + bytes_left = req->req.length; + bytes_used = 0; + while (bytes_left > 0) { + dma_addr_t start = req->req.dma + bytes_used; + u16 size = min(bytes_left, ep->bytes_per_buffer); + + /* Should not happen however - gr_queue stops such lengths */ + if (size < ep->bytes_per_buffer) + dev_warn(ep->dev->dev, + "Buffer overrun risk: %u < %u bytes/buffer\n", + size, ep->bytes_per_buffer); + + ret = gr_add_dma_desc(ep, req, start, size, gfp_flags); + if (ret) + goto alloc_err; + + bytes_left -= size; + bytes_used += size; + } + + req->first_desc->ctrl |= GR_DESC_OUT_CTRL_EN; + + return 0; + +alloc_err: + gr_free_dma_desc_chain(ep->dev, req); + + return ret; +} + +/* + * Sets up a chain of struct gr_dma_descriptors pointing to buffers that + * together covers req->req.length bytes of the buffer at DMA address + * req->req.dma for the IN direction. + * + * When more data is provided than the maximum payload size, the hardware splits + * this up into several payloads automatically. Moreover, ep->bytes_per_buffer + * is always set to a multiple of the maximum payload (restricted to the valid + * number of maximum payloads during high bandwidth isochronous or interrupt + * transfers) + * + * All descriptors are enabled from the beginning and we only generate an + * interrupt for the last one indicating that the entire request has been pushed + * to hardware. + */ +static int gr_setup_in_desc_list(struct gr_ep *ep, struct gr_request *req, + gfp_t gfp_flags) +{ + u16 bytes_left; /* Bytes left in req to provide descriptors for */ + u16 bytes_used; /* Bytes in req accommodated for */ + int ret = 0; + + req->first_desc = NULL; /* Signals that no allocation is done yet */ + bytes_left = req->req.length; + bytes_used = 0; + do { /* Allow for zero length packets */ + dma_addr_t start = req->req.dma + bytes_used; + u16 size = min(bytes_left, ep->bytes_per_buffer); + + ret = gr_add_dma_desc(ep, req, start, size, gfp_flags); + if (ret) + goto alloc_err; + + bytes_left -= size; + bytes_used += size; + } while (bytes_left > 0); + + /* + * Send an extra zero length packet to indicate that no more data is + * available when req->req.zero is set and the data length is even + * multiples of ep->ep.maxpacket. + */ + if (req->req.zero && (req->req.length % ep->ep.maxpacket == 0)) { + ret = gr_add_dma_desc(ep, req, 0, 0, gfp_flags); + if (ret) + goto alloc_err; + } + + /* + * For IN packets we only want to know when the last packet has been + * transmitted (not just put into internal buffers). + */ + req->last_desc->ctrl |= GR_DESC_IN_CTRL_PI; + + return 0; + +alloc_err: + gr_free_dma_desc_chain(ep->dev, req); + + return ret; +} + +/* Must be called with dev->lock held */ +static int gr_queue(struct gr_ep *ep, struct gr_request *req, gfp_t gfp_flags) +{ + struct gr_udc *dev = ep->dev; + int ret; + + if (unlikely(!ep->ep.desc && ep->num != 0)) { + dev_err(dev->dev, "No ep descriptor for %s\n", ep->ep.name); + return -EINVAL; + } + + if (unlikely(!req->req.buf || !list_empty(&req->queue))) { + dev_err(dev->dev, + "Invalid request for %s: buf=%p list_empty=%d\n", + ep->ep.name, req->req.buf, list_empty(&req->queue)); + return -EINVAL; + } + + /* + * The DMA controller can not handle smaller OUT buffers than + * maxpacket. It could lead to buffer overruns if unexpectedly long + * packet are received. + */ + if (!ep->is_in && (req->req.length % ep->ep.maxpacket) != 0) { + dev_err(dev->dev, + "OUT request length %d is not multiple of maxpacket\n", + req->req.length); + return -EMSGSIZE; + } + + if (unlikely(!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN)) { + dev_err(dev->dev, "-ESHUTDOWN"); + return -ESHUTDOWN; + } + + /* Can't touch registers when suspended */ + if (dev->ep0state == GR_EP0_SUSPEND) { + dev_err(dev->dev, "-EBUSY"); + return -EBUSY; + } + + /* Set up DMA mapping in case the caller didn't */ + ret = usb_gadget_map_request(&dev->gadget, &req->req, ep->is_in); + if (ret) { + dev_err(dev->dev, "usb_gadget_map_request"); + return ret; + } + + if (ep->is_in) + ret = gr_setup_in_desc_list(ep, req, gfp_flags); + else + ret = gr_setup_out_desc_list(ep, req, gfp_flags); + if (ret) + return ret; + + req->req.status = -EINPROGRESS; + req->req.actual = 0; + list_add_tail(&req->queue, &ep->queue); + + /* Start DMA if not started, otherwise interrupt handler handles it */ + if (!ep->dma_start && likely(!ep->stopped)) + gr_start_dma(ep); + + return 0; +} + +/* + * Queue a request from within the driver. + * + * Must be called with dev->lock held. + */ +static inline int gr_queue_int(struct gr_ep *ep, struct gr_request *req, + gfp_t gfp_flags) +{ + if (ep->is_in) + gr_dbgprint_request("RESP", ep, req); + + return gr_queue(ep, req, gfp_flags); +} + +/* ---------------------------------------------------------------------- */ +/* General helper functions */ + +/* + * Dequeue ALL requests. + * + * Must be called with dev->lock held and irqs disabled. + */ +static void gr_ep_nuke(struct gr_ep *ep) +{ + struct gr_request *req; + + ep->stopped = 1; + ep->dma_start = 0; + gr_abort_dma(ep); + + while (!list_empty(&ep->queue)) { + req = list_first_entry(&ep->queue, struct gr_request, queue); + gr_finish_request(ep, req, -ESHUTDOWN); + } +} + +/* + * Reset the hardware state of this endpoint. + * + * Must be called with dev->lock held. + */ +static void gr_ep_reset(struct gr_ep *ep) +{ + gr_write32(&ep->regs->epctrl, 0); + gr_write32(&ep->regs->dmactrl, 0); + + ep->ep.maxpacket = MAX_CTRL_PL_SIZE; + ep->ep.desc = NULL; + ep->stopped = 1; + ep->dma_start = 0; +} + +/* + * Generate STALL on ep0in/out. + * + * Must be called with dev->lock held. + */ +static void gr_control_stall(struct gr_udc *dev) +{ + u32 epctrl; + + epctrl = gr_read32(&dev->epo[0].regs->epctrl); + gr_write32(&dev->epo[0].regs->epctrl, epctrl | GR_EPCTRL_CS); + epctrl = gr_read32(&dev->epi[0].regs->epctrl); + gr_write32(&dev->epi[0].regs->epctrl, epctrl | GR_EPCTRL_CS); + + dev->ep0state = GR_EP0_STALL; +} + +/* + * Halts, halts and wedges, or clears halt for an endpoint. + * + * Must be called with dev->lock held. + */ +static int gr_ep_halt_wedge(struct gr_ep *ep, int halt, int wedge, int fromhost) +{ + u32 epctrl; + int retval = 0; + + if (ep->num && !ep->ep.desc) + return -EINVAL; + + if (ep->num && ep->ep.desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) + return -EOPNOTSUPP; + + /* Never actually halt ep0, and therefore never clear halt for ep0 */ + if (!ep->num) { + if (halt && !fromhost) { + /* ep0 halt from gadget - generate protocol stall */ + gr_control_stall(ep->dev); + dev_dbg(ep->dev->dev, "EP: stall ep0\n"); + return 0; + } + return -EINVAL; + } + + dev_dbg(ep->dev->dev, "EP: %s halt %s\n", + (halt ? (wedge ? "wedge" : "set") : "clear"), ep->ep.name); + + epctrl = gr_read32(&ep->regs->epctrl); + if (halt) { + /* Set HALT */ + gr_write32(&ep->regs->epctrl, epctrl | GR_EPCTRL_EH); + ep->stopped = 1; + if (wedge) + ep->wedged = 1; + } else { + gr_write32(&ep->regs->epctrl, epctrl & ~GR_EPCTRL_EH); + ep->stopped = 0; + ep->wedged = 0; + + /* Things might have been queued up in the meantime */ + if (!ep->dma_start) + gr_start_dma(ep); + } + + return retval; +} + +/* Must be called with dev->lock held */ +static inline void gr_set_ep0state(struct gr_udc *dev, enum gr_ep0state value) +{ + if (dev->ep0state != value) + dev_vdbg(dev->dev, "STATE: ep0state=%s\n", + gr_ep0state_string(value)); + dev->ep0state = value; +} + +/* + * Should only be called when endpoints can not generate interrupts. + * + * Must be called with dev->lock held. + */ +static void gr_disable_interrupts_and_pullup(struct gr_udc *dev) +{ + gr_write32(&dev->regs->control, 0); + wmb(); /* Make sure that we do not deny one of our interrupts */ + dev->irq_enabled = 0; +} + +/* + * Stop all device activity and disable data line pullup. + * + * Must be called with dev->lock held and irqs disabled. + */ +static void gr_stop_activity(struct gr_udc *dev) +{ + struct gr_ep *ep; + + list_for_each_entry(ep, &dev->ep_list, ep_list) + gr_ep_nuke(ep); + + gr_disable_interrupts_and_pullup(dev); + + gr_set_ep0state(dev, GR_EP0_DISCONNECT); + usb_gadget_set_state(&dev->gadget, USB_STATE_NOTATTACHED); +} + +/* ---------------------------------------------------------------------- */ +/* ep0 setup packet handling */ + +static void gr_ep0_testmode_complete(struct usb_ep *_ep, + struct usb_request *_req) +{ + struct gr_ep *ep; + struct gr_udc *dev; + u32 control; + + ep = container_of(_ep, struct gr_ep, ep); + dev = ep->dev; + + spin_lock(&dev->lock); + + control = gr_read32(&dev->regs->control); + control |= GR_CONTROL_TM | (dev->test_mode << GR_CONTROL_TS_POS); + gr_write32(&dev->regs->control, control); + + spin_unlock(&dev->lock); +} + +static void gr_ep0_dummy_complete(struct usb_ep *_ep, struct usb_request *_req) +{ + /* Nothing needs to be done here */ +} + +/* + * Queue a response on ep0in. + * + * Must be called with dev->lock held. + */ +static int gr_ep0_respond(struct gr_udc *dev, u8 *buf, int length, + void (*complete)(struct usb_ep *ep, + struct usb_request *req)) +{ + u8 *reqbuf = dev->ep0reqi->req.buf; + int status; + int i; + + for (i = 0; i < length; i++) + reqbuf[i] = buf[i]; + dev->ep0reqi->req.length = length; + dev->ep0reqi->req.complete = complete; + + status = gr_queue_int(&dev->epi[0], dev->ep0reqi, GFP_ATOMIC); + if (status < 0) + dev_err(dev->dev, + "Could not queue ep0in setup response: %d\n", status); + + return status; +} + +/* + * Queue a 2 byte response on ep0in. + * + * Must be called with dev->lock held. + */ +static inline int gr_ep0_respond_u16(struct gr_udc *dev, u16 response) +{ + __le16 le_response = cpu_to_le16(response); + + return gr_ep0_respond(dev, (u8 *)&le_response, 2, + gr_ep0_dummy_complete); +} + +/* + * Queue a ZLP response on ep0in. + * + * Must be called with dev->lock held. + */ +static inline int gr_ep0_respond_empty(struct gr_udc *dev) +{ + return gr_ep0_respond(dev, NULL, 0, gr_ep0_dummy_complete); +} + +/* + * This is run when a SET_ADDRESS request is received. First writes + * the new address to the control register which is updated internally + * when the next IN packet is ACKED. + * + * Must be called with dev->lock held. + */ +static void gr_set_address(struct gr_udc *dev, u8 address) +{ + u32 control; + + control = gr_read32(&dev->regs->control) & ~GR_CONTROL_UA_MASK; + control |= (address << GR_CONTROL_UA_POS) & GR_CONTROL_UA_MASK; + control |= GR_CONTROL_SU; + gr_write32(&dev->regs->control, control); +} + +/* + * Returns negative for STALL, 0 for successful handling and positive for + * delegation. + * + * Must be called with dev->lock held. + */ +static int gr_device_request(struct gr_udc *dev, u8 type, u8 request, + u16 value, u16 index) +{ + u16 response; + u8 test; + + switch (request) { + case USB_REQ_SET_ADDRESS: + dev_dbg(dev->dev, "STATUS: address %d\n", value & 0xff); + gr_set_address(dev, value & 0xff); + if (value) + usb_gadget_set_state(&dev->gadget, USB_STATE_ADDRESS); + else + usb_gadget_set_state(&dev->gadget, USB_STATE_DEFAULT); + return gr_ep0_respond_empty(dev); + + case USB_REQ_GET_STATUS: + /* Self powered | remote wakeup */ + response = 0x0001 | (dev->remote_wakeup ? 0x0002 : 0); + return gr_ep0_respond_u16(dev, response); + + case USB_REQ_SET_FEATURE: + switch (value) { + case USB_DEVICE_REMOTE_WAKEUP: + /* Allow remote wakeup */ + dev->remote_wakeup = 1; + return gr_ep0_respond_empty(dev); + + case USB_DEVICE_TEST_MODE: + /* The hardware does not support TEST_FORCE_EN */ + test = index >> 8; + if (test >= TEST_J && test <= TEST_PACKET) { + dev->test_mode = test; + return gr_ep0_respond(dev, NULL, 0, + gr_ep0_testmode_complete); + } + } + break; + + case USB_REQ_CLEAR_FEATURE: + switch (value) { + case USB_DEVICE_REMOTE_WAKEUP: + /* Disallow remote wakeup */ + dev->remote_wakeup = 0; + return gr_ep0_respond_empty(dev); + } + break; + } + + return 1; /* Delegate the rest */ +} + +/* + * Returns negative for STALL, 0 for successful handling and positive for + * delegation. + * + * Must be called with dev->lock held. + */ +static int gr_interface_request(struct gr_udc *dev, u8 type, u8 request, + u16 value, u16 index) +{ + if (dev->gadget.state != USB_STATE_CONFIGURED) + return -1; + + /* + * Should return STALL for invalid interfaces, but udc driver does not + * know anything about that. However, many gadget drivers do not handle + * GET_STATUS so we need to take care of that. + */ + + switch (request) { + case USB_REQ_GET_STATUS: + return gr_ep0_respond_u16(dev, 0x0000); + + case USB_REQ_SET_FEATURE: + case USB_REQ_CLEAR_FEATURE: + /* + * No possible valid standard requests. Still let gadget drivers + * have a go at it. + */ + break; + } + + return 1; /* Delegate the rest */ +} + +/* + * Returns negative for STALL, 0 for successful handling and positive for + * delegation. + * + * Must be called with dev->lock held. + */ +static int gr_endpoint_request(struct gr_udc *dev, u8 type, u8 request, + u16 value, u16 index) +{ + struct gr_ep *ep; + int status; + int halted; + u8 epnum = index & USB_ENDPOINT_NUMBER_MASK; + u8 is_in = index & USB_ENDPOINT_DIR_MASK; + + if ((is_in && epnum >= dev->nepi) || (!is_in && epnum >= dev->nepo)) + return -1; + + if (dev->gadget.state != USB_STATE_CONFIGURED && epnum != 0) + return -1; + + ep = (is_in ? &dev->epi[epnum] : &dev->epo[epnum]); + + switch (request) { + case USB_REQ_GET_STATUS: + halted = gr_read32(&ep->regs->epctrl) & GR_EPCTRL_EH; + return gr_ep0_respond_u16(dev, halted ? 0x0001 : 0); + + case USB_REQ_SET_FEATURE: + switch (value) { + case USB_ENDPOINT_HALT: + status = gr_ep_halt_wedge(ep, 1, 0, 1); + if (status >= 0) + status = gr_ep0_respond_empty(dev); + return status; + } + break; + + case USB_REQ_CLEAR_FEATURE: + switch (value) { + case USB_ENDPOINT_HALT: + if (ep->wedged) + return -1; + status = gr_ep_halt_wedge(ep, 0, 0, 1); + if (status >= 0) + status = gr_ep0_respond_empty(dev); + return status; + } + break; + } + + return 1; /* Delegate the rest */ +} + +/* Must be called with dev->lock held */ +static void gr_ep0out_requeue(struct gr_udc *dev) +{ + int ret = gr_queue_int(&dev->epo[0], dev->ep0reqo, GFP_ATOMIC); + + if (ret) + dev_err(dev->dev, "Could not queue ep0out setup request: %d\n", + ret); +} + +/* + * The main function dealing with setup requests on ep0. + * + * Must be called with dev->lock held and irqs disabled + */ +static void gr_ep0_setup(struct gr_udc *dev, struct gr_request *req) + __releases(&dev->lock) + __acquires(&dev->lock) +{ + union { + struct usb_ctrlrequest ctrl; + u8 raw[8]; + u32 word[2]; + } u; + u8 type; + u8 request; + u16 value; + u16 index; + u16 length; + int i; + int status; + + /* Restore from ep0 halt */ + if (dev->ep0state == GR_EP0_STALL) { + gr_set_ep0state(dev, GR_EP0_SETUP); + if (!req->req.actual) + goto out; + } + + if (dev->ep0state == GR_EP0_ISTATUS) { + gr_set_ep0state(dev, GR_EP0_SETUP); + if (req->req.actual > 0) + dev_dbg(dev->dev, + "Unexpected setup packet at state %s\n", + gr_ep0state_string(GR_EP0_ISTATUS)); + else + goto out; /* Got expected ZLP */ + } else if (dev->ep0state != GR_EP0_SETUP) { + dev_info(dev->dev, + "Unexpected ep0out request at state %s - stalling\n", + gr_ep0state_string(dev->ep0state)); + gr_control_stall(dev); + gr_set_ep0state(dev, GR_EP0_SETUP); + goto out; + } else if (!req->req.actual) { + dev_dbg(dev->dev, "Unexpected ZLP at state %s\n", + gr_ep0state_string(dev->ep0state)); + goto out; + } + + /* Handle SETUP packet */ + for (i = 0; i < req->req.actual; i++) + u.raw[i] = ((u8 *)req->req.buf)[i]; + + type = u.ctrl.bRequestType; + request = u.ctrl.bRequest; + value = le16_to_cpu(u.ctrl.wValue); + index = le16_to_cpu(u.ctrl.wIndex); + length = le16_to_cpu(u.ctrl.wLength); + + gr_dbgprint_devreq(dev, type, request, value, index, length); + + /* Check for data stage */ + if (length) { + if (type & USB_DIR_IN) + gr_set_ep0state(dev, GR_EP0_IDATA); + else + gr_set_ep0state(dev, GR_EP0_ODATA); + } + + status = 1; /* Positive status flags delegation */ + if ((type & USB_TYPE_MASK) == USB_TYPE_STANDARD) { + switch (type & USB_RECIP_MASK) { + case USB_RECIP_DEVICE: + status = gr_device_request(dev, type, request, + value, index); + break; + case USB_RECIP_ENDPOINT: + status = gr_endpoint_request(dev, type, request, + value, index); + break; + case USB_RECIP_INTERFACE: + status = gr_interface_request(dev, type, request, + value, index); + break; + } + } + + if (status > 0) { + spin_unlock(&dev->lock); + + dev_vdbg(dev->dev, "DELEGATE\n"); + status = dev->driver->setup(&dev->gadget, &u.ctrl); + + spin_lock(&dev->lock); + } + + /* Generate STALL on both ep0out and ep0in if requested */ + if (unlikely(status < 0)) { + dev_vdbg(dev->dev, "STALL\n"); + gr_control_stall(dev); + } + + if ((type & USB_TYPE_MASK) == USB_TYPE_STANDARD && + request == USB_REQ_SET_CONFIGURATION) { + if (!value) { + dev_dbg(dev->dev, "STATUS: deconfigured\n"); + usb_gadget_set_state(&dev->gadget, USB_STATE_ADDRESS); + } else if (status >= 0) { + /* Not configured unless gadget OK:s it */ + dev_dbg(dev->dev, "STATUS: configured: %d\n", value); + usb_gadget_set_state(&dev->gadget, + USB_STATE_CONFIGURED); + } + } + + /* Get ready for next stage */ + if (dev->ep0state == GR_EP0_ODATA) + gr_set_ep0state(dev, GR_EP0_OSTATUS); + else if (dev->ep0state == GR_EP0_IDATA) + gr_set_ep0state(dev, GR_EP0_ISTATUS); + else + gr_set_ep0state(dev, GR_EP0_SETUP); + +out: + gr_ep0out_requeue(dev); +} + +/* ---------------------------------------------------------------------- */ +/* VBUS and USB reset handling */ + +/* Must be called with dev->lock held and irqs disabled */ +static void gr_vbus_connected(struct gr_udc *dev, u32 status) +{ + u32 control; + + dev->gadget.speed = GR_SPEED(status); + usb_gadget_set_state(&dev->gadget, USB_STATE_POWERED); + + /* Turn on full interrupts and pullup */ + control = (GR_CONTROL_SI | GR_CONTROL_UI | GR_CONTROL_VI | + GR_CONTROL_SP | GR_CONTROL_EP); + gr_write32(&dev->regs->control, control); +} + +/* Must be called with dev->lock held */ +static void gr_enable_vbus_detect(struct gr_udc *dev) +{ + u32 status; + + dev->irq_enabled = 1; + wmb(); /* Make sure we do not ignore an interrupt */ + gr_write32(&dev->regs->control, GR_CONTROL_VI); + + /* Take care of the case we are already plugged in at this point */ + status = gr_read32(&dev->regs->status); + if (status & GR_STATUS_VB) + gr_vbus_connected(dev, status); +} + +/* Must be called with dev->lock held and irqs disabled */ +static void gr_vbus_disconnected(struct gr_udc *dev) +{ + gr_stop_activity(dev); + + /* Report disconnect */ + if (dev->driver && dev->driver->disconnect) { + spin_unlock(&dev->lock); + + dev->driver->disconnect(&dev->gadget); + + spin_lock(&dev->lock); + } + + gr_enable_vbus_detect(dev); +} + +/* Must be called with dev->lock held and irqs disabled */ +static void gr_udc_usbreset(struct gr_udc *dev, u32 status) +{ + gr_set_address(dev, 0); + gr_set_ep0state(dev, GR_EP0_SETUP); + usb_gadget_set_state(&dev->gadget, USB_STATE_DEFAULT); + dev->gadget.speed = GR_SPEED(status); + + gr_ep_nuke(&dev->epo[0]); + gr_ep_nuke(&dev->epi[0]); + dev->epo[0].stopped = 0; + dev->epi[0].stopped = 0; + gr_ep0out_requeue(dev); +} + +/* ---------------------------------------------------------------------- */ +/* Irq handling */ + +/* + * Handles interrupts from in endpoints. Returns whether something was handled. + * + * Must be called with dev->lock held, irqs disabled and with !ep->stopped. + */ +static int gr_handle_in_ep(struct gr_ep *ep) +{ + struct gr_request *req; + + req = list_first_entry(&ep->queue, struct gr_request, queue); + if (!req->last_desc) + return 0; + + if (ACCESS_ONCE(req->last_desc->ctrl) & GR_DESC_IN_CTRL_EN) + return 0; /* Not put in hardware buffers yet */ + + if (gr_read32(&ep->regs->epstat) & (GR_EPSTAT_B1 | GR_EPSTAT_B0)) + return 0; /* Not transmitted yet, still in hardware buffers */ + + /* Write complete */ + gr_dma_advance(ep, 0); + + return 1; +} + +/* + * Handles interrupts from out endpoints. Returns whether something was handled. + * + * Must be called with dev->lock held, irqs disabled and with !ep->stopped. + */ +static int gr_handle_out_ep(struct gr_ep *ep) +{ + u32 ep_dmactrl; + u32 ctrl; + u16 len; + struct gr_request *req; + struct gr_udc *dev = ep->dev; + + req = list_first_entry(&ep->queue, struct gr_request, queue); + if (!req->curr_desc) + return 0; + + ctrl = ACCESS_ONCE(req->curr_desc->ctrl); + if (ctrl & GR_DESC_OUT_CTRL_EN) + return 0; /* Not received yet */ + + /* Read complete */ + len = ctrl & GR_DESC_OUT_CTRL_LEN_MASK; + req->req.actual += len; + if (ctrl & GR_DESC_OUT_CTRL_SE) + req->setup = 1; + + if (len < ep->ep.maxpacket || req->req.actual == req->req.length) { + /* Short packet or the expected size - we are done */ + + if ((ep == &dev->epo[0]) && (dev->ep0state == GR_EP0_OSTATUS)) { + /* + * Send a status stage ZLP to ack the DATA stage in the + * OUT direction. This needs to be done before + * gr_dma_advance as that can lead to a call to + * ep0_setup that can change dev->ep0state. + */ + gr_ep0_respond_empty(dev); + gr_set_ep0state(dev, GR_EP0_SETUP); + } + + gr_dma_advance(ep, 0); + } else { + /* Not done yet. Enable the next descriptor to receive more. */ + req->curr_desc = req->curr_desc->next_desc; + req->curr_desc->ctrl |= GR_DESC_OUT_CTRL_EN; + + ep_dmactrl = gr_read32(&ep->regs->dmactrl); + gr_write32(&ep->regs->dmactrl, ep_dmactrl | GR_DMACTRL_DA); + } + + return 1; +} + +/* + * Handle state changes. Returns whether something was handled. + * + * Must be called with dev->lock held and irqs disabled. + */ +static int gr_handle_state_changes(struct gr_udc *dev) +{ + u32 status = gr_read32(&dev->regs->status); + int handled = 0; + int powstate = !(dev->gadget.state == USB_STATE_NOTATTACHED || + dev->gadget.state == USB_STATE_ATTACHED); + + /* VBUS valid detected */ + if (!powstate && (status & GR_STATUS_VB)) { + dev_dbg(dev->dev, "STATUS: vbus valid detected\n"); + gr_vbus_connected(dev, status); + handled = 1; + } + + /* Disconnect */ + if (powstate && !(status & GR_STATUS_VB)) { + dev_dbg(dev->dev, "STATUS: vbus invalid detected\n"); + gr_vbus_disconnected(dev); + handled = 1; + } + + /* USB reset detected */ + if (status & GR_STATUS_UR) { + dev_dbg(dev->dev, "STATUS: USB reset - speed is %s\n", + GR_SPEED_STR(status)); + gr_write32(&dev->regs->status, GR_STATUS_UR); + gr_udc_usbreset(dev, status); + handled = 1; + } + + /* Speed change */ + if (dev->gadget.speed != GR_SPEED(status)) { + dev_dbg(dev->dev, "STATUS: USB Speed change to %s\n", + GR_SPEED_STR(status)); + dev->gadget.speed = GR_SPEED(status); + handled = 1; + } + + /* Going into suspend */ + if ((dev->ep0state != GR_EP0_SUSPEND) && !(status & GR_STATUS_SU)) { + dev_dbg(dev->dev, "STATUS: USB suspend\n"); + gr_set_ep0state(dev, GR_EP0_SUSPEND); + dev->suspended_from = dev->gadget.state; + usb_gadget_set_state(&dev->gadget, USB_STATE_SUSPENDED); + + if ((dev->gadget.speed != USB_SPEED_UNKNOWN) && + dev->driver && dev->driver->suspend) { + spin_unlock(&dev->lock); + + dev->driver->suspend(&dev->gadget); + + spin_lock(&dev->lock); + } + handled = 1; + } + + /* Coming out of suspend */ + if ((dev->ep0state == GR_EP0_SUSPEND) && (status & GR_STATUS_SU)) { + dev_dbg(dev->dev, "STATUS: USB resume\n"); + if (dev->suspended_from == USB_STATE_POWERED) + gr_set_ep0state(dev, GR_EP0_DISCONNECT); + else + gr_set_ep0state(dev, GR_EP0_SETUP); + usb_gadget_set_state(&dev->gadget, dev->suspended_from); + + if ((dev->gadget.speed != USB_SPEED_UNKNOWN) && + dev->driver && dev->driver->resume) { + spin_unlock(&dev->lock); + + dev->driver->resume(&dev->gadget); + + spin_lock(&dev->lock); + } + handled = 1; + } + + return handled; +} + +/* Non-interrupt context irq handler */ +static irqreturn_t gr_irq_handler(int irq, void *_dev) +{ + struct gr_udc *dev = _dev; + struct gr_ep *ep; + int handled = 0; + int i; + unsigned long flags; + + spin_lock_irqsave(&dev->lock, flags); + + if (!dev->irq_enabled) + goto out; + + /* + * Check IN ep interrupts. We check these before the OUT eps because + * some gadgets reuse the request that might already be currently + * outstanding and needs to be completed (mainly setup requests). + */ + for (i = 0; i < dev->nepi; i++) { + ep = &dev->epi[i]; + if (!ep->stopped && !ep->callback && !list_empty(&ep->queue)) + handled = gr_handle_in_ep(ep) || handled; + } + + /* Check OUT ep interrupts */ + for (i = 0; i < dev->nepo; i++) { + ep = &dev->epo[i]; + if (!ep->stopped && !ep->callback && !list_empty(&ep->queue)) + handled = gr_handle_out_ep(ep) || handled; + } + + /* Check status interrupts */ + handled = gr_handle_state_changes(dev) || handled; + + /* + * Check AMBA DMA errors. Only check if we didn't find anything else to + * handle because this shouldn't happen if we did everything right. + */ + if (!handled) { + list_for_each_entry(ep, &dev->ep_list, ep_list) { + if (gr_read32(&ep->regs->dmactrl) & GR_DMACTRL_AE) { + dev_err(dev->dev, + "AMBA Error occurred for %s\n", + ep->ep.name); + handled = 1; + } + } + } + +out: + spin_unlock_irqrestore(&dev->lock, flags); + + return handled ? IRQ_HANDLED : IRQ_NONE; +} + +/* Interrupt context irq handler */ +static irqreturn_t gr_irq(int irq, void *_dev) +{ + struct gr_udc *dev = _dev; + + if (!dev->irq_enabled) + return IRQ_NONE; + + return IRQ_WAKE_THREAD; +} + +/* ---------------------------------------------------------------------- */ +/* USB ep ops */ + +/* Enable endpoint. Not for ep0in and ep0out that are handled separately. */ +static int gr_ep_enable(struct usb_ep *_ep, + const struct usb_endpoint_descriptor *desc) +{ + struct gr_udc *dev; + struct gr_ep *ep; + u8 mode; + u8 nt; + u16 max; + u16 buffer_size = 0; + u32 epctrl; + + ep = container_of(_ep, struct gr_ep, ep); + if (!_ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) + return -EINVAL; + + dev = ep->dev; + + /* 'ep0' IN and OUT are reserved */ + if (ep == &dev->epo[0] || ep == &dev->epi[0]) + return -EINVAL; + + if (!dev->driver || dev->gadget.speed == USB_SPEED_UNKNOWN) + return -ESHUTDOWN; + + /* Make sure we are clear for enabling */ + epctrl = gr_read32(&ep->regs->epctrl); + if (epctrl & GR_EPCTRL_EV) + return -EBUSY; + + /* Check that directions match */ + if (!ep->is_in != !usb_endpoint_dir_in(desc)) + return -EINVAL; + + /* Check ep num */ + if ((!ep->is_in && ep->num >= dev->nepo) || + (ep->is_in && ep->num >= dev->nepi)) + return -EINVAL; + + if (usb_endpoint_xfer_control(desc)) { + mode = 0; + } else if (usb_endpoint_xfer_isoc(desc)) { + mode = 1; + } else if (usb_endpoint_xfer_bulk(desc)) { + mode = 2; + } else if (usb_endpoint_xfer_int(desc)) { + mode = 3; + } else { + dev_err(dev->dev, "Unknown transfer type for %s\n", + ep->ep.name); + return -EINVAL; + } + + /* + * Bits 10-0 set the max payload. 12-11 set the number of + * additional transactions. + */ + max = 0x7ff & usb_endpoint_maxp(desc); + nt = 0x3 & (usb_endpoint_maxp(desc) >> 11); + buffer_size = GR_BUFFER_SIZE(epctrl); + if (nt && (mode == 0 || mode == 2)) { + dev_err(dev->dev, + "%s mode: multiple trans./microframe not valid\n", + (mode == 2 ? "Bulk" : "Control")); + return -EINVAL; + } else if (nt == 0x11) { + dev_err(dev->dev, "Invalid value for trans./microframe\n"); + return -EINVAL; + } else if ((nt + 1) * max > buffer_size) { + dev_err(dev->dev, "Hw buffer size %d < max payload %d * %d\n", + buffer_size, (nt + 1), max); + return -EINVAL; + } else if (max == 0) { + dev_err(dev->dev, "Max payload cannot be set to 0\n"); + return -EINVAL; + } + + spin_lock(&ep->dev->lock); + + if (!ep->stopped) { + spin_unlock(&ep->dev->lock); + return -EBUSY; + } + + ep->stopped = 0; + ep->wedged = 0; + ep->ep.desc = desc; + ep->ep.maxpacket = max; + ep->dma_start = 0; + + + if (nt) { + /* + * Maximum possible size of all payloads in one microframe + * regardless of direction when using high-bandwidth mode. + */ + ep->bytes_per_buffer = (nt + 1) * max; + } else if (ep->is_in) { + /* + * The biggest multiple of maximum packet size that fits into + * the buffer. The hardware will split up into many packets in + * the IN direction. + */ + ep->bytes_per_buffer = (buffer_size / max) * max; + } else { + /* + * Only single packets will be placed the buffers in the OUT + * direction. + */ + ep->bytes_per_buffer = max; + } + + epctrl = (max << GR_EPCTRL_MAXPL_POS) + | (nt << GR_EPCTRL_NT_POS) + | (mode << GR_EPCTRL_TT_POS) + | GR_EPCTRL_EV; + if (ep->is_in) + epctrl |= GR_EPCTRL_PI; + gr_write32(&ep->regs->epctrl, epctrl); + + gr_write32(&ep->regs->dmactrl, GR_DMACTRL_IE | GR_DMACTRL_AI); + + spin_unlock(&ep->dev->lock); + + dev_dbg(ep->dev->dev, "EP: %s enabled - %s with %d bytes/buffer\n", + ep->ep.name, gr_modestring[mode], ep->bytes_per_buffer); + return 0; +} + +/* Disable endpoint. Not for ep0in and ep0out that are handled separately. */ +static int gr_ep_disable(struct usb_ep *_ep) +{ + struct gr_ep *ep; + struct gr_udc *dev; + unsigned long flags; + + ep = container_of(_ep, struct gr_ep, ep); + if (!_ep || !ep->ep.desc) + return -ENODEV; + + dev = ep->dev; + + /* 'ep0' IN and OUT are reserved */ + if (ep == &dev->epo[0] || ep == &dev->epi[0]) + return -EINVAL; + + if (dev->ep0state == GR_EP0_SUSPEND) + return -EBUSY; + + dev_dbg(ep->dev->dev, "EP: disable %s\n", ep->ep.name); + + spin_lock_irqsave(&dev->lock, flags); + + gr_ep_nuke(ep); + gr_ep_reset(ep); + ep->ep.desc = NULL; + + spin_unlock_irqrestore(&dev->lock, flags); + + return 0; +} + +/* + * Frees a request, but not any DMA buffers associated with it + * (gr_finish_request should already have taken care of that). + */ +static void gr_free_request(struct usb_ep *_ep, struct usb_request *_req) +{ + struct gr_request *req; + + if (!_ep || !_req) + return; + req = container_of(_req, struct gr_request, req); + + /* Leads to memory leak */ + WARN(!list_empty(&req->queue), + "request not dequeued properly before freeing\n"); + + kfree(req); +} + +/* Queue a request from the gadget */ +static int gr_queue_ext(struct usb_ep *_ep, struct usb_request *_req, + gfp_t gfp_flags) +{ + struct gr_ep *ep; + struct gr_request *req; + struct gr_udc *dev; + int ret; + + if (unlikely(!_ep || !_req)) + return -EINVAL; + + ep = container_of(_ep, struct gr_ep, ep); + req = container_of(_req, struct gr_request, req); + dev = ep->dev; + + spin_lock(&ep->dev->lock); + + /* + * The ep0 pointer in the gadget struct is used both for ep0in and + * ep0out. In a data stage in the out direction ep0out needs to be used + * instead of the default ep0in. Completion functions might use + * driver_data, so that needs to be copied as well. + */ + if ((ep == &dev->epi[0]) && (dev->ep0state == GR_EP0_ODATA)) { + ep = &dev->epo[0]; + ep->ep.driver_data = dev->epi[0].ep.driver_data; + } + + if (ep->is_in) + gr_dbgprint_request("EXTERN", ep, req); + + ret = gr_queue(ep, req, gfp_flags); + + spin_unlock(&ep->dev->lock); + + return ret; +} + +/* Dequeue JUST ONE request */ +static int gr_dequeue(struct usb_ep *_ep, struct usb_request *_req) +{ + struct gr_request *req; + struct gr_ep *ep; + struct gr_udc *dev; + int ret = 0; + unsigned long flags; + + ep = container_of(_ep, struct gr_ep, ep); + if (!_ep || !_req || (!ep->ep.desc && ep->num != 0)) + return -EINVAL; + dev = ep->dev; + if (!dev->driver) + return -ESHUTDOWN; + + /* We can't touch (DMA) registers when suspended */ + if (dev->ep0state == GR_EP0_SUSPEND) + return -EBUSY; + + spin_lock_irqsave(&dev->lock, flags); + + /* Make sure it's actually queued on this endpoint */ + list_for_each_entry(req, &ep->queue, queue) { + if (&req->req == _req) + break; + } + if (&req->req != _req) { + ret = -EINVAL; + goto out; + } + + if (list_first_entry(&ep->queue, struct gr_request, queue) == req) { + /* This request is currently being processed */ + gr_abort_dma(ep); + if (ep->stopped) + gr_finish_request(ep, req, -ECONNRESET); + else + gr_dma_advance(ep, -ECONNRESET); + } else if (!list_empty(&req->queue)) { + /* Not being processed - gr_finish_request dequeues it */ + gr_finish_request(ep, req, -ECONNRESET); + } else { + ret = -EOPNOTSUPP; + } + +out: + spin_unlock_irqrestore(&dev->lock, flags); + + return ret; +} + +/* Helper for gr_set_halt and gr_set_wedge */ +static int gr_set_halt_wedge(struct usb_ep *_ep, int halt, int wedge) +{ + int ret; + struct gr_ep *ep; + + if (!_ep) + return -ENODEV; + ep = container_of(_ep, struct gr_ep, ep); + + spin_lock(&ep->dev->lock); + + /* Halting an IN endpoint should fail if queue is not empty */ + if (halt && ep->is_in && !list_empty(&ep->queue)) { + ret = -EAGAIN; + goto out; + } + + ret = gr_ep_halt_wedge(ep, halt, wedge, 0); + +out: + spin_unlock(&ep->dev->lock); + + return ret; +} + +/* Halt endpoint */ +static int gr_set_halt(struct usb_ep *_ep, int halt) +{ + return gr_set_halt_wedge(_ep, halt, 0); +} + +/* Halt and wedge endpoint */ +static int gr_set_wedge(struct usb_ep *_ep) +{ + return gr_set_halt_wedge(_ep, 1, 1); +} + +/* + * Return the total number of bytes currently stored in the internal buffers of + * the endpoint. + */ +static int gr_fifo_status(struct usb_ep *_ep) +{ + struct gr_ep *ep; + u32 epstat; + u32 bytes = 0; + + if (!_ep) + return -ENODEV; + ep = container_of(_ep, struct gr_ep, ep); + + epstat = gr_read32(&ep->regs->epstat); + + if (epstat & GR_EPSTAT_B0) + bytes += (epstat & GR_EPSTAT_B0CNT_MASK) >> GR_EPSTAT_B0CNT_POS; + if (epstat & GR_EPSTAT_B1) + bytes += (epstat & GR_EPSTAT_B1CNT_MASK) >> GR_EPSTAT_B1CNT_POS; + + return bytes; +} + + +/* Empty data from internal buffers of an endpoint. */ +static void gr_fifo_flush(struct usb_ep *_ep) +{ + struct gr_ep *ep; + u32 epctrl; + + if (!_ep) + return; + ep = container_of(_ep, struct gr_ep, ep); + dev_vdbg(ep->dev->dev, "EP: flush fifo %s\n", ep->ep.name); + + spin_lock(&ep->dev->lock); + + epctrl = gr_read32(&ep->regs->epctrl); + epctrl |= GR_EPCTRL_CB; + gr_write32(&ep->regs->epctrl, epctrl); + + spin_unlock(&ep->dev->lock); +} + +static struct usb_ep_ops gr_ep_ops = { + .enable = gr_ep_enable, + .disable = gr_ep_disable, + + .alloc_request = gr_alloc_request, + .free_request = gr_free_request, + + .queue = gr_queue_ext, + .dequeue = gr_dequeue, + + .set_halt = gr_set_halt, + .set_wedge = gr_set_wedge, + .fifo_status = gr_fifo_status, + .fifo_flush = gr_fifo_flush, +}; + +/* ---------------------------------------------------------------------- */ +/* USB Gadget ops */ + +static int gr_get_frame(struct usb_gadget *_gadget) +{ + struct gr_udc *dev; + + if (!_gadget) + return -ENODEV; + dev = container_of(_gadget, struct gr_udc, gadget); + return gr_read32(&dev->regs->status) & GR_STATUS_FN_MASK; +} + +static int gr_wakeup(struct usb_gadget *_gadget) +{ + struct gr_udc *dev; + + if (!_gadget) + return -ENODEV; + dev = container_of(_gadget, struct gr_udc, gadget); + + /* Remote wakeup feature not enabled by host*/ + if (!dev->remote_wakeup) + return -EINVAL; + + spin_lock(&dev->lock); + + gr_write32(&dev->regs->control, + gr_read32(&dev->regs->control) | GR_CONTROL_RW); + + spin_unlock(&dev->lock); + + return 0; +} + +static int gr_pullup(struct usb_gadget *_gadget, int is_on) +{ + struct gr_udc *dev; + u32 control; + + if (!_gadget) + return -ENODEV; + dev = container_of(_gadget, struct gr_udc, gadget); + + spin_lock(&dev->lock); + + control = gr_read32(&dev->regs->control); + if (is_on) + control |= GR_CONTROL_EP; + else + control &= ~GR_CONTROL_EP; + gr_write32(&dev->regs->control, control); + + spin_unlock(&dev->lock); + + return 0; +} + +static int gr_udc_start(struct usb_gadget *gadget, + struct usb_gadget_driver *driver) +{ + struct gr_udc *dev = to_gr_udc(gadget); + + spin_lock(&dev->lock); + + /* Hook up the driver */ + driver->driver.bus = NULL; + dev->driver = driver; + + /* Get ready for host detection */ + gr_enable_vbus_detect(dev); + + spin_unlock(&dev->lock); + + dev_info(dev->dev, "Started with gadget driver '%s'\n", + driver->driver.name); + + return 0; +} + +static int gr_udc_stop(struct usb_gadget *gadget, + struct usb_gadget_driver *driver) +{ + struct gr_udc *dev = to_gr_udc(gadget); + unsigned long flags; + + spin_lock_irqsave(&dev->lock, flags); + + dev->driver = NULL; + gr_stop_activity(dev); + + spin_unlock_irqrestore(&dev->lock, flags); + + dev_info(dev->dev, "Stopped\n"); + + return 0; +} + +static const struct usb_gadget_ops gr_ops = { + .get_frame = gr_get_frame, + .wakeup = gr_wakeup, + .pullup = gr_pullup, + .udc_start = gr_udc_start, + .udc_stop = gr_udc_stop, + /* Other operations not supported */ +}; + +/* ---------------------------------------------------------------------- */ +/* Module probe, removal and of-matching */ + +static const char * const onames[] = { + "ep0out", "ep1out", "ep2out", "ep3out", "ep4out", "ep5out", + "ep6out", "ep7out", "ep8out", "ep9out", "ep10out", "ep11out", + "ep12out", "ep13out", "ep14out", "ep15out" +}; + +static const char * const inames[] = { + "ep0in", "ep1in", "ep2in", "ep3in", "ep4in", "ep5in", + "ep6in", "ep7in", "ep8in", "ep9in", "ep10in", "ep11in", + "ep12in", "ep13in", "ep14in", "ep15in" +}; + +/* Must be called with dev->lock held */ +static int gr_ep_init(struct gr_udc *dev, int num, int is_in, u32 maxplimit) +{ + struct gr_ep *ep; + struct gr_request *req; + struct usb_request *_req; + void *buf; + + if (is_in) { + ep = &dev->epi[num]; + ep->ep.name = inames[num]; + ep->regs = &dev->regs->epi[num]; + } else { + ep = &dev->epo[num]; + ep->ep.name = onames[num]; + ep->regs = &dev->regs->epo[num]; + } + + gr_ep_reset(ep); + ep->num = num; + ep->is_in = is_in; + ep->dev = dev; + ep->ep.ops = &gr_ep_ops; + INIT_LIST_HEAD(&ep->queue); + + if (num == 0) { + _req = gr_alloc_request(&ep->ep, GFP_KERNEL); + buf = devm_kzalloc(dev->dev, PAGE_SIZE, GFP_DMA | GFP_KERNEL); + if (!_req || !buf) { + /* possible _req freed by gr_probe via gr_remove */ + return -ENOMEM; + } + + req = container_of(_req, struct gr_request, req); + req->req.buf = buf; + req->req.length = MAX_CTRL_PL_SIZE; + + if (is_in) + dev->ep0reqi = req; /* Complete gets set as used */ + else + dev->ep0reqo = req; /* Completion treated separately */ + + usb_ep_set_maxpacket_limit(&ep->ep, MAX_CTRL_PL_SIZE); + ep->bytes_per_buffer = MAX_CTRL_PL_SIZE; + } else { + usb_ep_set_maxpacket_limit(&ep->ep, (u16)maxplimit); + list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); + } + list_add_tail(&ep->ep_list, &dev->ep_list); + + return 0; +} + +/* Must be called with dev->lock held */ +static int gr_udc_init(struct gr_udc *dev) +{ + struct device_node *np = dev->dev->of_node; + u32 epctrl_val; + u32 dmactrl_val; + int i; + int ret = 0; + u32 *bufsizes; + u32 bufsize; + int len; + + gr_set_address(dev, 0); + + INIT_LIST_HEAD(&dev->gadget.ep_list); + dev->gadget.speed = USB_SPEED_UNKNOWN; + dev->gadget.ep0 = &dev->epi[0].ep; + + INIT_LIST_HEAD(&dev->ep_list); + gr_set_ep0state(dev, GR_EP0_DISCONNECT); + + bufsizes = (u32 *)of_get_property(np, "epobufsizes", &len); + len /= sizeof(u32); + for (i = 0; i < dev->nepo; i++) { + bufsize = (bufsizes && i < len) ? bufsizes[i] : 1024; + ret = gr_ep_init(dev, i, 0, bufsize); + if (ret) + return ret; + } + + bufsizes = (u32 *)of_get_property(np, "epibufsizes", &len); + len /= sizeof(u32); + for (i = 0; i < dev->nepi; i++) { + bufsize = (bufsizes && i < len) ? bufsizes[i] : 1024; + ret = gr_ep_init(dev, i, 1, bufsize); + if (ret) + return ret; + } + + /* Must be disabled by default */ + dev->remote_wakeup = 0; + + /* Enable ep0out and ep0in */ + epctrl_val = (MAX_CTRL_PL_SIZE << GR_EPCTRL_MAXPL_POS) | GR_EPCTRL_EV; + dmactrl_val = GR_DMACTRL_IE | GR_DMACTRL_AI; + gr_write32(&dev->epo[0].regs->epctrl, epctrl_val); + gr_write32(&dev->epi[0].regs->epctrl, epctrl_val | GR_EPCTRL_PI); + gr_write32(&dev->epo[0].regs->dmactrl, dmactrl_val); + gr_write32(&dev->epi[0].regs->dmactrl, dmactrl_val); + + return 0; +} + +static int gr_remove(struct platform_device *ofdev) +{ + struct gr_udc *dev = dev_get_drvdata(&ofdev->dev); + + if (dev->added) + usb_del_gadget_udc(&dev->gadget); /* Shuts everything down */ + if (dev->driver) + return -EBUSY; + + gr_dfs_delete(dev); + if (dev->desc_pool) + dma_pool_destroy(dev->desc_pool); + dev_set_drvdata(&ofdev->dev, NULL); + + gr_free_request(&dev->epi[0].ep, &dev->ep0reqi->req); + gr_free_request(&dev->epo[0].ep, &dev->ep0reqo->req); + + return 0; +} +static int gr_request_irq(struct gr_udc *dev, int irq) +{ + return devm_request_threaded_irq(dev->dev, irq, gr_irq, gr_irq_handler, + IRQF_SHARED, driver_name, dev); +} + +static int gr_probe(struct platform_device *ofdev) +{ + struct gr_udc *dev; + struct resource *res; + struct gr_regs __iomem *regs; + int retval; + u32 status; + + dev = devm_kzalloc(&ofdev->dev, sizeof(*dev), GFP_KERNEL); + if (!dev) + return -ENOMEM; + dev->dev = &ofdev->dev; + + res = platform_get_resource(ofdev, IORESOURCE_MEM, 0); + regs = devm_ioremap_resource(dev->dev, res); + if (IS_ERR(regs)) + return PTR_ERR(regs); + + dev->irq = irq_of_parse_and_map(dev->dev->of_node, 0); + if (!dev->irq) { + dev_err(dev->dev, "No irq found\n"); + return -ENODEV; + } + + /* Some core configurations has separate irqs for IN and OUT events */ + dev->irqi = irq_of_parse_and_map(dev->dev->of_node, 1); + if (dev->irqi) { + dev->irqo = irq_of_parse_and_map(dev->dev->of_node, 2); + if (!dev->irqo) { + dev_err(dev->dev, "Found irqi but not irqo\n"); + return -ENODEV; + } + } + + dev->gadget.name = driver_name; + dev->gadget.max_speed = USB_SPEED_HIGH; + dev->gadget.ops = &gr_ops; + dev->gadget.quirk_ep_out_aligned_size = true; + + spin_lock_init(&dev->lock); + dev->regs = regs; + + dev_set_drvdata(&ofdev->dev, dev); + + /* Determine number of endpoints and data interface mode */ + status = gr_read32(&dev->regs->status); + dev->nepi = ((status & GR_STATUS_NEPI_MASK) >> GR_STATUS_NEPI_POS) + 1; + dev->nepo = ((status & GR_STATUS_NEPO_MASK) >> GR_STATUS_NEPO_POS) + 1; + + if (!(status & GR_STATUS_DM)) { + dev_err(dev->dev, "Slave mode cores are not supported\n"); + return -ENODEV; + } + + /* --- Effects of the following calls might need explicit cleanup --- */ + + /* Create DMA pool for descriptors */ + dev->desc_pool = dma_pool_create("desc_pool", dev->dev, + sizeof(struct gr_dma_desc), 4, 0); + if (!dev->desc_pool) { + dev_err(dev->dev, "Could not allocate DMA pool"); + return -ENOMEM; + } + + spin_lock(&dev->lock); + + /* Inside lock so that no gadget can use this udc until probe is done */ + retval = usb_add_gadget_udc(dev->dev, &dev->gadget); + if (retval) { + dev_err(dev->dev, "Could not add gadget udc"); + goto out; + } + dev->added = 1; + + retval = gr_udc_init(dev); + if (retval) + goto out; + + gr_dfs_create(dev); + + /* Clear all interrupt enables that might be left on since last boot */ + gr_disable_interrupts_and_pullup(dev); + + retval = gr_request_irq(dev, dev->irq); + if (retval) { + dev_err(dev->dev, "Failed to request irq %d\n", dev->irq); + goto out; + } + + if (dev->irqi) { + retval = gr_request_irq(dev, dev->irqi); + if (retval) { + dev_err(dev->dev, "Failed to request irqi %d\n", + dev->irqi); + goto out; + } + retval = gr_request_irq(dev, dev->irqo); + if (retval) { + dev_err(dev->dev, "Failed to request irqo %d\n", + dev->irqo); + goto out; + } + } + + if (dev->irqi) + dev_info(dev->dev, "regs: %p, irqs %d, %d, %d\n", dev->regs, + dev->irq, dev->irqi, dev->irqo); + else + dev_info(dev->dev, "regs: %p, irq %d\n", dev->regs, dev->irq); + +out: + spin_unlock(&dev->lock); + + if (retval) + gr_remove(ofdev); + + return retval; +} + +static struct of_device_id gr_match[] = { + {.name = "GAISLER_USBDC"}, + {.name = "01_021"}, + {}, +}; +MODULE_DEVICE_TABLE(of, gr_match); + +static struct platform_driver gr_driver = { + .driver = { + .name = DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = gr_match, + }, + .probe = gr_probe, + .remove = gr_remove, +}; +module_platform_driver(gr_driver); + +MODULE_AUTHOR("Aeroflex Gaisler AB."); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/gadget/gr_udc.h b/drivers/usb/gadget/gr_udc.h new file mode 100644 index 000000000000..8388897d9ec3 --- /dev/null +++ b/drivers/usb/gadget/gr_udc.h @@ -0,0 +1,220 @@ +/* + * USB Peripheral Controller driver for Aeroflex Gaisler GRUSBDC. + * + * 2013 (c) Aeroflex Gaisler AB + * + * This driver supports GRUSBDC USB Device Controller cores available in the + * GRLIB VHDL IP core library. + * + * Full documentation of the GRUSBDC core can be found here: + * http://www.gaisler.com/products/grlib/grip.pdf + * + * 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. + * + * Contributors: + * - Andreas Larsson <andreas@gaisler.com> + * - Marko Isomaki + */ + +/* Control registers on the AMBA bus */ + +#define GR_MAXEP 16 /* Max # endpoints for *each* direction */ + +struct gr_epregs { + u32 epctrl; + union { + struct { /* Slave mode*/ + u32 slvctrl; + u32 slvdata; + }; + struct { /* DMA mode*/ + u32 dmactrl; + u32 dmaaddr; + }; + }; + u32 epstat; +}; + +struct gr_regs { + struct gr_epregs epo[GR_MAXEP]; /* 0x000 - 0x0fc */ + struct gr_epregs epi[GR_MAXEP]; /* 0x100 - 0x1fc */ + u32 control; /* 0x200 */ + u32 status; /* 0x204 */ +}; + +#define GR_EPCTRL_BUFSZ_SCALER 8 +#define GR_EPCTRL_BUFSZ_MASK 0xffe00000 +#define GR_EPCTRL_BUFSZ_POS 21 +#define GR_EPCTRL_PI BIT(20) +#define GR_EPCTRL_CB BIT(19) +#define GR_EPCTRL_CS BIT(18) +#define GR_EPCTRL_MAXPL_MASK 0x0003ff80 +#define GR_EPCTRL_MAXPL_POS 7 +#define GR_EPCTRL_NT_MASK 0x00000060 +#define GR_EPCTRL_NT_POS 5 +#define GR_EPCTRL_TT_MASK 0x00000018 +#define GR_EPCTRL_TT_POS 3 +#define GR_EPCTRL_EH BIT(2) +#define GR_EPCTRL_ED BIT(1) +#define GR_EPCTRL_EV BIT(0) + +#define GR_DMACTRL_AE BIT(10) +#define GR_DMACTRL_AD BIT(3) +#define GR_DMACTRL_AI BIT(2) +#define GR_DMACTRL_IE BIT(1) +#define GR_DMACTRL_DA BIT(0) + +#define GR_EPSTAT_PT BIT(29) +#define GR_EPSTAT_PR BIT(29) +#define GR_EPSTAT_B1CNT_MASK 0x1fff0000 +#define GR_EPSTAT_B1CNT_POS 16 +#define GR_EPSTAT_B0CNT_MASK 0x0000fff8 +#define GR_EPSTAT_B0CNT_POS 3 +#define GR_EPSTAT_B1 BIT(2) +#define GR_EPSTAT_B0 BIT(1) +#define GR_EPSTAT_BS BIT(0) + +#define GR_CONTROL_SI BIT(31) +#define GR_CONTROL_UI BIT(30) +#define GR_CONTROL_VI BIT(29) +#define GR_CONTROL_SP BIT(28) +#define GR_CONTROL_FI BIT(27) +#define GR_CONTROL_EP BIT(14) +#define GR_CONTROL_DH BIT(13) +#define GR_CONTROL_RW BIT(12) +#define GR_CONTROL_TS_MASK 0x00000e00 +#define GR_CONTROL_TS_POS 9 +#define GR_CONTROL_TM BIT(8) +#define GR_CONTROL_UA_MASK 0x000000fe +#define GR_CONTROL_UA_POS 1 +#define GR_CONTROL_SU BIT(0) + +#define GR_STATUS_NEPI_MASK 0xf0000000 +#define GR_STATUS_NEPI_POS 28 +#define GR_STATUS_NEPO_MASK 0x0f000000 +#define GR_STATUS_NEPO_POS 24 +#define GR_STATUS_DM BIT(23) +#define GR_STATUS_SU BIT(17) +#define GR_STATUS_UR BIT(16) +#define GR_STATUS_VB BIT(15) +#define GR_STATUS_SP BIT(14) +#define GR_STATUS_AF_MASK 0x00003800 +#define GR_STATUS_AF_POS 11 +#define GR_STATUS_FN_MASK 0x000007ff +#define GR_STATUS_FN_POS 0 + + +#define MAX_CTRL_PL_SIZE 64 /* As per USB standard for full and high speed */ + +/*-------------------------------------------------------------------------*/ + +/* Driver data structures and utilities */ + +struct gr_dma_desc { + u32 ctrl; + u32 data; + u32 next; + + /* These must be last because hw uses the previous three */ + u32 paddr; + struct gr_dma_desc *next_desc; +}; + +#define GR_DESC_OUT_CTRL_SE BIT(17) +#define GR_DESC_OUT_CTRL_IE BIT(15) +#define GR_DESC_OUT_CTRL_NX BIT(14) +#define GR_DESC_OUT_CTRL_EN BIT(13) +#define GR_DESC_OUT_CTRL_LEN_MASK 0x00001fff + +#define GR_DESC_IN_CTRL_MO BIT(18) +#define GR_DESC_IN_CTRL_PI BIT(17) +#define GR_DESC_IN_CTRL_ML BIT(16) +#define GR_DESC_IN_CTRL_IE BIT(15) +#define GR_DESC_IN_CTRL_NX BIT(14) +#define GR_DESC_IN_CTRL_EN BIT(13) +#define GR_DESC_IN_CTRL_LEN_MASK 0x00001fff + +#define GR_DESC_DMAADDR_MASK 0xfffffffc + +struct gr_ep { + struct usb_ep ep; + struct gr_udc *dev; + u16 bytes_per_buffer; + unsigned int dma_start; + struct gr_epregs __iomem *regs; + + unsigned num:8; + unsigned is_in:1; + unsigned stopped:1; + unsigned wedged:1; + unsigned callback:1; + + /* analogous to a host-side qh */ + struct list_head queue; + + struct list_head ep_list; +}; + +struct gr_request { + struct usb_request req; + struct list_head queue; + + /* Chain of dma descriptors */ + struct gr_dma_desc *first_desc; /* First in the chain */ + struct gr_dma_desc *curr_desc; /* Current descriptor */ + struct gr_dma_desc *last_desc; /* Last in the chain */ + + u8 setup; /* Setup packet */ +}; + +enum gr_ep0state { + GR_EP0_DISCONNECT = 0, /* No host */ + GR_EP0_SETUP, /* Between STATUS ack and SETUP report */ + GR_EP0_IDATA, /* IN data stage */ + GR_EP0_ODATA, /* OUT data stage */ + GR_EP0_ISTATUS, /* Status stage after IN data stage */ + GR_EP0_OSTATUS, /* Status stage after OUT data stage */ + GR_EP0_STALL, /* Data or status stages */ + GR_EP0_SUSPEND, /* USB suspend */ +}; + +struct gr_udc { + struct usb_gadget gadget; + struct gr_ep epi[GR_MAXEP]; + struct gr_ep epo[GR_MAXEP]; + struct usb_gadget_driver *driver; + struct dma_pool *desc_pool; + struct device *dev; + + enum gr_ep0state ep0state; + struct gr_request *ep0reqo; + struct gr_request *ep0reqi; + + struct gr_regs __iomem *regs; + int irq; + int irqi; + int irqo; + + unsigned added:1; + unsigned irq_enabled:1; + unsigned remote_wakeup:1; + + u8 test_mode; + + enum usb_device_state suspended_from; + + unsigned int nepi; + unsigned int nepo; + + struct list_head ep_list; + + spinlock_t lock; /* General lock, a.k.a. "dev->lock" in comments */ + + struct dentry *dfs_root; + struct dentry *dfs_state; +}; + +#define to_gr_udc(gadget) (container_of((gadget), struct gr_udc, gadget)) diff --git a/drivers/usb/gadget/lpc32xx_udc.c b/drivers/usb/gadget/lpc32xx_udc.c index 6a2a65aa0057..049ebab0d360 100644 --- a/drivers/usb/gadget/lpc32xx_udc.c +++ b/drivers/usb/gadget/lpc32xx_udc.c @@ -1449,7 +1449,7 @@ static void udc_reinit(struct lpc32xx_udc *udc) if (i != 0) list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); - ep->ep.maxpacket = ep->maxpacket; + usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket); INIT_LIST_HEAD(&ep->queue); ep->req_pending = 0; } diff --git a/drivers/usb/gadget/m66592-udc.c b/drivers/usb/gadget/m66592-udc.c index d5f050d30edf..8cae01d88597 100644 --- a/drivers/usb/gadget/m66592-udc.c +++ b/drivers/usb/gadget/m66592-udc.c @@ -1647,9 +1647,9 @@ static int __init m66592_probe(struct platform_device *pdev) INIT_LIST_HEAD(&ep->queue); ep->ep.name = m66592_ep_name[i]; ep->ep.ops = &m66592_ep_ops; - ep->ep.maxpacket = 512; + usb_ep_set_maxpacket_limit(&ep->ep, 512); } - m66592->ep[0].ep.maxpacket = 64; + usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64); m66592->ep[0].pipenum = 0; m66592->ep[0].fifoaddr = M66592_CFIFO; m66592->ep[0].fifosel = M66592_CFIFOSEL; diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c index 4fdaa54a2a2a..940f6cde8e89 100644 --- a/drivers/usb/gadget/multi.c +++ b/drivers/usb/gadget/multi.c @@ -134,7 +134,7 @@ static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS; */ #define fsg_num_buffers CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS -#endif /* CONFIG_USB_DEBUG */ +#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ FSG_MODULE_PARAMETERS(/* no prefix */, fsg_mod_data); diff --git a/drivers/usb/gadget/mv_u3d_core.c b/drivers/usb/gadget/mv_u3d_core.c index 234711eabea1..d2ca59e7b477 100644 --- a/drivers/usb/gadget/mv_u3d_core.c +++ b/drivers/usb/gadget/mv_u3d_core.c @@ -15,7 +15,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/notifier.h> @@ -1336,7 +1335,7 @@ static int mv_u3d_eps_init(struct mv_u3d *u3d) ep->ep.name = ep->name; ep->ep.ops = &mv_u3d_ep_ops; ep->wedge = 0; - ep->ep.maxpacket = MV_U3D_EP0_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&ep->ep, MV_U3D_EP0_MAX_PKT_SIZE); ep->ep_num = 0; ep->ep.desc = &mv_u3d_ep0_desc; INIT_LIST_HEAD(&ep->queue); @@ -1361,7 +1360,7 @@ static int mv_u3d_eps_init(struct mv_u3d *u3d) ep->ep.name = ep->name; ep->ep.ops = &mv_u3d_ep_ops; - ep->ep.maxpacket = (unsigned short) ~0; + usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); ep->ep_num = i / 2; INIT_LIST_HEAD(&ep->queue); diff --git a/drivers/usb/gadget/mv_udc_core.c b/drivers/usb/gadget/mv_udc_core.c index 104cdbea635a..fcff3a571b45 100644 --- a/drivers/usb/gadget/mv_udc_core.c +++ b/drivers/usb/gadget/mv_udc_core.c @@ -20,7 +20,6 @@ #include <linux/slab.h> #include <linux/errno.h> #include <linux/err.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -1261,7 +1260,7 @@ static int eps_init(struct mv_udc *udc) ep->ep.ops = &mv_ep_ops; ep->wedge = 0; ep->stopped = 0; - ep->ep.maxpacket = EP0_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&ep->ep, EP0_MAX_PKT_SIZE); ep->ep_num = 0; ep->ep.desc = &mv_ep0_desc; INIT_LIST_HEAD(&ep->queue); @@ -1284,7 +1283,7 @@ static int eps_init(struct mv_udc *udc) ep->ep.ops = &mv_ep_ops; ep->stopped = 0; - ep->ep.maxpacket = (unsigned short) ~0; + usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0); ep->ep_num = i / 2; INIT_LIST_HEAD(&ep->queue); diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index bf2bb39f35a2..ca15405583e2 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c @@ -266,7 +266,7 @@ static void net2272_ep_reset(struct net2272_ep *ep) ep->desc = NULL; INIT_LIST_HEAD(&ep->queue); - ep->ep.maxpacket = ~0; + usb_ep_set_maxpacket_limit(&ep->ep, ~0); ep->ep.ops = &net2272_ep_ops; /* disable irqs, endpoint */ @@ -1409,7 +1409,7 @@ net2272_usb_reinit(struct net2272 *dev) ep->fifo_size = 64; net2272_ep_reset(ep); } - dev->ep[0].ep.maxpacket = 64; + usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64); dev->gadget.ep0 = &dev->ep[0].ep; dev->ep[0].stopped = 0; diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index fc852177c087..43e5e2f9888f 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c @@ -293,7 +293,7 @@ static void ep_reset (struct net2280_regs __iomem *regs, struct net2280_ep *ep) ep->desc = NULL; INIT_LIST_HEAD (&ep->queue); - ep->ep.maxpacket = ~0; + usb_ep_set_maxpacket_limit(&ep->ep, ~0); ep->ep.ops = &net2280_ep_ops; /* disable the dma, irqs, endpoint... */ @@ -1805,9 +1805,9 @@ static void usb_reinit (struct net2280 *dev) ep->regs = &dev->epregs [tmp]; ep_reset (dev->regs, ep); } - dev->ep [0].ep.maxpacket = 64; - dev->ep [5].ep.maxpacket = 64; - dev->ep [6].ep.maxpacket = 64; + usb_ep_set_maxpacket_limit(&dev->ep [0].ep, 64); + usb_ep_set_maxpacket_limit(&dev->ep [5].ep, 64); + usb_ep_set_maxpacket_limit(&dev->ep [6].ep, 64); dev->gadget.ep0 = &dev->ep [0].ep; dev->ep [0].stopped = 0; diff --git a/drivers/usb/gadget/nokia.c b/drivers/usb/gadget/nokia.c index 0a8099a488c4..3ab386167519 100644 --- a/drivers/usb/gadget/nokia.c +++ b/drivers/usb/gadget/nokia.c @@ -126,9 +126,9 @@ static int __init nokia_bind_config(struct usb_configuration *c) struct usb_function *f_ecm; struct usb_function *f_obex2 = NULL; int status = 0; - int obex1_stat = 0; - int obex2_stat = 0; - int phonet_stat = 0; + int obex1_stat = -1; + int obex2_stat = -1; + int phonet_stat = -1; if (!IS_ERR(fi_phonet)) { f_phonet = usb_get_function(fi_phonet); diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 83957cc225d9..2ae4f6d69f74 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c @@ -22,7 +22,6 @@ #include <linux/errno.h> #include <linux/delay.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -2586,7 +2585,8 @@ omap_ep_setup(char *name, u8 addr, u8 type, ep->ep.name = ep->name; ep->ep.ops = &omap_ep_ops; - ep->ep.maxpacket = ep->maxpacket = maxp; + ep->maxpacket = maxp; + usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket); list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list); return buf; diff --git a/drivers/usb/gadget/pch_udc.c b/drivers/usb/gadget/pch_udc.c index 32d5e923750b..eb8c3bedb57a 100644 --- a/drivers/usb/gadget/pch_udc.c +++ b/drivers/usb/gadget/pch_udc.c @@ -2896,12 +2896,12 @@ static void pch_udc_pcd_reinit(struct pch_udc_dev *dev) ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) * UDC_EP_REG_SHIFT; /* need to set ep->ep.maxpacket and set Default Configuration?*/ - ep->ep.maxpacket = UDC_BULK_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE); list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list); INIT_LIST_HEAD(&ep->queue); } - dev->ep[UDC_EP0IN_IDX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE; - dev->ep[UDC_EP0OUT_IDX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE; + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IDX].ep, UDC_EP0IN_MAX_PKT_SIZE); + usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IDX].ep, UDC_EP0OUT_MAX_PKT_SIZE); /* remove ep0 in and out from the list. They have own pointer */ list_del_init(&dev->ep[UDC_EP0IN_IDX].ep.ep_list); @@ -3210,7 +3210,7 @@ finished: return retval; } -static DEFINE_PCI_DEVICE_TABLE(pch_udc_pcidev_id) = { +static const struct pci_device_id pch_udc_pcidev_id[] = { { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC), .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, diff --git a/drivers/usb/gadget/pxa25x_udc.c b/drivers/usb/gadget/pxa25x_udc.c index 409a3c45a36a..9984437d2952 100644 --- a/drivers/usb/gadget/pxa25x_udc.c +++ b/drivers/usb/gadget/pxa25x_udc.c @@ -24,7 +24,6 @@ #include <linux/err.h> #include <linux/delay.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -1194,6 +1193,7 @@ static void udc_reinit(struct pxa25x_udc *dev) ep->stopped = 0; INIT_LIST_HEAD (&ep->queue); ep->pio_irqs = 0; + usb_ep_set_maxpacket_limit(&ep->ep, ep->ep.maxpacket); } /* the rest was statically initialized, and is read-only */ diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index 3c97da7760da..cdf4d678be96 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c @@ -1737,9 +1737,12 @@ static void udc_init_data(struct pxa_udc *dev) } /* USB endpoints init */ - for (i = 1; i < NR_USB_ENDPOINTS; i++) + for (i = 1; i < NR_USB_ENDPOINTS; i++) { list_add_tail(&dev->udc_usb_ep[i].usb_ep.ep_list, &dev->gadget.ep_list); + usb_ep_set_maxpacket_limit(&dev->udc_usb_ep[i].usb_ep, + dev->udc_usb_ep[i].usb_ep.maxpacket); + } } /** diff --git a/drivers/usb/gadget/r8a66597-udc.c b/drivers/usb/gadget/r8a66597-udc.c index 68be48d33404..aff0a6718bc6 100644 --- a/drivers/usb/gadget/r8a66597-udc.c +++ b/drivers/usb/gadget/r8a66597-udc.c @@ -1833,7 +1833,7 @@ static int __exit r8a66597_remove(struct platform_device *pdev) r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req); if (r8a66597->pdata->on_chip) { - clk_disable(r8a66597->clk); + clk_disable_unprepare(r8a66597->clk); clk_put(r8a66597->clk); } @@ -1931,7 +1931,7 @@ static int __init r8a66597_probe(struct platform_device *pdev) ret = PTR_ERR(r8a66597->clk); goto clean_up; } - clk_enable(r8a66597->clk); + clk_prepare_enable(r8a66597->clk); } if (r8a66597->pdata->sudmac) { @@ -1964,9 +1964,9 @@ static int __init r8a66597_probe(struct platform_device *pdev) INIT_LIST_HEAD(&ep->queue); ep->ep.name = r8a66597_ep_name[i]; ep->ep.ops = &r8a66597_ep_ops; - ep->ep.maxpacket = 512; + usb_ep_set_maxpacket_limit(&ep->ep, 512); } - r8a66597->ep[0].ep.maxpacket = 64; + usb_ep_set_maxpacket_limit(&r8a66597->ep[0].ep, 64); r8a66597->ep[0].pipenum = 0; r8a66597->ep[0].fifoaddr = CFIFO; r8a66597->ep[0].fifosel = CFIFOSEL; @@ -1996,7 +1996,7 @@ clean_up3: free_irq(irq, r8a66597); clean_up2: if (r8a66597->pdata->on_chip) { - clk_disable(r8a66597->clk); + clk_disable_unprepare(r8a66597->clk); clk_put(r8a66597->clk); } clean_up: diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c index a3ad732bc812..d822d822efb3 100644 --- a/drivers/usb/gadget/rndis.c +++ b/drivers/usb/gadget/rndis.c @@ -25,7 +25,6 @@ #include <linux/moduleparam.h> #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/proc_fs.h> #include <linux/slab.h> @@ -1142,7 +1141,7 @@ static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS]; #endif /* CONFIG_USB_GADGET_DEBUG_FILES */ -static int rndis_init(void) +int rndis_init(void) { u8 i; @@ -1174,9 +1173,8 @@ static int rndis_init(void) return 0; } -module_init(rndis_init); -static void rndis_exit(void) +void rndis_exit(void) { #ifdef CONFIG_USB_GADGET_DEBUG_FILES u8 i; @@ -1188,6 +1186,4 @@ static void rndis_exit(void) } #endif } -module_exit(rndis_exit); -MODULE_LICENSE("GPL"); diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index e20bc109fdd7..1172eaeddd85 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c @@ -30,14 +30,13 @@ #include <linux/clk.h> #include <linux/regulator/consumer.h> #include <linux/of_platform.h> +#include <linux/phy/phy.h> #include <linux/usb/ch9.h> #include <linux/usb/gadget.h> #include <linux/usb/phy.h> #include <linux/platform_data/s3c-hsotg.h> -#include <mach/map.h> - #include "s3c-hsotg.h" static const char * const s3c_hsotg_supply_names[] = { @@ -140,11 +139,13 @@ struct s3c_hsotg_ep { * @dev: The parent device supplied to the probe function * @driver: USB gadget driver * @phy: The otg phy transceiver structure for phy control. + * @uphy: The otg phy transceiver structure for old USB phy control. * @plat: The platform specific configuration data. This can be removed once * all SoCs support usb transceiver. * @regs: The memory area mapped for accessing registers. * @irq: The IRQ number we are using * @supplies: Definition of USB power supplies + * @phyif: PHY interface width * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos. * @num_of_eps: Number of available EPs (excluding EP0) * @debug_root: root directrory for debugfs. @@ -161,7 +162,8 @@ struct s3c_hsotg_ep { struct s3c_hsotg { struct device *dev; struct usb_gadget_driver *driver; - struct usb_phy *phy; + struct phy *phy; + struct usb_phy *uphy; struct s3c_hsotg_plat *plat; spinlock_t lock; @@ -172,6 +174,7 @@ struct s3c_hsotg { struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)]; + u32 phyif; unsigned int dedicated_fifos:1; unsigned char num_of_eps; @@ -2086,13 +2089,13 @@ static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg) case DSTS_EnumSpd_FS48: hsotg->gadget.speed = USB_SPEED_FULL; ep0_mps = EP0_MPS_LIMIT; - ep_mps = 64; + ep_mps = 1023; break; case DSTS_EnumSpd_HS: hsotg->gadget.speed = USB_SPEED_HIGH; ep0_mps = EP0_MPS_LIMIT; - ep_mps = 512; + ep_mps = 1024; break; case DSTS_EnumSpd_LS: @@ -2156,6 +2159,9 @@ static void kill_all_requests(struct s3c_hsotg *hsotg, s3c_hsotg_complete_request(hsotg, ep, req, result); } + if(hsotg->dedicated_fifos) + if ((readl(hsotg->regs + DTXFSTS(ep->index)) & 0xffff) * 4 < 3072) + s3c_hsotg_txfifo_flush(hsotg, ep->index); } #define call_gadget(_hs, _entry) \ @@ -2283,7 +2289,7 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg) */ /* set the PLL on, remove the HNP/SRP and set the PHY */ - writel(GUSBCFG_PHYIf16 | GUSBCFG_TOutCal(7) | + writel(hsotg->phyif | GUSBCFG_TOutCal(7) | (0x5 << 10), hsotg->regs + GUSBCFG); s3c_hsotg_init_fifo(hsotg); @@ -2908,8 +2914,11 @@ static void s3c_hsotg_phy_enable(struct s3c_hsotg *hsotg) dev_dbg(hsotg->dev, "pdev 0x%p\n", pdev); - if (hsotg->phy) - usb_phy_init(hsotg->phy); + if (hsotg->phy) { + phy_init(hsotg->phy); + phy_power_on(hsotg->phy); + } else if (hsotg->uphy) + usb_phy_init(hsotg->uphy); else if (hsotg->plat->phy_init) hsotg->plat->phy_init(pdev, hsotg->plat->phy_type); } @@ -2925,8 +2934,11 @@ static void s3c_hsotg_phy_disable(struct s3c_hsotg *hsotg) { struct platform_device *pdev = to_platform_device(hsotg->dev); - if (hsotg->phy) - usb_phy_shutdown(hsotg->phy); + if (hsotg->phy) { + phy_power_off(hsotg->phy); + phy_exit(hsotg->phy); + } else if (hsotg->uphy) + usb_phy_shutdown(hsotg->uphy); else if (hsotg->plat->phy_exit) hsotg->plat->phy_exit(pdev, hsotg->plat->phy_type); } @@ -3152,7 +3164,7 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg, hs_ep->parent = hsotg; hs_ep->ep.name = hs_ep->name; - hs_ep->ep.maxpacket = epnum ? 1024 : EP0_MPS_LIMIT; + usb_ep_set_maxpacket_limit(&hs_ep->ep, epnum ? 1024 : EP0_MPS_LIMIT); hs_ep->ep.ops = &s3c_hsotg_ep_ops; /* @@ -3533,7 +3545,8 @@ static void s3c_hsotg_delete_debug(struct s3c_hsotg *hsotg) static int s3c_hsotg_probe(struct platform_device *pdev) { struct s3c_hsotg_plat *plat = dev_get_platdata(&pdev->dev); - struct usb_phy *phy; + struct phy *phy; + struct usb_phy *uphy; struct device *dev = &pdev->dev; struct s3c_hsotg_ep *eps; struct s3c_hsotg *hsotg; @@ -3548,19 +3561,26 @@ static int s3c_hsotg_probe(struct platform_device *pdev) return -ENOMEM; } - phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); + /* + * Attempt to find a generic PHY, then look for an old style + * USB PHY, finally fall back to pdata + */ + phy = devm_phy_get(&pdev->dev, "usb2-phy"); if (IS_ERR(phy)) { - /* Fallback for pdata */ - plat = dev_get_platdata(&pdev->dev); - if (!plat) { - dev_err(&pdev->dev, "no platform data or transceiver defined\n"); - return -EPROBE_DEFER; - } else { + uphy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2); + if (IS_ERR(uphy)) { + /* Fallback for pdata */ + plat = dev_get_platdata(&pdev->dev); + if (!plat) { + dev_err(&pdev->dev, + "no platform data or transceiver defined\n"); + return -EPROBE_DEFER; + } hsotg->plat = plat; - } - } else { + } else + hsotg->uphy = uphy; + } else hsotg->phy = phy; - } hsotg->dev = dev; @@ -3627,6 +3647,19 @@ static int s3c_hsotg_probe(struct platform_device *pdev) goto err_supplies; } + /* Set default UTMI width */ + hsotg->phyif = GUSBCFG_PHYIf16; + + /* + * If using the generic PHY framework, check if the PHY bus + * width is 8-bit and set the phyif appropriately. + */ + if (hsotg->phy && (phy_get_bus_width(phy) == 8)) + hsotg->phyif = GUSBCFG_PHYIf8; + + if (hsotg->phy) + phy_init(hsotg->phy); + /* usb phy enable */ s3c_hsotg_phy_enable(hsotg); @@ -3720,6 +3753,8 @@ static int s3c_hsotg_remove(struct platform_device *pdev) } s3c_hsotg_phy_disable(hsotg); + if (hsotg->phy) + phy_exit(hsotg->phy); clk_disable_unprepare(hsotg->clk); return 0; @@ -3733,6 +3768,7 @@ static int s3c_hsotg_remove(struct platform_device *pdev) #ifdef CONFIG_OF static const struct of_device_id s3c_hsotg_of_ids[] = { { .compatible = "samsung,s3c6400-hsotg", }, + { .compatible = "snps,dwc2", }, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, s3c_hsotg_of_ids); diff --git a/drivers/usb/gadget/s3c-hsotg.h b/drivers/usb/gadget/s3c-hsotg.h index d650b1295831..85f549ff8c1f 100644 --- a/drivers/usb/gadget/s3c-hsotg.h +++ b/drivers/usb/gadget/s3c-hsotg.h @@ -55,6 +55,7 @@ #define GUSBCFG_HNPCap (1 << 9) #define GUSBCFG_SRPCap (1 << 8) #define GUSBCFG_PHYIf16 (1 << 3) +#define GUSBCFG_PHYIf8 (0 << 3) #define GUSBCFG_TOutCal_MASK (0x7 << 0) #define GUSBCFG_TOutCal_SHIFT (0) #define GUSBCFG_TOutCal_LIMIT (0x7) diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c index 1a1a41498db2..ea4bbfe72ec0 100644 --- a/drivers/usb/gadget/s3c-hsudc.c +++ b/drivers/usb/gadget/s3c-hsudc.c @@ -999,7 +999,7 @@ static void s3c_hsudc_initep(struct s3c_hsudc *hsudc, hsep->dev = hsudc; hsep->ep.name = hsep->name; - hsep->ep.maxpacket = epnum ? 512 : 64; + usb_ep_set_maxpacket_limit(&hsep->ep, epnum ? 512 : 64); hsep->ep.ops = &s3c_hsudc_ep_ops; hsep->fifo = hsudc->regs + S3C_BR(epnum); hsep->ep.desc = NULL; diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index c72d810e6b36..f04b2c3154de 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c @@ -1629,6 +1629,7 @@ static void s3c2410_udc_reinit(struct s3c2410_udc *dev) ep->ep.desc = NULL; ep->halted = 0; INIT_LIST_HEAD(&ep->queue); + usb_ep_set_maxpacket_limit(&ep->ep, &ep->ep.maxpacket); } } diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c index 2aae0d61bb19..b7d4f82872b7 100644 --- a/drivers/usb/gadget/u_ether.c +++ b/drivers/usb/gadget/u_ether.c @@ -753,7 +753,7 @@ static struct device_type gadget_type = { * gadget driver using this framework. The link layer addresses are * set up using module parameters. * - * Returns negative errno, or zero on success + * Returns an eth_dev pointer on success, or an ERR_PTR on failure. */ struct eth_dev *gether_setup_name(struct usb_gadget *g, const char *dev_addr, const char *host_addr, diff --git a/drivers/usb/gadget/u_ether.h b/drivers/usb/gadget/u_ether.h index fb23d1fde8eb..0f0290acea7e 100644 --- a/drivers/usb/gadget/u_ether.h +++ b/drivers/usb/gadget/u_ether.h @@ -106,7 +106,7 @@ struct eth_dev *gether_setup_name(struct usb_gadget *g, * gadget driver using this framework. The link layer addresses are * set up using module parameters. * - * Returns negative errno, or zero on success + * Returns a eth_dev pointer on success, or an ERR_PTR on failure */ static inline struct eth_dev *gether_setup(struct usb_gadget *g, const char *dev_addr, const char *host_addr, @@ -267,45 +267,4 @@ static inline bool can_support_ecm(struct usb_gadget *gadget) return true; } -/* each configuration may bind one instance of an ethernet link */ -int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev); -int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - struct eth_dev *dev); - -#ifdef USB_ETH_RNDIS - -int rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - u32 vendorID, const char *manufacturer, struct eth_dev *dev); - -#else - -static inline int -rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], - u32 vendorID, const char *manufacturer, struct eth_dev *dev) -{ - return 0; -} - -#endif - -/** - * rndis_bind_config - add RNDIS network link to a configuration - * @c: the configuration to support the network link - * @ethaddr: a buffer in which the ethernet address of the host side - * side of the link was recorded - * Context: single threaded during gadget setup - * - * Returns zero on success, else negative errno. - * - * Caller must have called @gether_setup(). Caller is also responsible - * for calling @gether_cleanup() before module unload. - */ -static inline int rndis_bind_config(struct usb_configuration *c, - u8 ethaddr[ETH_ALEN], struct eth_dev *dev) -{ - return rndis_bind_config_vendor(c, ethaddr, 0, NULL, dev); -} - - #endif /* __U_ETHER_H */ diff --git a/drivers/usb/gadget/u_f.c b/drivers/usb/gadget/u_f.c new file mode 100644 index 000000000000..63b6642c162b --- /dev/null +++ b/drivers/usb/gadget/u_f.c @@ -0,0 +1,32 @@ +/* + * u_f.c -- USB function utilities for Gadget stack + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/usb/gadget.h> +#include "u_f.h" + +struct usb_request *alloc_ep_req(struct usb_ep *ep, int len, int default_len) +{ + struct usb_request *req; + + req = usb_ep_alloc_request(ep, GFP_ATOMIC); + if (req) { + req->length = len ?: default_len; + req->buf = kmalloc(req->length, GFP_ATOMIC); + if (!req->buf) { + usb_ep_free_request(ep, req); + req = NULL; + } + } + return req; +} +EXPORT_SYMBOL(alloc_ep_req); diff --git a/drivers/usb/gadget/u_f.h b/drivers/usb/gadget/u_f.h new file mode 100644 index 000000000000..71034c061fca --- /dev/null +++ b/drivers/usb/gadget/u_f.h @@ -0,0 +1,26 @@ +/* + * u_f.h + * + * Utility definitions for USB functions + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __U_F_H__ +#define __U_F_H__ + +struct usb_ep; +struct usb_request; + +struct usb_request *alloc_ep_req(struct usb_ep *ep, int len, int default_len); + +#endif /* __U_F_H__ */ + + diff --git a/drivers/usb/gadget/u_fs.h b/drivers/usb/gadget/u_fs.h new file mode 100644 index 000000000000..bc2d3718219b --- /dev/null +++ b/drivers/usb/gadget/u_fs.h @@ -0,0 +1,267 @@ +/* + * u_fs.h + * + * Utility definitions for the FunctionFS + * + * Copyright (c) 2013 Samsung Electronics Co., Ltd. + * http://www.samsung.com + * + * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef U_FFS_H +#define U_FFS_H + +#include <linux/usb/composite.h> +#include <linux/list.h> +#include <linux/mutex.h> + +#ifdef VERBOSE_DEBUG +#ifndef pr_vdebug +# define pr_vdebug pr_debug +#endif /* pr_vdebug */ +# define ffs_dump_mem(prefix, ptr, len) \ + print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len) +#else +#ifndef pr_vdebug +# define pr_vdebug(...) do { } while (0) +#endif /* pr_vdebug */ +# define ffs_dump_mem(prefix, ptr, len) do { } while (0) +#endif /* VERBOSE_DEBUG */ + +#define ENTER() pr_vdebug("%s()\n", __func__) + +struct f_fs_opts; + +struct ffs_dev { + const char *name; + bool name_allocated; + bool mounted; + bool desc_ready; + bool single; + struct ffs_data *ffs_data; + struct f_fs_opts *opts; + struct list_head entry; + + int (*ffs_ready_callback)(struct ffs_data *ffs); + void (*ffs_closed_callback)(struct ffs_data *ffs); + void *(*ffs_acquire_dev_callback)(struct ffs_dev *dev); + void (*ffs_release_dev_callback)(struct ffs_dev *dev); +}; + +extern struct mutex ffs_lock; + +static inline void ffs_dev_lock(void) +{ + mutex_lock(&ffs_lock); +} + +static inline void ffs_dev_unlock(void) +{ + mutex_unlock(&ffs_lock); +} + +struct ffs_dev *ffs_alloc_dev(void); +int ffs_name_dev(struct ffs_dev *dev, const char *name); +int ffs_single_dev(struct ffs_dev *dev); +void ffs_free_dev(struct ffs_dev *dev); + +struct ffs_epfile; +struct ffs_function; + +enum ffs_state { + /* + * Waiting for descriptors and strings. + * + * In this state no open(2), read(2) or write(2) on epfiles + * may succeed (which should not be the problem as there + * should be no such files opened in the first place). + */ + FFS_READ_DESCRIPTORS, + FFS_READ_STRINGS, + + /* + * We've got descriptors and strings. We are or have called + * functionfs_ready_callback(). functionfs_bind() may have + * been called but we don't know. + * + * This is the only state in which operations on epfiles may + * succeed. + */ + FFS_ACTIVE, + + /* + * All endpoints have been closed. This state is also set if + * we encounter an unrecoverable error. The only + * unrecoverable error is situation when after reading strings + * from user space we fail to initialise epfiles or + * functionfs_ready_callback() returns with error (<0). + * + * In this state no open(2), read(2) or write(2) (both on ep0 + * as well as epfile) may succeed (at this point epfiles are + * unlinked and all closed so this is not a problem; ep0 is + * also closed but ep0 file exists and so open(2) on ep0 must + * fail). + */ + FFS_CLOSING +}; + +enum ffs_setup_state { + /* There is no setup request pending. */ + FFS_NO_SETUP, + /* + * User has read events and there was a setup request event + * there. The next read/write on ep0 will handle the + * request. + */ + FFS_SETUP_PENDING, + /* + * There was event pending but before user space handled it + * some other event was introduced which canceled existing + * setup. If this state is set read/write on ep0 return + * -EIDRM. This state is only set when adding event. + */ + FFS_SETUP_CANCELED +}; + +struct ffs_data { + struct usb_gadget *gadget; + + /* + * Protect access read/write operations, only one read/write + * at a time. As a consequence protects ep0req and company. + * While setup request is being processed (queued) this is + * held. + */ + struct mutex mutex; + + /* + * Protect access to endpoint related structures (basically + * usb_ep_queue(), usb_ep_dequeue(), etc. calls) except for + * endpoint zero. + */ + spinlock_t eps_lock; + + /* + * XXX REVISIT do we need our own request? Since we are not + * handling setup requests immediately user space may be so + * slow that another setup will be sent to the gadget but this + * time not to us but another function and then there could be + * a race. Is that the case? Or maybe we can use cdev->req + * after all, maybe we just need some spinlock for that? + */ + struct usb_request *ep0req; /* P: mutex */ + struct completion ep0req_completion; /* P: mutex */ + int ep0req_status; /* P: mutex */ + + /* reference counter */ + atomic_t ref; + /* how many files are opened (EP0 and others) */ + atomic_t opened; + + /* EP0 state */ + enum ffs_state state; + + /* + * Possible transitions: + * + FFS_NO_SETUP -> FFS_SETUP_PENDING -- P: ev.waitq.lock + * happens only in ep0 read which is P: mutex + * + FFS_SETUP_PENDING -> FFS_NO_SETUP -- P: ev.waitq.lock + * happens only in ep0 i/o which is P: mutex + * + FFS_SETUP_PENDING -> FFS_SETUP_CANCELED -- P: ev.waitq.lock + * + FFS_SETUP_CANCELED -> FFS_NO_SETUP -- cmpxchg + */ + enum ffs_setup_state setup_state; + +#define FFS_SETUP_STATE(ffs) \ + ((enum ffs_setup_state)cmpxchg(&(ffs)->setup_state, \ + FFS_SETUP_CANCELED, FFS_NO_SETUP)) + + /* Events & such. */ + struct { + u8 types[4]; + unsigned short count; + /* XXX REVISIT need to update it in some places, or do we? */ + unsigned short can_stall; + struct usb_ctrlrequest setup; + + wait_queue_head_t waitq; + } ev; /* the whole structure, P: ev.waitq.lock */ + + /* Flags */ + unsigned long flags; +#define FFS_FL_CALL_CLOSED_CALLBACK 0 +#define FFS_FL_BOUND 1 + + /* Active function */ + struct ffs_function *func; + + /* + * Device name, write once when file system is mounted. + * Intended for user to read if she wants. + */ + const char *dev_name; + /* Private data for our user (ie. gadget). Managed by user. */ + void *private_data; + + /* filled by __ffs_data_got_descs() */ + /* + * Real descriptors are 16 bytes after raw_descs (so you need + * to skip 16 bytes (ie. ffs->raw_descs + 16) to get to the + * first full speed descriptor). raw_descs_length and + * raw_fs_descs_length do not have those 16 bytes added. + */ + const void *raw_descs; + unsigned raw_descs_length; + unsigned raw_fs_descs_length; + unsigned fs_descs_count; + unsigned hs_descs_count; + + unsigned short strings_count; + unsigned short interfaces_count; + unsigned short eps_count; + unsigned short _pad1; + + /* filled by __ffs_data_got_strings() */ + /* ids in stringtabs are set in functionfs_bind() */ + const void *raw_strings; + struct usb_gadget_strings **stringtabs; + + /* + * File system's super block, write once when file system is + * mounted. + */ + struct super_block *sb; + + /* File permissions, written once when fs is mounted */ + struct ffs_file_perms { + umode_t mode; + kuid_t uid; + kgid_t gid; + } file_perms; + + /* + * The endpoint files, filled by ffs_epfiles_create(), + * destroyed by ffs_epfiles_destroy(). + */ + struct ffs_epfile *epfiles; +}; + + +struct f_fs_opts { + struct usb_function_instance func_inst; + struct ffs_dev *dev; + unsigned refcnt; + bool no_configfs; +}; + +static inline struct f_fs_opts *to_f_fs_opts(struct usb_function_instance *fi) +{ + return container_of(fi, struct f_fs_opts, func_inst); +} + +#endif /* U_FFS_H */ diff --git a/drivers/usb/gadget/u_rndis.h b/drivers/usb/gadget/u_rndis.h index c62ba82e9600..7291b15c9dce 100644 --- a/drivers/usb/gadget/u_rndis.h +++ b/drivers/usb/gadget/u_rndis.h @@ -36,6 +36,8 @@ struct f_rndis_opts { int refcnt; }; +int rndis_init(void); +void rndis_exit(void); void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net); #endif /* U_RNDIS_H */ diff --git a/drivers/usb/gadget/usbstring.c b/drivers/usb/gadget/usbstring.c index 1f49fce0f0b7..73a4dfba0edb 100644 --- a/drivers/usb/gadget/usbstring.c +++ b/drivers/usb/gadget/usbstring.c @@ -13,7 +13,6 @@ #include <linux/list.h> #include <linux/string.h> #include <linux/device.h> -#include <linux/init.h> #include <linux/nls.h> #include <linux/usb/ch9.h> diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index f49b0b61ecc8..9f170c53e3d9 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c @@ -64,10 +64,10 @@ static bool loopdefault = 0; module_param(loopdefault, bool, S_IRUGO|S_IWUSR); static struct usb_zero_options gzero_options = { - .isoc_interval = 4, - .isoc_maxpacket = 1024, - .bulk_buflen = 4096, - .qlen = 32, + .isoc_interval = GZERO_ISOC_INTERVAL, + .isoc_maxpacket = GZERO_ISOC_MAXPACKET, + .bulk_buflen = GZERO_BULK_BUFLEN, + .qlen = GZERO_QLEN, }; /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index 01e879ef3654..7530468c9a4f 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile @@ -2,8 +2,6 @@ # Makefile for USB Host Controller Drivers # -ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG - # tell define_trace.h where to find the xhci trace header CFLAGS_xhci-trace.o := -I$(src) diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c index 284f8417eae5..ec9f7b75d497 100644 --- a/drivers/usb/host/ehci-atmel.c +++ b/drivers/usb/host/ehci-atmel.c @@ -153,6 +153,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev) retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval) goto fail_add_hcd; + device_wakeup_enable(hcd->self.controller); return retval; diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 4a9c2edbcb2b..524cbf26d992 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c @@ -18,7 +18,7 @@ /* this file is part of ehci-hcd.c */ -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG /* check the values in the HCSPARAMS register * (host controller _Structural_ parameters) @@ -62,7 +62,7 @@ static inline void dbg_hcs_params (struct ehci_hcd *ehci, char *label) {} #endif -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG /* check the values in the HCCPARAMS register * (host controller _Capability_ parameters) @@ -101,7 +101,7 @@ static inline void dbg_hcc_params (struct ehci_hcd *ehci, char *label) {} #endif -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG static void __maybe_unused dbg_qtd (const char *label, struct ehci_hcd *ehci, struct ehci_qtd *qtd) @@ -301,7 +301,7 @@ static inline int __maybe_unused dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) { return 0; } -#endif /* DEBUG || CONFIG_DYNAMIC_DEBUG */ +#endif /* CONFIG_DYNAMIC_DEBUG */ /* functions have the "wrong" filename when they're output... */ #define dbg_status(ehci, label, status) { \ @@ -818,7 +818,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) #ifdef CONFIG_PCI /* EHCI 0.96 and later may have "extended capabilities" */ - if (hcd->self.controller->bus == &pci_bus_type) { + if (dev_is_pci(hcd->self.controller)) { struct pci_dev *pdev; u32 offset, cap, cap2; unsigned count = 256/4; diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c index e97c198e052f..d1d8c47777c5 100644 --- a/drivers/usb/host/ehci-exynos.c +++ b/drivers/usb/host/ehci-exynos.c @@ -166,6 +166,7 @@ skip_phy: dev_err(&pdev->dev, "Failed to add USB HCD\n"); goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); platform_set_drvdata(pdev, hcd); diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c index a06d5012201f..6f2c8d3899d2 100644 --- a/drivers/usb/host/ehci-fsl.c +++ b/drivers/usb/host/ehci-fsl.c @@ -102,19 +102,11 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, } hcd->rsrc_start = res->start; hcd->rsrc_len = resource_size(res); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, - driver->description)) { - dev_dbg(&pdev->dev, "controller already in use\n"); - retval = -EBUSY; + hcd->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(hcd->regs)) { + retval = PTR_ERR(hcd->regs); goto err2; } - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - - if (hcd->regs == NULL) { - dev_dbg(&pdev->dev, "error mapping memory\n"); - retval = -EFAULT; - goto err3; - } pdata->regs = hcd->regs; @@ -126,7 +118,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, */ if (pdata->init && pdata->init(pdev)) { retval = -ENODEV; - goto err4; + goto err2; } /* Enable USB controller, 83xx or 8536 */ @@ -137,7 +129,8 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval != 0) - goto err4; + goto err2; + device_wakeup_enable(hcd->self.controller); #ifdef CONFIG_USB_OTG if (pdata->operating_mode == FSL_USB2_DR_OTG) { @@ -152,21 +145,17 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, &ehci_to_hcd(ehci)->self); if (retval) { usb_put_phy(hcd->phy); - goto err4; + goto err2; } } else { dev_err(&pdev->dev, "can't find phy\n"); retval = -ENODEV; - goto err4; + goto err2; } } #endif return retval; - err4: - iounmap(hcd->regs); - err3: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); err2: usb_put_hcd(hcd); err1: @@ -205,8 +194,6 @@ static void usb_hcd_fsl_remove(struct usb_hcd *hcd, */ if (pdata->exit) pdata->exit(pdev); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); } @@ -267,7 +254,7 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd, if (!(spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) & PHY_CLK_VALID, FSL_USB_PHY_CLK_TIMEOUT, 0) || in_be32(non_ehci + FSL_SOC_USB_PRICTRL))) { - printk(KERN_WARNING "fsl-ehci: USB PHY clock invalid\n"); + dev_warn(hcd->self.controller, "USB PHY clock invalid\n"); return -EINVAL; } } @@ -413,7 +400,7 @@ static int ehci_fsl_mpc512x_drv_suspend(struct device *dev) struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev); u32 tmp; -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE); mode &= USBMODE_CM_MASK; tmp = ehci_readl(ehci, hcd->regs + 0x140); /* usbcmd */ diff --git a/drivers/usb/host/ehci-grlib.c b/drivers/usb/host/ehci-grlib.c index b52a66ce92e8..495b6fbcbcd9 100644 --- a/drivers/usb/host/ehci-grlib.c +++ b/drivers/usb/host/ehci-grlib.c @@ -113,7 +113,8 @@ static int ehci_hcd_grlib_probe(struct platform_device *op) irq = irq_of_parse_and_map(dn, 0); if (irq == NO_IRQ) { - printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); + dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", + __FILE__); rv = -EBUSY; goto err_irq; } @@ -140,6 +141,7 @@ static int ehci_hcd_grlib_probe(struct platform_device *op) if (rv) goto err_ioremap; + device_wakeup_enable(hcd->self.controller); return 0; err_ioremap: diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index e8ba4c44223a..471142725ffe 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -71,7 +71,6 @@ static const char hcd_name [] = "ehci_hcd"; -#undef VERBOSE_DEBUG #undef EHCI_URB_TRACE /* magic numbers that can affect system performance */ @@ -714,13 +713,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) cmd = ehci_readl(ehci, &ehci->regs->command); bh = 0; -#ifdef VERBOSE_DEBUG - /* unrequested/ignored: Frame List Rollover */ - dbg_status (ehci, "irq", status); -#endif - - /* INT, ERR, and IAA interrupt rates can be throttled */ - /* normal [4.15.1.2] or error [4.15.1.1] completion */ if (likely ((status & (STS_INT|STS_ERR)) != 0)) { if (likely ((status & STS_ERR) == 0)) @@ -1320,7 +1312,7 @@ static int __init ehci_hcd_init(void) sizeof(struct ehci_qh), sizeof(struct ehci_qtd), sizeof(struct ehci_itd), sizeof(struct ehci_sitd)); -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root); if (!ehci_debug_root) { retval = -ENOENT; @@ -1369,7 +1361,7 @@ clean2: platform_driver_unregister(&PLATFORM_DRIVER); clean0: #endif -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG debugfs_remove(ehci_debug_root); ehci_debug_root = NULL; err_debug: @@ -1393,7 +1385,7 @@ static void __exit ehci_hcd_cleanup(void) #ifdef PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); #endif -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG debugfs_remove(ehci_debug_root); #endif clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 835fc0844a66..47b858fc50b2 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c @@ -1114,10 +1114,8 @@ static int ehci_hub_control ( if (test_bit(wIndex, &ehci->port_c_suspend)) status |= USB_PORT_STAT_C_SUSPEND << 16; -#ifndef VERBOSE_DEBUG - if (status & ~0xffff) /* only if wPortChange is interesting */ -#endif - dbg_port (ehci, "GetStatus", wIndex + 1, temp); + if (status & ~0xffff) /* only if wPortChange is interesting */ + dbg_port(ehci, "GetStatus", wIndex + 1, temp); put_unaligned_le32(status, buf); break; case SetHubFeature: diff --git a/drivers/usb/host/ehci-mv.c b/drivers/usb/host/ehci-mv.c index 417c10da9450..bd61612a7251 100644 --- a/drivers/usb/host/ehci-mv.c +++ b/drivers/usb/host/ehci-mv.c @@ -178,7 +178,7 @@ static int mv_ehci_probe(struct platform_device *pdev) ehci_mv->phy_regs = devm_ioremap(&pdev->dev, r->start, resource_size(r)); - if (ehci_mv->phy_regs == 0) { + if (!ehci_mv->phy_regs) { dev_err(&pdev->dev, "failed to map phy I/O memory\n"); retval = -EFAULT; goto err_put_hcd; @@ -257,6 +257,7 @@ static int mv_ehci_probe(struct platform_device *pdev) "failed to add hcd with err %d\n", retval); goto err_set_vbus; } + device_wakeup_enable(hcd->self.controller); } if (pdata->private_init) diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 0528dc4526c8..dbe5e4eea08d 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c @@ -155,6 +155,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) if (ret) goto err_add; + device_wakeup_enable(hcd->self.controller); return 0; err_add: diff --git a/drivers/usb/host/ehci-octeon.c b/drivers/usb/host/ehci-octeon.c index 4c528b2c033a..9051439039a7 100644 --- a/drivers/usb/host/ehci-octeon.c +++ b/drivers/usb/host/ehci-octeon.c @@ -128,20 +128,12 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) hcd->rsrc_start = res_mem->start; hcd->rsrc_len = resource_size(res_mem); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, - OCTEON_EHCI_HCD_NAME)) { - dev_err(&pdev->dev, "request_mem_region failed\n"); - ret = -EBUSY; + hcd->regs = devm_ioremap_resource(&pdev->dev, res_mem); + if (IS_ERR(hcd->regs)) { + ret = PTR_ERR(hcd->regs); goto err1; } - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - dev_err(&pdev->dev, "ioremap failed\n"); - ret = -ENOMEM; - goto err2; - } - ehci_octeon_start(); ehci = hcd_to_ehci(hcd); @@ -156,18 +148,16 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) ret = usb_add_hcd(hcd, irq, IRQF_SHARED); if (ret) { dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret); - goto err3; + goto err2; } + device_wakeup_enable(hcd->self.controller); platform_set_drvdata(pdev, hcd); return 0; -err3: +err2: ehci_octeon_stop(); - iounmap(hcd->regs); -err2: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); err1: usb_put_hcd(hcd); return ret; @@ -180,8 +170,6 @@ static int ehci_octeon_drv_remove(struct platform_device *pdev) usb_remove_hcd(hcd); ehci_octeon_stop(); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); return 0; diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 6fa82d6b7661..a24720beb39d 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c @@ -215,6 +215,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) dev_err(dev, "failed to add hcd with err %d\n", ret); goto err_pm_runtime; } + device_wakeup_enable(hcd->self.controller); /* * Bring PHYs out of reset for non PHY modes. diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 2ba76730e650..30d35e5e503a 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c @@ -184,33 +184,23 @@ static int ehci_orion_drv_probe(struct platform_device *pdev) if (err) goto err1; - if (!request_mem_region(res->start, resource_size(res), - ehci_orion_hc_driver.description)) { - dev_dbg(&pdev->dev, "controller already in use\n"); - err = -EBUSY; + regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(regs)) { + err = PTR_ERR(regs); goto err1; } - regs = ioremap(res->start, resource_size(res)); - if (regs == NULL) { - dev_dbg(&pdev->dev, "error mapping memory\n"); - err = -EFAULT; - goto err2; - } - /* Not all platforms can gate the clock, so it is not an error if the clock does not exists. */ - clk = clk_get(&pdev->dev, NULL); - if (!IS_ERR(clk)) { + clk = devm_clk_get(&pdev->dev, NULL); + if (!IS_ERR(clk)) clk_prepare_enable(clk); - clk_put(clk); - } hcd = usb_create_hcd(&ehci_orion_hc_driver, &pdev->dev, dev_name(&pdev->dev)); if (!hcd) { err = -ENOMEM; - goto err3; + goto err2; } hcd->rsrc_start = res->start; @@ -245,25 +235,21 @@ static int ehci_orion_drv_probe(struct platform_device *pdev) case EHCI_PHY_DD: case EHCI_PHY_KW: default: - printk(KERN_WARNING "Orion ehci -USB phy version isn't supported.\n"); + dev_warn(&pdev->dev, "USB phy version isn't supported.\n"); } err = usb_add_hcd(hcd, irq, IRQF_SHARED); if (err) - goto err4; + goto err3; + device_wakeup_enable(hcd->self.controller); return 0; -err4: - usb_put_hcd(hcd); err3: - if (!IS_ERR(clk)) { - clk_disable_unprepare(clk); - clk_put(clk); - } - iounmap(regs); + usb_put_hcd(hcd); err2: - release_mem_region(res->start, resource_size(res)); + if (!IS_ERR(clk)) + clk_disable_unprepare(clk); err1: dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), err); @@ -277,15 +263,11 @@ static int ehci_orion_drv_remove(struct platform_device *pdev) struct clk *clk; usb_remove_hcd(hcd); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); - clk = clk_get(&pdev->dev, NULL); - if (!IS_ERR(clk)) { + clk = devm_clk_get(&pdev->dev, NULL); + if (!IS_ERR(clk)) clk_disable_unprepare(clk); - clk_put(clk); - } return 0; } diff --git a/drivers/usb/host/ehci-platform.c b/drivers/usb/host/ehci-platform.c index 7f30b7168d5a..01536cfd361d 100644 --- a/drivers/usb/host/ehci-platform.c +++ b/drivers/usb/host/ehci-platform.c @@ -132,6 +132,7 @@ static int ehci_platform_probe(struct platform_device *dev) if (err) goto err_put_hcd; + device_wakeup_enable(hcd->self.controller); platform_set_drvdata(dev, hcd); return err; diff --git a/drivers/usb/host/ehci-pmcmsp.c b/drivers/usb/host/ehci-pmcmsp.c index 893b707f0000..af3974a5e7c2 100644 --- a/drivers/usb/host/ehci-pmcmsp.c +++ b/drivers/usb/host/ehci-pmcmsp.c @@ -210,8 +210,10 @@ int usb_hcd_msp_probe(const struct hc_driver *driver, retval = usb_add_hcd(hcd, res->start, IRQF_SHARED); - if (retval == 0) + if (retval == 0) { + device_wakeup_enable(hcd->self.controller); return 0; + } usb_remove_hcd(hcd); err3: diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c index 875d2fcc9e0e..547924796d29 100644 --- a/drivers/usb/host/ehci-ppc-of.c +++ b/drivers/usb/host/ehci-ppc-of.c @@ -119,7 +119,8 @@ static int ehci_hcd_ppc_of_probe(struct platform_device *op) irq = irq_of_parse_and_map(dn, 0); if (irq == NO_IRQ) { - printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); + dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", + __FILE__); rv = -EBUSY; goto err_irq; } @@ -169,6 +170,7 @@ static int ehci_hcd_ppc_of_probe(struct platform_device *op) if (rv) goto err_ioremap; + device_wakeup_enable(hcd->self.controller); return 0; err_ioremap: diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c index 8188542ba17e..7934ff9b35e1 100644 --- a/drivers/usb/host/ehci-ps3.c +++ b/drivers/usb/host/ehci-ps3.c @@ -189,6 +189,7 @@ static int ps3_ehci_probe(struct ps3_system_bus_device *dev) goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); return result; fail_add_hcd: diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index db05bd8ee9d5..54f5332f814d 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -168,13 +168,13 @@ static void ehci_clear_tt_buffer(struct ehci_hcd *ehci, struct ehci_qh *qh, * Note: this routine is never called for Isochronous transfers. */ if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG struct usb_device *tt = urb->dev->tt->hub; dev_dbg(&tt->dev, "clear tt buffer port %d, a%d ep%d t%08x\n", urb->dev->ttport, urb->dev->devnum, usb_pipeendpoint(urb->pipe), token); -#endif /* DEBUG || CONFIG_DYNAMIC_DEBUG */ +#endif /* CONFIG_DYNAMIC_DEBUG */ if (!ehci_is_TDI(ehci) || urb->dev->tt->hub != ehci_to_hcd(ehci)->self.root_hub) { diff --git a/drivers/usb/host/ehci-sead3.c b/drivers/usb/host/ehci-sead3.c index 8a734498079b..cf1267673868 100644 --- a/drivers/usb/host/ehci-sead3.c +++ b/drivers/usb/host/ehci-sead3.c @@ -126,6 +126,7 @@ static int ehci_hcd_sead3_drv_probe(struct platform_device *pdev) IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); + device_wakeup_enable(hcd->self.controller); return ret; } diff --git a/drivers/usb/host/ehci-sh.c b/drivers/usb/host/ehci-sh.c index dc899eb2b861..9b9b9f5b016e 100644 --- a/drivers/usb/host/ehci-sh.c +++ b/drivers/usb/host/ehci-sh.c @@ -151,6 +151,7 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to add hcd"); goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); priv->hcd = hcd; platform_set_drvdata(pdev, priv); diff --git a/drivers/usb/host/ehci-spear.c b/drivers/usb/host/ehci-spear.c index ee6f9ffaa0e7..8bd915b2ae8c 100644 --- a/drivers/usb/host/ehci-spear.c +++ b/drivers/usb/host/ehci-spear.c @@ -130,6 +130,7 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) if (retval) goto err_stop_ehci; + device_wakeup_enable(hcd->self.controller); return retval; err_stop_ehci: diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c index b9fd0396011e..a8f4471dae7b 100644 --- a/drivers/usb/host/ehci-tegra.c +++ b/drivers/usb/host/ehci-tegra.c @@ -455,6 +455,7 @@ static int tegra_ehci_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to add USB HCD\n"); goto cleanup_otg_set_host; } + device_wakeup_enable(hcd->self.controller); return err; diff --git a/drivers/usb/host/ehci-tilegx.c b/drivers/usb/host/ehci-tilegx.c index 67026ffbf9a8..f3713d32c9a1 100644 --- a/drivers/usb/host/ehci-tilegx.c +++ b/drivers/usb/host/ehci-tilegx.c @@ -170,6 +170,7 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev) ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); + device_wakeup_enable(hcd->self.controller); return ret; } diff --git a/drivers/usb/host/ehci-w90x900.c b/drivers/usb/host/ehci-w90x900.c index cdad8438c02b..a9303aff125e 100644 --- a/drivers/usb/host/ehci-w90x900.c +++ b/drivers/usb/host/ehci-w90x900.c @@ -58,17 +58,12 @@ static int usb_w90x900_probe(const struct hc_driver *driver, hcd->rsrc_start = res->start; hcd->rsrc_len = resource_size(res); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - retval = -EBUSY; + hcd->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(hcd->regs)) { + retval = PTR_ERR(hcd->regs); goto err2; } - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (hcd->regs == NULL) { - retval = -EFAULT; - goto err3; - } - ehci = hcd_to_ehci(hcd); ehci->caps = hcd->regs; ehci->regs = hcd->regs + @@ -88,17 +83,14 @@ static int usb_w90x900_probe(const struct hc_driver *driver, irq = platform_get_irq(pdev, 0); if (irq < 0) - goto err4; + goto err2; retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval != 0) - goto err4; + goto err2; + device_wakeup_enable(hcd->self.controller); return retval; -err4: - iounmap(hcd->regs); -err3: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); err2: usb_put_hcd(hcd); err1: @@ -109,8 +101,6 @@ static void usb_w90x900_remove(struct usb_hcd *hcd, struct platform_device *pdev) { usb_remove_hcd(hcd); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); } diff --git a/drivers/usb/host/ehci-xilinx-of.c b/drivers/usb/host/ehci-xilinx-of.c index 95979f9f4381..fe57710753e8 100644 --- a/drivers/usb/host/ehci-xilinx-of.c +++ b/drivers/usb/host/ehci-xilinx-of.c @@ -155,7 +155,8 @@ static int ehci_hcd_xilinx_of_probe(struct platform_device *op) irq = irq_of_parse_and_map(dn, 0); if (!irq) { - printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); + dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", + __FILE__); rv = -EBUSY; goto err_irq; } @@ -191,8 +192,10 @@ static int ehci_hcd_xilinx_of_probe(struct platform_device *op) ehci->caps = hcd->regs + 0x100; rv = usb_add_hcd(hcd, irq, 0); - if (rv == 0) + if (rv == 0) { + device_wakeup_enable(hcd->self.controller); return 0; + } err_irq: usb_put_hcd(hcd); diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index e8f41c5e771b..9dfc6c1394d6 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -38,7 +38,7 @@ typedef __u16 __bitwise __hc16; #endif /* statistics can be kept for tuning/monitoring */ -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG #define EHCI_STATS #endif @@ -225,6 +225,7 @@ struct ehci_hcd { /* one per controller */ unsigned has_synopsys_hc_bug:1; /* Synopsys HC */ unsigned frame_index_bug:1; /* MosChip (AKA NetMos) */ unsigned need_oc_pp_cycle:1; /* MPC834X port power */ + unsigned imx28_write_fix:1; /* For Freescale i.MX28 */ /* required for usb32 quirk */ #define OHCI_CTRL_HCFS (3 << 6) @@ -248,7 +249,7 @@ struct ehci_hcd { /* one per controller */ #endif /* debug files */ -#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) +#ifdef CONFIG_DYNAMIC_DEBUG struct dentry *debug_dir; #endif @@ -728,6 +729,18 @@ static inline unsigned int ehci_readl(const struct ehci_hcd *ehci, #endif } +#ifdef CONFIG_SOC_IMX28 +static inline void imx28_ehci_writel(const unsigned int val, + volatile __u32 __iomem *addr) +{ + __asm__ ("swp %0, %0, [%1]" : : "r"(val), "r"(addr)); +} +#else +static inline void imx28_ehci_writel(const unsigned int val, + volatile __u32 __iomem *addr) +{ +} +#endif static inline void ehci_writel(const struct ehci_hcd *ehci, const unsigned int val, __u32 __iomem *regs) { @@ -736,7 +749,10 @@ static inline void ehci_writel(const struct ehci_hcd *ehci, writel_be(val, regs) : writel(val, regs); #else - writel(val, regs); + if (ehci->imx28_write_fix) + imx28_ehci_writel(val, regs); + else + writel(val, regs); #endif } @@ -832,9 +848,9 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x) dev_warn(ehci_to_hcd(ehci)->self.controller , fmt , ## args) -#if !defined(DEBUG) && !defined(CONFIG_DYNAMIC_DEBUG) +#ifndef CONFIG_DYNAMIC_DEBUG #define STUB_DEBUG_FILES -#endif /* !DEBUG && !CONFIG_DYNAMIC_DEBUG */ +#endif /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/host/fhci-hcd.c b/drivers/usb/host/fhci-hcd.c index 0551c0af0fd1..1cf68eaf2ed8 100644 --- a/drivers/usb/host/fhci-hcd.c +++ b/drivers/usb/host/fhci-hcd.c @@ -754,6 +754,8 @@ static int of_fhci_probe(struct platform_device *ofdev) if (ret < 0) goto err_add_hcd; + device_wakeup_enable(hcd->self.controller); + fhci_dfs_create(fhci); return 0; diff --git a/drivers/usb/host/fotg210-hcd.c b/drivers/usb/host/fotg210-hcd.c index 55486bd23cf1..98a89d16cc3e 100644 --- a/drivers/usb/host/fotg210-hcd.c +++ b/drivers/usb/host/fotg210-hcd.c @@ -56,12 +56,9 @@ static const char hcd_name[] = "fotg210_hcd"; -#undef VERBOSE_DEBUG #undef FOTG210_URB_TRACE -#ifdef DEBUG #define FOTG210_STATS -#endif /* magic numbers that can affect system performance */ #define FOTG210_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ @@ -107,14 +104,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us"); #define fotg210_warn(fotg210, fmt, args...) \ dev_warn(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) -#ifdef VERBOSE_DEBUG -# define fotg210_vdbg fotg210_dbg -#else - static inline void fotg210_vdbg(struct fotg210_hcd *fotg210, ...) {} -#endif - -#ifdef DEBUG - /* check the values in the HCSPARAMS register * (host controller _Structural_ parameters) * see EHCI spec, Table 2-4 for each value @@ -129,13 +118,6 @@ static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) HCS_N_PORTS(params) ); } -#else - -static inline void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) {} - -#endif - -#ifdef DEBUG /* check the values in the HCCPARAMS register * (host controller _Capability_ parameters) @@ -152,13 +134,6 @@ static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024", HCC_CANPARK(params) ? " park" : ""); } -#else - -static inline void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) {} - -#endif - -#ifdef DEBUG static void __maybe_unused dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd) @@ -272,8 +247,8 @@ dbg_command_buf(char *buf, unsigned len, const char *label, u32 command) ); } -static int -dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) +static char +*dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) { char *sig; @@ -293,7 +268,7 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) break; } - return scnprintf(buf, len, + scnprintf(buf, len, "%s%sport:%d status %06x %d " "sig=%s%s%s%s%s%s%s%s", label, label[0] ? " " : "", port, status, @@ -306,31 +281,9 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) (status & PORT_PE) ? " PE" : "", (status & PORT_CSC) ? " CSC" : "", (status & PORT_CONNECT) ? " CONNECT" : ""); + return buf; } -#else -static inline void __maybe_unused -dbg_qh(char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh) -{} - -static inline int __maybe_unused -dbg_status_buf(char *buf, unsigned len, const char *label, u32 status) -{ return 0; } - -static inline int __maybe_unused -dbg_command_buf(char *buf, unsigned len, const char *label, u32 command) -{ return 0; } - -static inline int __maybe_unused -dbg_intr_buf(char *buf, unsigned len, const char *label, u32 enable) -{ return 0; } - -static inline int __maybe_unused -dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) -{ return 0; } - -#endif /* DEBUG */ - /* functions have the "wrong" filename when they're output... */ #define dbg_status(fotg210, label, status) { \ char _buf[80]; \ @@ -346,19 +299,11 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) #define dbg_port(fotg210, label, port, status) { \ char _buf[80]; \ - dbg_port_buf(_buf, sizeof(_buf), label, port, status); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ + fotg210_dbg(fotg210, "%s\n", dbg_port_buf(_buf, sizeof(_buf), label, port, status) ); \ } /*-------------------------------------------------------------------------*/ -#ifdef STUB_DEBUG_FILES - -static inline void create_debug_files(struct fotg210_hcd *bus) { } -static inline void remove_debug_files(struct fotg210_hcd *bus) { } - -#else - /* troubleshooting help: expose state in debugfs */ static int debug_async_open(struct inode *, struct file *); @@ -954,7 +899,6 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210) debugfs_remove_recursive(fotg210->debug_dir); } -#endif /* STUB_DEBUG_FILES */ /*-------------------------------------------------------------------------*/ /* @@ -1398,7 +1342,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210) &fotg210->regs->status); } - fotg210_vdbg(fotg210, "IAA watchdog: status %x cmd %x\n", + fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n", status, cmd); end_unlink_async(fotg210); } @@ -1810,10 +1754,8 @@ static int fotg210_hub_control( if (test_bit(wIndex, &fotg210->port_c_suspend)) status |= USB_PORT_STAT_C_SUSPEND << 16; -#ifndef VERBOSE_DEBUG - if (status & ~0xffff) /* only if wPortChange is interesting */ -#endif - dbg_port(fotg210, "GetStatus", wIndex + 1, temp); + if (status & ~0xffff) /* only if wPortChange is interesting */ + dbg_port(fotg210, "GetStatus", wIndex + 1, temp); put_unaligned_le32(status, buf); break; case SetHubFeature: @@ -1856,7 +1798,7 @@ static int fotg210_hub_control( * which can be fine if this root hub has a * transaction translator built in. */ - fotg210_vdbg(fotg210, "port %d reset\n", wIndex + 1); + fotg210_dbg(fotg210, "port %d reset\n", wIndex + 1); temp |= PORT_RESET; temp &= ~PORT_PE; @@ -2274,13 +2216,12 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, * Note: this routine is never called for Isochronous transfers. */ if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { -#ifdef DEBUG struct usb_device *tt = urb->dev->tt->hub; dev_dbg(&tt->dev, "clear tt buffer port %d, a%d ep%d t%08x\n", urb->dev->ttport, urb->dev->devnum, usb_pipeendpoint(urb->pipe), token); -#endif /* DEBUG */ + if (urb->dev->tt->hub != fotg210_to_hcd(fotg210)->self.root_hub) { if (usb_hub_clear_tt_buffer(urb) == 0) @@ -2341,7 +2282,7 @@ static int qtd_copy_status( status = -EPROTO; } - fotg210_vdbg(fotg210, + fotg210_dbg(fotg210, "dev%d ep%d%s qtd token %08x --> status %d\n", usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe), @@ -3583,11 +3524,9 @@ periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe) break; } } -#ifdef DEBUG if (usecs > fotg210->uframe_periodic_max) fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n", frame * 8 + uframe, usecs); -#endif return usecs; } @@ -4646,7 +4585,7 @@ static void itd_link_urb( if (unlikely(list_empty(&stream->td_list))) { fotg210_to_hcd(fotg210)->self.bandwidth_allocated += stream->bandwidth; - fotg210_vdbg(fotg210, + fotg210_dbg(fotg210, "schedule devp %s ep%d%s-iso period %d start %d.%d\n", urb->dev->devpath, stream->bEndpointAddress & 0x0f, (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out", @@ -4779,7 +4718,7 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) if (unlikely(list_is_singular(&stream->td_list))) { fotg210_to_hcd(fotg210)->self.bandwidth_allocated -= stream->bandwidth; - fotg210_vdbg(fotg210, + fotg210_dbg(fotg210, "deschedule devp %s ep%d%s-iso\n", dev->devpath, stream->bEndpointAddress & 0x0f, (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); @@ -5444,10 +5383,8 @@ static irqreturn_t fotg210_irq(struct usb_hcd *hcd) cmd = fotg210_readl(fotg210, &fotg210->regs->command); bh = 0; -#ifdef VERBOSE_DEBUG /* unrequested/ignored: Frame List Rollover */ dbg_status(fotg210, "irq", status); -#endif /* INT, ERR, and IAA interrupt rates can be throttled */ @@ -5952,6 +5889,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev) dev_err(dev, "failed to add hcd with err %d\n", retval); goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); return retval; @@ -6013,13 +5951,11 @@ static int __init fotg210_hcd_init(void) sizeof(struct fotg210_qh), sizeof(struct fotg210_qtd), sizeof(struct fotg210_itd)); -#ifdef DEBUG fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root); if (!fotg210_debug_root) { retval = -ENOENT; goto err_debug; } -#endif retval = platform_driver_register(&fotg210_hcd_driver); if (retval < 0) @@ -6028,11 +5964,9 @@ static int __init fotg210_hcd_init(void) platform_driver_unregister(&fotg210_hcd_driver); clean: -#ifdef DEBUG debugfs_remove(fotg210_debug_root); fotg210_debug_root = NULL; err_debug: -#endif clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); return retval; } @@ -6041,9 +5975,7 @@ module_init(fotg210_hcd_init); static void __exit fotg210_hcd_cleanup(void) { platform_driver_unregister(&fotg210_hcd_driver); -#ifdef DEBUG debugfs_remove(fotg210_debug_root); -#endif clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); } module_exit(fotg210_hcd_cleanup); diff --git a/drivers/usb/host/fotg210.h b/drivers/usb/host/fotg210.h index 8920f9d32564..ac6cd1bfd208 100644 --- a/drivers/usb/host/fotg210.h +++ b/drivers/usb/host/fotg210.h @@ -174,9 +174,7 @@ struct fotg210_hcd { /* one per controller */ #endif /* debug files */ -#ifdef DEBUG struct dentry *debug_dir; -#endif }; /* convert between an HCD pointer and the corresponding FOTG210_HCD */ @@ -741,10 +739,4 @@ static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210) }) /*-------------------------------------------------------------------------*/ -#ifndef DEBUG -#define STUB_DEBUG_FILES -#endif /* DEBUG */ - -/*-------------------------------------------------------------------------*/ - #endif /* __LINUX_FOTG210_H */ diff --git a/drivers/usb/host/fusbh200-hcd.c b/drivers/usb/host/fusbh200-hcd.c index e1c6d850a7e1..ba9499060f63 100644 --- a/drivers/usb/host/fusbh200-hcd.c +++ b/drivers/usb/host/fusbh200-hcd.c @@ -57,13 +57,8 @@ static const char hcd_name [] = "fusbh200_hcd"; -#undef VERBOSE_DEBUG #undef FUSBH200_URB_TRACE -#ifdef DEBUG -#define FUSBH200_STATS -#endif - /* magic numbers that can affect system performance */ #define FUSBH200_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ #define FUSBH200_TUNE_RL_HS 4 /* nak throttle; see 4.9 */ @@ -108,14 +103,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us"); #define fusbh200_warn(fusbh200, fmt, args...) \ dev_warn (fusbh200_to_hcd(fusbh200)->self.controller , fmt , ## args ) -#ifdef VERBOSE_DEBUG -# define fusbh200_vdbg fusbh200_dbg -#else - static inline void fusbh200_vdbg(struct fusbh200_hcd *fusbh200, ...) {} -#endif - -#ifdef DEBUG - /* check the values in the HCSPARAMS register * (host controller _Structural_ parameters) * see EHCI spec, Table 2-4 for each value @@ -130,13 +117,6 @@ static void dbg_hcs_params (struct fusbh200_hcd *fusbh200, char *label) HCS_N_PORTS (params) ); } -#else - -static inline void dbg_hcs_params (struct fusbh200_hcd *fusbh200, char *label) {} - -#endif - -#ifdef DEBUG /* check the values in the HCCPARAMS register * (host controller _Capability_ parameters) @@ -153,13 +133,6 @@ static void dbg_hcc_params (struct fusbh200_hcd *fusbh200, char *label) HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024", HCC_CANPARK(params) ? " park" : ""); } -#else - -static inline void dbg_hcc_params (struct fusbh200_hcd *fusbh200, char *label) {} - -#endif - -#ifdef DEBUG static void __maybe_unused dbg_qtd (const char *label, struct fusbh200_hcd *fusbh200, struct fusbh200_qtd *qtd) @@ -302,29 +275,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) (status & PORT_CONNECT) ? " CONNECT" : ""); } -#else -static inline void __maybe_unused -dbg_qh (char *label, struct fusbh200_hcd *fusbh200, struct fusbh200_qh *qh) -{} - -static inline int __maybe_unused -dbg_status_buf (char *buf, unsigned len, const char *label, u32 status) -{ return 0; } - -static inline int __maybe_unused -dbg_command_buf (char *buf, unsigned len, const char *label, u32 command) -{ return 0; } - -static inline int __maybe_unused -dbg_intr_buf (char *buf, unsigned len, const char *label, u32 enable) -{ return 0; } - -static inline int __maybe_unused -dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) -{ return 0; } - -#endif /* DEBUG */ - /* functions have the "wrong" filename when they're output... */ #define dbg_status(fusbh200, label, status) { \ char _buf [80]; \ @@ -346,13 +296,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) /*-------------------------------------------------------------------------*/ -#ifdef STUB_DEBUG_FILES - -static inline void create_debug_files (struct fusbh200_hcd *bus) { } -static inline void remove_debug_files (struct fusbh200_hcd *bus) { } - -#else - /* troubleshooting help: expose state in debugfs */ static int debug_async_open(struct inode *, struct file *); @@ -775,7 +718,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) next += temp; } -#ifdef FUSBH200_STATS temp = scnprintf (next, size, "irq normal %ld err %ld iaa %ld (lost %ld)\n", fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa, @@ -787,7 +729,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) fusbh200->stats.complete, fusbh200->stats.unlink); size -= temp; next += temp; -#endif done: spin_unlock_irqrestore (&fusbh200->lock, flags); @@ -928,7 +869,6 @@ static inline void remove_debug_files (struct fusbh200_hcd *fusbh200) debugfs_remove_recursive(fusbh200->debug_dir); } -#endif /* STUB_DEBUG_FILES */ /*-------------------------------------------------------------------------*/ /* @@ -1362,7 +1302,7 @@ static void fusbh200_iaa_watchdog(struct fusbh200_hcd *fusbh200) fusbh200_writel(fusbh200, STS_IAA, &fusbh200->regs->status); } - fusbh200_vdbg(fusbh200, "IAA watchdog: status %x cmd %x\n", + fusbh200_dbg(fusbh200, "IAA watchdog: status %x cmd %x\n", status, cmd); end_unlink_async(fusbh200); } @@ -1769,10 +1709,8 @@ static int fusbh200_hub_control ( if (test_bit(wIndex, &fusbh200->port_c_suspend)) status |= USB_PORT_STAT_C_SUSPEND << 16; -#ifndef VERBOSE_DEBUG - if (status & ~0xffff) /* only if wPortChange is interesting */ -#endif - dbg_port (fusbh200, "GetStatus", wIndex + 1, temp); + if (status & ~0xffff) /* only if wPortChange is interesting */ + dbg_port(fusbh200, "GetStatus", wIndex + 1, temp); put_unaligned_le32(status, buf); break; case SetHubFeature: @@ -1814,7 +1752,7 @@ static int fusbh200_hub_control ( * which can be fine if this root hub has a * transaction translator built in. */ - fusbh200_vdbg (fusbh200, "port %d reset\n", wIndex + 1); + fusbh200_dbg(fusbh200, "port %d reset\n", wIndex + 1); temp |= PORT_RESET; temp &= ~PORT_PE; @@ -2230,13 +2168,13 @@ static void fusbh200_clear_tt_buffer(struct fusbh200_hcd *fusbh200, struct fusbh * Note: this routine is never called for Isochronous transfers. */ if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { -#ifdef DEBUG struct usb_device *tt = urb->dev->tt->hub; + dev_dbg(&tt->dev, "clear tt buffer port %d, a%d ep%d t%08x\n", urb->dev->ttport, urb->dev->devnum, usb_pipeendpoint(urb->pipe), token); -#endif /* DEBUG */ + if (urb->dev->tt->hub != fusbh200_to_hcd(fusbh200)->self.root_hub) { if (usb_hub_clear_tt_buffer(urb) == 0) @@ -2297,7 +2235,7 @@ static int qtd_copy_status ( status = -EPROTO; } - fusbh200_vdbg (fusbh200, + fusbh200_dbg(fusbh200, "dev%d ep%d%s qtd token %08x --> status %d\n", usb_pipedevice (urb->pipe), usb_pipeendpoint (urb->pipe), @@ -3529,11 +3467,9 @@ periodic_usecs (struct fusbh200_hcd *fusbh200, unsigned frame, unsigned uframe) break; } } -#ifdef DEBUG if (usecs > fusbh200->uframe_periodic_max) fusbh200_err (fusbh200, "uframe %d sched overrun: %d usecs\n", frame * 8 + uframe, usecs); -#endif return usecs; } @@ -4586,7 +4522,7 @@ static void itd_link_urb( if (unlikely (list_empty(&stream->td_list))) { fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated += stream->bandwidth; - fusbh200_vdbg (fusbh200, + fusbh200_dbg(fusbh200, "schedule devp %s ep%d%s-iso period %d start %d.%d\n", urb->dev->devpath, stream->bEndpointAddress & 0x0f, (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out", @@ -4717,7 +4653,7 @@ static bool itd_complete(struct fusbh200_hcd *fusbh200, struct fusbh200_itd *itd if (unlikely(list_is_singular(&stream->td_list))) { fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated -= stream->bandwidth; - fusbh200_vdbg (fusbh200, + fusbh200_dbg(fusbh200, "deschedule devp %s ep%d%s-iso\n", dev->devpath, stream->bEndpointAddress & 0x0f, (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); @@ -5115,13 +5051,11 @@ static void fusbh200_stop (struct usb_hcd *hcd) spin_unlock_irq (&fusbh200->lock); fusbh200_mem_cleanup (fusbh200); -#ifdef FUSBH200_STATS fusbh200_dbg(fusbh200, "irq normal %ld err %ld iaa %ld (lost %ld)\n", fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa, fusbh200->stats.lost_iaa); fusbh200_dbg (fusbh200, "complete %ld unlink %ld\n", fusbh200->stats.complete, fusbh200->stats.unlink); -#endif dbg_status (fusbh200, "fusbh200_stop completed", fusbh200_readl(fusbh200, &fusbh200->regs->status)); @@ -5365,13 +5299,6 @@ static irqreturn_t fusbh200_irq (struct usb_hcd *hcd) cmd = fusbh200_readl(fusbh200, &fusbh200->regs->command); bh = 0; -#ifdef VERBOSE_DEBUG - /* unrequested/ignored: Frame List Rollover */ - dbg_status (fusbh200, "irq", status); -#endif - - /* INT, ERR, and IAA interrupt rates can be throttled */ - /* normal [4.15.1.2] or error [4.15.1.1] completion */ if (likely ((status & (STS_INT|STS_ERR)) != 0)) { if (likely ((status & STS_ERR) == 0)) @@ -5871,6 +5798,7 @@ static int fusbh200_hcd_probe(struct platform_device *pdev) dev_err(dev, "failed to add hcd with err %d\n", retval); goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); return retval; @@ -5936,13 +5864,11 @@ static int __init fusbh200_hcd_init(void) sizeof(struct fusbh200_qh), sizeof(struct fusbh200_qtd), sizeof(struct fusbh200_itd)); -#ifdef DEBUG fusbh200_debug_root = debugfs_create_dir("fusbh200", usb_debug_root); if (!fusbh200_debug_root) { retval = -ENOENT; goto err_debug; } -#endif retval = platform_driver_register(&fusbh200_hcd_fusbh200_driver); if (retval < 0) @@ -5951,11 +5877,9 @@ static int __init fusbh200_hcd_init(void) platform_driver_unregister(&fusbh200_hcd_fusbh200_driver); clean: -#ifdef DEBUG debugfs_remove(fusbh200_debug_root); fusbh200_debug_root = NULL; err_debug: -#endif clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); return retval; } @@ -5964,9 +5888,7 @@ module_init(fusbh200_hcd_init); static void __exit fusbh200_hcd_cleanup(void) { platform_driver_unregister(&fusbh200_hcd_fusbh200_driver); -#ifdef DEBUG debugfs_remove(fusbh200_debug_root); -#endif clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); } module_exit(fusbh200_hcd_cleanup); diff --git a/drivers/usb/host/fusbh200.h b/drivers/usb/host/fusbh200.h index 797c9e855270..6b719e066c3f 100644 --- a/drivers/usb/host/fusbh200.h +++ b/drivers/usb/host/fusbh200.h @@ -165,17 +165,11 @@ struct fusbh200_hcd { /* one per controller */ u8 sbrn; /* packed release number */ /* irq statistics */ -#ifdef FUSBH200_STATS struct fusbh200_stats stats; # define COUNT(x) do { (x)++; } while (0) -#else -# define COUNT(x) do {} while (0) -#endif /* debug files */ -#ifdef DEBUG struct dentry *debug_dir; -#endif }; /* convert between an HCD pointer and the corresponding FUSBH200_HCD */ @@ -734,10 +728,4 @@ static inline unsigned fusbh200_read_frame_index(struct fusbh200_hcd *fusbh200) }) /*-------------------------------------------------------------------------*/ -#ifndef DEBUG -#define STUB_DEBUG_FILES -#endif /* DEBUG */ - -/*-------------------------------------------------------------------------*/ - #endif /* __LINUX_FUSBH200_H */ diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c index ada0a52797b1..e07669993f58 100644 --- a/drivers/usb/host/hwa-hc.c +++ b/drivers/usb/host/hwa-hc.c @@ -54,7 +54,6 @@ * DWA). */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/workqueue.h> @@ -86,7 +85,7 @@ static int __hwahc_set_cluster_id(struct hwahc *hwahc, u8 cluster_id) USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, cluster_id, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) dev_err(dev, "Cannot set WUSB Cluster ID to 0x%02x: %d\n", cluster_id, result); @@ -106,7 +105,7 @@ static int __hwahc_op_set_num_dnts(struct wusbhc *wusbhc, u8 interval, u8 slots) USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, interval << 8 | slots, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); } /* @@ -224,7 +223,7 @@ static int hwahc_op_urb_dequeue(struct usb_hcd *usb_hcd, struct urb *urb, struct wusbhc *wusbhc = usb_hcd_to_wusbhc(usb_hcd); struct hwahc *hwahc = container_of(wusbhc, struct hwahc, wusbhc); - return wa_urb_dequeue(&hwahc->wa, urb); + return wa_urb_dequeue(&hwahc->wa, urb, status); } /* @@ -281,7 +280,7 @@ static void __hwahc_op_wusbhc_stop(struct wusbhc *wusbhc, int delay) USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, delay * 1000, iface_no, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); if (ret == 0) msleep(delay); @@ -310,7 +309,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, stream_index, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "Cannot set WUSB stream index: %d\n", result); goto out; @@ -321,7 +320,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, WUSB_REQ_SET_WUSB_MAS, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - mas_le, 32, 1000 /* FIXME: arbitrary */); + mas_le, 32, USB_CTRL_SET_TIMEOUT); if (result < 0) dev_err(dev, "Cannot set WUSB MAS allocation: %d\n", result); out: @@ -355,7 +354,7 @@ static int __hwahc_op_mmcie_add(struct wusbhc *wusbhc, u8 interval, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, interval << 8 | repeat_cnt, handle << 8 | iface_no, - wuie, wuie->bLength, 1000 /* FIXME: arbitrary */); + wuie, wuie->bLength, USB_CTRL_SET_TIMEOUT); } /* @@ -372,7 +371,7 @@ static int __hwahc_op_mmcie_rm(struct wusbhc *wusbhc, u8 handle) WUSB_REQ_REMOVE_MMC_IE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, handle << 8 | iface_no, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); } /* @@ -415,7 +414,7 @@ static int __hwahc_op_dev_info_set(struct wusbhc *wusbhc, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, wusb_dev->port_idx << 8 | iface_no, dev_info, sizeof(struct hwa_dev_info), - 1000 /* FIXME: arbitrary */); + USB_CTRL_SET_TIMEOUT); kfree(dev_info); return ret; } @@ -455,7 +454,7 @@ static int __hwahc_dev_set_key(struct wusbhc *wusbhc, u8 port_idx, u32 tkid, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DT_KEY << 8 | key_idx, port_idx << 8 | iface_no, - keyd, keyd_len, 1000 /* FIXME: arbitrary */); + keyd, keyd_len, USB_CTRL_SET_TIMEOUT); kzfree(keyd); /* clear keys etc. */ return result; @@ -497,7 +496,7 @@ static int __hwahc_op_set_ptk(struct wusbhc *wusbhc, u8 port_idx, u32 tkid, USB_REQ_SET_ENCRYPTION, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, encryption_value, port_idx << 8 | iface_no, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) dev_err(wusbhc->dev, "Can't set host's WUSB encryption for " "port index %u to %s (value %d): %d\n", port_idx, @@ -791,6 +790,7 @@ static int hwahc_probe(struct usb_interface *usb_iface, dev_err(dev, "Cannot add HCD: %d\n", result); goto error_add_hcd; } + device_wakeup_enable(usb_hcd->self.controller); result = wusbhc_b_create(&hwahc->wusbhc); if (result < 0) { dev_err(dev, "Cannot setup phase B of WUSBHC: %d\n", result); diff --git a/drivers/usb/host/imx21-dbg.c b/drivers/usb/host/imx21-dbg.c index ec98ecee3517..4f320d050da7 100644 --- a/drivers/usb/host/imx21-dbg.c +++ b/drivers/usb/host/imx21-dbg.c @@ -18,6 +18,10 @@ /* this file is part of imx21-hcd.c */ +#ifdef CONFIG_DYNAMIC_DEBUG +#define DEBUG +#endif + #ifndef DEBUG static inline void create_debug_files(struct imx21 *imx21) { } diff --git a/drivers/usb/host/imx21-hcd.c b/drivers/usb/host/imx21-hcd.c index adb01d950a16..207bad99301f 100644 --- a/drivers/usb/host/imx21-hcd.c +++ b/drivers/usb/host/imx21-hcd.c @@ -62,6 +62,10 @@ #include "imx21-hcd.h" +#ifdef CONFIG_DYNAMIC_DEBUG +#define DEBUG +#endif + #ifdef DEBUG #define DEBUG_LOG_FRAME(imx21, etd, event) \ (etd)->event##_frame = readl((imx21)->regs + USBH_FRMNUB) @@ -1906,6 +1910,7 @@ static int imx21_probe(struct platform_device *pdev) dev_err(imx21->dev, "usb_add_hcd() returned %d\n", ret); goto failed_add_hcd; } + device_wakeup_enable(hcd->self.controller); return 0; @@ -1926,7 +1931,7 @@ failed_request_mem: static struct platform_driver imx21_hcd_driver = { .driver = { - .name = (char *)hcd_name, + .name = hcd_name, }, .probe = imx21_probe, .remove = imx21_remove, diff --git a/drivers/usb/host/imx21-hcd.h b/drivers/usb/host/imx21-hcd.h index c005770a73e9..05122f8a6983 100644 --- a/drivers/usb/host/imx21-hcd.h +++ b/drivers/usb/host/imx21-hcd.h @@ -24,6 +24,10 @@ #ifndef __LINUX_IMX21_HCD_H__ #define __LINUX_IMX21_HCD_H__ +#ifdef CONFIG_DYNAMIC_DEBUG +#define DEBUG +#endif + #include <linux/platform_data/usb-mx2.h> #define NUM_ISO_ETDS 2 diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index c7d0f8f231be..240e792c81a7 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c @@ -60,7 +60,6 @@ #include <linux/debugfs.h> #include <linux/seq_file.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/slab.h> #include <linux/usb.h> @@ -1645,6 +1644,8 @@ static int isp116x_probe(struct platform_device *pdev) if (ret) goto err6; + device_wakeup_enable(hcd->self.controller); + ret = create_debug_file(isp116x); if (ret) { ERR("Couldn't create debugfs entry\n"); @@ -1705,7 +1706,7 @@ static struct platform_driver isp116x_driver = { .suspend = isp116x_suspend, .resume = isp116x_resume, .driver = { - .name = (char *)hcd_name, + .name = hcd_name, .owner = THIS_MODULE, }, }; diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c index 935a2dd367a8..875bcfd3ec1a 100644 --- a/drivers/usb/host/isp1362-hcd.c +++ b/drivers/usb/host/isp1362-hcd.c @@ -67,7 +67,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/interrupt.h> #include <linux/usb.h> @@ -2746,6 +2745,8 @@ static int isp1362_probe(struct platform_device *pdev) retval = usb_add_hcd(hcd, irq, irq_flags | IRQF_SHARED); if (retval != 0) goto err6; + device_wakeup_enable(hcd->self.controller); + pr_info("%s, irq %d\n", hcd->product_desc, irq); create_debug_file(isp1362_hcd); @@ -2829,7 +2830,7 @@ static struct platform_driver isp1362_driver = { .suspend = isp1362_suspend, .resume = isp1362_resume, .driver = { - .name = (char *)hcd_name, + .name = hcd_name, .owner = THIS_MODULE, }, }; diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 2facee53eab1..51a0ae9cdd1d 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c @@ -2250,6 +2250,7 @@ struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, ret = usb_add_hcd(hcd, irq, irqflags); if (ret) goto err_unmap; + device_wakeup_enable(hcd->self.controller); return hcd; diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 8c356af79409..091ae4905cfc 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c @@ -152,49 +152,42 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, return irq; } - hcd = usb_create_hcd(driver, &pdev->dev, "at91"); + hcd = usb_create_hcd(driver, dev, "at91"); if (!hcd) return -ENOMEM; hcd->rsrc_start = res->start; hcd->rsrc_len = resource_size(res); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - pr_debug("request_mem_region failed\n"); - retval = -EBUSY; - goto err1; + hcd->regs = devm_ioremap_resource(dev, res); + if (IS_ERR(hcd->regs)) { + retval = PTR_ERR(hcd->regs); + goto err; } - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - pr_debug("ioremap failed\n"); - retval = -EIO; - goto err2; - } - - iclk = clk_get(&pdev->dev, "ohci_clk"); + iclk = devm_clk_get(dev, "ohci_clk"); if (IS_ERR(iclk)) { - dev_err(&pdev->dev, "failed to get ohci_clk\n"); + dev_err(dev, "failed to get ohci_clk\n"); retval = PTR_ERR(iclk); - goto err3; + goto err; } - fclk = clk_get(&pdev->dev, "uhpck"); + fclk = devm_clk_get(dev, "uhpck"); if (IS_ERR(fclk)) { - dev_err(&pdev->dev, "failed to get uhpck\n"); + dev_err(dev, "failed to get uhpck\n"); retval = PTR_ERR(fclk); - goto err4; + goto err; } - hclk = clk_get(&pdev->dev, "hclk"); + hclk = devm_clk_get(dev, "hclk"); if (IS_ERR(hclk)) { - dev_err(&pdev->dev, "failed to get hclk\n"); + dev_err(dev, "failed to get hclk\n"); retval = PTR_ERR(hclk); - goto err5; + goto err; } if (IS_ENABLED(CONFIG_COMMON_CLK)) { - uclk = clk_get(&pdev->dev, "usb_clk"); + uclk = devm_clk_get(dev, "usb_clk"); if (IS_ERR(uclk)) { - dev_err(&pdev->dev, "failed to get uclk\n"); + dev_err(dev, "failed to get uclk\n"); retval = PTR_ERR(uclk); - goto err6; + goto err; } } @@ -204,28 +197,15 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, at91_start_hc(pdev); retval = usb_add_hcd(hcd, irq, IRQF_SHARED); - if (retval == 0) + if (retval == 0) { + device_wakeup_enable(hcd->self.controller); return retval; + } /* Error handling */ at91_stop_hc(pdev); - if (IS_ENABLED(CONFIG_COMMON_CLK)) - clk_put(uclk); - err6: - clk_put(hclk); - err5: - clk_put(fclk); - err4: - clk_put(iclk); - - err3: - iounmap(hcd->regs); - - err2: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - - err1: + err: usb_put_hcd(hcd); return retval; } @@ -248,16 +228,7 @@ static void usb_hcd_at91_remove(struct usb_hcd *hcd, { usb_remove_hcd(hcd); at91_stop_hc(pdev); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); - - if (IS_ENABLED(CONFIG_COMMON_CLK)) - clk_put(uclk); - clk_put(hclk); - clk_put(fclk); - clk_put(iclk); - fclk = iclk = hclk = NULL; } /*-------------------------------------------------------------------------*/ @@ -639,10 +610,17 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); + bool do_wakeup = device_may_wakeup(&pdev->dev); + int ret; - if (device_may_wakeup(&pdev->dev)) + if (do_wakeup) enable_irq_wake(hcd->irq); + ret = ohci_suspend(hcd, do_wakeup); + if (ret) { + disable_irq_wake(hcd->irq); + return ret; + } /* * The integrated transceivers seem unable to notice disconnect, * reconnect, or wakeup without the 48 MHz clock active. so for @@ -661,7 +639,7 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) at91_stop_clock(); } - return 0; + return ret; } static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) diff --git a/drivers/usb/host/ohci-da8xx.c b/drivers/usb/host/ohci-da8xx.c index 9be59f11e051..df06be6b47f5 100644 --- a/drivers/usb/host/ohci-da8xx.c +++ b/drivers/usb/host/ohci-da8xx.c @@ -300,41 +300,28 @@ static int usb_hcd_da8xx_probe(const struct hc_driver *driver, if (hub == NULL) return -ENODEV; - usb11_clk = clk_get(&pdev->dev, "usb11"); + usb11_clk = devm_clk_get(&pdev->dev, "usb11"); if (IS_ERR(usb11_clk)) return PTR_ERR(usb11_clk); - usb20_clk = clk_get(&pdev->dev, "usb20"); - if (IS_ERR(usb20_clk)) { - error = PTR_ERR(usb20_clk); - goto err0; - } + usb20_clk = devm_clk_get(&pdev->dev, "usb20"); + if (IS_ERR(usb20_clk)) + return PTR_ERR(usb20_clk); hcd = usb_create_hcd(driver, &pdev->dev, dev_name(&pdev->dev)); - if (!hcd) { - error = -ENOMEM; - goto err1; - } + if (!hcd) + return -ENOMEM; mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (!mem) { - error = -ENODEV; - goto err2; - } + if (!mem) + return -ENODEV; hcd->rsrc_start = mem->start; hcd->rsrc_len = resource_size(mem); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - dev_dbg(&pdev->dev, "request_mem_region failed\n"); - error = -EBUSY; - goto err2; - } - - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - dev_err(&pdev->dev, "ioremap failed\n"); - error = -ENOMEM; - goto err3; + hcd->regs = devm_ioremap_resource(&pdev->dev, mem); + if (IS_ERR(hcd->regs)) { + error = PTR_ERR(hcd->regs); + goto err; } ohci_hcd_init(hcd_to_ohci(hcd)); @@ -342,11 +329,13 @@ static int usb_hcd_da8xx_probe(const struct hc_driver *driver, irq = platform_get_irq(pdev, 0); if (irq < 0) { error = -ENODEV; - goto err4; + goto err; } error = usb_add_hcd(hcd, irq, 0); if (error) - goto err4; + goto err; + + device_wakeup_enable(hcd->self.controller); if (hub->ocic_notify) { error = hub->ocic_notify(ohci_da8xx_ocic_handler); @@ -355,16 +344,8 @@ static int usb_hcd_da8xx_probe(const struct hc_driver *driver, } usb_remove_hcd(hcd); -err4: - iounmap(hcd->regs); -err3: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); -err2: +err: usb_put_hcd(hcd); -err1: - clk_put(usb20_clk); -err0: - clk_put(usb11_clk); return error; } @@ -384,11 +365,7 @@ usb_hcd_da8xx_remove(struct usb_hcd *hcd, struct platform_device *pdev) hub->ocic_notify(NULL); usb_remove_hcd(hcd); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); - clk_put(usb20_clk); - clk_put(usb11_clk); } static int ohci_hcd_da8xx_drv_probe(struct platform_device *dev) @@ -406,19 +383,27 @@ static int ohci_hcd_da8xx_drv_remove(struct platform_device *dev) } #ifdef CONFIG_PM -static int ohci_da8xx_suspend(struct platform_device *dev, pm_message_t message) +static int ohci_da8xx_suspend(struct platform_device *pdev, + pm_message_t message) { - struct usb_hcd *hcd = platform_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); + bool do_wakeup = device_may_wakeup(&pdev->dev); + int ret; + if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; + ret = ohci_suspend(hcd, do_wakeup); + if (ret) + return ret; + ohci_da8xx_clock(0); hcd->state = HC_STATE_SUSPENDED; - dev->dev.power.power_state = PMSG_SUSPEND; - return 0; + + return ret; } static int ohci_da8xx_resume(struct platform_device *dev) diff --git a/drivers/usb/host/ohci-dbg.c b/drivers/usb/host/ohci-dbg.c index 3fca52ec02ac..45032e933e18 100644 --- a/drivers/usb/host/ohci-dbg.c +++ b/drivers/usb/host/ohci-dbg.c @@ -9,8 +9,6 @@ /*-------------------------------------------------------------------------*/ -#ifdef DEBUG - #define edstring(ed_type) ({ char *temp; \ switch (ed_type) { \ case PIPE_CONTROL: temp = "ctrl"; break; \ @@ -20,57 +18,6 @@ } temp;}) #define pipestring(pipe) edstring(usb_pipetype(pipe)) -/* debug| print the main components of an URB - * small: 0) header + data packets 1) just header - */ -static void __maybe_unused -urb_print(struct urb * urb, char * str, int small, int status) -{ - unsigned int pipe= urb->pipe; - - if (!urb->dev || !urb->dev->bus) { - printk(KERN_DEBUG "%s URB: no dev\n", str); - return; - } - -#ifndef OHCI_VERBOSE_DEBUG - if (status != 0) -#endif - printk(KERN_DEBUG "%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d stat=%d\n", - str, - urb, - usb_pipedevice (pipe), - usb_pipeendpoint (pipe), - usb_pipeout (pipe)? "out" : "in", - pipestring (pipe), - urb->transfer_flags, - urb->actual_length, - urb->transfer_buffer_length, - status); - -#ifdef OHCI_VERBOSE_DEBUG - if (!small) { - int i, len; - - if (usb_pipecontrol (pipe)) { - printk (KERN_DEBUG "%s: setup(8):", __FILE__); - for (i = 0; i < 8 ; i++) - printk (" %02x", ((__u8 *) urb->setup_packet) [i]); - printk ("\n"); - } - if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) { - printk (KERN_DEBUG "%s: data(%d/%d):", __FILE__, - urb->actual_length, - urb->transfer_buffer_length); - len = usb_pipeout (pipe)? - urb->transfer_buffer_length: urb->actual_length; - for (i = 0; i < 16 && i < len; i++) - printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]); - printk ("%s stat:%d\n", i < len? "...": "", status); - } - } -#endif -} #define ohci_dbg_sw(ohci, next, size, format, arg...) \ do { \ @@ -407,22 +354,8 @@ ohci_dump_ed (const struct ohci_hcd *ohci, const char *label, } } -#else -static inline void ohci_dump (struct ohci_hcd *controller, int verbose) {} - -#undef OHCI_VERBOSE_DEBUG - -#endif /* DEBUG */ - /*-------------------------------------------------------------------------*/ -#ifdef STUB_DEBUG_FILES - -static inline void create_debug_files (struct ohci_hcd *bus) { } -static inline void remove_debug_files (struct ohci_hcd *bus) { } - -#else - static int debug_async_open(struct inode *, struct file *); static int debug_periodic_open(struct inode *, struct file *); static int debug_registers_open(struct inode *, struct file *); @@ -871,7 +804,5 @@ static inline void remove_debug_files (struct ohci_hcd *ohci) debugfs_remove(ohci->debug_dir); } -#endif - /*-------------------------------------------------------------------------*/ diff --git a/drivers/usb/host/ohci-exynos.c b/drivers/usb/host/ohci-exynos.c index 91ec9b2cd378..68588d8a09bb 100644 --- a/drivers/usb/host/ohci-exynos.c +++ b/drivers/usb/host/ohci-exynos.c @@ -146,6 +146,7 @@ skip_phy: dev_err(&pdev->dev, "Failed to add USB HCD\n"); goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); return 0; fail_add_hcd: @@ -191,23 +192,14 @@ static int exynos_ohci_suspend(struct device *dev) struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd); struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct platform_device *pdev = to_platform_device(dev); + bool do_wakeup = device_may_wakeup(dev); unsigned long flags; - int rc = 0; + int rc = ohci_suspend(hcd, do_wakeup); - /* - * Root hub was already suspended. Disable irq emission and - * mark HW unaccessible, bail out if RH has been resumed. Use - * the spinlock to properly synchronize with possible pending - * RH suspend or resume activity. - */ - spin_lock_irqsave(&ohci->lock, flags); - if (ohci->rh_state != OHCI_RH_SUSPENDED && - ohci->rh_state != OHCI_RH_HALTED) { - rc = -EINVAL; - goto fail; - } + if (rc) + return rc; - clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + spin_lock_irqsave(&ohci->lock, flags); if (exynos_ohci->otg) exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self); @@ -216,10 +208,9 @@ static int exynos_ohci_suspend(struct device *dev) clk_disable_unprepare(exynos_ohci->clk); -fail: spin_unlock_irqrestore(&ohci->lock, flags); - return rc; + return 0; } static int exynos_ohci_resume(struct device *dev) diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 8ada13f8dde2..3586460fb2a1 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c @@ -51,8 +51,6 @@ /*-------------------------------------------------------------------------*/ -#undef OHCI_VERBOSE_DEBUG /* not always helpful */ - /* For initializing controller (mask in an HCFS mode too) */ #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR #define OHCI_INTR_INIT \ @@ -127,10 +125,6 @@ static int ohci_urb_enqueue ( unsigned long flags; int retval = 0; -#ifdef OHCI_VERBOSE_DEBUG - urb_print(urb, "SUB", usb_pipein(pipe), -EINPROGRESS); -#endif - /* every endpoint has a ed, locate and maybe (re)initialize it */ if (! (ed = ed_get (ohci, urb->ep, urb->dev, pipe, urb->interval))) return -ENOMEM; @@ -284,10 +278,6 @@ static int ohci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) unsigned long flags; int rc; -#ifdef OHCI_VERBOSE_DEBUG - urb_print(urb, "UNLINK", 1, status); -#endif - spin_lock_irqsave (&ohci->lock, flags); rc = usb_hcd_check_unlink_urb(hcd, urb, status); if (rc) { @@ -840,7 +830,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) } if (ints & OHCI_INTR_RHSC) { - ohci_vdbg(ohci, "rhsc\n"); + ohci_dbg(ohci, "rhsc\n"); ohci->next_statechange = jiffies + STATECHANGE_DELAY; ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, ®s->intrstatus); @@ -862,7 +852,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) * this might not happen. */ else if (ints & OHCI_INTR_RD) { - ohci_vdbg(ohci, "resume detect\n"); + ohci_dbg(ohci, "resume detect\n"); ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus); set_bit(HCD_FLAG_POLL_RH, &hcd->flags); if (ohci->autostop) { @@ -1036,6 +1026,7 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup) { struct ohci_hcd *ohci = hcd_to_ohci (hcd); unsigned long flags; + int rc = 0; /* Disable irq emission and mark HW unaccessible. Use * the spinlock to properly synchronize with possible pending @@ -1048,7 +1039,13 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup) clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); spin_unlock_irqrestore (&ohci->lock, flags); - return 0; + synchronize_irq(hcd->irq); + + if (do_wakeup && HCD_WAKEUP_PENDING(hcd)) { + ohci_resume(hcd, false); + rc = -EBUSY; + } + return rc; } EXPORT_SYMBOL_GPL(ohci_suspend); @@ -1233,13 +1230,11 @@ static int __init ohci_hcd_mod_init(void) sizeof (struct ed), sizeof (struct td)); set_bit(USB_OHCI_LOADED, &usb_hcds_loaded); -#ifdef DEBUG ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root); if (!ohci_debug_root) { retval = -ENOENT; goto error_debug; } -#endif #ifdef PS3_SYSTEM_BUS_DRIVER retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER); @@ -1314,11 +1309,9 @@ static int __init ohci_hcd_mod_init(void) ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); error_ps3: #endif -#ifdef DEBUG debugfs_remove(ohci_debug_root); ohci_debug_root = NULL; error_debug: -#endif clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); return retval; @@ -1348,9 +1341,7 @@ static void __exit ohci_hcd_mod_exit(void) #ifdef PS3_SYSTEM_BUS_DRIVER ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); #endif -#ifdef DEBUG debugfs_remove(ohci_debug_root); -#endif clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); } module_exit(ohci_hcd_mod_exit); diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 61705a760e7d..c81c8721cc5a 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c @@ -725,10 +725,8 @@ static int ohci_hub_control ( temp = roothub_portstatus (ohci, wIndex); put_unaligned_le32(temp, buf); -#ifndef OHCI_VERBOSE_DEBUG - if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ -#endif - dbg_port (ohci, "GetStatus", wIndex, temp); + if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ + dbg_port(ohci, "GetStatus", wIndex, temp); break; case SetHubFeature: switch (wValue) { diff --git a/drivers/usb/host/ohci-jz4740.c b/drivers/usb/host/ohci-jz4740.c index d4ef53990d73..af8dc1b92d75 100644 --- a/drivers/usb/host/ohci-jz4740.c +++ b/drivers/usb/host/ohci-jz4740.c @@ -174,31 +174,23 @@ static int jz4740_ohci_probe(struct platform_device *pdev) jz4740_ohci = hcd_to_jz4740_hcd(hcd); - res = request_mem_region(res->start, resource_size(res), hcd_name); - if (!res) { - dev_err(&pdev->dev, "Failed to request mem region.\n"); - ret = -EBUSY; - goto err_free; - } - hcd->rsrc_start = res->start; hcd->rsrc_len = resource_size(res); - hcd->regs = ioremap(res->start, resource_size(res)); - if (!hcd->regs) { - dev_err(&pdev->dev, "Failed to ioremap registers.\n"); - ret = -EBUSY; - goto err_release_mem; + hcd->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(hcd->regs)) { + ret = PTR_ERR(hcd->regs); + goto err_free; } - jz4740_ohci->clk = clk_get(&pdev->dev, "uhc"); + jz4740_ohci->clk = devm_clk_get(&pdev->dev, "uhc"); if (IS_ERR(jz4740_ohci->clk)) { ret = PTR_ERR(jz4740_ohci->clk); dev_err(&pdev->dev, "Failed to get clock: %d\n", ret); - goto err_iounmap; + goto err_free; } - jz4740_ohci->vbus = regulator_get(&pdev->dev, "vbus"); + jz4740_ohci->vbus = devm_regulator_get(&pdev->dev, "vbus"); if (IS_ERR(jz4740_ohci->vbus)) jz4740_ohci->vbus = NULL; @@ -217,21 +209,15 @@ static int jz4740_ohci_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to add hcd: %d\n", ret); goto err_disable; } + device_wakeup_enable(hcd->self.controller); return 0; err_disable: - if (jz4740_ohci->vbus) { + if (jz4740_ohci->vbus) regulator_disable(jz4740_ohci->vbus); - regulator_put(jz4740_ohci->vbus); - } clk_disable(jz4740_ohci->clk); - clk_put(jz4740_ohci->clk); -err_iounmap: - iounmap(hcd->regs); -err_release_mem: - release_mem_region(res->start, resource_size(res)); err_free: usb_put_hcd(hcd); @@ -245,16 +231,10 @@ static int jz4740_ohci_remove(struct platform_device *pdev) usb_remove_hcd(hcd); - if (jz4740_ohci->vbus) { + if (jz4740_ohci->vbus) regulator_disable(jz4740_ohci->vbus); - regulator_put(jz4740_ohci->vbus); - } clk_disable(jz4740_ohci->clk); - clk_put(jz4740_ohci->clk); - - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); diff --git a/drivers/usb/host/ohci-nxp.c b/drivers/usb/host/ohci-nxp.c index e99db8a6d55f..ba180ed0f81c 100644 --- a/drivers/usb/host/ohci-nxp.c +++ b/drivers/usb/host/ohci-nxp.c @@ -196,17 +196,17 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) __raw_writel(USB_SLAVE_HCLK_EN | PAD_CONTROL_LAST_DRIVEN, USB_CTRL); /* Enable USB PLL */ - usb_pll_clk = clk_get(&pdev->dev, "ck_pll5"); + usb_pll_clk = devm_clk_get(&pdev->dev, "ck_pll5"); if (IS_ERR(usb_pll_clk)) { dev_err(&pdev->dev, "failed to acquire USB PLL\n"); ret = PTR_ERR(usb_pll_clk); - goto fail_pll; + goto fail_disable; } ret = clk_enable(usb_pll_clk); if (ret < 0) { dev_err(&pdev->dev, "failed to start USB PLL\n"); - goto fail_pllen; + goto fail_disable; } ret = clk_set_rate(usb_pll_clk, 48000); @@ -216,21 +216,21 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) } /* Enable USB device clock */ - usb_dev_clk = clk_get(&pdev->dev, "ck_usbd"); + usb_dev_clk = devm_clk_get(&pdev->dev, "ck_usbd"); if (IS_ERR(usb_dev_clk)) { dev_err(&pdev->dev, "failed to acquire USB DEV Clock\n"); ret = PTR_ERR(usb_dev_clk); - goto fail_dev; + goto fail_rate; } ret = clk_enable(usb_dev_clk); if (ret < 0) { dev_err(&pdev->dev, "failed to start USB DEV Clock\n"); - goto fail_deven; + goto fail_rate; } /* Enable USB otg clocks */ - usb_otg_clk = clk_get(&pdev->dev, "ck_usb_otg"); + usb_otg_clk = devm_clk_get(&pdev->dev, "ck_usb_otg"); if (IS_ERR(usb_otg_clk)) { dev_err(&pdev->dev, "failed to acquire USB DEV Clock\n"); ret = PTR_ERR(usb_otg_clk); @@ -242,7 +242,7 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) ret = clk_enable(usb_otg_clk); if (ret < 0) { dev_err(&pdev->dev, "failed to start USB DEV Clock\n"); - goto fail_otgen; + goto fail_otg; } isp1301_configure(); @@ -274,26 +274,20 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) dev_info(&pdev->dev, "at 0x%p, irq %d\n", hcd->regs, hcd->irq); ret = usb_add_hcd(hcd, irq, 0); - if (ret == 0) + if (ret == 0) { + device_wakeup_enable(hcd->self.controller); return ret; + } ohci_nxp_stop_hc(); fail_resource: usb_put_hcd(hcd); fail_hcd: clk_disable(usb_otg_clk); -fail_otgen: - clk_put(usb_otg_clk); fail_otg: clk_disable(usb_dev_clk); -fail_deven: - clk_put(usb_dev_clk); -fail_dev: fail_rate: clk_disable(usb_pll_clk); -fail_pllen: - clk_put(usb_pll_clk); -fail_pll: fail_disable: isp1301_i2c_client = NULL; return ret; @@ -307,9 +301,7 @@ static int ohci_hcd_nxp_remove(struct platform_device *pdev) ohci_nxp_stop_hc(); usb_put_hcd(hcd); clk_disable(usb_pll_clk); - clk_put(usb_pll_clk); clk_disable(usb_dev_clk); - clk_put(usb_dev_clk); i2c_unregister_device(isp1301_i2c_client); isp1301_i2c_client = NULL; diff --git a/drivers/usb/host/ohci-octeon.c b/drivers/usb/host/ohci-octeon.c index 6c16dcef15c6..15af8954085e 100644 --- a/drivers/usb/host/ohci-octeon.c +++ b/drivers/usb/host/ohci-octeon.c @@ -138,20 +138,12 @@ static int ohci_octeon_drv_probe(struct platform_device *pdev) hcd->rsrc_start = res_mem->start; hcd->rsrc_len = resource_size(res_mem); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, - OCTEON_OHCI_HCD_NAME)) { - dev_err(&pdev->dev, "request_mem_region failed\n"); - ret = -EBUSY; + reg_base = devm_ioremap_resource(&pdev->dev, res_mem); + if (IS_ERR(reg_base)) { + ret = PTR_ERR(reg_base); goto err1; } - reg_base = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!reg_base) { - dev_err(&pdev->dev, "ioremap failed\n"); - ret = -ENOMEM; - goto err2; - } - ohci_octeon_hw_start(); hcd->regs = reg_base; @@ -168,19 +160,18 @@ static int ohci_octeon_drv_probe(struct platform_device *pdev) ret = usb_add_hcd(hcd, irq, IRQF_SHARED); if (ret) { dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret); - goto err3; + goto err2; } + device_wakeup_enable(hcd->self.controller); + platform_set_drvdata(pdev, hcd); return 0; -err3: +err2: ohci_octeon_hw_stop(); - iounmap(hcd->regs); -err2: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); err1: usb_put_hcd(hcd); return ret; @@ -193,8 +184,6 @@ static int ohci_octeon_drv_remove(struct platform_device *pdev) usb_remove_hcd(hcd); ohci_octeon_hw_stop(); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); return 0; diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index f253214741ba..c923cafcaca7 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c @@ -311,14 +311,14 @@ static int usb_hcd_omap_probe (const struct hc_driver *driver, struct usb_hcd *hcd = 0; if (pdev->num_resources != 2) { - printk(KERN_ERR "hcd probe: invalid num_resources: %i\n", + dev_err(&pdev->dev, "invalid num_resources: %i\n", pdev->num_resources); return -ENODEV; } if (pdev->resource[0].flags != IORESOURCE_MEM || pdev->resource[1].flags != IORESOURCE_IRQ) { - printk(KERN_ERR "hcd probe: invalid resource type\n"); + dev_err(&pdev->dev, "invalid resource type\n"); return -ENODEV; } @@ -367,6 +367,7 @@ static int usb_hcd_omap_probe (const struct hc_driver *driver, if (retval) goto err3; + device_wakeup_enable(hcd->self.controller); return 0; err3: iounmap(hcd->regs); diff --git a/drivers/usb/host/ohci-omap3.c b/drivers/usb/host/ohci-omap3.c index 21457417a856..ec15aebe8786 100644 --- a/drivers/usb/host/ohci-omap3.c +++ b/drivers/usb/host/ohci-omap3.c @@ -130,6 +130,7 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev) dev_dbg(dev, "failed to add hcd with err %d\n", ret); goto err_add_hcd; } + device_wakeup_enable(hcd->self.controller); return 0; diff --git a/drivers/usb/host/ohci-platform.c b/drivers/usb/host/ohci-platform.c index f351ff5b171f..68f674cd095f 100644 --- a/drivers/usb/host/ohci-platform.c +++ b/drivers/usb/host/ohci-platform.c @@ -108,6 +108,8 @@ static int ohci_platform_probe(struct platform_device *dev) if (err) goto err_put_hcd; + device_wakeup_enable(hcd->self.controller); + platform_set_drvdata(dev, hcd); return err; diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c index 81f3eba215c1..965e3e9e688a 100644 --- a/drivers/usb/host/ohci-ppc-of.c +++ b/drivers/usb/host/ohci-ppc-of.c @@ -115,24 +115,18 @@ static int ohci_hcd_ppc_of_probe(struct platform_device *op) hcd->rsrc_start = res.start; hcd->rsrc_len = resource_size(&res); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - printk(KERN_ERR "%s: request_mem_region failed\n", __FILE__); - rv = -EBUSY; + hcd->regs = devm_ioremap_resource(&op->dev, &res); + if (IS_ERR(hcd->regs)) { + rv = PTR_ERR(hcd->regs); goto err_rmr; } irq = irq_of_parse_and_map(dn, 0); if (irq == NO_IRQ) { - printk(KERN_ERR "%s: irq_of_parse_and_map failed\n", __FILE__); + dev_err(&op->dev, "%s: irq_of_parse_and_map failed\n", + __FILE__); rv = -EBUSY; - goto err_irq; - } - - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - printk(KERN_ERR "%s: ioremap failed\n", __FILE__); - rv = -ENOMEM; - goto err_ioremap; + goto err_rmr; } ohci = hcd_to_ohci(hcd); @@ -147,8 +141,10 @@ static int ohci_hcd_ppc_of_probe(struct platform_device *op) ohci_hcd_init(ohci); rv = usb_add_hcd(hcd, irq, 0); - if (rv == 0) + if (rv == 0) { + device_wakeup_enable(hcd->self.controller); return 0; + } /* by now, 440epx is known to show usb_23 erratum */ np = of_find_compatible_node(NULL, NULL, "ibm,usb-ehci-440epx"); @@ -174,11 +170,7 @@ static int ohci_hcd_ppc_of_probe(struct platform_device *op) pr_debug("%s: cannot get ehci offset from fdt\n", __FILE__); } - iounmap(hcd->regs); -err_ioremap: irq_dispose_mapping(irq); -err_irq: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); err_rmr: usb_put_hcd(hcd); @@ -193,9 +185,7 @@ static int ohci_hcd_ppc_of_remove(struct platform_device *op) usb_remove_hcd(hcd); - iounmap(hcd->regs); irq_dispose_mapping(hcd->irq); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); usb_put_hcd(hcd); diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index 7d35cd9e2862..71d8bc4c27f6 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c @@ -173,6 +173,7 @@ static int ps3_ohci_probe(struct ps3_system_bus_device *dev) goto fail_add_hcd; } + device_wakeup_enable(hcd->self.controller); return result; fail_add_hcd: diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 9b7435f0dcd6..d21d5fefa76c 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c @@ -388,37 +388,28 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device return -ENXIO; } - usb_clk = clk_get(&pdev->dev, NULL); + usb_clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(usb_clk)) return PTR_ERR(usb_clk); hcd = usb_create_hcd (driver, &pdev->dev, "pxa27x"); - if (!hcd) { - retval = -ENOMEM; - goto err0; - } + if (!hcd) + return -ENOMEM; r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!r) { pr_err("no resource of IORESOURCE_MEM"); retval = -ENXIO; - goto err1; + goto err; } hcd->rsrc_start = r->start; hcd->rsrc_len = resource_size(r); - if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { - pr_debug("request_mem_region failed"); - retval = -EBUSY; - goto err1; - } - - hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - pr_debug("ioremap failed"); - retval = -ENOMEM; - goto err2; + hcd->regs = devm_ioremap_resource(&pdev->dev, r); + if (IS_ERR(hcd->regs)) { + retval = PTR_ERR(hcd->regs); + goto err; } /* initialize "struct pxa27x_ohci" */ @@ -429,7 +420,7 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device retval = pxa27x_start_hc(pxa_ohci, &pdev->dev); if (retval < 0) { pr_debug("pxa27x_start_hc failed"); - goto err3; + goto err; } /* Select Power Management Mode */ @@ -443,18 +434,14 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device ohci->num_ports = 3; retval = usb_add_hcd(hcd, irq, 0); - if (retval == 0) + if (retval == 0) { + device_wakeup_enable(hcd->self.controller); return retval; + } pxa27x_stop_hc(pxa_ohci, &pdev->dev); - err3: - iounmap(hcd->regs); - err2: - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - err1: + err: usb_put_hcd(hcd); - err0: - clk_put(usb_clk); return retval; } @@ -478,9 +465,6 @@ void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *pdev) usb_remove_hcd(hcd); pxa27x_stop_hc(pxa_ohci, &pdev->dev); - iounmap(hcd->regs); - release_mem_region(hcd->rsrc_start, hcd->rsrc_len); - clk_put(pxa_ohci->clk); usb_put_hcd(hcd); } diff --git a/drivers/usb/host/ohci-q.c b/drivers/usb/host/ohci-q.c index e7f577e63624..d4253e319428 100644 --- a/drivers/usb/host/ohci-q.c +++ b/drivers/usb/host/ohci-q.c @@ -68,10 +68,6 @@ __acquires(ohci->lock) break; } -#ifdef OHCI_VERBOSE_DEBUG - urb_print(urb, "RET", usb_pipeout (urb->pipe), status); -#endif - /* urb->complete() can reenter this HCD */ usb_hcd_unlink_urb_from_ep(ohci_to_hcd(ohci), urb); spin_unlock (&ohci->lock); @@ -147,7 +143,7 @@ static void periodic_link (struct ohci_hcd *ohci, struct ed *ed) { unsigned i; - ohci_vdbg (ohci, "link %sed %p branch %d [%dus.], interval %d\n", + ohci_dbg(ohci, "link %sed %p branch %d [%dus.], interval %d\n", (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", ed, ed->branch, ed->load, ed->interval); @@ -294,7 +290,7 @@ static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed) } ohci_to_hcd(ohci)->self.bandwidth_allocated -= ed->load / ed->interval; - ohci_vdbg (ohci, "unlink %sed %p branch %d [%dus.], interval %d\n", + ohci_dbg(ohci, "unlink %sed %p branch %d [%dus.], interval %d\n", (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", ed, ed->branch, ed->load, ed->interval); } @@ -765,7 +761,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td) urb->iso_frame_desc [td->index].status = cc_to_error [cc]; if (cc != TD_CC_NOERROR) - ohci_vdbg (ohci, + ohci_dbg(ohci, "urb %p iso td %p (%d) len %d cc %d\n", urb, td, 1 + td->index, dlen, cc); @@ -797,7 +793,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td) } if (cc != TD_CC_NOERROR && cc < 0x0E) - ohci_vdbg (ohci, + ohci_dbg(ohci, "urb %p td %p (%d) cc %d, len=%d/%d\n", urb, td, 1 + td->index, cc, urb->actual_length, diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index f90101b9cdb9..ff7c8f1c48fb 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c @@ -395,6 +395,7 @@ static int usb_hcd_s3c2410_probe(const struct hc_driver *driver, if (retval != 0) goto err_ioremap; + device_wakeup_enable(hcd->self.controller); return 0; err_ioremap: @@ -426,28 +427,15 @@ static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) static int ohci_hcd_s3c2410_drv_suspend(struct device *dev) { struct usb_hcd *hcd = dev_get_drvdata(dev); - struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct platform_device *pdev = to_platform_device(dev); - unsigned long flags; + bool do_wakeup = device_may_wakeup(dev); int rc = 0; - /* - * Root hub was already suspended. Disable irq emission and - * mark HW unaccessible, bail out if RH has been resumed. Use - * the spinlock to properly synchronize with possible pending - * RH suspend or resume activity. - */ - spin_lock_irqsave(&ohci->lock, flags); - if (ohci->rh_state != OHCI_RH_SUSPENDED) { - rc = -EINVAL; - goto bail; - } - - clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); + rc = ohci_suspend(hcd, do_wakeup); + if (rc) + return rc; s3c2410_stop_hc(pdev); -bail: - spin_unlock_irqrestore(&ohci->lock, flags); return rc; } diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index aa9e127bbe71..2ac266d692a2 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c @@ -211,8 +211,10 @@ static int ohci_hcd_sa1111_probe(struct sa1111_dev *dev) goto err2; ret = usb_add_hcd(hcd, dev->irq[1], 0); - if (ret == 0) + if (ret == 0) { + device_wakeup_enable(hcd->self.controller); return ret; + } sa1111_stop_hc(dev); err2: diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c index 2a5de5fecd8f..4e81c804c73e 100644 --- a/drivers/usb/host/ohci-sm501.c +++ b/drivers/usb/host/ohci-sm501.c @@ -168,6 +168,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev) retval = usb_add_hcd(hcd, irq, IRQF_SHARED); if (retval) goto err5; + device_wakeup_enable(hcd->self.controller); /* enable power and unmask interrupts */ diff --git a/drivers/usb/host/ohci-spear.c b/drivers/usb/host/ohci-spear.c index 6b02107d281d..8b29a0c04c23 100644 --- a/drivers/usb/host/ohci-spear.c +++ b/drivers/usb/host/ohci-spear.c @@ -81,17 +81,10 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) hcd->rsrc_start = pdev->resource[0].start; hcd->rsrc_len = resource_size(res); - if (!devm_request_mem_region(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len, - hcd_name)) { - dev_dbg(&pdev->dev, "request_mem_region failed\n"); - retval = -EBUSY; - goto err_put_hcd; - } - hcd->regs = devm_ioremap(&pdev->dev, hcd->rsrc_start, hcd->rsrc_len); - if (!hcd->regs) { - dev_dbg(&pdev->dev, "ioremap failed\n"); - retval = -ENOMEM; + hcd->regs = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(hcd->regs)) { + retval = PTR_ERR(hcd->regs); goto err_put_hcd; } @@ -103,8 +96,10 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) ohci = hcd_to_ohci(hcd); retval = usb_add_hcd(hcd, platform_get_irq(pdev, 0), 0); - if (retval == 0) + if (retval == 0) { + device_wakeup_enable(hcd->self.controller); return retval; + } clk_disable_unprepare(sohci_p->clk); err_put_hcd: @@ -129,20 +124,26 @@ static int spear_ohci_hcd_drv_remove(struct platform_device *pdev) } #if defined(CONFIG_PM) -static int spear_ohci_hcd_drv_suspend(struct platform_device *dev, +static int spear_ohci_hcd_drv_suspend(struct platform_device *pdev, pm_message_t message) { - struct usb_hcd *hcd = platform_get_drvdata(dev); + struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct spear_ohci *sohci_p = to_spear_ohci(hcd); + bool do_wakeup = device_may_wakeup(&pdev->dev); + int ret; if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; + ret = ohci_suspend(hcd, do_wakeup); + if (ret) + return ret; + clk_disable_unprepare(sohci_p->clk); - return 0; + return ret; } static int spear_ohci_hcd_drv_resume(struct platform_device *dev) diff --git a/drivers/usb/host/ohci-tilegx.c b/drivers/usb/host/ohci-tilegx.c index 22540ab71f55..0b183e0b0a8a 100644 --- a/drivers/usb/host/ohci-tilegx.c +++ b/drivers/usb/host/ohci-tilegx.c @@ -159,6 +159,7 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev) ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED); if (ret == 0) { platform_set_drvdata(pdev, hcd); + device_wakeup_enable(hcd->self.controller); return ret; } diff --git a/drivers/usb/host/ohci-tmio.c b/drivers/usb/host/ohci-tmio.c index ecb09a5ada9c..bb409588d39c 100644 --- a/drivers/usb/host/ohci-tmio.c +++ b/drivers/usb/host/ohci-tmio.c @@ -27,7 +27,6 @@ /*#include <linux/fs.h> #include <linux/mount.h> #include <linux/pagemap.h> -#include <linux/init.h> #include <linux/namei.h> #include <linux/sched.h>*/ #include <linux/platform_device.h> @@ -250,6 +249,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev) if (ret) goto err_add_hcd; + device_wakeup_enable(hcd->self.controller); if (ret == 0) return ret; diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h index e2e5faa5a402..9250cada13f0 100644 --- a/drivers/usb/host/ohci.h +++ b/drivers/usb/host/ohci.h @@ -415,12 +415,11 @@ struct ohci_hcd { struct ed *ed_to_check; unsigned zf_delay; -#ifdef DEBUG struct dentry *debug_dir; struct dentry *debug_async; struct dentry *debug_periodic; struct dentry *debug_registers; -#endif + /* platform-specific data -- must come last */ unsigned long priv[0] __aligned(sizeof(s64)); @@ -474,10 +473,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci) /*-------------------------------------------------------------------------*/ -#ifndef DEBUG -#define STUB_DEBUG_FILES -#endif /* DEBUG */ - #define ohci_dbg(ohci, fmt, args...) \ dev_dbg (ohci_to_hcd(ohci)->self.controller , fmt , ## args ) #define ohci_err(ohci, fmt, args...) \ @@ -487,12 +482,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci) #define ohci_warn(ohci, fmt, args...) \ dev_warn (ohci_to_hcd(ohci)->self.controller , fmt , ## args ) -#ifdef OHCI_VERBOSE_DEBUG -# define ohci_vdbg ohci_dbg -#else -# define ohci_vdbg(ohci, fmt, args...) do { } while (0) -#endif - /*-------------------------------------------------------------------------*/ /* diff --git a/drivers/usb/host/oxu210hp-hcd.c b/drivers/usb/host/oxu210hp-hcd.c index 4a6df2d8f902..e07248b6ab67 100644 --- a/drivers/usb/host/oxu210hp-hcd.c +++ b/drivers/usb/host/oxu210hp-hcd.c @@ -29,7 +29,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -60,6 +59,10 @@ #define oxu_info(oxu, fmt, args...) \ dev_info(oxu_to_hcd(oxu)->self.controller , fmt , ## args) +#ifdef CONFIG_DYNAMIC_DEBUG +#define DEBUG +#endif + static inline struct usb_hcd *oxu_to_hcd(struct oxu_hcd *oxu) { return container_of((void *) oxu, struct usb_hcd, hcd_priv); @@ -3747,6 +3750,7 @@ static struct usb_hcd *oxu_create(struct platform_device *pdev, if (ret < 0) return ERR_PTR(ret); + device_wakeup_enable(hcd->self.controller); return hcd; } diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index dfbdd3aefe98..00661d305143 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -12,7 +12,6 @@ #include <linux/kconfig.h> #include <linux/kernel.h> #include <linux/pci.h> -#include <linux/init.h> #include <linux/delay.h> #include <linux/export.h> #include <linux/acpi.h> diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 2ad004ae747c..c6c325e4d80d 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c @@ -27,7 +27,6 @@ #include <linux/kernel.h> #include <linux/sched.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/delay.h> #include <linux/list.h> @@ -2514,6 +2513,7 @@ static int r8a66597_probe(struct platform_device *pdev) dev_err(&pdev->dev, "Failed to add hcd\n"); goto clean_up3; } + device_wakeup_enable(hcd->self.controller); return 0; @@ -2534,7 +2534,7 @@ static struct platform_driver r8a66597_driver = { .probe = r8a66597_probe, .remove = r8a66597_remove, .driver = { - .name = (char *) hcd_name, + .name = hcd_name, .owner = THIS_MODULE, .pm = R8A66597_DEV_PM_OPS, }, diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 79620c39217e..a517151867af 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c @@ -39,7 +39,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/timer.h> #include <linux/list.h> #include <linux/interrupt.h> @@ -1732,6 +1731,8 @@ sl811h_probe(struct platform_device *dev) if (retval != 0) goto err6; + device_wakeup_enable(hcd->self.controller); + create_debug_file(sl811); return retval; diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index 469564e57a52..88a9bffe93df 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c @@ -12,7 +12,6 @@ #include <linux/kernel.h> #include <linux/module.h> -#include <linux/init.h> #include <linux/ptrace.h> #include <linux/slab.h> #include <linux/string.h> diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index e402beb5a069..c0671750671f 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c @@ -3133,6 +3133,7 @@ static int u132_probe(struct platform_device *pdev) u132_u132_put_kref(u132); return retval; } else { + device_wakeup_enable(hcd->self.controller); u132_monitor_queue_work(u132, 100); return 0; } @@ -3217,7 +3218,7 @@ static struct platform_driver u132_platform_driver = { .suspend = u132_suspend, .resume = u132_resume, .driver = { - .name = (char *)hcd_name, + .name = hcd_name, .owner = THIS_MODULE, }, }; diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index 8e239cdd95d5..1b28a000d5c6 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c @@ -20,7 +20,7 @@ static struct dentry *uhci_debugfs_root; -#ifdef DEBUG +#ifdef CONFIG_DYNAMIC_DEBUG /* Handle REALLY large printks so we don't overflow buffers */ static void lprintk(char *buf) @@ -635,7 +635,7 @@ static const struct file_operations uhci_debug_operations = { #endif /* CONFIG_DEBUG_FS */ -#else /* DEBUG */ +#else /* CONFIG_DYNAMIC_DEBUG*/ static inline void lprintk(char *buf) {} diff --git a/drivers/usb/host/uhci-grlib.c b/drivers/usb/host/uhci-grlib.c index 53c23ff7d685..ab25dc397e8b 100644 --- a/drivers/usb/host/uhci-grlib.c +++ b/drivers/usb/host/uhci-grlib.c @@ -141,6 +141,7 @@ static int uhci_hcd_grlib_probe(struct platform_device *op) if (rv) goto err_uhci; + device_wakeup_enable(hcd->self.controller); return 0; err_uhci: diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 4a86b63745b8..27f35e8f161b 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -69,18 +69,21 @@ MODULE_PARM_DESC(ignore_oc, "ignore hardware overcurrent indications"); * show all queues in /sys/kernel/debug/uhci/[pci_addr] * debug = 3, show all TDs in URBs when dumping */ -#ifdef DEBUG -#define DEBUG_CONFIGURED 1 +#ifdef CONFIG_DYNAMIC_DEBUG + static int debug = 1; module_param(debug, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(debug, "Debug level"); +static char *errbuf; #else -#define DEBUG_CONFIGURED 0 -#define debug 0 + +#define debug 0 +#define errbuf NULL + #endif -static char *errbuf; + #define ERRBUF_LEN (32 * 1024) static struct kmem_cache *uhci_up_cachep; /* urb_priv */ @@ -516,13 +519,12 @@ static void release_uhci(struct uhci_hcd *uhci) { int i; - if (DEBUG_CONFIGURED) { - spin_lock_irq(&uhci->lock); - uhci->is_initialized = 0; - spin_unlock_irq(&uhci->lock); - debugfs_remove(uhci->dentry); - } + spin_lock_irq(&uhci->lock); + uhci->is_initialized = 0; + spin_unlock_irq(&uhci->lock); + + debugfs_remove(uhci->dentry); for (i = 0; i < UHCI_NUM_SKELQH; i++) uhci_free_qh(uhci, uhci->skelqh[i]); @@ -868,14 +870,14 @@ static int __init uhci_hcd_init(void) ignore_oc ? ", overcurrent ignored" : ""); set_bit(USB_UHCI_LOADED, &usb_hcds_loaded); - if (DEBUG_CONFIGURED) { - errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL); - if (!errbuf) - goto errbuf_failed; - uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root); - if (!uhci_debugfs_root) - goto debug_failed; - } +#ifdef CONFIG_DYNAMIC_DEBUG + errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL); + if (!errbuf) + goto errbuf_failed; + uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root); + if (!uhci_debugfs_root) + goto debug_failed; +#endif uhci_up_cachep = kmem_cache_create("uhci_urb_priv", sizeof(struct urb_priv), 0, 0, NULL); @@ -906,12 +908,14 @@ clean0: kmem_cache_destroy(uhci_up_cachep); up_failed: +#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) debugfs_remove(uhci_debugfs_root); debug_failed: kfree(errbuf); errbuf_failed: +#endif clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded); return retval; @@ -927,7 +931,9 @@ static void __exit uhci_hcd_cleanup(void) #endif kmem_cache_destroy(uhci_up_cachep); debugfs_remove(uhci_debugfs_root); +#ifdef CONFIG_DYNAMIC_DEBUG kfree(errbuf); +#endif clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded); } diff --git a/drivers/usb/host/uhci-pci.c b/drivers/usb/host/uhci-pci.c index 4cd79888804b..940304c33224 100644 --- a/drivers/usb/host/uhci-pci.c +++ b/drivers/usb/host/uhci-pci.c @@ -279,7 +279,7 @@ static const struct hc_driver uhci_driver = { .hub_control = uhci_hub_control, }; -static DEFINE_PCI_DEVICE_TABLE(uhci_pci_ids) = { { +static const struct pci_device_id uhci_pci_ids[] = { { /* handle any USB UHCI controller */ PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), .driver_data = (unsigned long) &uhci_driver, diff --git a/drivers/usb/host/uhci-platform.c b/drivers/usb/host/uhci-platform.c index 3003fefaa964..44e6c9da8892 100644 --- a/drivers/usb/host/uhci-platform.c +++ b/drivers/usb/host/uhci-platform.c @@ -108,6 +108,7 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev) if (ret) goto err_uhci; + device_wakeup_enable(hcd->self.controller); return 0; err_uhci: diff --git a/drivers/usb/host/whci/hcd.c b/drivers/usb/host/whci/hcd.c index 1b0888f8da9a..d7b363a418de 100644 --- a/drivers/usb/host/whci/hcd.c +++ b/drivers/usb/host/whci/hcd.c @@ -293,6 +293,7 @@ static int whc_probe(struct umc_dev *umc) dev_err(dev, "cannot add HCD: %d\n", ret); goto error_usb_add_hcd; } + device_wakeup_enable(usb_hcd->self.controller); ret = wusbhc_b_create(wusbhc); if (ret) { diff --git a/drivers/usb/host/whci/int.c b/drivers/usb/host/whci/int.c index 6aae70028101..0c086b2790d1 100644 --- a/drivers/usb/host/whci/int.c +++ b/drivers/usb/host/whci/int.c @@ -16,7 +16,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/uwb/umc.h> #include "../../wusbcore/wusbhc.h" diff --git a/drivers/usb/host/whci/wusb.c b/drivers/usb/host/whci/wusb.c index f24efdebad17..8d2762682869 100644 --- a/drivers/usb/host/whci/wusb.c +++ b/drivers/usb/host/whci/wusb.c @@ -16,7 +16,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/uwb/umc.h> #include "../../wusbcore/wusbhc.h" diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 73503a81ee81..b016d38199f2 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -32,7 +32,7 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, "// xHCI capability registers at %p:\n", xhci->cap_regs); - temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); + temp = readl(&xhci->cap_regs->hc_capbase); xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n", &xhci->cap_regs->hc_capbase, temp); xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n", @@ -44,13 +44,13 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs); - temp = xhci_readl(xhci, &xhci->cap_regs->run_regs_off); + temp = readl(&xhci->cap_regs->run_regs_off); xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n", &xhci->cap_regs->run_regs_off, (unsigned int) temp & RTSOFF_MASK); xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs); - temp = xhci_readl(xhci, &xhci->cap_regs->db_off); + temp = readl(&xhci->cap_regs->db_off); xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba); } @@ -61,7 +61,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs); - temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); + temp = readl(&xhci->cap_regs->hc_capbase); xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n", (unsigned int) temp); xhci_dbg(xhci, "CAPLENGTH: 0x%x\n", @@ -69,7 +69,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, "HCIVERSION: 0x%x\n", (unsigned int) HC_VERSION(temp)); - temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params1); + temp = readl(&xhci->cap_regs->hcs_params1); xhci_dbg(xhci, "HCSPARAMS 1: 0x%x\n", (unsigned int) temp); xhci_dbg(xhci, " Max device slots: %u\n", @@ -79,7 +79,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, " Max ports: %u\n", (unsigned int) HCS_MAX_PORTS(temp)); - temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params2); + temp = readl(&xhci->cap_regs->hcs_params2); xhci_dbg(xhci, "HCSPARAMS 2: 0x%x\n", (unsigned int) temp); xhci_dbg(xhci, " Isoc scheduling threshold: %u\n", @@ -87,7 +87,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, " Maximum allowed segments in event ring: %u\n", (unsigned int) HCS_ERST_MAX(temp)); - temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); + temp = readl(&xhci->cap_regs->hcs_params3); xhci_dbg(xhci, "HCSPARAMS 3 0x%x:\n", (unsigned int) temp); xhci_dbg(xhci, " Worst case U1 device exit latency: %u\n", @@ -95,14 +95,14 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) xhci_dbg(xhci, " Worst case U2 device exit latency: %u\n", (unsigned int) HCS_U2_LATENCY(temp)); - temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params); + temp = readl(&xhci->cap_regs->hcc_params); xhci_dbg(xhci, "HCC PARAMS 0x%x:\n", (unsigned int) temp); xhci_dbg(xhci, " HC generates %s bit addresses\n", HCC_64BIT_ADDR(temp) ? "64" : "32"); /* FIXME */ xhci_dbg(xhci, " FIXME: more HCCPARAMS debugging\n"); - temp = xhci_readl(xhci, &xhci->cap_regs->run_regs_off); + temp = readl(&xhci->cap_regs->run_regs_off); xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK); } @@ -110,7 +110,7 @@ static void xhci_print_command_reg(struct xhci_hcd *xhci) { u32 temp; - temp = xhci_readl(xhci, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); xhci_dbg(xhci, "USBCMD 0x%x:\n", temp); xhci_dbg(xhci, " HC is %s\n", (temp & CMD_RUN) ? "running" : "being stopped"); @@ -128,7 +128,7 @@ static void xhci_print_status(struct xhci_hcd *xhci) { u32 temp; - temp = xhci_readl(xhci, &xhci->op_regs->status); + temp = readl(&xhci->op_regs->status); xhci_dbg(xhci, "USBSTS 0x%x:\n", temp); xhci_dbg(xhci, " Event ring is %sempty\n", (temp & STS_EINT) ? "not " : ""); @@ -163,7 +163,7 @@ static void xhci_print_ports(struct xhci_hcd *xhci) for (j = 0; j < NUM_PORT_REGS; ++j) { xhci_dbg(xhci, "%p port %s reg = 0x%x\n", addr, names[j], - (unsigned int) xhci_readl(xhci, addr)); + (unsigned int) readl(addr)); addr++; } } @@ -177,7 +177,7 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) u64 temp_64; addr = &ir_set->irq_pending; - temp = xhci_readl(xhci, addr); + temp = readl(addr); if (temp == XHCI_INIT_VALUE) return; @@ -187,28 +187,28 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) (unsigned int)temp); addr = &ir_set->irq_control; - temp = xhci_readl(xhci, addr); + temp = readl(addr); xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_size; - temp = xhci_readl(xhci, addr); + temp = readl(addr); xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->rsvd; - temp = xhci_readl(xhci, addr); + temp = readl(addr); if (temp != XHCI_INIT_VALUE) xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_base; - temp_64 = xhci_read_64(xhci, addr); + temp_64 = readq(addr); xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n", addr, temp_64); addr = &ir_set->erst_dequeue; - temp_64 = xhci_read_64(xhci, addr); + temp_64 = readq(addr); xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n", addr, temp_64); } @@ -219,12 +219,12 @@ void xhci_print_run_regs(struct xhci_hcd *xhci) int i; xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs); - temp = xhci_readl(xhci, &xhci->run_regs->microframe_index); + temp = readl(&xhci->run_regs->microframe_index); xhci_dbg(xhci, " %p: Microframe index = 0x%x\n", &xhci->run_regs->microframe_index, (unsigned int) temp); for (i = 0; i < 7; ++i) { - temp = xhci_readl(xhci, &xhci->run_regs->rsvd[i]); + temp = readl(&xhci->run_regs->rsvd[i]); if (temp != XHCI_INIT_VALUE) xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n", &xhci->run_regs->rsvd[i], @@ -412,7 +412,7 @@ void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci) { u64 val; - val = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); + val = readq(&xhci->op_regs->cmd_ring); xhci_dbg(xhci, "// xHC command ring deq ptr low bits + flags = @%08x\n", lower_32_bits(val)); xhci_dbg(xhci, "// xHC command ring deq ptr high bits = @%08x\n", diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 805f2348eeba..9992fbfec85f 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -94,7 +94,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, */ memset(port_removable, 0, sizeof(port_removable)); for (i = 0; i < ports; i++) { - portsc = xhci_readl(xhci, xhci->usb2_ports[i]); + portsc = readl(xhci->usb2_ports[i]); /* If a device is removable, PORTSC reports a 0, same as in the * hub descriptor DeviceRemovable bits. */ @@ -148,7 +148,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, port_removable = 0; /* bit 0 is reserved, bit 1 is for port 1, etc. */ for (i = 0; i < ports; i++) { - portsc = xhci_readl(xhci, xhci->usb3_ports[i]); + portsc = readl(xhci->usb3_ports[i]); if (portsc & PORT_DEV_REMOVE) port_removable |= 1 << (i + 1); } @@ -342,8 +342,8 @@ static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, } /* Write 1 to disable the port */ - xhci_writel(xhci, port_status | PORT_PE, addr); - port_status = xhci_readl(xhci, addr); + writel(port_status | PORT_PE, addr); + port_status = readl(addr); xhci_dbg(xhci, "disable port, actual port %d status = 0x%x\n", wIndex, port_status); } @@ -388,8 +388,8 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, return; } /* Change bits are all write 1 to clear */ - xhci_writel(xhci, port_status | status, addr); - port_status = xhci_readl(xhci, addr); + writel(port_status | status, addr); + port_status = readl(addr); xhci_dbg(xhci, "clear port %s change, actual port %d status = 0x%x\n", port_change_bit, wIndex, port_status); } @@ -415,11 +415,11 @@ void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, { u32 temp; - temp = xhci_readl(xhci, port_array[port_id]); + temp = readl(port_array[port_id]); temp = xhci_port_state_to_neutral(temp); temp &= ~PORT_PLS_MASK; temp |= PORT_LINK_STROBE | link_state; - xhci_writel(xhci, temp, port_array[port_id]); + writel(temp, port_array[port_id]); } static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, @@ -427,7 +427,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, { u32 temp; - temp = xhci_readl(xhci, port_array[port_id]); + temp = readl(port_array[port_id]); temp = xhci_port_state_to_neutral(temp); if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT) @@ -445,7 +445,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, else temp &= ~PORT_WKOC_E; - xhci_writel(xhci, temp, port_array[port_id]); + writel(temp, port_array[port_id]); } /* Test and clear port RWC bit */ @@ -454,11 +454,11 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, { u32 temp; - temp = xhci_readl(xhci, port_array[port_id]); + temp = readl(port_array[port_id]); if (temp & port_bit) { temp = xhci_port_state_to_neutral(temp); temp |= port_bit; - xhci_writel(xhci, temp, port_array[port_id]); + writel(temp, port_array[port_id]); } } @@ -623,8 +623,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, } xhci_ring_device(xhci, slot_id); } else { - int port_status = xhci_readl(xhci, - port_array[wIndex]); + int port_status = readl(port_array[wIndex]); xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n", XHCI_MAX_REXIT_TIMEOUT, port_status); @@ -733,12 +732,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, /* Set the U1 and U2 exit latencies. */ memcpy(buf, &usb_bos_descriptor, USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE); - temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); + temp = readl(&xhci->cap_regs->hcs_params3); buf[12] = HCS_U1_LATENCY(temp); put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]); /* Indicate whether the host has LTM support. */ - temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params); + temp = readl(&xhci->cap_regs->hcc_params); if (HCC_LTC(temp)) buf[8] |= USB_LTM_SUPPORT; @@ -748,7 +747,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, if (!wIndex || wIndex > max_ports) goto error; wIndex--; - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if (temp == 0xffffffff) { retval = -ENODEV; break; @@ -775,7 +774,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, if (!wIndex || wIndex > max_ports) goto error; wIndex--; - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if (temp == 0xffffffff) { retval = -ENODEV; break; @@ -784,7 +783,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, /* FIXME: What new port features do we need to support? */ switch (wValue) { case USB_PORT_FEAT_SUSPEND: - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if ((temp & PORT_PLS_MASK) != XDEV_U0) { /* Resume the port to U0 first */ xhci_set_link_state(xhci, port_array, wIndex, @@ -797,7 +796,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, * a port unless the port reports that it is in the * enabled (PED = ‘1’,PLS < ‘3’) state. */ - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) || (temp & PORT_PLS_MASK) >= XDEV_U3) { xhci_warn(xhci, "USB core suspending device " @@ -822,11 +821,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, msleep(10); /* wait device to enter */ spin_lock_irqsave(&xhci->lock, flags); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); bus_state->suspended_ports |= 1 << wIndex; break; case USB_PORT_FEAT_LINK_STATE: - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); /* Disable port */ if (link_state == USB_SS_PORT_LS_SS_DISABLED) { @@ -839,9 +838,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp |= PORT_CSC | PORT_PEC | PORT_WRC | PORT_OCC | PORT_RC | PORT_PLC | PORT_CEC; - xhci_writel(xhci, temp | PORT_PE, - port_array[wIndex]); - temp = xhci_readl(xhci, port_array[wIndex]); + writel(temp | PORT_PE, port_array[wIndex]); + temp = readl(port_array[wIndex]); break; } @@ -850,7 +848,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, xhci_dbg(xhci, "Enable port %d\n", wIndex); xhci_set_link_state(xhci, port_array, wIndex, link_state); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); break; } @@ -884,7 +882,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, msleep(20); /* wait device to enter */ spin_lock_irqsave(&xhci->lock, flags); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if (link_state == USB_SS_PORT_LS_U3) bus_state->suspended_ports |= 1 << wIndex; break; @@ -895,10 +893,9 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, * However, khubd will ignore the roothub events until * the roothub is registered. */ - xhci_writel(xhci, temp | PORT_POWER, - port_array[wIndex]); + writel(temp | PORT_POWER, port_array[wIndex]); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); xhci_dbg(xhci, "set port power, actual port %d status = 0x%x\n", wIndex, temp); spin_unlock_irqrestore(&xhci->lock, flags); @@ -911,52 +908,52 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, break; case USB_PORT_FEAT_RESET: temp = (temp | PORT_RESET); - xhci_writel(xhci, temp, port_array[wIndex]); + writel(temp, port_array[wIndex]); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); break; case USB_PORT_FEAT_REMOTE_WAKE_MASK: xhci_set_remote_wake_mask(xhci, port_array, wIndex, wake_mask); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); xhci_dbg(xhci, "set port remote wake mask, " "actual port %d status = 0x%x\n", wIndex, temp); break; case USB_PORT_FEAT_BH_PORT_RESET: temp |= PORT_WR; - xhci_writel(xhci, temp, port_array[wIndex]); + writel(temp, port_array[wIndex]); - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); break; case USB_PORT_FEAT_U1_TIMEOUT: if (hcd->speed != HCD_USB3) goto error; - temp = xhci_readl(xhci, port_array[wIndex] + PORTPMSC); + temp = readl(port_array[wIndex] + PORTPMSC); temp &= ~PORT_U1_TIMEOUT_MASK; temp |= PORT_U1_TIMEOUT(timeout); - xhci_writel(xhci, temp, port_array[wIndex] + PORTPMSC); + writel(temp, port_array[wIndex] + PORTPMSC); break; case USB_PORT_FEAT_U2_TIMEOUT: if (hcd->speed != HCD_USB3) goto error; - temp = xhci_readl(xhci, port_array[wIndex] + PORTPMSC); + temp = readl(port_array[wIndex] + PORTPMSC); temp &= ~PORT_U2_TIMEOUT_MASK; temp |= PORT_U2_TIMEOUT(timeout); - xhci_writel(xhci, temp, port_array[wIndex] + PORTPMSC); + writel(temp, port_array[wIndex] + PORTPMSC); break; default: goto error; } /* unblock any posted writes */ - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); break; case ClearPortFeature: if (!wIndex || wIndex > max_ports) goto error; wIndex--; - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); if (temp == 0xffffffff) { retval = -ENODEV; break; @@ -965,7 +962,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, temp = xhci_port_state_to_neutral(temp); switch (wValue) { case USB_PORT_FEAT_SUSPEND: - temp = xhci_readl(xhci, port_array[wIndex]); + temp = readl(port_array[wIndex]); xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n"); xhci_dbg(xhci, "PORTSC %04x\n", temp); if (temp & PORT_RESET) @@ -1008,8 +1005,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, port_array[wIndex], temp); break; case USB_PORT_FEAT_POWER: - xhci_writel(xhci, temp & ~PORT_POWER, - port_array[wIndex]); + writel(temp & ~PORT_POWER, port_array[wIndex]); spin_unlock_irqrestore(&xhci->lock, flags); temp = usb_acpi_power_manageable(hcd->self.root_hub, @@ -1070,7 +1066,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) spin_lock_irqsave(&xhci->lock, flags); /* For each port, did anything change? If so, set that bit in buf. */ for (i = 0; i < max_ports; i++) { - temp = xhci_readl(xhci, port_array[i]); + temp = readl(port_array[i]); if (temp == 0xffffffff) { retval = -ENODEV; break; @@ -1124,7 +1120,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) u32 t1, t2; int slot_id; - t1 = xhci_readl(xhci, port_array[port_index]); + t1 = readl(port_array[port_index]); t2 = xhci_port_state_to_neutral(t1); if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) { @@ -1157,7 +1153,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) t1 = xhci_port_state_to_neutral(t1); if (t1 != t2) - xhci_writel(xhci, t2, port_array[port_index]); + writel(t2, port_array[port_index]); } hcd->state = HC_STATE_SUSPENDED; bus_state->next_statechange = jiffies + msecs_to_jiffies(10); @@ -1187,9 +1183,9 @@ int xhci_bus_resume(struct usb_hcd *hcd) } /* delay the irqs */ - temp = xhci_readl(xhci, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); temp &= ~CMD_EIE; - xhci_writel(xhci, temp, &xhci->op_regs->command); + writel(temp, &xhci->op_regs->command); port_index = max_ports; while (port_index--) { @@ -1198,7 +1194,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) u32 temp; int slot_id; - temp = xhci_readl(xhci, port_array[port_index]); + temp = readl(port_array[port_index]); if (DEV_SUPERSPEED(temp)) temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS); else @@ -1235,17 +1231,17 @@ int xhci_bus_resume(struct usb_hcd *hcd) if (slot_id) xhci_ring_device(xhci, slot_id); } else - xhci_writel(xhci, temp, port_array[port_index]); + writel(temp, port_array[port_index]); } - (void) xhci_readl(xhci, &xhci->op_regs->command); + (void) readl(&xhci->op_regs->command); bus_state->next_statechange = jiffies + msecs_to_jiffies(5); /* re-enable irqs */ - temp = xhci_readl(xhci, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); temp |= CMD_EIE; - xhci_writel(xhci, temp, &xhci->op_regs->command); - temp = xhci_readl(xhci, &xhci->op_regs->command); + writel(temp, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); spin_unlock_irqrestore(&xhci->lock, flags); return 0; diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 49b8bd063fab..873c272b3ef5 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -57,7 +57,7 @@ static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, /* If the cycle state is 0, set the cycle bit to 1 for all the TRBs */ if (cycle_state == 0) { for (i = 0; i < TRBS_PER_SEGMENT; i++) - seg->trbs[i].link.control |= TRB_CYCLE; + seg->trbs[i].link.control |= cpu_to_le32(TRB_CYCLE); } seg->dma = dma; seg->next = NULL; @@ -308,7 +308,8 @@ static void xhci_reinit_cached_ring(struct xhci_hcd *xhci, sizeof(union xhci_trb)*TRBS_PER_SEGMENT); if (cycle_state == 0) { for (i = 0; i < TRBS_PER_SEGMENT; i++) - seg->trbs[i].link.control |= TRB_CYCLE; + seg->trbs[i].link.control |= + cpu_to_le32(TRB_CYCLE); } /* All endpoint rings have link TRBs */ xhci_link_segments(xhci, seg, seg->next, type); @@ -432,10 +433,10 @@ static void xhci_free_stream_ctx(struct xhci_hcd *xhci, unsigned int num_stream_ctxs, struct xhci_stream_ctx *stream_ctx, dma_addr_t dma) { - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); + struct device *dev = xhci_to_hcd(xhci)->self.controller; if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE) - dma_free_coherent(&pdev->dev, + dma_free_coherent(dev, sizeof(struct xhci_stream_ctx)*num_stream_ctxs, stream_ctx, dma); else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE) @@ -460,10 +461,10 @@ static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci, unsigned int num_stream_ctxs, dma_addr_t *dma, gfp_t mem_flags) { - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); + struct device *dev = xhci_to_hcd(xhci)->self.controller; if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE) - return dma_alloc_coherent(&pdev->dev, + return dma_alloc_coherent(dev, sizeof(struct xhci_stream_ctx)*num_stream_ctxs, dma, mem_flags); else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE) @@ -721,8 +722,7 @@ void xhci_free_stream_info(struct xhci_hcd *xhci, stream_info->stream_ctx_array, stream_info->ctx_array_dma); - if (stream_info) - kfree(stream_info->stream_rings); + kfree(stream_info->stream_rings); kfree(stream_info); } @@ -1616,7 +1616,7 @@ static void scratchpad_free(struct xhci_hcd *xhci) { int num_sp; int i; - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); + struct device *dev = xhci_to_hcd(xhci)->self.controller; if (!xhci->scratchpad) return; @@ -1624,13 +1624,13 @@ static void scratchpad_free(struct xhci_hcd *xhci) num_sp = HCS_MAX_SCRATCHPAD(xhci->hcs_params2); for (i = 0; i < num_sp; i++) { - dma_free_coherent(&pdev->dev, xhci->page_size, + dma_free_coherent(dev, xhci->page_size, xhci->scratchpad->sp_buffers[i], xhci->scratchpad->sp_dma_buffers[i]); } kfree(xhci->scratchpad->sp_dma_buffers); kfree(xhci->scratchpad->sp_buffers); - dma_free_coherent(&pdev->dev, num_sp * sizeof(u64), + dma_free_coherent(dev, num_sp * sizeof(u64), xhci->scratchpad->sp_array, xhci->scratchpad->sp_dma); kfree(xhci->scratchpad); @@ -1692,7 +1692,7 @@ void xhci_free_command(struct xhci_hcd *xhci, void xhci_mem_cleanup(struct xhci_hcd *xhci) { - struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); + struct device *dev = xhci_to_hcd(xhci)->self.controller; struct xhci_cd *cur_cd, *next_cd; int size; int i, j, num_ports; @@ -1700,7 +1700,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) /* Free the Event Ring Segment Table and the actual Event Ring */ size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); if (xhci->erst.entries) - dma_free_coherent(&pdev->dev, size, + dma_free_coherent(dev, size, xhci->erst.entries, xhci->erst.erst_dma_addr); xhci->erst.entries = NULL; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed ERST"); @@ -1748,7 +1748,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) "Freed medium stream array pool"); if (xhci->dcbaa) - dma_free_coherent(&pdev->dev, sizeof(*xhci->dcbaa), + dma_free_coherent(dev, sizeof(*xhci->dcbaa), xhci->dcbaa, xhci->dcbaa->dma); xhci->dcbaa = NULL; @@ -1958,7 +1958,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) xhci_warn(xhci, "WARN something wrong with SW event ring " "dequeue ptr.\n"); /* Update HC event ring dequeue pointer */ - temp = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); + temp = readq(&xhci->ir_set->erst_dequeue); temp &= ERST_PTR_MASK; /* Don't clear the EHB bit (which is RW1C) because * there might be more events to service. @@ -1967,7 +1967,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Write event ring dequeue pointer, " "preserving EHB bit"); - xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | temp, + writeq(((u64) deq & (u64) ~ERST_PTR_MASK) | temp, &xhci->ir_set->erst_dequeue); } @@ -1986,7 +1986,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, } /* Port offset and count in the third dword, see section 7.2 */ - temp = xhci_readl(xhci, addr + 2); + temp = readl(addr + 2); port_offset = XHCI_EXT_PORT_OFF(temp); port_count = XHCI_EXT_PORT_COUNT(temp); xhci_dbg_trace(xhci, trace_xhci_dbg_init, @@ -2069,7 +2069,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) int cap_count = 0; addr = &xhci->cap_regs->hcc_params; - offset = XHCI_HCC_EXT_CAPS(xhci_readl(xhci, addr)); + offset = XHCI_HCC_EXT_CAPS(readl(addr)); if (offset == 0) { xhci_err(xhci, "No Extended Capability registers, " "unable to set up roothub.\n"); @@ -2106,7 +2106,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) /* count extended protocol capability entries for later caching */ do { u32 cap_id; - cap_id = xhci_readl(xhci, tmp_addr); + cap_id = readl(tmp_addr); if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL) cap_count++; tmp_offset = XHCI_EXT_CAPS_NEXT(cap_id); @@ -2120,7 +2120,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) while (1) { u32 cap_id; - cap_id = xhci_readl(xhci, addr); + cap_id = readl(addr); if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL) xhci_add_in_port(xhci, num_ports, addr, (u8) XHCI_EXT_PORT_MAJOR(cap_id), @@ -2224,7 +2224,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) INIT_LIST_HEAD(&xhci->cancel_cmd_list); - page_size = xhci_readl(xhci, &xhci->op_regs->page_size); + page_size = readl(&xhci->op_regs->page_size); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Supported page size register = 0x%x", page_size); for (i = 0; i < 16; i++) { @@ -2247,14 +2247,14 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) * Program the Number of Device Slots Enabled field in the CONFIG * register with the max value of slots the HC can handle. */ - val = HCS_MAX_SLOTS(xhci_readl(xhci, &xhci->cap_regs->hcs_params1)); + val = HCS_MAX_SLOTS(readl(&xhci->cap_regs->hcs_params1)); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// xHC can handle at most %d device slots.", val); - val2 = xhci_readl(xhci, &xhci->op_regs->config_reg); + val2 = readl(&xhci->op_regs->config_reg); val |= (val2 & ~HCS_SLOTS_MASK); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Setting Max device slots reg = 0x%x.", val); - xhci_writel(xhci, val, &xhci->op_regs->config_reg); + writel(val, &xhci->op_regs->config_reg); /* * Section 5.4.8 - doorbell array must be @@ -2269,7 +2269,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Device context base array address = 0x%llx (DMA), %p (virt)", (unsigned long long)xhci->dcbaa->dma, xhci->dcbaa); - xhci_write_64(xhci, dma, &xhci->op_regs->dcbaa_ptr); + writeq(dma, &xhci->op_regs->dcbaa_ptr); /* * Initialize the ring segment pool. The ring must be a contiguous @@ -2312,13 +2312,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) (unsigned long long)xhci->cmd_ring->first_seg->dma); /* Set the address in the Command Ring Control register */ - val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); + val_64 = readq(&xhci->op_regs->cmd_ring); val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) | (xhci->cmd_ring->first_seg->dma & (u64) ~CMD_RING_RSVD_BITS) | xhci->cmd_ring->cycle_state; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Setting command ring address to 0x%x", val); - xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring); + writeq(val_64, &xhci->op_regs->cmd_ring); xhci_dbg_cmd_ptrs(xhci); xhci->lpm_command = xhci_alloc_command(xhci, true, true, flags); @@ -2331,7 +2331,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) */ xhci->cmd_ring_reserved_trbs++; - val = xhci_readl(xhci, &xhci->cap_regs->db_off); + val = readl(&xhci->cap_regs->db_off); val &= DBOFF_MASK; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Doorbell array is located at offset 0x%x" @@ -2382,13 +2382,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) } /* set ERST count with the number of entries in the segment table */ - val = xhci_readl(xhci, &xhci->ir_set->erst_size); + val = readl(&xhci->ir_set->erst_size); val &= ERST_SIZE_MASK; val |= ERST_NUM_SEGS; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Write ERST size = %i to ir_set 0 (some bits preserved)", val); - xhci_writel(xhci, val, &xhci->ir_set->erst_size); + writel(val, &xhci->ir_set->erst_size); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Set ERST entries to point to event ring."); @@ -2396,10 +2396,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Set ERST base address for ir_set 0 = 0x%llx", (unsigned long long)xhci->erst.erst_dma_addr); - val_64 = xhci_read_64(xhci, &xhci->ir_set->erst_base); + val_64 = readq(&xhci->ir_set->erst_base); val_64 &= ERST_PTR_MASK; val_64 |= (xhci->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK); - xhci_write_64(xhci, val_64, &xhci->ir_set->erst_base); + writeq(val_64, &xhci->ir_set->erst_base); /* Set the event ring dequeue address */ xhci_set_hc_event_deq(xhci); @@ -2431,10 +2431,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) * is necessary for allowing USB 3.0 devices to do remote wakeup from * U3 (device suspend). */ - temp = xhci_readl(xhci, &xhci->op_regs->dev_notification); + temp = readl(&xhci->op_regs->dev_notification); temp &= ~DEV_NOTE_MASK; temp |= DEV_NOTE_FWAKE; - xhci_writel(xhci, temp, &xhci->op_regs->dev_notification); + writel(temp, &xhci->op_regs->dev_notification); return 0; diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 73f5208714a4..3c898c12a06b 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c @@ -336,6 +336,7 @@ static const struct hc_driver xhci_pci_hc_driver = { .check_bandwidth = xhci_check_bandwidth, .reset_bandwidth = xhci_reset_bandwidth, .address_device = xhci_address_device, + .enable_device = xhci_enable_device, .update_hub_device = xhci_update_hub_device, .reset_device = xhci_discover_or_reset_device, diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index d9c169f470d3..8abda5c73ca1 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c @@ -69,6 +69,7 @@ static const struct hc_driver xhci_plat_xhci_driver = { .check_bandwidth = xhci_check_bandwidth, .reset_bandwidth = xhci_reset_bandwidth, .address_device = xhci_address_device, + .enable_device = xhci_enable_device, .update_hub_device = xhci_update_hub_device, .reset_device = xhci_discover_or_reset_device, @@ -139,6 +140,7 @@ static int xhci_plat_probe(struct platform_device *pdev) ret = usb_add_hcd(hcd, irq, IRQF_SHARED); if (ret) goto unmap_registers; + device_wakeup_enable(hcd->self.controller); /* USB 2.0 roothub is stored in the platform_device now. */ hcd = platform_get_drvdata(pdev); diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 53c2e296467f..a0b248c34526 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -156,8 +156,6 @@ static void next_trb(struct xhci_hcd *xhci, */ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring) { - unsigned long long addr; - ring->deq_updates++; /* @@ -186,8 +184,6 @@ static void inc_deq(struct xhci_hcd *xhci, struct xhci_ring *ring) ring->dequeue++; } } while (last_trb(xhci, ring, ring->deq_seg, ring->dequeue)); - - addr = (unsigned long long) xhci_trb_virt_to_dma(ring->deq_seg, ring->dequeue); } /* @@ -212,7 +208,6 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, { u32 chain; union xhci_trb *next; - unsigned long long addr; chain = le32_to_cpu(ring->enqueue->generic.field[3]) & TRB_CHAIN; /* If this is not event ring, there is one less usable TRB */ @@ -264,7 +259,6 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring, ring->enqueue = ring->enq_seg->trbs; next = ring->enqueue; } - addr = (unsigned long long) xhci_trb_virt_to_dma(ring->enq_seg, ring->enqueue); } /* @@ -295,9 +289,9 @@ void xhci_ring_cmd_db(struct xhci_hcd *xhci) return; xhci_dbg(xhci, "// Ding dong!\n"); - xhci_writel(xhci, DB_VALUE_HOST, &xhci->dba->doorbell[0]); + writel(DB_VALUE_HOST, &xhci->dba->doorbell[0]); /* Flush PCI posted writes */ - xhci_readl(xhci, &xhci->dba->doorbell[0]); + readl(&xhci->dba->doorbell[0]); } static int xhci_abort_cmd_ring(struct xhci_hcd *xhci) @@ -313,14 +307,13 @@ static int xhci_abort_cmd_ring(struct xhci_hcd *xhci) return 0; } - temp_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); + temp_64 = readq(&xhci->op_regs->cmd_ring); if (!(temp_64 & CMD_RING_RUNNING)) { xhci_dbg(xhci, "Command ring had been stopped\n"); return 0; } xhci->cmd_ring_state = CMD_RING_STATE_ABORTED; - xhci_write_64(xhci, temp_64 | CMD_RING_ABORT, - &xhci->op_regs->cmd_ring); + writeq(temp_64 | CMD_RING_ABORT, &xhci->op_regs->cmd_ring); /* Section 4.6.1.2 of xHCI 1.0 spec says software should * time the completion od all xHCI commands, including @@ -427,7 +420,7 @@ void xhci_ring_ep_doorbell(struct xhci_hcd *xhci, if ((ep_state & EP_HALT_PENDING) || (ep_state & SET_DEQ_PENDING) || (ep_state & EP_HALTED)) return; - xhci_writel(xhci, DB_VALUE(ep_index, stream_id), db_addr); + writel(DB_VALUE(ep_index, stream_id), db_addr); /* The CPU has better things to do at this point than wait for a * write-posting flush. It'll get there soon enough. */ @@ -1655,7 +1648,7 @@ static void handle_device_notification(struct xhci_hcd *xhci, u32 slot_id; struct usb_device *udev; - slot_id = TRB_TO_SLOT_ID(event->generic.field[3]); + slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->generic.field[3])); if (!xhci->devs[slot_id]) { xhci_warn(xhci, "Device Notification event for " "unused slot %u\n", slot_id); @@ -1739,7 +1732,7 @@ static void handle_port_status(struct xhci_hcd *xhci, faked_port_index = find_faked_portnum_from_hw_portnum(hcd, xhci, port_id); - temp = xhci_readl(xhci, port_array[faked_port_index]); + temp = readl(port_array[faked_port_index]); if (hcd->state == HC_STATE_SUSPENDED) { xhci_dbg(xhci, "resume root hub\n"); usb_hcd_resume_root_hub(hcd); @@ -1748,7 +1741,7 @@ static void handle_port_status(struct xhci_hcd *xhci, if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) { xhci_dbg(xhci, "port resume event for port %d\n", port_id); - temp1 = xhci_readl(xhci, &xhci->op_regs->command); + temp1 = readl(&xhci->op_regs->command); if (!(temp1 & CMD_RUN)) { xhci_warn(xhci, "xHC is not running.\n"); goto cleanup; @@ -2831,7 +2824,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) spin_lock(&xhci->lock); /* Check if the xHC generated the interrupt, or the irq is shared */ - status = xhci_readl(xhci, &xhci->op_regs->status); + status = readl(&xhci->op_regs->status); if (status == 0xffffffff) goto hw_died; @@ -2853,16 +2846,16 @@ hw_died: * Write 1 to clear the interrupt status. */ status |= STS_EINT; - xhci_writel(xhci, status, &xhci->op_regs->status); + writel(status, &xhci->op_regs->status); /* FIXME when MSI-X is supported and there are multiple vectors */ /* Clear the MSI-X event interrupt status */ if (hcd->irq) { u32 irq_pending; /* Acknowledge the PCI interrupt */ - irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); + irq_pending = readl(&xhci->ir_set->irq_pending); irq_pending |= IMAN_IP; - xhci_writel(xhci, irq_pending, &xhci->ir_set->irq_pending); + writel(irq_pending, &xhci->ir_set->irq_pending); } if (xhci->xhc_state & XHCI_STATE_DYING) { @@ -2871,9 +2864,8 @@ hw_died: /* Clear the event handler busy flag (RW1C); * the event ring should be empty. */ - temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); - xhci_write_64(xhci, temp_64 | ERST_EHB, - &xhci->ir_set->erst_dequeue); + temp_64 = readq(&xhci->ir_set->erst_dequeue); + writeq(temp_64 | ERST_EHB, &xhci->ir_set->erst_dequeue); spin_unlock(&xhci->lock); return IRQ_HANDLED; @@ -2885,7 +2877,7 @@ hw_died: */ while (xhci_handle_event(xhci) > 0) {} - temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); + temp_64 = readq(&xhci->ir_set->erst_dequeue); /* If necessary, update the HW's version of the event ring deq ptr. */ if (event_ring_deq != xhci->event_ring->dequeue) { deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, @@ -2900,7 +2892,7 @@ hw_died: /* Clear the event handler busy flag (RW1C); event ring is empty. */ temp_64 |= ERST_EHB; - xhci_write_64(xhci, temp_64, &xhci->ir_set->erst_dequeue); + writeq(temp_64, &xhci->ir_set->erst_dequeue); spin_unlock(&xhci->lock); @@ -3008,7 +3000,7 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, if (num_trbs >= TRBS_PER_SEGMENT) { xhci_err(xhci, "Too many fragments %d, max %d\n", num_trbs, TRBS_PER_SEGMENT - 1); - return -ENOMEM; + return -EINVAL; } nop_cmd = cpu_to_le32(TRB_TYPE(TRB_TR_NOOP) | @@ -3981,7 +3973,7 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, gfp_t mem_flags, if (ret) return ret; - start_frame = xhci_readl(xhci, &xhci->run_regs->microframe_index); + start_frame = readl(&xhci->run_regs->microframe_index); start_frame &= 0x3fff; urb->start_frame = start_frame; @@ -4056,12 +4048,12 @@ int xhci_queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id) /* Queue an address device command TRB */ int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, - u32 slot_id) + u32 slot_id, enum xhci_setup_dev setup) { return queue_command(xhci, lower_32_bits(in_ctx_ptr), upper_32_bits(in_ctx_ptr), 0, - TRB_TYPE(TRB_ADDR_DEV) | SLOT_ID_FOR_TRB(slot_id), - false); + TRB_TYPE(TRB_ADDR_DEV) | SLOT_ID_FOR_TRB(slot_id) + | (setup == SETUP_CONTEXT_ONLY ? TRB_BSR : 0), false); } int xhci_queue_vendor_command(struct xhci_hcd *xhci, diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h index 20364cc8d2fb..dde3959b7a33 100644 --- a/drivers/usb/host/xhci-trace.h +++ b/drivers/usb/host/xhci-trace.h @@ -116,12 +116,12 @@ DECLARE_EVENT_CLASS(xhci_log_event, __field(u64, dma) __field(u32, status) __field(u32, flags) - __dynamic_array(__le32, trb, 4) + __dynamic_array(u8, trb, sizeof(struct xhci_generic_trb)) ), TP_fast_assign( __entry->va = trb_va; - __entry->dma = le64_to_cpu(((u64)ev->field[1]) << 32 | - ev->field[0]); + __entry->dma = ((u64)le32_to_cpu(ev->field[1])) << 32 | + le32_to_cpu(ev->field[0]); __entry->status = le32_to_cpu(ev->field[2]); __entry->flags = le32_to_cpu(ev->field[3]); memcpy(__get_dynamic_array(trb), trb_va, diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 4265b48856f6..ad364394885a 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -40,6 +40,10 @@ static int link_quirk; module_param(link_quirk, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(link_quirk, "Don't clear the chain bit on a link TRB"); +static unsigned int quirks; +module_param(quirks, uint, S_IRUGO); +MODULE_PARM_DESC(quirks, "Bit flags for quirks to be enabled as default"); + /* TODO: copied from ehci-hcd.c - can this be refactored? */ /* * xhci_handshake - spin reading hc until handshake completes or fails @@ -60,7 +64,7 @@ int xhci_handshake(struct xhci_hcd *xhci, void __iomem *ptr, u32 result; do { - result = xhci_readl(xhci, ptr); + result = readl(ptr); if (result == ~(u32)0) /* card removed */ return -ENODEV; result &= mask; @@ -82,13 +86,13 @@ void xhci_quiesce(struct xhci_hcd *xhci) u32 mask; mask = ~(XHCI_IRQS); - halted = xhci_readl(xhci, &xhci->op_regs->status) & STS_HALT; + halted = readl(&xhci->op_regs->status) & STS_HALT; if (!halted) mask &= ~CMD_RUN; - cmd = xhci_readl(xhci, &xhci->op_regs->command); + cmd = readl(&xhci->op_regs->command); cmd &= mask; - xhci_writel(xhci, cmd, &xhci->op_regs->command); + writel(cmd, &xhci->op_regs->command); } /* @@ -124,11 +128,11 @@ static int xhci_start(struct xhci_hcd *xhci) u32 temp; int ret; - temp = xhci_readl(xhci, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); temp |= (CMD_RUN); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Turn on HC, cmd = 0x%x.", temp); - xhci_writel(xhci, temp, &xhci->op_regs->command); + writel(temp, &xhci->op_regs->command); /* * Wait for the HCHalted Status bit to be 0 to indicate the host is @@ -158,16 +162,16 @@ int xhci_reset(struct xhci_hcd *xhci) u32 state; int ret, i; - state = xhci_readl(xhci, &xhci->op_regs->status); + state = readl(&xhci->op_regs->status); if ((state & STS_HALT) == 0) { xhci_warn(xhci, "Host controller not halted, aborting reset.\n"); return 0; } xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Reset the HC"); - command = xhci_readl(xhci, &xhci->op_regs->command); + command = readl(&xhci->op_regs->command); command |= CMD_RESET; - xhci_writel(xhci, command, &xhci->op_regs->command); + writel(command, &xhci->op_regs->command); ret = xhci_handshake(xhci, &xhci->op_regs->command, CMD_RESET, 0, 10 * 1000 * 1000); @@ -321,6 +325,9 @@ static void xhci_cleanup_msix(struct xhci_hcd *xhci) struct usb_hcd *hcd = xhci_to_hcd(xhci); struct pci_dev *pdev = to_pci_dev(hcd->self.controller); + if (xhci->quirks & XHCI_PLAT) + return; + xhci_free_irq(xhci); if (xhci->msix_entries) { @@ -422,7 +429,7 @@ static void compliance_mode_recovery(unsigned long arg) xhci = (struct xhci_hcd *)arg; for (i = 0; i < xhci->num_usb3_ports; i++) { - temp = xhci_readl(xhci, xhci->usb3_ports[i]); + temp = readl(xhci->usb3_ports[i]); if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_COMP_MOD) { /* * Compliance Mode Detected. Letting USB Core @@ -604,31 +611,30 @@ int xhci_run(struct usb_hcd *hcd) xhci_dbg(xhci, "Event ring:\n"); xhci_debug_ring(xhci, xhci->event_ring); xhci_dbg_ring_ptrs(xhci, xhci->event_ring); - temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); + temp_64 = readq(&xhci->ir_set->erst_dequeue); temp_64 &= ~ERST_PTR_MASK; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "ERST deq = 64'h%0lx", (long unsigned int) temp_64); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Set the interrupt modulation register"); - temp = xhci_readl(xhci, &xhci->ir_set->irq_control); + temp = readl(&xhci->ir_set->irq_control); temp &= ~ER_IRQ_INTERVAL_MASK; temp |= (u32) 160; - xhci_writel(xhci, temp, &xhci->ir_set->irq_control); + writel(temp, &xhci->ir_set->irq_control); /* Set the HCD state before we enable the irqs */ - temp = xhci_readl(xhci, &xhci->op_regs->command); + temp = readl(&xhci->op_regs->command); temp |= (CMD_EIE); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Enable interrupts, cmd = 0x%x.", temp); - xhci_writel(xhci, temp, &xhci->op_regs->command); + writel(temp, &xhci->op_regs->command); - temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); + temp = readl(&xhci->ir_set->irq_pending); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Enabling event ring interrupter %p by writing 0x%x to irq_pending", xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp)); - xhci_writel(xhci, ER_IRQ_ENABLE(temp), - &xhci->ir_set->irq_pending); + writel(ER_IRQ_ENABLE(temp), &xhci->ir_set->irq_pending); xhci_print_ir_set(xhci, 0); if (xhci->quirks & XHCI_NEC_HOST) @@ -698,18 +704,17 @@ void xhci_stop(struct usb_hcd *hcd) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Disabling event ring interrupts"); - temp = xhci_readl(xhci, &xhci->op_regs->status); - xhci_writel(xhci, temp & ~STS_EINT, &xhci->op_regs->status); - temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); - xhci_writel(xhci, ER_IRQ_DISABLE(temp), - &xhci->ir_set->irq_pending); + temp = readl(&xhci->op_regs->status); + writel(temp & ~STS_EINT, &xhci->op_regs->status); + temp = readl(&xhci->ir_set->irq_pending); + writel(ER_IRQ_DISABLE(temp), &xhci->ir_set->irq_pending); xhci_print_ir_set(xhci, 0); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "cleaning up memory"); xhci_mem_cleanup(xhci); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "xhci_stop completed - status = %x", - xhci_readl(xhci, &xhci->op_regs->status)); + readl(&xhci->op_regs->status)); } /* @@ -739,7 +744,7 @@ void xhci_shutdown(struct usb_hcd *hcd) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "xhci_shutdown completed - status = %x", - xhci_readl(xhci, &xhci->op_regs->status)); + readl(&xhci->op_regs->status)); /* Yet another workaround for spurious wakeups at shutdown with HSW */ if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) @@ -749,28 +754,28 @@ void xhci_shutdown(struct usb_hcd *hcd) #ifdef CONFIG_PM static void xhci_save_registers(struct xhci_hcd *xhci) { - xhci->s3.command = xhci_readl(xhci, &xhci->op_regs->command); - xhci->s3.dev_nt = xhci_readl(xhci, &xhci->op_regs->dev_notification); - xhci->s3.dcbaa_ptr = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); - xhci->s3.config_reg = xhci_readl(xhci, &xhci->op_regs->config_reg); - xhci->s3.erst_size = xhci_readl(xhci, &xhci->ir_set->erst_size); - xhci->s3.erst_base = xhci_read_64(xhci, &xhci->ir_set->erst_base); - xhci->s3.erst_dequeue = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); - xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); - xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control); + xhci->s3.command = readl(&xhci->op_regs->command); + xhci->s3.dev_nt = readl(&xhci->op_regs->dev_notification); + xhci->s3.dcbaa_ptr = readq(&xhci->op_regs->dcbaa_ptr); + xhci->s3.config_reg = readl(&xhci->op_regs->config_reg); + xhci->s3.erst_size = readl(&xhci->ir_set->erst_size); + xhci->s3.erst_base = readq(&xhci->ir_set->erst_base); + xhci->s3.erst_dequeue = readq(&xhci->ir_set->erst_dequeue); + xhci->s3.irq_pending = readl(&xhci->ir_set->irq_pending); + xhci->s3.irq_control = readl(&xhci->ir_set->irq_control); } static void xhci_restore_registers(struct xhci_hcd *xhci) { - xhci_writel(xhci, xhci->s3.command, &xhci->op_regs->command); - xhci_writel(xhci, xhci->s3.dev_nt, &xhci->op_regs->dev_notification); - xhci_write_64(xhci, xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr); - xhci_writel(xhci, xhci->s3.config_reg, &xhci->op_regs->config_reg); - xhci_writel(xhci, xhci->s3.erst_size, &xhci->ir_set->erst_size); - xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base); - xhci_write_64(xhci, xhci->s3.erst_dequeue, &xhci->ir_set->erst_dequeue); - xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending); - xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control); + writel(xhci->s3.command, &xhci->op_regs->command); + writel(xhci->s3.dev_nt, &xhci->op_regs->dev_notification); + writeq(xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr); + writel(xhci->s3.config_reg, &xhci->op_regs->config_reg); + writel(xhci->s3.erst_size, &xhci->ir_set->erst_size); + writeq(xhci->s3.erst_base, &xhci->ir_set->erst_base); + writeq(xhci->s3.erst_dequeue, &xhci->ir_set->erst_dequeue); + writel(xhci->s3.irq_pending, &xhci->ir_set->irq_pending); + writel(xhci->s3.irq_control, &xhci->ir_set->irq_control); } static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci) @@ -778,7 +783,7 @@ static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci) u64 val_64; /* step 2: initialize command ring buffer */ - val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); + val_64 = readq(&xhci->op_regs->cmd_ring); val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) | (xhci_trb_virt_to_dma(xhci->cmd_ring->deq_seg, xhci->cmd_ring->dequeue) & @@ -787,7 +792,7 @@ static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci) xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Setting command ring address to 0x%llx", (long unsigned long) val_64); - xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring); + writeq(val_64, &xhci->op_regs->cmd_ring); } /* @@ -866,9 +871,9 @@ int xhci_suspend(struct xhci_hcd *xhci) /* skipped assuming that port suspend has done */ /* step 2: clear Run/Stop bit */ - command = xhci_readl(xhci, &xhci->op_regs->command); + command = readl(&xhci->op_regs->command); command &= ~CMD_RUN; - xhci_writel(xhci, command, &xhci->op_regs->command); + writel(command, &xhci->op_regs->command); /* Some chips from Fresco Logic need an extraordinary delay */ delay *= (xhci->quirks & XHCI_SLOW_SUSPEND) ? 10 : 1; @@ -885,9 +890,9 @@ int xhci_suspend(struct xhci_hcd *xhci) xhci_save_registers(xhci); /* step 4: set CSS flag */ - command = xhci_readl(xhci, &xhci->op_regs->command); + command = readl(&xhci->op_regs->command); command |= CMD_CSS; - xhci_writel(xhci, command, &xhci->op_regs->command); + writel(command, &xhci->op_regs->command); if (xhci_handshake(xhci, &xhci->op_regs->status, STS_SAVE, 0, 10 * 1000)) { xhci_warn(xhci, "WARN: xHC save state timeout\n"); @@ -951,16 +956,16 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) xhci_set_cmd_ring_deq(xhci); /* step 3: restore state and start state*/ /* step 3: set CRS flag */ - command = xhci_readl(xhci, &xhci->op_regs->command); + command = readl(&xhci->op_regs->command); command |= CMD_CRS; - xhci_writel(xhci, command, &xhci->op_regs->command); + writel(command, &xhci->op_regs->command); if (xhci_handshake(xhci, &xhci->op_regs->status, STS_RESTORE, 0, 10 * 1000)) { xhci_warn(xhci, "WARN: xHC restore state timeout\n"); spin_unlock_irq(&xhci->lock); return -ETIMEDOUT; } - temp = xhci_readl(xhci, &xhci->op_regs->status); + temp = readl(&xhci->op_regs->status); } /* If restore operation fails, re-initialize the HC during resume */ @@ -984,17 +989,16 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) xhci_cleanup_msix(xhci); xhci_dbg(xhci, "// Disabling event ring interrupts\n"); - temp = xhci_readl(xhci, &xhci->op_regs->status); - xhci_writel(xhci, temp & ~STS_EINT, &xhci->op_regs->status); - temp = xhci_readl(xhci, &xhci->ir_set->irq_pending); - xhci_writel(xhci, ER_IRQ_DISABLE(temp), - &xhci->ir_set->irq_pending); + temp = readl(&xhci->op_regs->status); + writel(temp & ~STS_EINT, &xhci->op_regs->status); + temp = readl(&xhci->ir_set->irq_pending); + writel(ER_IRQ_DISABLE(temp), &xhci->ir_set->irq_pending); xhci_print_ir_set(xhci, 0); xhci_dbg(xhci, "cleaning up memory\n"); xhci_mem_cleanup(xhci); xhci_dbg(xhci, "xhci_stop completed - status = %x\n", - xhci_readl(xhci, &xhci->op_regs->status)); + readl(&xhci->op_regs->status)); /* USB core calls the PCI reinit and start functions twice: * first with the primary HCD, and then with the secondary HCD. @@ -1023,9 +1027,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) } /* step 4: set Run/Stop bit */ - command = xhci_readl(xhci, &xhci->op_regs->command); + command = readl(&xhci->op_regs->command); command |= CMD_RUN; - xhci_writel(xhci, command, &xhci->op_regs->command); + writel(command, &xhci->op_regs->command); xhci_handshake(xhci, &xhci->op_regs->status, STS_HALT, 0, 250 * 1000); @@ -1464,7 +1468,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ret = usb_hcd_check_unlink_urb(hcd, urb, status); if (ret || !urb->hcpriv) goto done; - temp = xhci_readl(xhci, &xhci->op_regs->status); + temp = readl(&xhci->op_regs->status); if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_HALTED)) { xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, "HW died, freeing TD."); @@ -1892,8 +1896,8 @@ static u32 xhci_count_num_new_endpoints(struct xhci_hcd *xhci, * (bit 1). The default control endpoint is added during the Address * Device command and is never removed until the slot is disabled. */ - valid_add_flags = ctrl_ctx->add_flags >> 2; - valid_drop_flags = ctrl_ctx->drop_flags >> 2; + valid_add_flags = le32_to_cpu(ctrl_ctx->add_flags) >> 2; + valid_drop_flags = le32_to_cpu(ctrl_ctx->drop_flags) >> 2; /* Use hweight32 to count the number of ones in the add flags, or * number of endpoints added. Don't count endpoints that are changed @@ -1909,8 +1913,8 @@ static unsigned int xhci_count_num_dropped_endpoints(struct xhci_hcd *xhci, u32 valid_add_flags; u32 valid_drop_flags; - valid_add_flags = ctrl_ctx->add_flags >> 2; - valid_drop_flags = ctrl_ctx->drop_flags >> 2; + valid_add_flags = le32_to_cpu(ctrl_ctx->add_flags) >> 2; + valid_drop_flags = le32_to_cpu(ctrl_ctx->drop_flags) >> 2; return hweight32(valid_drop_flags) - hweight32(valid_add_flags & valid_drop_flags); @@ -3585,7 +3589,7 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) spin_lock_irqsave(&xhci->lock, flags); /* Don't disable the slot if the host controller is dead. */ - state = xhci_readl(xhci, &xhci->op_regs->status); + state = readl(&xhci->op_regs->status); if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) || (xhci->xhc_state & XHCI_STATE_HALTED)) { xhci_free_virt_device(xhci, udev->slot_id); @@ -3712,13 +3716,15 @@ disable_slot: } /* - * Issue an Address Device command (which will issue a SetAddress request to - * the device). + * Issue an Address Device command and optionally send a corresponding + * SetAddress request to the device. * We should be protected by the usb_address0_mutex in khubd's hub_port_init, so * we should only issue and wait on one address command at the same time. */ -int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) +static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, + enum xhci_setup_dev setup) { + const char *act = setup == SETUP_CONTEXT_ONLY ? "context" : "address"; unsigned long flags; int timeleft; struct xhci_virt_device *virt_dev; @@ -3771,12 +3777,12 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); trace_xhci_address_ctx(xhci, virt_dev->in_ctx, - slot_ctx->dev_info >> 27); + le32_to_cpu(slot_ctx->dev_info) >> 27); spin_lock_irqsave(&xhci->lock, flags); cmd_trb = xhci_find_next_enqueue(xhci->cmd_ring); ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, - udev->slot_id); + udev->slot_id, setup); if (ret) { spin_unlock_irqrestore(&xhci->lock, flags); xhci_dbg_trace(xhci, trace_xhci_dbg_address, @@ -3794,8 +3800,8 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) * command on a timeout. */ if (timeleft <= 0) { - xhci_warn(xhci, "%s while waiting for address device command\n", - timeleft == 0 ? "Timeout" : "Signal"); + xhci_warn(xhci, "%s while waiting for setup %s command\n", + timeleft == 0 ? "Timeout" : "Signal", act); /* cancel the address device command */ ret = xhci_cancel_cmd(xhci, NULL, cmd_trb); if (ret < 0) @@ -3806,26 +3812,27 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) switch (virt_dev->cmd_status) { case COMP_CTX_STATE: case COMP_EBADSLT: - xhci_err(xhci, "Setup ERROR: address device command for slot %d.\n", - udev->slot_id); + xhci_err(xhci, "Setup ERROR: setup %s command for slot %d.\n", + act, udev->slot_id); ret = -EINVAL; break; case COMP_TX_ERR: - dev_warn(&udev->dev, "Device not responding to set address.\n"); + dev_warn(&udev->dev, "Device not responding to setup %s.\n", act); ret = -EPROTO; break; case COMP_DEV_ERR: - dev_warn(&udev->dev, "ERROR: Incompatible device for address " - "device command.\n"); + dev_warn(&udev->dev, + "ERROR: Incompatible device for setup %s command\n", act); ret = -ENODEV; break; case COMP_SUCCESS: xhci_dbg_trace(xhci, trace_xhci_dbg_address, - "Successful Address Device command"); + "Successful setup %s command", act); break; default: - xhci_err(xhci, "ERROR: unexpected command completion " - "code 0x%x.\n", virt_dev->cmd_status); + xhci_err(xhci, + "ERROR: unexpected setup %s command completion code 0x%x.\n", + act, virt_dev->cmd_status); xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); xhci_dbg_ctx(xhci, virt_dev->out_ctx, 2); trace_xhci_address_ctx(xhci, virt_dev->out_ctx, 1); @@ -3835,7 +3842,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) if (ret) { return ret; } - temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); + temp_64 = readq(&xhci->op_regs->dcbaa_ptr); xhci_dbg_trace(xhci, trace_xhci_dbg_address, "Op regs DCBAA ptr = %#016llx", temp_64); xhci_dbg_trace(xhci, trace_xhci_dbg_address, @@ -3850,7 +3857,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); trace_xhci_address_ctx(xhci, virt_dev->in_ctx, - slot_ctx->dev_info >> 27); + le32_to_cpu(slot_ctx->dev_info) >> 27); xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); xhci_dbg_ctx(xhci, virt_dev->out_ctx, 2); /* @@ -3859,7 +3866,7 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) */ slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); trace_xhci_address_ctx(xhci, virt_dev->out_ctx, - slot_ctx->dev_info >> 27); + le32_to_cpu(slot_ctx->dev_info) >> 27); /* Zero the input context control for later use */ ctrl_ctx->add_flags = 0; ctrl_ctx->drop_flags = 0; @@ -3871,6 +3878,16 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) return 0; } +int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) +{ + return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ADDRESS); +} + +int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev) +{ + return xhci_setup_device(hcd, udev, SETUP_CONTEXT_ONLY); +} + /* * Transfer the port index into real index in the HW port status * registers. Caculate offset between the port's PORTSC register @@ -4042,7 +4059,7 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, port_array = xhci->usb2_ports; port_num = udev->portnum - 1; pm_addr = port_array[port_num] + PORTPMSC; - pm_val = xhci_readl(xhci, pm_addr); + pm_val = readl(pm_addr); hlpm_addr = port_array[port_num] + PORTHLPMC; field = le32_to_cpu(udev->bos->ext_cap->bmAttributes); @@ -4082,26 +4099,26 @@ int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, spin_lock_irqsave(&xhci->lock, flags); hlpm_val = xhci_calculate_usb2_hw_lpm_params(udev); - xhci_writel(xhci, hlpm_val, hlpm_addr); + writel(hlpm_val, hlpm_addr); /* flush write */ - xhci_readl(xhci, hlpm_addr); + readl(hlpm_addr); } else { hird = xhci_calculate_hird_besl(xhci, udev); } pm_val &= ~PORT_HIRD_MASK; pm_val |= PORT_HIRD(hird) | PORT_RWE | PORT_L1DS(udev->slot_id); - xhci_writel(xhci, pm_val, pm_addr); - pm_val = xhci_readl(xhci, pm_addr); + writel(pm_val, pm_addr); + pm_val = readl(pm_addr); pm_val |= PORT_HLE; - xhci_writel(xhci, pm_val, pm_addr); + writel(pm_val, pm_addr); /* flush write */ - xhci_readl(xhci, pm_addr); + readl(pm_addr); } else { pm_val &= ~(PORT_HLE | PORT_RWE | PORT_HIRD_MASK | PORT_L1DS_MASK); - xhci_writel(xhci, pm_val, pm_addr); + writel(pm_val, pm_addr); /* flush write */ - xhci_readl(xhci, pm_addr); + readl(pm_addr); if (udev->usb2_hw_lpm_besl_capable) { spin_unlock_irqrestore(&xhci->lock, flags); mutex_lock(hcd->bandwidth_mutex); @@ -4455,7 +4472,7 @@ static u16 xhci_calculate_lpm_timeout(struct usb_hcd *hcd, if (!config) return timeout; - for (i = 0; i < USB_MAXINTERFACES; i++) { + for (i = 0; i < config->desc.bNumInterfaces; i++) { struct usb_driver *driver; struct usb_interface *intf = config->interface[i]; @@ -4704,7 +4721,7 @@ int xhci_get_frame(struct usb_hcd *hcd) { struct xhci_hcd *xhci = hcd_to_xhci(hcd); /* EHCI mods by the periodic size. Why? */ - return xhci_readl(xhci, &xhci->run_regs->microframe_index) >> 3; + return readl(&xhci->run_regs->microframe_index) >> 3; } int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) @@ -4713,8 +4730,8 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) struct device *dev = hcd->self.controller; int retval; - /* Accept arbitrarily long scatter-gather lists */ - hcd->self.sg_tablesize = ~0; + /* Limit the block layer scatter-gather lists to half a segment. */ + hcd->self.sg_tablesize = TRBS_PER_SEGMENT / 2; /* support to build packet from discontinuous buffers */ hcd->self.no_sg_constraint = 1; @@ -4748,18 +4765,20 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) xhci->cap_regs = hcd->regs; xhci->op_regs = hcd->regs + - HC_LENGTH(xhci_readl(xhci, &xhci->cap_regs->hc_capbase)); + HC_LENGTH(readl(&xhci->cap_regs->hc_capbase)); xhci->run_regs = hcd->regs + - (xhci_readl(xhci, &xhci->cap_regs->run_regs_off) & RTSOFF_MASK); + (readl(&xhci->cap_regs->run_regs_off) & RTSOFF_MASK); /* Cache read-only capability registers */ - xhci->hcs_params1 = xhci_readl(xhci, &xhci->cap_regs->hcs_params1); - xhci->hcs_params2 = xhci_readl(xhci, &xhci->cap_regs->hcs_params2); - xhci->hcs_params3 = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); - xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); + xhci->hcs_params1 = readl(&xhci->cap_regs->hcs_params1); + xhci->hcs_params2 = readl(&xhci->cap_regs->hcs_params2); + xhci->hcs_params3 = readl(&xhci->cap_regs->hcs_params3); + xhci->hcc_params = readl(&xhci->cap_regs->hc_capbase); xhci->hci_version = HC_VERSION(xhci->hcc_params); - xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); + xhci->hcc_params = readl(&xhci->cap_regs->hcc_params); xhci_print_registers(xhci); + xhci->quirks = quirks; + get_quirks(dev, xhci); /* In xhci controllers which follow xhci 1.0 spec gives a spurious diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 03c74b7965f8..f8416639bf31 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -28,6 +28,17 @@ #include <linux/kernel.h> #include <linux/usb/hcd.h> +/* + * Registers should always be accessed with double word or quad word accesses. + * + * Some xHCI implementations may support 64-bit address pointers. Registers + * with 64-bit address pointers should be written to with dword accesses by + * writing the low dword first (ptr[0]), then the high dword (ptr[1]) second. + * xHCI implementations that do not support 64-bit address pointers will ignore + * the high dword, and write order is irrelevant. + */ +#include <asm-generic/io-64-nonatomic-lo-hi.h> + /* Code sharing between pci-quirks and xhci hcd */ #include "xhci-ext-caps.h" #include "pci-quirks.h" @@ -752,7 +763,7 @@ struct xhci_stream_ctx { }; /* Stream Context Types (section 6.4.1) - bits 3:1 of stream ctx deq ptr */ -#define SCT_FOR_CTX(p) (((p) << 1) & 0x7) +#define SCT_FOR_CTX(p) (((p) & 0x7) << 1) /* Secondary stream array type, dequeue pointer is to a transfer ring */ #define SCT_SEC_TR 0 /* Primary stream array type, dequeue pointer is to a transfer ring */ @@ -1097,6 +1108,14 @@ struct xhci_event_cmd { }; /* flags bitmasks */ + +/* Address device - disable SetAddress */ +#define TRB_BSR (1<<9) +enum xhci_setup_dev { + SETUP_CONTEXT_ONLY, + SETUP_CONTEXT_ADDRESS, +}; + /* bits 16:23 are the virtual function ID */ /* bits 24:31 are the slot ID */ #define TRB_TO_SLOT_ID(p) (((p) & (0xff<<24)) >> 24) @@ -1260,7 +1279,7 @@ union xhci_trb { * since the command ring is 64-byte aligned. * It must also be greater than 16. */ -#define TRBS_PER_SEGMENT 64 +#define TRBS_PER_SEGMENT 256 /* Allow two commands + a link TRB, along with any reserved command TRBs */ #define MAX_RSVD_CMD_TRBS (TRBS_PER_SEGMENT - 3) #define TRB_SEGMENT_SIZE (TRBS_PER_SEGMENT*16) @@ -1595,47 +1614,6 @@ static inline struct usb_hcd *xhci_to_hcd(struct xhci_hcd *xhci) #define xhci_warn_ratelimited(xhci, fmt, args...) \ dev_warn_ratelimited(xhci_to_hcd(xhci)->self.controller , fmt , ## args) -/* TODO: copied from ehci.h - can be refactored? */ -/* xHCI spec says all registers are little endian */ -static inline unsigned int xhci_readl(const struct xhci_hcd *xhci, - __le32 __iomem *regs) -{ - return readl(regs); -} -static inline void xhci_writel(struct xhci_hcd *xhci, - const unsigned int val, __le32 __iomem *regs) -{ - writel(val, regs); -} - -/* - * Registers should always be accessed with double word or quad word accesses. - * - * Some xHCI implementations may support 64-bit address pointers. Registers - * with 64-bit address pointers should be written to with dword accesses by - * writing the low dword first (ptr[0]), then the high dword (ptr[1]) second. - * xHCI implementations that do not support 64-bit address pointers will ignore - * the high dword, and write order is irrelevant. - */ -static inline u64 xhci_read_64(const struct xhci_hcd *xhci, - __le64 __iomem *regs) -{ - __u32 __iomem *ptr = (__u32 __iomem *) regs; - u64 val_lo = readl(ptr); - u64 val_hi = readl(ptr + 1); - return val_lo + (val_hi << 32); -} -static inline void xhci_write_64(struct xhci_hcd *xhci, - const u64 val, __le64 __iomem *regs) -{ - __u32 __iomem *ptr = (__u32 __iomem *) regs; - u32 val_lo = lower_32_bits(val); - u32 val_hi = upper_32_bits(val); - - writel(val_lo, ptr); - writel(val_hi, ptr + 1); -} - static inline int xhci_link_trb_quirk(struct xhci_hcd *xhci) { return xhci->quirks & XHCI_LINK_TRB_QUIRK; @@ -1790,6 +1768,7 @@ int xhci_free_streams(struct usb_hcd *hcd, struct usb_device *udev, struct usb_host_endpoint **eps, unsigned int num_eps, gfp_t mem_flags); int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev); +int xhci_enable_device(struct usb_hcd *hcd, struct usb_device *udev); int xhci_update_device(struct usb_hcd *hcd, struct usb_device *udev); int xhci_set_usb2_hardware_lpm(struct usb_hcd *hcd, struct usb_device *udev, int enable); @@ -1813,7 +1792,7 @@ int xhci_is_vendor_info_code(struct xhci_hcd *xhci, unsigned int trb_comp_code); void xhci_ring_cmd_db(struct xhci_hcd *xhci); int xhci_queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id); int xhci_queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, - u32 slot_id); + u32 slot_id, enum xhci_setup_dev); int xhci_queue_vendor_command(struct xhci_hcd *xhci, u32 field1, u32 field2, u32 field3, u32 field4); int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, int slot_id, diff --git a/drivers/usb/image/mdc800.c b/drivers/usb/image/mdc800.c index 7121b50098d3..a62865af53cc 100644 --- a/drivers/usb/image/mdc800.c +++ b/drivers/usb/image/mdc800.c @@ -51,7 +51,7 @@ * * version 0.7.3 * bugfix : The mdc800->state field gets set to READY after the - * the diconnect function sets it to NOT_CONNECTED. This makes the + * the disconnect function sets it to NOT_CONNECTED. This makes the * driver running like the camera is connected and causes some * hang ups. * diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index 9c0f8caba3be..37b44b04a701 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c @@ -125,7 +125,6 @@ #include <linux/errno.h> #include <linux/random.h> #include <linux/poll.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/spinlock.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/adutux.c b/drivers/usb/misc/adutux.c index 3eaa83f05086..493c7f268b6f 100644 --- a/drivers/usb/misc/adutux.c +++ b/drivers/usb/misc/adutux.c @@ -22,7 +22,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/cypress_cy7c63.c b/drivers/usb/misc/cypress_cy7c63.c index 3f7c1a92579f..402b94dd2531 100644 --- a/drivers/usb/misc/cypress_cy7c63.c +++ b/drivers/usb/misc/cypress_cy7c63.c @@ -29,7 +29,6 @@ * published by the Free Software Foundation, version 2. */ -#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/slab.h> diff --git a/drivers/usb/misc/cytherm.c b/drivers/usb/misc/cytherm.c index 5b9831b95d97..9bab1a33bc16 100644 --- a/drivers/usb/misc/cytherm.c +++ b/drivers/usb/misc/cytherm.c @@ -16,7 +16,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index d65984dee751..8950fa5e973d 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c @@ -13,7 +13,6 @@ #include <linux/errno.h> #include <linux/slab.h> #include <linux/module.h> -#include <linux/init.h> #include <linux/usb.h> #include <linux/delay.h> #include <linux/firmware.h> diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index ae794b90766b..1d9be4431b72 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c @@ -10,7 +10,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/module.h> #include <linux/usb.h> #include <linux/delay.h> diff --git a/drivers/usb/misc/ezusb.c b/drivers/usb/misc/ezusb.c index e712afed947c..947811bc8126 100644 --- a/drivers/usb/misc/ezusb.c +++ b/drivers/usb/misc/ezusb.c @@ -9,7 +9,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index ce978384fda1..4e38683c653c 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c @@ -19,7 +19,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/delay.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/completion.h> @@ -386,7 +385,7 @@ static int idmouse_probe(struct usb_interface *interface, result = usb_register_dev(interface, &idmouse_class); if (result) { /* something prevented us from registering this device */ - dev_err(&interface->dev, "Unble to allocate minor number.\n"); + dev_err(&interface->dev, "Unable to allocate minor number.\n"); usb_set_intfdata(interface, NULL); idmouse_delete(dev); return result; diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index d36f34e25bed..20bcfdd7eace 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c @@ -15,7 +15,6 @@ #include <linux/module.h> #include <linux/usb.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/sched.h> #include <linux/mutex.h> @@ -300,7 +299,7 @@ static ssize_t iowarrior_read(struct file *file, char __user *buffer, do { atomic_set(&dev->overflow_flag, 0); if ((read_idx = read_index(dev)) == -1) { - /* queue emty */ + /* queue empty */ if (file->f_flags & O_NONBLOCK) return -EAGAIN; else { diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index b1d59532ac22..82503a7ff6c8 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c @@ -24,7 +24,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/mutex.h> diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index eb37c9542052..97cd9e24bd25 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c @@ -79,7 +79,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/completion.h> diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c index b9b356a9dd11..13731d512624 100644 --- a/drivers/usb/misc/rio500.c +++ b/drivers/usb/misc/rio500.c @@ -36,7 +36,6 @@ #include <linux/errno.h> #include <linux/random.h> #include <linux/poll.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/spinlock.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/sisusbvga/sisusb_init.c b/drivers/usb/misc/sisusbvga/sisusb_init.c index cb8a3d91f970..bf0032ca35ed 100644 --- a/drivers/usb/misc/sisusbvga/sisusb_init.c +++ b/drivers/usb/misc/sisusbvga/sisusb_init.c @@ -40,7 +40,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/poll.h> -#include <linux/init.h> #include <linux/spinlock.h> #include "sisusb.h" diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c index 741efed4a236..4145314a515b 100644 --- a/drivers/usb/misc/trancevibrator.c +++ b/drivers/usb/misc/trancevibrator.c @@ -21,7 +21,6 @@ /* Standard include files */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c index 89927bcff974..1184390508e9 100644 --- a/drivers/usb/misc/usblcd.c +++ b/drivers/usb/misc/usblcd.c @@ -14,7 +14,6 @@ *****************************************************************************/ #include <linux/module.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/mutex.h> diff --git a/drivers/usb/misc/usbled.c b/drivers/usb/misc/usbled.c index 12d03e7ad636..78eb4ff33269 100644 --- a/drivers/usb/misc/usbled.c +++ b/drivers/usb/misc/usbled.c @@ -11,7 +11,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c index b2d82b937392..1fe6b73c22f3 100644 --- a/drivers/usb/misc/usbsevseg.c +++ b/drivers/usb/misc/usbsevseg.c @@ -12,7 +12,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/string.h> @@ -57,7 +56,7 @@ struct usb_sevsegdev { * if str commands are used, we would assume the end of string * so mem commands are used. */ -inline size_t my_memlen(const char *buf, size_t count) +static inline size_t my_memlen(const char *buf, size_t count) { if (count > 0 && buf[count-1] == '\n') return count - 1; diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index b4152820d655..f6568b5e9b06 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c @@ -10,6 +10,7 @@ #include <linux/usb.h> +#define SIMPLE_IO_TIMEOUT 10000 /* in milliseconds */ /*-------------------------------------------------------------------------*/ @@ -366,6 +367,7 @@ static int simple_io( int max = urb->transfer_buffer_length; struct completion completion; int retval = 0; + unsigned long expire; urb->context = &completion; while (retval == 0 && iterations-- > 0) { @@ -378,9 +380,15 @@ static int simple_io( if (retval != 0) break; - /* NOTE: no timeouts; can't be broken out of by interrupt */ - wait_for_completion(&completion); - retval = urb->status; + expire = msecs_to_jiffies(SIMPLE_IO_TIMEOUT); + if (!wait_for_completion_timeout(&completion, expire)) { + usb_kill_urb(urb); + retval = (urb->status == -ENOENT ? + -ETIMEDOUT : urb->status); + } else { + retval = urb->status; + } + urb->dev = udev; if (retval == 0 && usb_pipein(urb->pipe)) retval = simple_check_buf(tdev, urb); @@ -619,8 +627,8 @@ static int is_good_ext(struct usbtest_dev *tdev, u8 *buf) } attr = le32_to_cpu(ext->bmAttributes); - /* bits[1:4] is used and others are reserved */ - if (attr & ~0x1e) { /* reserved == 0 */ + /* bits[1:15] is used and others are reserved */ + if (attr & ~0xfffe) { /* reserved == 0 */ ERROR(tdev, "reserved bits set\n"); return 0; } @@ -763,7 +771,7 @@ static int ch9_postconfig(struct usbtest_dev *dev) * there's always [9.4.3] a bos device descriptor [9.6.2] in USB * 3.0 spec */ - if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0300) { + if (le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0210) { struct usb_bos_descriptor *bos = NULL; struct usb_dev_cap_header *header = NULL; unsigned total, num, length; @@ -944,7 +952,7 @@ struct ctrl_ctx { int last; }; -#define NUM_SUBCASES 15 /* how many test subcases here? */ +#define NUM_SUBCASES 16 /* how many test subcases here? */ struct subcase { struct usb_ctrlrequest setup; @@ -1218,6 +1226,15 @@ test_ctrl_queue(struct usbtest_dev *dev, struct usbtest_param *param) } expected = -EREMOTEIO; break; + case 15: + req.wValue = cpu_to_le16(USB_DT_BOS << 8); + if (udev->bos) + len = le16_to_cpu(udev->bos->desc->wTotalLength); + else + len = sizeof(struct usb_bos_descriptor); + if (le16_to_cpu(udev->descriptor.bcdUSB) < 0x0201) + expected = -EPIPE; + break; default: ERROR(dev, "bogus number of ctrl queue testcases!\n"); context.status = -EINVAL; @@ -1537,8 +1554,17 @@ static int test_halt(struct usbtest_dev *tdev, int ep, struct urb *urb) return retval; } retval = verify_halted(tdev, ep, urb); - if (retval < 0) + if (retval < 0) { + int ret; + + /* clear halt anyways, else further tests will fail */ + ret = usb_clear_halt(urb->dev, urb->pipe); + if (ret) + ERROR(tdev, "ep %02x couldn't clear halt, %d\n", + ep, ret); + return retval; + } /* clear halt (tests API + protocol), verify it worked */ retval = usb_clear_halt(urb->dev, urb->pipe); diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c index b6ab515bfc6c..24278208bf74 100644 --- a/drivers/usb/misc/yurex.c +++ b/drivers/usb/misc/yurex.c @@ -11,7 +11,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/kref.h> @@ -464,7 +463,7 @@ static ssize_t yurex_write(struct file *file, const char *user_buffer, size_t co goto error; mutex_lock(&dev->io_mutex); - if (!dev->interface) { /* alreaday disconnected */ + if (!dev->interface) { /* already disconnected */ mutex_unlock(&dev->io_mutex); retval = -ENODEV; goto error; diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 57dfc0cedb00..688dc8bb192d 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig @@ -6,7 +6,7 @@ # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller config USB_MUSB_HDRC tristate 'Inventra Highspeed Dual Role Controller (TI, ADI, ...)' - depends on USB_GADGET + depends on (USB || USB_GADGET) help Say Y here if your system has a dual role high speed USB controller based on the Mentor Graphics silicon IP. Then @@ -35,21 +35,21 @@ choice config USB_MUSB_HOST bool "Host only mode" - depends on USB + depends on USB=y || USB=USB_MUSB_HDRC help Select this when you want to use MUSB in host mode only, thereby the gadget feature will be regressed. config USB_MUSB_GADGET bool "Gadget only mode" - depends on USB_GADGET + depends on USB_GADGET=y || USB_GADGET=USB_MUSB_HDRC help Select this when you want to use MUSB in gadget mode only, thereby the host feature will be regressed. config USB_MUSB_DUAL_ROLE bool "Dual Role mode" - depends on (USB && USB_GADGET) + depends on ((USB=y || USB=USB_MUSB_HDRC) && (USB_GADGET=y || USB_GADGET=USB_MUSB_HDRC)) help This is the default mode of working of MUSB controller where both host and gadget features are enabled. @@ -93,6 +93,12 @@ config USB_MUSB_BLACKFIN config USB_MUSB_UX500 tristate "Ux500 platforms" +config USB_MUSB_JZ4740 + tristate "JZ4740" + depends on MACH_JZ4740 || COMPILE_TEST + depends on USB_MUSB_GADGET + depends on USB_OTG_BLACKLIST_HUB + endchoice config USB_MUSB_AM335X_CHILD @@ -100,7 +106,7 @@ config USB_MUSB_AM335X_CHILD choice prompt 'MUSB DMA mode' - default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM + default MUSB_PIO_ONLY if ARCH_MULTIPLATFORM || USB_MUSB_JZ4740 default USB_UX500_DMA if USB_MUSB_UX500 default USB_INVENTRA_DMA if USB_MUSB_OMAP2PLUS || USB_MUSB_BLACKFIN default USB_TI_CPPI_DMA if USB_MUSB_DAVINCI diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index c5ea5c6dc169..ba495018b416 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile @@ -19,6 +19,7 @@ obj-$(CONFIG_USB_MUSB_DAVINCI) += davinci.o obj-$(CONFIG_USB_MUSB_DA8XX) += da8xx.o obj-$(CONFIG_USB_MUSB_BLACKFIN) += blackfin.o obj-$(CONFIG_USB_MUSB_UX500) += ux500.o +obj-$(CONFIG_USB_MUSB_JZ4740) += jz4740.o obj-$(CONFIG_USB_MUSB_AM335X_CHILD) += musb_am335x.o diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c index ca45b39db5b9..b3aa0184af9a 100644 --- a/drivers/usb/musb/am35x.c +++ b/drivers/usb/musb/am35x.c @@ -26,7 +26,6 @@ * */ -#include <linux/init.h> #include <linux/module.h> #include <linux/clk.h> #include <linux/err.h> diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index d9692f78e227..796677fa9a15 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c @@ -11,7 +11,6 @@ #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/gpio.h> #include <linux/io.h> @@ -77,7 +76,7 @@ void musb_write_fifo(struct musb_hw_ep *hw_ep, u16 len, const u8 *src) bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), dma_reg); SSYNC(); - /* Wait for compelete */ + /* Wait for complete */ while (!(bfin_read_USB_DMA_INTERRUPT() & (1 << epnum))) cpu_relax(); @@ -131,7 +130,7 @@ void musb_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst) bfin_write16(USB_DMA_REG(epnum, USB_DMAx_CTRL), dma_reg); SSYNC(); - /* Wait for compelete */ + /* Wait for complete */ while (!(bfin_read_USB_DMA_INTERRUPT() & (1 << epnum))) cpu_relax(); diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index 2f2c1cb36421..e3486de71995 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c @@ -26,7 +26,6 @@ * */ -#include <linux/init.h> #include <linux/module.h> #include <linux/clk.h> #include <linux/err.h> diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 1121fd741bf8..c259dac9d056 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c @@ -24,7 +24,6 @@ #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/delay.h> #include <linux/clk.h> diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c new file mode 100644 index 000000000000..5f30537f1927 --- /dev/null +++ b/drivers/usb/musb/jz4740.c @@ -0,0 +1,201 @@ +/* + * Ingenic JZ4740 "glue layer" + * + * Copyright (C) 2013, Apelete Seketeli <apelete@seketeli.net> + * + * 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. + * + * 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. + */ + +#include <linux/clk.h> +#include <linux/dma-mapping.h> +#include <linux/errno.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include "musb_core.h" + +struct jz4740_glue { + struct device *dev; + struct platform_device *musb; + struct clk *clk; +}; + +static irqreturn_t jz4740_musb_interrupt(int irq, void *__hci) +{ + unsigned long flags; + irqreturn_t retval = IRQ_NONE; + struct musb *musb = __hci; + + spin_lock_irqsave(&musb->lock, flags); + + musb->int_usb = musb_readb(musb->mregs, MUSB_INTRUSB); + musb->int_tx = musb_readw(musb->mregs, MUSB_INTRTX); + musb->int_rx = musb_readw(musb->mregs, MUSB_INTRRX); + + /* + * The controller is gadget only, the state of the host mode IRQ bits is + * undefined. Mask them to make sure that the musb driver core will + * never see them set + */ + musb->int_usb &= MUSB_INTR_SUSPEND | MUSB_INTR_RESUME | + MUSB_INTR_RESET | MUSB_INTR_SOF; + + if (musb->int_usb || musb->int_tx || musb->int_rx) + retval = musb_interrupt(musb); + + spin_unlock_irqrestore(&musb->lock, flags); + + return retval; +} + +static struct musb_fifo_cfg jz4740_musb_fifo_cfg[] = { +{ .hw_ep_num = 1, .style = FIFO_TX, .maxpacket = 512, }, +{ .hw_ep_num = 1, .style = FIFO_RX, .maxpacket = 512, }, +{ .hw_ep_num = 2, .style = FIFO_TX, .maxpacket = 64, }, +}; + +static struct musb_hdrc_config jz4740_musb_config = { + /* Silicon does not implement USB OTG. */ + .multipoint = 0, + /* Max EPs scanned, driver will decide which EP can be used. */ + .num_eps = 4, + /* RAMbits needed to configure EPs from table */ + .ram_bits = 9, + .fifo_cfg = jz4740_musb_fifo_cfg, + .fifo_cfg_size = ARRAY_SIZE(jz4740_musb_fifo_cfg), +}; + +static struct musb_hdrc_platform_data jz4740_musb_platform_data = { + .mode = MUSB_PERIPHERAL, + .config = &jz4740_musb_config, +}; + +static int jz4740_musb_init(struct musb *musb) +{ + musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); + if (!musb->xceiv) { + pr_err("HS UDC: no transceiver configured\n"); + return -ENODEV; + } + + /* Silicon does not implement ConfigData register. + * Set dyn_fifo to avoid reading EP config from hardware. + */ + musb->dyn_fifo = true; + + musb->isr = jz4740_musb_interrupt; + + return 0; +} + +static int jz4740_musb_exit(struct musb *musb) +{ + usb_put_phy(musb->xceiv); + + return 0; +} + +static const struct musb_platform_ops jz4740_musb_ops = { + .init = jz4740_musb_init, + .exit = jz4740_musb_exit, +}; + +static int jz4740_probe(struct platform_device *pdev) +{ + struct musb_hdrc_platform_data *pdata = &jz4740_musb_platform_data; + struct platform_device *musb; + struct jz4740_glue *glue; + struct clk *clk; + int ret; + + glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); + if (!glue) + return -ENOMEM; + + musb = platform_device_alloc("musb-hdrc", PLATFORM_DEVID_AUTO); + if (!musb) { + dev_err(&pdev->dev, "failed to allocate musb device\n"); + return -ENOMEM; + } + + clk = devm_clk_get(&pdev->dev, "udc"); + if (IS_ERR(clk)) { + dev_err(&pdev->dev, "failed to get clock\n"); + ret = PTR_ERR(clk); + goto err_platform_device_put; + } + + ret = clk_prepare_enable(clk); + if (ret) { + dev_err(&pdev->dev, "failed to enable clock\n"); + goto err_platform_device_put; + } + + musb->dev.parent = &pdev->dev; + + glue->dev = &pdev->dev; + glue->musb = musb; + glue->clk = clk; + + pdata->platform_ops = &jz4740_musb_ops; + + platform_set_drvdata(pdev, glue); + + ret = platform_device_add_resources(musb, pdev->resource, + pdev->num_resources); + if (ret) { + dev_err(&pdev->dev, "failed to add resources\n"); + goto err_clk_disable; + } + + ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); + if (ret) { + dev_err(&pdev->dev, "failed to add platform_data\n"); + goto err_clk_disable; + } + + ret = platform_device_add(musb); + if (ret) { + dev_err(&pdev->dev, "failed to register musb device\n"); + goto err_clk_disable; + } + + return 0; + +err_clk_disable: + clk_disable_unprepare(clk); +err_platform_device_put: + platform_device_put(musb); + return ret; +} + +static int jz4740_remove(struct platform_device *pdev) +{ + struct jz4740_glue *glue = platform_get_drvdata(pdev); + + platform_device_unregister(glue->musb); + clk_disable_unprepare(glue->clk); + + return 0; +} + +static struct platform_driver jz4740_driver = { + .probe = jz4740_probe, + .remove = jz4740_remove, + .driver = { + .name = "musb-jz4740", + }, +}; + +MODULE_DESCRIPTION("JZ4740 MUSB Glue Layer"); +MODULE_AUTHOR("Apelete Seketeli <apelete@seketeli.net>"); +MODULE_LICENSE("GPL v2"); +module_platform_driver(jz4740_driver); diff --git a/drivers/usb/musb/musb_am335x.c b/drivers/usb/musb/musb_am335x.c index 8be9b02c3cc2..d2353781bd2d 100644 --- a/drivers/usb/musb/musb_am335x.c +++ b/drivers/usb/musb/musb_am335x.c @@ -1,4 +1,3 @@ -#include <linux/init.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> #include <linux/module.h> diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 4d4499b80449..fc192ad9cc6a 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c @@ -83,7 +83,7 @@ * This gets many kinds of configuration information: * - Kconfig for everything user-configurable * - platform_device for addressing, irq, and platform_data - * - platform_data is mostly for board-specific informarion + * - platform_data is mostly for board-specific information * (plus recentrly, SOC or family details) * * Most of the conditional compilation will (someday) vanish. @@ -93,7 +93,6 @@ #include <linux/kernel.h> #include <linux/sched.h> #include <linux/slab.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/kobject.h> #include <linux/prefetch.h> @@ -478,8 +477,8 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, musb->port1_status |= (USB_PORT_STAT_C_SUSPEND << 16) | MUSB_PORT_STAT_RESUME; - musb->rh_timer = jiffies - + msecs_to_jiffies(20); + schedule_delayed_work( + &musb->finish_resume_work, 20); musb->xceiv->state = OTG_STATE_A_HOST; musb->is_active = 1; @@ -1187,7 +1186,7 @@ fifo_setup(struct musb *musb, struct musb_hw_ep *hw_ep, musb_writeb(mbase, MUSB_INDEX, hw_ep->epnum); /* EP0 reserved endpoint for control, bidirectional; - * EP1 reserved for bulk, two unidirection halves. + * EP1 reserved for bulk, two unidirectional halves. */ if (hw_ep->epnum == 1) musb->bulk_ep = hw_ep; @@ -1813,6 +1812,21 @@ static void musb_free(struct musb *musb) musb_host_free(musb); } +static void musb_deassert_reset(struct work_struct *work) +{ + struct musb *musb; + unsigned long flags; + + musb = container_of(work, struct musb, deassert_reset_work.work); + + spin_lock_irqsave(&musb->lock, flags); + + if (musb->port1_status & USB_PORT_STAT_RESET) + musb_port_reset(musb, false); + + spin_unlock_irqrestore(&musb->lock, flags); +} + /* * Perform generic per-controller initialization. * @@ -1857,7 +1871,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) /* The musb_platform_init() call: * - adjusts musb->mregs * - sets the musb->isr - * - may initialize an integrated tranceiver + * - may initialize an integrated transceiver * - initializes musb->xceiv, usually by otg_get_phy() * - stops powering VBUS * @@ -1897,6 +1911,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) /* Init IRQ workqueue before request_irq */ INIT_WORK(&musb->irq_work, musb_irq_work); + INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); + INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); /* setup musb parts of the core (especially endpoints) */ status = musb_core_init(plat->config->multipoint @@ -1940,17 +1956,26 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl) switch (musb->port_mode) { case MUSB_PORT_MODE_HOST: status = musb_host_setup(musb, plat->power); + if (status < 0) + goto fail3; + status = musb_platform_set_mode(musb, MUSB_HOST); break; case MUSB_PORT_MODE_GADGET: status = musb_gadget_setup(musb); + if (status < 0) + goto fail3; + status = musb_platform_set_mode(musb, MUSB_PERIPHERAL); break; case MUSB_PORT_MODE_DUAL_ROLE: status = musb_host_setup(musb, plat->power); if (status < 0) goto fail3; status = musb_gadget_setup(musb); - if (status) + if (status) { musb_host_cleanup(musb); + goto fail3; + } + status = musb_platform_set_mode(musb, MUSB_OTG); break; default: dev_err(dev, "unsupported port mode %d\n", musb->port_mode); @@ -1981,6 +2006,8 @@ fail4: fail3: cancel_work_sync(&musb->irq_work); + cancel_delayed_work_sync(&musb->finish_resume_work); + cancel_delayed_work_sync(&musb->deassert_reset_work); if (musb->dma_controller) dma_controller_destroy(musb->dma_controller); fail2_5: @@ -2044,6 +2071,8 @@ static int musb_remove(struct platform_device *pdev) dma_controller_destroy(musb->dma_controller); cancel_work_sync(&musb->irq_work); + cancel_delayed_work_sync(&musb->finish_resume_work); + cancel_delayed_work_sync(&musb->deassert_reset_work); musb_free(musb); device_init_wakeup(dev, 0); return 0; @@ -2216,16 +2245,28 @@ static int musb_suspend(struct device *dev) */ } + musb_save_context(musb); + spin_unlock_irqrestore(&musb->lock, flags); return 0; } static int musb_resume_noirq(struct device *dev) { - /* for static cmos like DaVinci, register values were preserved + struct musb *musb = dev_to_musb(dev); + + /* + * For static cmos like DaVinci, register values were preserved * unless for some reason the whole soc powered down or the USB * module got reset through the PSC (vs just being disabled). + * + * For the DSPS glue layer though, a full register restore has to + * be done. As it shouldn't harm other platforms, we do it + * unconditionally. */ + + musb_restore_context(musb); + return 0; } @@ -2283,19 +2324,4 @@ static struct platform_driver musb_driver = { .shutdown = musb_shutdown, }; -/*-------------------------------------------------------------------------*/ - -static int __init musb_init(void) -{ - if (usb_disabled()) - return 0; - - return platform_driver_register(&musb_driver); -} -module_init(musb_init); - -static void __exit musb_cleanup(void) -{ - platform_driver_unregister(&musb_driver); -} -module_exit(musb_cleanup); +module_platform_driver(musb_driver); diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 29f7cd7c7964..7083e82776ff 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h @@ -47,6 +47,7 @@ #include <linux/usb/otg.h> #include <linux/usb/musb.h> #include <linux/phy/phy.h> +#include <linux/workqueue.h> struct musb; struct musb_hw_ep; @@ -295,6 +296,8 @@ struct musb { irqreturn_t (*isr)(int, void *); struct work_struct irq_work; + struct delayed_work deassert_reset_work; + struct delayed_work finish_resume_work; u16 hwvers; u16 intrrxe; diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c index a12bd30401e0..f88929609bac 100644 --- a/drivers/usb/musb/musb_cppi41.c +++ b/drivers/usb/musb/musb_cppi41.c @@ -615,7 +615,7 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller) dc = dma_request_slave_channel(dev, str); if (!dc) { - dev_err(dev, "Falied to request %s.\n", str); + dev_err(dev, "Failed to request %s.\n", str); ret = -EPROBE_DEFER; goto err; } diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index 1901f6fe5807..7a109eae9b9a 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c @@ -29,7 +29,6 @@ * da8xx.c would be merged to this file after testing. */ -#include <linux/init.h> #include <linux/io.h> #include <linux/err.h> #include <linux/platform_device.h> @@ -83,6 +82,8 @@ struct dsps_musb_wrapper { u16 coreintr_status; u16 phy_utmi; u16 mode; + u16 tx_mode; + u16 rx_mode; /* bit positions for control */ unsigned reset:5; @@ -106,10 +107,24 @@ struct dsps_musb_wrapper { /* bit positions for mode */ unsigned iddig:5; + unsigned iddig_mux:5; /* miscellaneous stuff */ u8 poll_seconds; }; +/* + * register shadow for suspend + */ +struct dsps_context { + u32 control; + u32 epintr; + u32 coreintr; + u32 phy_utmi; + u32 mode; + u32 tx_mode; + u32 rx_mode; +}; + /** * DSPS glue structure. */ @@ -119,6 +134,8 @@ struct dsps_glue { const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */ struct timer_list timer; /* otg_workaround timer */ unsigned long last_timer; /* last timer data for each instance */ + + struct dsps_context context; }; static void dsps_musb_try_idle(struct musb *musb, unsigned long timeout) @@ -341,8 +358,9 @@ static irqreturn_t dsps_interrupt(int irq, void *hci) if (musb->int_tx || musb->int_rx || musb->int_usb) ret |= musb_interrupt(musb); - /* Poll for ID change */ - if (musb->xceiv->state == OTG_STATE_B_IDLE) + /* Poll for ID change in OTG port mode */ + if (musb->xceiv->state == OTG_STATE_B_IDLE && + musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE) mod_timer(&glue->timer, jiffies + wrp->poll_seconds * HZ); out: spin_unlock_irqrestore(&musb->lock, flags); @@ -406,6 +424,54 @@ static int dsps_musb_exit(struct musb *musb) return 0; } +static int dsps_musb_set_mode(struct musb *musb, u8 mode) +{ + struct device *dev = musb->controller; + struct dsps_glue *glue = dev_get_drvdata(dev->parent); + const struct dsps_musb_wrapper *wrp = glue->wrp; + void __iomem *ctrl_base = musb->ctrl_base; + void __iomem *base = musb->mregs; + u32 reg; + + reg = dsps_readl(base, wrp->mode); + + switch (mode) { + case MUSB_HOST: + reg &= ~(1 << wrp->iddig); + + /* + * if we're setting mode to host-only or device-only, we're + * going to ignore whatever the PHY sends us and just force + * ID pin status by SW + */ + reg |= (1 << wrp->iddig_mux); + + dsps_writel(base, wrp->mode, reg); + dsps_writel(ctrl_base, wrp->phy_utmi, 0x02); + break; + case MUSB_PERIPHERAL: + reg |= (1 << wrp->iddig); + + /* + * if we're setting mode to host-only or device-only, we're + * going to ignore whatever the PHY sends us and just force + * ID pin status by SW + */ + reg |= (1 << wrp->iddig_mux); + + dsps_writel(base, wrp->mode, reg); + break; + case MUSB_OTG: + dsps_writel(base, wrp->phy_utmi, 0x02); + break; + default: + dev_err(glue->dev, "unsupported mode %d\n", mode); + return -EINVAL; + } + + return 0; +} + static struct musb_platform_ops dsps_ops = { .init = dsps_musb_init, .exit = dsps_musb_exit, @@ -414,6 +480,7 @@ static struct musb_platform_ops dsps_ops = { .disable = dsps_musb_disable, .try_idle = dsps_musb_try_idle, + .set_mode = dsps_musb_set_mode, }; static u64 musb_dmamask = DMA_BIT_MASK(32); @@ -507,6 +574,7 @@ static int dsps_create_musb_pdev(struct dsps_glue *glue, config->num_eps = get_int_prop(dn, "mentor,num-eps"); config->ram_bits = get_int_prop(dn, "mentor,ram-bits"); + config->host_port_deassert_reset_at_resume = 1; pdata.mode = get_musb_port_mode(dev); /* DT keeps this entry in mA, musb expects it as per USB spec */ pdata.power = get_int_prop(dn, "mentor,power") / 2; @@ -605,9 +673,12 @@ static const struct dsps_musb_wrapper am33xx_driver_data = { .coreintr_status = 0x34, .phy_utmi = 0xe0, .mode = 0xe8, + .tx_mode = 0x70, + .rx_mode = 0x74, .reset = 0, .otg_disable = 21, .iddig = 8, + .iddig_mux = 7, .usb_shift = 0, .usb_mask = 0x1ff, .usb_bitmap = (0x1ff << 0), @@ -628,11 +699,52 @@ static const struct of_device_id musb_dsps_of_match[] = { }; MODULE_DEVICE_TABLE(of, musb_dsps_of_match); +#ifdef CONFIG_PM +static int dsps_suspend(struct device *dev) +{ + struct dsps_glue *glue = dev_get_drvdata(dev); + const struct dsps_musb_wrapper *wrp = glue->wrp; + struct musb *musb = platform_get_drvdata(glue->musb); + void __iomem *mbase = musb->ctrl_base; + + glue->context.control = dsps_readl(mbase, wrp->control); + glue->context.epintr = dsps_readl(mbase, wrp->epintr_set); + glue->context.coreintr = dsps_readl(mbase, wrp->coreintr_set); + glue->context.phy_utmi = dsps_readl(mbase, wrp->phy_utmi); + glue->context.mode = dsps_readl(mbase, wrp->mode); + glue->context.tx_mode = dsps_readl(mbase, wrp->tx_mode); + glue->context.rx_mode = dsps_readl(mbase, wrp->rx_mode); + + return 0; +} + +static int dsps_resume(struct device *dev) +{ + struct dsps_glue *glue = dev_get_drvdata(dev); + const struct dsps_musb_wrapper *wrp = glue->wrp; + struct musb *musb = platform_get_drvdata(glue->musb); + void __iomem *mbase = musb->ctrl_base; + + dsps_writel(mbase, wrp->control, glue->context.control); + dsps_writel(mbase, wrp->epintr_set, glue->context.epintr); + dsps_writel(mbase, wrp->coreintr_set, glue->context.coreintr); + dsps_writel(mbase, wrp->phy_utmi, glue->context.phy_utmi); + dsps_writel(mbase, wrp->mode, glue->context.mode); + dsps_writel(mbase, wrp->tx_mode, glue->context.tx_mode); + dsps_writel(mbase, wrp->rx_mode, glue->context.rx_mode); + + return 0; +} +#endif + +static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume); + static struct platform_driver dsps_usbss_driver = { .probe = dsps_probe, .remove = dsps_remove, .driver = { .name = "musb-dsps", + .pm = &dsps_pm_ops, .of_match_table = musb_dsps_of_match, }, }; diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 32fb057c03f5..d4aa779339f1 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c @@ -1727,14 +1727,14 @@ init_peripheral_ep(struct musb *musb, struct musb_ep *ep, u8 epnum, int is_in) ep->end_point.name = ep->name; INIT_LIST_HEAD(&ep->end_point.ep_list); if (!epnum) { - ep->end_point.maxpacket = 64; + usb_ep_set_maxpacket_limit(&ep->end_point, 64); ep->end_point.ops = &musb_g_ep0_ops; musb->g.ep0 = &ep->end_point; } else { if (is_in) - ep->end_point.maxpacket = hw_ep->max_packet_sz_tx; + usb_ep_set_maxpacket_limit(&ep->end_point, hw_ep->max_packet_sz_tx); else - ep->end_point.maxpacket = hw_ep->max_packet_sz_rx; + usb_ep_set_maxpacket_limit(&ep->end_point, hw_ep->max_packet_sz_rx); ep->end_point.ops = &musb_ep_ops; list_add_tail(&ep->end_point.ep_list, &musb->g.ep_list); } @@ -2119,7 +2119,15 @@ __acquires(musb->lock) /* Normal reset, as B-Device; * or else after HNP, as A-Device */ - if (devctl & MUSB_DEVCTL_BDEVICE) { + if (!musb->g.is_otg) { + /* USB device controllers that are not OTG compatible + * may not have DEVCTL register in silicon. + * In that case, do not rely on devctl for setting + * peripheral mode. + */ + musb->xceiv->state = OTG_STATE_B_PERIPHERAL; + musb->g.is_a_peripheral = 0; + } else if (devctl & MUSB_DEVCTL_BDEVICE) { musb->xceiv->state = OTG_STATE_B_PERIPHERAL; musb->g.is_a_peripheral = 0; } else { diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 6582a20bec05..ed455724017b 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c @@ -39,7 +39,6 @@ #include <linux/sched.h> #include <linux/slab.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/list.h> #include <linux/dma-mapping.h> @@ -2013,7 +2012,7 @@ static int musb_schedule( head = &musb->out_bulk; /* Enable bulk RX/TX NAK timeout scheme when bulk requests are - * multiplexed. This scheme doen't work in high speed to full + * multiplexed. This scheme does not work in high speed to full * speed scenario as NAK interrupts are not coming from a * full speed device connected to a high speed device. * NAK timeout interval is 8 (128 uframe or 16ms) for HS and @@ -2433,6 +2432,8 @@ static int musb_bus_suspend(struct usb_hcd *hcd) struct musb *musb = hcd_to_musb(hcd); u8 devctl; + musb_port_suspend(musb, true); + if (!is_host_active(musb)) return 0; @@ -2462,7 +2463,12 @@ static int musb_bus_suspend(struct usb_hcd *hcd) static int musb_bus_resume(struct usb_hcd *hcd) { - /* resuming child port does the work */ + struct musb *musb = hcd_to_musb(hcd); + + if (musb->config && + musb->config->host_port_deassert_reset_at_resume) + musb_port_reset(musb, false); + return 0; } @@ -2657,6 +2663,7 @@ int musb_host_setup(struct musb *musb, int power_budget) if (ret < 0) return ret; + device_wakeup_enable(hcd->self.controller); return 0; } diff --git a/drivers/usb/musb/musb_host.h b/drivers/usb/musb/musb_host.h index 960d73570b2f..7bbf01bf4bb0 100644 --- a/drivers/usb/musb/musb_host.h +++ b/drivers/usb/musb/musb_host.h @@ -92,6 +92,9 @@ extern void musb_host_rx(struct musb *, u8); extern void musb_root_disconnect(struct musb *musb); extern void musb_host_resume_root_hub(struct musb *musb); extern void musb_host_poke_root_hub(struct musb *musb); +extern void musb_port_suspend(struct musb *musb, bool do_suspend); +extern void musb_port_reset(struct musb *musb, bool do_reset); +extern void musb_host_finish_resume(struct work_struct *work); #else static inline struct musb *hcd_to_musb(struct usb_hcd *hcd) { @@ -121,6 +124,9 @@ static inline void musb_root_disconnect(struct musb *musb) {} static inline void musb_host_resume_root_hub(struct musb *musb) {} static inline void musb_host_poll_rh_status(struct musb *musb) {} static inline void musb_host_poke_root_hub(struct musb *musb) {} +static inline void musb_port_suspend(struct musb *musb, bool do_suspend) {} +static inline void musb_port_reset(struct musb *musb, bool do_reset) {} +static inline void musb_host_finish_resume(struct work_struct *work) {} #endif struct usb_hcd; diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c index 9af6bba5eac9..eb634433ef09 100644 --- a/drivers/usb/musb/musb_virthub.c +++ b/drivers/usb/musb/musb_virthub.c @@ -36,7 +36,6 @@ #include <linux/kernel.h> #include <linux/sched.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/time.h> #include <linux/timer.h> @@ -44,7 +43,38 @@ #include "musb_core.h" -static void musb_port_suspend(struct musb *musb, bool do_suspend) +void musb_host_finish_resume(struct work_struct *work) +{ + struct musb *musb; + unsigned long flags; + u8 power; + + musb = container_of(work, struct musb, finish_resume_work.work); + + spin_lock_irqsave(&musb->lock, flags); + + power = musb_readb(musb->mregs, MUSB_POWER); + power &= ~MUSB_POWER_RESUME; + dev_dbg(musb->controller, "root port resume stopped, power %02x\n", + power); + musb_writeb(musb->mregs, MUSB_POWER, power); + + /* + * ISSUE: DaVinci (RTL 1.300) disconnects after + * resume of high speed peripherals (but not full + * speed ones). + */ + musb->is_active = 1; + musb->port1_status &= ~(USB_PORT_STAT_SUSPEND | MUSB_PORT_STAT_RESUME); + musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16; + usb_hcd_poll_rh_status(musb->hcd); + /* NOTE: it might really be A_WAIT_BCON ... */ + musb->xceiv->state = OTG_STATE_A_HOST; + + spin_unlock_irqrestore(&musb->lock, flags); +} + +void musb_port_suspend(struct musb *musb, bool do_suspend) { struct usb_otg *otg = musb->xceiv->otg; u8 power; @@ -105,11 +135,11 @@ static void musb_port_suspend(struct musb *musb, bool do_suspend) /* later, GetPortStatus will stop RESUME signaling */ musb->port1_status |= MUSB_PORT_STAT_RESUME; - musb->rh_timer = jiffies + msecs_to_jiffies(20); + schedule_delayed_work(&musb->finish_resume_work, 20); } } -static void musb_port_reset(struct musb *musb, bool do_reset) +void musb_port_reset(struct musb *musb, bool do_reset) { u8 power; void __iomem *mbase = musb->mregs; @@ -150,7 +180,7 @@ static void musb_port_reset(struct musb *musb, bool do_reset) musb->port1_status |= USB_PORT_STAT_RESET; musb->port1_status &= ~USB_PORT_STAT_ENABLE; - musb->rh_timer = jiffies + msecs_to_jiffies(50); + schedule_delayed_work(&musb->deassert_reset_work, 50); } else { dev_dbg(musb->controller, "root port reset stopped\n"); musb_writeb(mbase, MUSB_POWER, @@ -325,36 +355,6 @@ int musb_hub_control( if (wIndex != 1) goto error; - /* finish RESET signaling? */ - if ((musb->port1_status & USB_PORT_STAT_RESET) - && time_after_eq(jiffies, musb->rh_timer)) - musb_port_reset(musb, false); - - /* finish RESUME signaling? */ - if ((musb->port1_status & MUSB_PORT_STAT_RESUME) - && time_after_eq(jiffies, musb->rh_timer)) { - u8 power; - - power = musb_readb(musb->mregs, MUSB_POWER); - power &= ~MUSB_POWER_RESUME; - dev_dbg(musb->controller, "root port resume stopped, power %02x\n", - power); - musb_writeb(musb->mregs, MUSB_POWER, power); - - /* ISSUE: DaVinci (RTL 1.300) disconnects after - * resume of high speed peripherals (but not full - * speed ones). - */ - - musb->is_active = 1; - musb->port1_status &= ~(USB_PORT_STAT_SUSPEND - | MUSB_PORT_STAT_RESUME); - musb->port1_status |= USB_PORT_STAT_C_SUSPEND << 16; - usb_hcd_poll_rh_status(musb->hcd); - /* NOTE: it might really be A_WAIT_BCON ... */ - musb->xceiv->state = OTG_STATE_A_HOST; - } - put_unaligned(cpu_to_le32(musb->port1_status & ~MUSB_PORT_STAT_RESUME), (__le32 *) buf); diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 4432314d70ee..4e9fb1d08698 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c @@ -18,7 +18,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/err.h> -#include <linux/init.h> #include <linux/prefetch.h> #include <linux/usb.h> #include <linux/irq.h> diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index b8794eb81e9c..e33b6b2c44c2 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c @@ -11,7 +11,6 @@ #include <linux/module.h> #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/usb.h> #include <linux/platform_device.h> #include <linux/dma-mapping.h> diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c index 122446bf1664..c2e45e632723 100644 --- a/drivers/usb/musb/ux500.c +++ b/drivers/usb/musb/ux500.c @@ -21,7 +21,6 @@ #include <linux/module.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/clk.h> #include <linux/err.h> #include <linux/io.h> diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index 3700e9713258..9aad00f11bd5 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c @@ -336,7 +336,9 @@ static int ux500_dma_controller_start(struct ux500_dma_controller *controller) data ? data->dma_filter : NULL, - param_array[ch_num]); + param_array ? + param_array[ch_num] : + NULL); if (!ux500_channel->dma_chan) { ERR("Dma pipe allocation error dir=%d ch=%d\n", diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig index 2b41c636a52a..7d1451d5bbea 100644 --- a/drivers/usb/phy/Kconfig +++ b/drivers/usb/phy/Kconfig @@ -6,6 +6,15 @@ menu "USB Physical Layer drivers" config USB_PHY def_bool n +config USB_OTG_FSM + tristate "USB 2.0 OTG FSM implementation" + depends on USB + select USB_OTG + select USB_PHY + help + Implements OTG Final State Machine as specified in On-The-Go + and Embedded Host Supplement to the USB Revision 2.0 Specification. + # # USB Transceiver Drivers # @@ -19,9 +28,8 @@ config AB8500_USB in host mode, low speed. config FSL_USB2_OTG - tristate "Freescale USB OTG Transceiver Driver" - depends on USB_EHCI_FSL && USB_FSL_USB2 && PM_RUNTIME - depends on USB + bool "Freescale USB OTG Transceiver Driver" + depends on USB_EHCI_FSL && USB_FSL_USB2 && USB_OTG_FSM && PM_RUNTIME select USB_OTG select USB_PHY help @@ -40,7 +48,16 @@ config ISP1301_OMAP Instruments OMAP processors. This driver can also be built as a module. If so, the module - will be called isp1301_omap. + will be called phy-isp1301-omap. + +config KEYSTONE_USB_PHY + tristate "Keystone USB PHY Driver" + depends on ARCH_KEYSTONE || COMPILE_TEST + select NOP_USB_XCEIV + help + Enable this to support Keystone USB phy. This driver provides + interface to interact with USB 2.0 and USB 3.0 PHY that is part + of the Keystone SOC. config MV_U3D_PHY bool "Marvell USB 3.0 PHY controller Driver" @@ -136,6 +153,31 @@ config USB_GPIO_VBUS optionally control of a D+ pullup GPIO as well as a VBUS current limit regulator. +config OMAP_OTG + tristate "OMAP USB OTG controller driver" + depends on ARCH_OMAP_OTG && EXTCON + help + Enable this to support some transceivers on OMAP1 platforms. OTG + controller is needed to switch between host and peripheral modes. + + This driver can also be built as a module. If so, the module + will be called phy-omap-otg. + +config TAHVO_USB + tristate "Tahvo USB transceiver driver" + depends on MFD_RETU && EXTCON + select USB_PHY + help + Enable this to support USB transceiver on Tahvo. This is used + at least on Nokia 770. + +config TAHVO_USB_HOST_BY_DEFAULT + depends on TAHVO_USB + boolean "Device in USB host mode by default" + help + Say Y here, if you want the device to enter USB host mode + by default on bootup. + config USB_ISP1301 tristate "NXP ISP1301 USB transceiver support" depends on USB || USB_GADGET @@ -147,7 +189,7 @@ config USB_ISP1301 and OTG drivers (to be selected separately). To compile this driver as a module, choose M here: the - module will be called isp1301. + module will be called phy-isp1301. config USB_MSM_OTG tristate "OTG support for Qualcomm on-chip USB controller" diff --git a/drivers/usb/phy/Makefile b/drivers/usb/phy/Makefile index 022c1da7fb78..be58adae3496 100644 --- a/drivers/usb/phy/Makefile +++ b/drivers/usb/phy/Makefile @@ -3,18 +3,20 @@ # obj-$(CONFIG_USB_PHY) += phy.o obj-$(CONFIG_OF) += of.o +obj-$(CONFIG_USB_OTG_FSM) += phy-fsm-usb.o # transceiver drivers, keep the list sorted obj-$(CONFIG_AB8500_USB) += phy-ab8500-usb.o -phy-fsl-usb2-objs := phy-fsl-usb.o phy-fsm-usb.o -obj-$(CONFIG_FSL_USB2_OTG) += phy-fsl-usb2.o +obj-$(CONFIG_FSL_USB2_OTG) += phy-fsl-usb.o obj-$(CONFIG_ISP1301_OMAP) += phy-isp1301-omap.o obj-$(CONFIG_MV_U3D_PHY) += phy-mv-u3d-usb.o obj-$(CONFIG_NOP_USB_XCEIV) += phy-generic.o +obj-$(CONFIG_TAHVO_USB) += phy-tahvo.o obj-$(CONFIG_OMAP_CONTROL_USB) += phy-omap-control.o obj-$(CONFIG_AM335X_CONTROL_USB) += phy-am335x-control.o obj-$(CONFIG_AM335X_PHY_USB) += phy-am335x.o +obj-$(CONFIG_OMAP_OTG) += phy-omap-otg.o obj-$(CONFIG_OMAP_USB3) += phy-omap-usb3.o obj-$(CONFIG_SAMSUNG_USBPHY) += phy-samsung-usb.o obj-$(CONFIG_SAMSUNG_USB2PHY) += phy-samsung-usb2.o @@ -30,3 +32,4 @@ obj-$(CONFIG_USB_RCAR_PHY) += phy-rcar-usb.o obj-$(CONFIG_USB_RCAR_GEN2_PHY) += phy-rcar-gen2-usb.o obj-$(CONFIG_USB_ULPI) += phy-ulpi.o obj-$(CONFIG_USB_ULPI_VIEWPORT) += phy-ulpi-viewport.o +obj-$(CONFIG_KEYSTONE_USB_PHY) += phy-keystone.o diff --git a/drivers/usb/phy/phy-ab8500-usb.c b/drivers/usb/phy/phy-ab8500-usb.c index 087402350b6d..11ab2c45e462 100644 --- a/drivers/usb/phy/phy-ab8500-usb.c +++ b/drivers/usb/phy/phy-ab8500-usb.c @@ -1415,8 +1415,6 @@ static int ab8500_usb_probe(struct platform_device *pdev) platform_set_drvdata(pdev, ab); - ATOMIC_INIT_NOTIFIER_HEAD(&ab->phy.notifier); - /* all: Disable phy when called from set_host and set_peripheral */ INIT_WORK(&ab->phy_dis_work, ab8500_usb_phy_disable_work); diff --git a/drivers/usb/phy/phy-am335x-control.c b/drivers/usb/phy/phy-am335x-control.c index 634f49acd20e..d75196ad5f2f 100644 --- a/drivers/usb/phy/phy-am335x-control.c +++ b/drivers/usb/phy/phy-am335x-control.c @@ -3,11 +3,7 @@ #include <linux/err.h> #include <linux/of.h> #include <linux/io.h> - -struct phy_control { - void (*phy_power)(struct phy_control *phy_ctrl, u32 id, bool on); - void (*phy_wkup)(struct phy_control *phy_ctrl, u32 id, bool on); -}; +#include "am35x-phy-control.h" struct am335x_control_usb { struct device *dev; diff --git a/drivers/usb/phy/phy-am335x.c b/drivers/usb/phy/phy-am335x.c index 0e3c60cb669a..12fc3468a01e 100644 --- a/drivers/usb/phy/phy-am335x.c +++ b/drivers/usb/phy/phy-am335x.c @@ -63,6 +63,19 @@ static int am335x_phy_probe(struct platform_device *pdev) am_phy->usb_phy_gen.phy.shutdown = am335x_shutdown; platform_set_drvdata(pdev, am_phy); + device_init_wakeup(dev, true); + + /* + * If we leave PHY wakeup enabled then AM33XX wakes up + * immediately from DS0. To avoid this we mark dev->power.can_wakeup + * to false. The same is checked in suspend routine to decide + * on whether to enable PHY wakeup or not. + * PHY wakeup works fine in standby mode, there by allowing us to + * handle remote wakeup, wakeup on disconnect and connect. + */ + + device_set_wakeup_enable(dev, false); + phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, false); return 0; } @@ -75,38 +88,48 @@ static int am335x_phy_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM_RUNTIME - -static int am335x_phy_runtime_suspend(struct device *dev) +#ifdef CONFIG_PM_SLEEP +static int am335x_phy_suspend(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct am335x_phy *am_phy = platform_get_drvdata(pdev); + /* + * Enable phy wakeup only if dev->power.can_wakeup is true. + * Make sure to enable wakeup to support remote wakeup in + * standby mode ( same is not supported in OFF(DS0) mode). + * Enable it by doing + * echo enabled > /sys/bus/platform/devices/<usb-phy-id>/power/wakeup + */ + if (device_may_wakeup(dev)) phy_ctrl_wkup(am_phy->phy_ctrl, am_phy->id, true); + phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, false); + return 0; } -static int am335x_phy_runtime_resume(struct device *dev) +static int am335x_phy_resume(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct am335x_phy *am_phy = platform_get_drvdata(pdev); phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, true); + if (device_may_wakeup(dev)) phy_ctrl_wkup(am_phy->phy_ctrl, am_phy->id, false); + return 0; } static const struct dev_pm_ops am335x_pm_ops = { - SET_RUNTIME_PM_OPS(am335x_phy_runtime_suspend, - am335x_phy_runtime_resume, NULL) + SET_SYSTEM_SLEEP_PM_OPS(am335x_phy_suspend, am335x_phy_resume) }; -#define DEV_PM_OPS (&am335x_pm_ops) +#define DEV_PM_OPS (&am335x_pm_ops) #else -#define DEV_PM_OPS NULL +#define DEV_PM_OPS NULL #endif static const struct of_device_id am335x_phy_ids[] = { diff --git a/drivers/usb/phy/phy-fsl-usb.c b/drivers/usb/phy/phy-fsl-usb.c index 7f3c73b967ce..2b0f968d9325 100644 --- a/drivers/usb/phy/phy-fsl-usb.c +++ b/drivers/usb/phy/phy-fsl-usb.c @@ -27,7 +27,6 @@ #include <linux/slab.h> #include <linux/proc_fs.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/timer.h> @@ -848,7 +847,7 @@ static int fsl_otg_conf(struct platform_device *pdev) pr_info("Couldn't init OTG timers\n"); goto err; } - spin_lock_init(&fsl_otg_tc->fsm.lock); + mutex_init(&fsl_otg_tc->fsm.lock); /* Set OTG state machine operations */ fsl_otg_tc->fsm.ops = &fsl_otg_ops; @@ -1017,10 +1016,9 @@ static int show_fsl_usb2_otg_state(struct device *dev, struct otg_fsm *fsm = &fsl_otg_dev->fsm; char *next = buf; unsigned size = PAGE_SIZE; - unsigned long flags; int t; - spin_lock_irqsave(&fsm->lock, flags); + mutex_lock(&fsm->lock); /* basic driver infomation */ t = scnprintf(next, size, @@ -1088,7 +1086,7 @@ static int show_fsl_usb2_otg_state(struct device *dev, size -= t; next += t; - spin_unlock_irqrestore(&fsm->lock, flags); + mutex_unlock(&fsm->lock); return PAGE_SIZE - size; } diff --git a/drivers/usb/phy/phy-fsl-usb.h b/drivers/usb/phy/phy-fsl-usb.h index 7365170a2f23..5986c96354df 100644 --- a/drivers/usb/phy/phy-fsl-usb.h +++ b/drivers/usb/phy/phy-fsl-usb.h @@ -15,7 +15,7 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "phy-fsm-usb.h" +#include <linux/usb/otg-fsm.h> #include <linux/usb/otg.h> #include <linux/ioctl.h> diff --git a/drivers/usb/phy/phy-fsm-usb.c b/drivers/usb/phy/phy-fsm-usb.c index 329c2d2f8595..7aa314ef4a8a 100644 --- a/drivers/usb/phy/phy-fsm-usb.c +++ b/drivers/usb/phy/phy-fsm-usb.c @@ -23,13 +23,12 @@ #include <linux/kernel.h> #include <linux/types.h> -#include <linux/spinlock.h> +#include <linux/mutex.h> #include <linux/delay.h> #include <linux/usb.h> #include <linux/usb/gadget.h> #include <linux/usb/otg.h> - -#include "phy-fsm-usb.h" +#include <linux/usb/otg-fsm.h> /* Change USB protocol when there is a protocol change */ static int otg_set_protocol(struct otg_fsm *fsm, int protocol) @@ -65,7 +64,7 @@ static int otg_set_protocol(struct otg_fsm *fsm, int protocol) static int state_changed; /* Called when leaving a state. Do state clean up jobs here */ -void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) +static void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) { switch (old_state) { case OTG_STATE_B_IDLE: @@ -122,7 +121,7 @@ void otg_leave_state(struct otg_fsm *fsm, enum usb_otg_state old_state) } /* Called when entering a state */ -int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) +static int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) { state_changed = 1; if (fsm->otg->phy->state == new_state) @@ -245,9 +244,8 @@ int otg_set_state(struct otg_fsm *fsm, enum usb_otg_state new_state) int otg_statemachine(struct otg_fsm *fsm) { enum usb_otg_state state; - unsigned long flags; - spin_lock_irqsave(&fsm->lock, flags); + mutex_lock(&fsm->lock); state = fsm->otg->phy->state; state_changed = 0; @@ -359,7 +357,7 @@ int otg_statemachine(struct otg_fsm *fsm) default: break; } - spin_unlock_irqrestore(&fsm->lock, flags); + mutex_unlock(&fsm->lock); VDBG("quit statemachine, changed = %d\n", state_changed); return state_changed; diff --git a/drivers/usb/phy/phy-generic.c b/drivers/usb/phy/phy-generic.c index aa6d37b3378a..bb394980532b 100644 --- a/drivers/usb/phy/phy-generic.c +++ b/drivers/usb/phy/phy-generic.c @@ -241,7 +241,6 @@ int usb_phy_gen_create_phy(struct device *dev, struct usb_phy_gen_xceiv *nop, nop->phy.otg->set_host = nop_set_host; nop->phy.otg->set_peripheral = nop_set_peripheral; - ATOMIC_INIT_NOTIFIER_HEAD(&nop->phy.notifier); return 0; } EXPORT_SYMBOL_GPL(usb_phy_gen_create_phy); diff --git a/drivers/usb/phy/phy-gpio-vbus-usb.c b/drivers/usb/phy/phy-gpio-vbus-usb.c index 02799a5efcd4..69462e09d014 100644 --- a/drivers/usb/phy/phy-gpio-vbus-usb.c +++ b/drivers/usb/phy/phy-gpio-vbus-usb.c @@ -314,8 +314,6 @@ static int gpio_vbus_probe(struct platform_device *pdev) goto err_irq; } - ATOMIC_INIT_NOTIFIER_HEAD(&gpio_vbus->phy.notifier); - INIT_DELAYED_WORK(&gpio_vbus->work, gpio_vbus_work); gpio_vbus->vbus_draw = regulator_get(&pdev->dev, "vbus_draw"); diff --git a/drivers/usb/phy/phy-isp1301-omap.c b/drivers/usb/phy/phy-isp1301-omap.c index d3a5160e4cc7..6e146d723b37 100644 --- a/drivers/usb/phy/phy-isp1301-omap.c +++ b/drivers/usb/phy/phy-isp1301-omap.c @@ -1277,7 +1277,7 @@ isp1301_set_host(struct usb_otg *otg, struct usb_bus *host) { struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); - if (!otg || isp != the_transceiver) + if (isp != the_transceiver) return -ENODEV; if (!host) { @@ -1333,7 +1333,7 @@ isp1301_set_peripheral(struct usb_otg *otg, struct usb_gadget *gadget) { struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); - if (!otg || isp != the_transceiver) + if (isp != the_transceiver) return -ENODEV; if (!gadget) { @@ -1414,8 +1414,7 @@ isp1301_start_srp(struct usb_otg *otg) struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); u32 otg_ctrl; - if (!otg || isp != the_transceiver - || isp->phy.state != OTG_STATE_B_IDLE) + if (isp != the_transceiver || isp->phy.state != OTG_STATE_B_IDLE) return -ENODEV; otg_ctrl = omap_readl(OTG_CTRL); @@ -1442,7 +1441,7 @@ isp1301_start_hnp(struct usb_otg *otg) struct isp1301 *isp = container_of(otg->phy, struct isp1301, phy); u32 l; - if (!otg || isp != the_transceiver) + if (isp != the_transceiver) return -ENODEV; if (otg->default_a && (otg->host == NULL || !otg->host->b_hnp_enable)) return -ENOTCONN; diff --git a/drivers/usb/phy/phy-keystone.c b/drivers/usb/phy/phy-keystone.c new file mode 100644 index 000000000000..d762003896c0 --- /dev/null +++ b/drivers/usb/phy/phy-keystone.c @@ -0,0 +1,136 @@ +/* + * phy-keystone - USB PHY, talking to dwc3 controller in Keystone. + * + * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com + * 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. + * + * Author: WingMan Kwok <w-kwok2@ti.com> + * + * 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. + * + */ + +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/usb/usb_phy_gen_xceiv.h> +#include <linux/io.h> +#include <linux/of.h> + +#include "phy-generic.h" + +/* USB PHY control register offsets */ +#define USB_PHY_CTL_UTMI 0x0000 +#define USB_PHY_CTL_PIPE 0x0004 +#define USB_PHY_CTL_PARAM_1 0x0008 +#define USB_PHY_CTL_PARAM_2 0x000c +#define USB_PHY_CTL_CLOCK 0x0010 +#define USB_PHY_CTL_PLL 0x0014 + +#define PHY_REF_SSP_EN BIT(29) + +struct keystone_usbphy { + struct usb_phy_gen_xceiv usb_phy_gen; + void __iomem *phy_ctrl; +}; + +static inline u32 keystone_usbphy_readl(void __iomem *base, u32 offset) +{ + return readl(base + offset); +} + +static inline void keystone_usbphy_writel(void __iomem *base, + u32 offset, u32 value) +{ + writel(value, base + offset); +} + +static int keystone_usbphy_init(struct usb_phy *phy) +{ + struct keystone_usbphy *k_phy = dev_get_drvdata(phy->dev); + u32 val; + + val = keystone_usbphy_readl(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK); + keystone_usbphy_writel(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK, + val | PHY_REF_SSP_EN); + return 0; +} + +static void keystone_usbphy_shutdown(struct usb_phy *phy) +{ + struct keystone_usbphy *k_phy = dev_get_drvdata(phy->dev); + u32 val; + + val = keystone_usbphy_readl(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK); + keystone_usbphy_writel(k_phy->phy_ctrl, USB_PHY_CTL_CLOCK, + val &= ~PHY_REF_SSP_EN); +} + +static int keystone_usbphy_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct keystone_usbphy *k_phy; + struct resource *res; + int ret; + + k_phy = devm_kzalloc(dev, sizeof(*k_phy), GFP_KERNEL); + if (!k_phy) + return -ENOMEM; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + k_phy->phy_ctrl = devm_ioremap_resource(dev, res); + if (IS_ERR(k_phy->phy_ctrl)) + return PTR_ERR(k_phy->phy_ctrl); + + ret = usb_phy_gen_create_phy(dev, &k_phy->usb_phy_gen, NULL); + if (ret) + return ret; + + k_phy->usb_phy_gen.phy.init = keystone_usbphy_init; + k_phy->usb_phy_gen.phy.shutdown = keystone_usbphy_shutdown; + + platform_set_drvdata(pdev, k_phy); + + ret = usb_add_phy_dev(&k_phy->usb_phy_gen.phy); + if (ret) + return ret; + + return 0; +} + +static int keystone_usbphy_remove(struct platform_device *pdev) +{ + struct keystone_usbphy *k_phy = platform_get_drvdata(pdev); + + usb_remove_phy(&k_phy->usb_phy_gen.phy); + + return 0; +} + +static const struct of_device_id keystone_usbphy_ids[] = { + { .compatible = "ti,keystone-usbphy" }, + { } +}; +MODULE_DEVICE_TABLE(of, keystone_usbphy_ids); + +static struct platform_driver keystone_usbphy_driver = { + .probe = keystone_usbphy_probe, + .remove = keystone_usbphy_remove, + .driver = { + .name = "keystone-usbphy", + .owner = THIS_MODULE, + .of_match_table = keystone_usbphy_ids, + }, +}; + +module_platform_driver(keystone_usbphy_driver); + +MODULE_ALIAS("platform:keystone-usbphy"); +MODULE_AUTHOR("Texas Instruments Inc."); +MODULE_DESCRIPTION("Keystone USB phy driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index e9d4cd960ecd..37752832b770 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -669,6 +669,7 @@ static void msm_otg_start_host(struct usb_phy *phy, int on) pdata->setup_gpio(OTG_STATE_A_HOST); #ifdef CONFIG_USB usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); + device_wakeup_enable(hcd->self.controller); #endif } else { dev_dbg(phy->dev, "host off\n"); diff --git a/drivers/usb/phy/phy-mv-usb.c b/drivers/usb/phy/phy-mv-usb.c index 98f6ac6a78ea..7d80c54f0ac6 100644 --- a/drivers/usb/phy/phy-mv-usb.c +++ b/drivers/usb/phy/phy-mv-usb.c @@ -11,7 +11,6 @@ #include <linux/module.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/io.h> #include <linux/uaccess.h> #include <linux/device.h> @@ -213,10 +212,12 @@ static void mv_otg_start_host(struct mv_otg *mvotg, int on) hcd = bus_to_hcd(otg->host); - if (on) + if (on) { usb_add_hcd(hcd, hcd->irq, IRQF_SHARED); - else + device_wakeup_enable(hcd->self.controller); + } else { usb_remove_hcd(hcd); + } #endif /* CONFIG_USB */ } diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index 545844b7e796..b42897b6474c 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c @@ -63,9 +63,13 @@ static int mxs_phy_hw_init(struct mxs_phy *mxs_phy) static int mxs_phy_init(struct usb_phy *phy) { + int ret; struct mxs_phy *mxs_phy = to_mxs_phy(phy); - clk_prepare_enable(mxs_phy->clk); + ret = clk_prepare_enable(mxs_phy->clk); + if (ret) + return ret; + return mxs_phy_hw_init(mxs_phy); } @@ -81,6 +85,7 @@ static void mxs_phy_shutdown(struct usb_phy *phy) static int mxs_phy_suspend(struct usb_phy *x, int suspend) { + int ret; struct mxs_phy *mxs_phy = to_mxs_phy(x); if (suspend) { @@ -89,7 +94,9 @@ static int mxs_phy_suspend(struct usb_phy *x, int suspend) x->io_priv + HW_USBPHY_CTRL_SET); clk_disable_unprepare(mxs_phy->clk); } else { - clk_prepare_enable(mxs_phy->clk); + ret = clk_prepare_enable(mxs_phy->clk); + if (ret) + return ret; writel(BM_USBPHY_CTRL_CLKGATE, x->io_priv + HW_USBPHY_CTRL_CLR); writel(0, x->io_priv + HW_USBPHY_PWD); @@ -160,8 +167,6 @@ static int mxs_phy_probe(struct platform_device *pdev) mxs_phy->phy.notify_disconnect = mxs_phy_on_disconnect; mxs_phy->phy.type = USB_PHY_TYPE_USB2; - ATOMIC_INIT_NOTIFIER_HEAD(&mxs_phy->phy.notifier); - mxs_phy->clk = clk; platform_set_drvdata(pdev, mxs_phy); diff --git a/drivers/usb/phy/phy-omap-control.c b/drivers/usb/phy/phy-omap-control.c index 09c5ace1edd8..e7253182e47d 100644 --- a/drivers/usb/phy/phy-omap-control.c +++ b/drivers/usb/phy/phy-omap-control.c @@ -84,6 +84,20 @@ void omap_control_usb_phy_power(struct device *dev, int on) else val |= OMAP_CTRL_USB2_PHY_PD; break; + + case OMAP_CTRL_TYPE_AM437USB2: + if (on) { + val &= ~(AM437X_CTRL_USB2_PHY_PD | + AM437X_CTRL_USB2_OTG_PD); + val |= (AM437X_CTRL_USB2_OTGVDET_EN | + AM437X_CTRL_USB2_OTGSESSEND_EN); + } else { + val &= ~(AM437X_CTRL_USB2_OTGVDET_EN | + AM437X_CTRL_USB2_OTGSESSEND_EN); + val |= (AM437X_CTRL_USB2_PHY_PD | + AM437X_CTRL_USB2_OTG_PD); + } + break; default: dev_err(dev, "%s: type %d not recognized\n", __func__, control_usb->type); @@ -197,6 +211,7 @@ static const enum omap_control_usb_type otghs_data = OMAP_CTRL_TYPE_OTGHS; static const enum omap_control_usb_type usb2_data = OMAP_CTRL_TYPE_USB2; static const enum omap_control_usb_type pipe3_data = OMAP_CTRL_TYPE_PIPE3; static const enum omap_control_usb_type dra7usb2_data = OMAP_CTRL_TYPE_DRA7USB2; +static const enum omap_control_usb_type am437usb2_data = OMAP_CTRL_TYPE_AM437USB2; static const struct of_device_id omap_control_usb_id_table[] = { { @@ -215,6 +230,10 @@ static const struct of_device_id omap_control_usb_id_table[] = { .compatible = "ti,control-phy-dra7usb2", .data = &dra7usb2_data, }, + { + .compatible = "ti,control-phy-am437usb2", + .data = &am437usb2_data, + }, {}, }; MODULE_DEVICE_TABLE(of, omap_control_usb_id_table); diff --git a/drivers/usb/phy/phy-omap-otg.c b/drivers/usb/phy/phy-omap-otg.c new file mode 100644 index 000000000000..11598cdb3189 --- /dev/null +++ b/drivers/usb/phy/phy-omap-otg.c @@ -0,0 +1,169 @@ +/* + * OMAP OTG controller driver + * + * Based on code from tahvo-usb.c and isp1301_omap.c drivers. + * + * Copyright (C) 2005-2006 Nokia Corporation + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2004 David Brownell + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * 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. + */ + +#include <linux/io.h> +#include <linux/err.h> +#include <linux/extcon.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/interrupt.h> +#include <linux/platform_device.h> +#include <linux/platform_data/usb-omap1.h> + +struct otg_device { + void __iomem *base; + bool id; + bool vbus; + struct extcon_specific_cable_nb vbus_dev; + struct extcon_specific_cable_nb id_dev; + struct notifier_block vbus_nb; + struct notifier_block id_nb; +}; + +#define OMAP_OTG_CTRL 0x0c +#define OMAP_OTG_ASESSVLD (1 << 20) +#define OMAP_OTG_BSESSEND (1 << 19) +#define OMAP_OTG_BSESSVLD (1 << 18) +#define OMAP_OTG_VBUSVLD (1 << 17) +#define OMAP_OTG_ID (1 << 16) +#define OMAP_OTG_XCEIV_OUTPUTS \ + (OMAP_OTG_ASESSVLD | OMAP_OTG_BSESSEND | OMAP_OTG_BSESSVLD | \ + OMAP_OTG_VBUSVLD | OMAP_OTG_ID) + +static void omap_otg_ctrl(struct otg_device *otg_dev, u32 outputs) +{ + u32 l; + + l = readl(otg_dev->base + OMAP_OTG_CTRL); + l &= ~OMAP_OTG_XCEIV_OUTPUTS; + l |= outputs; + writel(l, otg_dev->base + OMAP_OTG_CTRL); +} + +static void omap_otg_set_mode(struct otg_device *otg_dev) +{ + if (!otg_dev->id && otg_dev->vbus) + /* Set B-session valid. */ + omap_otg_ctrl(otg_dev, OMAP_OTG_ID | OMAP_OTG_BSESSVLD); + else if (otg_dev->vbus) + /* Set A-session valid. */ + omap_otg_ctrl(otg_dev, OMAP_OTG_ASESSVLD); + else if (!otg_dev->id) + /* Set B-session end to indicate no VBUS. */ + omap_otg_ctrl(otg_dev, OMAP_OTG_ID | OMAP_OTG_BSESSEND); +} + +static int omap_otg_id_notifier(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct otg_device *otg_dev = container_of(nb, struct otg_device, id_nb); + + otg_dev->id = event; + omap_otg_set_mode(otg_dev); + + return NOTIFY_DONE; +} + +static int omap_otg_vbus_notifier(struct notifier_block *nb, + unsigned long event, void *ptr) +{ + struct otg_device *otg_dev = container_of(nb, struct otg_device, + vbus_nb); + + otg_dev->vbus = event; + omap_otg_set_mode(otg_dev); + + return NOTIFY_DONE; +} + +static int omap_otg_probe(struct platform_device *pdev) +{ + const struct omap_usb_config *config = pdev->dev.platform_data; + struct otg_device *otg_dev; + struct extcon_dev *extcon; + int ret; + u32 rev; + + if (!config || !config->extcon) + return -ENODEV; + + extcon = extcon_get_extcon_dev(config->extcon); + if (!extcon) + return -EPROBE_DEFER; + + otg_dev = devm_kzalloc(&pdev->dev, sizeof(*otg_dev), GFP_KERNEL); + if (!otg_dev) + return -ENOMEM; + + otg_dev->base = devm_ioremap_resource(&pdev->dev, &pdev->resource[0]); + if (IS_ERR(otg_dev->base)) + return PTR_ERR(otg_dev->base); + + otg_dev->id_nb.notifier_call = omap_otg_id_notifier; + otg_dev->vbus_nb.notifier_call = omap_otg_vbus_notifier; + + ret = extcon_register_interest(&otg_dev->id_dev, config->extcon, + "USB-HOST", &otg_dev->id_nb); + if (ret) + return ret; + + ret = extcon_register_interest(&otg_dev->vbus_dev, config->extcon, + "USB", &otg_dev->vbus_nb); + if (ret) { + extcon_unregister_interest(&otg_dev->id_dev); + return ret; + } + + otg_dev->id = extcon_get_cable_state(extcon, "USB-HOST"); + otg_dev->vbus = extcon_get_cable_state(extcon, "USB"); + omap_otg_set_mode(otg_dev); + + rev = readl(otg_dev->base); + + dev_info(&pdev->dev, + "OMAP USB OTG controller rev %d.%d (%s, id=%d, vbus=%d)\n", + (rev >> 4) & 0xf, rev & 0xf, config->extcon, otg_dev->id, + otg_dev->vbus); + + return 0; +} + +static int omap_otg_remove(struct platform_device *pdev) +{ + struct otg_device *otg_dev = platform_get_drvdata(pdev); + + extcon_unregister_interest(&otg_dev->id_dev); + extcon_unregister_interest(&otg_dev->vbus_dev); + + return 0; +} + +static struct platform_driver omap_otg_driver = { + .probe = omap_otg_probe, + .remove = omap_otg_remove, + .driver = { + .owner = THIS_MODULE, + .name = "omap_otg", + }, +}; +module_platform_driver(omap_otg_driver); + +MODULE_DESCRIPTION("OMAP USB OTG controller driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>"); diff --git a/drivers/usb/phy/phy-rcar-gen2-usb.c b/drivers/usb/phy/phy-rcar-gen2-usb.c index db3ab34cddb4..551e0a6c0e22 100644 --- a/drivers/usb/phy/phy-rcar-gen2-usb.c +++ b/drivers/usb/phy/phy-rcar-gen2-usb.c @@ -213,7 +213,7 @@ static int rcar_gen2_usb_phy_probe(struct platform_device *pdev) priv->phy.shutdown = rcar_gen2_usb_phy_shutdown; priv->phy.set_suspend = rcar_gen2_usb_phy_set_suspend; - retval = usb_add_phy(&priv->phy, USB_PHY_TYPE_USB2); + retval = usb_add_phy_dev(&priv->phy); if (retval < 0) { dev_err(dev, "Failed to add USB phy\n"); return retval; diff --git a/drivers/usb/phy/phy-tahvo.c b/drivers/usb/phy/phy-tahvo.c new file mode 100644 index 000000000000..cc61ee44b911 --- /dev/null +++ b/drivers/usb/phy/phy-tahvo.c @@ -0,0 +1,457 @@ +/* + * Tahvo USB transceiver driver + * + * Copyright (C) 2005-2006 Nokia Corporation + * + * Parts copied from isp1301_omap.c. + * Copyright (C) 2004 Texas Instruments + * Copyright (C) 2004 David Brownell + * + * Original driver written by Juha Yrjölä, Tony Lindgren and Timo Teräs. + * Modified for Retu/Tahvo MFD by Aaro Koskinen. + * + * This file is subject to the terms and conditions of the GNU General + * Public License. See the file "COPYING" in the main directory of this + * archive for more details. + * + * 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. + */ + +#include <linux/io.h> +#include <linux/clk.h> +#include <linux/usb.h> +#include <linux/extcon.h> +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/usb/otg.h> +#include <linux/mfd/retu.h> +#include <linux/usb/gadget.h> +#include <linux/platform_device.h> + +#define DRIVER_NAME "tahvo-usb" + +#define TAHVO_REG_IDSR 0x02 +#define TAHVO_REG_USBR 0x06 + +#define USBR_SLAVE_CONTROL (1 << 8) +#define USBR_VPPVIO_SW (1 << 7) +#define USBR_SPEED (1 << 6) +#define USBR_REGOUT (1 << 5) +#define USBR_MASTER_SW2 (1 << 4) +#define USBR_MASTER_SW1 (1 << 3) +#define USBR_SLAVE_SW (1 << 2) +#define USBR_NSUSPEND (1 << 1) +#define USBR_SEMODE (1 << 0) + +#define TAHVO_MODE_HOST 0 +#define TAHVO_MODE_PERIPHERAL 1 + +struct tahvo_usb { + struct platform_device *pt_dev; + struct usb_phy phy; + int vbus_state; + struct mutex serialize; + struct clk *ick; + int irq; + int tahvo_mode; + struct extcon_dev extcon; +}; + +static const char *tahvo_cable[] = { + "USB-HOST", + "USB", + NULL, +}; + +static ssize_t vbus_state_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + struct tahvo_usb *tu = dev_get_drvdata(device); + return sprintf(buf, "%s\n", tu->vbus_state ? "on" : "off"); +} +static DEVICE_ATTR(vbus, 0444, vbus_state_show, NULL); + +static void check_vbus_state(struct tahvo_usb *tu) +{ + struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent); + int reg, prev_state; + + reg = retu_read(rdev, TAHVO_REG_IDSR); + if (reg & TAHVO_STAT_VBUS) { + switch (tu->phy.state) { + case OTG_STATE_B_IDLE: + /* Enable the gadget driver */ + if (tu->phy.otg->gadget) + usb_gadget_vbus_connect(tu->phy.otg->gadget); + tu->phy.state = OTG_STATE_B_PERIPHERAL; + break; + case OTG_STATE_A_IDLE: + /* + * Session is now valid assuming the USB hub is driving + * Vbus. + */ + tu->phy.state = OTG_STATE_A_HOST; + break; + default: + break; + } + dev_info(&tu->pt_dev->dev, "USB cable connected\n"); + } else { + switch (tu->phy.state) { + case OTG_STATE_B_PERIPHERAL: + if (tu->phy.otg->gadget) + usb_gadget_vbus_disconnect(tu->phy.otg->gadget); + tu->phy.state = OTG_STATE_B_IDLE; + break; + case OTG_STATE_A_HOST: + tu->phy.state = OTG_STATE_A_IDLE; + break; + default: + break; + } + dev_info(&tu->pt_dev->dev, "USB cable disconnected\n"); + } + + prev_state = tu->vbus_state; + tu->vbus_state = reg & TAHVO_STAT_VBUS; + if (prev_state != tu->vbus_state) { + extcon_set_cable_state(&tu->extcon, "USB", tu->vbus_state); + sysfs_notify(&tu->pt_dev->dev.kobj, NULL, "vbus_state"); + } +} + +static void tahvo_usb_become_host(struct tahvo_usb *tu) +{ + struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent); + + extcon_set_cable_state(&tu->extcon, "USB-HOST", true); + + /* Power up the transceiver in USB host mode */ + retu_write(rdev, TAHVO_REG_USBR, USBR_REGOUT | USBR_NSUSPEND | + USBR_MASTER_SW2 | USBR_MASTER_SW1); + tu->phy.state = OTG_STATE_A_IDLE; + + check_vbus_state(tu); +} + +static void tahvo_usb_stop_host(struct tahvo_usb *tu) +{ + tu->phy.state = OTG_STATE_A_IDLE; +} + +static void tahvo_usb_become_peripheral(struct tahvo_usb *tu) +{ + struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent); + + extcon_set_cable_state(&tu->extcon, "USB-HOST", false); + + /* Power up transceiver and set it in USB peripheral mode */ + retu_write(rdev, TAHVO_REG_USBR, USBR_SLAVE_CONTROL | USBR_REGOUT | + USBR_NSUSPEND | USBR_SLAVE_SW); + tu->phy.state = OTG_STATE_B_IDLE; + + check_vbus_state(tu); +} + +static void tahvo_usb_stop_peripheral(struct tahvo_usb *tu) +{ + if (tu->phy.otg->gadget) + usb_gadget_vbus_disconnect(tu->phy.otg->gadget); + tu->phy.state = OTG_STATE_B_IDLE; +} + +static void tahvo_usb_power_off(struct tahvo_usb *tu) +{ + struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent); + + /* Disable gadget controller if any */ + if (tu->phy.otg->gadget) + usb_gadget_vbus_disconnect(tu->phy.otg->gadget); + + /* Power off transceiver */ + retu_write(rdev, TAHVO_REG_USBR, 0); + tu->phy.state = OTG_STATE_UNDEFINED; +} + +static int tahvo_usb_set_suspend(struct usb_phy *dev, int suspend) +{ + struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, phy); + struct retu_dev *rdev = dev_get_drvdata(tu->pt_dev->dev.parent); + u16 w; + + dev_dbg(&tu->pt_dev->dev, "%s\n", __func__); + + w = retu_read(rdev, TAHVO_REG_USBR); + if (suspend) + w &= ~USBR_NSUSPEND; + else + w |= USBR_NSUSPEND; + retu_write(rdev, TAHVO_REG_USBR, w); + + return 0; +} + +static int tahvo_usb_set_host(struct usb_otg *otg, struct usb_bus *host) +{ + struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy); + + dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, host); + + mutex_lock(&tu->serialize); + + if (host == NULL) { + if (tu->tahvo_mode == TAHVO_MODE_HOST) + tahvo_usb_power_off(tu); + otg->host = NULL; + mutex_unlock(&tu->serialize); + return 0; + } + + if (tu->tahvo_mode == TAHVO_MODE_HOST) { + otg->host = NULL; + tahvo_usb_become_host(tu); + } + + otg->host = host; + + mutex_unlock(&tu->serialize); + + return 0; +} + +static int tahvo_usb_set_peripheral(struct usb_otg *otg, + struct usb_gadget *gadget) +{ + struct tahvo_usb *tu = container_of(otg->phy, struct tahvo_usb, phy); + + dev_dbg(&tu->pt_dev->dev, "%s %p\n", __func__, gadget); + + mutex_lock(&tu->serialize); + + if (!gadget) { + if (tu->tahvo_mode == TAHVO_MODE_PERIPHERAL) + tahvo_usb_power_off(tu); + tu->phy.otg->gadget = NULL; + mutex_unlock(&tu->serialize); + return 0; + } + + tu->phy.otg->gadget = gadget; + if (tu->tahvo_mode == TAHVO_MODE_PERIPHERAL) + tahvo_usb_become_peripheral(tu); + + mutex_unlock(&tu->serialize); + + return 0; +} + +static irqreturn_t tahvo_usb_vbus_interrupt(int irq, void *_tu) +{ + struct tahvo_usb *tu = _tu; + + mutex_lock(&tu->serialize); + check_vbus_state(tu); + mutex_unlock(&tu->serialize); + + return IRQ_HANDLED; +} + +static ssize_t otg_mode_show(struct device *device, + struct device_attribute *attr, char *buf) +{ + struct tahvo_usb *tu = dev_get_drvdata(device); + + switch (tu->tahvo_mode) { + case TAHVO_MODE_HOST: + return sprintf(buf, "host\n"); + case TAHVO_MODE_PERIPHERAL: + return sprintf(buf, "peripheral\n"); + } + + return -EINVAL; +} + +static ssize_t otg_mode_store(struct device *device, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct tahvo_usb *tu = dev_get_drvdata(device); + int r; + + mutex_lock(&tu->serialize); + if (count >= 4 && strncmp(buf, "host", 4) == 0) { + if (tu->tahvo_mode == TAHVO_MODE_PERIPHERAL) + tahvo_usb_stop_peripheral(tu); + tu->tahvo_mode = TAHVO_MODE_HOST; + if (tu->phy.otg->host) { + dev_info(device, "HOST mode: host controller present\n"); + tahvo_usb_become_host(tu); + } else { + dev_info(device, "HOST mode: no host controller, powering off\n"); + tahvo_usb_power_off(tu); + } + r = strlen(buf); + } else if (count >= 10 && strncmp(buf, "peripheral", 10) == 0) { + if (tu->tahvo_mode == TAHVO_MODE_HOST) + tahvo_usb_stop_host(tu); + tu->tahvo_mode = TAHVO_MODE_PERIPHERAL; + if (tu->phy.otg->gadget) { + dev_info(device, "PERIPHERAL mode: gadget driver present\n"); + tahvo_usb_become_peripheral(tu); + } else { + dev_info(device, "PERIPHERAL mode: no gadget driver, powering off\n"); + tahvo_usb_power_off(tu); + } + r = strlen(buf); + } else { + r = -EINVAL; + } + mutex_unlock(&tu->serialize); + + return r; +} +static DEVICE_ATTR(otg_mode, 0644, otg_mode_show, otg_mode_store); + +static struct attribute *tahvo_attributes[] = { + &dev_attr_vbus.attr, + &dev_attr_otg_mode.attr, + NULL +}; + +static struct attribute_group tahvo_attr_group = { + .attrs = tahvo_attributes, +}; + +static int tahvo_usb_probe(struct platform_device *pdev) +{ + struct retu_dev *rdev = dev_get_drvdata(pdev->dev.parent); + struct tahvo_usb *tu; + int ret; + + tu = devm_kzalloc(&pdev->dev, sizeof(*tu), GFP_KERNEL); + if (!tu) + return -ENOMEM; + + tu->phy.otg = devm_kzalloc(&pdev->dev, sizeof(*tu->phy.otg), + GFP_KERNEL); + if (!tu->phy.otg) + return -ENOMEM; + + tu->pt_dev = pdev; + + /* Default mode */ +#ifdef CONFIG_TAHVO_USB_HOST_BY_DEFAULT + tu->tahvo_mode = TAHVO_MODE_HOST; +#else + tu->tahvo_mode = TAHVO_MODE_PERIPHERAL; +#endif + + mutex_init(&tu->serialize); + + tu->ick = devm_clk_get(&pdev->dev, "usb_l4_ick"); + if (!IS_ERR(tu->ick)) + clk_enable(tu->ick); + + /* + * Set initial state, so that we generate kevents only on state changes. + */ + tu->vbus_state = retu_read(rdev, TAHVO_REG_IDSR) & TAHVO_STAT_VBUS; + + tu->extcon.name = DRIVER_NAME; + tu->extcon.supported_cable = tahvo_cable; + tu->extcon.dev.parent = &pdev->dev; + + ret = extcon_dev_register(&tu->extcon); + if (ret) { + dev_err(&pdev->dev, "could not register extcon device: %d\n", + ret); + goto err_disable_clk; + } + + /* Set the initial cable state. */ + extcon_set_cable_state(&tu->extcon, "USB-HOST", + tu->tahvo_mode == TAHVO_MODE_HOST); + extcon_set_cable_state(&tu->extcon, "USB", tu->vbus_state); + + /* Create OTG interface */ + tahvo_usb_power_off(tu); + tu->phy.dev = &pdev->dev; + tu->phy.state = OTG_STATE_UNDEFINED; + tu->phy.label = DRIVER_NAME; + tu->phy.set_suspend = tahvo_usb_set_suspend; + + tu->phy.otg->phy = &tu->phy; + tu->phy.otg->set_host = tahvo_usb_set_host; + tu->phy.otg->set_peripheral = tahvo_usb_set_peripheral; + + ret = usb_add_phy(&tu->phy, USB_PHY_TYPE_USB2); + if (ret < 0) { + dev_err(&pdev->dev, "cannot register USB transceiver: %d\n", + ret); + goto err_extcon_unreg; + } + + dev_set_drvdata(&pdev->dev, tu); + + tu->irq = platform_get_irq(pdev, 0); + ret = request_threaded_irq(tu->irq, NULL, tahvo_usb_vbus_interrupt, 0, + "tahvo-vbus", tu); + if (ret) { + dev_err(&pdev->dev, "could not register tahvo-vbus irq: %d\n", + ret); + goto err_remove_phy; + } + + /* Attributes */ + ret = sysfs_create_group(&pdev->dev.kobj, &tahvo_attr_group); + if (ret) { + dev_err(&pdev->dev, "cannot create sysfs group: %d\n", ret); + goto err_free_irq; + } + + return 0; + +err_free_irq: + free_irq(tu->irq, tu); +err_remove_phy: + usb_remove_phy(&tu->phy); +err_extcon_unreg: + extcon_dev_unregister(&tu->extcon); +err_disable_clk: + if (!IS_ERR(tu->ick)) + clk_disable(tu->ick); + + return ret; +} + +static int tahvo_usb_remove(struct platform_device *pdev) +{ + struct tahvo_usb *tu = platform_get_drvdata(pdev); + + sysfs_remove_group(&pdev->dev.kobj, &tahvo_attr_group); + free_irq(tu->irq, tu); + usb_remove_phy(&tu->phy); + extcon_dev_unregister(&tu->extcon); + if (!IS_ERR(tu->ick)) + clk_disable(tu->ick); + + return 0; +} + +static struct platform_driver tahvo_usb_driver = { + .probe = tahvo_usb_probe, + .remove = tahvo_usb_remove, + .driver = { + .name = "tahvo-usb", + .owner = THIS_MODULE, + }, +}; +module_platform_driver(tahvo_usb_driver); + +MODULE_DESCRIPTION("Tahvo USB transceiver driver"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Juha Yrjölä, Tony Lindgren, and Timo Teräs"); +MODULE_AUTHOR("Aaro Koskinen <aaro.koskinen@iki.fi>"); diff --git a/drivers/usb/phy/phy-twl6030-usb.c b/drivers/usb/phy/phy-twl6030-usb.c index bad57ce77ba5..214172b68d5d 100644 --- a/drivers/usb/phy/phy-twl6030-usb.c +++ b/drivers/usb/phy/phy-twl6030-usb.c @@ -328,7 +328,7 @@ static int twl6030_usb_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct twl4030_usb_data *pdata = dev_get_platdata(dev); - twl = devm_kzalloc(dev, sizeof *twl, GFP_KERNEL); + twl = devm_kzalloc(dev, sizeof(*twl), GFP_KERNEL); if (!twl) return -ENOMEM; diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c index 1b74523e1fee..e6f61e4361df 100644 --- a/drivers/usb/phy/phy.c +++ b/drivers/usb/phy/phy.c @@ -329,6 +329,8 @@ int usb_add_phy(struct usb_phy *x, enum usb_phy_type type) return -EINVAL; } + ATOMIC_INIT_NOTIFIER_HEAD(&x->notifier); + spin_lock_irqsave(&phy_lock, flags); list_for_each_entry(phy, &phy_list, head) { @@ -367,6 +369,8 @@ int usb_add_phy_dev(struct usb_phy *x) return -EINVAL; } + ATOMIC_INIT_NOTIFIER_HEAD(&x->notifier); + spin_lock_irqsave(&phy_lock, flags); list_for_each_entry(phy_bind, &phy_bind_list, list) if (!(strcmp(phy_bind->phy_dev_name, dev_name(x->dev)))) diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index 45b94019aec8..d49f9c326035 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c @@ -1124,19 +1124,8 @@ void usbhs_fifo_init(struct usbhs_priv *priv) mod->irq_brdysts = 0; cfifo->pipe = NULL; - cfifo->tx_chan = NULL; - cfifo->rx_chan = NULL; - d0fifo->pipe = NULL; - d0fifo->tx_chan = NULL; - d0fifo->rx_chan = NULL; - d1fifo->pipe = NULL; - d1fifo->tx_chan = NULL; - d1fifo->rx_chan = NULL; - - usbhsf_dma_init(priv, usbhsf_get_d0fifo(priv)); - usbhsf_dma_init(priv, usbhsf_get_d1fifo(priv)); } void usbhs_fifo_quit(struct usbhs_priv *priv) @@ -1147,9 +1136,6 @@ void usbhs_fifo_quit(struct usbhs_priv *priv) mod->irq_ready = NULL; mod->irq_bempsts = 0; mod->irq_brdysts = 0; - - usbhsf_dma_quit(priv, usbhsf_get_d0fifo(priv)); - usbhsf_dma_quit(priv, usbhsf_get_d1fifo(priv)); } int usbhs_fifo_probe(struct usbhs_priv *priv) @@ -1171,6 +1157,7 @@ int usbhs_fifo_probe(struct usbhs_priv *priv) fifo->ctr = D0FIFOCTR; fifo->tx_slave.shdma_slave.slave_id = usbhs_get_dparam(priv, d0_tx_id); fifo->rx_slave.shdma_slave.slave_id = usbhs_get_dparam(priv, d0_rx_id); + usbhsf_dma_init(priv, fifo); /* D1FIFO */ fifo = usbhsf_get_d1fifo(priv); @@ -1180,10 +1167,13 @@ int usbhs_fifo_probe(struct usbhs_priv *priv) fifo->ctr = D1FIFOCTR; fifo->tx_slave.shdma_slave.slave_id = usbhs_get_dparam(priv, d1_tx_id); fifo->rx_slave.shdma_slave.slave_id = usbhs_get_dparam(priv, d1_rx_id); + usbhsf_dma_init(priv, fifo); return 0; } void usbhs_fifo_remove(struct usbhs_priv *priv) { + usbhsf_dma_quit(priv, usbhsf_get_d0fifo(priv)); + usbhsf_dma_quit(priv, usbhsf_get_d1fifo(priv)); } diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 3385aeb5a364..458f3766bef1 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c @@ -987,11 +987,11 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) /* init DCP */ if (usbhsg_is_dcp(uep)) { gpriv->gadget.ep0 = &uep->ep; - uep->ep.maxpacket = 64; + usb_ep_set_maxpacket_limit(&uep->ep, 64); } /* init normal pipe */ else { - uep->ep.maxpacket = 512; + usb_ep_set_maxpacket_limit(&uep->ep, 512); list_add_tail(&uep->ep.ep_list, &gpriv->gadget.ep_list); } } diff --git a/drivers/usb/renesas_usbhs/mod_host.c b/drivers/usb/renesas_usbhs/mod_host.c index e40f565004d0..10e1ded9c9cc 100644 --- a/drivers/usb/renesas_usbhs/mod_host.c +++ b/drivers/usb/renesas_usbhs/mod_host.c @@ -1469,6 +1469,7 @@ static int usbhsh_start(struct usbhs_priv *priv) ret = usb_add_hcd(hcd, 0, 0); if (ret < 0) return 0; + device_wakeup_enable(hcd->self.controller); /* * pipe initialize and enable DCP diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index ddb9c51f2c99..3ce5c74b29e4 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig @@ -472,6 +472,35 @@ config USB_SERIAL_MOS7840 To compile this driver as a module, choose M here: the module will be called mos7840. If unsure, choose N. +config USB_SERIAL_MXUPORT + tristate "USB Moxa UPORT Serial Driver" + ---help--- + Say Y here if you want to use a MOXA UPort Serial hub. + + This driver supports: + + [2 Port] + - UPort 1250 : 2 Port RS-232/422/485 USB to Serial Hub + - UPort 1250I : 2 Port RS-232/422/485 USB to Serial Hub with + Isolation + + [4 Port] + - UPort 1410 : 4 Port RS-232 USB to Serial Hub + - UPort 1450 : 4 Port RS-232/422/485 USB to Serial Hub + - UPort 1450I : 4 Port RS-232/422/485 USB to Serial Hub with + Isolation + + [8 Port] + - UPort 1610-8 : 8 Port RS-232 USB to Serial Hub + - UPort 1650-8 : 8 Port RS-232/422/485 USB to Serial Hub + + [16 Port] + - UPort 1610-16 : 16 Port RS-232 USB to Serial Hub + - UPort 1650-16 : 16 Port RS-232/422/485 USB to Serial Hub + + To compile this driver as a module, choose M here: the + module will be called mxuport. + config USB_SERIAL_NAVMAN tristate "USB Navman GPS device" help diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 42670f0b5bc0..bfdafd349441 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o obj-$(CONFIG_USB_SERIAL_METRO) += metro-usb.o obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o +obj-$(CONFIG_USB_SERIAL_MXUPORT) += mxuport.o obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o obj-$(CONFIG_USB_SERIAL_OPTICON) += opticon.o diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 6e320cec397d..80a9845cd93f 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c @@ -10,9 +10,9 @@ * * The device works as an standard CDC device, it has 2 interfaces, the first * one is for firmware access and the second is the serial one. - * The protocol is very simply, there are two posibilities reading or writing. + * The protocol is very simply, there are two possibilities reading or writing. * When writing the first urb must have a Header that starts with 0x20 0x29 the - * next two bytes must say how much data will be sended. + * next two bytes must say how much data will be sent. * When reading the process is almost equal except that the header starts with * 0x00 0x20. * @@ -31,15 +31,15 @@ * * The driver registers himself with the USB-serial core and the USB Core. I had * to implement a probe function against USB-serial, because other way, the - * driver was attaching himself to both interfaces. I have tryed with different + * driver was attaching himself to both interfaces. I have tried with different * configurations of usb_serial_driver with out exit, only the probe function * could handle this correctly. * * I have taken some info from a Greg Kroah-Hartman article: * http://www.linuxjournal.com/article/6573 * And from Linux Device Driver Kit CD, which is a great work, the authors taken - * the work to recompile lots of information an knowladge in drivers development - * and made it all avaible inside a cd. + * the work to recompile lots of information an knowledge in drivers development + * and made it all available inside a cd. * URL: http://kernel.org/pub/linux/kernel/people/gregkh/ddk/ * */ diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index bc77e955cbef..1532cde8a437 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c @@ -23,7 +23,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/ioctl.h> #include <linux/tty.h> #include <linux/slab.h> @@ -71,7 +70,7 @@ struct ark3116_private { __u32 lcr; /* line control register value */ __u32 hcr; /* handshake control register (0x8) * value */ - __u32 mcr; /* modem contol register value */ + __u32 mcr; /* modem control register value */ /* protects the status values below */ spinlock_t status_lock; @@ -609,7 +608,7 @@ static void ark3116_read_int_callback(struct urb *urb) } -/* Data comes in via the bulk (data) URB, erors/interrupts via the int URB. +/* Data comes in via the bulk (data) URB, errors/interrupts via the int URB. * This means that we cannot be sure which data byte has an associated error * condition, so we report an error for all data in the next bulk read. * diff --git a/drivers/usb/serial/belkin_sa.c b/drivers/usb/serial/belkin_sa.c index 84217e78ded4..15bc71853db5 100644 --- a/drivers/usb/serial/belkin_sa.c +++ b/drivers/usb/serial/belkin_sa.c @@ -18,14 +18,13 @@ * driver * * TODO: - * -- Add true modem contol line query capability. Currently we track the + * -- Add true modem control line query capability. Currently we track the * states reported by the interrupt and the states we request. * -- Add support for flush commands */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/bus.c b/drivers/usb/serial/bus.c index 6335490d5760..35a2373cde67 100644 --- a/drivers/usb/serial/bus.c +++ b/drivers/usb/serial/bus.c @@ -125,10 +125,12 @@ static ssize_t new_id_store(struct device_driver *driver, const char *buf, size_t count) { struct usb_serial_driver *usb_drv = to_usb_serial_driver(driver); - ssize_t retval = usb_store_new_id(&usb_drv->dynids, driver, buf, count); + ssize_t retval = usb_store_new_id(&usb_drv->dynids, usb_drv->id_table, + driver, buf, count); if (retval >= 0 && usb_drv->usb_driver != NULL) retval = usb_store_new_id(&usb_drv->usb_driver->dynids, + usb_drv->usb_driver->id_table, &usb_drv->usb_driver->drvwrap.driver, buf, count); return retval; diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c index c2a4171ab9cb..82371f61f23d 100644 --- a/drivers/usb/serial/ch341.c +++ b/drivers/usb/serial/ch341.c @@ -16,7 +16,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/slab.h> @@ -83,7 +82,6 @@ struct ch341_private { unsigned baud_rate; /* set baud rate */ u8 line_control; /* set line control value RTS/DTR */ u8 line_status; /* active status of modem control inputs */ - u8 multi_status_change; /* status changed multiple since last call */ }; static int ch341_control_out(struct usb_device *dev, u8 request, @@ -174,7 +172,6 @@ static int ch341_get_status(struct usb_device *dev, struct ch341_private *priv) r = 0; spin_lock_irqsave(&priv->lock, flags); priv->line_status = (~(*buffer)) & CH341_BITS_MODEM_STAT; - priv->multi_status_change = 0; spin_unlock_irqrestore(&priv->lock, flags); } else r = -EPROTO; @@ -384,10 +381,8 @@ static void ch341_break_ctl(struct tty_struct *tty, int break_state) uint8_t *break_reg; break_reg = kmalloc(2, GFP_KERNEL); - if (!break_reg) { - dev_err(&port->dev, "%s - kmalloc failed\n", __func__); + if (!break_reg) return; - } r = ch341_control_in(port->serial->dev, CH341_REQ_READ_REG, ch341_break_reg, 0, break_reg, 2); @@ -442,11 +437,55 @@ static int ch341_tiocmset(struct tty_struct *tty, return ch341_set_handshake(port->serial->dev, control); } +static void ch341_update_line_status(struct usb_serial_port *port, + unsigned char *data, size_t len) +{ + struct ch341_private *priv = usb_get_serial_port_data(port); + struct tty_struct *tty; + unsigned long flags; + u8 status; + u8 delta; + + if (len < 4) + return; + + status = ~data[2] & CH341_BITS_MODEM_STAT; + + spin_lock_irqsave(&priv->lock, flags); + delta = status ^ priv->line_status; + priv->line_status = status; + spin_unlock_irqrestore(&priv->lock, flags); + + if (data[1] & CH341_MULT_STAT) + dev_dbg(&port->dev, "%s - multiple status change\n", __func__); + + if (!delta) + return; + + if (delta & CH341_BIT_CTS) + port->icount.cts++; + if (delta & CH341_BIT_DSR) + port->icount.dsr++; + if (delta & CH341_BIT_RI) + port->icount.rng++; + if (delta & CH341_BIT_DCD) { + port->icount.dcd++; + tty = tty_port_tty_get(&port->port); + if (tty) { + usb_serial_handle_dcd_change(port, tty, + status & CH341_BIT_DCD); + tty_kref_put(tty); + } + } + + wake_up_interruptible(&port->port.delta_msr_wait); +} + static void ch341_read_int_callback(struct urb *urb) { - struct usb_serial_port *port = (struct usb_serial_port *) urb->context; + struct usb_serial_port *port = urb->context; unsigned char *data = urb->transfer_buffer; - unsigned int actual_length = urb->actual_length; + unsigned int len = urb->actual_length; int status; switch (urb->status) { @@ -457,89 +496,23 @@ static void ch341_read_int_callback(struct urb *urb) case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ - dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n", + dev_dbg(&urb->dev->dev, "%s - urb shutting down: %d\n", __func__, urb->status); return; default: - dev_dbg(&urb->dev->dev, "%s - nonzero urb status received: %d\n", + dev_dbg(&urb->dev->dev, "%s - nonzero urb status: %d\n", __func__, urb->status); goto exit; } - usb_serial_debug_data(&port->dev, __func__, - urb->actual_length, urb->transfer_buffer); - - if (actual_length >= 4) { - struct ch341_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - u8 prev_line_status = priv->line_status; - - spin_lock_irqsave(&priv->lock, flags); - priv->line_status = (~(data[2])) & CH341_BITS_MODEM_STAT; - if ((data[1] & CH341_MULT_STAT)) - priv->multi_status_change = 1; - spin_unlock_irqrestore(&priv->lock, flags); - - if ((priv->line_status ^ prev_line_status) & CH341_BIT_DCD) { - struct tty_struct *tty = tty_port_tty_get(&port->port); - if (tty) - usb_serial_handle_dcd_change(port, tty, - priv->line_status & CH341_BIT_DCD); - tty_kref_put(tty); - } - - wake_up_interruptible(&port->port.delta_msr_wait); - } - + usb_serial_debug_data(&port->dev, __func__, len, data); + ch341_update_line_status(port, data, len); exit: status = usb_submit_urb(urb, GFP_ATOMIC); - if (status) - dev_err(&urb->dev->dev, - "%s - usb_submit_urb failed with result %d\n", + if (status) { + dev_err(&urb->dev->dev, "%s - usb_submit_urb failed: %d\n", __func__, status); -} - -static int ch341_tiocmiwait(struct tty_struct *tty, unsigned long arg) -{ - struct usb_serial_port *port = tty->driver_data; - struct ch341_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - u8 prevstatus; - u8 status; - u8 changed; - u8 multi_change = 0; - - spin_lock_irqsave(&priv->lock, flags); - prevstatus = priv->line_status; - priv->multi_status_change = 0; - spin_unlock_irqrestore(&priv->lock, flags); - - while (!multi_change) { - interruptible_sleep_on(&port->port.delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - - if (port->serial->disconnected) - return -EIO; - - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - multi_change = priv->multi_status_change; - spin_unlock_irqrestore(&priv->lock, flags); - - changed = prevstatus ^ status; - - if (((arg & TIOCM_RNG) && (changed & CH341_BIT_RI)) || - ((arg & TIOCM_DSR) && (changed & CH341_BIT_DSR)) || - ((arg & TIOCM_CD) && (changed & CH341_BIT_DCD)) || - ((arg & TIOCM_CTS) && (changed & CH341_BIT_CTS))) { - return 0; - } - prevstatus = status; } - - return 0; } static int ch341_tiocmget(struct tty_struct *tty) @@ -595,7 +568,7 @@ static struct usb_serial_driver ch341_device = { .break_ctl = ch341_break_ctl, .tiocmget = ch341_tiocmget, .tiocmset = ch341_tiocmset, - .tiocmiwait = ch341_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .read_int_callback = ch341_read_int_callback, .port_probe = ch341_port_probe, .port_remove = ch341_port_remove, diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index c69bb50d4663..8d7fc48b1f30 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c @@ -14,7 +14,6 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include <linux/kernel.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/console.h> @@ -135,7 +134,6 @@ static int usb_console_setup(struct console *co, char *options) tty = kzalloc(sizeof(*tty), GFP_KERNEL); if (!tty) { retval = -ENOMEM; - dev_err(&port->dev, "no more memory\n"); goto reset_open_count; } kref_init(&tty->kref); @@ -144,7 +142,6 @@ static int usb_console_setup(struct console *co, char *options) tty->index = co->index; if (tty_init_termios(tty)) { retval = -ENOMEM; - dev_err(&port->dev, "no more memory\n"); goto free_tty; } } diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 6987b535aa98..95fa1217afdd 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c @@ -305,10 +305,8 @@ static int cp210x_get_config(struct usb_serial_port *port, u8 request, length = (((size - 1) | 3) + 1) / 4; buf = kcalloc(length, sizeof(__le32), GFP_KERNEL); - if (!buf) { - dev_err(&port->dev, "%s - out of memory.\n", __func__); + if (!buf) return -ENOMEM; - } /* Issue the request, attempting to read 'size' bytes */ result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), @@ -352,10 +350,8 @@ static int cp210x_set_config(struct usb_serial_port *port, u8 request, length = (((size - 1) | 3) + 1) / 4; buf = kmalloc(length * sizeof(__le32), GFP_KERNEL); - if (!buf) { - dev_err(&port->dev, "%s - out of memory.\n", __func__); + if (!buf) return -ENOMEM; - } /* Array of integers into bytes */ for (i = 0; i < length; i++) diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 6e1b69d0f5f5..0ac3b3b3236c 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -30,7 +30,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -285,7 +284,7 @@ static void cyberjack_read_int_callback(struct urb *urb) goto resubmit; } - /* "+=" is probably more fault tollerant than "=" */ + /* "+=" is probably more fault tolerant than "=" */ priv->rdtodo += size; dev_dbg(dev, "%s - rdtodo: %d\n", __func__, priv->rdtodo); diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 558605d646f3..bccb1223143a 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c @@ -27,7 +27,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -113,7 +112,7 @@ struct cypress_private { int baud_rate; /* stores current baud rate in integer form */ int isthrottled; /* if throttled, discard reads */ - char prev_status, diff_status; /* used for TIOCMIWAIT */ + char prev_status; /* used for TIOCMIWAIT */ /* we pass a pointer to this as the argument sent to cypress_set_termios old_termios */ struct ktermios tmp_termios; /* stores the old termios settings */ @@ -136,7 +135,6 @@ static void cypress_set_termios(struct tty_struct *tty, static int cypress_tiocmget(struct tty_struct *tty); static int cypress_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear); -static int cypress_tiocmiwait(struct tty_struct *tty, unsigned long arg); static int cypress_chars_in_buffer(struct tty_struct *tty); static void cypress_throttle(struct tty_struct *tty); static void cypress_unthrottle(struct tty_struct *tty); @@ -162,7 +160,7 @@ static struct usb_serial_driver cypress_earthmate_device = { .set_termios = cypress_set_termios, .tiocmget = cypress_tiocmget, .tiocmset = cypress_tiocmset, - .tiocmiwait = cypress_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .chars_in_buffer = cypress_chars_in_buffer, .throttle = cypress_throttle, .unthrottle = cypress_unthrottle, @@ -188,7 +186,7 @@ static struct usb_serial_driver cypress_hidcom_device = { .set_termios = cypress_set_termios, .tiocmget = cypress_tiocmget, .tiocmset = cypress_tiocmset, - .tiocmiwait = cypress_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .chars_in_buffer = cypress_chars_in_buffer, .throttle = cypress_throttle, .unthrottle = cypress_unthrottle, @@ -214,7 +212,7 @@ static struct usb_serial_driver cypress_ca42v2_device = { .set_termios = cypress_set_termios, .tiocmget = cypress_tiocmget, .tiocmset = cypress_tiocmset, - .tiocmiwait = cypress_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .chars_in_buffer = cypress_chars_in_buffer, .throttle = cypress_throttle, .unthrottle = cypress_unthrottle, @@ -864,45 +862,6 @@ static int cypress_tiocmset(struct tty_struct *tty, return cypress_write(tty, port, NULL, 0); } - -static int cypress_tiocmiwait(struct tty_struct *tty, unsigned long arg) -{ - struct usb_serial_port *port = tty->driver_data; - struct cypress_private *priv = usb_get_serial_port_data(port); - char diff; - - for (;;) { - interruptible_sleep_on(&port->port.delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - - if (port->serial->disconnected) - return -EIO; - - diff = priv->diff_status; - if (diff == 0) - return -EIO; /* no change => error */ - - /* consume all events */ - priv->diff_status = 0; - - /* return 0 if caller wanted to know about - these bits */ - if (((arg & TIOCM_RNG) && (diff & UART_RI)) || - ((arg & TIOCM_DSR) && (diff & UART_DSR)) || - ((arg & TIOCM_CD) && (diff & UART_CD)) || - ((arg & TIOCM_CTS) && (diff & UART_CTS))) - return 0; - /* otherwise caller can't care less about what - * happened, and so we continue to wait for - * more events. - */ - } - - return 0; -} - static void cypress_set_termios(struct tty_struct *tty, struct usb_serial_port *port, struct ktermios *old_termios) { @@ -1185,9 +1144,21 @@ static void cypress_read_int_callback(struct urb *urb) spin_lock_irqsave(&priv->lock, flags); /* check to see if status has changed */ if (priv->current_status != priv->prev_status) { - priv->diff_status |= priv->current_status ^ - priv->prev_status; - wake_up_interruptible(&port->port.delta_msr_wait); + u8 delta = priv->current_status ^ priv->prev_status; + + if (delta & UART_MSR_MASK) { + if (delta & UART_CTS) + port->icount.cts++; + if (delta & UART_DSR) + port->icount.dsr++; + if (delta & UART_RI) + port->icount.rng++; + if (delta & UART_CD) + port->icount.dcd++; + + wake_up_interruptible(&port->port.delta_msr_wait); + } + priv->prev_status = priv->current_status; } spin_unlock_irqrestore(&priv->lock, flags); diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index b461311a2ae7..119d2e17077b 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h @@ -55,19 +55,23 @@ #define CT_GENERIC 0x0F /* End of chiptype definitions */ -/* RS-232 serial data communication protocol definitions */ -/* these are sent / read at byte 0 of the input/output hid reports */ -/* You can find these values defined in the CY4601 USB to Serial design notes */ - -#define CONTROL_DTR 0x20 /* data terminal ready - flow control - host to device */ -#define UART_DSR 0x20 /* data set ready - flow control - device to host */ -#define CONTROL_RTS 0x10 /* request to send - flow control - host to device */ -#define UART_CTS 0x10 /* clear to send - flow control - device to host */ -#define UART_RI 0x10 /* ring indicator - modem - device to host */ -#define UART_CD 0x40 /* carrier detect - modem - device to host */ -#define CYP_ERROR 0x08 /* received from input report - device to host */ -/* Note - the below has nothing to do with the "feature report" reset */ -#define CONTROL_RESET 0x08 /* sent with output report - host to device */ +/* + * RS-232 serial data communication protocol definitions. + * + * These are sent / read at byte 0 of the input/output hid reports. + * You can find these values defined in the CY4601 USB to Serial design notes. + */ + +#define CONTROL_DTR 0x20 /* data terminal ready */ +#define CONTROL_RTS 0x10 /* request to send */ +#define CONTROL_RESET 0x08 /* sent with output report */ + +#define UART_MSR_MASK 0xf0 +#define UART_RI 0x80 /* ring indicator */ +#define UART_CD 0x40 /* carrier detect */ +#define UART_DSR 0x20 /* data set ready */ +#define UART_CTS 0x10 /* clear to send */ +#define CYP_ERROR 0x08 /* received from input report */ /* End of RS-232 protocol definitions */ diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index 19b467fe0388..8a23c53b946e 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c @@ -17,7 +17,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c index 0f658618db13..90e603d5f660 100644 --- a/drivers/usb/serial/empeg.c +++ b/drivers/usb/serial/empeg.c @@ -17,7 +17,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/f81232.c b/drivers/usb/serial/f81232.c index 639a18fb67e6..c5dc233db2d9 100644 --- a/drivers/usb/serial/f81232.c +++ b/drivers/usb/serial/f81232.c @@ -12,7 +12,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -55,6 +54,13 @@ static void f81232_update_line_status(struct usb_serial_port *port, unsigned char *data, unsigned int actual_length) { + /* + * FIXME: Update port->icount, and call + * + * wake_up_interruptible(&port->port.delta_msr_wait); + * + * on MSR changes. + */ } static void f81232_read_int_callback(struct urb *urb) @@ -110,7 +116,6 @@ static void f81232_process_read_urb(struct urb *urb) line_status = priv->line_status; priv->line_status &= ~UART_STATE_TRANSIENT_MASK; spin_unlock_irqrestore(&priv->lock, flags); - wake_up_interruptible(&port->port.delta_msr_wait); if (!urb->actual_length) return; @@ -241,54 +246,12 @@ static int f81232_carrier_raised(struct usb_serial_port *port) return 0; } -static int f81232_tiocmiwait(struct tty_struct *tty, unsigned long arg) -{ - struct usb_serial_port *port = tty->driver_data; - struct f81232_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - unsigned int prevstatus; - unsigned int status; - unsigned int changed; - - spin_lock_irqsave(&priv->lock, flags); - prevstatus = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); - - while (1) { - interruptible_sleep_on(&port->port.delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - - if (port->serial->disconnected) - return -EIO; - - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); - - changed = prevstatus ^ status; - - if (((arg & TIOCM_RNG) && (changed & UART_RING)) || - ((arg & TIOCM_DSR) && (changed & UART_DSR)) || - ((arg & TIOCM_CD) && (changed & UART_DCD)) || - ((arg & TIOCM_CTS) && (changed & UART_CTS))) { - return 0; - } - prevstatus = status; - } - /* NOTREACHED */ - return 0; -} - static int f81232_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) { struct serial_struct ser; struct usb_serial_port *port = tty->driver_data; - dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: memset(&ser, 0, sizeof ser); @@ -302,8 +265,6 @@ static int f81232_ioctl(struct tty_struct *tty, return 0; default: - dev_dbg(&port->dev, "%s not supported = 0x%04x\n", - __func__, cmd); break; } return -ENOIOCTLCMD; @@ -354,7 +315,7 @@ static struct usb_serial_driver f81232_device = { .set_termios = f81232_set_termios, .tiocmget = f81232_tiocmget, .tiocmset = f81232_tiocmset, - .tiocmiwait = f81232_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .process_read_urb = f81232_process_read_urb, .read_int_callback = f81232_read_int_callback, .port_probe = f81232_port_probe, diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index fb0d537435eb..ce0d7b0db012 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c @@ -33,7 +33,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -145,7 +144,7 @@ static struct ftdi_sio_quirk ftdi_8u2232c_quirk = { * Device ID not listed? Test it using * /sys/bus/usb-serial/drivers/ftdi_sio/new_id and send a patch or report. */ -static struct usb_device_id id_table_combined [] = { +static const struct usb_device_id id_table_combined[] = { { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, @@ -1695,11 +1694,8 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) priv = kzalloc(sizeof(struct ftdi_private), GFP_KERNEL); - if (!priv) { - dev_err(&port->dev, "%s- kmalloc(%Zd) failed.\n", __func__, - sizeof(struct ftdi_private)); + if (!priv) return -ENOMEM; - } mutex_init(&priv->cfg_lock); @@ -2124,10 +2120,20 @@ static void ftdi_set_termios(struct tty_struct *tty, } /* - * All FTDI UART chips are limited to CS7/8. We won't pretend to + * All FTDI UART chips are limited to CS7/8. We shouldn't pretend to * support CS5/6 and revert the CSIZE setting instead. + * + * CS5 however is used to control some smartcard readers which abuse + * this limitation to switch modes. Original FTDI chips fall back to + * eight data bits. + * + * TODO: Implement a quirk to only allow this with mentioned + * readers. One I know of (Argolis Smartreader V1) + * returns "USB smartcard server" as iInterface string. + * The vendor didn't bother with a custom VID/PID of + * course. */ - if ((C_CSIZE(tty) != CS8) && (C_CSIZE(tty) != CS7)) { + if (C_CSIZE(tty) == CS6) { dev_warn(ddev, "requested CSIZE setting not supported\n"); termios->c_cflag &= ~CSIZE; @@ -2174,6 +2180,9 @@ no_skip: urb_value |= FTDI_SIO_SET_DATA_PARITY_NONE; } switch (cflag & CSIZE) { + case CS5: + dev_dbg(ddev, "Setting CS5 quirk\n"); + break; case CS7: urb_value |= 7; dev_dbg(ddev, "Setting CS7\n"); @@ -2383,8 +2392,6 @@ static int ftdi_ioctl(struct tty_struct *tty, { struct usb_serial_port *port = tty->driver_data; - dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd); - /* Based on code from acm.c and others */ switch (cmd) { @@ -2401,11 +2408,7 @@ static int ftdi_ioctl(struct tty_struct *tty, default: break; } - /* This is not necessarily an error - turns out the higher layers - * will do some ioctls themselves (see comment above) - */ - dev_dbg(&port->dev, "%s arg not supported - it was 0x%04x - check /usr/include/asm/ioctls.h\n", - __func__, cmd); + return -ENOIOCTLCMD; } diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 04b5ed90ffb2..db591d19d416 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c @@ -25,7 +25,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/timer.h> #include <linux/tty.h> @@ -275,14 +274,13 @@ static int pkt_add(struct garmin_data *garmin_data_p, unsigned long flags; struct garmin_packet *pkt; - /* process only packets containg data ... */ + /* process only packets containing data ... */ if (data_length) { pkt = kmalloc(sizeof(struct garmin_packet)+data_length, GFP_ATOMIC); - if (pkt == NULL) { - dev_err(&garmin_data_p->port->dev, "out of memory\n"); + if (!pkt) return 0; - } + pkt->size = data_length; memcpy(pkt->data, data, data_length); @@ -1006,14 +1004,11 @@ static int garmin_write_bulk(struct usb_serial_port *port, spin_unlock_irqrestore(&garmin_data_p->lock, flags); buffer = kmalloc(count, GFP_ATOMIC); - if (!buffer) { - dev_err(&port->dev, "out of memory\n"); + if (!buffer) return -ENOMEM; - } urb = usb_alloc_urb(0, GFP_ATOMIC); if (!urb) { - dev_err(&port->dev, "no more free urbs\n"); kfree(buffer); return -ENOMEM; } @@ -1148,7 +1143,7 @@ static void garmin_read_process(struct garmin_data *garmin_data_p, unsigned long flags; if (garmin_data_p->flags & FLAGS_DROP_DATA) { - /* abort-transfer cmd is actice */ + /* abort-transfer cmd is active */ dev_dbg(&garmin_data_p->port->dev, "%s - pkt dropped\n", __func__); } else if (garmin_data_p->state != STATE_DISCONNECTED && garmin_data_p->state != STATE_RESET) { @@ -1393,10 +1388,9 @@ static int garmin_port_probe(struct usb_serial_port *port) struct garmin_data *garmin_data_p; garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); - if (garmin_data_p == NULL) { - dev_err(&port->dev, "%s - Out of memory\n", __func__); + if (!garmin_data_p) return -ENOMEM; - } + init_timer(&garmin_data_p->timer); spin_lock_init(&garmin_data_p->lock); INIT_LIST_HEAD(&garmin_data_p->pktlist); diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index c91481d74a14..c0866971db2b 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c @@ -32,7 +32,6 @@ #include <linux/kernel.h> #include <linux/jiffies.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -898,7 +897,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) edge_port->txfifo.fifo = kmalloc(edge_port->maxTxCredits, GFP_KERNEL); if (!edge_port->txfifo.fifo) { - dev_dbg(dev, "%s - no memory\n", __func__); edge_close(port); return -ENOMEM; } @@ -908,7 +906,6 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port) edge_port->write_in_progress = false; if (!edge_port->write_urb) { - dev_dbg(dev, "%s - no memory\n", __func__); edge_close(port); return -ENOMEM; } @@ -1245,9 +1242,7 @@ static void send_more_port_data(struct edgeport_serial *edge_serial, to send out */ count = fifo->count; buffer = kmalloc(count+2, GFP_ATOMIC); - if (buffer == NULL) { - dev_err_console(edge_port->port, - "%s - no more kernel memory...\n", __func__); + if (!buffer) { edge_port->write_in_progress = false; goto exit_send; } @@ -1593,8 +1588,6 @@ static int edge_ioctl(struct tty_struct *tty, DEFINE_WAIT(wait); struct edgeport_port *edge_port = usb_get_serial_port_data(port); - dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); - switch (cmd) { case TIOCSERGETLSR: dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__); @@ -2027,11 +2020,8 @@ static int sram_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, dev_dbg(&serial->dev->dev, "%s - %x, %x, %d\n", __func__, extAddr, addr, length); transfer_buffer = kmalloc(64, GFP_KERNEL); - if (!transfer_buffer) { - dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", - __func__, 64); + if (!transfer_buffer) return -ENOMEM; - } /* need to split these writes up into 64 byte chunks */ result = 0; @@ -2075,11 +2065,8 @@ static int rom_write(struct usb_serial *serial, __u16 extAddr, __u16 addr, unsigned char *transfer_buffer; transfer_buffer = kmalloc(64, GFP_KERNEL); - if (!transfer_buffer) { - dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", - __func__, 64); + if (!transfer_buffer) return -ENOMEM; - } /* need to split these writes up into 64 byte chunks */ result = 0; @@ -2121,11 +2108,8 @@ static int rom_read(struct usb_serial *serial, __u16 extAddr, unsigned char *transfer_buffer; transfer_buffer = kmalloc(64, GFP_KERNEL); - if (!transfer_buffer) { - dev_err(&serial->dev->dev, - "%s - kmalloc(%d) failed.\n", __func__, 64); + if (!transfer_buffer) return -ENOMEM; - } /* need to split these reads up into 64 byte chunks */ result = 0; @@ -2165,11 +2149,8 @@ static int send_iosp_ext_cmd(struct edgeport_port *edge_port, int status = 0; buffer = kmalloc(10, GFP_ATOMIC); - if (!buffer) { - dev_err(&edge_port->port->dev, - "%s - kmalloc(%d) failed.\n", __func__, 10); + if (!buffer) return -ENOMEM; - } currentCommand = buffer; @@ -2276,10 +2257,9 @@ static int send_cmd_write_baud_rate(struct edgeport_port *edge_port, /* Alloc memory for the string of commands. */ cmdBuffer = kmalloc(0x100, GFP_ATOMIC); - if (!cmdBuffer) { - dev_err(dev, "%s - kmalloc(%d) failed.\n", __func__, 0x100); + if (!cmdBuffer) return -ENOMEM; - } + currCmd = cmdBuffer; /* Enable access to divisor latch */ @@ -2785,10 +2765,9 @@ static int edge_startup(struct usb_serial *serial) /* create our private serial structure */ edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); - if (edge_serial == NULL) { - dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); + if (!edge_serial) return -ENOMEM; - } + spin_lock_init(&edge_serial->es_lock); edge_serial->serial = serial; usb_set_serial_data(serial, edge_serial); @@ -2877,14 +2856,12 @@ static int edge_startup(struct usb_serial *serial) /* not set up yet, so do it now */ edge_serial->interrupt_read_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!edge_serial->interrupt_read_urb) { - dev_err(ddev, "out of memory\n"); + if (!edge_serial->interrupt_read_urb) return -ENOMEM; - } + edge_serial->interrupt_in_buffer = kmalloc(buffer_size, GFP_KERNEL); if (!edge_serial->interrupt_in_buffer) { - dev_err(ddev, "out of memory\n"); usb_free_urb(edge_serial->interrupt_read_urb); return -ENOMEM; } @@ -2914,14 +2891,12 @@ static int edge_startup(struct usb_serial *serial) /* not set up yet, so do it now */ edge_serial->read_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!edge_serial->read_urb) { - dev_err(ddev, "out of memory\n"); + if (!edge_serial->read_urb) return -ENOMEM; - } + edge_serial->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL); if (!edge_serial->bulk_in_buffer) { - dev_err(&dev->dev, "out of memory\n"); usb_free_urb(edge_serial->read_urb); return -ENOMEM; } diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c index b7187bf32469..a2db5be9c305 100644 --- a/drivers/usb/serial/io_ti.c +++ b/drivers/usb/serial/io_ti.c @@ -20,7 +20,6 @@ #include <linux/kernel.h> #include <linux/jiffies.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -364,11 +363,9 @@ static int write_boot_mem(struct edgeport_serial *serial, /* Must do a read before write */ if (!serial->TiReadI2C) { temp = kmalloc(1, GFP_KERNEL); - if (!temp) { - dev_err(&serial->serial->dev->dev, - "%s - out of memory\n", __func__); + if (!temp) return -ENOMEM; - } + status = read_boot_mem(serial, 0, 1, temp); kfree(temp); if (status) @@ -471,10 +468,8 @@ static int tx_active(struct edgeport_port *port) int bytes_left = 0; oedb = kmalloc(sizeof(*oedb), GFP_KERNEL); - if (!oedb) { - dev_err(&port->port->dev, "%s - out of memory\n", __func__); + if (!oedb) return -ENOMEM; - } lsr = kmalloc(1, GFP_KERNEL); /* Sigh, that's right, just one byte, as not all platforms can do DMA @@ -625,14 +620,11 @@ static int check_i2c_image(struct edgeport_serial *serial) __u16 ttype; rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL); - if (!rom_desc) { - dev_err(dev, "%s - out of memory\n", __func__); + if (!rom_desc) return -ENOMEM; - } + buffer = kmalloc(TI_MAX_I2C_SIZE, GFP_KERNEL); if (!buffer) { - dev_err(dev, "%s - out of memory when allocating buffer\n", - __func__); kfree(rom_desc); return -ENOMEM; } @@ -706,10 +698,9 @@ static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer) struct device *dev = &serial->serial->dev->dev; rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL); - if (!rom_desc) { - dev_err(dev, "%s - out of memory\n", __func__); + if (!rom_desc) return -ENOMEM; - } + start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_ION, rom_desc); @@ -769,10 +760,8 @@ static int build_i2c_fw_hdr(__u8 *header, struct device *dev) sizeof(struct ti_i2c_firmware_rec)); buffer = kmalloc(buffer_size, GFP_KERNEL); - if (!buffer) { - dev_err(dev, "%s - out of memory\n", __func__); + if (!buffer) return -ENOMEM; - } // Set entire image of 0xffs memset(buffer, 0xff, buffer_size); @@ -832,10 +821,8 @@ static int i2c_type_bootmode(struct edgeport_serial *serial) u8 *data; data = kmalloc(1, GFP_KERNEL); - if (!data) { - dev_err(dev, "%s - out of memory\n", __func__); + if (!data) return -ENOMEM; - } /* Try to read type 2 */ status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ, @@ -986,10 +973,9 @@ static int download_fw(struct edgeport_serial *serial) * Read Manufacturing Descriptor from TI Based Edgeport */ ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL); - if (!ti_manuf_desc) { - dev_err(dev, "%s - out of memory.\n", __func__); + if (!ti_manuf_desc) return -ENOMEM; - } + status = get_manuf_info(serial, (__u8 *)ti_manuf_desc); if (status) { kfree(ti_manuf_desc); @@ -1006,7 +992,6 @@ static int download_fw(struct edgeport_serial *serial) rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL); if (!rom_desc) { - dev_err(dev, "%s - out of memory.\n", __func__); kfree(ti_manuf_desc); return -ENOMEM; } @@ -1023,7 +1008,6 @@ static int download_fw(struct edgeport_serial *serial) firmware_version = kmalloc(sizeof(*firmware_version), GFP_KERNEL); if (!firmware_version) { - dev_err(dev, "%s - out of memory.\n", __func__); kfree(rom_desc); kfree(ti_manuf_desc); return -ENOMEM; @@ -1068,8 +1052,6 @@ static int download_fw(struct edgeport_serial *serial) record = kmalloc(1, GFP_KERNEL); if (!record) { - dev_err(dev, "%s - out of memory.\n", - __func__); kfree(firmware_version); kfree(rom_desc); kfree(ti_manuf_desc); @@ -1153,7 +1135,6 @@ static int download_fw(struct edgeport_serial *serial) header = kmalloc(HEADER_SIZE, GFP_KERNEL); if (!header) { - dev_err(dev, "%s - out of memory.\n", __func__); kfree(rom_desc); kfree(ti_manuf_desc); return -ENOMEM; @@ -1161,7 +1142,6 @@ static int download_fw(struct edgeport_serial *serial) vheader = kmalloc(HEADER_SIZE, GFP_KERNEL); if (!vheader) { - dev_err(dev, "%s - out of memory.\n", __func__); kfree(header); kfree(rom_desc); kfree(ti_manuf_desc); @@ -1290,10 +1270,9 @@ static int download_fw(struct edgeport_serial *serial) * Read Manufacturing Descriptor from TI Based Edgeport */ ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL); - if (!ti_manuf_desc) { - dev_err(dev, "%s - out of memory.\n", __func__); + if (!ti_manuf_desc) return -ENOMEM; - } + status = get_manuf_info(serial, (__u8 *)ti_manuf_desc); if (status) { kfree(ti_manuf_desc); @@ -1328,10 +1307,8 @@ static int download_fw(struct edgeport_serial *serial) buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header)); buffer = kmalloc(buffer_size, GFP_KERNEL); - if (!buffer) { - dev_err(dev, "%s - out of memory\n", __func__); + if (!buffer) return -ENOMEM; - } /* Initialize the buffer to 0xff (pad the buffer) */ memset(buffer, 0xff, buffer_size); @@ -2122,7 +2099,6 @@ static void change_port_settings(struct tty_struct *tty, config = kmalloc (sizeof (*config), GFP_KERNEL); if (!config) { tty->termios = *old_termios; - dev_err(dev, "%s - out of memory\n", __func__); return; } @@ -2362,8 +2338,6 @@ static int edge_ioctl(struct tty_struct *tty, struct usb_serial_port *port = tty->driver_data; struct edgeport_port *edge_port = usb_get_serial_port_data(port); - dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: dev_dbg(&port->dev, "%s - TIOCGSERIAL\n", __func__); @@ -2395,10 +2369,9 @@ static int edge_startup(struct usb_serial *serial) /* create our private serial structure */ edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); - if (edge_serial == NULL) { - dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); + if (!edge_serial) return -ENOMEM; - } + mutex_init(&edge_serial->es_lock); edge_serial->serial = serial; usb_set_serial_data(serial, edge_serial); diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c index 76c9a847da5d..f51a5d52c0ed 100644 --- a/drivers/usb/serial/ipaq.c +++ b/drivers/usb/serial/ipaq.c @@ -12,7 +12,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -37,7 +36,7 @@ static int ipaq_open(struct tty_struct *tty, static int ipaq_calc_num_ports(struct usb_serial *serial); static int ipaq_startup(struct usb_serial *serial); -static struct usb_device_id ipaq_id_table [] = { +static const struct usb_device_id ipaq_id_table[] = { { USB_DEVICE(0x0104, 0x00BE) }, /* Socket USB Sync */ { USB_DEVICE(0x03F0, 0x1016) }, /* HP USB Sync */ { USB_DEVICE(0x03F0, 0x1116) }, /* HP USB Sync 1611 */ diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index 155eab14b30e..8b1cf18a668b 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c @@ -38,7 +38,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_flip.h> diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 716930ab1bb1..73956d48a0c5 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -377,15 +377,12 @@ static void ir_set_termios(struct tty_struct *tty, * send the baud change out on an "empty" data packet */ urb = usb_alloc_urb(0, GFP_KERNEL); - if (!urb) { - dev_err(&port->dev, "%s - no more urbs\n", __func__); + if (!urb) return; - } + transfer_buffer = kmalloc(1, GFP_KERNEL); - if (!transfer_buffer) { - dev_err(&port->dev, "%s - out of memory\n", __func__); + if (!transfer_buffer) goto err_buf; - } *transfer_buffer = ir_xbof | ir_baud; diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 57c439a24b5a..d00dae17d520 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c @@ -17,7 +17,6 @@ */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -770,7 +769,7 @@ uart_enable_failed: return status; } -/* Diables the IUU UART (a.k.a. the Phoenix voiderface) */ +/* Disables the IUU UART (a.k.a. the Phoenix voiderface) */ static int iuu_uart_off(struct usb_serial_port *port) { int status; diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index d6960aebe246..265c6776b081 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -31,7 +31,6 @@ #include <linux/kernel.h> #include <linux/jiffies.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -165,7 +164,7 @@ static void keyspan_set_termios(struct tty_struct *tty, if (d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk, NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) { /* FIXME - more to do here to ensure rate changes cleanly */ - /* FIXME - calcuate exact rate from divisor ? */ + /* FIXME - calculate exact rate from divisor ? */ p_priv->baud = baud_rate; } else baud_rate = tty_termios_baud_rate(old_termios); @@ -1226,10 +1225,8 @@ static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint, dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d.\n", __func__, endpoint); urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ - if (urb == NULL) { - dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d failed.\n", __func__, endpoint); + if (!urb) return NULL; - } if (endpoint == 0) { /* control EP filled in when used */ @@ -2312,10 +2309,8 @@ static int keyspan_startup(struct usb_serial *serial) /* Setup private data for serial driver */ s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL); - if (!s_priv) { - dev_dbg(&serial->dev->dev, "%s - kmalloc for keyspan_serial_private failed.\n", __func__); + if (!s_priv) return -ENOMEM; - } s_priv->instat_buf = kzalloc(INSTAT_BUFLEN, GFP_KERNEL); if (!s_priv->instat_buf) diff --git a/drivers/usb/serial/keyspan_pda.c b/drivers/usb/serial/keyspan_pda.c index 5f1d382e55cf..e972412b614b 100644 --- a/drivers/usb/serial/keyspan_pda.c +++ b/drivers/usb/serial/keyspan_pda.c @@ -17,7 +17,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/keyspan_usa26msg.h b/drivers/usb/serial/keyspan_usa26msg.h index 3808727db65a..09e21e84fc4e 100644 --- a/drivers/usb/serial/keyspan_usa26msg.h +++ b/drivers/usb/serial/keyspan_usa26msg.h @@ -62,7 +62,7 @@ or: (b) 0x80 bit set - indiates that the bytes following alternate data and + indicates that the bytes following alternate data and status bytes: STAT DATA STAT DATA STAT DATA STAT DATA ... diff --git a/drivers/usb/serial/kl5kusb105.c b/drivers/usb/serial/kl5kusb105.c index 1b4054fe52a5..c88cc4966b23 100644 --- a/drivers/usb/serial/kl5kusb105.c +++ b/drivers/usb/serial/kl5kusb105.c @@ -37,7 +37,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -182,11 +181,9 @@ static int klsi_105_get_line_state(struct usb_serial_port *port, dev_info(&port->serial->dev->dev, "sending SIO Poll request\n"); status_buf = kmalloc(KLSI_STATUSBUF_LEN, GFP_KERNEL); - if (!status_buf) { - dev_err(&port->dev, "%s - out of memory for status buffer.\n", - __func__); + if (!status_buf) return -ENOMEM; - } + status_buf[0] = 0xff; status_buf[1] = 0xff; rc = usb_control_msg(port->serial->dev, @@ -273,11 +270,9 @@ static int klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port) * priv->line_state. */ cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); - if (!cfg) { - dev_err(&port->dev, "%s - out of memory for config buffer.\n", - __func__); + if (!cfg) return -ENOMEM; - } + cfg->pktlen = 5; cfg->baudrate = kl5kusb105a_sio_b9600; cfg->databits = kl5kusb105a_dtb_8; @@ -417,10 +412,8 @@ static void klsi_105_set_termios(struct tty_struct *tty, speed_t baud; cfg = kmalloc(sizeof(*cfg), GFP_KERNEL); - if (!cfg) { - dev_err(dev, "%s - out of memory for config buffer.\n", __func__); + if (!cfg) return; - } /* lock while we are modifying the settings */ spin_lock_irqsave(&priv->lock, flags); diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index 78b48c31abf5..d8d164b82dc3 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c @@ -25,7 +25,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index 6a15adf53360..fd707d6a10e2 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c @@ -23,7 +23,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/metro-usb.c b/drivers/usb/serial/metro-usb.c index 40ccf6e5e318..39e683096e94 100644 --- a/drivers/usb/serial/metro-usb.c +++ b/drivers/usb/serial/metro-usb.c @@ -7,7 +7,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> @@ -43,7 +42,7 @@ struct metrousb_private { }; /* Device table list. */ -static struct usb_device_id id_table[] = { +static const struct usb_device_id id_table[] = { { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_BI) }, { USB_DEVICE(FOCUS_VENDOR_ID, FOCUS_PRODUCT_ID_UNI) }, { }, /* Terminating entry. */ @@ -54,7 +53,7 @@ MODULE_DEVICE_TABLE(usb, id_table); #define UNI_CMD_OPEN 0x80 #define UNI_CMD_CLOSE 0xFF -inline int metrousb_is_unidirectional_mode(struct usb_serial_port *port) +static inline int metrousb_is_unidirectional_mode(struct usb_serial_port *port) { __u16 product_id = le16_to_cpu( port->serial->dev->descriptor.idProduct); diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 439c951f261b..4eb277225a77 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c @@ -1,6 +1,6 @@ /* * mos7720.c - * Controls the Moschip 7720 usb to dual port serial convertor + * Controls the Moschip 7720 usb to dual port serial converter * * Copyright 2006 Moschip Semiconductor Tech. Ltd. * @@ -22,7 +22,6 @@ */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -46,7 +45,7 @@ #define MOS_WRITE 0x0E #define MOS_READ 0x0D -/* Interrupt Rotinue Defines */ +/* Interrupt Routines Defines */ #define SERIAL_IIR_RLS 0x06 #define SERIAL_IIR_RDA 0x04 #define SERIAL_IIR_CTI 0x0c @@ -362,15 +361,13 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport, /* create and initialize the control urb and containing urbtracker */ urbtrack = kmalloc(sizeof(struct urbtracker), GFP_ATOMIC); - if (urbtrack == NULL) { - dev_err(&usbdev->dev, "out of memory"); + if (!urbtrack) return -ENOMEM; - } + kref_get(&mos_parport->ref_count); urbtrack->mos_parport = mos_parport; urbtrack->urb = usb_alloc_urb(0, GFP_ATOMIC); - if (urbtrack->urb == NULL) { - dev_err(&usbdev->dev, "out of urbs"); + if (!urbtrack->urb) { kfree(urbtrack); return -ENOMEM; } @@ -440,7 +437,7 @@ static int write_parport_reg_nonblock(struct mos7715_parport *mos_parport, * not called the release function yet because someone has a serial port open. * The shared release_lock prevents the first, and the mutex and disconnected * flag maintained by usbserial covers the second. We also use the msg_pending - * flag to ensure that all synchronous usb messgage calls have completed before + * flag to ensure that all synchronous usb message calls have completed before * our release function can return. */ static int parport_prologue(struct parport *pp) @@ -471,7 +468,7 @@ static int parport_prologue(struct parport *pp) } /* - * This is the the common bottom part of all parallel port functions that send + * This is the common bottom part of all parallel port functions that send * synchronous messages to the device. */ static inline void parport_epilogue(struct parport *pp) @@ -702,10 +699,9 @@ static int mos7715_parport_init(struct usb_serial *serial) /* allocate and initialize parallel port control struct */ mos_parport = kzalloc(sizeof(struct mos7715_parport), GFP_KERNEL); - if (mos_parport == NULL) { - dev_dbg(&serial->dev->dev, "%s: kzalloc failed\n", __func__); + if (!mos_parport) return -ENOMEM; - } + mos_parport->msg_pending = false; kref_init(&mos_parport->ref_count); spin_lock_init(&mos_parport->listlock); @@ -1018,18 +1014,12 @@ static int mos7720_open(struct tty_struct *tty, struct usb_serial_port *port) for (j = 0; j < NUM_URBS; ++j) { urb = usb_alloc_urb(0, GFP_KERNEL); mos7720_port->write_urb_pool[j] = urb; - - if (urb == NULL) { - dev_err(&port->dev, "No more urbs???\n"); + if (!urb) continue; - } urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); if (!urb->transfer_buffer) { - dev_err(&port->dev, - "%s-out of memory for urb buffers.\n", - __func__); usb_free_urb(mos7720_port->write_urb_pool[j]); mos7720_port->write_urb_pool[j] = NULL; continue; @@ -1250,11 +1240,8 @@ static int mos7720_write(struct tty_struct *tty, struct usb_serial_port *port, if (urb->transfer_buffer == NULL) { urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); - if (urb->transfer_buffer == NULL) { - dev_err_console(port, "%s no more kernel memory...\n", - __func__); + if (!urb->transfer_buffer) goto exit; - } } transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); @@ -1885,8 +1872,6 @@ static int mos7720_ioctl(struct tty_struct *tty, if (mos7720_port == NULL) return -ENODEV; - dev_dbg(&port->dev, "%s - cmd = 0x%x", __func__, cmd); - switch (cmd) { case TIOCSERGETLSR: dev_dbg(&port->dev, "%s TIOCSERGETLSR\n", __func__); diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index a69da83604c0..e9d967ff521b 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c @@ -24,7 +24,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -876,20 +875,14 @@ static int mos7840_open(struct tty_struct *tty, struct usb_serial_port *port) for (j = 0; j < NUM_URBS; ++j) { urb = usb_alloc_urb(0, GFP_KERNEL); mos7840_port->write_urb_pool[j] = urb; - - if (urb == NULL) { - dev_err(&port->dev, "No more urbs???\n"); + if (!urb) continue; - } urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); if (!urb->transfer_buffer) { usb_free_urb(urb); mos7840_port->write_urb_pool[j] = NULL; - dev_err(&port->dev, - "%s-out of memory for urb buffers.\n", - __func__); continue; } } @@ -1381,12 +1374,8 @@ static int mos7840_write(struct tty_struct *tty, struct usb_serial_port *port, if (urb->transfer_buffer == NULL) { urb->transfer_buffer = kmalloc(URB_TRANSFER_BUFFER_SIZE, GFP_KERNEL); - - if (urb->transfer_buffer == NULL) { - dev_err_console(port, "%s no more kernel memory...\n", - __func__); + if (!urb->transfer_buffer) goto exit; - } } transfer_size = min(count, URB_TRANSFER_BUFFER_SIZE); @@ -2070,8 +2059,6 @@ static int mos7840_ioctl(struct tty_struct *tty, if (mos7840_port == NULL) return -1; - dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); - switch (cmd) { /* return number of bytes available */ @@ -2208,10 +2195,8 @@ static int mos7840_port_probe(struct usb_serial_port *port) dev_dbg(&port->dev, "mos7840_startup: configuring port %d\n", pnum); mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL); - if (mos7840_port == NULL) { - dev_err(&port->dev, "%s - Out of memory\n", __func__); + if (!mos7840_port) return -ENOMEM; - } /* Initialize all port interrupt end point to port 0 int * endpoint. Our device has only one interrupt end point diff --git a/drivers/usb/serial/mxuport.c b/drivers/usb/serial/mxuport.c new file mode 100644 index 000000000000..ab1d690274ae --- /dev/null +++ b/drivers/usb/serial/mxuport.c @@ -0,0 +1,1393 @@ +/* + * mxuport.c - MOXA UPort series driver + * + * Copyright (c) 2006 Moxa Technologies Co., Ltd. + * Copyright (c) 2013 Andrew Lunn <andrew@lunn.ch> + * + * 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. + * + * Supports the following Moxa USB to serial converters: + * 2 ports : UPort 1250, UPort 1250I + * 4 ports : UPort 1410, UPort 1450, UPort 1450I + * 8 ports : UPort 1610-8, UPort 1650-8 + * 16 ports : UPort 1610-16, UPort 1650-16 + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/firmware.h> +#include <linux/jiffies.h> +#include <linux/serial.h> +#include <linux/serial_reg.h> +#include <linux/slab.h> +#include <linux/tty.h> +#include <linux/tty_driver.h> +#include <linux/tty_flip.h> +#include <linux/uaccess.h> +#include <linux/usb.h> +#include <linux/usb/serial.h> +#include <asm/unaligned.h> + +/* Definitions for the vendor ID and device ID */ +#define MX_USBSERIAL_VID 0x110A +#define MX_UPORT1250_PID 0x1250 +#define MX_UPORT1251_PID 0x1251 +#define MX_UPORT1410_PID 0x1410 +#define MX_UPORT1450_PID 0x1450 +#define MX_UPORT1451_PID 0x1451 +#define MX_UPORT1618_PID 0x1618 +#define MX_UPORT1658_PID 0x1658 +#define MX_UPORT1613_PID 0x1613 +#define MX_UPORT1653_PID 0x1653 + +/* Definitions for USB info */ +#define HEADER_SIZE 4 +#define EVENT_LENGTH 8 +#define DOWN_BLOCK_SIZE 64 + +/* Definitions for firmware info */ +#define VER_ADDR_1 0x20 +#define VER_ADDR_2 0x24 +#define VER_ADDR_3 0x28 + +/* Definitions for USB vendor request */ +#define RQ_VENDOR_NONE 0x00 +#define RQ_VENDOR_SET_BAUD 0x01 /* Set baud rate */ +#define RQ_VENDOR_SET_LINE 0x02 /* Set line status */ +#define RQ_VENDOR_SET_CHARS 0x03 /* Set Xon/Xoff chars */ +#define RQ_VENDOR_SET_RTS 0x04 /* Set RTS */ +#define RQ_VENDOR_SET_DTR 0x05 /* Set DTR */ +#define RQ_VENDOR_SET_XONXOFF 0x06 /* Set auto Xon/Xoff */ +#define RQ_VENDOR_SET_RX_HOST_EN 0x07 /* Set RX host enable */ +#define RQ_VENDOR_SET_OPEN 0x08 /* Set open/close port */ +#define RQ_VENDOR_PURGE 0x09 /* Purge Rx/Tx buffer */ +#define RQ_VENDOR_SET_MCR 0x0A /* Set MCR register */ +#define RQ_VENDOR_SET_BREAK 0x0B /* Set Break signal */ + +#define RQ_VENDOR_START_FW_DOWN 0x0C /* Start firmware download */ +#define RQ_VENDOR_STOP_FW_DOWN 0x0D /* Stop firmware download */ +#define RQ_VENDOR_QUERY_FW_READY 0x0E /* Query if new firmware ready */ + +#define RQ_VENDOR_SET_FIFO_DISABLE 0x0F /* Set fifo disable */ +#define RQ_VENDOR_SET_INTERFACE 0x10 /* Set interface */ +#define RQ_VENDOR_SET_HIGH_PERFOR 0x11 /* Set hi-performance */ + +#define RQ_VENDOR_ERASE_BLOCK 0x12 /* Erase flash block */ +#define RQ_VENDOR_WRITE_PAGE 0x13 /* Write flash page */ +#define RQ_VENDOR_PREPARE_WRITE 0x14 /* Prepare write flash */ +#define RQ_VENDOR_CONFIRM_WRITE 0x15 /* Confirm write flash */ +#define RQ_VENDOR_LOCATE 0x16 /* Locate the device */ + +#define RQ_VENDOR_START_ROM_DOWN 0x17 /* Start firmware download */ +#define RQ_VENDOR_ROM_DATA 0x18 /* Rom file data */ +#define RQ_VENDOR_STOP_ROM_DOWN 0x19 /* Stop firmware download */ +#define RQ_VENDOR_FW_DATA 0x20 /* Firmware data */ + +#define RQ_VENDOR_RESET_DEVICE 0x23 /* Try to reset the device */ +#define RQ_VENDOR_QUERY_FW_CONFIG 0x24 + +#define RQ_VENDOR_GET_VERSION 0x81 /* Get firmware version */ +#define RQ_VENDOR_GET_PAGE 0x82 /* Read flash page */ +#define RQ_VENDOR_GET_ROM_PROC 0x83 /* Get ROM process state */ + +#define RQ_VENDOR_GET_INQUEUE 0x84 /* Data in input buffer */ +#define RQ_VENDOR_GET_OUTQUEUE 0x85 /* Data in output buffer */ + +#define RQ_VENDOR_GET_MSR 0x86 /* Get modem status register */ + +/* Definitions for UPort event type */ +#define UPORT_EVENT_NONE 0 /* None */ +#define UPORT_EVENT_TXBUF_THRESHOLD 1 /* Tx buffer threshold */ +#define UPORT_EVENT_SEND_NEXT 2 /* Send next */ +#define UPORT_EVENT_MSR 3 /* Modem status */ +#define UPORT_EVENT_LSR 4 /* Line status */ +#define UPORT_EVENT_MCR 5 /* Modem control */ + +/* Definitions for serial event type */ +#define SERIAL_EV_CTS 0x0008 /* CTS changed state */ +#define SERIAL_EV_DSR 0x0010 /* DSR changed state */ +#define SERIAL_EV_RLSD 0x0020 /* RLSD changed state */ + +/* Definitions for modem control event type */ +#define SERIAL_EV_XOFF 0x40 /* XOFF received */ + +/* Definitions for line control of communication */ +#define MX_WORDLENGTH_5 5 +#define MX_WORDLENGTH_6 6 +#define MX_WORDLENGTH_7 7 +#define MX_WORDLENGTH_8 8 + +#define MX_PARITY_NONE 0 +#define MX_PARITY_ODD 1 +#define MX_PARITY_EVEN 2 +#define MX_PARITY_MARK 3 +#define MX_PARITY_SPACE 4 + +#define MX_STOP_BITS_1 0 +#define MX_STOP_BITS_1_5 1 +#define MX_STOP_BITS_2 2 + +#define MX_RTS_DISABLE 0x0 +#define MX_RTS_ENABLE 0x1 +#define MX_RTS_HW 0x2 +#define MX_RTS_NO_CHANGE 0x3 /* Flag, not valid register value*/ + +#define MX_INT_RS232 0 +#define MX_INT_2W_RS485 1 +#define MX_INT_RS422 2 +#define MX_INT_4W_RS485 3 + +/* Definitions for holding reason */ +#define MX_WAIT_FOR_CTS 0x0001 +#define MX_WAIT_FOR_DSR 0x0002 +#define MX_WAIT_FOR_DCD 0x0004 +#define MX_WAIT_FOR_XON 0x0008 +#define MX_WAIT_FOR_START_TX 0x0010 +#define MX_WAIT_FOR_UNTHROTTLE 0x0020 +#define MX_WAIT_FOR_LOW_WATER 0x0040 +#define MX_WAIT_FOR_SEND_NEXT 0x0080 + +#define MX_UPORT_2_PORT BIT(0) +#define MX_UPORT_4_PORT BIT(1) +#define MX_UPORT_8_PORT BIT(2) +#define MX_UPORT_16_PORT BIT(3) + +/* This structure holds all of the local port information */ +struct mxuport_port { + u8 mcr_state; /* Last MCR state */ + u8 msr_state; /* Last MSR state */ + struct mutex mutex; /* Protects mcr_state */ + spinlock_t spinlock; /* Protects msr_state */ +}; + +/* Table of devices that work with this driver */ +static const struct usb_device_id mxuport_idtable[] = { + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1250_PID), + .driver_info = MX_UPORT_2_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1251_PID), + .driver_info = MX_UPORT_2_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1410_PID), + .driver_info = MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1450_PID), + .driver_info = MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1451_PID), + .driver_info = MX_UPORT_4_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1618_PID), + .driver_info = MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1658_PID), + .driver_info = MX_UPORT_8_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1613_PID), + .driver_info = MX_UPORT_16_PORT }, + { USB_DEVICE(MX_USBSERIAL_VID, MX_UPORT1653_PID), + .driver_info = MX_UPORT_16_PORT }, + {} /* Terminating entry */ +}; + +MODULE_DEVICE_TABLE(usb, mxuport_idtable); + +/* + * Add a four byte header containing the port number and the number of + * bytes of data in the message. Return the number of bytes in the + * buffer. + */ +static int mxuport_prepare_write_buffer(struct usb_serial_port *port, + void *dest, size_t size) +{ + u8 *buf = dest; + int count; + + count = kfifo_out_locked(&port->write_fifo, buf + HEADER_SIZE, + size - HEADER_SIZE, + &port->lock); + + put_unaligned_be16(port->port_number, buf); + put_unaligned_be16(count, buf + 2); + + dev_dbg(&port->dev, "%s - size %zd count %d\n", __func__, + size, count); + + return count + HEADER_SIZE; +} + +/* Read the given buffer in from the control pipe. */ +static int mxuport_recv_ctrl_urb(struct usb_serial *serial, + u8 request, u16 value, u16 index, + u8 *data, size_t size) +{ + int status; + + status = usb_control_msg(serial->dev, + usb_rcvctrlpipe(serial->dev, 0), + request, + (USB_DIR_IN | USB_TYPE_VENDOR | + USB_RECIP_DEVICE), value, index, + data, size, + USB_CTRL_GET_TIMEOUT); + if (status < 0) { + dev_err(&serial->interface->dev, + "%s - usb_control_msg failed (%d)\n", + __func__, status); + return status; + } + + if (status != size) { + dev_err(&serial->interface->dev, + "%s - short read (%d / %zd)\n", + __func__, status, size); + return -EIO; + } + + return status; +} + +/* Write the given buffer out to the control pipe. */ +static int mxuport_send_ctrl_data_urb(struct usb_serial *serial, + u8 request, + u16 value, u16 index, + u8 *data, size_t size) +{ + int status; + + status = usb_control_msg(serial->dev, + usb_sndctrlpipe(serial->dev, 0), + request, + (USB_DIR_OUT | USB_TYPE_VENDOR | + USB_RECIP_DEVICE), value, index, + data, size, + USB_CTRL_SET_TIMEOUT); + if (status < 0) { + dev_err(&serial->interface->dev, + "%s - usb_control_msg failed (%d)\n", + __func__, status); + return status; + } + + if (status != size) { + dev_err(&serial->interface->dev, + "%s - short write (%d / %zd)\n", + __func__, status, size); + return -EIO; + } + + return 0; +} + +/* Send a vendor request without any data */ +static int mxuport_send_ctrl_urb(struct usb_serial *serial, + u8 request, u16 value, u16 index) +{ + return mxuport_send_ctrl_data_urb(serial, request, value, index, + NULL, 0); +} + +/* + * mxuport_throttle - throttle function of driver + * + * This function is called by the tty driver when it wants to stop the + * data being read from the port. Since all the data comes over one + * bulk in endpoint, we cannot stop submitting urbs by setting + * port->throttle. Instead tell the device to stop sending us data for + * the port. + */ +static void mxuport_throttle(struct tty_struct *tty) +{ + struct usb_serial_port *port = tty->driver_data; + struct usb_serial *serial = port->serial; + + dev_dbg(&port->dev, "%s\n", __func__); + + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, + 0, port->port_number); +} + +/* + * mxuport_unthrottle - unthrottle function of driver + * + * This function is called by the tty driver when it wants to resume + * the data being read from the port. Tell the device it can resume + * sending us received data from the port. + */ +static void mxuport_unthrottle(struct tty_struct *tty) +{ + + struct usb_serial_port *port = tty->driver_data; + struct usb_serial *serial = port->serial; + + dev_dbg(&port->dev, "%s\n", __func__); + + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, + 1, port->port_number); +} + +/* + * Processes one chunk of data received for a port. Mostly a copy of + * usb_serial_generic_process_read_urb(). + */ +static void mxuport_process_read_urb_data(struct usb_serial_port *port, + char *data, int size) +{ + int i; + + if (!port->port.console || !port->sysrq) { + tty_insert_flip_string(&port->port, data, size); + } else { + for (i = 0; i < size; i++, data++) { + if (!usb_serial_handle_sysrq_char(port, *data)) + tty_insert_flip_char(&port->port, *data, + TTY_NORMAL); + } + } + tty_flip_buffer_push(&port->port); +} + +static void mxuport_msr_event(struct usb_serial_port *port, u8 buf[4]) +{ + struct mxuport_port *mxport = usb_get_serial_port_data(port); + u8 rcv_msr_hold = buf[2] & 0xF0; + u16 rcv_msr_event = get_unaligned_be16(buf); + unsigned long flags; + + if (rcv_msr_event == 0) + return; + + /* Update MSR status */ + spin_lock_irqsave(&mxport->spinlock, flags); + + dev_dbg(&port->dev, "%s - current MSR status = 0x%x\n", + __func__, mxport->msr_state); + + if (rcv_msr_hold & UART_MSR_CTS) { + mxport->msr_state |= UART_MSR_CTS; + dev_dbg(&port->dev, "%s - CTS high\n", __func__); + } else { + mxport->msr_state &= ~UART_MSR_CTS; + dev_dbg(&port->dev, "%s - CTS low\n", __func__); + } + + if (rcv_msr_hold & UART_MSR_DSR) { + mxport->msr_state |= UART_MSR_DSR; + dev_dbg(&port->dev, "%s - DSR high\n", __func__); + } else { + mxport->msr_state &= ~UART_MSR_DSR; + dev_dbg(&port->dev, "%s - DSR low\n", __func__); + } + + if (rcv_msr_hold & UART_MSR_DCD) { + mxport->msr_state |= UART_MSR_DCD; + dev_dbg(&port->dev, "%s - DCD high\n", __func__); + } else { + mxport->msr_state &= ~UART_MSR_DCD; + dev_dbg(&port->dev, "%s - DCD low\n", __func__); + } + spin_unlock_irqrestore(&mxport->spinlock, flags); + + if (rcv_msr_event & + (SERIAL_EV_CTS | SERIAL_EV_DSR | SERIAL_EV_RLSD)) { + + if (rcv_msr_event & SERIAL_EV_CTS) { + port->icount.cts++; + dev_dbg(&port->dev, "%s - CTS change\n", __func__); + } + + if (rcv_msr_event & SERIAL_EV_DSR) { + port->icount.dsr++; + dev_dbg(&port->dev, "%s - DSR change\n", __func__); + } + + if (rcv_msr_event & SERIAL_EV_RLSD) { + port->icount.dcd++; + dev_dbg(&port->dev, "%s - DCD change\n", __func__); + } + wake_up_interruptible(&port->port.delta_msr_wait); + } +} + +static void mxuport_lsr_event(struct usb_serial_port *port, u8 buf[4]) +{ + u8 lsr_event = buf[2]; + + if (lsr_event & UART_LSR_BI) { + port->icount.brk++; + dev_dbg(&port->dev, "%s - break error\n", __func__); + } + + if (lsr_event & UART_LSR_FE) { + port->icount.frame++; + dev_dbg(&port->dev, "%s - frame error\n", __func__); + } + + if (lsr_event & UART_LSR_PE) { + port->icount.parity++; + dev_dbg(&port->dev, "%s - parity error\n", __func__); + } + + if (lsr_event & UART_LSR_OE) { + port->icount.overrun++; + dev_dbg(&port->dev, "%s - overrun error\n", __func__); + } +} + +/* + * When something interesting happens, modem control lines XON/XOFF + * etc, the device sends an event. Process these events. + */ +static void mxuport_process_read_urb_event(struct usb_serial_port *port, + u8 buf[4], u32 event) +{ + dev_dbg(&port->dev, "%s - receive event : %04x\n", __func__, event); + + switch (event) { + case UPORT_EVENT_SEND_NEXT: + /* + * Sent as part of the flow control on device buffers. + * Not currently used. + */ + break; + case UPORT_EVENT_MSR: + mxuport_msr_event(port, buf); + break; + case UPORT_EVENT_LSR: + mxuport_lsr_event(port, buf); + break; + case UPORT_EVENT_MCR: + /* + * Event to indicate a change in XON/XOFF from the + * peer. Currently not used. We just continue + * sending the device data and it will buffer it if + * needed. This event could be used for flow control + * between the host and the device. + */ + break; + default: + dev_dbg(&port->dev, "Unexpected event\n"); + break; + } +} + +/* + * One URB can contain data for multiple ports. Demultiplex the data, + * checking the port exists, is opened and the message is valid. + */ +static void mxuport_process_read_urb_demux_data(struct urb *urb) +{ + struct usb_serial_port *port = urb->context; + struct usb_serial *serial = port->serial; + u8 *data = urb->transfer_buffer; + u8 *end = data + urb->actual_length; + struct usb_serial_port *demux_port; + u8 *ch; + u16 rcv_port; + u16 rcv_len; + + while (data < end) { + if (data + HEADER_SIZE > end) { + dev_warn(&port->dev, "%s - message with short header\n", + __func__); + return; + } + + rcv_port = get_unaligned_be16(data); + if (rcv_port >= serial->num_ports) { + dev_warn(&port->dev, "%s - message for invalid port\n", + __func__); + return; + } + + demux_port = serial->port[rcv_port]; + rcv_len = get_unaligned_be16(data + 2); + if (!rcv_len || data + HEADER_SIZE + rcv_len > end) { + dev_warn(&port->dev, "%s - short data\n", __func__); + return; + } + + if (test_bit(ASYNCB_INITIALIZED, &demux_port->port.flags)) { + ch = data + HEADER_SIZE; + mxuport_process_read_urb_data(demux_port, ch, rcv_len); + } else { + dev_dbg(&demux_port->dev, "%s - data for closed port\n", + __func__); + } + data += HEADER_SIZE + rcv_len; + } +} + +/* + * One URB can contain events for multiple ports. Demultiplex the event, + * checking the port exists, and is opened. + */ +static void mxuport_process_read_urb_demux_event(struct urb *urb) +{ + struct usb_serial_port *port = urb->context; + struct usb_serial *serial = port->serial; + u8 *data = urb->transfer_buffer; + u8 *end = data + urb->actual_length; + struct usb_serial_port *demux_port; + u8 *ch; + u16 rcv_port; + u16 rcv_event; + + while (data < end) { + if (data + EVENT_LENGTH > end) { + dev_warn(&port->dev, "%s - message with short event\n", + __func__); + return; + } + + rcv_port = get_unaligned_be16(data); + if (rcv_port >= serial->num_ports) { + dev_warn(&port->dev, "%s - message for invalid port\n", + __func__); + return; + } + + demux_port = serial->port[rcv_port]; + if (test_bit(ASYNCB_INITIALIZED, &demux_port->port.flags)) { + ch = data + HEADER_SIZE; + rcv_event = get_unaligned_be16(data + 2); + mxuport_process_read_urb_event(demux_port, ch, + rcv_event); + } else { + dev_dbg(&demux_port->dev, + "%s - event for closed port\n", __func__); + } + data += EVENT_LENGTH; + } +} + +/* + * This is called when we have received data on the bulk in + * endpoint. Depending on which port it was received on, it can + * contain serial data or events. + */ +static void mxuport_process_read_urb(struct urb *urb) +{ + struct usb_serial_port *port = urb->context; + struct usb_serial *serial = port->serial; + + if (port == serial->port[0]) + mxuport_process_read_urb_demux_data(urb); + + if (port == serial->port[1]) + mxuport_process_read_urb_demux_event(urb); +} + +/* + * Ask the device how many bytes it has queued to be sent out. If + * there are none, return true. + */ +static bool mxuport_tx_empty(struct usb_serial_port *port) +{ + struct usb_serial *serial = port->serial; + bool is_empty = true; + u32 txlen; + u8 *len_buf; + int err; + + len_buf = kzalloc(4, GFP_KERNEL); + if (!len_buf) + goto out; + + err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_OUTQUEUE, 0, + port->port_number, len_buf, 4); + if (err < 0) + goto out; + + txlen = get_unaligned_be32(len_buf); + dev_dbg(&port->dev, "%s - tx len = %u\n", __func__, txlen); + + if (txlen != 0) + is_empty = false; + +out: + kfree(len_buf); + return is_empty; +} + +static int mxuport_set_mcr(struct usb_serial_port *port, u8 mcr_state) +{ + struct usb_serial *serial = port->serial; + int err; + + dev_dbg(&port->dev, "%s - %02x\n", __func__, mcr_state); + + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_MCR, + mcr_state, port->port_number); + if (err) + dev_err(&port->dev, "%s - failed to change MCR\n", __func__); + + return err; +} + +static int mxuport_set_dtr(struct usb_serial_port *port, int on) +{ + struct mxuport_port *mxport = usb_get_serial_port_data(port); + struct usb_serial *serial = port->serial; + int err; + + mutex_lock(&mxport->mutex); + + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_DTR, + !!on, port->port_number); + if (!err) { + if (on) + mxport->mcr_state |= UART_MCR_DTR; + else + mxport->mcr_state &= ~UART_MCR_DTR; + } + + mutex_unlock(&mxport->mutex); + + return err; +} + +static int mxuport_set_rts(struct usb_serial_port *port, u8 state) +{ + struct mxuport_port *mxport = usb_get_serial_port_data(port); + struct usb_serial *serial = port->serial; + int err; + u8 mcr_state; + + mutex_lock(&mxport->mutex); + mcr_state = mxport->mcr_state; + + switch (state) { + case MX_RTS_DISABLE: + mcr_state &= ~UART_MCR_RTS; + break; + case MX_RTS_ENABLE: + mcr_state |= UART_MCR_RTS; + break; + case MX_RTS_HW: + /* + * Do not update mxport->mcr_state when doing hardware + * flow control. + */ + break; + default: + /* + * Should not happen, but somebody might try passing + * MX_RTS_NO_CHANGE, which is not valid. + */ + err = -EINVAL; + goto out; + } + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RTS, + state, port->port_number); + if (!err) + mxport->mcr_state = mcr_state; + +out: + mutex_unlock(&mxport->mutex); + + return err; +} + +static void mxuport_dtr_rts(struct usb_serial_port *port, int on) +{ + struct mxuport_port *mxport = usb_get_serial_port_data(port); + u8 mcr_state; + int err; + + mutex_lock(&mxport->mutex); + mcr_state = mxport->mcr_state; + + if (on) + mcr_state |= (UART_MCR_RTS | UART_MCR_DTR); + else + mcr_state &= ~(UART_MCR_RTS | UART_MCR_DTR); + + err = mxuport_set_mcr(port, mcr_state); + if (!err) + mxport->mcr_state = mcr_state; + + mutex_unlock(&mxport->mutex); +} + +static int mxuport_tiocmset(struct tty_struct *tty, unsigned int set, + unsigned int clear) +{ + struct usb_serial_port *port = tty->driver_data; + struct mxuport_port *mxport = usb_get_serial_port_data(port); + int err; + u8 mcr_state; + + mutex_lock(&mxport->mutex); + mcr_state = mxport->mcr_state; + + if (set & TIOCM_RTS) + mcr_state |= UART_MCR_RTS; + + if (set & TIOCM_DTR) + mcr_state |= UART_MCR_DTR; + + if (clear & TIOCM_RTS) + mcr_state &= ~UART_MCR_RTS; + + if (clear & TIOCM_DTR) + mcr_state &= ~UART_MCR_DTR; + + err = mxuport_set_mcr(port, mcr_state); + if (!err) + mxport->mcr_state = mcr_state; + + mutex_unlock(&mxport->mutex); + + return err; +} + +static int mxuport_tiocmget(struct tty_struct *tty) +{ + struct mxuport_port *mxport; + struct usb_serial_port *port = tty->driver_data; + unsigned int result; + unsigned long flags; + unsigned int msr; + unsigned int mcr; + + mxport = usb_get_serial_port_data(port); + + mutex_lock(&mxport->mutex); + spin_lock_irqsave(&mxport->spinlock, flags); + + msr = mxport->msr_state; + mcr = mxport->mcr_state; + + spin_unlock_irqrestore(&mxport->spinlock, flags); + mutex_unlock(&mxport->mutex); + + result = (((mcr & UART_MCR_DTR) ? TIOCM_DTR : 0) | /* 0x002 */ + ((mcr & UART_MCR_RTS) ? TIOCM_RTS : 0) | /* 0x004 */ + ((msr & UART_MSR_CTS) ? TIOCM_CTS : 0) | /* 0x020 */ + ((msr & UART_MSR_DCD) ? TIOCM_CAR : 0) | /* 0x040 */ + ((msr & UART_MSR_RI) ? TIOCM_RI : 0) | /* 0x080 */ + ((msr & UART_MSR_DSR) ? TIOCM_DSR : 0)); /* 0x100 */ + + dev_dbg(&port->dev, "%s - 0x%04x\n", __func__, result); + + return result; +} + +static int mxuport_set_termios_flow(struct tty_struct *tty, + struct ktermios *old_termios, + struct usb_serial_port *port, + struct usb_serial *serial) +{ + u8 xon = START_CHAR(tty); + u8 xoff = STOP_CHAR(tty); + int enable; + int err; + u8 *buf; + u8 rts; + + buf = kmalloc(2, GFP_KERNEL); + if (!buf) + return -ENOMEM; + + /* S/W flow control settings */ + if (I_IXOFF(tty) || I_IXON(tty)) { + enable = 1; + buf[0] = xon; + buf[1] = xoff; + + err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_CHARS, + 0, port->port_number, + buf, 2); + if (err) + goto out; + + dev_dbg(&port->dev, "%s - XON = 0x%02x, XOFF = 0x%02x\n", + __func__, xon, xoff); + } else { + enable = 0; + } + + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_XONXOFF, + enable, port->port_number); + if (err) + goto out; + + rts = MX_RTS_NO_CHANGE; + + /* H/W flow control settings */ + if (!old_termios || + C_CRTSCTS(tty) != (old_termios->c_cflag & CRTSCTS)) { + if (C_CRTSCTS(tty)) + rts = MX_RTS_HW; + else + rts = MX_RTS_ENABLE; + } + + if (C_BAUD(tty)) { + if (old_termios && (old_termios->c_cflag & CBAUD) == B0) { + /* Raise DTR and RTS */ + if (C_CRTSCTS(tty)) + rts = MX_RTS_HW; + else + rts = MX_RTS_ENABLE; + mxuport_set_dtr(port, 1); + } + } else { + /* Drop DTR and RTS */ + rts = MX_RTS_DISABLE; + mxuport_set_dtr(port, 0); + } + + if (rts != MX_RTS_NO_CHANGE) + err = mxuport_set_rts(port, rts); + +out: + kfree(buf); + return err; +} + +static void mxuport_set_termios(struct tty_struct *tty, + struct usb_serial_port *port, + struct ktermios *old_termios) +{ + struct usb_serial *serial = port->serial; + u8 *buf; + u8 data_bits; + u8 stop_bits; + u8 parity; + int baud; + int err; + + if (old_termios && + !tty_termios_hw_change(&tty->termios, old_termios) && + tty->termios.c_iflag == old_termios->c_iflag) { + dev_dbg(&port->dev, "%s - nothing to change\n", __func__); + return; + } + + buf = kmalloc(4, GFP_KERNEL); + if (!buf) + return; + + /* Set data bit of termios */ + switch (C_CSIZE(tty)) { + case CS5: + data_bits = MX_WORDLENGTH_5; + break; + case CS6: + data_bits = MX_WORDLENGTH_6; + break; + case CS7: + data_bits = MX_WORDLENGTH_7; + break; + case CS8: + default: + data_bits = MX_WORDLENGTH_8; + break; + } + + /* Set parity of termios */ + if (C_PARENB(tty)) { + if (C_CMSPAR(tty)) { + if (C_PARODD(tty)) + parity = MX_PARITY_MARK; + else + parity = MX_PARITY_SPACE; + } else { + if (C_PARODD(tty)) + parity = MX_PARITY_ODD; + else + parity = MX_PARITY_EVEN; + } + } else { + parity = MX_PARITY_NONE; + } + + /* Set stop bit of termios */ + if (C_CSTOPB(tty)) + stop_bits = MX_STOP_BITS_2; + else + stop_bits = MX_STOP_BITS_1; + + buf[0] = data_bits; + buf[1] = parity; + buf[2] = stop_bits; + buf[3] = 0; + + err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_LINE, + 0, port->port_number, buf, 4); + if (err) + goto out; + + err = mxuport_set_termios_flow(tty, old_termios, port, serial); + if (err) + goto out; + + baud = tty_get_baud_rate(tty); + if (!baud) + baud = 9600; + + /* Note: Little Endian */ + put_unaligned_le32(baud, buf); + + err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_SET_BAUD, + 0, port->port_number, + buf, 4); + if (err) + goto out; + + dev_dbg(&port->dev, "baud_rate : %d\n", baud); + dev_dbg(&port->dev, "data_bits : %d\n", data_bits); + dev_dbg(&port->dev, "parity : %d\n", parity); + dev_dbg(&port->dev, "stop_bits : %d\n", stop_bits); + +out: + kfree(buf); +} + +/* + * Determine how many ports this device has dynamically. It will be + * called after the probe() callback is called, but before attach(). + */ +static int mxuport_calc_num_ports(struct usb_serial *serial) +{ + unsigned long features = (unsigned long)usb_get_serial_data(serial); + + if (features & MX_UPORT_2_PORT) + return 2; + if (features & MX_UPORT_4_PORT) + return 4; + if (features & MX_UPORT_8_PORT) + return 8; + if (features & MX_UPORT_16_PORT) + return 16; + + return 0; +} + +/* Get the version of the firmware currently running. */ +static int mxuport_get_fw_version(struct usb_serial *serial, u32 *version) +{ + u8 *ver_buf; + int err; + + ver_buf = kzalloc(4, GFP_KERNEL); + if (!ver_buf) + return -ENOMEM; + + /* Get firmware version from SDRAM */ + err = mxuport_recv_ctrl_urb(serial, RQ_VENDOR_GET_VERSION, 0, 0, + ver_buf, 4); + if (err != 4) { + err = -EIO; + goto out; + } + + *version = (ver_buf[0] << 16) | (ver_buf[1] << 8) | ver_buf[2]; + err = 0; +out: + kfree(ver_buf); + return err; +} + +/* Given a firmware blob, download it to the device. */ +static int mxuport_download_fw(struct usb_serial *serial, + const struct firmware *fw_p) +{ + u8 *fw_buf; + size_t txlen; + size_t fwidx; + int err; + + fw_buf = kmalloc(DOWN_BLOCK_SIZE, GFP_KERNEL); + if (!fw_buf) + return -ENOMEM; + + dev_dbg(&serial->interface->dev, "Starting firmware download...\n"); + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_START_FW_DOWN, 0, 0); + if (err) + goto out; + + fwidx = 0; + do { + txlen = min_t(size_t, (fw_p->size - fwidx), DOWN_BLOCK_SIZE); + + memcpy(fw_buf, &fw_p->data[fwidx], txlen); + err = mxuport_send_ctrl_data_urb(serial, RQ_VENDOR_FW_DATA, + 0, 0, fw_buf, txlen); + if (err) { + mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, + 0, 0); + goto out; + } + + fwidx += txlen; + usleep_range(1000, 2000); + + } while (fwidx < fw_p->size); + + msleep(1000); + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_STOP_FW_DOWN, 0, 0); + if (err) + goto out; + + msleep(1000); + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_READY, 0, 0); + +out: + kfree(fw_buf); + return err; +} + +static int mxuport_probe(struct usb_serial *serial, + const struct usb_device_id *id) +{ + u16 productid = le16_to_cpu(serial->dev->descriptor.idProduct); + const struct firmware *fw_p = NULL; + u32 version; + int local_ver; + char buf[32]; + int err; + + /* Load our firmware */ + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_QUERY_FW_CONFIG, 0, 0); + if (err) { + mxuport_send_ctrl_urb(serial, RQ_VENDOR_RESET_DEVICE, 0, 0); + return err; + } + + err = mxuport_get_fw_version(serial, &version); + if (err < 0) + return err; + + dev_dbg(&serial->interface->dev, "Device firmware version v%x.%x.%x\n", + (version & 0xff0000) >> 16, + (version & 0xff00) >> 8, + (version & 0xff)); + + snprintf(buf, sizeof(buf) - 1, "moxa/moxa-%04x.fw", productid); + + err = request_firmware(&fw_p, buf, &serial->interface->dev); + if (err) { + dev_warn(&serial->interface->dev, "Firmware %s not found\n", + buf); + + /* Use the firmware already in the device */ + err = 0; + } else { + local_ver = ((fw_p->data[VER_ADDR_1] << 16) | + (fw_p->data[VER_ADDR_2] << 8) | + fw_p->data[VER_ADDR_3]); + dev_dbg(&serial->interface->dev, + "Available firmware version v%x.%x.%x\n", + fw_p->data[VER_ADDR_1], fw_p->data[VER_ADDR_2], + fw_p->data[VER_ADDR_3]); + if (local_ver > version) { + err = mxuport_download_fw(serial, fw_p); + if (err) + goto out; + err = mxuport_get_fw_version(serial, &version); + if (err < 0) + goto out; + } + } + + dev_info(&serial->interface->dev, + "Using device firmware version v%x.%x.%x\n", + (version & 0xff0000) >> 16, + (version & 0xff00) >> 8, + (version & 0xff)); + + /* + * Contains the features of this hardware. Store away for + * later use, eg, number of ports. + */ + usb_set_serial_data(serial, (void *)id->driver_info); +out: + if (fw_p) + release_firmware(fw_p); + return err; +} + + +static int mxuport_port_probe(struct usb_serial_port *port) +{ + struct usb_serial *serial = port->serial; + struct mxuport_port *mxport; + int err; + + mxport = devm_kzalloc(&port->dev, sizeof(struct mxuport_port), + GFP_KERNEL); + if (!mxport) + return -ENOMEM; + + mutex_init(&mxport->mutex); + spin_lock_init(&mxport->spinlock); + + /* Set the port private data */ + usb_set_serial_port_data(port, mxport); + + /* Set FIFO (Enable) */ + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_FIFO_DISABLE, + 0, port->port_number); + if (err) + return err; + + /* Set transmission mode (Hi-Performance) */ + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_HIGH_PERFOR, + 0, port->port_number); + if (err) + return err; + + /* Set interface (RS-232) */ + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_INTERFACE, + MX_INT_RS232, + port->port_number); + if (err) + return err; + + return 0; +} + +static int mxuport_alloc_write_urb(struct usb_serial *serial, + struct usb_serial_port *port, + struct usb_serial_port *port0, + int j) +{ + struct usb_device *dev = interface_to_usbdev(serial->interface); + + set_bit(j, &port->write_urbs_free); + port->write_urbs[j] = usb_alloc_urb(0, GFP_KERNEL); + if (!port->write_urbs[j]) + return -ENOMEM; + + port->bulk_out_buffers[j] = kmalloc(port0->bulk_out_size, GFP_KERNEL); + if (!port->bulk_out_buffers[j]) + return -ENOMEM; + + usb_fill_bulk_urb(port->write_urbs[j], dev, + usb_sndbulkpipe(dev, port->bulk_out_endpointAddress), + port->bulk_out_buffers[j], + port->bulk_out_size, + serial->type->write_bulk_callback, + port); + return 0; +} + + +static int mxuport_alloc_write_urbs(struct usb_serial *serial, + struct usb_serial_port *port, + struct usb_serial_port *port0) +{ + int j; + int ret; + + for (j = 0; j < ARRAY_SIZE(port->write_urbs); ++j) { + ret = mxuport_alloc_write_urb(serial, port, port0, j); + if (ret) + return ret; + } + return 0; +} + + +static int mxuport_attach(struct usb_serial *serial) +{ + struct usb_serial_port *port0 = serial->port[0]; + struct usb_serial_port *port1 = serial->port[1]; + struct usb_serial_port *port; + int err; + int i; + int j; + + /* + * Throw away all but the first allocated write URBs so we can + * set them up again to fit the multiplexing scheme. + */ + for (i = 1; i < serial->num_bulk_out; ++i) { + port = serial->port[i]; + for (j = 0; j < ARRAY_SIZE(port->write_urbs); ++j) { + usb_free_urb(port->write_urbs[j]); + kfree(port->bulk_out_buffers[j]); + port->write_urbs[j] = NULL; + port->bulk_out_buffers[j] = NULL; + } + port->write_urbs_free = 0; + } + + /* + * All write data is sent over the first bulk out endpoint, + * with an added header to indicate the port. Allocate URBs + * for each port to the first bulk out endpoint. + */ + for (i = 1; i < serial->num_ports; ++i) { + port = serial->port[i]; + port->bulk_out_size = port0->bulk_out_size; + port->bulk_out_endpointAddress = + port0->bulk_out_endpointAddress; + + err = mxuport_alloc_write_urbs(serial, port, port0); + if (err) + return err; + + port->write_urb = port->write_urbs[0]; + port->bulk_out_buffer = port->bulk_out_buffers[0]; + + /* + * Ensure each port has a fifo. The framework only + * allocates a fifo to ports with a bulk out endpoint, + * where as we need one for every port. + */ + if (!kfifo_initialized(&port->write_fifo)) { + err = kfifo_alloc(&port->write_fifo, PAGE_SIZE, + GFP_KERNEL); + if (err) + return err; + } + } + + /* + * All data from the ports is received on the first bulk in + * endpoint, with a multiplex header. The second bulk in is + * used for events. + * + * Start to read from the device. + */ + err = usb_serial_generic_submit_read_urbs(port0, GFP_KERNEL); + if (err) + return err; + + err = usb_serial_generic_submit_read_urbs(port1, GFP_KERNEL); + if (err) { + usb_serial_generic_close(port0); + return err; + } + + return 0; +} + +static int mxuport_open(struct tty_struct *tty, struct usb_serial_port *port) +{ + struct mxuport_port *mxport = usb_get_serial_port_data(port); + struct usb_serial *serial = port->serial; + int err; + + /* Set receive host (enable) */ + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, + 1, port->port_number); + if (err) + return err; + + err = mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, + 1, port->port_number); + if (err) { + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, + 0, port->port_number); + return err; + } + + /* Initial port termios */ + mxuport_set_termios(tty, port, NULL); + + /* + * TODO: use RQ_VENDOR_GET_MSR, once we know what it + * returns. + */ + mxport->msr_state = 0; + + return err; +} + +static void mxuport_close(struct usb_serial_port *port) +{ + struct usb_serial *serial = port->serial; + + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_OPEN, 0, + port->port_number); + + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_RX_HOST_EN, 0, + port->port_number); +} + +/* Send a break to the port. */ +static void mxuport_break_ctl(struct tty_struct *tty, int break_state) +{ + struct usb_serial_port *port = tty->driver_data; + struct usb_serial *serial = port->serial; + int enable; + + if (break_state == -1) { + enable = 1; + dev_dbg(&port->dev, "%s - sending break\n", __func__); + } else { + enable = 0; + dev_dbg(&port->dev, "%s - clearing break\n", __func__); + } + + mxuport_send_ctrl_urb(serial, RQ_VENDOR_SET_BREAK, + enable, port->port_number); +} + +static int mxuport_resume(struct usb_serial *serial) +{ + struct usb_serial_port *port; + int c = 0; + int i; + int r; + + for (i = 0; i < 2; i++) { + port = serial->port[i]; + + r = usb_serial_generic_submit_read_urbs(port, GFP_NOIO); + if (r < 0) + c++; + } + + for (i = 0; i < serial->num_ports; i++) { + port = serial->port[i]; + if (!test_bit(ASYNCB_INITIALIZED, &port->port.flags)) + continue; + + r = usb_serial_generic_write_start(port, GFP_NOIO); + if (r < 0) + c++; + } + + return c ? -EIO : 0; +} + +static struct usb_serial_driver mxuport_device = { + .driver = { + .owner = THIS_MODULE, + .name = "mxuport", + }, + .description = "MOXA UPort", + .id_table = mxuport_idtable, + .num_ports = 0, + .probe = mxuport_probe, + .port_probe = mxuport_port_probe, + .attach = mxuport_attach, + .calc_num_ports = mxuport_calc_num_ports, + .open = mxuport_open, + .close = mxuport_close, + .set_termios = mxuport_set_termios, + .break_ctl = mxuport_break_ctl, + .tx_empty = mxuport_tx_empty, + .tiocmiwait = usb_serial_generic_tiocmiwait, + .get_icount = usb_serial_generic_get_icount, + .throttle = mxuport_throttle, + .unthrottle = mxuport_unthrottle, + .tiocmget = mxuport_tiocmget, + .tiocmset = mxuport_tiocmset, + .dtr_rts = mxuport_dtr_rts, + .process_read_urb = mxuport_process_read_urb, + .prepare_write_buffer = mxuport_prepare_write_buffer, + .resume = mxuport_resume, +}; + +static struct usb_serial_driver *const serial_drivers[] = { + &mxuport_device, NULL +}; + +module_usb_serial_driver(serial_drivers, mxuport_idtable); + +MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>"); +MODULE_AUTHOR("<support@moxa.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 38725fc8c2c8..2a97cdc078d5 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c @@ -14,7 +14,6 @@ #include <linux/gfp.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/tty_flip.h> #include <linux/module.h> diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index 5739bf6f7200..f6c6900bccf0 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -13,7 +13,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/opticon.c b/drivers/usb/serial/opticon.c index cbe779f578f9..4856fb7e637e 100644 --- a/drivers/usb/serial/opticon.c +++ b/drivers/usb/serial/opticon.c @@ -12,7 +12,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/tty_driver.h> #include <linux/slab.h> @@ -139,7 +138,7 @@ static int opticon_open(struct tty_struct *tty, struct usb_serial_port *port) /* Clear RTS line */ send_control_msg(port, CONTROL_RTS, 0); - /* clear the halt status of the enpoint */ + /* clear the halt status of the endpoint */ usb_clear_halt(port->serial->dev, port->read_urb->pipe); res = usb_serial_generic_open(tty, port); @@ -200,15 +199,12 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, buffer = kmalloc(count, GFP_ATOMIC); if (!buffer) { - dev_err(&port->dev, "out of memory\n"); count = -ENOMEM; - goto error_no_buffer; } urb = usb_alloc_urb(0, GFP_ATOMIC); if (!urb) { - dev_err(&port->dev, "no more free urbs\n"); count = -ENOMEM; goto error_no_urb; } @@ -217,11 +213,10 @@ static int opticon_write(struct tty_struct *tty, struct usb_serial_port *port, usb_serial_debug_data(&port->dev, __func__, count, buffer); - /* The conncected devices do not have a bulk write endpoint, + /* The connected devices do not have a bulk write endpoint, * to transmit data to de barcode device the control endpoint is used */ dr = kmalloc(sizeof(struct usb_ctrlrequest), GFP_NOIO); if (!dr) { - dev_err(&port->dev, "out of memory\n"); count = -ENOMEM; goto error_no_dr; } @@ -367,8 +362,6 @@ static int opticon_ioctl(struct tty_struct *tty, { struct usb_serial_port *port = tty->driver_data; - dev_dbg(&port->dev, "%s - cmd = 0x%x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: return get_serial_info(port, diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index cc7a24154490..5c86f57e4afa 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -320,6 +320,9 @@ static void option_instat_callback(struct urb *urb); * It seems to contain a Qualcomm QSC6240/6290 chipset */ #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 +/* iBall 3.5G connect wireless modem */ +#define IBALL_3_5G_CONNECT 0x9605 + /* Zoom */ #define ZOOM_PRODUCT_4597 0x9607 @@ -1447,6 +1450,17 @@ static const struct usb_device_id option_ids[] = { .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xffe9, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8b, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8c, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8d, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8e, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff8f, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff90, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff91, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff92, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff93, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff94, 0xff, 0xff, 0xff) }, /* NOTE: most ZTE CDMA devices should be driven by zte_ev, not option */ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff), @@ -1489,6 +1503,7 @@ static const struct usb_device_id option_ids[] = { .driver_info = (kernel_ulong_t)&four_g_w14_blacklist }, { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, + { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, /* Pirelli */ { USB_DEVICE_INTERFACE_CLASS(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_C100_1, 0xff) }, diff --git a/drivers/usb/serial/oti6858.c b/drivers/usb/serial/oti6858.c index a2080ac7b7e5..a4b88bc038b6 100644 --- a/drivers/usb/serial/oti6858.c +++ b/drivers/usb/serial/oti6858.c @@ -39,7 +39,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -103,6 +102,7 @@ struct oti6858_control_pkt { #define TX_BUFFER_EMPTIED 0x09 u8 pin_state; #define PIN_MASK 0x3f +#define PIN_MSR_MASK 0x1b #define PIN_RTS 0x20 /* output pin */ #define PIN_CTS 0x10 /* input pin, active low */ #define PIN_DSR 0x08 /* input pin, active low */ @@ -134,7 +134,6 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty); static int oti6858_tiocmget(struct tty_struct *tty); static int oti6858_tiocmset(struct tty_struct *tty, unsigned int set, unsigned int clear); -static int oti6858_tiocmiwait(struct tty_struct *tty, unsigned long arg); static int oti6858_port_probe(struct usb_serial_port *port); static int oti6858_port_remove(struct usb_serial_port *port); @@ -153,7 +152,7 @@ static struct usb_serial_driver oti6858_device = { .init_termios = oti6858_init_termios, .tiocmget = oti6858_tiocmget, .tiocmset = oti6858_tiocmset, - .tiocmiwait = oti6858_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .read_bulk_callback = oti6858_read_bulk_callback, .read_int_callback = oti6858_read_int_callback, .write_bulk_callback = oti6858_write_bulk_callback, @@ -200,8 +199,7 @@ static void setup_line(struct work_struct *work) int result; new_setup = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL); - if (new_setup == NULL) { - dev_err(&port->dev, "%s(): out of memory!\n", __func__); + if (!new_setup) { /* we will try again */ schedule_delayed_work(&priv->delayed_setup_work, msecs_to_jiffies(2)); @@ -287,11 +285,9 @@ static void send_data(struct work_struct *work) if (count != 0) { allow = kmalloc(1, GFP_KERNEL); - if (!allow) { - dev_err_console(port, "%s(): kmalloc failed\n", - __func__); + if (!allow) return; - } + result = usb_control_msg(port->serial->dev, usb_rcvctrlpipe(port->serial->dev, 0), OTI6858_REQ_T_CHECK_TXBUFF, @@ -517,10 +513,8 @@ static int oti6858_open(struct tty_struct *tty, struct usb_serial_port *port) usb_clear_halt(serial->dev, port->read_urb->pipe); buf = kmalloc(OTI6858_CTRL_PKT_SIZE, GFP_KERNEL); - if (buf == NULL) { - dev_err(&port->dev, "%s(): out of memory!\n", __func__); + if (!buf) return -ENOMEM; - } result = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), OTI6858_REQ_T_GET_STATUS, @@ -647,46 +641,6 @@ static int oti6858_tiocmget(struct tty_struct *tty) return result; } -static int oti6858_tiocmiwait(struct tty_struct *tty, unsigned long arg) -{ - struct usb_serial_port *port = tty->driver_data; - struct oti6858_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - unsigned int prev, status; - unsigned int changed; - - spin_lock_irqsave(&priv->lock, flags); - prev = priv->status.pin_state; - spin_unlock_irqrestore(&priv->lock, flags); - - while (1) { - wait_event_interruptible(port->port.delta_msr_wait, - port->serial->disconnected || - priv->status.pin_state != prev); - if (signal_pending(current)) - return -ERESTARTSYS; - - if (port->serial->disconnected) - return -EIO; - - spin_lock_irqsave(&priv->lock, flags); - status = priv->status.pin_state & PIN_MASK; - spin_unlock_irqrestore(&priv->lock, flags); - - changed = prev ^ status; - /* FIXME: check if this is correct (active high/low) */ - if (((arg & TIOCM_RNG) && (changed & PIN_RI)) || - ((arg & TIOCM_DSR) && (changed & PIN_DSR)) || - ((arg & TIOCM_CD) && (changed & PIN_DCD)) || - ((arg & TIOCM_CTS) && (changed & PIN_CTS))) - return 0; - prev = status; - } - - /* NOTREACHED */ - return 0; -} - static void oti6858_read_int_callback(struct urb *urb) { struct usb_serial_port *port = urb->context; @@ -744,8 +698,21 @@ static void oti6858_read_int_callback(struct urb *urb) } if (!priv->transient) { - if (xs->pin_state != priv->status.pin_state) + u8 delta = xs->pin_state ^ priv->status.pin_state; + + if (delta & PIN_MSR_MASK) { + if (delta & PIN_CTS) + port->icount.cts++; + if (delta & PIN_DSR) + port->icount.dsr++; + if (delta & PIN_RI) + port->icount.rng++; + if (delta & PIN_DCD) + port->icount.dcd++; + wake_up_interruptible(&port->port.delta_msr_wait); + } + memcpy(&priv->status, xs, OTI6858_CTRL_PKT_SIZE); } diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 1e3318dfa1cb..2e22fc22c382 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c @@ -12,12 +12,10 @@ * * See Documentation/usb/usb-serial.txt for more information on using this * driver - * */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -32,10 +30,9 @@ #include <asm/unaligned.h> #include "pl2303.h" -/* - * Version Information - */ -#define DRIVER_DESC "Prolific PL2303 USB to serial adaptor driver" + +#define PL2303_QUIRK_UART_STATE_IDX0 BIT(0) +#define PL2303_QUIRK_LEGACY BIT(1) static const struct usb_device_id id_table[] = { { USB_DEVICE(PL2303_VENDOR_ID, PL2303_PRODUCT_ID) }, @@ -64,9 +61,12 @@ static const struct usb_device_id id_table[] = { { USB_DEVICE(SITECOM_VENDOR_ID, SITECOM_PRODUCT_ID) }, { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_ID) }, { USB_DEVICE(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_ID) }, - { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1) }, - { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65) }, - { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75) }, + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_SX1), + .driver_info = PL2303_QUIRK_UART_STATE_IDX0 }, + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X65), + .driver_info = PL2303_QUIRK_UART_STATE_IDX0 }, + { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_X75), + .driver_info = PL2303_QUIRK_UART_STATE_IDX0 }, { USB_DEVICE(SIEMENS_VENDOR_ID, SIEMENS_PRODUCT_ID_EF81) }, { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_ID_S81) }, /* Benq/Siemens S81 */ { USB_DEVICE(SYNTECH_VENDOR_ID, SYNTECH_PRODUCT_ID) }, @@ -116,7 +116,8 @@ MODULE_DEVICE_TABLE(usb, id_table); #define VENDOR_READ_REQUEST_TYPE 0xc0 #define VENDOR_READ_REQUEST 0x01 -#define UART_STATE 0x08 +#define UART_STATE_INDEX 8 +#define UART_STATE_MSR_MASK 0x8b #define UART_STATE_TRANSIENT_MASK 0x74 #define UART_DCD 0x01 #define UART_DSR 0x02 @@ -129,98 +130,142 @@ MODULE_DEVICE_TABLE(usb, id_table); enum pl2303_type { - type_0, /* don't know the difference between type 0 and */ - type_1, /* type 1, until someone from prolific tells us... */ - HX, /* HX version of the pl2303 chip */ + TYPE_01, /* Type 0 and 1 (difference unknown) */ + TYPE_HX, /* HX version of the pl2303 chip */ + TYPE_COUNT +}; + +struct pl2303_type_data { + speed_t max_baud_rate; + unsigned long quirks; }; struct pl2303_serial_private { - enum pl2303_type type; + const struct pl2303_type_data *type; + unsigned long quirks; }; struct pl2303_private { spinlock_t lock; u8 line_control; u8 line_status; + + u8 line_settings[7]; +}; + +static const struct pl2303_type_data pl2303_type_data[TYPE_COUNT] = { + [TYPE_01] = { + .max_baud_rate = 1228800, + .quirks = PL2303_QUIRK_LEGACY, + }, }; -static int pl2303_vendor_read(__u16 value, __u16 index, - struct usb_serial *serial, unsigned char *buf) +static int pl2303_vendor_read(struct usb_serial *serial, u16 value, + unsigned char buf[1]) { - int res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), + struct device *dev = &serial->interface->dev; + int res; + + res = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), VENDOR_READ_REQUEST, VENDOR_READ_REQUEST_TYPE, - value, index, buf, 1, 100); - dev_dbg(&serial->interface->dev, "0x%x:0x%x:0x%x:0x%x %d - %x\n", - VENDOR_READ_REQUEST_TYPE, VENDOR_READ_REQUEST, value, index, - res, buf[0]); - return res; + value, 0, buf, 1, 100); + if (res != 1) { + dev_err(dev, "%s - failed to read [%04x]: %d\n", __func__, + value, res); + if (res >= 0) + res = -EIO; + + return res; + } + + dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, buf[0]); + + return 0; } -static int pl2303_vendor_write(__u16 value, __u16 index, - struct usb_serial *serial) +static int pl2303_vendor_write(struct usb_serial *serial, u16 value, u16 index) { - int res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), + struct device *dev = &serial->interface->dev; + int res; + + dev_dbg(dev, "%s - [%04x] = %02x\n", __func__, value, index); + + res = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), VENDOR_WRITE_REQUEST, VENDOR_WRITE_REQUEST_TYPE, value, index, NULL, 0, 100); - dev_dbg(&serial->interface->dev, "0x%x:0x%x:0x%x:0x%x %d\n", - VENDOR_WRITE_REQUEST_TYPE, VENDOR_WRITE_REQUEST, value, index, - res); - return res; + if (res) { + dev_err(dev, "%s - failed to write [%04x]: %d\n", __func__, + value, res); + return res; + } + + return 0; +} + +static int pl2303_probe(struct usb_serial *serial, + const struct usb_device_id *id) +{ + usb_set_serial_data(serial, (void *)id->driver_info); + + return 0; } static int pl2303_startup(struct usb_serial *serial) { struct pl2303_serial_private *spriv; - enum pl2303_type type = type_0; + enum pl2303_type type = TYPE_01; unsigned char *buf; spriv = kzalloc(sizeof(*spriv), GFP_KERNEL); if (!spriv) return -ENOMEM; - buf = kmalloc(10, GFP_KERNEL); + buf = kmalloc(1, GFP_KERNEL); if (!buf) { kfree(spriv); return -ENOMEM; } if (serial->dev->descriptor.bDeviceClass == 0x02) - type = type_0; + type = TYPE_01; /* type 0 */ else if (serial->dev->descriptor.bMaxPacketSize0 == 0x40) - type = HX; + type = TYPE_HX; else if (serial->dev->descriptor.bDeviceClass == 0x00) - type = type_1; + type = TYPE_01; /* type 1 */ else if (serial->dev->descriptor.bDeviceClass == 0xFF) - type = type_1; + type = TYPE_01; /* type 1 */ dev_dbg(&serial->interface->dev, "device type: %d\n", type); - spriv->type = type; + spriv->type = &pl2303_type_data[type]; + spriv->quirks = (unsigned long)usb_get_serial_data(serial); + spriv->quirks |= spriv->type->quirks; + usb_set_serial_data(serial, spriv); - pl2303_vendor_read(0x8484, 0, serial, buf); - pl2303_vendor_write(0x0404, 0, serial); - pl2303_vendor_read(0x8484, 0, serial, buf); - pl2303_vendor_read(0x8383, 0, serial, buf); - pl2303_vendor_read(0x8484, 0, serial, buf); - pl2303_vendor_write(0x0404, 1, serial); - pl2303_vendor_read(0x8484, 0, serial, buf); - pl2303_vendor_read(0x8383, 0, serial, buf); - pl2303_vendor_write(0, 1, serial); - pl2303_vendor_write(1, 0, serial); - if (type == HX) - pl2303_vendor_write(2, 0x44, serial); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_write(serial, 0x0404, 0); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_read(serial, 0x8383, buf); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_write(serial, 0x0404, 1); + pl2303_vendor_read(serial, 0x8484, buf); + pl2303_vendor_read(serial, 0x8383, buf); + pl2303_vendor_write(serial, 0, 1); + pl2303_vendor_write(serial, 1, 0); + if (spriv->quirks & PL2303_QUIRK_LEGACY) + pl2303_vendor_write(serial, 2, 0x24); else - pl2303_vendor_write(2, 0x24, serial); + pl2303_vendor_write(serial, 2, 0x44); kfree(buf); + return 0; } static void pl2303_release(struct usb_serial *serial) { - struct pl2303_serial_private *spriv; + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); - spriv = usb_get_serial_data(serial); kfree(spriv); } @@ -243,9 +288,8 @@ static int pl2303_port_probe(struct usb_serial_port *port) static int pl2303_port_remove(struct usb_serial_port *port) { - struct pl2303_private *priv; + struct pl2303_private *priv = usb_get_serial_port_data(port); - priv = usb_get_serial_port_data(port); kfree(priv); return 0; @@ -256,39 +300,31 @@ static int pl2303_set_control_lines(struct usb_serial_port *port, u8 value) struct usb_device *dev = port->serial->dev; int retval; + dev_dbg(&port->dev, "%s - %02x\n", __func__, value); + retval = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), SET_CONTROL_REQUEST, SET_CONTROL_REQUEST_TYPE, value, 0, NULL, 0, 100); - dev_dbg(&port->dev, "%s - value = %d, retval = %d\n", __func__, - value, retval); + if (retval) + dev_err(&port->dev, "%s - failed: %d\n", __func__, retval); + return retval; } -static void pl2303_encode_baudrate(struct tty_struct *tty, - struct usb_serial_port *port, - u8 buf[4]) +/* + * Returns the nearest supported baud rate that can be set directly without + * using divisors. + */ +static speed_t pl2303_get_supported_baud_rate(speed_t baud) { - const int baud_sup[] = { 75, 150, 300, 600, 1200, 1800, 2400, 3600, - 4800, 7200, 9600, 14400, 19200, 28800, 38400, - 57600, 115200, 230400, 460800, 500000, 614400, - 921600, 1228800, 2457600, 3000000, 6000000 }; - - struct usb_serial *serial = port->serial; - struct pl2303_serial_private *spriv = usb_get_serial_data(serial); - int baud; - int i; + static const speed_t baud_sup[] = { + 75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, + 14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800, + 614400, 921600, 1228800, 2457600, 3000000, 6000000 + }; - /* - * NOTE: Only the values defined in baud_sup are supported! - * => if unsupported values are set, the PL2303 seems to use - * 9600 baud (at least my PL2303X always does) - */ - baud = tty_get_baud_rate(tty); - dev_dbg(&port->dev, "baud requested = %d\n", baud); - if (!baud) - return; + unsigned i; - /* Set baudrate to nearest supported value */ for (i = 0; i < ARRAY_SIZE(baud_sup); ++i) { if (baud_sup[i] > baud) break; @@ -301,31 +337,120 @@ static void pl2303_encode_baudrate(struct tty_struct *tty, else baud = baud_sup[i]; - /* type_0, type_1 only support up to 1228800 baud */ - if (spriv->type != HX) - baud = min_t(int, baud, 1228800); + return baud; +} - if (baud <= 115200) { - put_unaligned_le32(baud, buf); - } else { - /* - * Apparently the formula for higher speeds is: - * baudrate = 12M * 32 / (2^buf[1]) / buf[0] - */ - unsigned tmp = 12000000 * 32 / baud; - buf[3] = 0x80; - buf[2] = 0; - buf[1] = (tmp >= 256); - while (tmp >= 256) { - tmp >>= 2; - buf[1] <<= 1; - } - buf[0] = tmp; +/* + * NOTE: If unsupported baud rates are set directly, the PL2303 seems to + * use 9600 baud. + */ +static speed_t pl2303_encode_baud_rate_direct(unsigned char buf[4], + speed_t baud) +{ + put_unaligned_le32(baud, buf); + + return baud; +} + +static speed_t pl2303_encode_baud_rate_divisor(unsigned char buf[4], + speed_t baud) +{ + unsigned int tmp; + + /* + * Apparently the formula is: + * baudrate = 12M * 32 / (2^buf[1]) / buf[0] + */ + tmp = 12000000 * 32 / baud; + buf[3] = 0x80; + buf[2] = 0; + buf[1] = (tmp >= 256); + while (tmp >= 256) { + tmp >>= 2; + buf[1] <<= 1; } + buf[0] = tmp; + + return baud; +} + +static void pl2303_encode_baud_rate(struct tty_struct *tty, + struct usb_serial_port *port, + u8 buf[4]) +{ + struct usb_serial *serial = port->serial; + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); + speed_t baud_sup; + speed_t baud; + + baud = tty_get_baud_rate(tty); + dev_dbg(&port->dev, "baud requested = %u\n", baud); + if (!baud) + return; + + if (spriv->type->max_baud_rate) + baud = min_t(speed_t, baud, spriv->type->max_baud_rate); + /* + * Set baud rate to nearest supported value. + * + * NOTE: Baud rate 500k can only be set using divisors. + */ + baud_sup = pl2303_get_supported_baud_rate(baud); + + if (baud == 500000) + baud = pl2303_encode_baud_rate_divisor(buf, baud); + else + baud = pl2303_encode_baud_rate_direct(buf, baud_sup); /* Save resulting baud rate */ tty_encode_baud_rate(tty, baud, baud); - dev_dbg(&port->dev, "baud set = %d\n", baud); + dev_dbg(&port->dev, "baud set = %u\n", baud); +} + +static int pl2303_get_line_request(struct usb_serial_port *port, + unsigned char buf[7]) +{ + struct usb_device *udev = port->serial->dev; + int ret; + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE, + 0, 0, buf, 7, 100); + if (ret != 7) { + dev_err(&port->dev, "%s - failed: %d\n", __func__, ret); + + if (ret > 0) + ret = -EIO; + + return ret; + } + + dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf); + + return 0; +} + +static int pl2303_set_line_request(struct usb_serial_port *port, + unsigned char buf[7]) +{ + struct usb_device *udev = port->serial->dev; + int ret; + + ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), + SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE, + 0, 0, buf, 7, 100); + if (ret != 7) { + dev_err(&port->dev, "%s - failed: %d\n", __func__, ret); + + if (ret > 0) + ret = -EIO; + + return ret; + } + + dev_dbg(&port->dev, "%s - %7ph\n", __func__, buf); + + return 0; } static void pl2303_set_termios(struct tty_struct *tty, @@ -336,30 +461,21 @@ static void pl2303_set_termios(struct tty_struct *tty, struct pl2303_private *priv = usb_get_serial_port_data(port); unsigned long flags; unsigned char *buf; - int i; + int ret; u8 control; - /* - * The PL2303 is reported to lose bytes if you change serial settings - * even to the same values as before. Thus we actually need to filter - * in this specific case. - */ if (old_termios && !tty_termios_hw_change(&tty->termios, old_termios)) return; buf = kzalloc(7, GFP_KERNEL); if (!buf) { - dev_err(&port->dev, "%s - out of memory.\n", __func__); /* Report back no change occurred */ if (old_termios) tty->termios = *old_termios; return; } - i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE, - 0, 0, buf, 7, 100); - dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf); + pl2303_get_line_request(port, buf); switch (C_CSIZE(tty)) { case CS5: @@ -378,7 +494,7 @@ static void pl2303_set_termios(struct tty_struct *tty, dev_dbg(&port->dev, "data bits = %d\n", buf[6]); /* For reference buf[0]:buf[3] baud rate value */ - pl2303_encode_baudrate(tty, port, &buf[0]); + pl2303_encode_baud_rate(tty, port, &buf[0]); /* For reference buf[4]=0 is 1 stop bits */ /* For reference buf[4]=1 is 1.5 stop bits */ @@ -407,7 +523,7 @@ static void pl2303_set_termios(struct tty_struct *tty, /* For reference buf[5]=3 is mark parity */ /* For reference buf[5]=4 is space parity */ if (C_PARODD(tty)) { - if (tty->termios.c_cflag & CMSPAR) { + if (C_CMSPAR(tty)) { buf[5] = 3; dev_dbg(&port->dev, "parity = mark\n"); } else { @@ -415,7 +531,7 @@ static void pl2303_set_termios(struct tty_struct *tty, dev_dbg(&port->dev, "parity = odd\n"); } } else { - if (tty->termios.c_cflag & CMSPAR) { + if (C_CMSPAR(tty)) { buf[5] = 4; dev_dbg(&port->dev, "parity = space\n"); } else { @@ -428,10 +544,23 @@ static void pl2303_set_termios(struct tty_struct *tty, dev_dbg(&port->dev, "parity = none\n"); } - i = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), - SET_LINE_REQUEST, SET_LINE_REQUEST_TYPE, - 0, 0, buf, 7, 100); - dev_dbg(&port->dev, "0x21:0x20:0:0 %d\n", i); + /* + * Some PL2303 are known to lose bytes if you change serial settings + * even to the same values as before. Thus we actually need to filter + * in this specific case. + * + * Note that the tty_termios_hw_change check above is not sufficient + * as a previously requested baud rate may differ from the one + * actually used (and stored in old_termios). + * + * NOTE: No additional locking needed for line_settings as it is + * only used in set_termios, which is serialised against itself. + */ + if (!old_termios || memcmp(buf, priv->line_settings, 7)) { + ret = pl2303_set_line_request(port, buf); + if (!ret) + memcpy(priv->line_settings, buf, 7); + } /* change control lines if we are switching to or from B0 */ spin_lock_irqsave(&priv->lock, flags); @@ -448,19 +577,13 @@ static void pl2303_set_termios(struct tty_struct *tty, spin_unlock_irqrestore(&priv->lock, flags); } - memset(buf, 0, 7); - i = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), - GET_LINE_REQUEST, GET_LINE_REQUEST_TYPE, - 0, 0, buf, 7, 100); - dev_dbg(&port->dev, "0xa1:0x21:0:0 %d - %7ph\n", i, buf); - if (C_CRTSCTS(tty)) { - if (spriv->type == HX) - pl2303_vendor_write(0x0, 0x61, serial); + if (spriv->quirks & PL2303_QUIRK_LEGACY) + pl2303_vendor_write(serial, 0x0, 0x41); else - pl2303_vendor_write(0x0, 0x41, serial); + pl2303_vendor_write(serial, 0x0, 0x61); } else { - pl2303_vendor_write(0x0, 0x0, serial); + pl2303_vendor_write(serial, 0x0, 0x0); } kfree(buf); @@ -473,13 +596,13 @@ static void pl2303_dtr_rts(struct usb_serial_port *port, int on) u8 control; spin_lock_irqsave(&priv->lock, flags); - /* Change DTR and RTS */ if (on) priv->line_control |= (CONTROL_DTR | CONTROL_RTS); else priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); control = priv->line_control; spin_unlock_irqrestore(&priv->lock, flags); + pl2303_set_control_lines(port, control); } @@ -495,13 +618,13 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) struct pl2303_serial_private *spriv = usb_get_serial_data(serial); int result; - if (spriv->type != HX) { + if (spriv->quirks & PL2303_QUIRK_LEGACY) { usb_clear_halt(serial->dev, port->write_urb->pipe); usb_clear_halt(serial->dev, port->read_urb->pipe); } else { /* reset upstream data pipes */ - pl2303_vendor_write(8, 0, serial); - pl2303_vendor_write(9, 0, serial); + pl2303_vendor_write(serial, 8, 0); + pl2303_vendor_write(serial, 9, 0); } /* Setup termios */ @@ -510,8 +633,8 @@ static int pl2303_open(struct tty_struct *tty, struct usb_serial_port *port) result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); if (result) { - dev_err(&port->dev, "%s - failed submitting interrupt urb," - " error %d\n", __func__, result); + dev_err(&port->dev, "failed to submit interrupt urb: %d\n", + result); return result; } @@ -581,48 +704,10 @@ static int pl2303_tiocmget(struct tty_struct *tty) static int pl2303_carrier_raised(struct usb_serial_port *port) { struct pl2303_private *priv = usb_get_serial_port_data(port); + if (priv->line_status & UART_DCD) return 1; - return 0; -} -static int pl2303_tiocmiwait(struct tty_struct *tty, unsigned long arg) -{ - struct usb_serial_port *port = tty->driver_data; - struct pl2303_private *priv = usb_get_serial_port_data(port); - unsigned long flags; - unsigned int prevstatus; - unsigned int status; - unsigned int changed; - - spin_lock_irqsave(&priv->lock, flags); - prevstatus = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); - - while (1) { - interruptible_sleep_on(&port->port.delta_msr_wait); - /* see if a signal did it */ - if (signal_pending(current)) - return -ERESTARTSYS; - - if (port->serial->disconnected) - return -EIO; - - spin_lock_irqsave(&priv->lock, flags); - status = priv->line_status; - spin_unlock_irqrestore(&priv->lock, flags); - - changed = prevstatus ^ status; - - if (((arg & TIOCM_RNG) && (changed & UART_RING)) || - ((arg & TIOCM_DSR) && (changed & UART_DSR)) || - ((arg & TIOCM_CD) && (changed & UART_DCD)) || - ((arg & TIOCM_CTS) && (changed & UART_CTS))) { - return 0; - } - prevstatus = status; - } - /* NOTREACHED */ return 0; } @@ -632,8 +717,6 @@ static int pl2303_ioctl(struct tty_struct *tty, struct serial_struct ser; struct usb_serial_port *port = tty->driver_data; - dev_dbg(&port->dev, "%s cmd = 0x%04x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: memset(&ser, 0, sizeof ser); @@ -647,9 +730,9 @@ static int pl2303_ioctl(struct tty_struct *tty, return 0; default: - dev_dbg(&port->dev, "%s not supported = 0x%04x\n", __func__, cmd); break; } + return -ENOIOCTLCMD; } @@ -664,6 +747,7 @@ static void pl2303_break_ctl(struct tty_struct *tty, int break_state) state = BREAK_OFF; else state = BREAK_ON; + dev_dbg(&port->dev, "%s - turning break %s\n", __func__, state == BREAK_OFF ? "off" : "on"); @@ -678,48 +762,51 @@ static void pl2303_update_line_status(struct usb_serial_port *port, unsigned char *data, unsigned int actual_length) { - + struct usb_serial *serial = port->serial; + struct pl2303_serial_private *spriv = usb_get_serial_data(serial); struct pl2303_private *priv = usb_get_serial_port_data(port); struct tty_struct *tty; unsigned long flags; - u8 status_idx = UART_STATE; - u8 length = UART_STATE + 1; - u8 prev_line_status; - u16 idv, idp; - - idv = le16_to_cpu(port->serial->dev->descriptor.idVendor); - idp = le16_to_cpu(port->serial->dev->descriptor.idProduct); - + unsigned int status_idx = UART_STATE_INDEX; + u8 status; + u8 delta; - if (idv == SIEMENS_VENDOR_ID) { - if (idp == SIEMENS_PRODUCT_ID_X65 || - idp == SIEMENS_PRODUCT_ID_SX1 || - idp == SIEMENS_PRODUCT_ID_X75) { + if (spriv->quirks & PL2303_QUIRK_UART_STATE_IDX0) + status_idx = 0; - length = 1; - status_idx = 0; - } - } - - if (actual_length < length) + if (actual_length < status_idx + 1) return; + status = data[status_idx]; + /* Save off the uart status for others to look at */ spin_lock_irqsave(&priv->lock, flags); - prev_line_status = priv->line_status; - priv->line_status = data[status_idx]; + delta = priv->line_status ^ status; + priv->line_status = status; spin_unlock_irqrestore(&priv->lock, flags); - if (priv->line_status & UART_BREAK_ERROR) + + if (status & UART_BREAK_ERROR) usb_serial_handle_break(port); - wake_up_interruptible(&port->port.delta_msr_wait); - tty = tty_port_tty_get(&port->port); - if (!tty) - return; - if ((priv->line_status ^ prev_line_status) & UART_DCD) - usb_serial_handle_dcd_change(port, tty, - priv->line_status & UART_DCD); - tty_kref_put(tty); + if (delta & UART_STATE_MSR_MASK) { + if (delta & UART_CTS) + port->icount.cts++; + if (delta & UART_DSR) + port->icount.dsr++; + if (delta & UART_RING) + port->icount.rng++; + if (delta & UART_DCD) { + port->icount.dcd++; + tty = tty_port_tty_get(&port->port); + if (tty) { + usb_serial_handle_dcd_change(port, tty, + status & UART_DCD); + tty_kref_put(tty); + } + } + + wake_up_interruptible(&port->port.delta_msr_wait); + } } static void pl2303_read_int_callback(struct urb *urb) @@ -754,10 +841,11 @@ static void pl2303_read_int_callback(struct urb *urb) exit: retval = usb_submit_urb(urb, GFP_ATOMIC); - if (retval) + if (retval) { dev_err(&port->dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval); + } } static void pl2303_process_read_urb(struct urb *urb) @@ -775,13 +863,14 @@ static void pl2303_process_read_urb(struct urb *urb) line_status = priv->line_status; priv->line_status &= ~UART_STATE_TRANSIENT_MASK; spin_unlock_irqrestore(&priv->lock, flags); - wake_up_interruptible(&port->port.delta_msr_wait); if (!urb->actual_length) return; - /* break takes precedence over parity, */ - /* which takes precedence over framing errors */ + /* + * Break takes precedence over parity, which takes precedence over + * framing errors. + */ if (line_status & UART_BREAK_ERROR) tty_flag = TTY_BREAK; else if (line_status & UART_PARITY_ERROR) @@ -809,7 +898,6 @@ static void pl2303_process_read_urb(struct urb *urb) tty_flip_buffer_push(&port->port); } -/* All of the device info needed for the PL2303 SIO serial converter */ static struct usb_serial_driver pl2303_device = { .driver = { .owner = THIS_MODULE, @@ -821,16 +909,17 @@ static struct usb_serial_driver pl2303_device = { .bulk_out_size = 256, .open = pl2303_open, .close = pl2303_close, - .dtr_rts = pl2303_dtr_rts, + .dtr_rts = pl2303_dtr_rts, .carrier_raised = pl2303_carrier_raised, .ioctl = pl2303_ioctl, .break_ctl = pl2303_break_ctl, .set_termios = pl2303_set_termios, .tiocmget = pl2303_tiocmget, .tiocmset = pl2303_tiocmset, - .tiocmiwait = pl2303_tiocmiwait, + .tiocmiwait = usb_serial_generic_tiocmiwait, .process_read_urb = pl2303_process_read_urb, .read_int_callback = pl2303_read_int_callback, + .probe = pl2303_probe, .attach = pl2303_startup, .release = pl2303_release, .port_probe = pl2303_port_probe, @@ -843,5 +932,5 @@ static struct usb_serial_driver * const serial_drivers[] = { module_usb_serial_driver(serial_drivers, id_table); -MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_DESCRIPTION("Prolific PL2303 USB to serial adaptor driver"); MODULE_LICENSE("GPL"); diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c index 31f81c3c15eb..6e9f8af96959 100644 --- a/drivers/usb/serial/qcaux.c +++ b/drivers/usb/serial/qcaux.c @@ -16,7 +16,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> @@ -54,7 +53,7 @@ #define SAMSUNG_VENDOR_ID 0x04e8 #define SAMSUNG_PRODUCT_U520 0x6640 /* SCH-U520 */ -static struct usb_device_id id_table[] = { +static const struct usb_device_id id_table[] = { { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5740, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_PC5750, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, UTSTARCOM_PRODUCT_UM150, 0xff, 0x00, 0x00) }, diff --git a/drivers/usb/serial/quatech2.c b/drivers/usb/serial/quatech2.c index a24d59ae4032..7725ed261ed6 100644 --- a/drivers/usb/serial/quatech2.c +++ b/drivers/usb/serial/quatech2.c @@ -15,7 +15,6 @@ #include <asm/unaligned.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -676,10 +675,8 @@ static int qt2_setup_urbs(struct usb_serial *serial) serial_priv = usb_get_serial_data(serial); serial_priv->read_urb = usb_alloc_urb(0, GFP_KERNEL); - if (!serial_priv->read_urb) { - dev_err(&serial->dev->dev, "No free urbs available\n"); + if (!serial_priv->read_urb) return -ENOMEM; - } usb_fill_bulk_urb(serial_priv->read_urb, serial->dev, usb_rcvbulkpipe(serial->dev, @@ -715,10 +712,8 @@ static int qt2_attach(struct usb_serial *serial) } serial_priv = kzalloc(sizeof(*serial_priv), GFP_KERNEL); - if (!serial_priv) { - dev_err(&serial->dev->dev, "%s - Out of memory\n", __func__); + if (!serial_priv) return -ENOMEM; - } serial_priv->read_buffer = kmalloc(QT2_READ_BUFFER_SIZE, GFP_KERNEL); if (!serial_priv->read_buffer) { diff --git a/drivers/usb/serial/safe_serial.c b/drivers/usb/serial/safe_serial.c index ba895989d8c4..b2dff0f14743 100644 --- a/drivers/usb/serial/safe_serial.c +++ b/drivers/usb/serial/safe_serial.c @@ -67,7 +67,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/gfp.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/tty_driver.h> #include <linux/tty_flip.h> @@ -125,7 +124,7 @@ MODULE_PARM_DESC(padded, "Pad to full wMaxPacketSize On/Off"); .bInterfaceClass = (ic), \ .bInterfaceSubClass = (isc), -static struct usb_device_id id_table[] = { +static const struct usb_device_id id_table[] = { {MY_USB_DEVICE(0x49f, 0xffff, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Itsy */ {MY_USB_DEVICE(0x3f0, 0x2101, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Calypso */ {MY_USB_DEVICE(0x4dd, 0x8001, CDC_DEVICE_CLASS, LINEO_INTERFACE_CLASS, LINEO_INTERFACE_SUBCLASS_SAFESERIAL)}, /* Iris */ diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index de958c5b52e3..a9eb6221a815 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c @@ -497,14 +497,12 @@ static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port, buffer = kmalloc(writesize, GFP_ATOMIC); if (!buffer) { - dev_err(&port->dev, "out of memory\n"); retval = -ENOMEM; goto error_no_buffer; } urb = usb_alloc_urb(0, GFP_ATOMIC); if (!urb) { - dev_err(&port->dev, "no more free urbs\n"); retval = -ENOMEM; goto error_no_urb; } @@ -736,11 +734,8 @@ static struct urb *sierra_setup_urb(struct usb_serial *serial, int endpoint, return NULL; urb = usb_alloc_urb(0, mem_flags); - if (urb == NULL) { - dev_dbg(&serial->dev->dev, "%s: alloc for endpoint %d failed\n", - __func__, endpoint); + if (!urb) return NULL; - } buf = kmalloc(len, mem_flags); if (buf) { @@ -752,9 +747,6 @@ static struct urb *sierra_setup_urb(struct usb_serial *serial, int endpoint, dev_dbg(&serial->dev->dev, "%s %c u : %p d:%p\n", __func__, dir == USB_DIR_IN ? 'i' : 'o', urb, buf); } else { - dev_dbg(&serial->dev->dev, "%s %c u:%p d:%p\n", __func__, - dir == USB_DIR_IN ? 'i' : 'o', urb, buf); - sierra_release_urb(urb); urb = NULL; } diff --git a/drivers/usb/serial/spcp8x5.c b/drivers/usb/serial/spcp8x5.c index 5b793c352267..4ec04f73c800 100644 --- a/drivers/usb/serial/spcp8x5.c +++ b/drivers/usb/serial/spcp8x5.c @@ -16,7 +16,6 @@ */ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/ssu100.c b/drivers/usb/serial/ssu100.c index e5750be49054..a7fe664b6b7d 100644 --- a/drivers/usb/serial/ssu100.c +++ b/drivers/usb/serial/ssu100.c @@ -6,7 +6,6 @@ */ #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -342,8 +341,6 @@ static int ssu100_ioctl(struct tty_struct *tty, { struct usb_serial_port *port = tty->driver_data; - dev_dbg(&port->dev, "%s cmd 0x%04x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: return get_serial_info(port, @@ -352,8 +349,6 @@ static int ssu100_ioctl(struct tty_struct *tty, break; } - dev_dbg(&port->dev, "%s arg not supported\n", __func__); - return -ENOIOCTLCMD; } diff --git a/drivers/usb/serial/symbolserial.c b/drivers/usb/serial/symbolserial.c index 9b1648945e7a..9fa7dd413e83 100644 --- a/drivers/usb/serial/symbolserial.c +++ b/drivers/usb/serial/symbolserial.c @@ -11,7 +11,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/slab.h> #include <linux/tty_driver.h> diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index c9a35697ebe9..ec7cea585663 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c @@ -21,7 +21,6 @@ #include <linux/kernel.h> #include <linux/errno.h> #include <linux/firmware.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -143,7 +142,7 @@ static int ti_download_firmware(struct ti_device *tdev); static int closing_wait = TI_DEFAULT_CLOSING_WAIT; /* supported devices */ -static struct usb_device_id ti_id_table_3410[] = { +static const struct usb_device_id ti_id_table_3410[] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, @@ -163,7 +162,7 @@ static struct usb_device_id ti_id_table_3410[] = { { } /* terminator */ }; -static struct usb_device_id ti_id_table_5052[] = { +static const struct usb_device_id ti_id_table_5052[] = { { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, @@ -171,7 +170,7 @@ static struct usb_device_id ti_id_table_5052[] = { { } /* terminator */ }; -static struct usb_device_id ti_id_table_combined[] = { +static const struct usb_device_id ti_id_table_combined[] = { { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, { USB_DEVICE(MTS_VENDOR_ID, MTS_GSM_NO_FW_PRODUCT_ID) }, @@ -301,10 +300,9 @@ static int ti_startup(struct usb_serial *serial) /* create device structure */ tdev = kzalloc(sizeof(struct ti_device), GFP_KERNEL); - if (tdev == NULL) { - dev_err(&dev->dev, "%s - out of memory\n", __func__); + if (!tdev) return -ENOMEM; - } + mutex_init(&tdev->td_open_close_lock); tdev->td_serial = serial; usb_set_serial_data(serial, tdev); @@ -683,8 +681,6 @@ static int ti_ioctl(struct tty_struct *tty, struct usb_serial_port *port = tty->driver_data; struct ti_port *tport = usb_get_serial_port_data(port); - dev_dbg(&port->dev, "%s - cmd = 0x%04X\n", __func__, cmd); - if (tport == NULL) return -ENODEV; @@ -724,10 +720,8 @@ static void ti_set_termios(struct tty_struct *tty, return; config = kmalloc(sizeof(*config), GFP_KERNEL); - if (!config) { - dev_err(&port->dev, "%s - out of memory\n", __func__); + if (!config) return; - } config->wFlags = 0; @@ -1196,10 +1190,8 @@ static int ti_get_lsr(struct ti_port *tport, u8 *lsr) size = sizeof(struct ti_port_status); data = kmalloc(size, GFP_KERNEL); - if (!data) { - dev_err(&port->dev, "%s - out of memory\n", __func__); + if (!data) return -ENOMEM; - } status = ti_command_in_sync(tdev, TI_GET_PORT_STATUS, (__u8)(TI_UART1_PORT+port_number), 0, (__u8 *)data, size); @@ -1399,10 +1391,8 @@ static int ti_write_byte(struct usb_serial_port *port, size = sizeof(struct ti_write_data_bytes) + 2; data = kmalloc(size, GFP_KERNEL); - if (!data) { - dev_err(&port->dev, "%s - out of memory\n", __func__); + if (!data) return -ENOMEM; - } data->bAddrType = TI_RW_DATA_ADDR_XDATA; data->bDataType = TI_RW_DATA_BYTE; @@ -1518,7 +1508,6 @@ static int ti_download_firmware(struct ti_device *tdev) status = ti_do_download(dev, pipe, buffer, fw_p->size); kfree(buffer); } else { - dev_dbg(&dev->dev, "%s ENOMEM\n", __func__); status = -ENOMEM; } release_firmware(fw_p); diff --git a/drivers/usb/serial/usb-serial-simple.c b/drivers/usb/serial/usb-serial-simple.c index 52eb91f2eb2a..f112b079ddfc 100644 --- a/drivers/usb/serial/usb-serial-simple.c +++ b/drivers/usb/serial/usb-serial-simple.c @@ -15,7 +15,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 6091bd5a1f4f..7c9dc28640bb 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c @@ -405,7 +405,7 @@ static int serial_ioctl(struct tty_struct *tty, struct usb_serial_port *port = tty->driver_data; int retval = -ENOIOCTLCMD; - dev_dbg(tty->dev, "%s - cmd 0x%.4x\n", __func__, cmd); + dev_dbg(tty->dev, "%s - cmd 0x%04x\n", __func__, cmd); switch (cmd) { case TIOCMIWAIT: diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c index 5760f97ee508..ca2fa5bbe17e 100644 --- a/drivers/usb/serial/usb_debug.c +++ b/drivers/usb/serial/usb_debug.c @@ -10,7 +10,6 @@ #include <linux/gfp.h> #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/serial/usb_wwan.c b/drivers/usb/serial/usb_wwan.c index 85365784040b..640fe0173236 100644 --- a/drivers/usb/serial/usb_wwan.c +++ b/drivers/usb/serial/usb_wwan.c @@ -447,12 +447,8 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, struct urb *urb; urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ - if (urb == NULL) { - dev_dbg(&serial->interface->dev, - "%s: alloc for endpoint %d failed.\n", __func__, - endpoint); + if (!urb) return NULL; - } /* Fill URB using supplied data. */ usb_fill_bulk_urb(urb, serial->dev, diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index 9910aa2edf4b..bf2bd40e5f2a 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c @@ -16,7 +16,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -51,7 +50,7 @@ static int palm_os_3_probe(struct usb_serial *serial, static int palm_os_4_probe(struct usb_serial *serial, const struct usb_device_id *id); -static struct usb_device_id id_table [] = { +static const struct usb_device_id id_table[] = { { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID), .driver_info = (kernel_ulong_t)&palm_os_3_probe }, { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID), @@ -113,18 +112,18 @@ static struct usb_device_id id_table [] = { { } /* Terminating entry */ }; -static struct usb_device_id clie_id_5_table [] = { +static const struct usb_device_id clie_id_5_table[] = { { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_UX50_ID), .driver_info = (kernel_ulong_t)&palm_os_4_probe }, { } /* Terminating entry */ }; -static struct usb_device_id clie_id_3_5_table [] = { +static const struct usb_device_id clie_id_3_5_table[] = { { USB_DEVICE(SONY_VENDOR_ID, SONY_CLIE_3_5_ID) }, { } /* Terminating entry */ }; -static struct usb_device_id id_table_combined [] = { +static const struct usb_device_id id_table_combined[] = { { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_VISOR_ID) }, { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO_ID) }, { USB_DEVICE(HANDSPRING_VENDOR_ID, HANDSPRING_TREO600_ID) }, @@ -324,11 +323,8 @@ static int palm_os_3_probe(struct usb_serial *serial, int num_ports = 0; transfer_buffer = kmalloc(sizeof(*connection_info), GFP_KERNEL); - if (!transfer_buffer) { - dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__, - sizeof(*connection_info)); + if (!transfer_buffer) return -ENOMEM; - } /* send a get connection info request */ retval = usb_control_msg(serial->dev, @@ -419,11 +415,8 @@ static int palm_os_4_probe(struct usb_serial *serial, int retval; transfer_buffer = kmalloc(sizeof(*connection_info), GFP_KERNEL); - if (!transfer_buffer) { - dev_err(dev, "%s - kmalloc(%Zd) failed.\n", __func__, - sizeof(*connection_info)); + if (!transfer_buffer) return -ENOMEM; - } retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), diff --git a/drivers/usb/serial/visor.h b/drivers/usb/serial/visor.h index 88db4d06aefb..4c456dd69ce5 100644 --- a/drivers/usb/serial/visor.h +++ b/drivers/usb/serial/visor.h @@ -136,7 +136,7 @@ struct visor_connection_info { * connections.end_point_info is non-zero. If value is 0, then * connections.port contains the endpoint number, which is the same for in * and out. - * @port_function_id: contains the creator id of the applicaton that opened + * @port_function_id: contains the creator id of the application that opened * this connection. * @port: contains the in/out endpoint number. Is 0 if in and out endpoint * numbers are different. diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c index 36a7740e827c..e62f2dff8b7d 100644 --- a/drivers/usb/serial/whiteheat.c +++ b/drivers/usb/serial/whiteheat.c @@ -18,7 +18,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/tty.h> #include <linux/tty_driver.h> @@ -288,12 +287,8 @@ static int whiteheat_attach(struct usb_serial *serial) command_info = kmalloc(sizeof(struct whiteheat_command_private), GFP_KERNEL); - if (command_info == NULL) { - dev_err(&serial->dev->dev, - "%s: Out of memory for port structures\n", - serial->type->description); + if (!command_info) goto no_command_private; - } mutex_init(&command_info->mutex); command_info->port_running = 0; @@ -455,8 +450,6 @@ static int whiteheat_ioctl(struct tty_struct *tty, struct serial_struct serstruct; void __user *user_arg = (void __user *)arg; - dev_dbg(&port->dev, "%s - cmd 0x%.4x\n", __func__, cmd); - switch (cmd) { case TIOCGSERIAL: memset(&serstruct, 0, sizeof(serstruct)); diff --git a/drivers/usb/serial/wishbone-serial.c b/drivers/usb/serial/wishbone-serial.c index 100573c6f19e..4fed4a0bd702 100644 --- a/drivers/usb/serial/wishbone-serial.c +++ b/drivers/usb/serial/wishbone-serial.c @@ -11,7 +11,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/serial/xsens_mt.c b/drivers/usb/serial/xsens_mt.c index 1d5798d891bc..4841fb57400c 100644 --- a/drivers/usb/serial/xsens_mt.c +++ b/drivers/usb/serial/xsens_mt.c @@ -9,7 +9,6 @@ */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/module.h> #include <linux/usb.h> diff --git a/drivers/usb/serial/zte_ev.c b/drivers/usb/serial/zte_ev.c index eae2c873b39f..e40ab739c4a6 100644 --- a/drivers/usb/serial/zte_ev.c +++ b/drivers/usb/serial/zte_ev.c @@ -13,7 +13,6 @@ * show the commands used to talk to the device, but I am not sure. */ #include <linux/kernel.h> -#include <linux/init.h> #include <linux/tty.h> #include <linux/slab.h> #include <linux/module.h> @@ -53,7 +52,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, USB_CTRL_GET_TIMEOUT); dev_dbg(dev, "result = %d\n", result); - /* send 2st cmd and recieve data */ + /* send 2st cmd and receive data */ /* * 16.0 CTL a1 21 00 00 00 00 07 00 CLASS 25.1.0(5) * 16.0 DI 00 96 00 00 00 00 08 @@ -65,7 +64,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 3 cmd */ + /* send 3rd cmd */ /* * 16.0 CTL 21 20 00 00 00 00 07 00 CLASS 30.1.0 * 16.0 DO 80 25 00 00 00 00 08 .%..... 30.2.0 @@ -84,7 +83,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 4 cmd */ + /* send 4th cmd */ /* * 16.0 CTL 21 22 03 00 00 00 00 00 */ @@ -95,7 +94,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, USB_CTRL_GET_TIMEOUT); dev_dbg(dev, "result = %d\n", result); - /* send 5 cmd */ + /* send 5th cmd */ /* * 16.0 CTL a1 21 00 00 00 00 07 00 CLASS 33.1.0 * 16.0 DI 80 25 00 00 00 00 08 @@ -107,7 +106,7 @@ static int zte_ev_usb_serial_open(struct tty_struct *tty, USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 6 cmd */ + /* send 6th cmd */ /* * 16.0 CTL 21 20 00 00 00 00 07 00 CLASS 34.1.0 * 16.0 DO 80 25 00 00 00 00 08 @@ -195,7 +194,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 4 cmd */ + /* send 4th cmd */ /* * 16.0 CTL 21 20 00 00 00 00 07 00 CLASS 30.1.0 * 16.0 DO 00 c2 01 00 00 00 08 .%..... 30.2.0 @@ -214,7 +213,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 5 cmd */ + /* send 5th cmd */ /* * 16.0 CTL 21 22 03 00 00 00 00 00 */ @@ -225,7 +224,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) USB_CTRL_GET_TIMEOUT); dev_dbg(dev, "result = %d\n", result); - /* send 6 cmd */ + /* send 6th cmd */ /* * 16.0 CTL a1 21 00 00 00 00 07 00 CLASS 33.1.0 * 16.0 DI 00 c2 01 00 00 00 08 @@ -237,7 +236,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 7 cmd */ + /* send 7th cmd */ /* * 16.0 CTL 21 20 00 00 00 00 07 00 CLASS 354.1.0 * 16.0 DO 00 c2 01 00 00 00 08 ....... 354.2.0 @@ -256,7 +255,7 @@ static void zte_ev_usb_serial_close(struct usb_serial_port *port) USB_CTRL_GET_TIMEOUT); debug_data(dev, __func__, len, buf, result); - /* send 8 cmd */ + /* send 8th cmd */ /* * 16.0 CTL 21 22 03 00 00 00 00 00 */ diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 26964895c88b..74e2aa23b045 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c @@ -30,7 +30,6 @@ #include <linux/kernel.h> #include <linux/input.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/usb/input.h> diff --git a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c index 5dfb4c36a1b0..12e3c2fac642 100644 --- a/drivers/usb/storage/protocol.c +++ b/drivers/usb/storage/protocol.c @@ -135,69 +135,42 @@ unsigned int usb_stor_access_xfer_buf(unsigned char *buffer, unsigned int buflen, struct scsi_cmnd *srb, struct scatterlist **sgptr, unsigned int *offset, enum xfer_buf_dir dir) { - unsigned int cnt; + unsigned int cnt = 0; struct scatterlist *sg = *sgptr; + struct sg_mapping_iter miter; + unsigned int nents = scsi_sg_count(srb); - /* We have to go through the list one entry - * at a time. Each s-g entry contains some number of pages, and - * each page has to be kmap()'ed separately. If the page is already - * in kernel-addressable memory then kmap() will return its address. - * If the page is not directly accessible -- such as a user buffer - * located in high memory -- then kmap() will map it to a temporary - * position in the kernel's virtual address space. - */ - - if (!sg) + if (sg) + nents = sg_nents(sg); + else sg = scsi_sglist(srb); - /* This loop handles a single s-g list entry, which may - * include multiple pages. Find the initial page structure - * and the starting offset within the page, and update - * the *offset and **sgptr values for the next loop. - */ - cnt = 0; - while (cnt < buflen && sg) { - struct page *page = sg_page(sg) + - ((sg->offset + *offset) >> PAGE_SHIFT); - unsigned int poff = (sg->offset + *offset) & (PAGE_SIZE-1); - unsigned int sglen = sg->length - *offset; - - if (sglen > buflen - cnt) { - - /* Transfer ends within this s-g entry */ - sglen = buflen - cnt; - *offset += sglen; - } else { + sg_miter_start(&miter, sg, nents, dir == FROM_XFER_BUF ? + SG_MITER_FROM_SG: SG_MITER_TO_SG); - /* Transfer continues to next s-g entry */ - *offset = 0; - sg = sg_next(sg); - } + if (!sg_miter_skip(&miter, *offset)) + return cnt; + + while (sg_miter_next(&miter) && cnt < buflen) { + unsigned int len = min_t(unsigned int, miter.length, + buflen - cnt); + + if (dir == FROM_XFER_BUF) + memcpy(buffer + cnt, miter.addr, len); + else + memcpy(miter.addr, buffer + cnt, len); - /* Transfer the data for all the pages in this - * s-g entry. For each page: call kmap(), do the - * transfer, and call kunmap() immediately after. */ - while (sglen > 0) { - unsigned int plen = min(sglen, (unsigned int) - PAGE_SIZE - poff); - unsigned char *ptr = kmap(page); - - if (dir == TO_XFER_BUF) - memcpy(ptr + poff, buffer + cnt, plen); - else - memcpy(buffer + cnt, ptr + poff, plen); - kunmap(page); - - /* Start at the beginning of the next page */ - poff = 0; - ++page; - cnt += plen; - sglen -= plen; + if (*offset + len < miter.piter.sg->length) { + *offset += len; + *sgptr = miter.piter.sg; + } else { + *offset = 0; + *sgptr = sg_next(miter.piter.sg); } + cnt += len; } - *sgptr = sg; + sg_miter_stop(&miter); - /* Return the amount actually transferred */ return cnt; } EXPORT_SYMBOL_GPL(usb_stor_access_xfer_buf); diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index de32cfa5bfa6..ad06255c2ade 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h @@ -234,6 +234,13 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_MAX_SECTORS_64 ), +/* Patch submitted by Mikhail Zolotaryov <lebon@lebon.org.ua> */ +UNUSUAL_DEV( 0x0421, 0x06aa, 0x1110, 0x1110, + "Nokia", + "502", + USB_SC_DEVICE, USB_PR_DEVICE, NULL, + US_FL_MAX_SECTORS_64 ), + #ifdef NO_SDDR09 UNUSUAL_DEV( 0x0436, 0x0005, 0x0100, 0x0100, "Microtech", diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 5c4fe0749af1..1c0b89f2a138 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -53,7 +53,6 @@ #include <linux/errno.h> #include <linux/freezer.h> #include <linux/module.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/kthread.h> #include <linux/mutex.h> diff --git a/drivers/usb/usb-skeleton.c b/drivers/usb/usb-skeleton.c index ff97652343a3..545d09b8081d 100644 --- a/drivers/usb/usb-skeleton.c +++ b/drivers/usb/usb-skeleton.c @@ -14,7 +14,6 @@ #include <linux/kernel.h> #include <linux/errno.h> -#include <linux/init.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/kref.h> diff --git a/drivers/usb/wusbcore/cbaf.c b/drivers/usb/wusbcore/cbaf.c index f06ed82e63d1..da1b872918b5 100644 --- a/drivers/usb/wusbcore/cbaf.c +++ b/drivers/usb/wusbcore/cbaf.c @@ -144,7 +144,7 @@ static int cbaf_check(struct cbaf *cbaf) CBAF_REQ_GET_ASSOCIATION_INFORMATION, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber, - cbaf->buffer, cbaf->buffer_size, 1000 /* FIXME: arbitrary */); + cbaf->buffer, cbaf->buffer_size, USB_CTRL_GET_TIMEOUT); if (result < 0) { dev_err(dev, "Cannot get available association types: %d\n", result); @@ -184,7 +184,7 @@ static int cbaf_check(struct cbaf *cbaf) assoc_request = itr; if (top - itr < sizeof(*assoc_request)) { - dev_err(dev, "Not enough data to decode associaton " + dev_err(dev, "Not enough data to decode association " "request (%zu vs %zu bytes needed)\n", top - itr, sizeof(*assoc_request)); break; @@ -235,7 +235,7 @@ static int cbaf_check(struct cbaf *cbaf) static const struct wusb_cbaf_host_info cbaf_host_info_defaults = { .AssociationTypeId_hdr = WUSB_AR_AssociationTypeId, - .AssociationTypeId = cpu_to_le16(AR_TYPE_WUSB), + .AssociationTypeId = cpu_to_le16(AR_TYPE_WUSB), .AssociationSubTypeId_hdr = WUSB_AR_AssociationSubTypeId, .AssociationSubTypeId = cpu_to_le16(AR_TYPE_WUSB_RETRIEVE_HOST_INFO), .CHID_hdr = WUSB_AR_CHID, @@ -260,12 +260,13 @@ static int cbaf_send_host_info(struct cbaf *cbaf) hi->HostFriendlyName_hdr.len = cpu_to_le16(name_len); hi_size = sizeof(*hi) + name_len; - return usb_control_msg(cbaf->usb_dev, usb_sndctrlpipe(cbaf->usb_dev, 0), + return usb_control_msg(cbaf->usb_dev, + usb_sndctrlpipe(cbaf->usb_dev, 0), CBAF_REQ_SET_ASSOCIATION_RESPONSE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x0101, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber, - hi, hi_size, 1000 /* FIXME: arbitrary */); + hi, hi_size, USB_CTRL_SET_TIMEOUT); } /* @@ -288,9 +289,10 @@ static int cbaf_cdid_get(struct cbaf *cbaf) CBAF_REQ_GET_ASSOCIATION_REQUEST, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x0200, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber, - di, cbaf->buffer_size, 1000 /* FIXME: arbitrary */); + di, cbaf->buffer_size, USB_CTRL_GET_TIMEOUT); if (result < 0) { - dev_err(dev, "Cannot request device information: %d\n", result); + dev_err(dev, "Cannot request device information: %d\n", + result); return result; } @@ -491,11 +493,11 @@ static DEVICE_ATTR(wusb_device_name, 0600, cbaf_wusb_device_name_show, NULL); static const struct wusb_cbaf_cc_data cbaf_cc_data_defaults = { .AssociationTypeId_hdr = WUSB_AR_AssociationTypeId, - .AssociationTypeId = cpu_to_le16(AR_TYPE_WUSB), + .AssociationTypeId = cpu_to_le16(AR_TYPE_WUSB), .AssociationSubTypeId_hdr = WUSB_AR_AssociationSubTypeId, .AssociationSubTypeId = cpu_to_le16(AR_TYPE_WUSB_ASSOCIATE), .Length_hdr = WUSB_AR_Length, - .Length = cpu_to_le32(sizeof(struct wusb_cbaf_cc_data)), + .Length = cpu_to_le32(sizeof(struct wusb_cbaf_cc_data)), .ConnectionContext_hdr = WUSB_AR_ConnectionContext, .BandGroups_hdr = WUSB_AR_BandGroups, }; @@ -536,7 +538,7 @@ static int cbaf_cc_upload(struct cbaf *cbaf) CBAF_REQ_SET_ASSOCIATION_RESPONSE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0x0201, cbaf->usb_iface->cur_altsetting->desc.bInterfaceNumber, - ccd, sizeof(*ccd), 1000 /* FIXME: arbitrary */); + ccd, sizeof(*ccd), USB_CTRL_SET_TIMEOUT); return result; } diff --git a/drivers/usb/wusbcore/crypto.c b/drivers/usb/wusbcore/crypto.c index 7e4bf95f8f7b..9a95b2dc6d1b 100644 --- a/drivers/usb/wusbcore/crypto.c +++ b/drivers/usb/wusbcore/crypto.c @@ -87,7 +87,7 @@ struct aes_ccm_block { * B1 contains l(a), the MAC header, the encryption offset and padding. * * If EO is nonzero, additional blocks are built from payload bytes - * until EO is exahusted (FIXME: padding to 16 bytes, I guess). The + * until EO is exhausted (FIXME: padding to 16 bytes, I guess). The * padding is not xmitted. */ diff --git a/drivers/usb/wusbcore/devconnect.c b/drivers/usb/wusbcore/devconnect.c index f14e7929ba22..3b959e83b28e 100644 --- a/drivers/usb/wusbcore/devconnect.c +++ b/drivers/usb/wusbcore/devconnect.c @@ -265,9 +265,9 @@ static void wusbhc_devconnect_acked_work(struct work_struct *work) * Addresses: because WUSB hosts have no downstream hubs, we can do a * 1:1 mapping between 'port number' and device * address. This simplifies many things, as during this - * initial connect phase the USB stack has no knoledge of + * initial connect phase the USB stack has no knowledge of * the device and hasn't assigned an address yet--we know - * USB's choose_address() will use the same euristics we + * USB's choose_address() will use the same heuristics we * use here, so we can assume which address will be assigned. * * USB stack always assigns address 1 to the root hub, so diff --git a/drivers/usb/wusbcore/mmc.c b/drivers/usb/wusbcore/mmc.c index b71760c8d3ad..44741267c917 100644 --- a/drivers/usb/wusbcore/mmc.c +++ b/drivers/usb/wusbcore/mmc.c @@ -206,13 +206,15 @@ int wusbhc_start(struct wusbhc *wusbhc) result = wusbhc_devconnect_start(wusbhc); if (result < 0) { - dev_err(dev, "error enabling device connections: %d\n", result); + dev_err(dev, "error enabling device connections: %d\n", + result); goto error_devconnect_start; } result = wusbhc_sec_start(wusbhc); if (result < 0) { - dev_err(dev, "error starting security in the HC: %d\n", result); + dev_err(dev, "error starting security in the HC: %d\n", + result); goto error_sec_start; } @@ -284,7 +286,8 @@ int wusbhc_chid_set(struct wusbhc *wusbhc, const struct wusb_ckhdid *chid) wusbhc->uwb_rc = uwb_rc_get_by_grandpa(wusbhc->dev->parent); if (wusbhc->uwb_rc == NULL) { result = -ENODEV; - dev_err(wusbhc->dev, "Cannot get associated UWB Host Controller\n"); + dev_err(wusbhc->dev, + "Cannot get associated UWB Host Controller\n"); goto error_rc_get; } diff --git a/drivers/usb/wusbcore/pal.c b/drivers/usb/wusbcore/pal.c index 59e100c2eb50..090f27371a8f 100644 --- a/drivers/usb/wusbcore/pal.c +++ b/drivers/usb/wusbcore/pal.c @@ -22,6 +22,7 @@ static void wusbhc_channel_changed(struct uwb_pal *pal, int channel) { struct wusbhc *wusbhc = container_of(pal, struct wusbhc, pal); + dev_dbg(wusbhc->dev, "%s: channel = %d\n", __func__, channel); if (channel < 0) wusbhc_stop(wusbhc); else diff --git a/drivers/usb/wusbcore/reservation.c b/drivers/usb/wusbcore/reservation.c index ead79f793927..d5efd0f07d2b 100644 --- a/drivers/usb/wusbcore/reservation.c +++ b/drivers/usb/wusbcore/reservation.c @@ -51,6 +51,7 @@ static void wusbhc_rsv_complete_cb(struct uwb_rsv *rsv) struct uwb_mas_bm mas; char buf[72]; + dev_dbg(dev, "%s: state = %d\n", __func__, rsv->state); switch (rsv->state) { case UWB_RSV_STATE_O_ESTABLISHED: uwb_rsv_get_usable_mas(rsv, &mas); diff --git a/drivers/usb/wusbcore/security.c b/drivers/usb/wusbcore/security.c index 4c40d0dbf53d..95be9953cd47 100644 --- a/drivers/usb/wusbcore/security.c +++ b/drivers/usb/wusbcore/security.c @@ -33,7 +33,8 @@ static void wusbhc_gtk_rekey_work(struct work_struct *work); int wusbhc_sec_create(struct wusbhc *wusbhc) { - wusbhc->gtk.descr.bLength = sizeof(wusbhc->gtk.descr) + sizeof(wusbhc->gtk.data); + wusbhc->gtk.descr.bLength = sizeof(wusbhc->gtk.descr) + + sizeof(wusbhc->gtk.data); wusbhc->gtk.descr.bDescriptorType = USB_DT_KEY; wusbhc->gtk.descr.bReserved = 0; wusbhc->gtk_index = 0; @@ -56,7 +57,7 @@ void wusbhc_sec_destroy(struct wusbhc *wusbhc) * @wusb_dev: the device whose PTK the TKID is for * (or NULL for a TKID for a GTK) * - * The generated TKID consist of two parts: the device's authenicated + * The generated TKID consists of two parts: the device's authenticated * address (or 0 or a GTK); and an incrementing number. This ensures * that TKIDs cannot be shared between devices and by the time the * incrementing number wraps around the older TKIDs will no longer be @@ -138,7 +139,7 @@ const char *wusb_et_name(u8 x) case USB_ENC_TYPE_WIRED: return "wired"; case USB_ENC_TYPE_CCM_1: return "CCM-1"; case USB_ENC_TYPE_RSA_1: return "RSA-1"; - default: return "unknown"; + default: return "unknown"; } } EXPORT_SYMBOL_GPL(wusb_et_name); @@ -165,7 +166,7 @@ static int wusb_dev_set_encryption(struct usb_device *usb_dev, int value) result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), USB_REQ_SET_ENCRYPTION, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, - value, 0, NULL, 0, 1000 /* FIXME: arbitrary */); + value, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) dev_err(dev, "Can't set device's WUSB encryption to " "%s (value %d): %d\n", @@ -191,7 +192,7 @@ static int wusb_dev_set_gtk(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, USB_DT_KEY << 8 | key_index, 0, &wusbhc->gtk.descr, wusbhc->gtk.descr.bLength, - 1000); + USB_CTRL_SET_TIMEOUT); } @@ -222,7 +223,8 @@ int wusb_dev_sec_add(struct wusbhc *wusbhc, secd_size = le16_to_cpu(secd->wTotalLength); new_secd = krealloc(secd, secd_size, GFP_KERNEL); if (new_secd == NULL) { - dev_err(dev, "Can't allocate space for security descriptors\n"); + dev_err(dev, + "Can't allocate space for security descriptors\n"); goto out; } secd = new_secd; @@ -301,8 +303,9 @@ int wusb_dev_update_address(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) /* Set address 0 */ result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), - USB_REQ_SET_ADDRESS, 0, - 0, 0, NULL, 0, 1000 /* FIXME: arbitrary */); + USB_REQ_SET_ADDRESS, + USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, + 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "auth failed: can't set address 0: %d\n", result); @@ -316,9 +319,10 @@ int wusb_dev_update_address(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev) /* Set new (authenticated) address. */ result = usb_control_msg(usb_dev, usb_sndctrlpipe(usb_dev, 0), - USB_REQ_SET_ADDRESS, 0, - new_address, 0, NULL, 0, - 1000 /* FIXME: arbitrary */); + USB_REQ_SET_ADDRESS, + USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, + new_address, 0, NULL, 0, + USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "auth failed: can't set address %u: %d\n", new_address, result); @@ -375,13 +379,13 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, hs[0].bReserved = 0; memcpy(hs[0].CDID, &wusb_dev->cdid, sizeof(hs[0].CDID)); get_random_bytes(&hs[0].nonce, sizeof(hs[0].nonce)); - memset(hs[0].MIC, 0, sizeof(hs[0].MIC)); /* Per WUSB1.0[T7-22] */ + memset(hs[0].MIC, 0, sizeof(hs[0].MIC)); /* Per WUSB1.0[T7-22] */ result = usb_control_msg( usb_dev, usb_sndctrlpipe(usb_dev, 0), USB_REQ_SET_HANDSHAKE, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, - 1, 0, &hs[0], sizeof(hs[0]), 1000 /* FIXME: arbitrary */); + 1, 0, &hs[0], sizeof(hs[0]), USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "Handshake1: request failed: %d\n", result); goto error_hs1; @@ -392,7 +396,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, usb_dev, usb_rcvctrlpipe(usb_dev, 0), USB_REQ_GET_HANDSHAKE, USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_DEVICE, - 2, 0, &hs[1], sizeof(hs[1]), 1000 /* FIXME: arbitrary */); + 2, 0, &hs[1], sizeof(hs[1]), USB_CTRL_GET_TIMEOUT); if (result < 0) { dev_err(dev, "Handshake2: request failed: %d\n", result); goto error_hs2; @@ -422,7 +426,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, } /* Setup the CCM nonce */ - memset(&ccm_n.sfn, 0, sizeof(ccm_n.sfn)); /* Per WUSB1.0[6.5.2] */ + memset(&ccm_n.sfn, 0, sizeof(ccm_n.sfn)); /* Per WUSB1.0[6.5.2] */ memcpy(ccm_n.tkid, &tkid_le, sizeof(ccm_n.tkid)); ccm_n.src_addr = wusbhc->uwb_rc->uwb_dev.dev_addr; ccm_n.dest_addr.data[0] = wusb_dev->addr; @@ -469,7 +473,7 @@ int wusb_dev_4way_handshake(struct wusbhc *wusbhc, struct wusb_dev *wusb_dev, usb_dev, usb_sndctrlpipe(usb_dev, 0), USB_REQ_SET_HANDSHAKE, USB_DIR_OUT | USB_TYPE_STANDARD | USB_RECIP_DEVICE, - 3, 0, &hs[2], sizeof(hs[2]), 1000 /* FIXME: arbitrary */); + 3, 0, &hs[2], sizeof(hs[2]), USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "Handshake3: request failed: %d\n", result); goto error_hs3; @@ -553,11 +557,13 @@ static void wusbhc_gtk_rekey_work(struct work_struct *work) list_for_each_entry_safe(wusb_dev, wusb_dev_next, &rekey_list, rekey_node) { list_del_init(&wusb_dev->rekey_node); - dev_dbg(&wusb_dev->usb_dev->dev, "%s: rekey device at port %d\n", + dev_dbg(&wusb_dev->usb_dev->dev, + "%s: rekey device at port %d\n", __func__, wusb_dev->port_idx); if (wusb_dev_set_gtk(wusbhc, wusb_dev) < 0) { - dev_err(&wusb_dev->usb_dev->dev, "%s: rekey device at port %d failed\n", + dev_err(&wusb_dev->usb_dev->dev, + "%s: rekey device at port %d failed\n", __func__, wusb_dev->port_idx); } wusb_dev_put(wusb_dev); diff --git a/drivers/usb/wusbcore/wa-hc.h b/drivers/usb/wusbcore/wa-hc.h index e614f02f0cf2..a2ef84b8397e 100644 --- a/drivers/usb/wusbcore/wa-hc.h +++ b/drivers/usb/wusbcore/wa-hc.h @@ -36,7 +36,7 @@ * * hcd glue with the USB API Host Controller Interface API. * - * nep Notification EndPoint managent: collect notifications + * nep Notification EndPoint management: collect notifications * and queue them with the workqueue daemon. * * Handle notifications as coming from the NEP. Sends them @@ -144,7 +144,7 @@ enum wa_quirks { * * @wa_descr Can be accessed without locking because it is in * the same area where the device descriptors were - * read, so it is guaranteed to exist umodified while + * read, so it is guaranteed to exist unmodified while * the device exists. * * Endianess has been converted to CPU's. @@ -167,8 +167,8 @@ enum wa_quirks { * submitted from an atomic context). * * FIXME: this needs to be layered up: a wusbhc layer (for sharing - * comonalities with WHCI), a wa layer (for sharing - * comonalities with DWA-RC). + * commonalities with WHCI), a wa layer (for sharing + * commonalities with DWA-RC). */ struct wahc { struct usb_device *usb_dev; @@ -197,10 +197,10 @@ struct wahc { struct mutex rpipe_mutex; /* assigning resources to endpoints */ /* - * dti_state is used to track the state of the dti_urb. When dti_state + * dti_state is used to track the state of the dti_urb. When dti_state * is WA_DTI_ISOC_PACKET_STATUS_PENDING, dti_isoc_xfer_in_progress and - * dti_isoc_xfer_seg identify which xfer the incoming isoc packet status - * refers to. + * dti_isoc_xfer_seg identify which xfer the incoming isoc packet + * status refers to. */ enum wa_dti_state dti_state; u32 dti_isoc_xfer_in_progress; @@ -211,7 +211,7 @@ struct wahc { void *dti_buf; size_t dti_buf_size; - unsigned long dto_in_use; /* protect dto endoint serialization. */ + unsigned long dto_in_use; /* protect dto endoint serialization */ s32 status; /* For reading status */ @@ -332,7 +332,7 @@ static inline int rpipe_avail_inc(struct wa_rpipe *rpipe) /* Transferring data */ extern int wa_urb_enqueue(struct wahc *, struct usb_host_endpoint *, struct urb *, gfp_t); -extern int wa_urb_dequeue(struct wahc *, struct urb *); +extern int wa_urb_dequeue(struct wahc *, struct urb *, int); extern void wa_handle_notif_xfer(struct wahc *, struct wa_notif_hdr *); @@ -345,7 +345,7 @@ extern void wa_handle_notif_xfer(struct wahc *, struct wa_notif_hdr *); * it...no RC specific function is called...unless I miss * something. * - * FIXME: has to go away in favour of an 'struct' hcd based sollution + * FIXME: has to go away in favour of a 'struct' hcd based solution */ static inline struct wahc *wa_get(struct wahc *wa) { @@ -366,7 +366,7 @@ static inline int __wa_feature(struct wahc *wa, unsigned op, u16 feature) USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, feature, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - NULL, 0, 1000 /* FIXME: arbitrary */); + NULL, 0, USB_CTRL_SET_TIMEOUT); } @@ -400,8 +400,7 @@ s32 __wa_get_status(struct wahc *wa) USB_REQ_GET_STATUS, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, - &wa->status, sizeof(wa->status), - 1000 /* FIXME: arbitrary */); + &wa->status, sizeof(wa->status), USB_CTRL_GET_TIMEOUT); if (result >= 0) result = wa->status; return result; diff --git a/drivers/usb/wusbcore/wa-nep.c b/drivers/usb/wusbcore/wa-nep.c index ada4e0870623..60a10d21947d 100644 --- a/drivers/usb/wusbcore/wa-nep.c +++ b/drivers/usb/wusbcore/wa-nep.c @@ -69,8 +69,8 @@ struct wa_notif_work { * [the wuswad daemon, basically] * * @_nw: Pointer to a descriptor which has the pointer to the - * @wa, the size of the buffer and the work queue - * structure (so we can free all when done). + * @wa, the size of the buffer and the work queue + * structure (so we can free all when done). * @returns 0 if ok, < 0 errno code on error. * * All notifications follow the same format; they need to start with a @@ -93,7 +93,8 @@ static void wa_notif_dispatch(struct work_struct *ws) { void *itr; u8 missing = 0; - struct wa_notif_work *nw = container_of(ws, struct wa_notif_work, work); + struct wa_notif_work *nw = container_of(ws, struct wa_notif_work, + work); struct wahc *wa = nw->wa; struct wa_notif_hdr *notif_hdr; size_t size; @@ -271,7 +272,8 @@ int wa_nep_create(struct wahc *wa, struct usb_interface *iface) wa->nep_buffer_size = 1024; wa->nep_buffer = kmalloc(wa->nep_buffer_size, GFP_KERNEL); if (wa->nep_buffer == NULL) { - dev_err(dev, "Unable to allocate notification's read buffer\n"); + dev_err(dev, + "Unable to allocate notification's read buffer\n"); goto error_nep_buffer; } wa->nep_urb = usb_alloc_urb(0, GFP_KERNEL); diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c index b48e74cc54d7..6ca80a4efc1b 100644 --- a/drivers/usb/wusbcore/wa-rpipe.c +++ b/drivers/usb/wusbcore/wa-rpipe.c @@ -57,7 +57,6 @@ * urb->dev->devnum, to make sure that we always have the right * destination address. */ -#include <linux/init.h> #include <linux/atomic.h> #include <linux/bitmap.h> #include <linux/slab.h> @@ -80,7 +79,7 @@ static int __rpipe_get_descr(struct wahc *wa, USB_REQ_GET_DESCRIPTOR, USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_RPIPE, USB_DT_RPIPE<<8, index, descr, sizeof(*descr), - 1000 /* FIXME: arbitrary */); + USB_CTRL_GET_TIMEOUT); if (result < 0) { dev_err(dev, "rpipe %u: get descriptor failed: %d\n", index, (int)result); @@ -118,7 +117,7 @@ static int __rpipe_set_descr(struct wahc *wa, USB_REQ_SET_DESCRIPTOR, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE, USB_DT_RPIPE<<8, index, descr, sizeof(*descr), - HZ / 10); + USB_CTRL_SET_TIMEOUT); if (result < 0) { dev_err(dev, "rpipe %u: set descriptor failed: %d\n", index, (int)result); @@ -184,7 +183,7 @@ EXPORT_SYMBOL_GPL(rpipe_destroy); /* * Locate an idle rpipe, create an structure for it and return it * - * @wa is referenced and unlocked + * @wa is referenced and unlocked * @crs enum rpipe_attr, required endpoint characteristics * * The rpipe can be used only sequentially (not in parallel). @@ -237,7 +236,7 @@ static int __rpipe_reset(struct wahc *wa, unsigned index) wa->usb_dev, usb_sndctrlpipe(wa->usb_dev, 0), USB_REQ_RPIPE_RESET, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE, - 0, index, NULL, 0, 1000 /* FIXME: arbitrary */); + 0, index, NULL, 0, USB_CTRL_SET_TIMEOUT); if (result < 0) dev_err(dev, "rpipe %u: reset failed: %d\n", index, result); @@ -308,7 +307,7 @@ out: /* * Aim an rpipe to its device & endpoint destination * - * Make sure we change the address to unauthenticathed if the device + * Make sure we change the address to unauthenticated if the device * is WUSB and it is not authenticated. */ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa, @@ -329,7 +328,8 @@ static int rpipe_aim(struct wa_rpipe *rpipe, struct wahc *wa, } unauth = usb_dev->wusb && !usb_dev->authenticated ? 0x80 : 0; __rpipe_reset(wa, le16_to_cpu(rpipe->descr.wRPipeIndex)); - atomic_set(&rpipe->segs_available, le16_to_cpu(rpipe->descr.wRequests)); + atomic_set(&rpipe->segs_available, + le16_to_cpu(rpipe->descr.wRequests)); /* FIXME: block allocation system; request with queuing and timeout */ /* FIXME: compute so seg_size > ep->maxpktsize */ rpipe->descr.wBlocks = cpu_to_le16(16); /* given */ @@ -527,7 +527,7 @@ void rpipe_ep_disable(struct wahc *wa, struct usb_host_endpoint *ep) wa->usb_dev, usb_rcvctrlpipe(wa->usb_dev, 0), USB_REQ_RPIPE_ABORT, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE, - 0, index, NULL, 0, 1000 /* FIXME: arbitrary */); + 0, index, NULL, 0, USB_CTRL_SET_TIMEOUT); rpipe_put(rpipe); } mutex_unlock(&wa->rpipe_mutex); @@ -548,9 +548,8 @@ void rpipe_clear_feature_stalled(struct wahc *wa, struct usb_host_endpoint *ep) wa->usb_dev, usb_rcvctrlpipe(wa->usb_dev, 0), USB_REQ_CLEAR_FEATURE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_RPIPE, - RPIPE_STALL, index, NULL, 0, 1000); + RPIPE_STALL, index, NULL, 0, USB_CTRL_SET_TIMEOUT); } mutex_unlock(&wa->rpipe_mutex); } EXPORT_SYMBOL_GPL(rpipe_clear_feature_stalled); - diff --git a/drivers/usb/wusbcore/wa-xfer.c b/drivers/usb/wusbcore/wa-xfer.c index ed5abe87b049..3cd96e936d77 100644 --- a/drivers/usb/wusbcore/wa-xfer.c +++ b/drivers/usb/wusbcore/wa-xfer.c @@ -79,7 +79,6 @@ * availability of the different required components (blocks, * rpipes, segment slots, etc), we go scheduling them. Painful. */ -#include <linux/init.h> #include <linux/spinlock.h> #include <linux/slab.h> #include <linux/hash.h> @@ -124,6 +123,8 @@ struct wa_seg { u8 index; /* which segment we are */ int isoc_frame_count; /* number of isoc frames in this segment. */ int isoc_frame_offset; /* starting frame offset in the xfer URB. */ + /* Isoc frame that the current transfer buffer corresponds to. */ + int isoc_frame_index; int isoc_size; /* size of all isoc frames sent by this seg. */ enum wa_seg_status status; ssize_t result; /* bytes xfered or error */ @@ -158,8 +159,6 @@ struct wa_xfer { unsigned is_dma:1; size_t seg_size; int result; - /* Isoc frame that the current transfer buffer corresponds to. */ - int dto_isoc_frame_index; gfp_t gfp; /* allocation mask */ @@ -282,6 +281,7 @@ static void wa_xfer_giveback(struct wa_xfer *xfer) spin_lock_irqsave(&xfer->wa->xfer_list_lock, flags); list_del_init(&xfer->list_node); + usb_hcd_unlink_urb_from_ep(&(xfer->wa->wusb->usb_hcd), xfer->urb); spin_unlock_irqrestore(&xfer->wa->xfer_list_lock, flags); /* FIXME: segmentation broken -- kills DWA */ wusbhc_giveback_urb(xfer->wa->wusb, xfer->urb, xfer->result); @@ -372,10 +372,10 @@ static unsigned __wa_xfer_is_done(struct wa_xfer *xfer) seg->result); goto out; case WA_SEG_ABORTED: - dev_dbg(dev, "xfer %p ID %08X#%u ABORTED: result %d\n", - xfer, wa_xfer_id(xfer), seg->index, - urb->status); - xfer->result = urb->status; + xfer->result = seg->result; + dev_dbg(dev, "xfer %p ID %08X#%u: ABORTED result %zu(0x%08zX)\n", + xfer, wa_xfer_id(xfer), seg->index, seg->result, + seg->result); goto out; default: dev_warn(dev, "xfer %p ID %08X#%u: is_done bad state %d\n", @@ -487,13 +487,14 @@ static int __wa_seg_calculate_isoc_frame_count(struct wa_xfer *xfer, && ((segment_size + iso_frame_desc[index].length) <= xfer->seg_size)) { /* - * For Alereon HWA devices, only include an isoc frame in a - * segment if it is physically contiguous with the previous + * For Alereon HWA devices, only include an isoc frame in an + * out segment if it is physically contiguous with the previous * frame. This is required because those devices expect * the isoc frames to be sent as a single USB transaction as * opposed to one transaction per frame with standard HWA. */ if ((xfer->wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) + && (xfer->is_inbound == 0) && (index > isoc_frame_offset) && ((iso_frame_desc[index - 1].offset + iso_frame_desc[index - 1].length) != @@ -536,14 +537,8 @@ static ssize_t __wa_xfer_setup_sizes(struct wa_xfer *xfer, result = sizeof(struct wa_xfer_bi); break; case USB_ENDPOINT_XFER_ISOC: - if (usb_pipeout(urb->pipe)) { - *pxfer_type = WA_XFER_TYPE_ISO; - result = sizeof(struct wa_xfer_hwaiso); - } else { - dev_err(dev, "FIXME: ISOC IN not implemented\n"); - result = -ENOSYS; - goto error; - } + *pxfer_type = WA_XFER_TYPE_ISO; + result = sizeof(struct wa_xfer_hwaiso); break; default: /* never happens */ @@ -554,10 +549,22 @@ static ssize_t __wa_xfer_setup_sizes(struct wa_xfer *xfer, xfer->is_dma = urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP ? 1 : 0; maxpktsize = le16_to_cpu(rpipe->descr.wMaxPacketSize); + xfer->seg_size = le16_to_cpu(rpipe->descr.wBlocks) + * 1 << (xfer->wa->wa_descr->bRPipeBlockSize - 1); + /* Compute the segment size and make sure it is a multiple of + * the maxpktsize (WUSB1.0[8.3.3.1])...not really too much of + * a check (FIXME) */ + if (xfer->seg_size < maxpktsize) { + dev_err(dev, + "HW BUG? seg_size %zu smaller than maxpktsize %zu\n", + xfer->seg_size, maxpktsize); + result = -EINVAL; + goto error; + } + xfer->seg_size = (xfer->seg_size / maxpktsize) * maxpktsize; if ((rpipe->descr.bmAttribute & 0x3) == USB_ENDPOINT_XFER_ISOC) { int index = 0; - xfer->seg_size = maxpktsize; xfer->segs = 0; /* * loop over urb->number_of_packets to determine how many @@ -570,19 +577,6 @@ static ssize_t __wa_xfer_setup_sizes(struct wa_xfer *xfer, ++xfer->segs; } } else { - xfer->seg_size = le16_to_cpu(rpipe->descr.wBlocks) - * 1 << (xfer->wa->wa_descr->bRPipeBlockSize - 1); - /* Compute the segment size and make sure it is a multiple of - * the maxpktsize (WUSB1.0[8.3.3.1])...not really too much of - * a check (FIXME) */ - if (xfer->seg_size < maxpktsize) { - dev_err(dev, - "HW BUG? seg_size %zu smaller than maxpktsize %zu\n", - xfer->seg_size, maxpktsize); - result = -EINVAL; - goto error; - } - xfer->seg_size = (xfer->seg_size / maxpktsize) * maxpktsize; xfer->segs = DIV_ROUND_UP(urb->transfer_buffer_length, xfer->seg_size); if (xfer->segs == 0 && *pxfer_type == WA_XFER_TYPE_CTL) @@ -700,23 +694,23 @@ static void wa_seg_dto_cb(struct urb *urb) if (usb_pipeisoc(xfer->urb->pipe)) { /* Alereon HWA sends all isoc frames in a single transfer. */ if (wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) - xfer->dto_isoc_frame_index += seg->isoc_frame_count; + seg->isoc_frame_index += seg->isoc_frame_count; else - xfer->dto_isoc_frame_index += 1; - if (xfer->dto_isoc_frame_index < seg->isoc_frame_count) { + seg->isoc_frame_index += 1; + if (seg->isoc_frame_index < seg->isoc_frame_count) { data_send_done = 0; holding_dto = 1; /* checked in error cases. */ /* * if this is the last isoc frame of the segment, we * can release DTO after sending this frame. */ - if ((xfer->dto_isoc_frame_index + 1) >= + if ((seg->isoc_frame_index + 1) >= seg->isoc_frame_count) release_dto = 1; } dev_dbg(dev, "xfer 0x%08X#%u: isoc frame = %d, holding_dto = %d, release_dto = %d.\n", - wa_xfer_id(xfer), seg->index, - xfer->dto_isoc_frame_index, holding_dto, release_dto); + wa_xfer_id(xfer), seg->index, seg->isoc_frame_index, + holding_dto, release_dto); } spin_unlock_irqrestore(&xfer->lock, flags); @@ -736,8 +730,7 @@ static void wa_seg_dto_cb(struct urb *urb) * send the URB and release DTO if we no longer need it. */ __wa_populate_dto_urb_isoc(xfer, seg, - seg->isoc_frame_offset + - xfer->dto_isoc_frame_index); + seg->isoc_frame_offset + seg->isoc_frame_index); /* resubmit the URB with the next isoc frame. */ result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); @@ -844,7 +837,7 @@ static void wa_seg_iso_pack_desc_cb(struct urb *urb) wa_xfer_id(xfer), seg->index, urb->status); if (edc_inc(&wa->nep_edc, EDC_MAX_ERRORS, EDC_ERROR_TIMEFRAME)){ - dev_err(dev, "DTO: URB max acceptable errors exceeded, resetting device\n"); + dev_err(dev, "iso xfer: URB max acceptable errors exceeded, resetting device\n"); wa_reset_all(wa); } if (seg->status != WA_SEG_ERROR) { @@ -1108,7 +1101,7 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) const struct usb_endpoint_descriptor *dto_epd = xfer->wa->dto_epd; struct wa_seg *seg; size_t buf_itr, buf_size, buf_itr_size; - int xfer_isoc_frame_offset = 0; + int isoc_frame_offset = 0; result = -ENOMEM; xfer->seg = kcalloc(xfer->segs, sizeof(xfer->seg[0]), GFP_ATOMIC); @@ -1121,10 +1114,14 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) size_t iso_pkt_descr_size = 0; int seg_isoc_frame_count = 0, seg_isoc_size = 0; + /* + * Adjust the size of the segment object to contain space for + * the isoc packet descriptor buffer. + */ if (usb_pipeisoc(xfer->urb->pipe)) { seg_isoc_frame_count = __wa_seg_calculate_isoc_frame_count(xfer, - xfer_isoc_frame_offset, &seg_isoc_size); + isoc_frame_offset, &seg_isoc_size); iso_pkt_descr_size = sizeof(struct wa_xfer_packet_info_hwaiso) + @@ -1137,15 +1134,40 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) wa_seg_init(seg); seg->xfer = xfer; seg->index = cnt; - seg->isoc_frame_count = seg_isoc_frame_count; - seg->isoc_frame_offset = xfer_isoc_frame_offset; - seg->isoc_size = seg_isoc_size; usb_fill_bulk_urb(&seg->tr_urb, usb_dev, usb_sndbulkpipe(usb_dev, dto_epd->bEndpointAddress), &seg->xfer_hdr, xfer_hdr_size, wa_seg_tr_cb, seg); buf_itr_size = min(buf_size, xfer->seg_size); + + if (usb_pipeisoc(xfer->urb->pipe)) { + seg->isoc_frame_count = seg_isoc_frame_count; + seg->isoc_frame_offset = isoc_frame_offset; + seg->isoc_size = seg_isoc_size; + /* iso packet descriptor. */ + seg->isoc_pack_desc_urb = + usb_alloc_urb(0, GFP_ATOMIC); + if (seg->isoc_pack_desc_urb == NULL) + goto error_iso_pack_desc_alloc; + /* + * The buffer for the isoc packet descriptor starts + * after the transfer request header in the + * segment object memory buffer. + */ + usb_fill_bulk_urb( + seg->isoc_pack_desc_urb, usb_dev, + usb_sndbulkpipe(usb_dev, + dto_epd->bEndpointAddress), + (void *)(&seg->xfer_hdr) + + xfer_hdr_size, + iso_pkt_descr_size, + wa_seg_iso_pack_desc_cb, seg); + + /* adjust starting frame offset for next seg. */ + isoc_frame_offset += seg_isoc_frame_count; + } + if (xfer->is_inbound == 0 && buf_size > 0) { /* outbound data. */ seg->dto_urb = usb_alloc_urb(0, GFP_ATOMIC); @@ -1158,25 +1180,6 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) NULL, 0, wa_seg_dto_cb, seg); if (usb_pipeisoc(xfer->urb->pipe)) { - /* iso packet descriptor. */ - seg->isoc_pack_desc_urb = - usb_alloc_urb(0, GFP_ATOMIC); - if (seg->isoc_pack_desc_urb == NULL) - goto error_iso_pack_desc_alloc; - /* - * The buffer for the isoc packet descriptor - * after the transfer request header in the - * segment object memory buffer. - */ - usb_fill_bulk_urb( - seg->isoc_pack_desc_urb, usb_dev, - usb_sndbulkpipe(usb_dev, - dto_epd->bEndpointAddress), - (void *)(&seg->xfer_hdr) + - xfer_hdr_size, - iso_pkt_descr_size, - wa_seg_iso_pack_desc_cb, seg); - /* * Fill in the xfer buffer information for the * first isoc frame. Subsequent frames in this @@ -1184,9 +1187,7 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) * DTO completion routine, if needed. */ __wa_populate_dto_urb_isoc(xfer, seg, - xfer_isoc_frame_offset); - /* adjust starting frame offset for next seg. */ - xfer_isoc_frame_offset += seg_isoc_frame_count; + seg->isoc_frame_offset); } else { /* fill in the xfer buffer information. */ result = __wa_populate_dto_urb(xfer, seg, @@ -1207,10 +1208,11 @@ static int __wa_xfer_setup_segs(struct wa_xfer *xfer, size_t xfer_hdr_size) * Use the fact that cnt is left at were it failed. The remaining * segments will be cleaned up by wa_xfer_destroy. */ -error_iso_pack_desc_alloc: error_seg_outbound_populate: usb_free_urb(xfer->seg[cnt]->dto_urb); error_dto_alloc: + usb_free_urb(xfer->seg[cnt]->isoc_pack_desc_urb); +error_iso_pack_desc_alloc: kfree(xfer->seg[cnt]); xfer->seg[cnt] = NULL; error_seg_kmalloc: @@ -1259,8 +1261,11 @@ static int __wa_xfer_setup(struct wa_xfer *xfer, struct urb *urb) for (cnt = 1; cnt < xfer->segs; cnt++) { struct wa_xfer_packet_info_hwaiso *packet_desc; struct wa_seg *seg = xfer->seg[cnt]; + struct wa_xfer_hwaiso *xfer_iso; xfer_hdr = &seg->xfer_hdr; + xfer_iso = container_of(xfer_hdr, + struct wa_xfer_hwaiso, hdr); packet_desc = ((void *)xfer_hdr) + xfer_hdr_size; /* * Copy values from the 0th header. Segment specific @@ -1270,6 +1275,8 @@ static int __wa_xfer_setup(struct wa_xfer *xfer, struct urb *urb) xfer_hdr->bTransferSegment = cnt; xfer_hdr->dwTransferLength = cpu_to_le32(seg->isoc_size); + xfer_iso->dwNumOfPackets = + cpu_to_le32(seg->isoc_frame_count); __wa_setup_isoc_packet_descr(packet_desc, xfer, seg); seg->status = WA_SEG_READY; } @@ -1320,32 +1327,31 @@ static int __wa_seg_submit(struct wa_rpipe *rpipe, struct wa_xfer *xfer, } /* submit the isoc packet descriptor if present. */ if (seg->isoc_pack_desc_urb) { - struct wahc *wa = xfer->wa; - result = usb_submit_urb(seg->isoc_pack_desc_urb, GFP_ATOMIC); + seg->isoc_frame_index = 0; if (result < 0) { pr_err("%s: xfer %p#%u: ISO packet descriptor submit failed: %d\n", __func__, xfer, seg->index, result); goto error_iso_pack_desc_submit; } - xfer->dto_isoc_frame_index = 0; - /* - * If this segment contains more than one isoc frame, hold - * onto the dto resource until we send all frames. - * Only applies to non-Alereon devices. - */ - if (((wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) == 0) - && (seg->isoc_frame_count > 1)) - *dto_done = 0; } /* submit the out data if this is an out request. */ if (seg->dto_urb) { + struct wahc *wa = xfer->wa; result = usb_submit_urb(seg->dto_urb, GFP_ATOMIC); if (result < 0) { pr_err("%s: xfer %p#%u: DTO submit failed: %d\n", __func__, xfer, seg->index, result); goto error_dto_submit; } + /* + * If this segment contains more than one isoc frame, hold + * onto the dto resource until we send all frames. + * Only applies to non-Alereon devices. + */ + if (((wa->quirks & WUSB_QUIRK_ALEREON_HWA_CONCAT_ISOC) == 0) + && (seg->isoc_frame_count > 1)) + *dto_done = 0; } seg->status = WA_SEG_SUBMITTED; rpipe_avail_dec(rpipe); @@ -1567,7 +1573,8 @@ static int wa_urb_enqueue_b(struct wa_xfer *xfer) wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, urb->dev); if (wusb_dev == NULL) { mutex_unlock(&wusbhc->mutex); - pr_err("%s: error wusb dev gone\n", __func__); + dev_err(&(urb->dev->dev), "%s: error wusb dev gone\n", + __func__); goto error_dev_gone; } mutex_unlock(&wusbhc->mutex); @@ -1576,18 +1583,18 @@ static int wa_urb_enqueue_b(struct wa_xfer *xfer) xfer->wusb_dev = wusb_dev; result = urb->status; if (urb->status != -EINPROGRESS) { - pr_err("%s: error_dequeued\n", __func__); + dev_err(&(urb->dev->dev), "%s: error_dequeued\n", __func__); goto error_dequeued; } result = __wa_xfer_setup(xfer, urb); if (result < 0) { - pr_err("%s: error_xfer_setup\n", __func__); + dev_err(&(urb->dev->dev), "%s: error_xfer_setup\n", __func__); goto error_xfer_setup; } result = __wa_xfer_submit(xfer); if (result < 0) { - pr_err("%s: error_xfer_submit\n", __func__); + dev_err(&(urb->dev->dev), "%s: error_xfer_submit\n", __func__); goto error_xfer_submit; } spin_unlock_irqrestore(&xfer->lock, flags); @@ -1730,6 +1737,12 @@ int wa_urb_enqueue(struct wahc *wa, struct usb_host_endpoint *ep, dump_stack(); } + spin_lock_irqsave(&wa->xfer_list_lock, my_flags); + result = usb_hcd_link_urb_to_ep(&(wa->wusb->usb_hcd), urb); + spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); + if (result < 0) + goto error_link_urb; + result = -ENOMEM; xfer = kzalloc(sizeof(*xfer), gfp); if (xfer == NULL) @@ -1769,6 +1782,9 @@ int wa_urb_enqueue(struct wahc *wa, struct usb_host_endpoint *ep, __func__, result); wa_put(xfer->wa); wa_xfer_put(xfer); + spin_lock_irqsave(&wa->xfer_list_lock, my_flags); + usb_hcd_unlink_urb_from_ep(&(wa->wusb->usb_hcd), urb); + spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); return result; } } @@ -1777,6 +1793,10 @@ int wa_urb_enqueue(struct wahc *wa, struct usb_host_endpoint *ep, error_dequeued: kfree(xfer); error_kmalloc: + spin_lock_irqsave(&wa->xfer_list_lock, my_flags); + usb_hcd_unlink_urb_from_ep(&(wa->wusb->usb_hcd), urb); + spin_unlock_irqrestore(&wa->xfer_list_lock, my_flags); +error_link_urb: return result; } EXPORT_SYMBOL_GPL(wa_urb_enqueue); @@ -1799,7 +1819,7 @@ EXPORT_SYMBOL_GPL(wa_urb_enqueue); * asynch request] and then make sure we cancel each segment. * */ -int wa_urb_dequeue(struct wahc *wa, struct urb *urb) +int wa_urb_dequeue(struct wahc *wa, struct urb *urb, int status) { unsigned long flags, flags2; struct wa_xfer *xfer; @@ -1807,6 +1827,14 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb) struct wa_rpipe *rpipe; unsigned cnt, done = 0, xfer_abort_pending; unsigned rpipe_ready = 0; + int result; + + /* check if it is safe to unlink. */ + spin_lock_irqsave(&wa->xfer_list_lock, flags); + result = usb_hcd_check_unlink_urb(&(wa->wusb->usb_hcd), urb, status); + spin_unlock_irqrestore(&wa->xfer_list_lock, flags); + if (result) + return result; xfer = urb->hcpriv; if (xfer == NULL) { @@ -1822,9 +1850,10 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb) pr_debug("%s: DEQUEUE xfer id 0x%08X\n", __func__, wa_xfer_id(xfer)); rpipe = xfer->ep->hcpriv; if (rpipe == NULL) { - pr_debug("%s: xfer id 0x%08X has no RPIPE. %s", - __func__, wa_xfer_id(xfer), + pr_debug("%s: xfer %p id 0x%08X has no RPIPE. %s", + __func__, xfer, wa_xfer_id(xfer), "Probably already aborted.\n" ); + result = -ENOENT; goto out_unlock; } /* Check the delayed list -> if there, release and complete */ @@ -1855,6 +1884,7 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb) * segments will be completed in the DTI interrupt. */ seg->status = WA_SEG_ABORTED; + seg->result = -ENOENT; spin_lock_irqsave(&rpipe->seg_lock, flags2); list_del(&seg->list_node); xfer->segs_done++; @@ -1894,12 +1924,12 @@ int wa_urb_dequeue(struct wahc *wa, struct urb *urb) wa_xfer_completion(xfer); if (rpipe_ready) wa_xfer_delayed_run(rpipe); - return 0; + return result; out_unlock: spin_unlock_irqrestore(&xfer->lock, flags); out: - return 0; + return result; dequeue_delayed: list_del_init(&xfer->list_node); @@ -1935,7 +1965,7 @@ static int wa_xfer_status_to_errno(u8 status) [WA_XFER_STATUS_NOT_FOUND] = 0, [WA_XFER_STATUS_INSUFFICIENT_RESOURCE] = -ENOMEM, [WA_XFER_STATUS_TRANSACTION_ERROR] = -EILSEQ, - [WA_XFER_STATUS_ABORTED] = -EINTR, + [WA_XFER_STATUS_ABORTED] = -ENOENT, [WA_XFER_STATUS_RPIPE_NOT_READY] = EINVAL, [WA_XFER_INVALID_FORMAT] = EINVAL, [WA_XFER_UNEXPECTED_SEGMENT_NUMBER] = EINVAL, @@ -1968,7 +1998,7 @@ static int wa_xfer_status_to_errno(u8 status) * the xfer will complete cleanly. */ static void wa_complete_remaining_xfer_segs(struct wa_xfer *xfer, - struct wa_seg *incoming_seg) + struct wa_seg *incoming_seg, enum wa_seg_status status) { int index; struct wa_rpipe *rpipe = xfer->ep->hcpriv; @@ -1990,7 +2020,7 @@ static void wa_complete_remaining_xfer_segs(struct wa_xfer *xfer, */ case WA_SEG_DELAYED: xfer->segs_done++; - current_seg->status = incoming_seg->status; + current_seg->status = status; break; case WA_SEG_ABORTED: break; @@ -2003,6 +2033,77 @@ static void wa_complete_remaining_xfer_segs(struct wa_xfer *xfer, } } +/* Populate the wa->buf_in_urb based on the current isoc transfer state. */ +static void __wa_populate_buf_in_urb_isoc(struct wahc *wa, struct wa_xfer *xfer, + struct wa_seg *seg, int curr_iso_frame) +{ + BUG_ON(wa->buf_in_urb->status == -EINPROGRESS); + + /* this should always be 0 before a resubmit. */ + wa->buf_in_urb->num_mapped_sgs = 0; + wa->buf_in_urb->transfer_dma = xfer->urb->transfer_dma + + xfer->urb->iso_frame_desc[curr_iso_frame].offset; + wa->buf_in_urb->transfer_buffer_length = + xfer->urb->iso_frame_desc[curr_iso_frame].length; + wa->buf_in_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + wa->buf_in_urb->transfer_buffer = NULL; + wa->buf_in_urb->sg = NULL; + wa->buf_in_urb->num_sgs = 0; + wa->buf_in_urb->context = seg; +} + +/* Populate the wa->buf_in_urb based on the current transfer state. */ +static int wa_populate_buf_in_urb(struct wahc *wa, struct wa_xfer *xfer, + unsigned int seg_idx, unsigned int bytes_transferred) +{ + int result = 0; + struct wa_seg *seg = xfer->seg[seg_idx]; + + BUG_ON(wa->buf_in_urb->status == -EINPROGRESS); + /* this should always be 0 before a resubmit. */ + wa->buf_in_urb->num_mapped_sgs = 0; + + if (xfer->is_dma) { + wa->buf_in_urb->transfer_dma = xfer->urb->transfer_dma + + (seg_idx * xfer->seg_size); + wa->buf_in_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; + wa->buf_in_urb->transfer_buffer = NULL; + wa->buf_in_urb->sg = NULL; + wa->buf_in_urb->num_sgs = 0; + } else { + /* do buffer or SG processing. */ + wa->buf_in_urb->transfer_flags &= ~URB_NO_TRANSFER_DMA_MAP; + + if (xfer->urb->transfer_buffer) { + wa->buf_in_urb->transfer_buffer = + xfer->urb->transfer_buffer + + (seg_idx * xfer->seg_size); + wa->buf_in_urb->sg = NULL; + wa->buf_in_urb->num_sgs = 0; + } else { + /* allocate an SG list to store seg_size bytes + and copy the subset of the xfer->urb->sg + that matches the buffer subset we are + about to read. */ + wa->buf_in_urb->sg = wa_xfer_create_subset_sg( + xfer->urb->sg, + seg_idx * xfer->seg_size, + bytes_transferred, + &(wa->buf_in_urb->num_sgs)); + + if (!(wa->buf_in_urb->sg)) { + wa->buf_in_urb->num_sgs = 0; + result = -ENOMEM; + } + wa->buf_in_urb->transfer_buffer = NULL; + } + } + wa->buf_in_urb->transfer_buffer_length = bytes_transferred; + wa->buf_in_urb->context = seg; + + return result; +} + /* * Process a xfer result completion message * @@ -2016,12 +2117,13 @@ static void wa_xfer_result_chew(struct wahc *wa, struct wa_xfer *xfer, int result; struct device *dev = &wa->usb_iface->dev; unsigned long flags; - u8 seg_idx; + unsigned int seg_idx; struct wa_seg *seg; struct wa_rpipe *rpipe; unsigned done = 0; u8 usb_status; unsigned rpipe_ready = 0; + unsigned bytes_transferred = le32_to_cpu(xfer_result->dwTransferLength); spin_lock_irqsave(&xfer->lock, flags); seg_idx = xfer_result->bTransferSegment & 0x7f; @@ -2054,66 +2156,34 @@ static void wa_xfer_result_chew(struct wahc *wa, struct wa_xfer *xfer, /* FIXME: we ignore warnings, tally them for stats */ if (usb_status & 0x40) /* Warning?... */ usb_status = 0; /* ... pass */ - if (usb_pipeisoc(xfer->urb->pipe)) { + /* + * If the last segment bit is set, complete the remaining segments. + * When the current segment is completed, either in wa_buf_in_cb for + * transfers with data or below for no data, the xfer will complete. + */ + if (xfer_result->bTransferSegment & 0x80) + wa_complete_remaining_xfer_segs(xfer, seg, WA_SEG_DONE); + if (usb_pipeisoc(xfer->urb->pipe) + && (le32_to_cpu(xfer_result->dwNumOfPackets) > 0)) { /* set up WA state to read the isoc packet status next. */ wa->dti_isoc_xfer_in_progress = wa_xfer_id(xfer); wa->dti_isoc_xfer_seg = seg_idx; wa->dti_state = WA_DTI_ISOC_PACKET_STATUS_PENDING; - } else if (xfer->is_inbound) { /* IN data phase: read to buffer */ + } else if (xfer->is_inbound && !usb_pipeisoc(xfer->urb->pipe) + && (bytes_transferred > 0)) { + /* IN data phase: read to buffer */ seg->status = WA_SEG_DTI_PENDING; - BUG_ON(wa->buf_in_urb->status == -EINPROGRESS); - /* this should always be 0 before a resubmit. */ - wa->buf_in_urb->num_mapped_sgs = 0; - - if (xfer->is_dma) { - wa->buf_in_urb->transfer_dma = - xfer->urb->transfer_dma - + (seg_idx * xfer->seg_size); - wa->buf_in_urb->transfer_flags - |= URB_NO_TRANSFER_DMA_MAP; - wa->buf_in_urb->transfer_buffer = NULL; - wa->buf_in_urb->sg = NULL; - wa->buf_in_urb->num_sgs = 0; - } else { - /* do buffer or SG processing. */ - wa->buf_in_urb->transfer_flags - &= ~URB_NO_TRANSFER_DMA_MAP; - - if (xfer->urb->transfer_buffer) { - wa->buf_in_urb->transfer_buffer = - xfer->urb->transfer_buffer - + (seg_idx * xfer->seg_size); - wa->buf_in_urb->sg = NULL; - wa->buf_in_urb->num_sgs = 0; - } else { - /* allocate an SG list to store seg_size bytes - and copy the subset of the xfer->urb->sg - that matches the buffer subset we are - about to read. */ - wa->buf_in_urb->sg = wa_xfer_create_subset_sg( - xfer->urb->sg, - seg_idx * xfer->seg_size, - le32_to_cpu( - xfer_result->dwTransferLength), - &(wa->buf_in_urb->num_sgs)); - - if (!(wa->buf_in_urb->sg)) { - wa->buf_in_urb->num_sgs = 0; - goto error_sg_alloc; - } - wa->buf_in_urb->transfer_buffer = NULL; - } - } - wa->buf_in_urb->transfer_buffer_length = - le32_to_cpu(xfer_result->dwTransferLength); - wa->buf_in_urb->context = seg; + result = wa_populate_buf_in_urb(wa, xfer, seg_idx, + bytes_transferred); + if (result < 0) + goto error_buf_in_populate; result = usb_submit_urb(wa->buf_in_urb, GFP_ATOMIC); if (result < 0) goto error_submit_buf_in; } else { - /* OUT data phase, complete it -- */ + /* OUT data phase or no data, complete it -- */ seg->status = WA_SEG_DONE; - seg->result = le32_to_cpu(xfer_result->dwTransferLength); + seg->result = bytes_transferred; xfer->segs_done++; rpipe_ready = rpipe_avail_inc(rpipe); done = __wa_xfer_is_done(xfer); @@ -2137,13 +2207,13 @@ error_submit_buf_in: seg->result = result; kfree(wa->buf_in_urb->sg); wa->buf_in_urb->sg = NULL; -error_sg_alloc: +error_buf_in_populate: __wa_xfer_abort(xfer); seg->status = WA_SEG_ERROR; error_complete: xfer->segs_done++; rpipe_ready = rpipe_avail_inc(rpipe); - wa_complete_remaining_xfer_segs(xfer, seg); + wa_complete_remaining_xfer_segs(xfer, seg, seg->status); done = __wa_xfer_is_done(xfer); /* * queue work item to clear STALL for control endpoints. @@ -2172,7 +2242,7 @@ error_complete: error_bad_seg: spin_unlock_irqrestore(&xfer->lock, flags); - wa_urb_dequeue(wa, xfer->urb); + wa_urb_dequeue(wa, xfer->urb, -ENOENT); if (printk_ratelimit()) dev_err(dev, "xfer %p#%u: bad segment\n", xfer, seg_idx); if (edc_inc(&wa->dti_edc, EDC_MAX_ERRORS, EDC_ERROR_TIMEFRAME)) { @@ -2192,7 +2262,7 @@ segment_aborted: * * inbound transfers: need to schedule a buf_in_urb read */ -static void wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) +static int wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) { struct device *dev = &wa->usb_iface->dev; struct wa_xfer_packet_status_hwaiso *packet_status; @@ -2201,8 +2271,8 @@ static void wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) unsigned long flags; struct wa_seg *seg; struct wa_rpipe *rpipe; - unsigned done = 0; - unsigned rpipe_ready = 0, seg_index; + unsigned done = 0, dti_busy = 0, data_frame_count = 0, seg_index; + unsigned first_frame_index = 0, rpipe_ready = 0; int expected_size; /* We have a xfer result buffer; check it */ @@ -2238,18 +2308,48 @@ static void wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) le16_to_cpu(packet_status->wLength)); goto error_bad_seg; } - /* isoc packet status and lengths back xfer urb. */ + /* write isoc packet status and lengths back to the xfer urb. */ status_array = packet_status->PacketStatus; + xfer->urb->start_frame = + wa->wusb->usb_hcd.driver->get_frame_number(&wa->wusb->usb_hcd); for (seg_index = 0; seg_index < seg->isoc_frame_count; ++seg_index) { - xfer->urb->iso_frame_desc[seg->index].status = + struct usb_iso_packet_descriptor *iso_frame_desc = + xfer->urb->iso_frame_desc; + const int urb_frame_index = + seg->isoc_frame_offset + seg_index; + + iso_frame_desc[urb_frame_index].status = wa_xfer_status_to_errno( le16_to_cpu(status_array[seg_index].PacketStatus)); - xfer->urb->iso_frame_desc[seg->index].actual_length = + iso_frame_desc[urb_frame_index].actual_length = le16_to_cpu(status_array[seg_index].PacketLength); + /* track the number of frames successfully transferred. */ + if (iso_frame_desc[urb_frame_index].actual_length > 0) { + /* save the starting frame index for buf_in_urb. */ + if (!data_frame_count) + first_frame_index = seg_index; + ++data_frame_count; + } } - if (!xfer->is_inbound) { - /* OUT transfer, complete it -- */ + if (xfer->is_inbound && data_frame_count) { + int result; + + seg->isoc_frame_index = first_frame_index; + /* submit a read URB for the first frame with data. */ + __wa_populate_buf_in_urb_isoc(wa, xfer, seg, + seg->isoc_frame_index + seg->isoc_frame_offset); + + result = usb_submit_urb(wa->buf_in_urb, GFP_ATOMIC); + if (result < 0) { + dev_err(dev, "DTI Error: Could not submit buf in URB (%d)", + result); + wa_reset_all(wa); + } else if (data_frame_count > 1) + /* If we need to read multiple frames, set DTI busy. */ + dti_busy = 1; + } else { + /* OUT transfer or no more IN data, complete it -- */ seg->status = WA_SEG_DONE; xfer->segs_done++; rpipe_ready = rpipe_avail_inc(rpipe); @@ -2262,13 +2362,13 @@ static void wa_process_iso_packet_status(struct wahc *wa, struct urb *urb) if (rpipe_ready) wa_xfer_delayed_run(rpipe); wa_xfer_put(xfer); - return; + return dti_busy; error_bad_seg: spin_unlock_irqrestore(&xfer->lock, flags); wa_xfer_put(xfer); error_parse_buffer: - return; + return dti_busy; } /* @@ -2288,7 +2388,7 @@ static void wa_buf_in_cb(struct urb *urb) struct wahc *wa; struct device *dev; struct wa_rpipe *rpipe; - unsigned rpipe_ready; + unsigned rpipe_ready = 0, seg_index, isoc_data_frame_count = 0; unsigned long flags; u8 done = 0; @@ -2296,19 +2396,61 @@ static void wa_buf_in_cb(struct urb *urb) kfree(urb->sg); urb->sg = NULL; + spin_lock_irqsave(&xfer->lock, flags); + wa = xfer->wa; + dev = &wa->usb_iface->dev; + + if (usb_pipeisoc(xfer->urb->pipe)) { + /* + * Find the next isoc frame with data. Bail out after + * isoc_data_frame_count > 1 since there is no need to walk + * the entire frame array. We just need to know if + * isoc_data_frame_count is 0, 1, or >1. + */ + seg_index = seg->isoc_frame_index + 1; + while ((seg_index < seg->isoc_frame_count) + && (isoc_data_frame_count <= 1)) { + struct usb_iso_packet_descriptor *iso_frame_desc = + xfer->urb->iso_frame_desc; + const int urb_frame_index = + seg->isoc_frame_offset + seg_index; + + if (iso_frame_desc[urb_frame_index].actual_length > 0) { + /* save the index of the next frame with data */ + if (!isoc_data_frame_count) + seg->isoc_frame_index = seg_index; + ++isoc_data_frame_count; + } + ++seg_index; + } + } + spin_unlock_irqrestore(&xfer->lock, flags); + switch (urb->status) { case 0: spin_lock_irqsave(&xfer->lock, flags); - wa = xfer->wa; - dev = &wa->usb_iface->dev; - rpipe = xfer->ep->hcpriv; - dev_dbg(dev, "xfer %p#%u: data in done (%zu bytes)\n", - xfer, seg->index, (size_t)urb->actual_length); - seg->status = WA_SEG_DONE; - seg->result = urb->actual_length; - xfer->segs_done++; - rpipe_ready = rpipe_avail_inc(rpipe); - done = __wa_xfer_is_done(xfer); + + seg->result += urb->actual_length; + if (isoc_data_frame_count > 0) { + int result; + /* submit a read URB for the first frame with data. */ + __wa_populate_buf_in_urb_isoc(wa, xfer, seg, + seg->isoc_frame_index + seg->isoc_frame_offset); + result = usb_submit_urb(wa->buf_in_urb, GFP_ATOMIC); + if (result < 0) { + dev_err(dev, "DTI Error: Could not submit buf in URB (%d)", + result); + wa_reset_all(wa); + } + } else { + rpipe = xfer->ep->hcpriv; + seg->status = WA_SEG_DONE; + dev_dbg(dev, "xfer %p#%u: data in done (%zu bytes)\n", + xfer, seg->index, seg->result); + xfer->segs_done++; + rpipe_ready = rpipe_avail_inc(rpipe); + done = __wa_xfer_is_done(xfer); + } spin_unlock_irqrestore(&xfer->lock, flags); if (done) wa_xfer_completion(xfer); @@ -2320,8 +2462,6 @@ static void wa_buf_in_cb(struct urb *urb) break; default: /* Other errors ... */ spin_lock_irqsave(&xfer->lock, flags); - wa = xfer->wa; - dev = &wa->usb_iface->dev; rpipe = xfer->ep->hcpriv; if (printk_ratelimit()) dev_err(dev, "xfer %p#%u: data in error %d\n", @@ -2344,6 +2484,20 @@ static void wa_buf_in_cb(struct urb *urb) if (rpipe_ready) wa_xfer_delayed_run(rpipe); } + /* + * If we are in this callback and isoc_data_frame_count > 0, it means + * that the dti_urb submission was delayed in wa_dti_cb. Once + * isoc_data_frame_count gets to 1, we can submit the deferred URB + * since the last buf_in_urb was just submitted. + */ + if (isoc_data_frame_count == 1) { + int result = usb_submit_urb(wa->dti_urb, GFP_ATOMIC); + if (result < 0) { + dev_err(dev, "DTI Error: Could not submit DTI URB (%d)\n", + result); + wa_reset_all(wa); + } + } } /* @@ -2374,7 +2528,7 @@ static void wa_buf_in_cb(struct urb *urb) */ static void wa_dti_cb(struct urb *urb) { - int result; + int result, dti_busy = 0; struct wahc *wa = urb->context; struct device *dev = &wa->usb_iface->dev; u32 xfer_id; @@ -2422,7 +2576,7 @@ static void wa_dti_cb(struct urb *urb) wa_xfer_result_chew(wa, xfer, xfer_result); wa_xfer_put(xfer); } else if (wa->dti_state == WA_DTI_ISOC_PACKET_STATUS_PENDING) { - wa_process_iso_packet_status(wa, urb); + dti_busy = wa_process_iso_packet_status(wa, urb); } else { dev_err(dev, "DTI Error: unexpected EP state = %d\n", wa->dti_state); @@ -2445,12 +2599,15 @@ static void wa_dti_cb(struct urb *urb) dev_err(dev, "DTI: URB error %d\n", urb->status); break; } - /* Resubmit the DTI URB */ - result = usb_submit_urb(wa->dti_urb, GFP_ATOMIC); - if (result < 0) { - dev_err(dev, "DTI Error: Could not submit DTI URB (%d), " - "resetting\n", result); - wa_reset_all(wa); + + /* Resubmit the DTI URB if we are not busy processing isoc in frames. */ + if (!dti_busy) { + result = usb_submit_urb(wa->dti_urb, GFP_ATOMIC); + if (result < 0) { + dev_err(dev, "DTI Error: Could not submit DTI URB (%d)\n", + result); + wa_reset_all(wa); + } } out: return; @@ -2517,8 +2674,8 @@ void wa_handle_notif_xfer(struct wahc *wa, struct wa_notif_hdr *notif_hdr) NULL, 0, wa_buf_in_cb, wa); result = usb_submit_urb(wa->dti_urb, GFP_KERNEL); if (result < 0) { - dev_err(dev, "DTI Error: Could not submit DTI URB (%d), " - "resetting\n", result); + dev_err(dev, "DTI Error: Could not submit DTI URB (%d) resetting\n", + result); goto error_dti_urb_submit; } out: diff --git a/drivers/usb/wusbcore/wusbhc.c b/drivers/usb/wusbcore/wusbhc.c index 742c607d1fa3..3e1ba51d1a43 100644 --- a/drivers/usb/wusbcore/wusbhc.c +++ b/drivers/usb/wusbcore/wusbhc.c @@ -55,7 +55,8 @@ static struct wusbhc *usbhc_dev_to_wusbhc(struct device *dev) * value of trust_timeout is jiffies. */ static ssize_t wusb_trust_timeout_show(struct device *dev, - struct device_attribute *attr, char *buf) + struct device_attribute *attr, + char *buf) { struct wusbhc *wusbhc = usbhc_dev_to_wusbhc(dev); @@ -173,7 +174,8 @@ static ssize_t wusb_phy_rate_store(struct device *dev, wusbhc->phy_rate = phy_rate; return size; } -static DEVICE_ATTR(wusb_phy_rate, 0644, wusb_phy_rate_show, wusb_phy_rate_store); +static DEVICE_ATTR(wusb_phy_rate, 0644, wusb_phy_rate_show, + wusb_phy_rate_store); static ssize_t wusb_dnts_show(struct device *dev, struct device_attribute *attr, @@ -227,7 +229,8 @@ static ssize_t wusb_retry_count_store(struct device *dev, if (result != 1) return -EINVAL; - wusbhc->retry_count = max_t(uint8_t, retry_count, WUSB_RETRY_COUNT_MAX); + wusbhc->retry_count = max_t(uint8_t, retry_count, + WUSB_RETRY_COUNT_MAX); return size; } @@ -321,7 +324,8 @@ int wusbhc_b_create(struct wusbhc *wusbhc) result = sysfs_create_group(wusbhc_kobj(wusbhc), &wusbhc_attr_group); if (result < 0) { - dev_err(dev, "Cannot register WUSBHC attributes: %d\n", result); + dev_err(dev, "Cannot register WUSBHC attributes: %d\n", + result); goto error_create_attr_group; } @@ -419,13 +423,14 @@ EXPORT_SYMBOL_GPL(wusb_cluster_id_put); * - After a successful transfer, update the trust timeout timestamp * for the WUSB device. * - * - [WUSB] sections 4.13 and 7.5.1 specifies the stop retrasmittion + * - [WUSB] sections 4.13 and 7.5.1 specify the stop retransmission * condition for the WCONNECTACK_IE is that the host has observed * the associated device responding to a control transfer. */ void wusbhc_giveback_urb(struct wusbhc *wusbhc, struct urb *urb, int status) { - struct wusb_dev *wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, urb->dev); + struct wusb_dev *wusb_dev = __wusb_dev_get_by_usb_dev(wusbhc, + urb->dev); if (status == 0 && wusb_dev) { wusb_dev->entry_ts = jiffies; diff --git a/drivers/usb/wusbcore/wusbhc.h b/drivers/usb/wusbcore/wusbhc.h index 6bd3b819a6b5..2384add45371 100644 --- a/drivers/usb/wusbcore/wusbhc.h +++ b/drivers/usb/wusbcore/wusbhc.h @@ -164,7 +164,7 @@ struct wusb_port { * functions/operations that only deal with general Wireless USB HC * issues use this data type to refer to the host. * - * @usb_hcd Instantiation of a USB host controller + * @usb_hcd Instantiation of a USB host controller * (initialized by upper layer [HWA=HC or WHCI]. * * @dev Device that implements this; initialized by the @@ -196,7 +196,7 @@ struct wusb_port { * @ports_max Number of simultaneous device connections (fake * ports) this HC will take. Read-only. * - * @port Array of port status for each fake root port. Guaranteed to + * @port Array of port status for each fake root port. Guaranteed to * always be the same length during device existence * [this allows for some unlocked but referenced reading]. * @@ -329,7 +329,8 @@ void wusbhc_pal_unregister(struct wusbhc *wusbhc); * This is a safe assumption as @usb_dev->bus is referenced all the * time during the @usb_dev life cycle. */ -static inline struct usb_hcd *usb_hcd_get_by_usb_dev(struct usb_device *usb_dev) +static inline +struct usb_hcd *usb_hcd_get_by_usb_dev(struct usb_device *usb_dev) { struct usb_hcd *usb_hcd; usb_hcd = container_of(usb_dev->bus, struct usb_hcd, self); diff --git a/drivers/uwb/beacon.c b/drivers/uwb/beacon.c index dcdd59bfcd09..57b5ff61020c 100644 --- a/drivers/uwb/beacon.c +++ b/drivers/uwb/beacon.c @@ -117,6 +117,7 @@ int uwb_rc_beacon(struct uwb_rc *rc, int channel, unsigned bpst_offset) int result; struct device *dev = &rc->uwb_dev.dev; + dev_dbg(dev, "%s: channel = %d\n", __func__, channel); if (channel < 0) channel = -1; if (channel == -1) @@ -184,7 +185,7 @@ out: /* Find a beacon by dev addr in the cache */ static -struct uwb_beca_e *__uwb_beca_find_bymac(struct uwb_rc *rc, +struct uwb_beca_e *__uwb_beca_find_bymac(struct uwb_rc *rc, const struct uwb_mac_addr *mac_addr) { struct uwb_beca_e *bce, *next; @@ -515,13 +516,13 @@ int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *evt) } bpsc = container_of(evt->notif.rceb, struct uwb_rc_evt_bp_slot_change, rceb); - mutex_lock(&rc->uwb_dev.mutex); if (uwb_rc_evt_bp_slot_change_no_slot(bpsc)) { - dev_info(dev, "stopped beaconing: No free slots in BP\n"); + dev_err(dev, "stopped beaconing: No free slots in BP\n"); + mutex_lock(&rc->uwb_dev.mutex); rc->beaconing = -1; + mutex_unlock(&rc->uwb_dev.mutex); } else rc->uwb_dev.beacon_slot = uwb_rc_evt_bp_slot_change_slot_num(bpsc); - mutex_unlock(&rc->uwb_dev.mutex); return 0; } diff --git a/drivers/uwb/radio.c b/drivers/uwb/radio.c index d58dfecf9a79..fd23d985ea71 100644 --- a/drivers/uwb/radio.c +++ b/drivers/uwb/radio.c @@ -62,6 +62,10 @@ static void uwb_radio_channel_changed(struct uwb_rc *rc, int channel) static int uwb_radio_change_channel(struct uwb_rc *rc, int channel) { int ret = 0; + struct device *dev = &rc->uwb_dev.dev; + + dev_dbg(dev, "%s: channel = %d, rc->beaconing = %d\n", __func__, + channel, rc->beaconing); if (channel == -1) uwb_radio_channel_changed(rc, channel); @@ -89,7 +93,7 @@ static int uwb_radio_change_channel(struct uwb_rc *rc, int channel) * uwb_radio_start - request that the radio be started * @pal: the PAL making the request. * - * If the radio is not already active, aa suitable channel is selected + * If the radio is not already active, a suitable channel is selected * and beacons are started. */ int uwb_radio_start(struct uwb_pal *pal) diff --git a/drivers/uwb/rsv.c b/drivers/uwb/rsv.c index 738e8a8cb811..3fe611941046 100644 --- a/drivers/uwb/rsv.c +++ b/drivers/uwb/rsv.c @@ -237,7 +237,7 @@ void uwb_rsv_backoff_win_increment(struct uwb_rc *rc) /* reset the timer associated variables */ timeout_us = bow->n * UWB_SUPERFRAME_LENGTH_US; bow->total_expired = 0; - mod_timer(&bow->timer, jiffies + usecs_to_jiffies(timeout_us)); + mod_timer(&bow->timer, jiffies + usecs_to_jiffies(timeout_us)); } static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv) @@ -257,7 +257,7 @@ static void uwb_rsv_stroke_timer(struct uwb_rsv *rsv) sframes = 1; if (rsv->state == UWB_RSV_STATE_O_ESTABLISHED) sframes = 0; - + } if (sframes > 0) { @@ -611,7 +611,7 @@ int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available) struct device *dev = &rc->uwb_dev.dev; struct uwb_rsv_move *mv; int ret = 0; - + if (bow->can_reserve_extra_mases == false) return -EBUSY; @@ -628,7 +628,7 @@ int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available) } else { dev_dbg(dev, "new allocation not found\n"); } - + return ret; } @@ -640,7 +640,7 @@ void uwb_rsv_handle_drp_avail_change(struct uwb_rc *rc) struct uwb_drp_backoff_win *bow = &rc->bow; struct uwb_rsv *rsv; struct uwb_mas_bm mas; - + if (bow->can_reserve_extra_mases == false) return; @@ -652,7 +652,7 @@ void uwb_rsv_handle_drp_avail_change(struct uwb_rc *rc) uwb_rsv_try_move(rsv, &mas); } } - + } /** @@ -916,10 +916,10 @@ static void uwb_rsv_alien_bp_work(struct work_struct *work) struct uwb_rsv *rsv; mutex_lock(&rc->rsvs_mutex); - + list_for_each_entry(rsv, &rc->reservations, rc_node) { if (rsv->type != UWB_DRP_TYPE_ALIEN_BP) { - rsv->callback(rsv); + uwb_rsv_callback(rsv); } } diff --git a/drivers/uwb/umc-bus.c b/drivers/uwb/umc-bus.c index e3ed6ff6a481..88a290f57ea0 100644 --- a/drivers/uwb/umc-bus.c +++ b/drivers/uwb/umc-bus.c @@ -85,7 +85,7 @@ int umc_match_pci_id(struct umc_driver *umc_drv, struct umc_dev *umc) const struct pci_device_id *id_table = umc_drv->match_data; struct pci_dev *pci; - if (umc->dev.parent->bus != &pci_bus_type) + if (!dev_is_pci(umc->dev.parent)) return 0; pci = to_pci_dev(umc->dev.parent); diff --git a/drivers/uwb/umc-dev.c b/drivers/uwb/umc-dev.c index 4613c13cd851..7b0b268e0c8e 100644 --- a/drivers/uwb/umc-dev.c +++ b/drivers/uwb/umc-dev.c @@ -66,6 +66,7 @@ int umc_device_register(struct umc_dev *umc) return 0; error_device_register: + put_device(&umc->dev); release_resource(&umc->resource); error_request_resource: return err; diff --git a/drivers/watchdog/pcwd_usb.c b/drivers/watchdog/pcwd_usb.c index b731b5d129be..e562e0476016 100644 --- a/drivers/watchdog/pcwd_usb.c +++ b/drivers/watchdog/pcwd_usb.c @@ -44,23 +44,6 @@ #include <linux/hid.h> /* For HID_REQ_SET_REPORT & HID_DT_REPORT */ #include <linux/uaccess.h> /* For copy_to_user/put_user/... */ -#ifdef CONFIG_USB_DEBUG -static int debug = 1; -#else -static int debug; -#endif - -/* Use our own dbg macro */ - -#undef dbg -#ifndef DEBUG -#define DEBUG -#endif -#define dbg(format, ...) \ -do { \ - if (debug) \ - pr_debug(format "\n", ##__VA_ARGS__); \ -} while (0) /* Module and Version Information */ #define DRIVER_VERSION "1.02" @@ -73,10 +56,6 @@ MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_DESCRIPTION(DRIVER_DESC); MODULE_LICENSE(DRIVER_LICENSE); -/* Module Parameters */ -module_param(debug, int, 0); -MODULE_PARM_DESC(debug, "Debug enabled or not"); - #define WATCHDOG_HEARTBEAT 0 /* default heartbeat = delay-time from dip-switches */ static int heartbeat = WATCHDOG_HEARTBEAT; @@ -193,6 +172,7 @@ static void usb_pcwd_intr_done(struct urb *urb) struct usb_pcwd_private *usb_pcwd = (struct usb_pcwd_private *)urb->context; unsigned char *data = usb_pcwd->intr_buffer; + struct device *dev = &usb_pcwd->interface->dev; int retval; switch (urb->status) { @@ -202,17 +182,17 @@ static void usb_pcwd_intr_done(struct urb *urb) case -ENOENT: case -ESHUTDOWN: /* this urb is terminated, clean up */ - dbg("%s - urb shutting down with status: %d", __func__, - urb->status); + dev_dbg(dev, "%s - urb shutting down with status: %d", + __func__, urb->status); return; /* -EPIPE: should clear the halt */ default: /* error */ - dbg("%s - nonzero urb status received: %d", __func__, - urb->status); + dev_dbg(dev, "%s - nonzero urb status received: %d", + __func__, urb->status); goto resubmit; } - dbg("received following data cmd=0x%02x msb=0x%02x lsb=0x%02x", + dev_dbg(dev, "received following data cmd=0x%02x msb=0x%02x lsb=0x%02x", data[0], data[1], data[2]); usb_pcwd->cmd_command = data[0]; @@ -251,7 +231,8 @@ static int usb_pcwd_send_command(struct usb_pcwd_private *usb_pcwd, buf[2] = *lsb; /* Byte 2 = Data LSB */ buf[3] = buf[4] = buf[5] = 0; /* All other bytes not used */ - dbg("sending following data cmd=0x%02x msb=0x%02x lsb=0x%02x", + dev_dbg(&usb_pcwd->interface->dev, + "sending following data cmd=0x%02x msb=0x%02x lsb=0x%02x", buf[0], buf[1], buf[2]); atomic_set(&usb_pcwd->cmd_received, 0); @@ -260,8 +241,9 @@ static int usb_pcwd_send_command(struct usb_pcwd_private *usb_pcwd, HID_REQ_SET_REPORT, HID_DT_REPORT, 0x0200, usb_pcwd->interface_number, buf, 6, USB_COMMAND_TIMEOUT) != 6) { - dbg("usb_pcwd_send_command: error in usb_control_msg for " - "cmd 0x%x 0x%x 0x%x\n", cmd, *msb, *lsb); + dev_dbg(&usb_pcwd->interface->dev, + "usb_pcwd_send_command: error in usb_control_msg for cmd 0x%x 0x%x 0x%x\n", + cmd, *msb, *lsb); } /* wait till the usb card processed the command, * with a max. timeout of USB_COMMAND_TIMEOUT */ diff --git a/firmware/emi62/bitstream.HEX b/firmware/emi62/bitstream.HEX index 3c6ecc35eaab..a0f4f570f076 100644 --- a/firmware/emi62/bitstream.HEX +++ b/firmware/emi62/bitstream.HEX @@ -1,4372 +1,6107 @@ :10801000FFFFFFFFAA9955663000800100000007AE -:10802000300160010000000B3001200100803F2D75 +:10802000300160010000000D3001200100803F2D73 :108030003000C00100000000300080010000000995 :10804000300020010000000030008001000000012D -:108050003000400050003E040812100000000000F4 +:10805000300040005000581A80121000000000004C :108060000000000000000000000000000000000010 -:1080700000000000000000000000000000004004BC -:10808000800000000000000000121000000000004E -:1080900000000000000000000000000000000000E0 -:1080A000000000000000000000000000000040840C -:1080B000800000000000000000020000000000003E -:1080C00000000000000000000000000000000000B0 -:1080D0000000000000000000000000000000080098 -:1080E000C0000000000000000002000000000000CE -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:1081100080000000000000000012000000000000CD +:108070000000000000000000000000000000000000 +:10808000000000000000014004800000000000002B +:1080900000121000000000000000000000000000BE +:1080A00000000000000000000000000000000000D0 +:1080B0000000000000000000000000000000014877 +:1080C000048000000000000000020000000000002A +:1080D00000000000000000000000000000000000A0 +:1080E0000000000000000000000000000000000090 +:1080F000000000000000000000C0000000000000C0 +:10810000000200000000000000000000000000006D +:10811000000000000000000000000000000000005F :10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000043B -:108140008000000000000000081300000000000094 +:1081300000800000000000000012000000000000AD +:10814000000000000000000000000000000000002F :10815000000000000000000000000000000000001F -:10816000000000000000000000000000000000000F -:10817000900000000000000000120000000000005D +:10816000000000000000000004800000000000008B +:10817000801200000000000000000000000000006D :1081800000000000000000000000000000000000EF -:10819000000000000000000000000000000000845B -:1081A0009000000000000000F710011400250005F9 -:1081B0004001500094001500074001D000940025B4 -:1081C00080016002D800F6002F8002E004D8374416 -:1081D0009000000000000000C005F200CC903920A3 -:1081E0000D9803D200E78037040EF1837E00DF9004 -:1081F00031E48F79037C20DF2233C00CF022300081 -:108200007000000000000000801062008024222026 -:10821000089812E2008B8120940874022E008A01D3 -:1082200022C80892023D808B60228008B0022004A0 -:1082300030000000000000008805C800A0002000F9 -:108240000B1002C000A10024094A32024800B1000C -:1082500062C009A046CC2493492A8048302262019A -:108260007000000000000000C015A812A800220045 -:10827000089002E0008980224408B012A800A940BA -:1082800022C0089082AC009B042AC408B00270048B -:10829000600000000000000000148400E980B26467 -:1082A0004DA003EA20E9C036400EB0034400FB9025 -:1082B000B2880DBC03EC085B0038602CB06340044E -:1082C0007000000000000000E001B426DD9037409F -:1082D0004FE013F280FD003DA00D700375005E00BD -:1082E0003FA40DF9035C10EB0037200F3003B800FA -:1082F00060000000000000004010AC00E980324047 -:108300000CA183E800E90032420EB003AC48E9005A -:108310003A800EA403EC00EB00B2030EB00B100485 -:108320002000000000000000C8052E8089D12040F8 -:1083300008A002C0008180225808F5022F408B005F -:1083400020C00830437C008700224008F002320041 -:108350004000000000000000E00542019A4428A20D -:10836000081802C080A180A0000830028E00AB0077 -:108370002C400A30020C00A30020440A30023800CE -:1083800050000000000000006001320096822BA225 -:10839000885A02F200058029A0087842BE008E8427 -:1083A0002F610AD8024E10A78020280878021800F2 -:1083B000400000000000000048080800F224388057 -:1083C0002C1A03C400E058A0802E30038841E30239 -:1083D0003C400620038C00E30010000E31431202E3 -:1083E0000000000000000000401D9800EE013784EE -:1083F0009FD903F048FD1037C007B0035C00F610AA -:1084000033C00DE103ED20DF103F480FF023D0060D -:108410006000000000000000A805E402CB8030C02E -:108420000CA003E202C9003A400DB6036400EB0061 -:108430003EC00FB003ED00FB013EE00CB002EA00CD -:10844000700000000000000048119400870021C067 -:10845000286002D00085002D8048F0821C00B70003 -:108460002D000B5002DC00B7A02F80287A02D20426 -:108470006000000000000000C100BE00878021E015 -:10848000286802D70084802DE04979065309B58019 -:108490002DE20B7802DE80B7902DB0087902F00053 -:1084A00020000000000000004814CC10830128C800 -:1084B000082002C20681002CC88830620E21B3A0B9 -:1084C0002CC10BB602CC00B3002CE0083002D20461 -:1084D0003000000000000000E815A800CA40B0808D -:1084E0000C2C02F800C6203F900DA0037B01EEE0AB -:1084F0003FB40FEC03E800FA003FA00CA003FA041D -:1085000060000000000000004800E300F8092600B9 -:108510000FC183E010F8403C000F8003E001F80039 -:108520003E000F8103E004F8003E100F8003D200EC -:1085300030000000000000000810E402C9003E40C6 -:108540004F906326843902B2400C91032400F90055 -:108550003E400F90032400F1003A440F9003C20400 -:1085600030000000000000008004450089402E40DB -:1085700008920A2400B931226088948A2420B90024 -:108580002E400B90022400B90022680B9002E000FC -:108590001000000000000000180524A08D842F406A -:1085A0000BD1022400B900224A0810022C40B90065 -:1085B0002E400B90022400B9002A400B9002C60006 -:1085C00040000000000000000804140085802D40D9 -:1085D000085002040CB900A0500814220400B10095 -:1085E0002C400B10020400B128204A0B1302C201D8 -:1085F0000000000000000000B80D6000C0503E8088 -:108600000FC0432000F80030002C80232000F851D8 -:108610003E148F850B2140F8703A080F8483EE03D7 -:108620005000000000000000981DC400F9043E4006 -:108630000F9023D400FD003F500F9403F404FD007D -:108640003F418FD043E50CF9023F4A0F9203E60207 -:1086500070000000000000008805D401FD003D40CE -:108660000CD013F400D500336A1CDC833400D10431 -:108670003E500C9103E6C0DDB0336A2C9C83E600CB -:1086800070000000000000003810E009F8802E00A3 -:10869000888000E800BA0022B0088E02280088A86E -:1086A0002628088A22E20088E42230088C02CE04C0 -:1086B00030000000000000000805C400B1282E4072 -:1086C000081002C400990020424810026401918001 -:1086D0002C48081002C4C08140204A081202C2017E -:1086E00070000000000000001815A494A9022E409C -:1086F0000A90026400B90082600890026600891046 -:108700002462089002E40089022240189002C60404 -:108710006000000000000000A015E600B9043E4023 -:108720000C9013E400D1C012502890034400D900EB -:108730003E40289203E402D90032428C9012E804B1 -:1087400070000000000000002801A620F9003E4152 -:108750002D9003E400F9203E404F9001A400F90061 -:1087600036408F9207E400F100BE400F9003CA002C -:1087700060000000000000002810A000C8003E209B -:108780000C8003E040F80036122C0003E0C0F80033 -:1087900032100D8403A000F8023E080F8000CA04C6 -:1087A000200000000000000028053A908E002DA057 -:1087B00080E802FA00BE40238008E802FA008A003E -:1087C000368008A002E800BA002F800BA0038A00C0 -:1087D00040000000000000002805460283002C80B5 -:1087E000082242C680B1602EF4083822CE00A300D1 -:1087F00020C0083002AC00B1002E400B3002CA008D -:108800005000000000000000A0011E0285012DC2E2 -:10881000A84402D400BD0129401868D2DC008F8032 -:1088200025CC287342DC80B5302DC01B7202E800D5 -:108830004000000000000000A8081E04C6823DE0C1 -:108840000C4812D610F5803CA00C7003DE00E790B7 -:1088500023EA047A039E00F5803DE00F7A03EA02E2 -:108860000000000000000000080DAC009C003EC0AD -:108870000F8003E410F90036010FA003C000EB00E5 -:108880003ED84EB083EC00F9003EC00FB4438206E0 -:108890006000000000000000C005DE00CF8431E071 -:1088A0000EC843D600CD8033E0CDD9033A00FF880F -:1088B00033E00FF913FE24FD803F200CF6831000F7 -:1088C0007000000000000000A8119C00850021C479 -:1088D000284082D000D500238048C9021C00B70080 -:1088E00021C00B7102DE80B5102DC028F0022A04D1 -:1088F000600000000000000010009C00960021C0F5 -:108900000A4102F5408D0021400952029820B7002B -:1089100021C00B7006DC80B5002DC0087002040079 -:1089200020000000000000006014CC10980000C07F -:10893000880482C000910420030900028A00B30A5F -:1089400020C48B3402CC00B9002CC00030021804C3 -:108950003000000000000000F815AC00DB00B0C0E3 -:108960000E9C02C500C110B2C00DB00BA708FF00DD -:10897000B3C00FFA03FC00FD003ED40CF00B2E0434 -:1089800060000000000000008000EC04ED003E40AC -:108990000F8403E540F9403E60CEB4436400FB80A1 -:1089A0003EC20FB013EC00F9023EC04FB003E1002D -:1089B00030000000000000009010FF00CE0033C027 -:1089C0000EC0077404EC0011800CCA03FE60FF00A7 -:1089D0003FC00FF0833C00DD00B3502CF0032004B7 -:1089E000300000000000000081004C048B0B22705E -:1089F00008080367208A88A200288402E700BB00D9 -:108A00003EC00BB0022C00B900226108B0036040E8 -:108A1000100000000000000080052C008B2022E2E6 -:108A20000A8C022600A9802AC008B442ED00BB00CF -:108A30002EC00B30022C00B90020800830026000EC -:108A4000400000000000000008040E018100A0C0EA -:108A5000088102440081002881083202CC00B30062 -:108A600028C00B30020C80B10020C0083012420137 -:108A70000000000000000000800D6C00C20132C048 -:108A80002E80162C08E9003A400C8003EC00F70019 -:108A90002FC00FF00B2C00D90030400CF003600306 -:108AA0005000000000000000A00DF808FF003FC0CB -:108AB0000FC217FC00F70037000F8403FC00FF0013 -:108AC0003FC00FF003ED00FD003F400FF003E8064C -:108AD0007000000000000000C005FC00CF30174807 -:108AE0000C5903B900DF2835240D82A37C80FF00D8 -:108AF0003FC80FF203E4A0EF803FE18CD843300081 -:108B000070000000000000008010ED488934A37060 -:108B100028B02360008BC0224008B4822F40BFD110 -:108B20006FF48EBD02E700BB803AE008980A280483 -:108B300030000000000000008805C4B09100A8507B -:108B400008B202C884930024490B02024C00B3040B -:108B50002CC00B30428400B3002E000AB012220158 -:108B60007000000000000000C011AC0299182A44F7 -:108B700008B882A201BB0028600AA0126C00BB00EA -:108B80006EC00AB002E400BB002A002AB00238041A -:108B900060000000000000004011E408DAC03A6004 -:108BA0000C180AEB04DB0036E00785836C00FB0041 -:108BB0002EC00FB043E400EB003E880E18031004F3 -:108BC0007000000000000000E0419C10E9003760E8 -:108BD00087F0177000CF0137C04C9803BC00FB0032 -:108BE0003FC20FF003E400FF403FE40DD903F00063 -:108BF00060000000000000004010A400F4003040BD -:108C00000FB4039900FB003EC00D04232C08FB8821 -:108C100032C00FB003E600DB103E020FB083D00479 -:108C20002000000000000000C8052C00B950A24838 -:108C30008BB0032000D7802ED80080023C00BF807C -:108C400023E88BF002F4408B400C4203B602F200A2 -:108C50004000000000000000E0054C00B24400C8E5 -:108C60000B30128C00A38024C80B000ACC00B34444 -:108C700004C01B3602C501830C2CA00B3002F80087 -:108C8000500000000000000020011E08B790216481 -:108C90000BF8024A0497812FE40A78029E00B780FD -:108CA00021E08B7882D68687842DA00B7802C000C5 -:108CB000400000000000000048080400F20030C03E -:108CC0000F30038C00E30A3CC00F18038C00F30242 -:108CD00030C01F3001C680C3003CC00F1203DA024F -:108CE0000000000000000000400DBC00FF003F41FC -:108CF0000FF003B808FF083FC00DF0033C20FF0849 -:108D00003BD20FF003F440EF003FC40FD003D00676 -:108D10006000000000000000A805E400FE0032C270 -:108D20000C300B2600FB8036C00DA003EC00FBE0EE -:108D300032D00FB8436444DB043E800FB003E2003E -:108D4000700000000000000048119C00B700A1C0A6 -:108D50008870031000B72021C0087002DC80B33097 -:108D600031C80B7402140087402DC04B7002D20032 -:108D70006000000000000000C0009620B68020E0E7 -:108D800028F8029410B78127E2097802DE00B7A024 -:108D9000A9E80B3802760087802DA00B5802F0005E -:108DA00020000000000000004814CE10B30020C4D2 -:108DB0000820028010B30022C808B002CC11B30210 -:108DC00028C00B3002040093802CD20B1002D20476 -:108DD0003000000000000000E815A800FE4032A0AE -:108DE0000CE4039880FA0037A00DE083E800FE0051 -:108DF0003A800BA0036800D8A03F900FA003FA04AC -:108E000060000000000000004800E008F8083E0094 -:108E10000F80032000F8403E000F8003E000F804BC -:108E200030100F8003E002E8003E000F8003D20004 -:108E300030000000000000000810E400F1003240A3 -:108E40000E9083A400C9803E400E9003A400F90058 -:108E50003E400C9003E400C8003E408F90030204A3 -:108E6000300000000000000080046400B940A062EF -:108E7000081002241089002E400890022400B90036 -:108E80002E52089402C40089402E400B100360103B -:108E9000100000000000000018052400B91822444A -:108EA0000A9002AC0089102EC00A9002A400B9807A -:108EB0002E60089802E60289082E400B90020600F8 -:108EC000400000000000000008040480B120A04819 -:108ED000089002240881232C500810020480B1203D -:108EE0002C48281202E48081202C400B9802420575 -:108EF0000000000000000000B80D6140F850320092 -:108F00000E8503A1E0CA003E000E8503A000F80014 -:108F10002E009CA003E000C8283E000F80032E0115 -:108F20005000000000000000981DF440F5103F4480 -:108F30000FD003F400F1103D408FD403E450F9103A -:108F40003E450F9103D440FC003FC08FD023E60480 -:108F500070000000000000001805E620CDA8334096 -:108F60008DD0032680CD003D500C9A036400F9A0FB -:108F70007A6A0F9A63E680C9803E400F900306002C -:108F800070000000000000003810E10088E03600AA -:108F900008800A2142C8002E290CA4422000B840B3 -:108FA0002E000B8102E10088023A010BC0020E0480 -:108FB00030000000000000000805C40281082440C1 -:108FC000091002040091002C404B14024400B5101B -:108FD00029400B5002F500B5002D400BD0020201D4 -:108FE00070000000000000001811A6018900264052 -:108FF000089402240189002E401A90026C00BF02DE -:109000002F400BD002F402BD802B408BD83A0604CF -:109010006000000000000000A015E400C905364112 -:109020000D1C032400D9003E422F94036400F90074 -:109030003A400F9003C400F9003E700F100328045B -:10904000700000000000000028018408F9243E4060 -:109050000F9103E400F9003E410D1003A400F90054 -:109060003E400F9003E400C9003E640F9003CA0025 -:1090700060000000000000002810A008C880320234 -:109080000F80030000C8083A10CE8403E000FC0003 -:109090003F008FC003F080FC003F180FC043CA049C -:1090A0002000000000000000280528008E00A1809C -:1090B0000BE0022800DEC2239000A002E800BA0004 -:1090C0002E800BA002E800FA002E800BA002CA003E -:1090D000400000000000000028054C00998160C09D -:1090E0000B10020C0090102AFC0B3002CC00B300D5 -:1090F0002CC00B3002CC00B3002CC00B3002CA00D5 -:109100005000000000000000A0011C82954021C01A -:109110000B50021C8090802301097212DC00B60003 -:109120002D000B4002D000B4092D004B4082E80016 -:109130004000000000000000A8083E80DD80B1E093 -:109140000FDA030F80D48039E00B7A03DE00F5805C -:109150003D200F4803D610F6813DE08F6803EA02F8 -:109160000000000000000000081DAC00ED003E0003 -:109170000F910BEC10F8003E000EB003EC00F8006D -:109180003EC04FB003E800E9013E000F9003C20665 -:1091900060000000000000000005FE20BF8133A435 -:1091A0008C19033E00CD803FE00FF8833E00EF8036 -:1091B0003FE00FF913FA10FD803FA40FD803C00061 -:1091C0007000000000000000A8119C00BF2031C208 -:1091D000085A023C0287002D940B700A1C4086102E -:1091E0002D000B4002D400F6002D404B6002EA0433 -:1091F000600000000000000000009C00B701238018 -:109200002850021C0084002DC00B30021C00B50049 -:109210002D000B4006D040B4082D800B4802C00042 -:1092200020000000000000002014CC00B308A020A3 -:1092300008118A0E0080002C900B37020C00900061 -:109240002CC00B3042CC04A3802C500B3002C8043D -:109250003000000000000000A815BC00F98032605A -:109260000CD4033C8088003ED00FF8032800FA009D -:109270003EC00FB007EC01BB803E540FB006EA04BD -:1092800060000000000000008000EE08F9803AC095 -:109290000F9003EC00F8403E580FB043E900EB4458 -:1092A0003E000F8003E00DF8003E800F8003E000D9 -:1092B00030000000000000000110DC00CF0033404F -:1092C0000CD0033C30CC003BC02DF003D802CC00C6 -:1092D0003D000CC003F400EE0237400CE003C04434 -:1092E000300000000000000081046C18838420001E -:1092F0004A10020C00A8482E6008B002E90089401C -:109300002EC008B002E810B10120800A9003A040EE -:10931000100000000000000080052C008B82220855 -:109320000890022C1488042C0808B012E8008A0067 -:109330002EC00AB002E801B9002604089002E0003D -:10934000400000000000000008040C008380A2C060 -:109350000A92022C00A2002C00083402C8008300EC -:109360002C00280002C401BA0022C0022006C2015B -:109370000000000000000000000D6C00CA00B200F8 -:109380000C920B2C04C8043A000CB403E800C8008B -:109390002E000C8033E140E80036000C8003C0034F -:1093A0005000000000000000A01DFC00FF003D0078 -:1093B0000FD10BFC01FC003F000FF003D800FD00B3 -:1093C0003FC00FF003FC80FF003FC00FF007A8066E -:1093D0007000000000000000C015F300CF80356071 -:1093E0004E68435C00E78039C00CC1037E00CF3477 -:1093F00035E14DF2037C00DF383FC80FF803F00081 -:109400007000000000000000C018C800DB8422606B -:1094100008AC0A2C008B8022300891222C90276106 -:1094200022CA88FC22BF008B622FD009B803B00487 -:109430003000000000000000C805E280A9022440BE -:109440008234420400A90028C54832024C208330EF -:1094500020C00831020D00B3202CC40B3002F201F1 -:109460007000000000000000C005AA02B9042260DC -:1094700028B2022600898802C0083112EC008B0055 -:109480002AD008B002AC002B002EC00BB002B004F2 -:109490006000000000000000C005E200E30036208C -:1094A0000EA4636E00E1C01AC10C80036870CB008B -:1094B00036800DB0034C00FB043EC10FB003D00456 -:1094C0007000000000000000E001B804DF003F0071 -:1094D0000FE803FC00FD003F002B98033A007700E3 -:1094E00027E40FF003FC00DF003EC00DF043F8005E -:1094F00060000000000000005000A468CB203A90FB -:109500000F24A3AC00E9503AC00EB4832C08EB0042 -:109510003A900EB08BEC80FB003EC00EB00390047E -:109520002000000000000000C8010A008BA020807D -:109530000DA8022C04894028E808B2022C00AF00D4 -:109540000280087C033D803F002FC008B002360037 -:109550004000000000000000E0054900034028C072 -:109560002B284A2800A10068D20A2042A401A300A7 -:1095700002400A34020D0033002CC00A3000B8004B -:109580005000000000000000B8011A00879021E49C -:109590002BC8123A0085C02B21286802B600A78488 -:1095A00023600838801E00B7802DE00878022E0066 -:1095B000400000000000000048080800C1003854C6 -:1095C0000F26838000E03428C80E2C0B8C00E300AB -:1095D00078450E30038E80F3003CC80E30039202B3 -:1095E0000000000000000000401DB800F5023F44EC -:1095F0000D9003F800BD141FC00FE1235C449F428F -:109600003FC00FF4827D40FF103FC04F7007D0066F -:109610006000000000000000A805E802CB0038C090 -:109620003CA003EC00E9003EC00CB0032004FB2189 -:109630003E804FB403CF00CB003ECC4FB043EA0096 -:109640007000000000000000C8919800870021C051 -:10965000084002DC04B5002D002D70021C1CB7026E -:109660002DC00B7202DC0087402DCA8B7002F20401 -:1096700060000000000000008000BA0087882BE036 -:10968000187822D611A4822FE00878021200B7942D -:109690006D604B7A02DE40B7A02DE00B7806E0004B -:1096A00020000000000000004814C912838228D462 -:1096B000980006EF05B1902CC109B4020C04B30167 -:1096C0006CF00B3002CC00BB002EC00B3002D20479 -:1096D0003000000000000000E815B840CA803BA040 -:1096E0004CE502F880EE003D802CE00F3880FA0057 -:1096F0003FA90FA003E800BA023E808BA003FA0442 -:1097000060000000000000004800E010F8002602A1 -:109710000F8403E024F8003E004F80A3E030F800FF -:1097200036020F8023E00408003E000F8003D200C1 -:1097300030000000000000000810E400D900B6412D -:109740004E990BA40069103E400C9003A410C90070 -:109750003E400D9203E600F9003A400E9003C20429 -:1097600030000000000000008004640081002042FE -:1097700008149A240089006E500090022410D90227 -:109780006E400B9403A700B9002240089003E0004C -:109790001000000000000000180506009900A64116 -:1097A0000A90062C00A9096E5008910284048900D1 -:1097B0000E400B9402E549B9000A400A9002C60027 -:1097C0004000000000000000080406008100224064 -:1097D0000812220481A1002C4008160204009120E6 -:1097E0002C400B12428489B1202048081002C2018B -:1097F0000000000000000000B80D6140D8003600F5 -:109800000A8003A140E8002E000C0023A140C850AC -:109810002E140D8003E000F8503A000E8003EE0392 -:109820005000000000000000881DD400F500BF407B -:109830000FD103F444DD023D502BD123F400F91085 -:109840003F400D9103A448F9123E4E1F9003A6021B -:1098500070000000000000001815F400C5043B4033 -:109860000FD803A780FD00B3680DD843A510C9A089 -:1098700032514F5A433600C9A07A680BD003C60153 -:1098800070000000000000007818CA8888020200FA -:109890008D84222342F8002204288AA2AA9488E90F -:1098A00020A80A800A214080E22E280B8002CE04E4 -:1098B00030000000000000004805C420A104A8C03A -:1098C0000B1C2A2400390420402A1E02E480B11017 -:1098D0002A48091446040081382C5B0B1002D20080 -:1098E00030000000000000001805A412A924224046 -:1098F000299002240039000258081810E601B90026 -:10990000AA44089002240089000E410B9002C6046C -:109910006000000000000000A005E400E1012A64EE -:109920002F94132402716012604D9000C502F9005B -:109930003A400F90232402C9023A400F9002E804F3 -:1099400050000000000000006801A400D9003E6043 -:10995000AF90836488F9203E62039083A400C9001D -:1099600036600F1003C400F9007E400F9003DA0048 -:1099700060000000000000002800A100C882320042 -:109980006F0003A000D84030000E80036004F8018F -:109990003E104F808B2200F80032010E8003CA0473 -:1099A0002000000000000000280138000E00A990EF -:1099B0002FE62088009E8023800AE8032800BA0052 -:1099C00018800DEC023880BA00A28008A0038A003B -:1099D000400000000000000028056C02838020C8C1 -:1099E0000B20020C01921068C03A3C02CC103B02E2 -:1099F0000CC0283C024E00B30028C0283002CA0028 -:109A00005000000000000000A001140087422BC09D -:109A10002970229C00B6002BC20A60861C00B72168 -:109A200029C00074025C00379101E0087402A800AC -:109A30004000000000000000A8081E00C78021E0D0 -:109A40002F78029E00968039E02EF803DE30F7D0A2 -:109A50002DF20078035200F7A23BE00E7807EA02ED -:109A60000000000000000000081DB400FB000CC056 -:109A70000F3003EC10D300B4C02F80036C48FB0000 -:109A80003EC84D9003A400FB201EC00FB003C206C9 -:109A900060000000000000000005FE00CC802B2CC0 -:109AA0002FF8037E006E803BA10DD8433E00FF904F -:109AB00033E00FE933FE00CFC03FE20FD803C00010 -:109AC0007000000000000000A811B44087002104CD -:109AD0000878021C00860021C0289002DC00B71024 -:109AE00021C00F7302CC0087002DC00B5002EA008A -:109AF000600000000000000000009D00A400294854 -:109B00006AF0824C00AE00A1C42974025C40A3102C -:109B100061C20B6006C80087002DC00B5002C00454 -:109B200020000000000000002014E601A3022040F5 -:109B3000283C020C00834220C8081002CD00B3006C -:109B400028F00B3002CC0183042CC0831002C8041F -:109B50003000000000000000A815AA80EB0038C00B -:109B60000A90037C22A24032480DB00B3E00FF0059 -:109B700033F40F9003EC008F023FC00F9003EA0410 -:109B800060000000000000008000E000D9023EC03C -:109B90000EB603EC00FA203EC04F2423AC60FB005D -:109BA000A6C00E9003E400FB003CC10F9003E00050 -:109BB00030000000000000000110F802CF0033E088 -:109BC0002CF013BC002E10B1642EF0023C00FF02FA -:109BD0003FC14DEC63FE00B7003BC00CD803C0444E -:109BE000300000000000000080046C28818122E029 -:109BF0000A38023C04BAC932E02084022C00BB00BF -:109C00002EC00B9C02E781BB0422C00A9902E0002F -:109C10001000000000000000800528408880228895 -:109C200028BC42AC00BA002A80088402AC00BB0009 -:109C30002EC00BB082E890AB0062C008B012E0000A -:109C400040000000000000000804000089002A8095 -:109C500028B2020C00BA0020C00800028C00B30039 -:109C60002CC00B30204C14B30020C0083002C201BD -:109C70000000000000000000000D6800C800B2C035 -:109C80002CB203AC00FA003AC04EA503BC00FF00A2 -:109C90003FC009A003E904EF00BAC00CB001C00145 -:109CA0001000000000000000A019FC00F50035C005 -:109CB000AF3403FC00F40039C00FC2037C00FF0185 -:109CC0003FC00FF003FCA0FF003FC00FF003E8050A -:109CD0006000000000000000C005FC00FF293D20DE -:109CE0008EC1033248DC8023250EF2033CC0DF84A2 -:109CF00033C90FF203FC00CF8033400CF203300075 -:109D000070000000000000008010ECC0BB602E0856 -:109D100008810220048820204808F1822DC0830099 -:109D200022D409F502FC088B01224028B402200449 -:109D300030000000000000008805CC20B3092C8210 -:109D4000081016A010900828480A32020C00BB0028 -:109D50002CC00B3002CC02930120008A3122E20198 -:109D60007000000000000000C015AC04BB002C8097 -:109D7000088602A020A0002A600AB0102C00AB0CBC -:109D80006EC009B002CC009B0022600AB002F00451 -:109D900060000000000000000015EC00BB003E3435 -:109DA00008A00B8300D9023AE02EB00B2C00F880FB -:109DB0003EC04FB003EC00CA40B2720EB00BC004FC -:109DC0007000000000000000E001BC10FB003F003C -:109DD0000DF8137048DD4037C28DF003DC00DDC89C -:109DE00013C00FF003FC00EE407F400D70033800FD -:109DF00060000000000000004010AC00FB0132C019 -:109E00000410032040E8103AC00DB003AC08F8403D -:109E1000B2C02CB033A482DA40BA400FB003D004F1 -:109E20002000000000000000C8053C08BF8022C8D8 -:109E300008B700234488D022D0087082FC00B2E02A -:109E400003F408F50237048BD122604BFD02F200C7 -:109E50004000000000000000E0054C00B310A440EA -:109E60000800024800A0422AD00130028C00B380D2 -:109E70002CC0093102CC00890022E8033802F80026 -:109E8000500000000000000060011E00B780276441 -:109E9000684A0252008C8021E0087802DE00B78018 -:109EA0002DE21939025E30859821E40B7902D80041 -:109EB000400000000000000048080C00F3203400BF -:109EC0000CB8034880E22238C00D30038C00F30048 -:109ED0003EC00D3103EC00CB0038060F3083D202B8 -:109EE0000000000000000000401DBC00FF003B011E -:109EF0000FD0039000F6003FC00FF401FC00FF01FB -:109F000033C20EF513BC00ED003FC40FF003D006C2 -:109F10006000000000000000A805EC00FB003CC051 -:109F20000EA0016401D80032E02CB5032C00F20031 -:109F30007AC00DB4032D80C90232C00CB0032A00D0 -:109F4000700000000000000048119C80B7002DC088 -:109F50000D6002D001840021C00830021D00B7004E -:109F600021C80BF4031EC0860021C0087C035204E4 -:109F70006000000000000000C0009EC0B7902DE00F -:109F8000087806D601B48221E008780A1E00B5C020 -:109F900029E809780236C1978028B00A7A02300091 -:109FA00020000000000000004814CC00BB002CE0A2 -:109FB000093582C0C1A05120E40830028C00BBC426 -:109FC00020C00B300206009318AAB02A300A5204AF -:109FD0003000000000000000E815A800FA013DACC8 -:109FE0004CEC137810F680B3900CA0032800FE0010 -:109FF0003A810DA00F2A80DE043BA00EA0033A0494 -:10A0000060000000000000004800E000F8003E0092 -:10A010000D8002E100D8483E120F80136000F86006 -:10A020003E00078003A002E8042608058003920092 -:10A0300030000000000000000810E400F9043A407D -:10A040000C12032482C90036440F10032400F900C7 -:10A0500036400490030400C90012400C900302042F -:10A06000300000000000000080046400B98122403C -:10A0700008901A2400890022680B99022400B90074 -:10A08000224068900A24008900A24008900A20001B -:10A09000100000000000000018052400B91022E0A4 -:10A0A00008940004048B0826C00B90022404B90C09 -:10A0B00024400A1002240023022A40A810020600AD -:10A0C000400000000000000008040490B12022407D -:10A0D0000812020C108102A0500B12020480B1057C -:10A0E00000480A100204A0A100284A081200020138 -:10A0F0000000000000000000B80D6140F850BA14E4 -:10A100000C85030142C85034000F85032140F8003C -:10A1100036000E80132080E0001A080C00032E0386 -:10A120005000000000000000981DE444F9103F407A -:10A130002FD113F404F5003F400F910BE440FF28AA -:10A14000BE4E0D9683D4A2DD28374A0F9383E606D0 -:10A1500070000000000000009805E410CD003F40B2 -:10A160000FD00335025D0131440FD0032400F90004 -:10A1700032600C9883E640D900366A0C9E83260133 -:10A1800060000000000000003810E00088002E0091 -:10A190000B804202808A0022208880032008B88237 -:10A1A0002221088882E24288A8222008CE020E04DA -:10A1B00030000000000000000805C4028100684073 -:10A1C0000B10028401B900204049100A0400B508B0 -:10A1D0002146085002D4008D20254A0B500242012E -:10A1E00030000000000000001811A40089046E5423 -:10A1F0000B1012A401A900A2401890162400B90067 -:10A20000234018D002F4008D40214A0BD0024604AE -:10A210006000000000000000A015E400C9003A50F2 -:10A220008F960B8402F10130488D90032410F900C1 -:10A23000B2402C9003E640D1C036502F900B6804FA -:10A2400070000000000000002801A400F9003E603A -:10A250000F99C36400D9283E400D9003A400F94033 -:10A260003E400F9003E420F9403E400C90038A00EA -:10A2700060000000000000002810A000F801360077 -:10A280008F8003E002F80432000D80432002CC00EE -:10A290003F000FC0139002DC403F104CC0230A0463 -:10A2A000200000000000000028052800BA002280DD -:10A2B0000BE820F8004EC023A008A00368008A0025 -:10A2C0002E801FA0022A068A002EA00260030A0028 -:10A2D000400000000000000028056C00B30020C012 -:10A2E0000B3D02C003230020E001B0064C008B00B0 -:10A2F0002EC04B30028E0883802CC400348E4A005E -:10A300005000000000000000A0011C80B58061C06A -:10A310000B4002D400840823C20850025EC08401AE -:10A320002D008A0802102484086D000A03122800F8 -:10A330004000000000000000A8081E00F582216017 -:10A340000F7803D604AE8031E00D58237E00C6801E -:10A350002DE00B78038E00D7823DF00C7A036A0261 -:10A360000000000000000000081DAC00F100BAD899 -:10A370000F8003E412F800BE800E1003EC00F90019 -:10A380003E005F8003E008F8043C000F8003C20633 -:10A3900060000000000000004005FE20FF803FF04C -:10A3A0000FF803D200EF84B3610CB903FE00FF8005 -:10A3B00033E00CF8132211CD903F600CE80310003D -:10A3C0007000000000000000A8119C00F5002DC0E6 -:10A3D0000B0002D40484202340085A02DC00B4009D -:10A3E000210028C2021E0486042D8808D0022A04F7 -:10A3F000600000000000000010009C00B5002D402F -:10A400000B7002F420A70421C00A5002DC00BE0039 -:10A4100021C0087012000085002D4088680A0400E1 -:10A4200020000000000000006014CC00A1002EC03D -:10A430001B0806C420800020981A1002CC00B10826 -:10A4400020000800020C0182C02CAC2890221804C5 -:10A450003000000000000000A815BC00B3003E4022 -:10A460000FBA03E502E9043290AEB003FC10FB40E2 -:10A47000B2000C800B2C0282183FA00CD0032E04DB -:10A4800060000000000000009000EC04FB013E4072 -:10A490000FB643E400F8003E80019003EC00F88121 -:10A4A0003ED00DB453E000F9403E400FA003E00061 -:10A4B00030000000000000008010DC02CD8033601E -:10A4C0002CDA03FC00EC0033400FF2037C04FE00A6 -:10A4D00032000CC8033C00CE0031800CD1032404B0 -:10A4E000300000000000000091046C0009002A64A4 -:10A4F000088E02C210A0103E100B9802EC00B900AA -:10A5000002D808BE2220008900225008A002204064 -:10A51000100000000000000080052C000B202240ED -:10A5200008A002E542AB0422180BB0026C00B30095 -:10A5300020040801020004A8402210088002200024 -:10A54000400000000000000008040C0883002840C0 -:10A55000080402C402A8002C000B1202CC00B000B8 -:10A5600020C04030020C008B00A8C008300202114D -:10A570000000000000000000800D6C00C9003340A6 -:10A580000CB003EC02EB0032400FB0036C00FA0099 -:10A5900032000C80032080C80030000C80032003B0 -:10A5A0005000000000000000A019FC00FD003F402A -:10A5B0000FC213F000F4003F004FD403FC00F5007D -:10A5C0003FC08FF003FC40FF0037C02FF003E806C8 -:10A5D0007000000000000000C005F000CC00330057 -:10A5E0000ED00B3300CC0033E00FC0837C00CF20B3 -:10A5F0007B098CF803FE50CF383FE10DC203F00019 -:10A6000070000000000000008010E2009808208028 -:10A61000089802200088D022E00EB4227D199F699C -:10A620002E900830922881DB642EE18816A2E00487 -:10A6300030000000000000008805C80090242001C0 -:10A640000810160082830128C10B02820CE0A310BF -:10A65000280E1B9202848493202EC0083102E2014E -:10A660007000000000000000C015A81098002280B3 -:10A6700008900200608A102AC00A20026C18BB00F1 -:10A680006E602B900246208B002EC208B182F0042F -:10A6900060000000000000004011E402CB00B24066 -:10A6A0002C920327008800BAC00F88032C00EB040B -:10A6B0003AA0CF2CA3ED009B003CF02D8C33D004AE -:10A6C0007000000000000000E001B404EF003FC093 -:10A6D0000D5103F000F18137C00EF4039C10CF0040 -:10A6E0003D800CEC07B808FF021FC40FC803F80038 -:10A6F000600000000000000040109E00C3003840D1 -:10A700000C9203A480FB203AC00D94032C40FB0064 -:10A710003E010F8003E500EB003AC00D840B1004EE -:10A720002000000000000000C8052C088B0222C099 -:10A7300008920321008B4822C00BB7023D403F0125 -:10A7400022740B90022804BF00B2C00B85023200B5 -:10A750004000000000000000E005400180002800EB -:10A76000082C128840B04008C00B18020E00B3003D -:10A7700028201130020C00B3002400090006380024 -:10A78000500000000000000020011200848021A081 -:10A790002868123A00848025E08B58021E40B78258 -:10A7A00021A60B78021A00B78021200B580208005E -:10A7B000400000000000000048080800C8213809D7 -:10A7C0000C28038001F10038C00D85020C00FB004D -:10A7D00038850F10038C00EB103CC80D30031202BB -:10A7E0000000000000000000401D9800FC013F80B8 -:10A7F0000F6803D040FC003BC00DC003FC20FF00ED -:10A800003BC50FF00BB440FF183F000FF103D0061B -:10A810006000000000000000A805E400EB00B0416B -:10A820000CA003E004CA04B0E00EB003EC80CB201F -:10A8300032810CA003EE00DB003E000EB0032A00C4 -:10A84000700000000000000048119404870021C03F -:10A85000486002F000870021C0087002FCA0832835 -:10A86000A380086002DC0087202DC00B7002120458 -:10A870006000000000000000C0009C02A380216076 -:10A88000086802D200878021E0297802DE80879064 -:10A8900021A0194802FE0097802DE00A388230007E -:10A8A00020000000000000004814CC01838020C07C -:10A8B000082042C0308370A0C0893402CC028300DB -:10A8C00060C0290002CE0083002CC80BBC02120419 -:10A8D0003000000000000000E815A900EAE2329014 -:10A8E0002CE003FB02CEC032800FE403E8008A00B4 -:10A8F00033880D64C3FA00DA003D900EE00B3A0491 -:10A9000060000000000000004800C024F8083E126B -:10A910000FC003E048F0003E000E8093C000F80036 -:10A920007E010E80C2E040F8007E008F8403D200DA -:10A9300030000000000000000810E500C1013248AE -:10A940000C9803E640C90032400F90036600C9002E -:10A9500018610C90036420F9053E400C90830204BA -:10A9600030000000000000008004662089002052B2 -:10A970002810C22602A90022400B900A2700A90035 -:10A9800022700890022408B9002E400A900A200084 -:10A990001000000000000000180524028D00234074 -:10A9A00008D1028420890022600B11F224B08100BA -:10A9B0002A460890426408B9002E40089202060018 -:10A9C0004000000000000000080414808520234897 -:10A9D0000852028408810020400B12020480A1204A -:10A9E0002849289002040031202E4008320202013A -:10A9F0000000000000000000B80D6000C850B21454 -:10AA00000CC003A140C800B2000785032140C85014 -:10AA10003A150C85036140F8513E002C85032E0346 -:10AA20005000000000000000981DC448F9103E448A -:10AA30004F91037400F5443E400FD103E440F910F8 -:10AA400037440FD003D400F9103FC00FD103E606FE -:10AA500070000000000000001815F6A0DD8C3378AF -:10AA60000EDA033500CDA033400DF80B3681E980B6 -:10AA700033700C9103E440F9C03EC00FDC03C60004 -:10AA800070000000000000003810E104B840203CD5 -:10AA90000C850202848A402200088F822300B8E8D5 -:10AAA0002220088802E200B8D02E000B8C02CE04CF -:10AAB00030000000000000000805C400910060485C -:10AAC0004B1002048A814060404910028DA0A141D0 -:10AAD0002050091222C480B1202C404B3E02C201FA -:10AAE00070000000000000001815A408B904A04080 -:10AAF00048B0022400890082400890A6A400B9044E -:10AB00002254299502E540B9006E400B9202C6041A -:10AB10006000000000000000A005E4009100324049 -:10AB20000F90092400899032400D9403A400E9029B -:10AB300072600D9403E401F9013E600F9003E80494 -:10AB400070000000000000002801A440F9003E4011 -:10AB50004F9003E710F9803E400F10136400F1009E -:10AB6000BE400E9003E608F9013E640F9003CA0050 -:10AB700060000000000000002800A000F80032087B -:10AB80000C010B2040C84032000E84832000F804E2 -:10AB90003E040F80032100E8003E100F8803CA0422 -:10ABA0002000000000000000280538003E0423803B -:10ABB00008EC123944A600288108E0003808BA00E1 -:10ABC0003F800BA002A8008A022E800BE002CA0080 -:10ABD000400000000000000028054800310024D09B -:10ABE000083E12AE0881A02CC00A38004C00B30009 -:10ABF0006EC00A30020C00A3006CC00B3002CA0009 -:10AC00005000000000000000A0011800B51025C091 -:10AC10002860129010A5082DC20864225818B700A9 -:10AC20002D800B7902BEC087016DC00B6002E80069 -:10AC30004000000000000000A8081E00F584352038 -:10AC40008C18029210C5803D600EC80B5A0877F32D -:10AC50003DA00FF8031EB0E7853DE00F7803EA0240 -:10AC60000000000000000000081DAC00F104BA0163 -:10AC70000FA0436009E10038400EA003A814FB2098 -:10AC80003A800FB41B4C80FB293EC00FB023C20694 -:10AC900060000000000000000005FA00CD803BE0ED -:10ACA0004EF803F202D4813BE08E98073E44EF91C8 -:10ACB0003FE04FFC07EED0CF9833E40FF803C0001D -:10ACC0007000000000000000A801980085102DC44D -:10ACD0000D1102F000852031C40B7B003840D710E5 -:10ACE0002D800B7062FEE1871439C00B6002EA040C -:10ACF00060000000000000000010BC40A5002940DA -:10AD00000B5082DC4084042DC00B10065844A71061 -:10AD10002D800B7102DC00870421C20B5002C01091 -:10AD200020000000000000002014CC0AA1012C40EB -:10AD3000891802C100A10820C00B34064000930509 -:10AD40002C140B3C86CE10830128F10B1402C8048E -:10AD50003000000000000000A815A000ED003AC07F -:10AD600007BC63ED0081403EC00E88036400EF0025 -:10AD70007E500FF002FD42CF0072C01FB403EA0400 -:10AD800060000000000000008000E80099003EE044 -:10AD90004FB483ED9009403EC00FA183A801EB01A1 -:10ADA0003E000FB113EC0CFB003AC05F2023E00023 -:10ADB00030000000000000000110F800FD043FB06A -:10ADC0000D60033E00CD0033F00FF201F000FF03F1 -:10ADD0003F030FF001FC00FB0233C20FF0E300441D -:10ADE000300000000000000081046A00B9022EA0BB -:10ADF0004AAC020E80F9C036E10BA0022A08BB0063 -:10AE00002E200EB002EC00EB0022C08BB0022040DE -:10AE1000100000000000000080012300A90028C0ED -:10AE200009B2226C4089892AC00B14062600AB02A5 -:10AE30006EE009B0066C00B30222C00BB002200025 -:10AE4000400000000000000008040800B1002CC011 -:10AE50000A30022C00BB0064C00B320A0800330029 -:10AE60006C80023046CC18A30020C00B28020211CF -:10AE7000000000000000000000056800E90038C183 -:10AE80000DB10B2C0089003AC00B90036000FF024B -:10AE90003E800FF003FC80FF0032C08F800B000368 -:10AEA0005000000000000000A011D800FD043FC0C9 -:10AEB0002FF203FC11EF003FC00FF4437000FF00BE -:10AEC0003F0046F003FD00EF003FC00FC003E8065F -:10AED0007000000000000000C005FE00FF803DE0A3 -:10AEE0000CF913DE007F80B3E00FFC03BE40CF807F -:10AEF00033F00FF8037C04CC8033A00CF00B30014E -:10AF000070000000000000008010E02088002E206B -:10AF1000088212E080A88122020B80022080A88093 -:10AF200022080B80022C028804AA2008B002200408 -:10AF300020000000000000008805EC00A3082C8021 -:10AF4000083202C420A30028400B92028400A90109 -:10AF500028C81B1282CC40A80024E00A30422201FB -:10AF60003000000000000000C011A880A8022E40A0 -:10AF7000688010C800B8402A900BA0002800AA08DA -:10AF80002A020320028C00A8882E200AB002300476 -:10AF900060000000000000004015E804FA003C409A -:10AFA0000CA003E800EB003AC00F2053A800E340D8 -:10AFB0002A400FA0036C00A88034201EB0031004A8 -:10AFC0007000000000000000E001B4009D913F808F -:10AFD0000FDA23F400CC20370007D0137400BC0034 -:10AFE000B7800BD0437C00DC043B006DF003F8001D -:10AFF00060000000000000004010A800FA803A0045 -:10B000002CA00B2002CB623E500E88032000D910EA -:10B010003E708C8033EC80D8403A020DB0031004AF -:10B020002000000000000000C8010C00398022C090 -:10B030000C9D822C10D0402EA008B8034E028A40EE -:10B040000EA00DB0033D00D09036100BF002B20000 -:10B050004000000000000000E0054C00B10060C0AE -:10B060008A18028C0880400CA0023002CE00824870 -:10B070002C802B30068C008102209009B002380011 -:10B08000500000000000000020011200B690A33024 -:10B0900008E822B21487802D600849121261959049 -:10B0A0002D610A48161E80958025200B78028800A5 -:10B0B000400000000000000048080C00F100288C4F -:10B0C0008E1003848080002C020A9A02E400D000D3 -:10B0D0003E800B91038E80C20838800DB0031202AF -:10B0E0000000000000000000401DB000F6003F44DA -:10B0F0000F21137800FF003DC00FE0037800EF043C -:10B100003F408DE803DC04F6003F000FF083D006DB -:10B110006000000000000000A805E800E880324060 -:10B120000F880B280078023E800E28032800CA8072 -:10B1300032000FA003EC00C98032800FB0032A0058 -:10B14000700000000000000048118C008F00A180FA -:10B150000B70421400B7002D410B50421400A500A3 -:10B16000A1C00B5002FC80A50021000BF2021204CA -:10B170006000000000000000C000BA00A480293078 -:10B180004B48065208B4802D200B48423200848080 -:10B1900021200B4812DE40868129A00B780A30005E -:10B1A00020000000000000004814CC00830520E0CF -:10B1B0000B34026C10B3002CC00B364A0D0DA300EB -:10B1C00020C00B3482CC02A20028000B30021204F3 -:10B1D0003000000000000000E815A920EA4030A07F -:10B1E00007A0436940FA003C800FA0030840CA0052 -:10B1F00030A00FA403E800CE003B980FA0033A0450 -:10B2000060000000000000004800D200FC083F0081 -:10B210000BC203B000FC003F000FC003F000FC00B5 -:10B220003F040FC003E000F800B6020F8003D20015 -:10B2300030000000000000000810E400D9003E6863 -:10B240004C9101E408C9003E402C9203E402C9A0DD -:10B250003E700E9003C642C9003E400F1003020428 -:10B2600030000000000000008004640089860E6049 -:10B27000089802E40889102E60089002E400890C06 -:10B280002E60089002E68889002E400B9002A000F4 -:10B290001000000000000000180524009D102F4041 -:10B2A00028D006F402AD002F6008D002F4008D0013 -:10B2B0002F400AD002E40089002E600B90020600A5 -:10B2C00040000000000000000804340085002D400C -:10B2D000085802D400A5022D40085000D400850073 -:10B2E0002D40085402C48081002C600B140282019E -:10B2F0000000000000000000B80D6140D8523E0080 -:10B300000C0503E140E8043E140C8503E140C8004D -:10B310003E140EC003E000C0023E004F80232E0307 -:10B320005000000000000000981DF400F9013E40AC -:10B330004F9013E400D9001E400F9003C410F10099 -:10B340001E400F9003E4E0FD283F400F9403E60603 -:10B3500070000000000000001805A400FD003F4040 -:10B360004D5002E4009504334028D003F400FD0062 -:10B3700033400F91033400CD4033400F98810600D5 -:10B3800070000000000000003810E010B8002E002F -:10B390000B8002E010B8002200088002E000B80034 -:10B3A00022000B8803C280888022000B8C020E04CE -:10B3B00030000000000000000804C400B1002CC0F0 -:10B3C0000B1002C400BB002240081002C401B900E7 -:10B3D00020401B90020422890020600B128202018F -:10B3E00070000000000000001815A444B9002EC031 -:10B3F0004B9002E410B9020240089142E400B98087 -:10B4000022400B9202C400994022404B9012060445 -:10B410006000000000000000A015E600B9013E58E1 -:10B420000D9003E600D10032600C9802E640F9006E -:10B43000B2400F18032400C98032500F9023280413 -:10B4400070000000000000002801A400F9003E4246 -:10B450000B9003E708F900BE480F9003E400F900E1 -:10B460003E400F9803A400E9A0BE400F100B4A0015 -:10B4700060000000000000002810A000D8013E007D -:10B480000F808B2000F8203E010F8103E000F808B8 -:10B490003A000C8003E000D84032000F80130A0409 -:10B4A0002000000000000000280528008A802F915D -:10B4B0000BEE022801BE0020800BA002EA80B648F5 -:10B4C00022800DA002FA028641A3A60BA0030A0067 -:10B4D000400000000000000028054C0093802CC0B4 -:10B4E0000B30020C10B30028C00B3802CC00B300A4 -:10B4F00028C0093002C601836020700B300A4A0060 -:10B500005000000000000000A0012E8885082D805A -:10B510004BF8061C80B70021C00B5002D400B600C7 -:10B520002960097002D0A08D0021400B3202280052 -:10B530004000000000000000A8081E00D5803DE08B -:10B540008F78031E84B7823D600F5903DE00F780B9 -:10B550002960157803DE00C78031600F7C036A0222 -:10B560000000000000000000081DAC40E9003E8023 -:10B570000FA003ED30FB0036C10F9603E400B300CB -:10B5800034400FB783EC4021003E400FB003C206A9 -:10B5900060000000000000000005FE00FF8133E0B5 -:10B5A0000FF903DE20CF813FE00778033E00FF80E4 -:10B5B0003FE004F813FE02DE8033600FF803000062 -:10B5C0007000000000000000A8119C00B70021C41A -:10B5D0000B5A02DC4886502DC00B31029460B4181F -:10B5E0002D40487002E800A51021400B71022A048A -:10B5F000600000000000000000009C00BD0021422F -:10B600000B7002FC02850025400B50029C00B70025 -:10B610002F40287102DC00A60021C00B7002000040 -:10B62000200000000000000020146D80B120A05018 -:10B630000BB206CE00A0342EF00B18028520B34AC0 -:10B640002C54883802CC10A10020B00B3002080422 -:10B650003000000000000000A815BE80F308105460 -:10B660000B8813FF00C0803E640FB4830700F9C04D -:10B670003EF00CFC13F400EA0032700FF00B2A04C9 -:10B6800060000000000000008000EC00F9003E10A7 -:10B69000079103ECC058003E440F9203E400F90008 -:10B6A0003EC08FB303E000BB00BE440FB003E00018 -:10B6B00030000000000000000110FC02CD0433E067 -:10B6C0000CC0033C08FE0033602CD002B480CF00D5 -:10B6D0003F5207F013FC00CE1033420CB003C044BD -:10B6E000300000000000000081046C0089002AB0D6 -:10B6F0000888022C00BA0036440890002600DBC0FF -:10B700002E400BB002EC0083C028400AB002E0409B -:10B71000100000000000000080052C008B002208B3 -:10B720001AA2022C10B92022400830022C04AA547C -:10B730002EC00BB012CC008B08224008B002E000F3 -:10B74000400000000000000008040C0083042A00F0 -:10B750000A08820C00B8006440083002A400B0005F -:10B760002CC08B3010C8028B002A400A3002C20164 -:10B770000000000000000000000D6C00C900320055 -:10B780001A82033C00F90032400CD103AC00EB00FC -:10B790003E400FF003ED00C30032C08CB003C00385 -:10B7A0005000000000000000A019FC00F5003F0060 -:10B7B0000D804BFC007C003F400FD20B7400DF007B -:10B7C0001D408FF003FCA0FF003F800FF003E80650 -:10B7D0007000000000000000C005FC00DF843BE0BA -:10B7E0000FF80B3E00EC8033E10C30033C80CF4877 -:10B7F00037C00E4003E0C0C791B3040CF003300023 -:10B8000070000000000000008010EF048B802241D7 -:10B810000BB0822E008880A2E00AA292AD808742FF -:10B8200023D88AAD02E0C08B00204C48A40220043B -:10B8300030000000000000008805CC58BB002880C4 -:10B840000BB2422400A8002AC00A10020460A32000 -:10B8500024D20800428C839B0120490833C2220174 -:10B860007000000000000000C015AC00AB8822A0F2 -:10B870000BB802260CA8002AC00A9202A400AB064C -:10B8800022C00AB002E8009B00024008A042300437 -:10B8900060000000000000004015EC00D3803AE09A -:10B8A0000F18010600E83038660EB8032A40EB0096 -:10B8B00036C10E9603E280DA0832802CBB031004F6 -:10B8C0007000000000000000E0019C00DF003FC0AD -:10B8D0000FD003F400DC8037600FE803FA00DF01CB -:10B8E0003FC00FC043E64CEFA03F440FA003F80059 -:10B8F00060000000000000004010AC40DB0036801B -:10B900000C98032600F8003EC00E18038402E301E1 -:10B9100038C10EB403AC80CA183AD02C30031004DE -:10B920002000000000000000C8053F40B9882E80BC -:10B9300008BC02A300B0000EC008B00620008F04AF -:10B9400023C108B9122F008380364008AD023200AF -:10B950004000000000000000E0054C00B2002CC0D8 -:10B96000093202840033002CB20A36128C08930587 -:10B9700020C00B1802ED0091806A00081002380008 -:10B98000500000000000000020011E00B7802DE0E4 -:10B990000978029740B4802FA008E8020E409782F1 -:10B9A00021E09868821A189D902DA118580208006D -:10B9B000400000000000000048080CC0F3003EC03A -:10B9C0000DB0438440F0003C820E38128C44F330BA -:10B9D000BAC11E10478E22D11038180C30831202C3 -:10B9E0000000000000000000401DBC40FF003FC000 -:10B9F0000EE003F440FC003DC40FD001F441EF1809 -:10BA00003FC41FF003F848EF1433800FC103D00682 -:10BA10006000000000000000A805FC40FB003EC0E4 -:10BA20000F98032400CB003E400FB003A800DB2892 -:10BA30003EC41F9023EC00CA0032E00C9003EA00E1 -:10BA4000700000000000000048119C80B7002DC06D -:10BA50004B50521400D4012D800B6002D800A72057 -:10BA60002DC50B4016DC00840023C0084002D20420 -:10BA70006000000000000000C0009E80B7802DE044 -:10BA80000B780A960094802D601B7806D200A78060 -:10BA90002DE00B7822DE00878221E0085802F000BA -:10BAA00020000000000000004814CC00B3E42CC0CB -:10BAB0001B2102810090002CC80B3902CE00A3008C -:10BAC0002CC00B3002CD008B2020F008B202D20433 -:10BAD0003000000000000000E815A800FEA03F8232 -:10BAE0000FE8039830D6003FA00FE003BAC0FA0079 -:10BAF0003E800FEC33F802CE00B3B82CEC83FA048E -:10BB000060000000000000004800E018F8403E001F -:10BB10000F80026084F8052E048F8041E0007802D7 -:10BB20003E000F8183E020F800BE020F8003D200A8 -:10BB300030000000000000000810E618F9203E4028 -:10BB40000F9C03E440C90032610C9013C408C90182 -:10BB50003E410F18032400C9A032400F984302044D -:10BB6000300000000000000080046500B1C02240E9 -:10BB70000B9C02E71089002844089422E4108900F5 -:10BB80002E400B9F222660898022400B910A2000C4 -:10BB9000100000000000000018052480B9002EC02D -:10BBA0004BB402E42089202240089402EC00890072 -:10BBB0002E410B90020400894022400B90020600A7 -:10BBC000400000000000000008040400B104204010 -:10BBD0008B1002E40581002840281212C4828120C3 -:10BBE0002C480B120A0482810020480B1202020129 -:10BBF0000000000000000000B80D68A0FA023E142A -:10BC00000F8503E000C80032000C8503C140C85313 -:10BC10003E140F80030148C050B2140F85032E0359 -:10BC20005000000000000000981DE400FD00BF402F -:10BC30000F5013D402FD002FC00FD103F440F910B0 -:10BC40003E440FD103F440FF00BF440FD103E6068A -:10BC500070000000000000001805E6A0FD013E4451 -:10BC60000FD103D400C50033410FDB032720D9E0F7 -:10BC7000B2700DDA83F640CF1032782DDA03060069 -:10BC800070000000000000003810E100B8002E280D -:10BC90000B8842E010D80022000B8C0A230088C0D9 -:10BCA0002228088402C28080A0223048AA820E0482 -:10BCB00030000000000000000805C400B1002C4066 -:10BCC0008B1202C400990228408B160284819130A5 -:10BCD0002058091002C5008100644D083402020199 -:10BCE00070000000000000001815AC0CB9042E48CC -:10BCF0000B9406E4009940AA400B9222A40089000C -:10BD00006040089402E4008980A65008920206046C -:10BD10006000000000000000A015E400F9983E4813 -:10BD20000F9803E520D9003A640F9483A4C0D90288 -:10BD300072404D9042E482C94036400C900B28047A -:10BD400070000000000000002801AC28F9883E4087 -:10BD50000F9913E700F9C036600F90036600F100F9 -:10BD60007E400F9907E460F90038400F9803CA003D -:10BD700060000000000000002810A000F810320051 -:10BD80000F820B2100E80036040C8603E100D80086 -:10BD900032000F80036100C80032000F00030A0464 -:10BDA000200000000000000028052820BE0022809E -:10BDB00028EC021904820003800DE482E8008A0165 -:10BDC000AA808BED823B808E9036800BE0034A0088 -:10BDD000400000000000000028054200B38020C0A1 -:10BDE0006B341640C08310247288B002EC008300CC -:10BDF00024C00B04026F099B0024C00B30020A0010 -:10BE00005000000000000000A0011400B78023E4EF -:10BE100028788274148F0061E0095012DC048722B4 -:10BE200025C81B780214009440A5C00B602268004E -:10BE30004000000000000000A8081220B780B1E018 -:10BE40008FF8031202E78035E00C6806CFC2CFB04E -:10BE500025F40F58035A02D58075FA4FF8032A02C9 -:10BE60000000000000000000081DA590F3003DC088 -:10BE70004FB013A804FB003CC00F8043EC80EB6084 -:10BE80003AC90F3003EC00E9003EC80FA003C20618 -:10BE900060000000000000000005F600EE803FE0BA -:10BEA0000D8903D240E58139E03CF907FE00CF88D7 -:10BEB0003FE00FE803F208CE8033E00CF803000007 -:10BEC0007000000000000000A8119444C6002FC0BC -:10BED000085802D0C485242190085412DC8207003F -:10BEE0002DC00B7006D4008E4821C00A60022A04BF -:10BEF000600000000000000000009C00A7402DC072 -:10BF0000084202D000AD0029C0087022DC2887005A -:10BF10002DC00B400298009700A0C40870020000DA -:10BF200020000000000000002014CC0893002CE04A -:10BF3000083C22C10081002080881502CE30830099 -:10BF40002CC00B3C02CC0493C020F44A0C820804A1 -:10BF50003000000000000000A815A000E3C01FE0B2 -:10BF60006C1083E004EB003A524CB403FE02CF00A5 -:10BF70003FC00F8443E102D8C233C00C840B2A04B3 -:10BF800060000000000000008000E900EB103EC4EB -:10BF90000E9403E400FB183EC20FB603EC00FB0155 -:10BFA0003EC00F3503C428EA423EC00F8103E000C3 -:10BFB00030000000000000000110FC40FF0033C012 -:10BFC0000CC0A33028CDA033C00CE8030C00EF0553 -:10BFD0003DC00CCA833C00CD083FC20CA003C04446 -:10BFE000300000000000000081046700BB8020C01A -:10BFF00008AA020800A10134D108A4122C008B0069 -:10C000006EC088B2022C0889802EC00AA803A04006 -:10C01000100000000000000080052C00BA80A2C0C3 -:10C0200008A80AA0008B00A2C0481102AC048B0033 -:10C030002EC00080122A088B142CC0088802E00051 -:10C04000400000000000000008040C00B20022C004 -:10C0500008B2128000AB0124C00800020C04830067 -:10C060002CC00830020700820024C00808028201A8 -:10C070000000000000000000000D6C00FB0032C05A -:10C080000CA203A000C90032C02494033C02CF00DC -:10C090002FC004800B0902CB013FC02CA003C003BA -:10C0A0005000000000000000A019DC00FD023FC0AD -:10C0B0004FE4137000FD003FC00FC283FC00FF007F -:10C0C0003FC00FF003FC00FF003FC00FC003A806F5 -:10C0D0007000000000000000C005FC20EF303F04AD -:10C0E0006C88033A42E4913F0D0D48033CC0FF02C7 -:10C0F00033440CF403FC82DF3033600DF103300075 -:10C100007000000000000000A010ED008B702E18E1 -:10C1100088224A2C82EA262E0C0BB8423D80BF9022 -:10C120002A5428B402CD00DB402A4A483002A00439 -:10C1300030000000000000008805CCB0A3006C10A7 -:10C140000900822082A0202C884B80000C40B30183 -:10C1500020480B36028CE0836424402832022201FE -:10C160007000000000000000E011AC008B002E0009 -:10C17000098080A600BA112E880BB0002C00BB02EB -:10C18000024009B002EC008B002CC808B882B00451 -:10C1900060000000000000004015EC00EB003E9243 -:10C1A0000D80030A20E9003E504580012C04F30075 -:10C1B000906009B003EC008B0226508DBC03100484 -:10C1C0007000000000000000C001BC00FF023F80C2 -:10C1D0000EF9027C22AF003F6003C00BFC10FF0091 -:10C1E0003F4A4EF003FC00F7002B600F7003F8008D -:10C1F00060000000000000004010AC00FB00B00038 -:10C200000F820BA900C90032D20FA083AC00CB1063 -:10C210003E400CB003EC00DB0032502C95031004C0 -:10C220002000000000000000C8053C04BF0222807E -:10C230000B98002900CB4022C00B24023C088F50F1 -:10C240002E500DF002FD428F5822E048B502320018 -:10C250004000000000000000E0056C00B300244036 -:10C260004B940049009080043009000E4C008380FC -:10C270002CC00930226E42838020480838023800E2 -:10C28000500000000000000020011E00B780652063 -:10C290000B78827A088CC025A34B78025E048784D1 -:10C2A0002D61897802DE048780E96208780208003F -:10C2B000400000000000000048080C00FB0034486B -:10C2C0000F3B034800934834500D00036C00C3102B -:10C2D0001CC2053003CC40CB0032400C20031202BC -:10C2E0000000000000000000401DBC20FF010340D2 -:10C2F0000FF0231C00FF003B800FB0233C02FF50D7 -:10C300003DC40FF103EC00EF00B7C00FE103D0060E -:10C3100060000000000000008805EC00FB023EE029 -:10C320000C80034802C88132000F9042ECA0FB1041 -:10C330003EE00CB103EC40FB1032401FF0032A003A -:10C34000700000000000000048119C00B7242D8000 -:10C35000087042D8108C0221400B5002DD00E7200B -:10C360002F40087002DC05B70021C00BF002120458 -:10C370006000000000000000C0009E00B7902F4049 -:10C380000A68027A00978021E00B7802DE00B7800D -:10C390002DE0087806DE00B7A021600B784230005F -:10C3A00020000000000000004814CC00B3002CC0A6 -:10C3B0000A3402C800834A20F80B3102CC00A300E3 -:10C3C0002CC0083002CC00B30020B20B2042120473 -:10C3D0003000000000000000E815A800BA003F8807 -:10C3E0002EE0435988DE0033B00F6C03E800FA00FA -:10C3F0003E802CA003E804FA0023B80FE08B3A0437 -:10C4000060000000000000004800E004F8013E0069 -:10C41000098221E000F840BE140F8481E000E800AA -:10C420003E001F8003E000F800BE000F8803D2002A -:10C4300030000000000000000810E400E10032407D -:10C440000C9043E420D9003C440890032400F901F7 -:10C450003E480F10432500C900B2400C900302046F -:10C46000300000000000000080046400B900A0401B -:10C47000089802E608A9602E490894022400B90031 -:10C480002E700B900226028900A0400A900A20001C -:10C49000100000000000000018052400B900224030 -:10C4A000089804E60099802E400AB1022400B900E1 -:10C4B0000E400B900A0400810122C0081002060001 -:10C4C000400000000000000008040480B120224861 -:10C4D000081806C400A1002C482A30020480B122AA -:10C4E0002C480B12020580816022500A14020201BE -:10C4F0000000000000000000B80D6140F850321448 -:10C500000C8503E140D8503E140E800B2140FA0008 -:10C510003E940F85032000C00032000C80032E03E0 -:10C520005000000000000000981DE441F9103D4556 -:10C530000FD003F400FF003F450DD003E440F91095 -:10C540003F440F9103E442F9103F400FD403E60645 -:10C5500070000000000000001805E400F9003E40F3 -:10C560000CD003F4088D023F400FD003E400CD004F -:10C5700033400C90032400F90032404C982306000D -:10C5800070000000000000003810E000E8002E00FD -:10C59000488002E800D0002E800B8012E002880064 -:10C5A000A2000A80122200B881222808CF020E04BD -:10C5B00030000000000000000805C400B1002C405D -:10C5C000281002C40081002C400B1002C40091000E -:10C5D000264009100254A0B52CA542085082020141 -:10C5E00070000000000000001815A400A9002E50E3 -:10C5F000589002E4809B002E458B9202E400990043 -:10C6000026440B90026408B500254A08510206042E -:10C610006000000000000000A015E400F9003E5496 -:10C620000C9043C400C9903E700F9803E400D900F9 -:10C6300034604D900A6400F90036402C9E032804B3 -:10C6400070000000000000002801A400F9003C4038 -:10C650000F9C03E630F9003E620F9003E400E9000E -:10C660003A404E9003A400790C3A400F901BCA0048 -:10C6700060000000000000002810A000F8003E004C -:10C680000C8113E108C84832003C8003C000F01060 -:10C690003E060C8003F008CC0033040CC0030A04EF -:10C6A000200000000000000028052800BA002E80AD -:10C6B00008EC42FA208E0023A008E842E800BE8081 -:10C6C0002F8008A002E800DA00228048E0020A0079 -:10C6D000400000000000000028054C00B3002CC002 -:10C6E000093482C900838020F0083082CC00B380F6 -:10C6F0002CF008B002C1208000A0320800020A001D -:10C700005000000000000000A0011CC0B7012FC8AD -:10C71000895002D80287C421E2487082DC00B70049 -:10C720002C40087202CE00970823C008700228002F -:10C730004000000000000000A8081E00F7E13DE8EE -:10C740002D6803F200C780B0E0086803DF80F68040 -:10C750003DE08C7E03DA00CC8031200CC80B2A022D -:10C760000000000000000000081DAC08FB003CC0F9 -:10C770000E8003E008F9003E400FB002EC00FA0022 -:10C780003E402FB003E400FB003CC02FB003C206C4 -:10C7900060000000000000000005FE00FF927FEA3C -:10C7A0000CF803FE00CCA03F200DF9033E00CF8023 -:10C7B00033600FF803F600EF8433E02CC803000069 -:10C7C0007000000000000000A8119C00B7002FC8F6 -:10C7D000085402D800D6042D010869021C00850007 -:10C7E00021430B70039AC08C00A30208F1022A04B3 -:10C7F000600000000000000000009C00B7012DCC8C -:10C80000087002D40094282DC208C2025C00860081 -:10C8100021800B7102DC00A71021C00848024000F3 -:10C8200020000000000000002014CC08B3002CF011 -:10C83000080502C02090802E000800824C02800073 -:10C84000A0610B3002A0008000A03088B10A48042B -:10C850003000000000000000A815BC00FF002DC83B -:10C860000C3D03E400DB023EF02C904B7C00C10049 -:10C8700032204FF013E000E80132008CAC036A0470 -:10C8800060000000000000008000EC00FB043EC2DD -:10C890004FB003E004FA403EC24E9823AC10F800BB -:10C8A0003E5007B013AC00FB003EC20F9203A00045 -:10C8B00030000000000000000110DC00CF003FC08D -:10C8C0000CC8233682CF803F800CE003EC00F920B7 -:10C8D00033C00EF003F810DC0033004CE8210044B4 -:10C8E000300000000000000081046C00AB002EC08E -:10C8F0004A8D4221008B422ED208B003EC00B8884A -:10C9000034620DB002E4008B0022C008900A20407F -:10C91000100000000000000080052C008B002EC0DD -:10C9200008A0020D0089102E08289202EC04BB001A -:10C9300022A008B0026402B30220C008A202A00034 -:10C94000400000000000000008040C00A3002EC0FE -:10C950000A90220C1080002C00180282CC00B0003B -:10C960002640093002C820800020000810068201FD -:10C970000000000000000000000D6C00CB002EC085 -:10C980000CA102240088003C000C8003EC00FB009A -:10C9900032800EB003CC80DB0032C00CA0038003D9 -:10C9A0005000000000000000A01DFC00FF003FC080 -:10C9B0004FC213D410FC003F000F0003BC00FC006A -:10C9C0003F400FF023E012FC01BF000FD0036802CC -:10C9D0007000000000000000C005FC00C78033C0EC -:10C9E0008BB403B0C0CF2E1F0C4FC3033080FF01A8 -:10C9F0003F080FF0007C00FF2133E40CE00330001F -:10CA000070000000000000008010EE008B8223F018 -:10CA10000BB5120D8888C00E980B86022100BBC092 -:10CA20002EE44BF7832F44BF9022C848A6822004EF -:10CA300030000000000000008805CC098A0020506A -:10CA40004BB20A80CC83010C8C0B230A0460B31414 -:10CA500024404B3002CC10B30020C8E9110662011B -:10CA60007000000000000000C015AC018A80A244E4 -:10CA70000BB002A10488402EA00B20022820BB404E -:10CA80002E400BB0022C08BB0022C009B00270047B -:10CA900060000000000000004015EC00C38332E09D -:10CAA0008F0003A002CBC43E28078B032100F9C0EE -:10CAB0003E100FB003EC007B0032C00DA003500409 -:10CAC0007000000000000000E0019C02FF003FE059 -:10CAD0000FF4435E80FC943F000FC02BF250FD2109 -:10CAE0007E848FF0036C0CFF003FC00E6203B80021 -:10CAF00060000000000000004010AC00EB0032407D -:10CB00002C80036900CB30B2004FB343E500CB402B -:10CB100072182CB003EC28C3213AC10F94031004FF -:10CB20002000000000000000C8053C008B202250BF -:10CB300008B002280088C02A008BB402E800DB009D -:10CB4000623008F002FC008F8022C00B9547320053 -:10CB50004000000000000000E0054C00B10020C2D1 -:10CB60004830024980834260120B3002C8008202C2 -:10CB70002C3009B002CF0183502AC00B2002B8002C -:10CB8000500000000000000020011E009D80A0E079 -:10CB90000879225E60879029A00B7802C6009281F6 -:10CBA00005E0097802DE40878021E00B29020800B9 -:10CBB000400000000000000048080C40F20030C0B7 -:10CBC000083A034404C31430C00F2203CC80C200CF -:10CBD000A4D20D3013CC20C30038C44F044312023A -:10CBE0000000000000000000401D9C00EE003FE03F -:10CBF0000F7003B402F4103FC08FA003FC007E004E -:10CC00003BC00EF083EC00F7003FC00FC003D0061E -:10CC10006000000000000000A805FC00F9003EC014 -:10CC20000FA003AA12CB0132800FB0132814F98091 -:10CC30003A4003B403EC42CB183EC00FB0032A00C5 -:10CC4000700000000000000048119D00B5002DC4D8 -:10CC50000B704B7C00840021800B70029410B2009A -:10CC600029C00B7282DC0087202DC10E70021204D5 -:10CC70006000000000000000C0009E00B7802DE0B2 -:10CC80000B68029E00838021E05B38021E00B4C066 -:10CC900025E0097832CE0097802DE00B5C4E300005 -:10CCA00020000000000000004814CC00B3442CC059 -:10CCB0000B3C02CC40930820E00B30028C10B3C038 -:10CCC00028D81B3002CC0893016CC00AB882120429 -:10CCD0003000000000000000E815A800F6103E80BB -:10CCE0004BED83B800CEE4B3A30FE0033800FE00A1 -:10CCF0003B800DA002E800DA003E800FE8023A0413 -:10CD000060000000000000004800E010F8403E0015 -:10CD10000F80136000E0003E00430803E000F808C5 -:10CD20003A000F8003E000E8403E000E8023D2006E -:10CD300030000000000000000810C400D9C0BE4050 -:10CD40000F9003E600F9003240019A032400F90035 -:10CD50003E400F9003C44009100E400F9A03020496 -:10CD60003000000000000000800464048904A26018 -:10CD70008B9D80A600B98022404898022400B9000B -:10CD80002E408B9002E49489602E400B940B20007F -:10CD90001000000000000000180524009908AE48AB -:10CDA0004B1002E581B91020441B94022410B900F5 -:10CDB0006E600B9002E40089002E400B9402060086 -:10CDC0004000000000000000080404808900A06802 -:10CDD0000B12028489B12020481A12120480B12259 -:10CDE0000C480B1202C481A1202C400B120202013C -:10CDF0000000000000000000B80D6000D800BE0078 -:10CE00000F050BE140F80032140F85032140F800B4 -:10CE10002E800F8513E002C8003E140F05012E037B -:10CE20005000000000000000981DE440FD00BF44D9 -:10CE30000FD103F4407D10BF4445F12BF440FD10A9 -:10CE40003F440F9103E440D9103E400FD103A606A2 -:10CE500070000000000000001805F600FD001F62D1 -:10CE60000FD8823600BDA03B680CDC8326C8D9A051 -:10CE700033600D99835620D5A82E440CD8838604A0 -:10CE800070000000000000003810E148B8002E00DB -:10CE90000B0A822220B85022BA088A2222808800F7 -:10CEA0002201080C02200088002E28888802CE0467 -:10CEB00030000000000000000805C400B1002C4054 -:10CEC0001B100A8440B10028580A3202050099401C -:10CED0002065091042C40091002C400A3082C20132 -:10CEE00070000000000000001811A400B9002E40DE -:10CEF0001B9002A580B910224808104204100900B6 -:10CF00002240089002E4009B002C400A9422C604B0 -:10CF10006000000000000000A015E400F9203E4081 -:10CF20000F9013A710F960BA502E9C0A2584D1F0F7 -:10CF3000B2600D9003E400D9003E400E9003A800BB -:10CF400070000000000000002801A40CF9903E6A67 -:10CF50008F90236600F1083C400F9C43E440F98029 -:10CF60003A440F90032404E9023E402D9113CA0075 -:10CF700060000000000000002810A000E8203E0132 -:10CF80000C0003A120E85032102C8C032100E80093 -:10CF900032020F00132088C80832000F8C03CA0029 -:10CFA0002000000000000000280528208EE32F90BC -:10CFB0000AE0063B00EE04239008E00228088A02FB -:10CFC00075908BA04158908E802A810BE0038A10C7 -:10CFD000400000000000000028054E00A3006C6027 -:10CFE00008381A8E40A08020CC0930020C05A3041A -:10CFF00028C40B30020D0183C020C00B3002CA00D0 -:10D000005000000000000000A0011E0887002D62F3 -:10D010000B70921C08A00061C00960061C80A7006C -:10D0200021C00B72025801878829C00B6012A8002A -:10D030004000000000000000A8081E00E6803D60DF -:10D040000C78429600E480A3600D78033F00E380F3 -:10D0500021E00F7B031608C78031E24F7843EA02D4 -:10D060000000000000000000081D8C01F8003C409A -:10D070000EB002EC00F8013E404E3033ED20DB01F3 -:10D08000BEC00FB403EC00FB003ED80FA003C206E5 -:10D0900060000000000000000005FE00C78423605F -:10D0A0000C780BBE00FD803FE00FEB033E00CF800D -:10D0B0003B250CF8837E40CD8033E20BF903000062 -:10D0C0007000000000000000A8119C0287001548B5 -:10D0D0000870021420B600359A49C8039C84A70042 -:10D0E00039D00A70021A08A40021C00961422A043A -:10D0F000600000000000000000009C00870021404C -:10D100000871029400B5002D400BF1225C02070863 -:10D110002C50087002500087002DC40B50420000B4 -:10D1200020000000000000002014CC0083022440F6 -:10D13000183D0A0100B05824200930028F4083E0D6 -:10D140002CC10A30420800B3016CC009081608045B -:10D150003000000000000000A8158C008B00324059 -:10D160000C2503A848F8813E800F80637C00CB80AB -:10D170003AC00CF0036C00CA02BFC00F988B2A049F -:10D1800060000000000000008000EC00F9003E504C -:10D190002FA40BC800F0403ED00FA033EC20FB04BE -:10D1A0007AE00FB003ED08E90332C00D9003E00010 -:10D1B00030000000000000000110EC40EE003EC016 -:10D1C0000CDA037004CC02B1A00EF023EC00FF00D7 -:10D1D0003720CDB073EC88FB803FC00F3003004494 -:10D1E000300000000000000081046E0088802CE107 -:10D1F00008940AA902884022D008B942EC04BB0076 -:10D200002CD40DB002ED20BBD02EC00BB002A0403C -:10D21000100000000000000080052400AB802EF00C -:10D2200029A0826D0088082204089042EC00BB000F -:10D230002A8108B002E409BA042EC14B988220006A -:10D2400040000000000000000804040083002CC01F -:10D250000A210284108200E000180A12CC00B300F8 -:10D260000CC0093002CC90B0002CC00B100282011F -:10D270000000000000000000000D6400EB003E0014 -:10D280002CB40364088800B2000CB243FC00FB001D -:10D2900056000CF001E400FB003FC00F800B0003C0 -:10D2A0005000000000000000A01DF400FF003F40FF -:10D2B0002DF061F000F40027010DB111FC00FF0218 -:10D2C00007C00FF003EC40FF003FC00FC00368062B -:10D2D0007000000000000000C005F600EF903D4C1B -:10D2E0002CC013F408FD20374C8E82837484DCC27A -:10D2F0003FD80DF203ECC0FF813F000CF803F000B3 -:10D3000070000000000000008010E6008B242E5CFE -:10D31000088D02FF48B9902F540B84823E40A080B4 -:10D320002EC40AFC42ED80B9802E600A9812E004F7 -:10D3300030000000000000008805E401A300284838 -:10D340000A0042C400B1002C490B0A4204A29121F8 -:10D350002CC90831028CC1A3002C40081802A2017C -:10D360007000000000000000C015A0208B822E4439 -:10D37000588002E400BB102E400BA1120C01891052 -:10D380002EC00AB002EC01B8802EE20AA102F0041D -:10D3900060000000000000004015EB40EB403E60E4 -:10D3A0000E8733E400B9A136C00EA80B2600DAC000 -:10D3B0003EC08DB003EC00FB853EE108B80390054C -:10D3C0002000000000000000E001B800FF022F6014 -:10D3D00003E883FC10FD801F401FD013BE40EE0405 -:10D3E0003FC00FF043FC08FD003CC00FD011F80017 -:10D3F00060000000000000004010A400DB00B2400C -:10D400000E94032400D900BAC00C2003E490FB0062 -:10D410003AC00CB003EC01FA003ED02C9803900403 -:10D420002000000000000000C80503008B00224817 -:10D430000884222C00B90022C008A002ED008BA0B5 -:10D4400021C008F002FC00B9802EC008A002320002 -:10D450004000000000000000E0054520930022F895 -:10D460000B300A8440B2002040081002C4008080C3 -:10D4700028C02839024C00B1002CC0083002B80086 -:10D480005000000000000000200136009F80216055 -:10D490000938029E00B2C02060484812D6C686D025 -:10D4A00021E0087800DE80B7822DE008F80208004D -:10D4B000400000000000000048080C20D31030C8D5 -:10D4C0000F30038400F1003040241903E4C0E04031 -:10D4D0003AC00C3203CE80B1283CC00C301392020B -:10D4E0000000000000000000401D9C00E6007FC01E -:10D4F0000EF0237440FF103F404FD003FCD2CE0407 -:10D500003FC00FF403FC00FE003FC00F7103D012B8 -:10D510006000000000000000A805EE00CB0016C06F -:10D520000D80032720CB003EC20AB053E428C181FE -:10D5300032C10EB9032C00F18035E00CB8032A0487 -:10D54000700000000000000048119C0287102D4070 -:10D550000870035C00A7002D40287002D4048704E3 -:10D56000A1D00B72021D00F70021C00D5002120461 -:10D570006000000000000000C0009E00858025E0E3 -:10D58000097802370387802FE0087812C6108D8053 -:10D5900025E80B38021E80BC8425E0085802700084 -:10D5A00020000000000000004814CD8083882CC0BB -:10D5B000083C024E01A3D22EC408B102CC008380E5 -:10D5C00024C10B30020C00B340A0D209301252002B -:10D5D0003000000000000000E815BA00CAC0368024 -:10D5E0000D67132800CE003EA00CED03E800CEE04E -:10D5F00036801EA00B2804FE00B7B20CE00B7A00A8 -:10D6000060000000000000004800E040F8102E100C -:10D610000F8003E001D80A3E000F8003C002F80823 -:10D620003A000F8003E010E820BE000F8013920044 -:10D6300020000000000000000810E500FB003E4054 -:10D640000C91032600618032400C90032400C90035 -:10D650001E400C9C03E401F9003E400F9003C20001 -:10D66000300000000000000080046700B9002C407A -:10D67000009C02A600790022402890022400890024 -:10D680002C44089802E400B9802E400B9002E0017F -:10D69000000000000000000018012400BB0026501C -:10D6A00028908224849920224049900224008900F5 -:10D6B0002E40089002E400B9602E400B9002C60490 -:10D6C000400000000000000008040600B1002E48E1 -:10D6D0000812028480B120A04809120A0480810047 -:10D6E0002C48281242C48831002C400B1802C20179 -:10D6F0000000000000000000B80D6000F850361473 -:10D700000C80032000E80032140C85032140C8502F -:10D710003E140C8003E14038003E008F8003EE038E -:10D720005000000000000000981DD400FB043D44A0 -:10D730000F5123D448ED103D444ED123F442FD0057 -:10D740003E448F9103E458FD003F500F5003E6061E -:10D7500070000000000000001805F400F9003D40D2 -:10D760000CD003F400DD023E400C9003E440C910ED -:10D77000374007D0072400E5002F6A0F700306002A -:10D7800070000000000000003810E000B8003A000F -:10D79000808002E00088002E000A8053A2802CA026 -:10D7A00022000B800A2000B8002E100980030E040E -:10D7B00030000000000000000805C400B1006C400B -:10D7C0002A1002840181802E40091002F4008D0489 -:10D7D00020400B10028400B1002C400B9802420143 -:10D7E00070000000000000001811A420B9002A40B9 -:10D7F00088B402E601A9202E480A9000A440AD405A -:10D8000022400B9012A404B9012E410B9002060491 -:10D810006000000000000000A015E400F9C03E60B8 -:10D820000C9413A602D9421C600C9E01C604C100D0 -:10D83000B2401F9002A400E9083E684F980B6804AC -:10D8400070000000000000002801A640F920387098 -:10D850000F9103E400D9803E400F9C13A400F9000F -:10D860003E400F10036410F90A3E500D9A03CA009F -:10D8700060000000000000002810A100D8043E0055 -:10D880000C8113C002D8203E002D8403E000CC0898 -:10D890003A000F8043E000F841320007818B0A0410 -:10D8A000200000000000000028053A608A002FA830 -:10D8B0000AE022E8027E482E8008A042E8048E009A -:10D8C00023A80BA882E800EE00A2804B60020A00A9 -:10D8D000400000000000000028054C0093006CC0D0 -:10D8E000083002CC0013812CC0083002CE408240A8 -:10D8F00028E00B3802CC00B31024C08B38020A0099 -:10D900005000000000000000A0011E0087202FC072 -:10D910000A7002DC0AB6002CC8887206D80086009D -:10D9200021C00B7002DC84AF80A5C00BD0022800A0 -:10D930004000000000000000A8081E00D7803DA0A5 -:10D940001C7813D602D7803DEC087E23FE00CE80E3 -:10D9500039600F7803DF00F68075E00F78032A0244 -:10D960000000000000000000081D8C00FB103E803D -:10D970001FA021CC00FA003EC00EB003E802FA005E -:10D980003E400FB013EC00EA013AC00F9003C2060C -:10D9900060000000000000000005FC00FF803F6008 -:10D9A0000899077E00DD803FE20CF803F602DF8075 -:10D9B000B3E00CF8033E41CC8033E40FF803C00021 -:10D9C0007000000000000000A8119C40B7002DC0AE -:10D9D0000D5A22DC8075002DC0087102F0208700EE -:10D9E00021C00A70021C00D42821C00B7202EA0474 -:10D9F000600000000000000000009C40B7002D0007 -:10DA0000087222F40087002DC2087002D4008780BB -:10DA100025400930025C01AD0029D04B7002C000E6 -:10DA200020000000000000002014CC00BBC82CA087 -:10DA3000092002CE00A3002CE0A83D42C2008B804A -:10DA400024400B300A6C08A340A8E00B3402C80441 -:10DA50003000000000000000A815AD00FF483C2881 -:10DA60000CA9236C808B003FC00CFC03EC00D88019 -:10DA700034400D30037C02A34038680F2403EA04CD -:10DA800060000000000000008000ED88FB003E50B8 -:10DA90000FA103EC043AC03EC00FB083E802F810B7 -:10DAA0003A410E9003AC009B08B6400F8103E000A2 -:10DAB00030000000000000000110FC00FF00B32057 -:10DAC0000C50131C09CD8333C08370003C00DC1064 -:10DAD00032600EF1432C00CE043B700CF083004406 -:10DAE000300000000000000081046780BB0162215B -:10DAF0008A89202C0080E022C00BB003D8108C044F -:10DB00002240059002AC00D88036400A90022040A6 -:10DB1000100000000000000080052600BB00220667 -:10DB20000880022E00882022C009B002A4009900BB -:10DB300062C408B0062C008880224108A0022000A0 -:10DB4000400000000000000008040C00B30020406A -:10DB50000A00820C00800020C00B3022A00081004F -:10DB6000A0C00930028C00900024400A2802020163 -:10DB70000000000000000000000D6000FB0220001B -:10DB80002C92032C02880031C00BB502A400D104F2 -:10DB900032400E90032C40C9003A408CA003000391 -:10DBA0005000000000000000A01DF400FF002F0046 -:10DBB0000FC003DC00FC003FC10FF043F000FD008C -:10DBC0003F404FD003FC00F5003F400FE003E80664 -:10DBD0007000000000000000C005D880CC00B70431 -:10DBE0004EE1033C20DF10318006F0037F00FFC0D0 -:10DBF0003BC00EF2035E00EF1033D02CF203300076 -:10DC00007000000000000000C010E90088C6205C21 -:10DC100008A45765008F522AF009FC020400BB00DB -:10DC20002DD90974836428834422848806823004B1 -:10DC30003000000000000000C805C9008010200866 -:10DC400008311204B2A30020841B34020C80B320DC -:10DC50002CC70936028C809340ACC80831283201A9 -:10DC60007000000000000000C015A9008800A2504C -:10DC700008350224008B042EC109B0022494BB0095 -:10DC80002EC00BB002CC608B002E800880003004C8 -:10DC900060000000000000000015E702CB18B28011 -:10DCA0002CAC0A2E08EB0032124EB0032B80FB0086 -:10DCB0003AC00AB003AB08EB042E480CB88300044A -:10DCC0007000000000000000E001B680FF8039CA4B -:10DCD0000DE803D640E7043B664E7003B800FF0131 -:10DCE0003FC06CF0037006E70031040FC143F80039 -:10DCF000600000000000000040108500CB40329022 -:10DD00002FB00B6480FB08BA100DB0A72D00FB04E8 -:10DD10003EC08EB0036D00DB0132408C33039004B3 -:10DD20002000000000000000C005240083E0A2D015 -:10DD300040B0022504BF80A05008F80220008B02EA -:10DD40002FD008F00224008F80360108844236006C -:10DD50004000000000000000E8054400834820C4A3 -:10DD60000900024600B301A8901930128C00A304E8 -:10DD70002EE20AB0020C00834928C0093C02380098 -:10DD80005000000000000000F0013604838021E113 -:10DD90000838121E28B39821A0193882960087836C -:10DDA0002DE2087822368C87802DE00979023E002A -:10DDB000400000000000000048080400C33030C8E4 -:10DDC0004D000B4C80F31238C00D3A028C80F300EA -:10DDD0003CC00E300B0E00C30C3AC00D30031202D3 -:10DDE0000000000000000000401DB406FF103FC00E -:10DDF0000FB013BC00FF107FC00EF1A37C00FF1218 -:10DE00003FC20FF523BC41EF183780AEC003500668 -:10DE10006000000000000000A805E400DB003EDA1E -:10DE20000C800366108B0032808CB6034A004B8056 -:10DE300032C80CB4030A10DB003EC10CB0432A0008 -:10DE40007000000000000000C811B40087042CC05E -:10DE50000D70031C08874820810D72825C00D7007A -:10DE600021CC28F0021C1087202C0008400A320424 -:10DE7000600000000000000080009600B7812DE0E7 -:10DE80000848020E04878021E00878023E0187805E -:10DE900021E01879023A0197A02D6008380220008D -:10DEA00020000000000000004814C600A3C62CC0DB -:10DEB0000930020C01830020E00930024E0093007B -:10DEC00020C04930220F6483026CD428300212042F -:10DED0003000000000000000E811AB80FAE03C8850 -:10DEE0000CE0022802CA00B3A90CA0033B10CA0030 -:10DEF000A2800CA00B3800DA003FB00CE6033A0415 -:10DF000060000000000000004800C02098083E00AB -:10DF10000F800BE100F8013C104F0003A040F80017 -:10DF20003E100E8003E000F8003C022F0493D20064 -:10DF300030000000000000000810E400C1C13240C1 -:10DF40000C98032640F90032400C98032424F90071 -:10DF50003C600C1003A400F98232400C90030204D0 -:10DF6000300000000000000080046400890022509E -:10DF70000D98022580B90022520D9C022400B900A0 -:10DF80002E600890422400B940364008900A2000D4 -:10DF90001000000000000000180524008D00234040 -:10DFA0000812022400A110A26008928A2400B9017C -:10DFB0002E46089002A400B150224028908206000C -:10DFC0004000000000000000080404848520A1D85F -:10DFD0000910020480B32020402912060400B10178 -:10DFE0002C482812020400B1202448081202020121 -:10DFF0000000000000000000B80D61428A00B3007C -:10E000000C05032140E050B2002C80022140F0506A -:10E010003C140C8513A150F85032140C85232E03A8 -:10E020005000000000000000981DF440F9103E442C -:10E030000FD40BF444F9103F504F1103F400F900D2 -:10E040003E440F9153F414F9103F440FD103E602FC -:10E0500070000000000000009805E6A0DD88B366AF -:10E060000CDC833688BDA0376A0CDA0B2502C94068 -:10E070003F784F98B3E504CDA072780CD88B261466 -:10E0800070000000000000003810E30088422231D8 -:10E09000080A0222A0B8F922100D84126A80888032 -:10E0A0002E200B0802E280A8A8A23848A8020E0081 -:10E0B00030000000000000004805C4A28100204894 -:10E0C0000812424500B100244009140224008120B6 -:10E0D0002C580B1082C4049140646C0830821205E5 -:10E0E00070000000000000001815A4008900224103 -:10E0F00008908A6480B9002250099006640899004B -:10E100002E400B9006C401B90226618890020604D5 -:10E110006000000000000000A015E400C9002240DB -:10E120002C94236400B90036400990130500C900FF -:10E130003E404F9013E5C0D90026402C94032800A0 -:10E1400070000000000000006801A402E9083C40E3 -:10E150000F900BA400F1003E410F9043A488E90406 -:10E160003E400F9003E600E1003A409F9263DA00E0 -:10E17000600000000000000028108010E001320064 -:10E180008F80032000D80830018C0003E102C8040E -:10E190003E000C800B2100C80078000F86030A00A7 -:10E1A0002000000000000000280528008E402B827F -:10E1B0000BA0023A008E80238208E20228108A0017 -:10E1C0002F9828A01228008E202E804BE4020A00EF -:10E1D000400000000000000028054C02A240208002 -:10E1E0000BB0024E4093C0A0200836028C00930072 -:10E1F0002CE20830064C12930828C00BB0020A002B -:10E200005000000000000000A0011C0882402940CE -:10E210000B70025E08840823400870061C8087008B -:10E220002D200879125C0094002DC00B304228008C -:10E230004000000000000000A8083E00E48031A17A -:10E240000F58137600D08031C00C3803BE80D781C0 -:10E250003F208C79037F01D68039E84F68032A007C -:10E260000000000000000000081DBE00FA003E0093 -:10E270008F960BA400EA003CC00F9003AC20FB403B -:10E280002E000FB203ADA0EA003EC00FA01BC204D7 -:10E2900060000000000000004005FE08DE8133A49D -:10E2A0000EFC133E00FC8013200C68033E20FFC8C8 -:10E2B0003F601DF8037E00C78033E20CD8031000D6 -:10E2C0007000000000000000A8119C00864131C4CD -:10E2D0000879429C00BC1021408535035C00B700E2 -:10E2E0002DC00872022C00A70137C00851422A0035 -:10E2F000600000000000000010008C4082002481BB -:10E3000008D8021420B50020400960021C40B70064 -:10E310002C400B3022DC00970021C408400244004E -:10E3200020000000000000006014EC009206209025 -:10E330003815028600B80060500930024E01BB005B -:10E340002E400B3002CE20B30024F048020A5804BD -:10E350003000000000000000A815BC00CA00A69410 -:10E360002C90032E00FB05B2850D90033F90FF001B -:10E370007E801FF043FC219A0033C83CB2036A043C -:10E3800060000000000000009000EC02EA403D80C8 -:10E390000F1093ED00FB403E908F3003EC80FB00AC -:10E3A0003E911CB0032C10E8003EC81F9003A5103E -:10E3B00030000000000000008010FC02E40073A0A8 -:10E3C0000CFC037C02FF1013C41CC0033C00FF00C4 -:10E3D00037E00DF003FC00ED8031C00C3263200407 -:10E3E000300000000000000084006C008AC022B1F0 -:10E3F0008AB8434A10DB2020F00A94036C00BB0764 -:10E4000022B808B002EC11E8C0B2C02A921A20006B -:10E41000100000000000000080012C00AA8022985B -:10E420000890022F03BB012A8308B24E2C04AB02D2 -:10E4300022C428B022EC09B35062C008B002200008 -:10E44000400000000000000008040C018300608010 -:10E4500008120A440093002A804A30020C00B300DC -:10E4600060C0083002CC00B30260C0080046020160 -:10E470000000000000000000800D6C00E802228017 -:10E480002CF2432C00FB00BAC008A5023C00EF00B0 -:10E4900036C04DF013FD51FB0032C00CB00320011B -:10E4A0005000000000000000A01DFC007E043F8022 -:10E4B0000F3143F002FF0037C00FF003FC08FF00EC -:10E4C0003FC00FF003FC00EF003BC00FC003E81695 -:10E4D0007000000000000000C005F240FC803F24F6 -:10E4E0000DD853D604DF323FCC4CC043FC00DF6074 -:10E4F00037C00FC4037CD0DF2033D80DF843F000C1 -:10E5000070000000000000008018E880B0012E08B4 -:10E51000889002EC208B702FCC08B382FDE0BF40C6 -:10E5200022D80B9302FDC0AF1028F008BC12F004F3 -:10E5300030000000000000008805C400B0002E017B -:10E540000A1282EC80B3002CC80A00328C00A3307F -:10E5500020D20900028C80830028D80B3412F201EB -:10E560007000000000000000C005AC01B8022E00E1 -:10E570000A9012EC108B002EC00AB000EC00B30021 -:10E5800022C10B9202CC01AB002AC002B002F004FF -:10E5900060000000000000004015E000FA0C3EC0E2 -:10E5A0000FA013EE20DB003EC02E8853EC00FB00D2 -:10E5B000B2C08FAC83AC08DB001AC04FB003C004FC -:10E5C0007000000000000000E001B800FE003FC045 -:10E5D0002DE003FE807F003FC00DD203FC00BF0191 -:10E5E0003EC00DC803FC0CFF003FC009F023F8003B -:10E5F00060000000000000004010A400FA4032C19A -:10E600000FA0032908DB003EC00E8503EC20CB00E1 -:10E610003AC00EA403EC00FB003AC20EB003100493 -:10E620002000000000000000C8052C00BA6020C0D7 -:10E630000BA0020800AF002FD00BB502FE028F0026 -:10E640002FC00D800A3C00B70023C205F02236001F -:10E650004000000000000000C0044000B18820001D -:10E660000B10020C0083002EC80B08064D408300DF -:10E6700020C00830060C0893200AE04A3002380017 -:10E68000500000000000000020105A00B59021202A -:10E690000B58423E00A7802DE00B6902DE408792B6 -:10E6A0002DE00918029E01B78029E00370023E00A8 -:10E6B000400000000000000048084400F101300064 -:10E6C0005F18030C1083003CC40E0403EC008300AD -:10E6D00030C40C31038C00F30038C80E3103120231 -:10E6E00000000000000000004015BC00FD04BF0455 -:10E6F0004F5803F808EF083FC00FF001FC00FF4C33 -:10E700003FC10FD0033C00F70037C20D7203D006A3 -:10E7100060000000000000000805E200DB0032C0DD -:10E720004DA8032C08FB007EC88FB00B6F45EBC2D1 -:10E7300036C007A003EF20CB50B2C00C79032A00EB -:10E740007000000000000000481998008F0021C0F0 -:10E750000B60035C0037002DD20B30020CA887241D -:10E7600021D0097002DD88872A23E808700232046C -:10E7700060000000000000002000B600978021E04B -:10E780000B68021E00B7802DE88B48821E80A38490 -:10E7900025E80B6802CE02878021E0087A0220007B -:10E7A00020000000000000006804CC08838220E004 -:10E7B0008B2A024840B3002CC00B30820C0083002F -:10E7C00000C1093102CC00830020C008300A1204C5 -:10E7D0003000000000000000E815E800DAA032A8D0 -:10E7E0008DA8033B00FA003E800FE4036800EA02B4 -:10E7F00036800FE403E800CA0032802CA0033A04FC -:10E8000060000000000000004801A010F800BE20D9 -:10E810008FC103E024F8003E100F8403E000F801EC -:10E820003E000F8003E000F801BE100F8003D2000D -:10E8300030000000000000000810A400F940324041 -:10E84000CF9003E400C9000E500F1A032600F90010 -:10E850003E400F9081E400F98032400C9003C204E6 -:10E86000300000000000000080046404B104224075 -:10E870000B9002E400A9002E530B920A2648B9041B -:10E880002E400B9002E400B9800250089002E00094 -:10E89000100000000000000038052400BD002340E7 -:10E8A0000BD012C40089022E400B90222400B90024 -:10E8B0002E400B9002E400B1202040689022C60058 -:10E8C000400000000000000028141400BF12A14006 -:10E8D0000B5002C400A1202C480B12020410B111ED -:10E8E0002C480B1322C400B140205A081002C20168 -:10E8F0000000000000000000B80D6140F840321434 -:10E900000F4503E140C8503E158F850321E8F868A4 -:10E910003E140F8403E1E0F02832A8CC8023EE03FC -:10E9200050000000000000009815C410F9203E407F -:10E930000F9003F400F9103E440FD103E400F920D6 -:10E940003E440FD303E400F900BE400F9403E606F3 -:10E9500070000000000000001815E400FD103340B6 -:10E960000CD0032400D9003F404CD003F600FD90AA -:10E970003A400C9003E6A0FDA837680CD883260027 -:10E9800070000000000000003810E008C8A022005D -:10E99000088002200088002E000C8012E000B88061 -:10E9A00022000D0A02E380B0C020340884034E0424 -:10E9B000300000000000000048008409A100204150 -:10E9C000089002240091002C40081002C500B1609C -:10E9D00020400810A2C420B128244A081002520185 -:10E9E00070000000000000001814A4018100A24083 -:10E9F000A89000254089012C40089402E400B90049 -:10EA00002A40099002E401B90422414890024604D8 -:10EA10006000000000000000A014A520E9003240C2 -:10EA20004C100B2600D9003E402C9803E400F9005E -:10EA3000B2400C9003E400F90036402C90036804C7 -:10EA400070000000000000004801A400E9003E4002 -:10EA50000F9003E600F9003E400E9A03E400F9002F -:10EA600036400F9003E400F9003C400F9003DA00B9 -:10EA700060000000000000000810A100F800320053 -:10EA80000F8013A000C80032048C8003A0C0F800DF -:10EA90003A000F80032000C00932004C80010A04B4 -:10EAA000200000000000000028052800BE00208093 -:10EAB0000BE0028800AA0003A00AE602FA008A001E -:10EAC00032800BA00228008E80A3802820028A00BA -:10EAD000400000000000000028056C00B348204002 -:10EAE0000B10020C00830020C00834828E049900B1 -:10EAF0000AC01B30020C02905020600830020A004D -:10EB0000500000000000000080111C80BD0A214858 -:10EB10000B52029C40A3A020800A6002CE008520F8 -:10EB200021C40B7A061E80952021900870022800CF -:10EB3000400000000000000088081E80F780B179C6 -:10EB40000FDB023E20C7A0B160CC78139600F1F035 -:10EB500039E20F7B130F00D4A031602C70032A021E -:10EB600000000000000000000815AC00F7003E4067 -:10EB70000F9003ED80FB103E400BB023EC00F9201A -:10EB80003AD80FB00BED81ED103E800F3003C20676 -:10EB900060000000000000000004BE20EE80336032 -:10EBA0000CD8831E006F8033E00FB8113204F5805B -:10EBB00033E00FF8832F40FE80B3E00CF803100021 -:10EBC0007000000000000000A8189C00BC00A144D8 -:10EBD0000810035C008F0021800BEA221C80B50125 -:10EBE00021C00BF0021E80BE0023802A70022A047E -:10EBF000600000000000000000009C20A7002340EF -:10EC00000B500A3C00A70025C00A43021000B500C3 -:10EC100021C00B70821C80B40021C0087002040067 -:10EC2000200000000000000020048E04B3002240F9 -:10EC30000914024C00830020C00B24820400B100A0 -:10EC400020C08B3A022C01B00020800A30021A0446 -:10EC50003000000000000000A8159E00EB043340C7 -:10EC60002DDC031D60EF003200CF9A032800FD0069 -:10EC700033C18BFC0B3C00FC0032800C90032A0457 -:10EC800060000000000000008000AC10F8003E4072 -:10EC90000E9823AC04FB003C000F8420ED00F9002B -:10ECA0003EC04FB003EC00FD003E800F9003E40037 -:10ECB00030000000000000002110FC00CF80334035 -:10ECC0000CD083FC00EF003F400CF1413010CD0030 -:10ECD0003FC00070133C00E400B1D00C10032004CE -:10ECE0003000000000000000A1042C008AE42A404B -:10ECF000289002EC008B003E020A80022C828904DC -:10ED00002EC10AB00A2C00890222F22A98022000A1 -:10ED1000100000000000000080052C0280142A4032 -:10ED2000089002EC08AB042E84081082801089033E -:10ED30002CC04AB0222C00AA002280089102200098 -:10ED4000400000000000000008142C008000284053 -:10ED5000081102EC0083002C810A005A880001008F -:10ED60002CC00A30020C00820020800A100202012E -:10ED70000000000000000000000D6C00C9003A40D7 -:10ED80000CD403FC00EB003E400C9203A0004D00AD -:10ED90003FC00EF0333C80E80032C00C90032003EB -:10EDA0005000000000000000A011FC00FC003D40ED -:10EDB0000F5003FC023F043B014FC4137000FD00E1 -:10EDC0003FC01FF001FC40FC003FC00FD013E8061D -:10EDD0007000000000000000C005F8E0FF803DC0AA -:10EDE0000DF382F080FF4031CB0CF303FD04EFC143 -:10EDF00033E00F7903FE00CF4233F04CF8033000CC -:10EE00007000000000000000E010E908B9812FF058 -:10EE100008F452E920BF4023F00AF302FD088B00FA -:10EE200036E00B8022E8808F4022C008B082300498 -:10EE30003000000000000000C805CC00B1802CC5E7 -:10EE4000093242C8C0B33120C1083202CCD4BB2041 -:10EE500068C00B3002CC2093602088083202320157 -:10EE60007000000000000000E015A000BB802EC074 -:10EE700008B002EA00BB0062C10AB002CC00AB00DD -:10EE80002EC00BA000E800830022C108300230042D -:10EE900060000000000000000015E890FB803EC00C -:10EEA0000DB003E210FB0032C04CB013EC00E9548B -:10EEB0003AC00FB003E600CB00B2400CB00304042C -:10EEC0007000000000000000E001B800FF003FC03B -:10EED0008FF003F000F702BFC10FF023FC00DF0644 -:10EEE00037C08FC907FA92FF043F502FF003F80094 -:10EEF00060000000000000005010AC00C9003EC2DD -:10EF00000EB023E400EB003AC80EB003EC00F900A9 -:10EF10003EC00FB403A400FB003E800FB083D004BA -:10EF20002000000000000000C80528008B742DC0E0 -:10EF300008F002E4008F0021F008F002FC10D3007A -:10EF40002EC00B90122C00EF002EC00BB602F60064 -:10EF50004000000000000000E8054800A3002CC4A9 -:10EF60000A3002C000A30068F00A3012CC04A200EC -:10EF70002CC00B3002EC00B3012EC00B3402F800A1 -:10EF80005000000000000000B0010C0087802DE858 -:10EF9000087842DA00878025E0087902CE00968062 -:10EFA0002DE00BD902DE00A7802DE00B7802FC00DB -:10EFB000400000000000000048080C40E3103CC086 -:10EFC0000A3803E800EB0038C20A3003CC00E34003 -:10EFD0003CC00F3403CD00F3203C880F3003D20235 -:10EFE0000000000000000000401DB480FF043FC886 -:10EFF0000FF083F840FF183BC00FF483FC00EE02D3 -:10F000003FC00FF0033C00EF083F800FF013D00625 -:10F0100060000000000000008805E800CB003EF220 -:10F020004DB213E804CB0132F84DB2136D20F80055 -:10F030003EC00F30032400FB003E408FB8032A007F -:10F040007000000000000000C8118C0086002CC079 -:10F05000087302D812873020CB08F2021D05B500D4 -:10F060002DC00B60035010B7092DC00BF002320405 -:10F07000600000000000000080009E0087802DE4FA -:10F08000097A02CE01878021EC0978025E80B7C040 -:10F090002DE00BF8021E00B7A02D600B78022000B7 -:10F0A00020000000000000004814EE0082802CC008 -:10F0B000083002EC008300A0C00830020C00B380CE -:10F0C0002CC10B30024E00B3002CF10B300A12049D -:10F0D0003000000000000000E815BA80C6003E8045 -:10F0E0000DA003F840CA0032800DA0136800FE0294 -:10F0F0007E800FED833910FA003F8C0FA0033A0495 -:10F1000060000000000000004800E012F8903E009F -:10F110000F8003E000F8053E000E0003E000F880D9 -:10F120003E000F8003E060F8007E000F8003D200F5 -:10F1300030000000000000000810E400C9803264C4 -:10F140000F9043E406C1043A400F9003E400E90045 -:10F1500032400F90032400C10132400C9003C204DE -:10F1600030000000000000008004640089C02240DC -:10F170000B90022400890022501B90222400810061 -:10F1800022400B90222408C9002040089402E0008D -:10F190001000000000000000180524009920224003 -:10F1A0000B1002A40089002A580B90028400A900C9 -:10F1B00022400B100A0400990222C1089082C60066 -:10F1C0004000000000000000080404009102A0C8F4 -:10F1D0000B12020480812220489B120204908901B4 -:10F1E00020400B1002040281222240081002C201BA -:10F1F0000000000000000000B80D6142DA01320199 -:10F200000F8503A140C0503A018B8523A144E850EB -:10F21000B2000F85032148D85132142C8503EE0328 -:10F220005000000000000000981DF500ED023E4473 -:10F230000F9103F440F9103E440F9103E440FD00A8 -:10F240003E400FD003F400E910BF400F9003660664 -:10F2500070000000000000001805E621C5003368BA -:10F260000F9A036F88C9C033680C9E032780D9406A -:10F270003E400F9003C510D9E836500CD003E6008D -:10F2800070000000000000003810E10888008200D3 -:10F290000B8E82EBC888E02200288842A2808A80F8 -:10F2A00022000BAA02E20088C022A9088A038E0469 -:10F2B00030000000000000004805C400810020D09C -:10F2C0000B1132848481606050081606050091207D -:10F2D00020400B1082E409912024400810C2D20182 -:10F2E00070000000000000001815A40489042240EA -:10F2F0000B9002C400A9002241009002A4008100EA -:10F3000022400B9222E58099012261089002860436 -:10F310006000000000000000A014A582819032402F -:10F320000F90136702C90032400C90232404D9C007 -:10F33000B2400F9C03E600D90036500C9003E8045D -:10F3400070000000000000006800A680F9003E4048 -:10F350000F9003E700D900BC420F9053E404F9106A -:10F360003E400F9803E604E1003E402F9003DA0090 -:10F3700060000000000000002810811048103208D2 -:10F380000C800F2102C8003A040F80076000F8408B -:10F39000B2000F840B2000D80036100C8003CA0482 -:10F3A0002000000000000000280428048E80238034 -:10F3B00008A04228008A0023A04BA002E800BA005F -:10F3C00076800BA00208008A00328008E003CA00A1 -:10F3D000400000000000000028054C00820020D002 -:10F3E0000830020C009B0028C01AB0026C00B30267 -:10F3F00020C00B30020C00A30022C0283482CA00B7 -:10F40000500000000000000020011C00870020E0E8 -:10F410000878020C00972025C00B7102DC81B72010 -:10F4200021C00B7A423C80872021C0087002E8008E -:10F43000400000000000000028080E82C780B1E0F4 -:10F440002CFA061E08D3B139604E78125EA0FFF088 -:10F4500021E00FF8031F08E3A033E00C6803EA0281 -:10F460000000000000000000081DAC40FB003EC092 -:10F470000FB203EDA8EB103A800FB0C3EC40FB00D5 -:10F480003EC00FB083EC80EB70BEC40FB0038206A9 -:10F4900060000000000000004005FE00CE80B36068 -:10F4A0000FFC837E20EFB03BE00FB8033E00CF811E -:10F4B0003FE08FF883EF40FFC233E10CF803D00048 -:10F4C0007000000000000000A8119C8287182180B5 -:10F4D0000B30021C60D71021D00B7B023C00D70000 -:10F4E0002DC00B7002DE00BF00A3C4087003AA0485 -:10F4F00060000000000000000000BC11870021C077 -:10F500000B30021C00932069C00B70021C008700A6 -:10F510002DC00B7102DC20B71021C00860028400EE -:10F5200020000000000000006014CD00834020C0D7 -:10F530004B30020C01830020C00B30020C00938082 -:10F540002CC00B3002CC01B30020C008302298043C -:10F550003000000000000000A815BF20CAC03280A3 -:10F560000FF0033E009F003A800FF00B3C00CF9855 -:10F570003EC00FF603FF00FF0031E02CB003AE04E5 -:10F5800060000000000000008000CC80FB003E50C6 -:10F590000FB003AC02FB007E500FB003EC00FB0089 -:10F5A0003EC00FB203EC20F3003EC60F9003A00054 -:10F5B00030000000000000000110FC02CF9873C86A -:10F5C0000F70033C00FF0033280FB0021C004F00F7 -:10F5D0003FC00FF003FC00FF0133C00CE403E40460 -:10F5E000300000000000000080046C008380A2F85E -:10F5F0000BB0422C00BB0032100FB0036C04AB0008 -:10F600002EC00BB012EC04EB0022C04A9482E00042 -:10F61000100000000000000080056C008A0022003D -:10F620000BB0022C00B300A2C00B3002AC00AB0444 -:10F630002EC00BB042EC00BB0022C008B022E0009C -:10F64000400000000000000008000C008B012000BA -:10F650000B30060C00B30020C00A320ACC00A30015 -:10F660002CC00B3002CC00A30022C04A0012C20101 -:10F67000000000000000000000086C008B0422C0A5 -:10F680000FF1031C00FF0432C00BF203BC00EF00BB -:10F690003EC007F003FC80FF00B2C00CA003E003F3 -:10F6A0005000000000000000A019DC00F5003FC081 -:10F6B0000FF003FC01FF023BC00FF1037C00FF00D1 -:10F6C0003FC00FF013FC40EF003FC00FC003E8063F -:10F6D0007000000000000000C015F240CC80372010 -:10F6E0000CD803B044FC083F0E0FC103FC00CC94BF -:10F6F0003F0A2EC4037D80CF103FC00FC08330006F -:10F7000070000000000000008008E0908802228164 -:10F71000089213A4403B6022180B8102FCD48100A4 -:10F720003AB00A94023D40AF632FDF0B98002004EB -:10F7300030000000000000008805E0008800204044 -:10F74000883082C000B00828800A1002CC208001D6 -:10F750002C401B06028C90936068C04A0042220134 -:10F760007000000000000000C005A002880022C058 -:10F7700008B002E420BB8826980B8042CC188A008F -:10F780002EC21B9802AC00AB002EC00B9882300436 -:10F7900060000000000000000011E3C0CB02320056 -:10F7A0002C8003AE08B9003E700FB903EC02484844 -:10F7B0003CC00F8C93EC00DB001AC00EAC031004AD -:10F7C0007000000000000000E001B200FF00BB80FC -:10F7D0000FC043B640BD003B600FE803FC00FF9440 -:10F7E0003BE40E600F6C08EF013FC00F6003F800B0 -:10F7F00060000000000000004010A100FB003E601F -:10F800000FA003ED00F9403A000F9003EC02C90489 -:10F8100032D00F90032C08DB00B6C00DB403D00427 -:10F820002000000000000000C8050000B3892EE0A1 -:10F830000BA403A401B9002E010B9042FC108950C7 -:10F84000A2C08DB4023C448F0023C008B002F20075 -:10F850004000000000000000C0040C00B0802E003A -:10F860000B1202C800BA002CC00B2002CC00A20070 -:10F8700020002B2D9A2E42830028C0082002F80079 -:10F88000500000000000000020001E04B4802DA0E5 -:10F890000B58029200B6802DE00B6802DE40A68075 -:10F8A00021242948021E80878069E0086102C8007F -:10F8B000400000000000000048180C00F0303C4CF4 -:10F8C0000F3203C880B20038800F1B03EC00E03019 -:10F8D00030040FB1030E85CB003AC00C3103D202C5 -:10F8E0000000000000000000401CBC00FC113FC4F0 -:10F8F0000FB813B004FE023F800FC003FD00DF12FB -:10F900001D040FD043BC01EF1033C40EF303D00627 -:10F9100060000000000000000805EE00CB003E0083 -:10F920000F80032800F8003E403DB003EF08C900F7 -:10F930003A000CA003EC98FB2032D20CA8032A0258 -:10F94000700000000000000048119C0087012D801D -:10F950000B40421C043700A140086002CC808700A5 -:10F960002D802E7002DCA9B72821D0087002120069 -:10F9700060000000000000002000BE0287802D60B3 -:10F980004BE8025A01B48828E08878C2DE5286C06B -:10F990002960086802DE40B392E1E828280270007E -:10F9A00020000000000000006814CC008B802EC0F6 -:10F9B0000B20024D809B2020E0083802CC00838081 -:10F9C0002CC00AB002CC08B30020C0083102520497 -:10F9D0003000000000000000E805A800CAE03E80FA -:10F9E0001FA40B7900FE003F821DE003E800CE401B -:10F9F0003B882CE403E801FA0032800CE8037A0427 -:10FA000060000000000000004811A000F8093E005E -:10FA10008FC083A018F8003C200F8803E000F8088E -:10FA20003E200E8083E101F0003C000F800B92002D -:10FA300030000000000000000810A400F94232402D -:10FA40004C98030400C9003A400F90232400B98168 -:10FA50003C400C92032400F90532406C90C3C20470 -:10FA6000300000000000000080042414B900A254FB -:10FA7000089B1A240289002240289002A400B99011 -:10FA80002E40289C822504B9002240089812E000EC -:10FA9000100000000000000018052400AD00234005 -:10FAA000085002640089002A400810026400B9006E -:10FAB0006E400890022500A9002240089106C60069 -:10FAC000400000000000000008041400B510A1442C -:10FAD0002850024480813020480812028440B180BE -:10FAE0006CC80812020480B1342048081202C20116 -:10FAF0000000000000000000B80D6140E8403290B6 -:10FB00000CC5036140C0403A140F850321B0F85082 -:10FB10003E000C85032140F840B0140C8003EE0138 -:10FB20005000000000000000B81DC404F9220E4877 -:10FB30000F1013B440FD303F444FD100E484FF0167 -:10FB40003D440FD10BE440F9303E440FD103E604AD -:10FB500070000000000000003805E400DD403F5068 -:10FB60000CD0032C00C90036400F90132704F50178 -:10FB700037400CF003F620F9A832680CD003C60019 -:10FB800070000000000000001800E00088A02E288F -:10FB9000288002200088A022000B800A6280B80022 -:10FBA0002200088002E100B8E0223A08A002CE0458 -:10FBB00030000000000000004800840281002E4058 -:10FBC00008100A4402810824400A10024580B90046 -:10FBD0002440291002C400B1082444081002C201C4 -:10FBE00070000000000000001814A40489012E50C9 -:10FBF00048B2026400910022460B90026400B901F1 -:10FC000026C009B012E400B1002640089002C604E4 -:10FC10006000000000000000A004E400C9003C40B7 -:10FC20000C90036400C90236500E93032400F9902F -:10FC300036480D9483E408F900B6400C9403E804B8 -:10FC400070000000000000006810A400E9003E40C1 -:10FC50000F9013A400E9022E61059003A400F9009F -:10FC60003A400E9043E410F90038402F9003CA0048 -:10FC700060000000000000002810A000D80132043D -:10FC80000F8043C001C800B2010C80032000C840AF -:10FC900030008C8483E000C80032006C8403CA0406 -:10FCA000200000000000000008042800BA002380A3 -:10FCB0000BEA02E800AA00228008A00228008620A1 -:10FCC00037A08DE402F800DA00228008A002CA0002 -:10FCD000400000000000000008056C00B30020C0D8 -:10FCE0000BB8024C04830020C008B0020C02830051 -:10FCF0002040283402CE908300A0C0083002CA0001 -:10FD0000500000000000000020011CC0B588214008 -:10FD10000B7002DC80A32021E04832420E908E015D -:10FD20006550097002DE20932121C0087002E800AE -:10FD3000400000000000000028181E00FF80B1A055 -:10FD40000F48027E0087A033E0287A0B1F00C48092 -:10FD500031608C5803FE00C7C833E80C5803EA0230 -:10FD60000000000000000000081DAC00FF003E0085 -:10FD70000F9023ECA0FB403EC08FB503ED80F80050 -:10FD80003C400FB003E800FB023ED00F9003C206D8 -:10FD900060000000000000006004BE00FF803FE043 -:10FDA0000FD903FE20CFC833EA8FFC033F00FD804C -:10FDB0003F600EE803F200CF802FFE0C78030000B6 -:10FDC0007000000000000000A8009C00B5022DC0DB -:10FDD0000B5842DC80CF0021C10B30121C40B40212 -:10FDE0002D46087112C800E7002DC40870036A048C -:10FDF000600000000000000000009C00B7002D0221 -:10FE00000B4602DC08970021C90A30221C00B4000E -:10FE10002D400A5082C400B7002CC8285002401060 -:10FE2000200000000000000040148C18B3002E20B9 -:10FE30000B1802CF4A83C220C10B34220C04B858DD -:10FE40002C400B2802C800A3002CC0081402480450 -:10FE50003000000000000000A805BC00FB003E8050 -:10FE60000FA002FC00DFA0B3C00EF00B3C00FBC0F3 -:10FE70003CA00EBD03EC00FF003FC00C30036A0441 -:10FE80006000000000000000A010EC00F9003E013E -:10FE90008FB143EC00F3003EC04FB013EC00FB0009 -:10FEA0003E800C8403E10073003EC10FB243E000CA -:10FEB00030000000000000000150FC10FF8037C03F -:10FEC0000CE003FC20FF0833C00FF083BC00FF00F0 -:10FED00033C02E40031C01CF0011C04CD00300449E -:10FEE000300000000000000081046C04B3022272A4 -:10FEF00008A116EC00BB0422C00BB042EC00BA19FA -:10FF0000B6D0089C4A2680DB0022C00890036040DF -:10FF1000100000000000000080052C00B9106220D5 -:10FF200048A002EC00BB0022C00BB002EC10BB00EA -:10FF300066080AA81226109B002AC028B0262000B6 -:10FF4000400000000000000008000C00B900200084 -:10FF5000083202CC04B30020C04B3002CC00B30006 -:10FF600020000800020100930028C008300642115A -:10FF70000000000000000000001C6C00F900B2400E -:10FF80000C8202DC01FF00B2C00BF103BC00F900DF -:10FF900026402E80032104CF00BBC00C9003000339 -:10FFA0005000000000000000A01DFC00FD003F40CC -:10FFB0000F8103FC00FF003FC00FF023FC00FC009A -:10FFC0002D402FC003F088FF0037C08FD003E80218 -:10FFD0007000000000000000C005FE40FF8033C23A -:10FFE0000CF8037CA0FF903FC42CB403BC80CF402E -:10FFF00037E00FF1936E44BF303F202CF863F004DC -:1080100070000000000000008010EC00EB2023F056 -:1080200008B8523D00B3002EDC08F4421C428B40DD -:1080300022C80BF6036C88BB302E0008B202E004A5 -:1080400030000000000000008805CC00BB0820C004 -:108050000830024CA0B3202680883602CCA0936062 -:10806000A4C20A32424C90B3202C0B883082E20129 -:108070007000000000000000C015AC08BB22A2C0C8 -:1080800008B0022C00BB002E9008B002EC009B0050 -:1080900022C00BB0026C00BB022E2008B002F00020 -:1080A00060000000000000004015EC00B18332C009 -:1080B0000C1A036C10FB0034C00CB003EC08DA009F -:1080C00036C00EB00B6C00FB003E280CB002D00096 -:1080D0007000000000000000E001BC00ED803FC027 -:1080E0000FD403EC00FF003FC80FB0033C00EE408C -:1080F0003FC00F7003FC00FF003F800FF003F8004B -:1081000060000000000000004010AC00FB20B0C088 -:108110000FB403AC02CB0032900EB0036C00EB0046 -:108120003AC00CB002EC00FB003E910FB00390008F -:108130002000000000000000C8052C00BB8023D7F1 -:108140000B90023C148B006A0828F000BC008300EE -:10815000BEC088F0132C00EF002E800BB007B200D9 -:108160004000000000000000E0054C00B34020D0BB -:108170000B28028C00830120C01AB8006C10A100EB -:1081800068C02A30028C00B3022E004B3002F80483 -:10819000500000000000000020011E00B7A021E0F8 -:1081A0000BECC21E04878029E40879829E40AF90C0 -:1081B00029E00A38001E00A7902D240B78028800C1 -:1081C000400000000000000048080C50FB0930C0CF -:1081D0000F20028C40C30020C00A38034C44E10049 -:1081E000AAC00E31438E00F3003C000F3003D202D0 -:1081F0000000000000000000404DBC00FF203FD008 -:108200004F7003FC00FF003DC00FF343FC40D7005C -:10821000BFC00DF4C3FC40FF003F400FF003D00689 -:108220006000000000000000A805EC00FB0032D058 -:108230000D9001EDC0FB003EC01FBA03ACC0C800EA -:1082400032E08DB443EC00FB0036A00CB0036A00B2 -:10825000700000000000000048119C00B70021C819 -:10826000086002DC20B7002DC00F74A21C28D600C5 -:1082700035C00872025C08B744A180487002120041 -:108280006000000000000000C0009E00B78020E4F5 -:10829000097826DE00B7802DE20A70128C88818072 -:1082A00021E0097802DE00B3A025A028780270043E -:1082B00020000000000000004814CC01BB8020C05A -:1082C000083042EC00B3002CC00A30220C009300AE -:1082D00024C1083002CC00B30020E008B002120430 -:1082E0003000000000000000E815A800FA08B28085 -:1082F0000DE203E800FA003F800AA003A800CE5078 -:10830000328005A003E800FA0037A80CA0037A0425 -:10831000600000000000000048006008F8003C0019 -:108320000F8801E000F8043C004F0013C000F80083 -:108330003E000F80036000F8023E010F8003D20070 -:1083400030000000000000000810E400F990124026 -:108350000C9003A400C9003E700E94332408C90099 -:108360002A400B9003E400F9003A400F9003020406 -:10837000300000000000000080046400B942226068 -:10838000081002240089032E40089002A4018104F1 -:108390003E400B9002E400B90222400E9002200001 -:1083A000100000000000000018052400B9402A4A0F -:1083B000089102A40089002E401A900A2404890022 -:1083C0002A400B9002E400B1002A400B9002060004 -:1083D000400000000000000008040400B101A848AB -:1083E000889002048081402C5018140A841089401F -:1083F0002C400B1002C400312020400A100A020158 -:108400000000000000000000B80D6140F0503A008C -:108410002CA002A142C8003E00DE002321428800B9 -:1084200038140F8503E140F85038140F05032E016E -:108430005000000000000000981DE408FD003644D4 -:108440000FD0036440F9003D500F9403E5007D40D8 -:108450003E400F9403E400F9103F400E9003E60401 -:1084600070000000000000001805E400FD403368C3 -:108470000CD003E781F90033780DD81326A0CDA0E6 -:1084800032400D9B032400F9A03C442C9007860049 -:1084900070000000000000003810E000B8A0A2103A -:1084A0001880038284B880362C2E0F02A3A0D8E057 -:1084B00036228B080342A0F8E02E28088802CE045A -:1084C00030000000000000000805C400B100A0500A -:1084D000283002C580B10820400910A24408814814 -:1084E00020400B14020480B1382C4808128282010B -:1084F00070000000000000001811A400B10022402C -:10850000089202E400B90226584A9002E408994011 -:1085100026400B90026408B9012C48089012C6044A -:108520006000000000000000A015E400F980324067 -:10853000089883E404B90130400D900B6402C9002F -:1085400032400F90032400F9001E580C9003A80439 -:1085500070000000000000002801A400F9203C4049 -:108560000F9803A400B9003E428E104B8404F9001A -:108570003E408F9003E400E9003E400F9003CA00A4 -:1085800060000000000000002810A000D8003208A1 -:108590000F8483A004C8043E008380012000C00033 -:1085A00032000F0003A000C80032104E8013CA042E -:1085B0002000000000000000280528008E90A38005 -:1085C0000BE4022800CA002F804AA013A800AA00CA -:1085D00036810BA00228008A00228008A0038A00AE -:1085E000400000000000000028054C0093C020D08F -:1085F0000B34028C008B002CF08B18024C00830093 -:1086000060C00B30028C02830028C10A3002CA000D -:108610005000000000000000A0011E00B40B69C063 -:108620000958061E8097102FC24870829C80A708A8 -:1086300025CC0B70021E8187A2ABC4087302E80030 -:108640004000000000000000A8083E10DC8421E08B -:108650000F78429F02C7883DE02F71034E00CF8004 -:1086600021E20F78839E49CFD039E80E7803EA02E1 -:108670000000000000000000084DAC40CA003600B9 -:108680008F3023ECA8EB403CC00F9643ED80FB00FD -:108690003ED88FB143ED80FB2036CA0FB0A38206CF -:1086A00060000000000000000005FE80FC8031E05A -:1086B00005AA10FE44FF903FE1CFF9173F20D78075 -:1086C0008BE40FF8033E30FF8037E00FF8004000E6 -:1086D0007000000000000000A8119C00BD1021C027 -:1086E000084A02DCC0B7002DC20CD3021C808700F0 -:1086F00029C04B72021C00B70121C00BF0122A04E2 -:10870000600000000000000000009C903400218008 -:108710000970005C0CB7002DC408501A0C009700BB -:1087200021C04B30021C00B70025C00B7002400076 -:1087300020000000000000002014CC00B000600009 -:10874000083E02CC00B3020CE02BB0020C009300F8 -:1087500028C00BB0022C10B30020D603300208044E -:108760003000000000000000A815BC00FB00B200B3 -:1087700005BE037C00FF003E200CB0033C00D98006 -:1087800033C08BF0033C00FF0037E00FF0036A04B6 -:1087900060000000000000008000EC00FB043E00D0 -:1087A0000FA423CC00FB003E81089003EC00E914E9 -:1087B0003EC00FB003EC10FB003EC00FB003E00062 -:1087C00030000000000000000110FC00FF003780B6 -:1087D0000FFA03FC00CF003F9006DC233C00FD10A5 -:1087E00033C00FF00B3C00430033C00FF003C04414 -:1087F000300000000000000081006C09BB1922322B -:108800000BBE036C008B002C900DB802AC00B100C5 -:10881000F2C00BB012AC008B0022C00BB003A04022 -:10882000100000000000000080052C10B30026207E -:108830000B9012EC018B002AC20A90022C00BB00A4 -:10884000A2C00BB0022C00AB002AC00BB002E000AB -:10885000400000000000000008040C01B3002000EC -:108860000B00028C0083002EC00B34028C00BB0076 -:1088700020C00B30020D00A300A0C00B300282010B -:108880000000000000000000000D6C00BB043680FA -:108890000FB202FC02CF0238C00EF0033C00FB0016 -:1088A00023C00FF0033D02EF0033C00FF043C003BD -:1088B0005000000000000000A01DFC00FF003F0071 -:1088C0000FF4237C00FF003FC00DD003FC00FF002D -:1088D0003BC00FF003FC88DF003FC00FF003A80689 -:1088E0007000000000000000C005F050CE1233D030 -:1088F0004C868330805F6833C40FF3833CC0CC3830 -:10890000B3080CC603F1A0FF0033240CC203F0002F -:1089100070000000000000008010EC80D22023D8FE -:108920000D96028860AF4023DC0BF6023CC28860E3 -:108930002252089122E100B724A2488A848260046E -:1089400030000000000000008805C4008100E0C481 -:108950000A00020480A320A8C01B300A0C00A0005B -:10896000280C090202C480B31C2208190302E21178 -:108970007000000000000000C015A400998062C0D3 -:108980000BA032A451AB002AC08BB0000C00A9C0D0 -:108990002A2108B822E200BB0022841BA8427004EE -:1089A00060000000000000004015E200CBC932C0AA -:1089B0000E8B132210DB0132C00FB00B2C0068812C -:1089C0003A222C8823E300FB0030308D9C83D004B6 -:1089D0007000000000000000E001BA40F7043EC251 -:1089E0000DD823D8007B0037C00F7033FC10D200A5 -:1089F00035C08FC003F400F7023FE00E8003F8009B -:108A0000600000000000000040108120C80830C055 -:108A10000C00832440C3893AC00EB00B2C08C9480F -:108A200072540F9103ED02EB8A3A628C800B1004B2 -:108A30002000000000000000C8052B048840A3C2ED -:108A400002AE1227428F4423C20BF4023D000A40BB -:108A500022E00BB502EC208F44A2408DBD233200F2 -:108A60004000000000000000E0054940838124C16F -:108A700008280201009300A0E80A30828F60B390BA -:108A800060B80B28124A0093002090092002780059 -:108A9000500000000000000020011E0287A825E011 -:108AA0000A7B021A04878021E40B78828E02969159 -:108AB00021210B6940DB40979223A089588208004E -:108AC000400000000000000048082582C30034C0B8 -:108AD0000C9B4308D0D32038C00EB0038C00B300E9 -:108AE0002080071003E000D31038180D3003520225 -:108AF0000000000000000000401DB4007F201BD0DB -:108B00000FF103F840EF003FC00FB4037C20CF0407 -:108B1000BF400FF003E410EF183DC00FE003D00694 -:108B20006000000000000000A805E800E300B2C4F7 -:108B30000CA0032400DB6832C80CB403EC80C880AE -:108B4000B6E00CA0032E00CBE0B2600CB80B2A00FC -:108B5000700000000000000048119C028700A1C8BE -:108B60000870021C08970221D4087402DCC00700B8 -:108B700021C08870021800830821C0085002120426 -:108B80006000000000000000C0009E20AD8029E0D1 -:108B90000858021E0097B021E8087802DE10158000 -:108BA00021A10848025E0087A465A0087802300071 -:108BB00020000000000000004814CF108170A8C001 -:108BC00038300A0D009300A0C1283002CC028388FF -:108BD00020E038340A4D72830024E82834821204DD -:108BE0003000000000000000E815BA40EEC0BA8076 -:108BF0000CE0033910DA0032800CA003E800DEC874 -:108C000033A00CE0037B00CA0037B10CE4233A0424 -:108C100060000000000000004800C100F8003600BD -:108C20000F8003C02038003E000F0003E000F80270 -:108C30003A240F8083A001F8043A040D8013D20077 -:108C400030000000000000000810E444C100324081 -:108C50000C9032240CC10638400D90090400D90054 -:108C60003E400F18032400F9013E400F9003C20458 -:108C700030000000000000008004640689002A50D3 -:108C800008940A2400894222500A90122500890083 -:108C90002E500B9C0A2510B9002E500B9002E000BC -:108CA0001000000000000000180524208900204268 -:108CB0000810C2AC1089082A4209900224209900A9 -:108CC0002E420AB1822C20B9006E420B9002C600DF -:108CD0004000000000000000080404008300284851 -:108CE0000812628C80810020400210028480812062 -:108CF0002C490B12060484B3026C400B1202C20111 -:108D00000000000000000000B80D41E0C8783014F9 -:108D10004C0513A142C078381E0D87830140D05006 -:108D20003C140E05030140F8783C140F0503EE03D4 -:108D30005000000000000000981DFC00FF000E44E1 -:108D40002FF1037440F9003E400D90036440FD1084 -:108D50003F440FD101F440F9013FC00FD103E606B3 -:108D600070000000000000001805E622E988B2400B -:108D70000F90032416C98C367B8F9C83A790C90063 -:108D80003E500494132450C9E03E500F9003060057 -:108D900070000000000000003810E28088A0222847 -:108DA0000B8A022A8088A42230088E0A220288A018 -:108DB0002E2888AA12229088F42E200BC8020E04B6 -:108DC00030000000000000000805D420A508214262 -:108DD0000B50821431850825400A502294408508A2 -:108DE0006D40085002540295002D480B50824201FC -:108DF0007000000000000000181584008D10234052 -:108E00000BD00034018D00234158D00234008D086E -:108E10002F5008D20274809D002F480BDC024604BC -:108E20006000000000000000A015E740E9C03240EB -:108E30000F90092600C90436401F9023A408C9409A -:108E40003E400C940B6420D9023E410F9403680409 -:108E500070000000000000002801A400F9803E40DE -:108E60000F1403C508F9003E401F9023E400F900E9 -:108E70003C40AF98038600E9003E400F100B8A008B -:108E800060000000000000002810B000DC40B300CB -:108E90000FC0033102C404B1003C40031000FC4089 -:108EA00033000CC403B100CC00B3000CC403CA04EB -:108EB0002000000000000000280528008A8022A071 -:108EC0000BA0022A008A8422A108A0022808BA0165 -:108ED000228008A02B28008A802A8008E002CA008D -:108EE000400000000000000028054C029B8120E0AB -:108EF0008B3806CE00938020C00838020C00B38067 -:108F00006CE00AB0024C00930020E0083002CA0076 -:108F10005000000000000000A001100480082102A1 -:108F20004B4406D020900821028044021000B4C0B7 -:108F30002D10484002000094892930084002E800C2 -:108F40004000000000000000A8083200D68031A0D8 -:108F50000FE80BCA00D68023A004F80B1A00FF808C -:108F6000BFA02EC813DA025E8073A02C7803EA0239 -:108F70000000000000000000081DAC00F9003E40A9 -:108F80000F90032400E9003E400E8003E400F80047 -:108F900032400FB003E401E90436400F8003C206FB -:108FA00060000000000000000005FE00CD8033607E -:108FB0000CD8433600CD8033600CD923BE004D80E1 -:108FC000336008F80B3E00FD843F600FF903C000DA -:108FD0007000000000000000A8119004DE00238053 -:108FE000086002B8208E04238008680210008E20DA -:108FF00023820840021200F6002D800B41A0EA04F3 -:1090000060000000000000000000900084002100CB -:109010000841025040940021000A5202D800850203 -:1090200025040840221808B4002D100B7840C00019 -:1090300020000000000000002014EE22930020C059 -:10904000083802EC00930020C12A2002640282103A -:1090500024F00A3C422428B3002CE00B8882C80488 -:109060003000000000000000A815AD00CB00B2C029 -:10907000ACBE036E02DB00B2C01EA003E400CA1146 -:10908000B6D0ACBC032400FB003EC0CF8403EA048E -:1090900060000000000000008000E040F8003C009C -:1090A0002F8203A000E8003E001D9013A800F900E5 -:1090B0003A00818343E800E8033E040FB003E00078 -:1090C00030000000000000000110E000D6003780F2 -:1090D0000CA003F800CE0033800DA0132008CE00B2 -:1090E00033820C40733018CE001F804FC1430044C0 -:1090F000300000000000000081047C008D0023404F -:109100000AD002F4008D00234008D4803E428D40F6 -:10911000234008F0023E408D000F400BF402204037 -:10912000100000000000000080052C009900A640FF -:10913000089006E400910020408800022408804046 -:1091400020400AB002240089000E400B8402200057 -:1091500040000000000000000804000082002080A1 -:109160000A2106C801820020800832820808830094 -:1091700060800A0012088082002C800B300A0201F5 -:109180000000000000000000000D6000D800360064 -:109190000C8423E000C80032000D820B2002C800BE -:1091A00032000E00032002C8003E000F80030003BF -:1091B0005000000000000000A01DFC00BF003FC0E8 -:1091C0000FF003FC00FF00BFC08FB003FC08FF02DC -:1091D0003FC00DF003ED00FF023FC00FF003E806B3 -:1091E0007000000000000000C001F08CFF003D6036 -:1091F0002CB2837C90DF3831E00FF8033C00FF2075 -:109200003FC40EF4037C00F48033000DF803F0003B -:1092100070000000000000008010E120BB622E42C0 -:1092200028F4423E408F4422E00BB0837F44BFC10C -:109230002DDC2AF6023F45B880226188B802E0049E -:1092400030000000000000008805C580B2182EC85C -:109250002930320C08B32020C04B92020C00B340DE -:109260002CC08934124C00B00024C1493002E20104 -:109270007000000000000000C011A400BA0C2EE035 -:10928000A9B0062C008B00A2C00B90006C00BB00A4 -:109290002EC00B30026C00BA8026F008B002F00439 -:1092A00060000000000000004011EE00FBC43E78AA -:1092B0002DB0036C08FB0032C08B24832C00FB0014 -:1092C0003EC08FB00B6C08B2E016608DB023D004A6 -:1092D0007000000000000000E001BE98FF403FC0A9 -:1092E0000E7003DC00FF003FC00FE003FC00FF0036 -:1092F0003FC00EF003AC00FE00B9C00FF003F80051 -:1093000060000000000000004010AD00FA403ED0B8 -:109310000EB203EC00C3003EC00CA0032C01FB0006 -:109320003CC00EB803EC00DA003AD04FB023D004B2 -:109330002000000000000000C8052C00BA002CC06E -:1093400008F407BC14DF003EC01AA052BC00BF04E2 -:109350003FC08AF003BC00FA0022C80FB003F2003D -:109360004000000000000000E0054801B1006CC2B0 -:109370000A3042CC0083052CC00830028C01B304B3 -:109380002CC00A30228C00808028C00B3022F800CC -:10939000500000000000000020011E08B7806FE0B0 -:1093A0001878028E40B7802DE00A78029E00B780C0 -:1093B00029E10A78029E01BC8029E40B7802C800EA -:1093C000400000000000000048080940F1203CC4B3 -:1093D0000E3902CC00C3002CC40892038C88B31051 -:1093E0002CC40EB0078C00C20838C00F3043D20224 -:1093F0000000000000000000401DBC10FC007FC009 -:109400000FF083FC21DF083BC08F9001FC21FF0C93 -:109410003FC20FF103EC00EF0077C01EF00390068F -:109420006000000000000000A805E801F90032C05B -:109430000FB203EE90DBE13AC04D38132D30FB0044 -:109440003EE04FBA432C40FA003FC08CB003EA0024 -:10945000700000000000000048119C00B10021C015 -:109460000B7102CC20A72821C00B70135C08B71029 -:109470002DC44B34831CC1B7022DC01A7002D20414 -:109480006000000000000000C0009A20B4C425A2C3 -:109490000B7806DE00838029E01BF8025E80A7A01F -:1094A0002DC80A72021E00A68028E0087802F0008B -:1094B00020000000000000004814ED00B34024C369 -:1094C0000B3042CC00A30020C01B34024C00B30080 -:1094D0002CC04B30020C00B3882CD40A3002D204CA -:1094E0003000000000000000E815B800FE40B7A002 -:1094F0000FA003E800DA003A800FE2036800FA00E8 -:109500003E800FA00B2800EEE03FB004A003FA0459 -:1095100060000000000000004800E004F0083A107D -:109520000F8403E010F8003E004F8083E000F80055 -:109530003C000F80038000F8403E090F8003D200FA -:1095400030000000000000000810E420E900324470 -:109550000C90032400F9003E400F9013E400B90082 -:109560001E400C10032400C9A03C640C900382042C -:1095700030000000000000008004640089002268C0 -:109580000813022408F9002E481B9002E400B900D9 -:109590003E400C90022408F9402E600A9006E0003C -:1095A000100000000000000018012400A900204065 -:1095B0000890022400B9012E400B9002E400B9008B -:1095C0002E40089222240089002E40089002C600F6 -:1095D0004000000000000000080404808121E050E9 -:1095E00028160A0480A1402C404B1422C400B1006C -:1095F0002C500914020404B1002C400A1002C201CC -:109600000000000000000000B80D6140E85032008A -:109610008C80022000B8003E000B8033E010F80080 -:109620003E000C80032008CA003E000C8003AE03FD -:109630005000000000000000981DFC40FD102F416C -:109640004F9103E440F9403E404FD063E500F940BC -:109650003A502E94036500ED003F500F9003E6064C -:1096600070000000000000001815E600F9E033501B -:109670000CDA03A600D9803F400F9103A600F988B9 -:109680003E680CDE036600ED003B690C9003C600EB -:1096900070000000000000003810E108B8E0202051 -:1096A000188E26E10080A02E004B8842E150B84081 -:1096B0002E2A0D0A022008B8002E140D8002CE04B6 -:1096C00030000000000000000805C500B160204027 -:1096D0000831A2C50091482C401B12028400B10041 -:1096E0002C500916020500A3042840081002C201EC -:1096F00070000000000000001805A400B9082070E8 -:10970000289002E40089002E400B9002E408B9037F -:109710002C402990026400B9002E62099002C60410 -:109720006000000000000000A005E500F9D0B27064 -:10973000089003E400D9043E400F9003A410F902FE -:109740003E400D902B6400E98D3A600C9003E804D4 -:1097500070000000000000002801A400F9803E42D3 -:109760000F9003E400F9003E400F9A03E400F90073 -:109770003E402F1003A400F9223C404F9003CA0042 -:1097800060000000000000002800A000F04032004F -:109790000C8003C000F80032201F8003E000C800E6 -:1097A00032000C80022000C8C03E000C8003CA04B6 -:1097B000200000000000000028152810BA0023A097 -:1097C0000AE402E800BA002BA10BA002E800AA00FC -:1097D0002A810AA003E808DE002E800AA002CA003F -:1097E000400000000000000028054C00B304A0B1B8 -:1097F000083622CC00B30020E40B3002CC008300FA -:1098000020C00818020C0091012CC0083006CA00C4 -:109810005000000000000000A0011CC8B32121C2BC -:109820002A7002DC00B7A029C00B7202CE00A7810B -:1098300029C04A7402FE0097012CC00A7012E80089 -:109840004000000000000000A8081E80F7C031E0C2 -:109850000C4803DE11F78021E00B7A03DE00C380A1 -:1098600033D86C78033E00D6803DE00C7803EA02E2 -:109870000000000000000000080DAC08FB803EC0A6 -:109880000FD003EC04FB3C3EC00FB6076C01FB009D -:109890003ED00F9407EC01EA003EC00FB003C206B1 -:1098A00060000000000000000001FE00CFA43B604B -:1098B00008D9037E00CF803F254FFC87BE00CF80B4 -:1098C0007FFC0CFC037C00F69033E00FF803C00033 -:1098D0007000000000000000A8119C088F282140A3 -:1098E00008D0021C40A72031041B7802DC80D7007E -:1098F0002FC41AD0021E48B60061C00B7006EA04DD -:10990000600000000000000000008C008730694407 -:109910000850220C0087012D448B70068C108700A4 -:1099200029C90850021C44A60061C00B7002C00087 -:1099300020000000000000002014CD00838860405B -:109940000010024C002B002C411B3002CC00930075 -:109950002CC00A30420C00B24020F10B3002C80487 -:109960003000000000000000A815BD41CFC0BAF0D3 -:1099700028901B6C08CF002CC00FF003AC008B00AC -:109980003FC06CB04B2C01FB4022C80FB003EA046F -:1099900060000000000000008000EC04FB043FD4E5 -:1099A0000F1003AC00FB0032C05FB003EC00FB04FF -:1099B0003EC04F1013EC00FB883EC04FB003E000E8 -:1099C00030000000000000000110DC00C70033621E -:1099D0000CC00B3C00EF0033E01CF0133C08F70018 -:1099E00031C00ED803BC00FE003DC60CF003C044DD -:1099F000300000000000000081046C00CB0322470F -:109A00000898422C009B002AC00AB0022C00BB041C -:109A10002AC00AB002AC08FA002E6008B002E0408A -:109A2000100000000000000080052C009B0020407A -:109A30000898022C00BB0022880830022C00BB00D2 -:109A400022C08A9202AC00AA802EC008B006E000B4 -:109A5000400000000000000008040C008300A0404B -:109A60000810020C00B30028800A32120C00B30464 -:109A700028C00A30228C20B2002CC0083002C2015B -:109A80000000000000000000000D6C02CB00304020 -:109A90001C94032C00EF0032C088F08B2C00FB00DC -:109AA00033C0AEF003AC80EA013EC02CB003C0036B -:109AB0005000000000000000A01DFC00FF002F402F -:109AC00007D283FC00DF043FC00FB003FC00FF009F -:109AD0003FC00FD00BEC00EE003F400FF003E80654 -:109AE0007000000000000000C005F500CF083F48EE -:109AF0000FC39370D0DC303FD80CB2033CC0FF40A2 -:109B000033C42CF1036250FC3433000F5C03F000CB -:109B100070000000000000008010C4808B002F5AED -:109B20000BA61221C089702FDC08F2C23DD0BF40C5 -:109B300037DC88F50A2080E8102A160B9002E00432 -:109B400030000000000000008805C00083082C449D -:109B50000B02020C0080002CC80833428C90B330FA -:109B600028C84A3212800CB0A028280B1202E20149 -:109B70007000000000000000C015A2008B002E48FD -:109B80000BA022202088802EC028B00AAC00BB0089 -:109B90002EC00AB002A000AB822AA00BB202F004D1 -:109BA00060000000000000004015E700CB003EC050 -:109BB000CF9C0B2100D8883EC00CB003AC00FB004A -:109BC0003AC00EB043E840F8803A600F9803D004E2 -:109BD0007000000000000000E001B400FF000FE092 -:109BE00007A103E802FB003FC00F70237C00FF02C7 -:109BF00035C04DB0037420FC013F000FF803F8009E -:109C000060000000000000004010A500CB00BA403A -:109C10000C140B2F22C94032C08EB003AC00FB00E5 -:109C20003EC00EB003E400C90032002C90031004C3 -:109C30002000000000000000C80124008F00224026 -:109C40002CA54229008B04A3C10DF00A3C00BF00E3 -:109C50003FC008F0016900DA0522D00894037200C1 -:109C60004000000000000000E0056040830120C0CB -:109C70000900022000826022C00830424C10BB0262 -:109C80002CC008B01205009B002082093202380067 -:109C9000500000000000000020011690878020E0A6 -:109CA0000858021614848121E02939025E00B78029 -:109CB00028E00878027A80968121E009F8024800BD -:109CC0004000000000000000480808098B103844DC -:109CD0004D25120C00C21022C80A3803CC00F31024 -:109CE0002CC00C30038AC0D91032402D1003120250 -:109CF0000000000000000000401DBC80FF003F404D -:109D00000FF003F440ED003FC00EF303BC04FF006E -:109D10003FC20FF00BD400FF10BF800EF003D0063F -:109D20006000000000000000A805FA00CB023EC061 -:109D30000F9003A000CB003ACA0CB313AF24CB485A -:109D40001EC80FB6032C00FA003EC00F9003EA00B5 -:109D5000700000000000000048119C0887202DC4FE -:109D60000B5012DC0487002CC00870A21D00A74015 -:109D700025CB8B74821C00B7002DC10B7002D2045E -:109D80006000000000000000C0009A0187902DE0F4 -:109D90000B7802CE0086802DE4297A029E8087A06F -:109DA0006DE80B78021E00B5802D600B7802F00084 -:109DB00020000000000000004814CD0083022CE0C9 -:109DC0000B3002CC0083E02CC00830020C00A30052 -:109DD00024C00BB0020E20B3082CC00B3002D204FA -:109DE0003000000000000000E815B882CA003EA85C -:109DF0000FE003F8028E803E800DA05BA800CA0031 -:109E00003E800FA0033B80FE422F800FA803FA0480 -:109E100060000000000000004800E020F8003E0064 -:109E20000F0603C000F8113E000F0003E000F80029 -:109E300036000F800BE000F8043E200F8103D200B3 -:109E400030000000000000000810E400F9003E406F -:109E50000C9A032440C9C03E404C90032400F900F2 -:109E600036400790032400C90432600F9003C204F7 -:109E7000300000000000000080046400B9022E40A1 -:109E80000A9202250289E02E409890022400B9002F -:109E900022400990020400D90022440B9C02E000F9 -:109EA000100000000000000018052C00B9002C4034 -:109EB000089002242889002C40689042240CB104A8 -:109EC00026400B900A2C8081002240CB9282C60053 -:109ED000400000000000000008040400B1202C48ED -:109EE0000A1202048081212C4C0811020408B110CE -:109EF000204C09120224019120A0480B1002C2013B -:109F00000000000000000000B80D41E0F8503E14D1 -:109F10000C85032140C8503E1008068301F0F86804 -:109F200036100F05032940C85032940F8503EE0305 -:109F30005000000000000000981DF400F9103F449C -:109F40000FD10BF440FD122E4C03920BE400F920CC -:109F50003E4C0F9103FC00FD103F440FD003E6067A -:109F600070000000000000001805F620C9013E4006 -:109F70000FD0033C00BD0032630C9E432700E9C0B4 -:109F80003E680C98033400F9103F400FD003C60020 -:109F900070000000000000003810C220D8002E0021 -:109FA0000B80522804B8002238088803620088F029 -:109FB0002E3A488F0A2000B0802E000B8002CE047B -:109FC00030000000000000000805C48081002C4023 -:109FD0000B10020400B10020424814420580A12069 -:109FE0002C440810820400B1202C400B1002C20146 -:109FF00070000000000000001815A50199002E4017 -:10A000000B90022440BB0122410890122400A900B9 -:10A010002C400810402408B9406E500B9202C60430 -:10A020006000000000000000A015E714C9053E41D3 -:10A030000F900B2404F908B2402C900A2400E90088 -:10A040003E402C90032700F9803E600F9003E80407 -:10A05000700000000000000028018488F9003E48DC -:10A060000F9903E600F9023C40AF1003E412D90453 -:10A070003E400F9003E500F9C03E640F9083CA0094 -:10A0800060000000000000002810A100C8003E0091 -:10A090000F80032100C840B2000C80032010C800CC -:10A0A00032000C8003E080F80432002C800B0A049C -:10A0B000200000000000000028052800CA002E80B3 -:10A0C0000BE80A38108EC022800DA00228000A0476 -:10A0D000028028A002FB00BA0037B048EA020A005A -:10A0E000400000000000000028054C0093012CC037 -:10A0F0008BB0420C909B2020C04830422C00830043 -:10A1000020C0083002CD40B30024C80838020A003D -:10A110005000000000000000A001140087002DC0C6 -:10A120000B24061600930821C80931020C8087A071 -:10A1300021C0187202DC00B7B424E30878022800BA -:10A140004000000000000000A8081E0297A03DF09B -:10A150000F48033E00D68030E02C7A021E82C3F006 -:10A1600033EC0C7C03D600F78035E00CD8032A02D0 -:10A1700000000000000000000819A5A0FB003ECA76 -:10A180000F8003EC02EA003EC60FB40BED40FB006B -:10A19000BEC00FB643E000FB023E800F9003C20634 -:10A1A00060000000000000000005FE02CF883FE0D4 -:10A1B0000CB903FE00DD8133E08CFC033F04CF804B -:10A1C00033E24FFC033E00CFC033640CF803C00001 -:10A1D0007000000000000000A811944087002FC10B -:10A1E0000D69A2D040BC0023C008F0029C0087008B -:10A1F00021C00B700A3C048710214C086002EA045D -:10A20000600000000000000000009E0087002DC0DC -:10A21000096202D800970021C40870020C40970020 -:10A2200021C40B30025800A7082180086082C000BA -:10A2300020000000000000002014E42583002CC052 -:10A24000092202CC20B20020C028B0028C0093006A -:10A2500020C00B30426C20830820E208B802C804FA -:10A260003000000000000000A815A400CF003FC08F -:10A270000D9C03E800DB8033C00CF00B3C06DF00D4 -:10A28000B3C00BF0076800EF4032A80CA803EA0443 -:10A2900060000000000000008000EC00FB002EC009 -:10A2A0000F9403C540FA303EC00FB0036C00EB00C2 -:10A2B0003EC00F3013AD40FB023ED00FB403E000B0 -:10A2C00030000000000000000110E400C70031C1B0 -:10A2D0008CD0033400CD003DC00CF0017C00DB01CC -:10A2E0003DC04CF00B3002C30032000FD0030044DD -:10A2F000300000000000000081046E408B002AC086 -:10A30000288442228088803AC00DB002AC088B00BD -:10A310002EC008B00223208B0022308B8C022040FC -:10A320001000000000000000800524008B0022C007 -:10A330000838862A0089802AC008B002CC009B0019 -:10A340002EC008B04226008B0022710B8C02200028 -:10A35000400000000000000008040C00830028C03A -:10A360000832420000810028C00930528C08830066 -:10A370002CC018300600008300A0000B0002020170 -:10A380000000000000000000000D74028B0033C0CC -:10A390000C920B2002C8003BC00CF503FC00DF014F -:10A3A0003FC104F0332140CF0032000F800B000387 -:10A3B0005000000000000000A019FC00FF003FC09A -:10A3C0000FC403F0009C003BC00FF003FC00FF0033 -:10A3D0002FC00FF003F080FF003F000FC003E8061E -:10A3E0007000000000000000C005F0C0FFA0312494 -:10A3F0000EF0631004EF643FC04CF3031C80DF08D1 -:10A4000037C00FF003F0A0FC0031082CD203F0009D -:10A4100070000000000000008010E100BBC1224875 -:10A4200008FD022E0097002FC24871237E40BF0016 -:10A4300021C54BF502EF00BB4036E008A802E0045E -:10A4400030000000000000008805C584B311A2C9D7 -:10A450000A30020001B33028C40832420C00A308BD -:10A46000A0CA0A32828010B0412411083102E201F0 -:10A470007000000000000000C015A500BB0022E134 -:10A4800028B0022C809B002EC008B0026C00B300E4 -:10A4900022C00BB000EC20BB0026C0088002F004F4 -:10A4A00060000000000000004015E340F70432C0E7 -:10A4B0004EB0232E20EB001EC00CB0012C00FB0080 -:10A4C00036C01FB003E140FB0036980C9003D00467 -:10A4D0007000000000000000E001B604FF023FC071 -:10A4E0000FF003FE00EF023DC00FF023FC00FF0061 -:10A4F0003FC04FF003FC00F4003B400FA013F800F6 -:10A5000060000000000000004010AA20EB1036C0E0 -:10A510000DB007EC20DB0032C00CB0026C20EB0069 -:10A520003EC10DB003E020DBA032904CB00B100414 -:10A530002000000000000000C8052D008F8020C111 -:10A54000087012CF008F00A3C00DF0023C008F00F6 -:10A5500037C088F002EC00880020400880023200FA -:10A560004000000000000000E0054C00A3802481B2 -:10A57000093006CC40930028C108B002CF40A300A8 -:10A580002CC0093002CD00904060402810023800F5 -:10A59000500000000000000020010E00878023E032 -:10A5A000487902DE41978029E01978069E0087806D -:10A5B00025E0087802D203838021A0086802080001 -:10A5C000400000000000000048080C00A30034C058 -:10A5D0000D3042CC01D3103AC50C3903CC00E30452 -:10A5E0003CC40D3003CE00D00030400C30031202CA -:10A5F0000000000000000000401DBC00F7003FC04C -:10A600001FF053FC00EF0837D10FF0837C00F740B8 -:10A610003FC10FF103D000FF00BF840FC803D00675 -:10A620006000000000000000A805E000FB003EE024 -:10A630002CBE83EC00EB403EC00FB403ED20FB10BA -:10A64000B6D20FB483EC00DB8036C10C90212A0017 -:10A65000700000000000000048119400B7002FC0F7 -:10A660000836020C0887302DD98B7286DD00B320A6 -:10A6700021C80B7402D0028400A00028200212041A -:10A680006000000000000000C0009A00B7802DE0CC -:10A69000087A029D00A7A02DE00B78029E80A7807B -:10A6A00021E4087A269E18830421E008780A7000C5 -:10A6B00020000000000000004814CC00B3002CE093 -:10A6C0005830120E8283002CC00B3002CC01B30034 -:10A6D00020C10B3002C00888D2202008000252049A -:10A6E0003000000000000000E815B860FA003F826A -:10A6F0000CA003FA00AA001E808FA003E800F2005D -:10A7000032801FA003E800DA003688ACE0037A0448 -:10A7100060000000000000004800E100F8003E205A -:10A720004F8003E100F0003C000B8003E000F802E2 -:10A730003A000F8043F100FC0A3D000FC003920075 -:10A7400030000000000000000810E600C9903E4004 -:10A750000F9203E400D9003240049007E700F9109B -:10A7600030400C9043E409D98022402C100B0204A5 -:10A7700030000000000000008004646089C02E40AA -:10A780000B9826C58089002240289012E710B90056 -:10A790003640289012C583C980B640089002200038 -:10A7A00010000000000000001805040089402E4140 -:10A7B0004B9002E4009900A2400A9002E500B90023 -:10A7C000E241089042E4009D50AB4A08D0260600C2 -:10A7D00040000000000000000804048281202C508A -:10A7E0000B1002E400814020504A1432C400B140F2 -:10A7F0002451181412D40085402D4008500602013F -:10A800000000000000000000B80D6140C8003E00DC -:10A810000F8002E000D80032000A8002E010F80049 -:10A820003200048003E000D8003A000CC0032E037D -:10A830005000000000000000981DF440F9103F4156 -:10A840000F9403F500F9403E500D9403E510F940D4 -:10A850003E504F9403C500E94136500F9403E6067D -:10A8600070000000000000001805F600FDA83A4046 -:10A870000CD8233600E9A03E780F9E03B680CDE2C7 -:10A8800032680C9B0336824DA037688C9803060013 -:10A8900070000000000000003810EBA0B84020203D -:10A8A000088502215188C02E290B8E02E100D8E0D4 -:10A8B00022320D8D23614898D4A2102884020E0400 -:10A8C00030000000000000000805C500B3002A4A5F -:10A8D00028104EA408A16828440B1402C50081402A -:10A8E000A0500810020402912A204428144A0201B0 -:10A8F00070000000000000001815AC80B900224074 -:10A90000489006A400A9002E400B9022E400990074 -:10A9100022400910026402990022400890020604B5 -:10A920006000000000000000A015E400F9003858A5 -:10A930000C90538414A9043E400F9003E400C90016 -:10A9400032400C90032404D900B6404C900B2804EC -:10A9500070000000000000002801A400F9023E4938 -:10A960000F10436400D9003E400F9003C400F10271 -:10A970003E400F9003C402E9043C400F1C03CA0090 -:10A9800060000000000000002810A180C8203E00E8 -:10A990008C800B2000E8023E000F8003A082C800DC -:10A9A0006C000F80032010C80032020C80030A04E0 -:10A9B00020000000000000002805380086002E80DE -:10A9C00068A8803A008A002E800BA002F8008A0056 -:10A9D0002E800BA00A3A008E10238008A0030A00E4 -:10A9E000400000000000000028054D0083002CC03E -:10A9F0000838000C6023002CC00B3002CC408300D0 -:10AA00002CC00B30020C028A80A0E028300A4A00D9 -:10AA10005000000000000000A001162087022DC198 -:10AA20004870127C00A7202DC90B7200DC0087083B -:10AA30002DC41B32021D01874221C208700228006A -:10AA40004000000000000000A8083E02C7803DEC66 -:10AA50000C58031E00E7803DEC0F7F039600C78073 -:10AA60002DE20779030A06C38030208C38036A027E -:10AA70000000000000000000081DAC00FB003EC00C -:10AA80000F10438C00DB383ED80FB003CC04FB44DE -:10AA90003EC08FB613EC02FF023E000FB003C206A9 -:10AAA00060000000000000000005FA00FF8031E3B4 -:10AAB0000EF823FE02DF80B7E20EF8037E006DD0B1 -:10AAC00033E00CF89B76C0DF84B3E004F803C000E9 -:10AAD0007000000000000000A8119040B70221C4DF -:10AAE000087B42DC00870021C40B300010808D0001 -:10AAF00023C00DF20204428F0029C8287002EA0424 -:10AB0000600000000000000000009400B60023C0B8 -:10AB10000A72028C00870021C00A30020401A702D9 -:10AB200021C0087042008A870021C0287002C0003E -:10AB300020000000000000002014C500B000A0D0DC -:10AB400008B002C9428B0020C00B302204008300F1 -:10AB5000A0C0493002454093C0A8D4003502C804C3 -:10AB60003000000000000000A815AC00BB0031C0A0 -:10AB70000EB023CD00DF0037C00EF0016800E30007 -:10AB800033C01CF0034500DAC892D42CB403EA04A5 -:10AB900060000000000000008000E520FB003EC0D7 -:10ABA0000FB003EC00FB003EC04FB003AD00FB0054 -:10ABB0007EC01F3003A480E9203CC00F3203E000B8 -:10ABC00030000000000000000110DC00C70033C2AC -:10ABD0002CF0033E20DB0013C00C70033C80EF041C -:10ABE00073C10FF0223000C600B2C00CF003004465 -:10ABF0003000000000000000810069008B44A2C109 -:10AC000088B0036C008B0022C028B00A2D00BB0066 -:10AC100062C00BB00226028B8022C008B003204025 -:10AC20001000000000000000800528018A0822C0F2 -:10AC300008B2026C409B0028C048B0162904B90134 -:10AC400022C049B006AE098B8022E048B002200045 -:10AC5000400000000000000008040002820022C042 -:10AC600088B0024400830028C00830020800B10008 -:10AC700020C00B30028C00838020E008300A0201E3 -:10AC80000000000000000000000D6400CA0033C096 -:10AC90000CB2032C00DF003BC04CF5132C04EF007A -:10ACA000A3C00DF003A840CB00B2002CB0030003FA -:10ACB0005000000000000000A01DF000F4003FC0A4 -:10ACC0000FB103F000FF0037C00FF003FC00FF00DE -:10ACD0003FC007F00B7C08FF013F000FF003A80600 -:10ACE0007000000000000000C005F0C5ED333BCC53 -:10ACF0000CF0033040FF253FCC0CF3833CD0DF4801 -:10AD000037304CF303FD80CF2833D80CF1033000EB -:10AD100070000000000000008010ECD0BB3120CC9F -:10AD200088F3422050BF902FC40AF6027DC08F40A6 -:10AD300026408FF602FD00FF0839C808F602A0047D -:10AD400030000000000000008805C480A12028C950 -:10AD500008309A0009B3002CC02030024C908320A8 -:10AD600002080B3312CD80932024D808342222010C -:10AD70007000000000000000C011AE00BB1022C037 -:10AD800008B00226013B016EC008B0024C088B00DF -:10AD9000A2890BB002EC00AB006AC128B002B0047B -:10ADA000600000000000000040156E00E8C13AC0DD -:10ADB0002CB0432600FB063EC10CB00B2C02CB008E -:10ADC00034229FB043EC009B0236C18CB0031004C8 -:10ADD0007000000000000000E001BC00FC803DD0DD -:10ADE0002FF003FC00FB003DC0073003BC00EF0464 -:10ADF0003FE05EB001FC00FF001BC00FF003F80055 -:10AE000060000000000000004010AC00CB013EC913 -:10AE10000CB0172084EB00B2C10DB0036C00C3006E -:10AE200032500FB0030C40C3007EC00C300310043E -:10AE30002000000000000000C8052C008A582EE009 -:10AE400048F0022D00EF0123C008F0223C048F607F -:10AE500036540BF00A3D408F002FC008F0037200FB -:10AE60004000000000000000E005400089802C1038 -:10AE700008B0024900A3A024C00930024C0083C9D5 -:10AE800020904230124D0083006AC0093002380021 -:10AE900050000000000000002001160085806D6257 -:10AEA000087E025640278025E01978060E00838030 -:10AEB00061A00B78024E0087826DE009790248009C -:10AEC000400000000000000048082C02C3613C88DC -:10AED0002CBA124910E32C36C00D30534C44C30039 -:10AEE00020010F31034C00C3013CC02DB1031202FD -:10AEF0000000000000000000401DBC00FF003F00FB -:10AF00004FF109B000FF003BC00EF401FD24FF40EB -:10AF1000BFC007F003BC006F103FC41EF183D00612 -:10AF20006000000000000000A805C400E804320032 -:10AF30000CB603E802CB0036CA0FB503AD00FB2008 -:10AF40003E400FB303EC80FBA832C68CB6032A0048 -:10AF5000700000000000000048119402E60020008C -:10AF6000087302DC0087702DD00BF0021C84B72020 -:10AF70002DC00B7082DD24B74034C9287282920440 -:10AF80006000000000000000C000BE02AC80A120F4 -:10AF9000087900CE04878065E00B7A029E00B790A6 -:10AFA0006DA00B7802DE00B78021E0087802300047 -:10AFB00020000000000000004814ED82ABE020E417 -:10AFC000083002EE0483002CC11B30020C08B300D1 -:10AFD00064F60BB002CC04B30026C0083002920421 -:10AFE0003000000000000000E815BB80EE4931A0F1 -:10AFF0002CA003FA00CA0236800FA003A800FA02B0 -:10B000003F900FA063E800FA0032800CA0233A04BE -:10B0100060000000000000004800E00AE8003E0870 -:10B020000F8003E350F0003E000F8013E000F800B3 -:10B030003E000F8003E001F8017E000F8003D20084 -:10B0400030000000000000000810E440C9A13240B8 -:10B05000201101A640C98436400D900344004100F0 -:10B0600032400F900B2400F9003E404C10030204C4 -:10B070003000000000000000800464008982A240CB -:10B08000089C02250089C82240089042240089209B -:10B0900022600B90022410B9002E4008900360003B -:10B0A000100000000000000018052400890422CAD6 -:10B0B0000A900A2502892020402810026401A90074 -:10B0C000224B0B90022401B9002E41289002060069 -:10B0D00040000000000000000804049081A0204807 -:10B0E0000A320204808100204408110204D0A12009 -:10B0F00020400B11020600B1312C48081402420115 -:10B100000000000000000000B80D6142C854321475 -:10B110000E85032144C828B21A4C86936114E85066 -:10B1200022140F86832140F0401E140C00032E03CE -:10B130005000000000000000981D7444F5103F44CA -:10B140000D91037440F9003E480B9203E4C2D910FC -:10B15000BF400F9203E504F9303E440F9443E606E6 -:10B1600070000000000000001805F622CDA1336138 -:10B170000CD8D33410CDA83E608E9C93A708CD8008 -:10B1800033400E9AD336A0C98032600C9903060072 -:10B1900070000000000000003810E3888AA020281A -:10B1A000088022201288402C28088A022200880069 -:10B1B00022000B8C03210088D0A23E288D020E04B1 -:10B1C00030000000000000000805CE20A1482052F9 -:10B1D000291002240381002C520A1012851091407C -:10B1E000A4400A128244009128244028120202013D -:10B1F00070000000000000001815A400A9142240EF -:10B20000099002A40189042C4008900224009900AE -:10B2100022444B10422414990026400810020604D0 -:10B220006000000000000000A015E440E940B27892 -:10B230000D900B2422C9033E410E9003A402D900B5 -:10B24000165806900B6402D90036400C900B280467 -:10B25000700000000000000028018400D9803E4AF0 -:10B260000E90036420F9083E410F9003E400E108CA -:10B270003E400F9003C400E10038400F9003CA0025 -:10B2800060000000000000002810A009F040B0108D -:10B290004C000B2000F8003A001C0003E000C8003E -:10B2A00036000C80032000C80032000F80030A041F -:10B2B0002000000000000000280528003E8823A28E -:10B2C00048E0001980BE882E800DA042E8008E0064 -:10B2D000239008A00A3A00DA0036800BA00A0A0080 -:10B2E000400000000000000028054C00B38020E072 -:10B2F0002830C20F10B34028C00B3002EC1183403D -:10B3000028D20A30020CC0830020C00B30020A0091 -:10B310005000000000000000A0011C00B60021C089 -:10B320000820C21C10B5002DC80A7202DC40850836 -:10B3300029A21A72220C00933005C40B3222280075 -:10B340004000000000000000A8081600B280312074 -:10B350000C58031E00F78039F80B7C22CE40CF80BA -:10B360009B602E3B031A00C7A811E00F78032A0246 -:10B370000000000000000000081DA400FA003EC00C -:10B380000F9023E800FB003ED02DB603ED02F9003C -:10B3900032400DB007EC00FB603EC80FB503C2069B -:10B3A00060000000000000000005FE00FF8033A0E8 -:10B3B0000CF80B3240CE8137F00CBC03FE00FF844A -:10B3C00033E02CF883E602CF8533F00CFC03001445 -:10B3D0007000000000000000A8119C00BE0035C6EF -:10B3E0002830023040870023C0087A02DC00BE000B -:10B3F00023C0087012FE00870021C008F0022A0452 -:10B40000600000000000000000009520B6002080D1 -:10B410000831025C01870025C0087202DC00B6001A -:10B4200021D0097002D408930020C00870020000E7 -:10B4300020000000000000002014C400B0E02460E0 -:10B440000820064801800020C0083002CC04B30068 -:10B4500020840B3002E8009B0020C0083002080462 -:10B460003000000000000000A815AC00B9E03280F8 -:10B470006CB0236F00C30037C13CF003FC00FA003E -:10B48000B0C009F003EC10DF0073C00CF00B2A0011 -:10B4900060000000000000008000EC10F8003E4258 -:10B4A0000F2403A860F8003CC10FB003EC00F94082 -:10B4B0003E8004B023E100EB003EC00FB003E0008B -:10B4C00030000000000000000110F400EE003D30EC -:10B4D0000CC0031400CCA0B3C04C70035C10DF00A0 -:10B4E0003F000CF003F800CF0023C00CF003004035 -:10B4F000300000000000000081046400BA812E5872 -:10B500000888022780892022C028B0022C00888366 -:10B510002E2005B062E3008B002AC008B003604013 -:10B52000100000000000000080052600B9812E40B8 -:10B53000088C062600880022C008B0166C00988887 -:10B540002E2008B004E3010B0028C00830022000C0 -:10B55000400000000000000008040400B0002CC0FF -:10B5600028000E0010800020C00832020C00800469 -:10B570002E20093002C412830028C0083002420184 -:10B580000000000000000000000D6C00FA003E000A -:10B590002C910320008A0033C00CF0037C00D800FB -:10B5A0002E400CF003E080CF003BC00CF003000302 -:10B5B0005000000000000000A01DFC00FC013F4006 -:10B5C0000FC013F000F4003FC10FF423FC08FC008F -:10B5D0003F000FF003F040FF003FC00FF003E8060C -:10B5E0007000000000000000C005FC20CD1039C82C -:10B5F0000DC1033C80EF9023D80FF800FE00CF80F0 -:10B600001FD00FF903FF00E7C033C40FF003B000F1 -:10B610007000000000000000C010FE02894023F00E -:10B620000885103C008B00A3DC4BB282EC208B0021 -:10B6300026C04BB002EC10B9042AC90BB580F00447 -:10B640003000000000000000C805CC00816428C460 -:10B6500009B20A0CF0A32020C80B3202EC028308C6 -:10B660002CC8093202CC80ABA020C80B3200B2013A -:10B670007000000000000000C015AC10890022C05E -:10B6800008B2122C020B0022C00BB802EC008B0097 -:10B6900026C04BB046EC00B9000AC00BB002F00463 -:10B6A0006000000000000000D015EC10C9E03AC0B6 -:10B6B0000D28032C00EB1032C00F8203C400CB0016 -:10B6C0003EC10FB006EC08E900B2C00FB013900401 -:10B6D0007000000000000000E0019C00F5A03FC0E9 -:10B6E0000FE803FC08FF003FC08FC003FC00FF0011 -:10B6F00037C00FF003FC00FF043EC00FF003F8005A -:10B7000060000000000000005010AC00F94034C0A0 -:10B710000DB4032C00DB403EC02C80036408FB10FA -:10B720003EC68FB003EC00F98032C00CB00B14049D -:10B730002000000000000000C8053E20E9C837D402 -:10B7400048AA221C008B006FE0088582ED40BB8474 -:10B750002FC04BB803AD40B30023D408F70232002A -:10B760004000000000000000E0014C00B164A4C0F3 -:10B7700009200A0C04B8006CC0083802C840B38025 -:10B780002CD10B3002CC04B30028C00830023A00A0 -:10B790005000000000000000B0011E00A58025E060 -:10B7A000883A121E00A6902DE2087902DA00B782CC -:10B7B0002DE00378829E00BCC129E00878022C109D -:10B7C000400000000000000049080C00F30034C0F5 -:10B7D0000D3E030C00F0402EC00C3043C800F300B7 -:10B7E0003CC0073003CC80F20038C00C300312029A -:10B7F00000000000000000004019BD20F7003FC21B -:10B800000FF10BDC20DE043FD207F013F840FF00FD -:10B810003FC007F003FC00FD0037C00F7003D006E7 -:10B820006000000000000000AA05CF00DC003ECA56 -:10B830000FA000AC92C90032C00FB011A408FB00E9 -:10B840002EC04FB023EC00F9003EC40FB003EA0055 -:10B850007000000000000000C8919C00840001C03E -:10B860004B70221CC0870021C04B70021C00B70126 -:10B8700025D80B7022DC00B6002DC00B7222F2041A -:10B88000600000000000000080009E809780A9E01A -:10B890000BF802CE08858029E80BFC021700B78060 -:10B8A0002DE08B7802DE00B4C02DE80B7902E000B9 -:10B8B00020000000000000004814CC008308A0C055 -:10B8C0008B3C024C008300A0C01B3C0A0F29B30034 -:10B8D00024C00B3002CC00B3802CC00B3002D20449 -:10B8E0003000000000000000E815A800DE003A80EB -:10B8F0000FEA02E800CE003A800FE0033800FA00B9 -:10B900003E800FA003E800FE003E800BA003FA0477 -:10B9100060000000000000004800E000F804BA01E8 -:10B920000F820B8004F8803E000F86036000F80051 -:10B9300036000F8023E100F8003E000F8003D200A4 -:10B9400030000000000000000810E401F90032405F -:10B950000F9003E400490032400B9003240049009B -:10B960003C400D9003E408C9003E600C90030204C3 -:10B97000300000000000000080046400B940A264B0 -:10B980000B18022500D15036504E900A24028940EF -:10B990003A51089402E52289442E6028900A20003A -:10B9A000100000000000000018012400B10822402F -:10B9B0004B9282A500A90822500A10020C00A9404F -:10B9C0006E500B9402C40489446C488810024600EF -:10B9D000400000000000000000040400B140E0400E -:10B9E0001B140A0400B90024401A10220400A1000C -:10B9F00028400A1012C40081026C40081202420161 -:10BA00000000000000000000B80D6008B000320027 -:10BA10004F8002A150E05032140EA5232140E8507F -:10BA20003E140F8503E140C8501E140C85436E037D -:10BA30005000000000000000D819E500FD403E5015 -:10BA40000F7403A5005D003E500A5013F400D900A6 -:10BA50003A500D9013E400FF003E500F9103A606EC -:10BA600070000000000000001805F690BDE8236B90 -:10BA70000BDA0B3680C9003268469043E400490077 -:10BA800032680C90032440F90032600C9C03C6011C -:10BA900060000000000000007810E100B8E0A21192 -:10BAA0000B8E0A232288802A31288802620088802F -:10BAB000A23028888A2200B8A8A23908CA02CE0477 -:10BAC00030000000000000004805C50821000040CB -:10BAD0000314828580AD0821529850823423850852 -:10BAE00021520850065400B520215A095402D201AF -:10BAF00030000000000000001811A400B9612240CD -:10BB00000B90060400AD00694008D0027400850067 -:10BB100001400070067404B500234009D002C60439 -:10BB20006000000000000000A014A400E900324002 -:10BB30004F950BA400E90032408C90032400C9000B -:10BB400032400C90036408F90032403D9003E80451 -:10BB500070000000000000006801A408F9003E40E9 -:10BB60004F908BE404D9013E400D90036400D9014D -:10BB70003E400F9003A400F9003C400E9003DA0011 -:10BB800060000000000000002810A000F8403620EF -:10BB90001784032021C8007E022C80432000E80285 -:10BBA0003E010F8003E000C8401E000F8003CA045E -:10BBB000200000000000000028052A88B60223A00B -:10BBC0000BEC422B00D2806EB108A0220800EA04E0 -:10BBD0003A809FA003A8008A042E800BA802CA0006 -:10BBE000400000000000000028054C00B200A4E165 -:10BBF0008BB432474583902CF44B38120E44A3018A -:10BC00002CC04B3002CE0093006CC00B3802CA002F -:10BC10005000000000000000A0011C00B74421C239 -:10BC20000B5402540587002C409B6C021810A7048B -:10BC300029C00A70029B0097040D800B6082E80007 -:10BC40004000000000000000A8081E00F38035E05E -:10BC50000B3802521084802DA00FF80B1E00E680D6 -:10BC60001DA00B6803FE02D6803DE00F7803EA02B8 -:10BC700000000000000000000A1DAC00FB003EC1F7 -:10BC80008B900B800AB8012E000CB003E800FA007C -:10BC90003EC00FA043EC00EB003E800FA623C20283 -:10BCA00060000000000000000005FE00FE80332060 -:10BCB0004EC912F650EF903FE00C1900B642CF216A -:10BCC0003FE00EF902E6C0FF803FE04CDC0340009D -:10BCD0007000000000000000AA119400B70081402D -:10BCE00008030214C487012DC8086A12384087026D -:10BCF0002DC0087112D280B7002D800860022A047E -:10BD0000600000000000000000009C00B7102180CF -:10BD100008F4129404A6002CC018D202144886100D -:10BD20002D800A6132D400B6182DC40858020010C4 -:10BD300020000000000000002014C400B30020C058 -:10BD400040B022040082810CC008300A0A008A0038 -:10BD50002EC008A002C400BB002E800820020804E8 -:10BD60003000000000000000A815AC00FB00A0C0DF -:10BD7000249423AC10EBA00EC00CB0022E20C900FE -:10BD80002E400E9003EC00F9803E406CA00B2A047C -:10BD900060000000000000008000CC00FB003EC0FE -:10BDA0008990032C00FB023E404FA0036D01FB4134 -:10BDB0003EC08FB403E800FB203E500FA403E00018 -:10BDC00030000000000000000110FC00C320B2C0E1 -:10BDD0000DD0033800CD003F800DF003FC00FD02C4 -:10BDE00036000CD0033F08FC0412C00CA003C04472 -:10BDF000300000000000000080046C028BC822C0EC -:10BE000008980A2A4089202E018EB012EC80BBF0DF -:10BE100022E508BD022E00BB9022ED08A202E00040 -:10BE2000100000000000000080052C008B012200A3 -:10BE300049A81E04008B012EC0499002E400B900FD -:10BE400022400A90022C00B9002A40088002E0003B -:10BE500040000000000000000804040081002040B1 -:10BE6000082002040083002CC00A2042CC00B3004A -:10BE700020C00230020884B3040840082002C21126 -:10BE80000000000000000000000D6C008B00B2807C -:10BE90000DB1032402CB013EC04D9043E400F900F4 -:10BEA000B2002E900B2C80F800BAC02C8003C00387 -:10BEB0005000000000000000A01DF4007D003FC005 -:10BEC0000F7203D400FF003FC00EF147FC00FF00DB -:10BED0003BC00DF013FC50FF0037C00FE003E80635 -:10BEE0007000000000000000C005F0C4CC333F0427 -:10BEF0002CF6033860CC90B3200FF123F060FF01E3 -:10BF000023C80CF28A3C81DF303F640CD803300434 -:10BF100070000000000000008010E0C28A302E187F -:10BF200008F530A594582222214BF302E1009F70BE -:10BF30002BE40AF4121D40AF722C492F3082A00668 -:10BF400030000000000000008805C48080A02C980C -:10BF5000083222080082002800033202C084B30C99 -:10BF600020C05832928C30A3202EC0481242620169 -:10BF70007000000000000000C015A8008B002E20FB -:10BF800008B00A200198002A220BB002E6009B00AC -:10BF900022C00AB012AC04AB002EC003B002F00005 -:10BFA00060000000000000000015E500C8003EB081 -:10BFB0000CB0032900C8003A204FB003E220FB0177 -:10BFC000B0C00CB0032C00FB023C410C9043480471 -:10BFD0007000000000000000E001A280FE403E0072 -:10BFE0000FF063EC00BFC417420FF003EC00FF003A -:10BFF0001FC10FB0035C00FB003F404FF000B800D2 -:10C0000060000000000000004010A502C8003E9043 -:10C010002CB00B0106CB013E505FB0132110CB00BA -:10C020007EC00CB00B2C00CB0032C00C900310046F -:10C030002000000000000000C80528018BD02C342F -:10C0400048FF023000AA042E690FF0036810DF00D9 -:10C050002FD40DF0023E005F04B6C008B00372009A -:10C060004000000000000000E005699081802C0085 -:10C0700048B802080999004CB00B30020C008B0044 -:10C080002CC009B0400C40830000400A90023000F0 -:10C0900050000000000000002001160084882DE4FC -:10C0A0004839021600B4802DE00A7B065E009780B6 -:10C0B0002DE20978021E90978025648A7802480054 -:10C0C000400000000000000048080D0081102C9680 -:10C0D0000831230C0090203CC41BB8020840C30068 -:10C0E0002CC40D30030E40C31030C04E10071A127E -:10C0F0000000000000000000401DBC007D053FC5A1 -:10C100000FB10BF400EF001F450FF043FC01FF409F -:10C110003DC41FF006FC10FF003BC12DF103D0060B -:10C120006000000000000000A805EC04CB043EA065 -:10C1300044B6032804CB8032800FB3936008FB2001 -:10C140003ED21FB3032D80FB617E408C98032A00F2 -:10C1500070000000000000004811840C86052DC00E -:10C1600008F4828C908500A1C00BF0025C003700BF -:10C170002DD00B71021CC8B7482D400A7002120462 -:10C180006000000000000000C0009E0087802DA11C -:10C1900060784A16D0A78029E00B78529601B790B4 -:10C1A0002DE80B7A225E40B7A02FE14850223000E4 -:10C1B00020000000000000004814CC1083842CC034 -:10C1C000083002A41083CB28E00B302A4F409300A4 -:10C1D0002CC00B30024C10B3022CC0AA3002120447 -:10C1E0003000000000000000E815B800CEA03F803D -:10C1F0004CA02B3A00CE403BB80FA003B900BA00C8 -:10C200003E800FA0036800FA007E801CA00B3A0459 -:10C2100060000000000000004800E002F8003E045A -:10C220008F0003E04AF81026180F8003A080F80260 -:10C230003E008F000BA000F8023E000F8013D200DA -:10C2400030000000000000000810E420C900324067 -:10C250004D99032400C9023E680F90022400E900B2 -:10C2600030408C90030440C9003E400C900302040F -:10C270003000000000000000800464208906225085 -:10C280008B9CC22400D9012E400B90422408B90196 -:10C2900022460D900A260289002C400A1002200036 -:10C2A00010000000000000001801060091404270DC -:10C2B0000B90122C028B002E400B1022E410B100C8 -:10C2C000A240489012240899022E400890020600CD -:10C2D0004000000000000000080404929120E048A3 -:10C2E0000B1202040291102CC00B100684C0B11076 -:10C2F0002048891102058091402E442A94020201AF -:10C300000000000000000000B80D6140D85030145B -:10C310000F850B21E080403E000F878BE10CF86C0D -:10C3200032008406832004D8283E100C00032E031C -:10C330005000000000000000981DF440AD103F4583 -:10C340000F9103FC187D201F410F900374C0F92149 -:10C350003E440F9201E440E9003D484FD003E60619 -:10C3600070000000000000001805F780FDE0337049 -:10C370000CDA032620C94031400E9A032400F980CC -:10C380003B600F9C8336A0F9A1B0400F9103C6001B -:10C3900070000000000000003810E290B8A02228D1 -:10C3A00028880A220288A02200088802C280B88851 -:10C3B00022040B8E032280B8D02A200B8802CE04E0 -:10C3C00030000000000000000805C580B161005881 -:10C3D00048168A04A0890122401A14880420B1401A -:10C3E00028400B100A0420B12C204A0B1202C20173 -:10C3F00070000000000000001815A590BB40204010 -:10C40000089002244089426258081002E500B903EE -:10C4100022C00B9002A41431002A440B9002C604DF -:10C420006000000000000000A010A500F9013240EB -:10C430008C90032700C19430400E90032400F90033 -:10C440003A400F90032400F9003260079027E80576 -:10C4500020000000000000002800A418F900BE44DD -:10C460000F9003C400F900BE618F9003A400F10097 -:10C470001E400F10032408F9007E400F9003CA00ED -:10C4800020000000000000002810A181F800320404 -:10C490000C00D32100D8043A149C80032101C80069 -:10C4A00036000C80132010C80032002C8003CA0410 -:10C4B000200000000000000028043A00BE8423850C -:10C4C00008EC8368048A002F904DA0022801DA004E -:10C4D00023B00AA0022A08DA0122800FA002CA00B3 -:10C4E000000000000000000028054C00BBF020C048 -:10C4F000083C0A0C00930128C88930064C008302CE -:10C500002CF60830020400A30020C00A3002CA0042 -:10C51000500000000000000020011D11B300A0C069 -:10C520000850025C1087016D814932521EC387009A -:10C5300028E00A32261F00370023E00B7202C800F1 -:10C54000400000000000000028081200B7823120DF -:10C550000808370F08D7E03960197A0B5E0C83B2F0 -:10C560007DE00C7A0B3E02AFA0B1E00E7A03CA0266 -:10C570000000000000000000081DA010FB003EC0ED -:10C580006FB043EC11FB003E400FB503EC20FB50B5 -:10C5900036000FB543E5A1DB783EC00FB403C206F9 -:10C5A00060000000000000004005FE00FFA03FA06A -:10C5B0000DC9133E00CFD03DE802FF133E00CF82ED -:10C5C0003F600CFC233E10EF8033F20CFC83100024 -:10C5D0007000000000000000A8119C40B5012DD0A3 -:10C5E0000858021C4057102D5A283102BC019710E0 -:10C5F0002D000A70028404CF0029C00AF0022A0428 -:10C60000600000000000000000009000B72A2D82AA -:10C610000842223C0087110DCC8832021D00970091 -:10C620002CC40830021400A70023C0097082000047 -:10C6300020000000000000006014C020B0202C503A -:10C640000810022DC093E22C210830020E0893003E -:10C650002C400A30028C0093002AC00B30021804D0 -:10C660003000000000000000A815AC00F8C03E80BB -:10C670002CA00B3F00C7603ED00CF00B3C00CF005D -:10C680003E800CF00B2C00EF0033C10DF00B2A04A0 -:10C6900060000000000000008000EC40F3403E50CD -:10C6A0008EB403EC10FB003E090FB013EC42EB001C -:10C6B0003C008FB013C411E3003EC00EB003E00095 -:10C6C00030000000000000000110FC00FC8031225E -:10C6D0000CA8033C00CF0033A00EF003DC00CF0019 -:10C6E0001FF00CF003F400CF0233C00CF002005432 -:10C6F000300000000000000081046F00BBC0227009 -:10C700000AB9422C108B00761183B002EC10AB00FA -:10C710002EB00AB003EC048B00A2C028B002204067 -:10C72000100000000000000080056540B820224491 -:10C7300058340A2C008B0022844BB002EC008B0092 -:10C740006EC008B042E6048B0002C0083002A001AF -:10C7500040000000000000000C000000B10020C0FC -:10C760000A300A0C008B0324800B3002CC00A3009B -:10C770006C000A30028D00830020C0183002820055 -:10C78000000000000000000000086400F800300015 -:10C790004CA00B2C02CF0022400EF503FC00CF0171 -:10C7A0003E000CF012DD02CF0233C04CF00B8003D0 -:10C7B0001000000000000000A419F000FC003F4041 -:10C7C0000FB103DC00BF013F000FF223FC10FF009C -:10C7D0003F000FF001F484FF003DC04FF0136806E6 -:10C7E0007000000000000000C005FE40DF8033C87C -:10C7F0000CF8033C0A9FC03FF008B8023E00FF80DF -:10C800003FD80CF9612E406F903FE48FF1833000E8 -:10C8100070000000000000008010EC048B8023F00A -:10C8200008B8023D40AB000E084822826C20BB00D5 -:10C830002FD048B0022C00BB002EC10BB002300438 -:10C8400030000000000000008805CC028301A0C574 -:10C8500008B04A4CA0802428C80932024C00B30812 -:10C860002ED129B23A0C84A3212CC84BB20A320132 -:10C870007000000000000000C015AC088B0022C052 -:10C8800008B0024C008821242109B0466C00BB0688 -:10C890002EC009B0022C10BB002EC00BB002300419 -:10C8A00060000000000000004015EC00CB0032C02A -:10C8B0000CB9026C00CBC83AC02D900B2C08FB00C1 -:10C8C0003EC00D30422C00EB003EC00FB013000400 -:10C8D0007000000000000000E001BC00EF003DC05F -:10C8E0000FF003BC06EF823F404EC983BC00FF003F -:10C8F0007FC01CF0137C00FF043FC00FF003F80062 -:10C9000060000000000000004010AC00FB023EC0D0 -:10C910000EB003AC20D8403EC08C900B2C00FB0026 -:10C920003EC90DB033EC08FB023EC00FB00B5404FF -:10C930002000000000000000C8052C00B3002FC03C -:10C940000B3012FC0088A02E402894022C10BB044F -:10C950002DC028B002EC00BB002EC00B72063200C6 -:10C960004000000000000000E0056C00B3002CE077 -:10C970000A1002CD0093002CC008B0024C00B30096 -:10C9800028C0083002CC00B3002CC00B30023A00A3 -:10C99000500000000000000020011E40B7802DE282 -:10C9A0000B5802DE0297812FA00868025E00B78153 -:10C9B0002FE0087902DE00B7812DE00B78023C0001 -:10C9C000400000000000000048080C00F3003CC0DC -:10C9D0000E3203CC80D3003CC40C39034C08F31A4C -:10C9E0003CC60D3003CE20F3083CC00F300352028A -:10C9F0000000000000000000401DAC00FB002EC045 -:10CA00000BB003CC20EB003C800FB041AC00FB002E -:10CA10003CC20FB003EC40FB003EC00F3003D00619 -:10CA20006000000000000000A805EE02C38030CEC8 -:10CA30000D9803ACA0C380B2C00FB003EC00FB00A4 -:10CA40003ED24FB0092E084B013EC024B003EA008D -:10CA5000700000000000000048119C00870121C008 -:10CA60004850124C00870035C04B6002DC04B7010F -:10CA70002DC00B70021C0087002DC10C7202F20445 -:10CA80006000000000000000C0009E00878023E0DE -:10CA900008F802DE808F8121E04B7812DE043780B7 -:10CAA0002DE80BF8023E1887802FE0097902E0009C -:10CAB00020000000000000004814CC008300A0C04B -:10CAC0002830424C00830024C00B3806CC04B3004D -:10CAD0002CC00B30020C0283002CC0083002D204A0 -:10CAE0003000000000000000E815A800CA003180F6 -:10CAF00008E0029802CE0033840BEA03E800BA0093 -:10CB00003F810FA0032800CA003E800DE003FA0415 -:10CB100060000000000000004800E000F8003E0057 -:10CB20000E8423A000F8003A100F8003E000F80004 -:10CB30003E100F8013E000F8003E000D8003D2008D -:10CB400030000000000000000810E401F9003E4041 -:10CB50000C9A13E400C9003E400C9823E480F900CD -:10CB60003E402C98036400F9003E400C9003C20440 -:10CB7000300000000000000080046404B9002E4072 -:10CB8000689C22E40289017C508D9822E480B920BF -:10CB90002E5048100B2500B9442C40289000E0008E -:10CBA000100000000000000018052400B9002E50FD -:10CBB000089002E40489002E500A9202E400B900B1 -:10CBC0002C400891022400B9002E40089002C600B3 -:10CBD000400000000000000008040500B1012C40E6 -:10CBE000483002E40081002A404B1002C400B1002A -:10CBF0000CC00890020C00B3002E40481202C20183 -:10CC00000000000000000000B80D6000B8013E0008 -:10CC10001C8007E150C8502E141E8503E141F850D6 -:10CC20003E140C85132148F8503E140C8543EE0346 -:10CC300050000000000000009819C400F9003E51A7 -:10CC40000F5003E500FD003F401DD003F410F90034 -:10CC50003E500F50009400F9003D400F9103E6064E -:10CC600070000000000000001801E450CD003160A9 -:10CC700004D0033680C1422E501F9403E500E90220 -:10CC80002E720A90220508E9403E50409C0326007F -:10CC900070000000000000003810C28288002215D9 -:10CCA000088002235888A02E280BAA42E28288809E -:10CCB0002E382888022280B8A03A2808CD020E0417 -:10CCC00030000000000000000805C4008100A640FC -:10CCD00028100A242695000D400B50027400850888 -:10CCE0002F4079D2AA1400A5012F4038500212011A -:10CCF00070000000000000001815A4048900264000 -:10CD000008910224109D082F400BD002F4008D02E0 -:10CD10002F4009D0003400BD000B401870020604FB -:10CD20006000000000000000A015C400C9053641E5 -:10CD30004C90632400D9003E400B90034408C90086 -:10CD40003E401510032400E9003C400C90032804E9 -:10CD500070000000000000002801A404F9003A401F -:10CD60004F9803E400E9993E404F9003E420F90A0C -:10CD70003E400E90436424F9083A420F908BDA004B -:10CD800060000000000000002810A000C800120091 -:10CD90000C8043E000C84032000F8453E010F800DC -:10CDA0003E000D80232000D8003E000F80030A04BF -:10CDB0002000000000000000280538028200A18841 -:10CDC000086022C8008A4036A10BA002E910BA44CC -:10CDD0002C800CA41229028A442E980BA4020A006B -:10CDE000400000000000000028054C10830020E0F7 -:10CDF000183092C408934020E00B3002CD00B340BD -:10CE00002CC00B3A42CD0083402CD00B38024A0094 -:10CE10005000000000000000A0411C00870021C05D -:10CE2000287002D1009D8025C24B6002DC08B70249 -:10CE30002CC00A7402FE0087002DC00B340268006B -:10CE40004000000000000000A8081E00C78431E078 -:10CE50000C6803D600978031A00F5813DE08F782C4 -:10CE60003DA00FF80BDE00C7803DE00F788B6A0213 -:10CE70000000000000000000081DAD80F3003EC16E -:10CE80000FA023C002E9003E810F8003EC00FB00ED -:10CE90003EC00DB0132C00EB003EC00FB003820269 -:10CEA00060000000000000000005FF32C780336012 -:10CEB0000F78033EC84E8023640CF8033A00CE80FE -:10CEC00013EC06D8033A00DE8033A40CC803D0006C -:10CED0007000000000000000A8119C00871001C035 -:10CEE0000B7002185084002B4408601298008613BF -:10CEF00021C4885002188086002180086102EA045B -:10CF0000600000000000000000009C00870021403D -:10CF10000BF1025C800600210088D0025C008700D3 -:10CF200020898AF1021C0887102181884802C600E6 -:10CF300020000000000000002014CC108304A0C1D9 -:10CF40000B300A480C88066038080442EC018B0458 -:10CF500022C108300A2C008B002280002002D80455 -:10CF60003000000000000000A815BC00C3002280B3 -:10CF70008F9003640ACB02B2F2203512640AC90012 -:10CF8000B2400EA003240AC900A2402CA003EE0464 -:10CF900060000000000000008000EC00FB003C800E -:10CFA0000F9003A500DB403ED04DB413A408FB0155 -:10CFB0003EC01CA0036C00FB043E504FA403E000E5 -:10CFC00030000000000000000110FC00FF0033C032 -:10CFD0000CE8432600DF80B3E00FF8037C00CD00AF -:10CFE00033040CE0233440CD0023400CE003E00484 -:10CFF000300000000000000081046C10BB00A2D2D1 -:10D0000008280204608B1922C60EB18A2E408B902C -:10D0100022C108A4822C008B90226448A402E00064 -:10D02000100000000000000080052C00BB00220062 -:10D0300008912E24009B0022C08BB012200488008F -:10D040002240081022200088012AD0088042E000F7 -:10D05000400000000000000008040C00B304208021 -:10D060000810060410830020C08BB012000082005C -:10D0700020C02810420906820028C0082002C201F0 -:10D080000000000000000000000D7C00BB003240EA -:10D090002CB0032400D30032C05FB5030C02C100E2 -:10D0A000B2000CB00B0500C100B8C02C8013E00327 -:10D0B0005000000000000000A01DDC00FF001FC0A9 -:10D0C00087F001F400FF003FC00E7043FC107F00AA -:10D0D0003FC00F7003FC00FF0037C00FE003E806FD -:10D0E0007000000000000000C005F184FE6131D82E -:10D0F0000CB2C3FCE0CC807BC00EF1037CE0CC839F -:10D100003F200FF0CB3244DC843F254CF24330000B -:10D1100070000000000000008010E448B01022DC25 -:10D1200008B602FD92888523F440F102ED00882DB7 -:10D130000E600BBC122C10A8822E000AFC22A00448 -:10D1400030000000000000008805C080B32228C025 -:10D15000083082CC0188002CC04A3202CC00010188 -:10D1600028004BB002A00080002C090834026201A4 -:10D170007000000000000000C015AC04B2102AC10D -:10D1800008B002EC10898022C008B002EC088800C8 -:10D190002E4083B002A040B9802C210AB002F004D6 -:10D1A00060000000000000004015EC00FA00BAC06A -:10D1B0002CB043EC00C0803EC08EB0034C0CC810B5 -:10D1C0003E808FB0038210D8823E280CB00B5004F2 -:10D1D0007000000000000000E001B680FD0237C1D1 -:10D1E0000FB003FC00FD003EC00FB053FC02FF0176 -:10D1F0002FA48BF0837C00AD022F40037003B80096 -:10D2000060000000000000004010AC00FB0432C0D1 -:10D210004CB0232C00F8403EC20CB0032C00FB4164 -:10D2200032C20FB0432D00C8503E400CB00B10046A -:10D230002000000000000000C8052F90B95003C076 -:10D2400018F01A3C00B9322DE038F0603C04F900C7 -:10D250003EF00B7C802C00D9C02E400DF002320035 -:10D260004000000000000000E0054B24B21002C1A5 -:10D270002830026C04B2C12CC00830000C00B2008F -:10D280002824033C0A000082C82CA0083002380081 -:10D29000500000000000000020011600B48021E4CE -:10D2A000487B025E00B6806DE24879221E40AC8465 -:10D2B0002DE00BFA00524096802DE8193802080044 -:10D2C000400000000000000048080840F310B0C40F -:10D2D000083A024C90F3103CCC0831030C49B040A2 -:10D2E00030050F3007214043013EC21C304312027B -:10D2F0000000000000000000400DBC10FC103FC505 -:10D300000FF101BC04FF043FC40FB14BFC64F700F4 -:10D3100037C00F7253AC44FF013FC90FF403D0066E -:10D320006000000000000000A805EC08FA003EE0E4 -:10D330000CB0032C00CB023ECA0FB2072E00DB025A -:10D3400032080F31032C00CB043E800C35032A0039 -:10D35000700000000000000048119400B5002DC8C6 -:10D3600008700A1C2287002DC90BF2829C80A6003F -:10D37000098B0B700A1C0285002D40087002920474 -:10D380006000000000000000C0009E00B7802CEC90 -:10D39000087B025E4085892DEC8B7B024E848F805A -:10D3A00025640BFA02120897806FE1087A023000B8 -:10D3B00020000000000000004814CC20B3642CC002 -:10D3C0000830060C10838A6CC05B3042CC00AB1076 -:10D3D0002CF20B30020D0093042CD508300A920475 -:10D3E0003000000000000000E815BB00FEC03E80D9 -:10D3F0002CA0036800C6403F800FA0026800CE4406 -:10D4000036904F60031B70DED83FA00C20033A0417 -:10D4100060000000000000004800E040F8103E00FE -:10D420000F8003A010F8423E101F8003A000E80CFC -:10D430003A041F8003E000E8457E022F8003D200FB -:10D44000300000000000000008106400E980324055 -:10D450000F900B0408D98036400F10132408F900F0 -:10D4600072700F91132410C9103E690C90030204CE -:10D47000300000000000000080046408B9802240F1 -:10D480000B1002240089C422520B90422400B900E0 -:10D4900022E00B90122404D94A2E60089003600009 -:10D4A000100000000000000018052400B118224000 -:10D4B0000B900224008B2026490B90026400B900D7 -:10D4C000A2400B908A24008B002C40A890020600FA -:10D4D000400000000000000008040484B120A048BF -:10D4E0000B11060400830000404B11020449B110E7 -:10D4F00028400B1002244191002C500810024201D8 -:10D500000000000000000000B80D6940E85032142F -:10D510000F869321E2C800360A0B868B61A8F8407B -:10D5200022800F82A32108C8023E000C80432E03F4 -:10D530005000000000000000981DF448FD123E4419 -:10D540000F1203C4007D011E400B9203E480F520FE -:10D5500036400F9003D4907D003D400F9403E606C3 -:10D5600070000000000000001801F6C1DD88327272 -:10D570000C98032622DD003F622C998346A0C94007 -:10D58000B2400FD8032400FD0033512CD88306008D -:10D5900070000000000000003810E3C288C0223094 -:10D5A000088C4222118A012E00088852230080A391 -:10D5B0002A004B804222A0B80022280884028E0450 -:10D5C00030000000000000000805C400812D204844 -:10D5D000681480042081002E400B12120424812044 -:10D5E00020400B94320490B900204048104A0201B8 -:10D5F00070000000000000001815A40089202240DF -:10D60000089012240089002E4008900224088940C6 -:10D6100022500BB0022420B909A2440890028604CB -:10D620006000000000000000A015E400D908B2402E -:10D630004C10230404D9C13E408F900B0408C14014 -:10D6400012400F90432404F14130780C90032804D9 -:10D65000700000000000000028018664F9803E4050 -:10D660000F900BE400F9983E402F1003A402F9102C -:10D670003E400F900BE640F9903E600F9003CA00C9 -:10D6800060000000000000002810A000C841320027 -:10D690000C80072010C8103E0C0E8003E004C80068 -:10D6A000BA000F81432000F8703E000F000B0A04FF -:10D6B0002000000000000000280539028E20A38011 -:10D6C00028E00A3810AE043DA18EE002F8008E007A -:10D6D00076800B60037800BE402F820BA003CA0047 -:10D6E000400000000000000028054D008B8822C08B -:10D6F0001830020C0083442CD01B3012CC0683005F -:10D7000020C10B30820C01B3002C400B30020A0008 -:10D710005000000000000000A0011C00850020CC8B -:10D720000870061C84A70129C00B7222DC80873494 -:10D7300061800B10025C00B7002DC00B7002E80086 -:10D740004000000000000000A8080E008C8031E0BE -:10D750000CFE023F00C5802DE00E7803DFA0C7A0BD -:10D7600021600F78031E80F7803DE00F78032A02C6 -:10D770000000000000000000081DAC00F9003EC0E1 -:10D780000FB003EC00FA003EC006B003EC80FB28AB -:10D7900036D84FA003EC10FA003E500F3003C206FB -:10D7A00060000000000000000005FA00CC80B3E03B -:10D7B0000FF8033E00CF903F604FF8C33E00EF806C -:10D7C00033F00C7A033E70C59033F10C78030000FF -:10D7D0007000000000000000A811B800870021C000 -:10D7E0000B704A1C0087102DC04B710A3C448F12ED -:10D7F00021860D72021E008700234008700A2A0449 -:10D80000600000000000000000009C00840025C0B3 -:10D810000B710A0C00A7122D840B700A1C00B708AC -:10D82000234009F31A5C869708254008700200001F -:10D8300020000000000000002014CC20812026C021 -:10D840000B30022C0082422C800B30220C089B8073 -:10D8500020E00920024D08920024E508300A08045F -:10D860003000000000000000A815AE82CAE0B7C07A -:10D870000FF0133C0AC9C83E400FF0033C04FF847C -:10D8800032C00D90137C00D900F6C02C10032A047E -:10D8900060000000000000008000E400F3003AC1D6 -:10D8A0004FB003EC00F9083C000F3013EC00EB0420 -:10D8B000BE180F9023AC60E9023A404F9003E0009D -:10D8C00030000000000000000110FC00CA0033C05E -:10D8D0000CF003FC00CD027F400CF0423C00CF086E -:10D8E00037100FD003FC10CD083F662CD90300443D -:10D8F0003000000000000000810463808BE022C043 -:10D9000008B022EC00D8806E2068B01A2C01FB0011 -:10D9100022180B88434C0088A02CC01D9002204088 -:10D920001000000000000000800108808B2022C051 -:10D9300008B022EC0088882E6248B01ACC008B0018 -:10D9400026C04A8802EC0008842E4009900220007C -:10D95000400000000000000008040000830060C0D8 -:10D96000083002CC0090066C000830028C00A30442 -:10D9700020008B00064C2180006CC049100A020177 -:10D980000000000000000000000D6C00CA00B2C1E1 -:10D9900088B403EC10C8002E000CB00BBC088F003C -:10D9A0003600068003EC80C8023FC10C90030003E0 -:10D9B0005000000000000000A01DF000FF003FC06C -:10D9C0000F7283FC18FC033F008F70037C00FF0084 -:10D9D0003D000FC0238C06FC003F400ED003E8063C -:10D9E000700000000000000000C541037040DC1022 -:10D9F00037040DC1037040DC1037040DC1017040C5 -:10DA00009C10171405C1037040DC1017040DC031C1 -:10DA1000000000000000000000C5440571015C40EA -:10DA2000571015C40521015C40571015C401710140 -:10DA30005C40171005C40571055C41571015C011F5 -:10DA400050000000000000000080020120804820FB -:10DA500012080482012080482012080482012080DC -:10DA600048201208048201208048201208048020E7 -:10DA7000000000000000000000800000600058006E -:10DA80001600058001600058001600058005600042 -:10DA900058001618018001600058005600058020CB -:10DAA000000000000000000000C5480522011C80A5 -:10DAB000472011C80472015C80572011C8047241CC -:10DAC0005C80572011C80472011C80472015C031AA -:10DAD000500000000000000000C540006000180079 -:10DAE0000600018000600018000600018000600050 -:10DAF0001800060001800060001800060001803157 -:10DB0000000000000000000000C548042201088059 -:10DB10004220108804220108804220108004230142 -:10DB20000880422010880422010800422010802131 -:10DB3000000000000000000000C54A05428150A01E -:10DB4000442C110B04428110E05428110200428140 -:10DB500010A04438110B0542811021142815003102 -:10DB6000500000000000000000800C01570054C06D -:10DB70001530044C01130054C01570054C015300BE -:10DB800054C01530854C01130054C0153005402198 -:10DB90004000000000000000008000004000100075 -:10DBA000040000400010001062040001080441005D -:10DBB0001000441811000010001080040001012022 -:10DBC0000000000000000000004560020800820024 -:10DBD00020800860021800820020800820000820B1 -:10DBE000820000808020021800820020800801311D -:10DBF000500000000000000000C54005640158000E -:10DC000056001580056001580056401580056001DA -:10DC100058005600158005600158007600158031C7 -:10DC2000000000000000000000C540036000D800B4 -:10DC300036000D80036000980036001D88056000E6 -:10DC4000D80016000D80036000D88046000D80319A -:10DC5000000000000000000000C5420430810C20DC -:10DC6000430810C20430810C22410818C2043089D4 -:10DC70000C20030810C20430810C20430810C0108F -:10DC800050000000000000000080000030000C0088 -:10DC9000030000C00030000C00030000C000300092 -:10DCA0000C00030000C00030000C00030000C001A5 -:10DCB00000000000000000000080020130804C20C5 -:10DCC000130804C20130804C20130804C3013080C3 -:10DCD0004C20130804C20130804C30130804C021CA -:10DCE000000000000000000000C5420560815820CF -:10DCF0005608118205608158205608118300608102 -:10DD0000582046081182046081183056081580306A -:10DD1000500000000000000000C5420020800820E4 -:10DD20000208008200208008200208008200308063 -:10DD300008200200008200208008200308008031B3 -:10DD4000000000000000000000C5420460811820AF -:10DD500046481192046081192046281182003481BE -:10DD60001820464811920460811820430811801140 -:10DD7000000000000000000000C5600458015600CB -:10DD80005580156004580116005580016004180183 -:10DD90005600458011600458011600418011403141 -:10DDA000500000000000000000800601418050602B -:10DDB00014180506014180506004180506004180D2 -:10DDC00010601418050601418050601418050020E9 -:10DDD0000000000000000000000002010080402060 -:10DDE0001048041201008041201008040201048040 -:10DDF00040205048041201008440201008040020F4 -:10DE0000000000000000000000C546035180D460FF -:10DE100030180D46035180D56035180D4603058036 -:10DE2000D46015180D46031180D46035180D4031AB -:10DE3000500000000000000000C5460571805C60D5 -:10DE4000971815C60571815C20571815C603708197 -:10DE50005C60571811C60531815C60771815C031B8 -:10DE60000000000000000000004546037180DC60F7 -:10DE700037180DC6037180DD60371805C60175813E -:10DE8000DC6037180DC60371845C60171819C01167 -:10DE900000000000000000000045460571815C6044 -:10DEA000571814860571815C60571805C6043181C6 -:10DEB0005C60571815C60571805C60431815C01169 -:10DEC00050000000000000000000020120804820F7 -:10DED0001208048201208048201208048201708008 -:10DEE000482012080482012080482017080480007E -:10DEF0000000000000000000000006016180586082 -:10DF0000161841860161801860063C058604618010 -:10DF10001860161801860061805860561815801028 -:10DF200000000000000000000045400570015C009A -:10DF3000570015C00470015C00570010C004700049 -:10DF40001C00470011C00470015C00470001C011B3 -:10DF500050000000000000000045420060801820D2 -:10DF60000608018200608018200608008200608098 -:10DF70001820060801820060801820060801801120 -:10DF8000400000000000000000054204208108203D -:10DF90004208108204208108204208118204208057 -:10DFA00008204208108204208108204208008011C5 -:10DFB00000000000000000000045420540815020A4 -:10DFC000540815020540811020540C154200408170 -:10DFD000502044081102054081102014080500114A -:10DFE00050000000000000000001030150C0543048 -:10DFF000150805420150C05430150C05430150C0AE -:10E000005430150C05420150C05430150C05401019 -:10E010000000000000000000000008004200108026 -:10E0200004200188006200108004001108004200F2 -:10E03000108004200108004201108004200100002B -:10E040000000000000000000004542020080802027 -:10E050002008080202208080202028000202008080 -:10E060008020200A080202008000202008080011F9 -:10E07000500000000000000000454005600158000D -:10E08000560005800560015808560015800760029B -:10E090005800564015800560031800760015801161 -:10E0A000000000000000000000C540036000D80030 -:10E0B00036000D80016000D80A36000D8005700919 -:10E0C000D80136000D80036000D80057000D800095 -:10E0D00000000000000000000000000430010C00FF -:10E0E000430010C00030010C00432010C004600148 -:10E0F0000C00434050C10430010C00460010C00029 -:10E1000000000000000000000000000030000C00D3 -:10E11000010000C00030000C00030000D00020000F -:10E120000C00034000C00030000D00020000C000E1 -:10E1300000000000000000000000050131404C50CC -:10E14000131004C40131404C50131404C511314163 -:10E150004C50131404C50131404C50131404C0003A -:10E1600000000000000000000000230568C15A30D4 -:10E17000568C11A30468C11A30568C11A30568C0CF -:10E180005A30468C11A30468C15A30168C15800091 -:10E190000000000000000000000000002000080057 -:10E1A00002000080002000080002200090002000F3 -:10E1B00008000240008000200009000200008000EA -:10E1C0000000000000000000000008446201188404 -:10E1D0004621118844621118844601118844621056 -:10E1E0001884462111884462111884062111800088 -:10E1F0000000000000000000000000455011540421 -:10E200005501114045501114004501114044500082 -:10E2100014044500154044501114045501114000E8 -:10E2200000000000000000000000082142085082A9 -:10E2300014208508214208508204208508214208C4 -:10E2400050821420050821420850821420850000C5 -:10E25000000000000000000000000A01028040A051 -:10E260001028040A01028040A01028400A01028000 -:10E2700040A01028440A01028040A0102804000099 -:10E28000000000000000000000000C035300D4C098 -:10E2900035300D4C015300D4C035100C4C035300E5 -:10E2A000D4C035300D4C035300D4C035300D400080 -:10E2B00000000000000000000000080572015C8002 -:10E2C000172005C80672015C80572015C80272012C -:10E2D0005C80572015C80572015C80372011C00092 -:10E2E00000000000000000000000231840C61231AA -:10E2F000848C21230848C61230840C61231048C244 -:10E300001231848C01230848C61231048C6100004C -:10E31000000000000000000000003FFF4FFFD3FF9F -:10E32000F4FFFD3FFF4FFFD3FFF4FFFD3FFF4FFF23 -:10E33000D3FFF4FFFD3FFF4FFFD3FFF4FFFD0000CD +:1081900000000000000000000000000000000000DF +:1081A000009000000000000000120000000000002D +:1081B00000000000000000000000000000000000BF +:1081C00000000000000000000000000000000000AF +:1081D0000000000000000008049000000000000003 +:1081E0007F100034000D00034000D0003400050073 +:1081F000074001D00074001D00074001D00074004A +:108200001D8007E001B8006E001B8006E0013837D2 +:10821000C490000000000000C001FC80FB3036C8A4 +:108220004E0903FC84FF103BC00EC8072280FF22CA +:1082300033C00FC8336E00FB803F200DC253D48083 +:10824000CC3A3F000CF103F0007000000000000089 +:108250008000ED60BF6023F00D82123C608F7023C0 +:10826000F0088802A540BFD063D60B88022E0CBB55 +:10827000802E20888D02E64080602E300AB11220C8 +:1082800004300000000000008805CC80A3402CC40E +:108290004A00128C88A32220C40A904204A9A30099 +:1082A00024C88B8002CC00B3002E01090802840090 +:1082B00080202C100A3242220170000000000000D1 +:1082C000C015AC04B3002AC00808A28C008B00A221 +:1082D000C1109842A700BB0166C10B8002AC04BB71 +:1082E000002E000BB812E40289080E400AB00230DA +:1082F00004600000000000000010AC00EB003EC075 +:108300004AB823EC18EB0032C00E2C122210EB00FE +:1083100026C04F0043ED00FB002E240D8013E40027 +:10832000C8D07C120EB003400470000000000000B2 +:10833000E100BC00FF0035C04FE0037C08FF0117DF +:10834000C24DC003F408F7003BC007C0037C80FFA8 +:10835000243F400CF001F404BC083F280FF00378E0 +:1083600000600000000000004010AC08FB043AC8A8 +:108370000F9403EC10F30034C00EB0036104FB0053 +:1083800036C00EA3032C80FB723E020F8A03E40268 +:10839000C9802A500FB003D0042000000000000064 +:1083A000CA443C00BF0003C00880037C00BF003FFC +:1083B000E20890436000BF0037C00890016D00BB29 +:1083C000402C100BB042D7C089002A7C0BF002F27F +:1083D0000040000000000000E2054C00B30020D582 +:1083E0004A00000C0493000CF00B09020801B320B2 +:1083F00028C00A0C0A0E00B3002430090002C6107F +:10840000804220008BB002F8005000000000000005 +:1084100022011E00B79421E448D9125E40B790298A +:10842000E08B6912D68037822CE8084A025E00B7DA +:10843000A42D200B7902D608869029A00B7902D8AA +:10844000004000000000000048000C00FBA028E8ED +:108450000E2A028C00D30064C00F00430EC4F30048 +:1084600078EC0E0A430E2073E03C024F0003C44038 +:10847000C30038C00F3003D202000000000000002B +:10848000401DBC00FF00BCCC0EB003EC20FB003C48 +:10849000C20C20036C50F30036C40F4003FC08FFED +:1084A0001A3F800FF001E430FF023FC00FF063D0AD +:1084B0000660000000000000A815EC40FB00B2D8E8 +:1084C0000CB0012D20DB013AC88C3803A800FB4812 +:1084D0003EC90F8003EC40FB013E000F0803A408D7 +:1084E000FA80B2800FB1026A007000000000000044 +:1084F00048191C80BF3021CA08F00A0C808F502117 +:10850000C20870509C00B70039C40B40029C04B7ED +:108510002025400B70021480B60021800BF8021257 +:108520000460000000000000C0009E00B7B021EC15 +:108530000B7812DE8497800DE028F802DE00B790F9 +:108540002DE40B68825E80B7A029200B48029600BC +:10855000B78021E10B7A027040200000000000008B +:108560004804CC00B30020C00B38028C04830028E0 +:10857000C08839024C40B30428C01B10028C01B3E0 +:108580000424884B31020400B38020F20B30020235 +:108590002430000000000000E805A800FA00328046 +:1085A0000FE803E800DA013A808CED03FB04FA00DF +:1085B0003E800F6C03FBC8BEC21F800FE503A800FE +:1085C000FE4833804FA0037A0460000000000000E2 +:1085D0004800E000F8003C000C81936000F8013690 +:1085E000100F8003A020F8002A018F8413E100F807 +:1085F0001836000F8013E000F8203E140F8003D2DD +:1086000080300000000000000800E400F100AA40F3 +:108610000C90032400E10038401C9003E400F9A012 +:108620003A40479A93A280F8103E400B9403E640EC +:10863000F9C03E680B100302843000000000000007 +:108640008004E404B9002240089002240489003622 +:1086500040089002E404B9802E404F94036110E872 +:10866000402E400B9042E604B9002E400B900220B1 +:10867000001000000000000018042400B90022408F +:108680000A10520404A9042A4008B002E401B90007 +:108690002E400B9002A80DB8402E40099402E50030 +:1086A000B9042E400B9002060040000000000000BC +:1086B00008040480B12020C80A10420490812004DC +:1086C000C8083026C400B1202C480B90024501B1E7 +:1086D000402C400B1282C400B12B2C4A0B12820298 +:1086E0000100000000000000B8082148F8503200E6 +:1086F0004E850B2140A8522A00088023E140F80053 +:108700003A140FA043A800F8003E000F8203E000D7 +:10871000F0203E884F820B2E035000000000000026 +:108720009819E440F91134442DD003E450791038FD +:10873000442FD003F510F9103E45065003E500E93B +:10874000403F400FD043F500FD283F400F9283E6A5 +:1087500006700000000000000801E600D9903769AB +:108760004D90236780D9E037680ED007A4000586B6 +:108770003E660D50232600C9823D400DD8073602C3 +:10878000CDC033600C9C03060070000000000000A8 +:108790003810E28088A22210288A82238488A022AE +:1087A00014488042820088402E30088002A200D8FF +:1087B00090260008840A2100C8A0A214288C020E6A +:1087C00004300000000000000805C52091402C4442 +:1087D0001810028504B1400C400A10068430814014 +:1087E0002C4859101A046081092E401B14022500E0 +:1087F00091E02060081602000170000000000000F7 +:108800001815A40081002A41089002A400A1002AA2 +:108810004108B08224118B002E40189102A00498C8 +:10882000202E541B90822C0089102244889002062E +:108830000460000000000000A015E400D9003E40E4 +:108840004C9003A410F9003E408E1002A4C2C9004F +:108850003E400D16130184C8203C600F90120400A6 +:10886000D94032500C9003288470000000000000B2 +:1088700028018400F90036404F994A44009900B419 +:10888000400F9013E600F9003C400F9003E300F81E +:108890000136400C9903E402F9803E604F900BCA08 +:1088A00000600000000000002810A000D8003C007C +:1088B0001D80032000E80032000C8483E010E820D3 +:1088C00032008E84032180C8003A190F0403E0248B +:1088D000F0023C000F80138A04200000000000001A +:1088E000280528028A010FA268A00028008A0077C4 +:1088F0008068E012E800DE00368108E0037A08AE06 +:10890000C42F8008ED02FA00BEA03B800BA0420AF3 +:10891000004000000000000028854C0093002CC09F +:1089200088B0020C14A30420C4183802EC1093542D +:1089300028C00A00024E00834968C0023942CE4076 +:10894000B3002CE60BB0028B0050000000000000CA +:1089500020011C0887202C8018F2221C008710217F +:10896000C0087082DC8096802DC00A40027D4027BE +:10897000646DD0486042D805B60429C04B72022805 +:10898000004000000000000028083E88D7E03DE0DD +:10899000087C423E00E38220E00C6803DF04D780BD +:1089A0003BE04E480A5E80C7C219E00E7803D60845 +:1089B000F7803DE00FF803AA02000000000000006D +:1089C000081DAC40FB407E800E3683ED40DB603EF0 +:1089D000800FA003ED28DA0032C40CB00BCC00FBF2 +:1089E000003EC00E8013E010F8003E000FB153C2ED +:1089F00006600000000000004005FE00FFC033E0FC +:108A00000CF9037F04CFD03FE40FB803FE00FF94BE +:108A10003FE00FC8037E10F3803BE00FF803FE48F1 +:108A2000ED80332404F803300070000000000000E3 +:108A3000A8119C80BF04212808F8021EC0CF9021F5 +:108A40004C0B5A42DE00B7802CE80B04021C00B726 +:108A5000A035108F7113DEC0841021800D71022AA1 +:108A6000046000000000000080409C08B70025C89A +:108A7000087102CC80970029C08B7206DC08B50013 +:108A80002DC80B40021C40BF1021C00B7402D480C3 +:108A9000A7402141087002040020000000000000EF +:108AA0006014CC00B3002400083482AC1183002091 +:108AB000004B1826CF20B1062CC10B32020E08B392 +:108AC0008824320A301284088000A034283002182A +:108AD0000430000000000000A811BC00FF00B640F8 +:108AE0002CF443FC01DF003A00039203FF88F900F5 +:108AF0002FC01B0E4B2E90FBE030320B9802EC087F +:108B00006BC032C008F0093E0460000000000000A5 +:108B10008000EC00F3003AC00FB0016C00FB003A9B +:108B2000100FB403EC00F0003CC00F800BAD20FB35 +:108B3000403E1007A863E000FB803ED80FB003E082 +:108B400000300000000000000110FC00FF00720077 +:108B50000FF023FC00DF003F400FC003DC008F005C +:108B600033C10CC003BE00FF903B280E59032E00FA +:108B70007B0032C40FB003D00430000000000000BE +:108B8000C1046C00BB0062A00FB002EC098B002E88 +:108B9000300BA803AC00FAC122C1088C022C00B330 +:108BA000812A000D88B22200B3C022C80BB04261F6 +:108BB000401000000000000080056C00BB01226234 +:108BC0000BB002EC048B002EA2498826EC00A88092 +:108BD00022C028820AACA0BB0822C008800A2884D0 +:108BE000B9C0A2000BB002E000400000000000008D +:108BF00008040C00B31020480A3202CC8083012400 +:108C0000000B02068C60A02020C80801020C00B3F3 +:108C10000028000920020880B100A0800B30024229 +:108C2000010000000000000000096C00FF00A20E1F +:108C30000BF103FC08CF203EC00F8003FC84A8206A +:108C4000B2C88C8003AC44FB703AC00E90032CA4D5 +:108C5000FB00B2400FB003C0035000000000000052 +:108C6000A01DFC00FF263E000FB613ED00FB103FD9 +:108C7000000FC113AC80F8123EC64F4243FC04FF04 +:108C8000313F000FF003EC00FF00BFC08FF003E89E +:108C90000670000000000000C001FC40FC8036C8E7 +:108CA0000F0903C200F8C033CC2C4C036390E09052 +:108CB0003AC00D500B3C04DF643FC88DF1432C00DB +:108CC000D50033C045F223700070000000000000A2 +:108CD0008010ED80BA0221DE8B8222E020B0002BD2 +:108CE000EC098002E340BA202FDC0898122C008B9C +:108CF000512AD00872222E008D8021D008B6822001 +:108D000004300000000000008805CC40B92824C0D1 +:108D10004A12128885A82020C00B2202C091A1000F +:108D200028C20B00128C40A32020C40B300A0C1167 +:108D3000990020C5090102620170000000000000D6 +:108D4000C011AC00B88022C00B8802EE01B8C12A65 +:108D5000C01BA806E200BB802EC08A8002AC00AB1C +:108D6000002EC00AB0022C00990024C008800230F6 +:108D700004600000000000004015EC00B08036C028 +:108D80000EA813E285F3C032C00E9C23E724E882CC +:108D90003AC10F9403AC02EB003EC00FB0032E109B +:108DA0005100B2C00DB0035004700000000000007C +:108DB000E001BC00FF003FC08FD003F004FD043F82 +:108DC000C04CC003F010FC001FC00DD1231C00C715 +:108DD0000039C00DF083FE44ED003BC00F7403F872 +:108DE00000600000000000004010AC00F901BAC1B2 +:108DF0000CB003A108FA0030C88F94032500F900D5 +:108E00003CC00F0483EC00FB003EE00F710B2C40D4 +:108E1000FD0837C04E9103900420000000000000C0 +:108E2000C8053C00B90023C00890022400C80037E0 +:108E3000F00B80016400490233C0849C033C00BFF6 +:108E4000020FD008F4020E10BD8033E008900A3201 +:108E50000040000000000000E0054C00B00620C00B +:108E60000800428400A00020F00B0022CC009000FB +:108E700028C0023D028C00B3002CC29A38020604BE +:108E8000B11220E00830023800500000000000005D +:108E900020011E00B68021E028EA02368086906517 +:108EA000E01BDA065E019E8425EC0A78025E00B7BC +:108EB000802DE008794A1640BD8025E00838020878 +:108EC000004000000000000048080C00FB0028E003 +:108ED0000818028A88A1A020C21F2A23E6C8F0C071 +:108EE0003AED4E34028C08F3811EC00E30030EC0E2 +:108EF000F100B0CA0E210392020000000000000041 +:108F0000401DBC08FE103FD20FE003EC04FF147EAE +:108F1000C00FB123FC01EE003AC40DB013BC00FF3A +:108F2000003FC00EF083FC0CFD103BC02FE103D0CE +:108F30000660000000000000A805EC40F08032D080 +:108F40000CA0036C00F38032DA0FB003EC00FB00DE +:108F50003ECC4C98132C10FB043EC40CF283A6109C +:108F6000DD203FD10CB003EA0070000000000000DB +:108F700048119C80B70021C80C7002DC08B70021A2 +:108F8000C80E7022D800B7002CC20A700A1F08B79A +:108F90000039C80A70021400C5692CCA2A7002D2AE +:108FA0000460000000000000C0009E00BF8164E17A +:108FB0000878025A01BF8021EC4B78469F08378021 +:108FC0002DE88818021E81B7B02DE0097A028E00C4 +:108FD00095A02DE4087802F00020000000000000B9 +:108FE0004814EC00B36020C008B602CC00B30120E6 +:108FF000C08AB086CF00BB106CC10A38020C01B326 +:109000000228C00BB00A0C0081002EC00AB482D224 +:109010000430000000000000E815A800FE40B68003 +:109020000CE4037880FE7432800BE603F900FE0046 +:109030003E800CE0032800FA003E804DA003A8000B +:10904000DA043E800CE403FA046000000000000033 +:109050004800E000F8003E002E8023E000F8013CCC +:10906000000E8003E020F8203E018F8903E000F825 +:10907000003A100E8001E000E8407E004F8003D2ED +:1090800000300000000000000810E402C9017E402A +:109090002C900B2400F9003E68059013A404D9001D +:1090A00032410E9103E400F9003E600E900324006B +:1090B000F10032406890438204300000000000005C +:1090C0008004640089006E400890422400B9002E9C +:1090D000708890032400B9002240089812E400B977 +:1090E000002E400A900A2600B980A2400890122063 +:1090F00000100000000000001805240089042C4026 +:109100000890022401B9002A400BB002A401B90062 +:10911000E0400A9082A400B9002C480A98022480FA +:10912000392022402A900286004000000000000002 +:109130000804048081002C480810120410B1042C8B +:10914000D80A10020400B1002048081002C480B1FF +:10915000222C508A328205A0B12A204A0A128202A9 +:109160000100000000000000B80D6150C8522E142C +:109170000C85032140F8503A001F8503A140F850A8 +:1091800032140E8003A140F8503C800E0203208070 +:10919000FA2032080E8213AE0350000000000000D7 +:1091A000981DE450FD003E440FD003F400FD003E46 +:1091B000448DD001BD00FD023E440FD400E4487947 +:1091C000143E500F92A2F408FD003E4A0DD283E6F1 +:1091D00006700000000000001805E700F9103A6E64 +:1091E0000CB103E440F9443B618E9403E400E94090 +:1091F00032660FDA0BA728C9E03F680CDA83B32088 +:10920000EDA0337908D8034600700000000000008C +:109210003810E200B8A02E38088A02E288E8812ED1 +:1092200014090A03E280B88032300B85022101A8BC +:10923000F4382A080ECA2390C8543438088A920E8B +:1092400004300000000000000805C500B1002840FF +:10925000191002C400B12028400B1006C420A1A29E +:109260006C480B1002840881202C50091002C404A1 +:10927000B1002458083C02420170000000000000C8 +:109280001815A401B9202C40099002E410A9402E21 +:10929000400B9002A400B1012A400B94022400A9C3 +:1092A000002A4001105264008900264000980246BE +:1092B0000460000000000000A015E400F9613A40DD +:1092C0000D9083E520F9013A402E9002E440E90137 +:1092D0009E400F9403A40089003E402D9002E608B2 +:1092E000B90136402C9001680470000000000000B5 +:1092F0002801A400F9003E402E9003E480F9003CD0 +:10930000400C9C23E400F90036400F10438400F920 +:10931000023E400E90038080F9003C402F90038A6B +:1093200000600000000000002810A000C8403601C6 +:109330000D8403E100E8403E080C8003E100F800E2 +:1093400032008F8003A010F80032040E808360008A +:10935000F8003E000C00030A04200000000000009A +:10936000280528008A01228008A024E8000A002F8E +:10937000801AA0022800BA0016800BE0032808EA31 +:1093800000339008EC1B2280C6142F9108A0434A9A +:10939000004000000000000028054C00930024C09D +:1093A000093012CC04A3046CC00930028C00B30055 +:1093B0002CC01330028C00B300E6B80A380244080F +:1093C00082502CD23A30028A005000000000000087 +:1093D000A0010E8097B421C4497102DE8187212D3E +:1093E000D00B7B021C01BF2029C40B30025C00A7FC +:1093F000A121C04A708A0C8184002DD00A5002E855 +:109400000040000000000000A8081E82DFA034EC2D +:109410000D7902FE80E7E82FA0097A029E00F7A2EC +:1094200025EA0B48039E04FFC065E40E68035F0055 +:10943000E4803DE00EF803AA0200000000000000F6 +:10944000081DAC48EB053ED90EB203EC00FB603EB4 +:10945000C00EB283AC00F350A6C04FB003AC00FB0B +:10946000803FD80DA003EC0AF9003EC00D900342E6 +:1094700006600000000000000005FE00BB903EE01A +:109480000839039E20CF8277E01FF803EE00FFC06B +:109490003FE50DF903EE00FB9037A008F80F1E0022 +:1094A000CC9433600DF803C0007000000000000091 +:1094B000A8119C00B7902FE4087A021E008F122595 +:1094C000D80BBB021E00B7002DE8087D82DE40BB32 +:1094D000A027900A76025C80850037C44D7103EAAC +:1094E000046000000000000000009C00B7202DC0B8 +:1094F00029F222BC80970025410B70129C00B7080E +:1095000029C0084212DC40B70029C0096022DC10E3 +:1095100080002140097002C000200000000000000F +:109520002014CC00B3C02EC00834822D0093002438 +:10953000C00B30020F8013002CC00A34A2EC00B321 +:109540000028C00B0002CC00810020C00930028935 +:109550000430000000000000A811BC00FFE03FC084 +:109560000CF483BD00DF0836400B7542FC20FF8001 +:109570003BC02C3C03FC00BF00BEC08D900BAC0276 +:10958000CA0022800DB002EA046000000000000062 +:109590008000EC00FB081EC00FB013EC00EB003A9B +:1095A000100FB023AC01FB003EC03C8403EC00FB79 +:1095B0000026400E940B2C00F9403E900E9013E0D4 +:1095C00000300000000000000110DC02CF003FC0AE +:1095D0000DF00B3C20CF003D000EF0079C01CF02A8 +:1095E0003EC00FC4033C00CF000FC00E44031F0257 +:1095F000CC003F802C7003004430000000000000CD +:1096000081046C008B022EC00DB0022C00AB000652 +:109610002008B003FC00AB002EC00F8006BC00ABDE +:10962000043AF00C88022C00C9803A9208900AA0F3 +:10963000401000000000000080052C00AB002EC090 +:109640000930022C008B0026600BB002AC008B00AE +:109650006EC00BB0422C009B004CE00A90222C0004 +:109660008AC22C4008B042200040000000000000E8 +:1096700008040C00830D2CC60931020D81A31124AE +:10968000008AB1E24C80A3002CCC0B02028C80A398 +:109690004808C008000A0D00810028C00830028276 +:1096A0000100000000000000000D6C00CB202FC85E +:1096B0008DF6132DB08F0036400FF002ADA88F103D +:1096C0003FCA0B80922C10DB403FC00E00032D04DC +:1096D000C8023E400CB00300035000000000000030 +:1096E000A01DFC00FF003FC80EF103EC84FF2037F3 +:1096F000000DB203BCA0FF003EC90E8003FD11FFA8 +:10970000003BC00EC003FC80ED003BC00FF043687F +:109710000670000000000000C001FC90CC923BC825 +:109720000DF0837310FF2837CA4FB203FC00DF200F +:10973000B3C40D6843FE14CB8433E00D7803BE0040 +:10974000FF8037A00CF30330007000000000000021 +:109750008000FC48822103F40FF64220048A602B2B +:10976000DA0BF9023F048F5223D54D8802AE00DB9D +:109770008036C00880022004B80022600D7403E027 +:1097800000300000000000008805CCA0800108C067 +:109790004B30824290A3082CC81A30228D009300CF +:1097A00024C809A0120C04AB0062C009B002CC00AE +:1097B000B3002880083606A20170000000000000F7 +:1097C000C015AC00880822C00A301A001182000AB5 +:1097D000C00BB0422C008B0026C0099102EC20BBCC +:1097E0002866C00880026000B8002A4081B006F8F0 +:1097F00004600000000000000015EC02C8043AC03C +:1098000089B0036800E9C11EC10E3003EC00DB0023 +:1098100036C10D00230E00EB8032C8CD3032EC088B +:10982000F3003C800CB006800470000000000000D3 +:10983000E0019C007C003FC00BB043FD00BEC4377C +:10984000C01FF0035C00FF013BC00EC803BF20DF58 +:10985000003FD00FC013B0007C00B7400FF01BB02A +:1098600000600000000000004010AC0CD84132C085 +:109870000EB007A8016940B2C08DB0A3EC08F30098 +:1098800032C00F8003ED00FB483AC00DB0832C00BE +:10989000FB203E800F7023D0042000000000000059 +:1098A000C8053C00880023C008F0062C10885137FA +:1098B000C008F0077D608F0237C00B8C002D00B30D +:1098C0000038C00880822000B8002E500BF0003213 +:1098D0000040000000000000E0054C00980028C097 +:1098E0000A30028404A30000C06839060C109320DB +:1098F00022C09B01A08F14331428C0093C020C0124 +:1099000093402C880B3002B800500000000000008B +:1099100060011E10878029E00878023E00839024B1 +:10992000E0087810CE04079125E083C9021E04B731 +:10993000842BA408484212CCB4802D640B78021901 +:10994000004000000000000048002C00D01028C893 +:109950000E3B028400E34030C80C38628C00530098 +:1099600030C41F00238C3CF38018C00D30030E80E0 +:10997000D3103C800F300392000000000000000074 +:10998000401DBD00F912B4C007B003CC004A0077F7 +:10999000C00E71436C00F3003FD01FD053AC68FB86 +:1099A000183DC00FC013F050FC043F400FF403906B +:1099B0000660000000000000A805ED40F8043ED25B +:1099C0000FB313E010F900B2CC0EBA036D80DB02C6 +:1099D00032DC4F00036C04F30236400EB003CC00BF +:1099E0004B003C800CF1036200700000000000009E +:1099F00048119C00B4002DC90B7082DC00BC04210E +:109A0000C44B37020CA08F7421C00B40021C81B7DD +:109A1000202BC0084002D00284002D400AF202121E +:109A20000460000000000000C0009E80B4C02DE46F +:109A30000B7A02D200B58821E80A7802DE4097004E +:109A400021E80BCC465E28B7C421F00A7802FE0854 +:109A500097842DA00878027000200000000000000C +:109A60000814CC00B0C02CC09BB002CC20B3602244 +:109A7000C00B30028C00830120C01B06164F00B3C0 +:109A8000A02AF0080002E00090002C400A300202F8 +:109A90000430000000000000E815A810FEC03E8061 +:109AA0000FA003F908FE4022800EA003E800D200B8 +:109AB00032808FE0035800F60033B00E2002E80C2D +:109AC000D2023C800CA0037A046000000000000079 +:109AD0004800E000F8203E010B8003E000F0403E2B +:109AE000005780230000F8003E000F8403A03038A8 +:109AF000003A080FC403F000EC003F100F8003D2BF +:109B000000300000000000000810E400D9013C48CB +:109B10004C900B2401C9C03240AC9003E400D94002 +:109B200030400D9A032284C81432400E9003240062 +:109B3000C90082682C90030204300000000000007D +:109B40008004640089002E4008902224008902824B +:109B500040089002E740898036418D1802A024A871 +:109B600004624008948324008901227208900B202B +:109B700000100000000000001805040099002A40B1 +:109B8000289012040089002240089002A420990025 +:109B900022401890062001880862400A9002341082 +:109BA0008D812341081002060040000000000000E3 +:109BB0000804048081042C48081202040283202037 +:109BC00048081202C48083602448193462A504A1A5 +:109BD00002604008D00254008D0029400812820221 +:109BE0000100000000000000B80D6140D8503A802C +:109BF0000C85022144885032144C8043E000D80088 +:109C000022140C80032000C800A2000E8003200054 +:109C1000C80033000C82032E035000000000000037 +:109C2000981DE444FD003E440F9103F410FF103EE4 +:109C3000440F9103E440F9103E440BF013E510F992 +:109C4000403F4A2F928AA4A2F92836400F9283A659 +:109C500006700000000000001811E6C0C1003F6956 +:109C60000C9A436C00FDA03E782CD807D602D596FE +:109C700032780D90032700FDA0355006D403E5008F +:109C8000FD40B3400F98A3460070000000000000A4 +:109C90003810E3C288882E14A88AC222A0B8C02C2B +:109CA00024488402E10098C4203C088A822380B8BA +:109CB000042220088803A200B8A022000B88020E0C +:109CC00004300000000000000805C480A1206C40A2 +:109CD0000A14024404A1682C48081402C5008160DB +:109CE00020481990028581B14024680A1242C4803C +:109CF000B92020408B10824201700000000000005B +:109D00001805A410A9006EC00A10022414B9002E70 +:109D100040089012E40099002240088006A060B933 +:109D2000092260089002A400B90002400B10060648 +:109D30000460000000000000A005E400E9803E414E +:109D40000E90036400E9C03E400C9002E400C9009C +:109D500022410D8002A304F14036400E9002E4003F +:109D6000F10012400F900368047000000000000032 +:109D70002801A400D9223E420D9003E400B9C43C5E +:109D8000400F9003E400E902AE400F804B6210F9EF +:109D9000203E400F9003E400F9027E410F9013CA69 +:109DA000006000000000000028008000C8003800AB +:109DB0000F8020E000A82032000C8007E080C8005F +:109DC00038000D80832110F86032008E80B32008A7 +:109DD000F8003E000C8003CA0420000000000000D0 +:109DE000280528048A00339043A02228008E80761C +:109DF0008008E1031900868022800D60017800BE92 +:109E00000036800CE402A810BEA02F800DA0020A2C +:109E1000004000000000000028114C0403042CD472 +:109E20000B30024C01A3C420C02835028600838079 +:109E300028C00838060E9430C0A2C00B3C020C00AB +:109E4000B3802C480830028A005000000000000057 +:109E5000A0010C048F8021C11B72421EC083882187 +:109E6000C01828061021863821C019F7025DC0B439 +:109E70004127D00878C69C00B7002F6009720228DD +:109E80000040000000000000A8081E02C7802DA0AE +:109E90000F3E03FE80A780A1E00C7802940085A00D +:109EA00039E40C78131E90B58431E00FF8871E0456 +:109EB000F7803D600C3B03AA020000000000000098 +:109EC000081DADE4FB543E800FB423EC32FB003E92 +:109ED000D84FA003E400F9003EC00F3033EC04F289 +:109EE000013EC00FB203FE10FB683C410FF04382FD +:109EF00006600000000000004005FE00CFE43FE4E3 +:109F00000CFC037E80CF8133FA0FF803F600FF804C +:109F10003FE20F79033E40F48033600CE8033E00DB +:109F2000FF8033600CF883500070000000000000D8 +:109F3000A8119C00D7A02DC408BA023CA0872021FC +:109F4000C00F5203D400B6102DC08B73035C40B415 +:109F5000B02B482841020C00BF1835462872422A0F +:109F6000046000000000000018009C0087412D44A0 +:109F70000A73029CC481006DC88B7002D400B700C4 +:109F80002DC00BF0469C55B42025401860821C0063 +:109F9000B700234008704644002000000000000085 +:109FA0006014CC0093002C400BB0020C8280C020C7 +:109FB000C00A10020400B3002CC01B3000CD01B059 +:109FC00040AC78888C060D60B34C241208300A1817 +:109FD0000430000000000000B815BC00C7002E408F +:109FE0000EF02ABF00C8C8BFC00B9002E404BF0037 +:109FF0003FC00FB20AAC00F88034490CB90B3F00E7 +:10A00000FBC030F00CF0036E0460000000000000A4 +:10A010008000CC00FB803E412CB013AC00F8003E29 +:10A02000C10FA003E800FA403EC00FB00B6D40F82E +:10A03000103A400FB003EC10FE403EC00FF003E1B9 +:10A0400000300000000000000010EC0CDF003B803E +:10A050000FF00B3C08E70833C00BD023740054000A +:10A0600033C00FF083BE20FD0C3B602CE0033C00AE +:10A07000CF1233500C300380043000000000000089 +:10A0800081046C04AB0022A00BB0060C00AB403680 +:10A09000C00BA8026600B80036C10B3443EE00B214 +:10A0A00000226008B4828C048A21224008B0022079 +:10A0B000401000000000000080052C009B002A20BA +:10A0C0000BB0022C0088C522C00B8882E601BB08B9 +:10A0D00022C00AB282AC60B8024AC408B1022C00A5 +:10A0E000830022C008B002A0004000000000000071 +:10A0F00008040C00AB2020010B32062C00A000202D +:10A10000C0090422C400B20024C18BB0024C00B0CC +:10A110000062C0483002AC10820020C00830020249 +:10A120000100000000000000000D7C08DF2A3A005A +:10A130000FF5123C10C900A3C00F8053EC01DA00E8 +:10A1400033C00EB003AC04F8703AC00C60432C422C +:10A15000CD00B2402CF0038003500000000000004E +:10A16000A019FC00FB013D000FB417FC003C003FB0 +:10A17000C04FC0037408FE003FC04FF003FC08F856 +:10A18000303FC00FF003FC04FC003D000FF003E87B +:10A190000670000000000000C005F490EF003FD8FA +:10A1A0000EF3032C01D48037CC0D89431250EC2CD4 +:10A1B00032050DB0533CD4C5947FA08FF0433000DE +:10A1C000DC0033000C4807F00050000000000000E5 +:10A1D0008010E6408B702FDC08F7020C808A20008C +:10A1E000C84A2202A0008A48225888FD02AD02A96E +:10A1F000201EA00380022C048B0022C04C88076024 +:10A2000004300000000000008805C000232C2CC989 +:10A210000230020C68A0282CD00912028400A02170 +:10A22000201819302280D083060CA00BB006001233 +:10A23000A000200029000EA2017000000000000014 +:10A24000C011A8308B002EC04A300A2C14A0800AFE +:10A25000C108888687008300224908B006A040AB69 +:10A260002022200B800A0C04AB0222C0888002F05E +:10A2700004600000000000004015EF40EB063EC007 +:10A280000EB0032C02F9A03EC00D8C03AA10E940C9 +:10A29000B2480DB043AD00CB862E200F3003240012 +:10A2A000F98032C00D0CC290047000000000000064 +:10A2B000E0019400FF003DC00DF0037C00DF00379B +:10A2C000C00FE003F000FE203F400F7003FE00FFD0 +:10A2D000827F000FC003F904DE20BD000FD90B7C84 +:10A2E00000600000000000004010AC01CB003EC048 +:10A2F0002CB00B2C00E8403EC00F94072900C94049 +:10A30000B2C00FB0030102CB0032044FF04334C09F +:10A31000B51A3FC10F8093D0042000000000000058 +:10A32000C80528008F002FC008F0023C04D8002B7D +:10A33000C00C804560007B5822C80BFA0161408B3D +:10A340000032044BCE0228003A402E070B90022622 +:10A350000040000000000000E0054C0083014CC0FC +:10A360000B3002EC1090002AC00A8006C00483045F +:10A37000A289193006CC00830020900B30C248001F +:10A38000B24024200B0900B800500000000000007B +:10A390002001060487A42DE0093802DE009E8129F1 +:10A3A000E0087852FAC0968001A08B3A22CE408F06 +:10A3B000B025A00B08025608B5902DE44BD8220C0E +:10A3C00000400000000000004808080283802EE8DA +:10A3D0000B3813CE41D31028C00E3A02C6084B40AA +:10A3E00030600D3B27CFC4C3A030000F304348403E +:10A3F000F2003C040F020392020000000000000083 +:10A40000401DB800FF003FC40EF1033C00FF0133C4 +:10A41000C04DB1077C90FF003F4003F1037000FB8B +:10A42000103B000FC00BB400FD003FC40FD00390E1 +:10A430000260000000000000A805EC04FB843AC2A2 +:10A440004CB4932C04E9003AC48D08032E00CB01D0 +:10A4500032808FB283EC00CB8032000FF9033C10C6 +:10A46000DF81B3E08CA003EA007000000000000070 +:10A4700048119408B70424C81A304A1D00B7012DAA +:10A48000C08870061C00820021804B7612DC008799 +:10A490000029408B40021000BC002001287003B24C +:10A4A0000460000000000000C0009A00B3902DE49A +:10A4B0000979021E80A7802CE819F8125E018780B6 +:10A4C00025E04B7806D200978021620B3A021E00ED +:10A4D000B78629F0086806E00020000000000000B0 +:10A4E0004814CFC0B30024C08A30320C00B3082C0B +:10A4F000C00830120E20830024F10B3006CE0083FA +:10A500009028600B002A2180B008280008370292AA +:10A510000430000000000000E815B900FA003E8099 +:10A520004DA0032800EE413E800DE00378008E40F0 +:10A5300027A80BA003FB02CA8233A00FA013290097 +:10A54000FA403A800C6C03FA04600000000000003E +:10A550004800C000F8003A000C8003E008F8003E14 +:10A56000008F8023A042F809BA104F8003E060F802 +:10A57000003E200FC003F000FC0027008F800392F4 +:10A5800000300000000000000810E50089003E4097 +:10A590006E9003A408C9003C400D90032410F9A05C +:10A5A00032420C9013C400C9003E400F9003E440B7 +:10A5B000C9203E52CF900902043000000000000084 +:10A5C0008004660089042E400890022400D9003AD5 +:10A5D00041089005A400B940A2400D9002E54689CB +:10A5E000002E400B9012E500A9C82E618B944220EA +:10A5F000001000000000000018012400A9006C40B9 +:10A600004810228403A9002E40099002E404B108F6 +:10A610002840189802E50089002E400B9002F42093 +:10A620008D002F400B944286004000000000000087 +:10A6300008040480A1242C481812020480A10028D8 +:10A6400048081002840091202048091202C4948115 +:10A65000002C610B5A82D4A0A5282D4A0B900282AF +:10A660000100000000000000B80D6002E8502E1448 +:10A670000E8503A140A8503E140D85018140F8527B +:10A6800032940C8013C142C0513E008F8203E0809F +:10A69000C8203F080F8003AE0350000000000000F8 +:10A6A0009819F450D9113E448F9143E440DD003AAB +:10A6B000444FD027B400FD123F444F9143F440FD76 +:10A6C000003F410F9283E4A0F9283E4A0FD0036671 +:10A6D00006700000000000001811F680E9C03E7806 +:10A6E0008F9B03A780C94036780F1023E504DDA4B3 +:10A6F00033620FDA03F660C91033400E9893E630E8 +:10A70000C9C932788CD00B06007000000000000030 +:10A710003810E00088E22E300B88422340A0A122AE +:10A72000380B8A02E280AAE022300B8023AB028839 +:10A73000A02A000B8C02E30088E023380880020E78 +:10A7400004300000000000000805C500A14428589E +:10A75000431622848181202C58491080C48191485D +:10A760006C4A0B14024484810160400A5286D4A0D2 +:10A770008500A150689006D2017000000000000022 +:10A780001805A60089002E400B90020400A9602243 +:10A79000400B9502E410B1004E400B9066AC8089EE +:10A7A000002A600B9052F40085002140089002C6F8 +:10A7B0000460000000000000A005E620E9003E4023 +:10A7C0000F9003A410C90036400F9401E520D94032 +:10A7D000BA688F9007E600C91032620E9002E41842 +:10A7E000C90032400C9003E8047000000000000033 +:10A7F0002801A400F9043E400B90036400F9003ED8 +:10A80000408F9003E400E90272680F9003E600F9BC +:10A81000013E420F9003C402F9043E404F90031AD8 +:10A82000006000000000000028008002C800320024 +:10A830000C80036000C84036000F8403A000D8508D +:10A84000B2108C8103C120C8003E000FC013F00479 +:10A850004C003F000F80030A0420000000000000AD +:10A8600028152A008A04228128A01228008A01368D +:10A87000800BA0102810CE0123810CA812FB008AA7 +:10A88000013B8083A042E8108A002F800B60420ABF +:10A89000004000000000000028054C008300A0C01C +:10A8A00018B000CC009B0024C00B30066C00A3083D +:10A8B00028C8093002CC438B002C800B3002CC021C +:10A8C00083012CC04B30004A005000000000000003 +:10A8D000A0010C24879421E4183102DC8097102514 +:10A8E000CD0BF2027C00A00028E0187002DC01878A +:10A8F000342940094002D00484042D004BD0226842 +:10A900000040000000000000A8081600CFA070E979 +:10A91000187B03FF4097A035E80F74025E20E480A7 +:10A9200039A02D7803FE00C7803DE05F6843C20078 +:10A93000C4841D600F78036A02000000000000005C +:10A94000080DA4003B002ED80FB4032D8AEB623A09 +:10A95000D00FB2870CD0D80032C04F9043EC00FB30 +:10A96000083E408F9003FC00FF043F800F002B82C5 +:10A9700006600000000000000005F600FFA03EF4A5 +:10A980000EB803EE084BF07FF40CF923EE487890F4 +:10A9900032E40CF903FE00FF803FE41C79032E40F3 +:10A9A000FF8033E02C7807000070000000000000FA +:10A9B000A8119400B3000CE50B3802FE808F806173 +:10A9C000C42878004E00F48425A80C7002CC04B38F +:10A9D0009025400C41835240B410A3000C52036AEE +:10A9E000046000000000000000009400B7216DC862 +:10A9F0004B7002DC42A73129C4087202DC00B72880 +:10AA00002480087006D420B7012DC1086002508050 +:10AA1000B4082162097406800020000000000000D4 +:10AA20002014C704B3002CC00BB002CC00A30260FA +:10AA3000C00838024E44A0C02491083002C000B3C0 +:10AA4000002460081C024C88B3C020A008000A88BB +:10AA50000430000000000000A815AC00FF002FC06B +:10AA60004FF013FC08E78A3FC00CF5C2FE10BBC0D4 +:10AA700032D40C3013E304BF002E6208B9026E001A +:10AA8000FB0132A44D9402AB046000000000000002 +:10AA90008000EC60FB001EC00FB013EC005B003ABE +:10AAA000C00FB041EC007B45BA402EB015E001FB71 +:10AAB000003E500EC003F040FC203F508F900160DC +:10AAC00000300000000000000110F400FF003FC053 +:10AAD0008FF0031C02CF0036C00DF0037C007F2AEC +:10AAE0003F800FF8139021CF003F620CE00330004D +:10AAF000F8003F000FD00380443000000000000049 +:10AB000081046411BB002EC00BB0022C00DB0432A8 +:10AB1000C00EB002EC00BB842E400BB94222428B27 +:10AB2000012C720A90422C00BB002EC28F8806E0D6 +:10AB3000001000000000000080012400BB006EC077 +:10AB400048B0422C008B0026C00AB012EC00BB407B +:10AB50002EC80BB0122C008B002E480A30026C005D +:10AB6000BB002E804B9802E0004000000000000077 +:10AB700008040400B3006CC24B31020C509B20202F +:10AB8000C00A3212CC80B3006C0C0B31020C428331 +:10AB9000082E400A00020080B0002C410B10024237 +:10ABA0000100000000000000000D6400BB403FCC2D +:10ABB0000EF0833DA0CF2037C00CF7C3FD48F30053 +:10ABC0003E880FB413A5008F303E400CA003608078 +:10ABD000F8003E000F9023C003500000000000006A +:10ABE000A019F400FF293FC90FF013FC94EF123BAA +:10ABF000C08EB207FD04FF103F0C0FF003F000FB06 +:10AC0000203D400FD043FC40FF043FC00EC043E84E +:10AC10000670000000000000C005FCA2C7203F2411 +:10AC20000CF0033C80CC0933D10CF123FC20DF363F +:10AC30003FC00E4803FE00FF8037E40D780311A0EB +:10AC4000CF0037C80CF00330017000000000000096 +:10AC50008010FF008FD12E080DB6123D45F96427F4 +:10AC6000D088BA14CC048F4023F00B88022E04BB8A +:10AC700080AEC008B80A210088D0222028B0022067 +:10AC800004200000000000008805CC0093002E0086 +:10AC90000A34828CA0A00824D8093102CC20B33217 +:10ACA00028D04A8002CC0CBB00224089B0026080D0 +:10ACB000930024D00B3002A20130000000000000FD +:10ACC000C011AC009B002E2009B04A2C02A0000647 +:10ACD000C009B000EC00AB002AC00B88026C00BBBE +:10ACE000202AE241B82A600A980026000BB002B878 +:10ACF00004600000000000004015EC08DB023E206C +:10AD00004CB0032C028B2012C029B012EC00FB00C7 +:10AD10003AC00E8803ED20FBC834F00DBA0347603B +:10AD2000C90036400FB00B90047000000000000016 +:10AD3000E0019C00EF000F000F3000FC00DF90BB33 +:10AD4000C0CEF003FC04CB0017C00FC003BC84FFCF +:10AD50000037C00ED063B800EA003A800C300370B0 +:10AD600000600000000000004010AC00FB02320058 +:10AD70000FB0532C00FA0032C08FB0072C00FB003C +:10AD8000B2C00F8007AC80DB247ED00EB0237404E9 +:10AD9000DD08B5400CB003100420000000000000E6 +:10ADA000C8053C00BFC0A0001BF0023F60EA502372 +:10ADB000C008FA07FC00DF0063C04818022D00B38A +:10ADC000006EC00D3A032400828032800DF0033201 +:10ADD0000040000000000000E0054C14B359208042 +:10ADE0000930022E05B0442EC0093482EC00AB04B9 +:10ADF00020C00921B28E0493C024C00A18064C005A +:10AE0000925020C008300270005000000000000086 +:10AE100020011E00B78061E00B780A5E01B1A02D11 +:10AE2000E00A78025E00079021E018C8021E00B711 +:10AE3000802DE08AD8023EC085802120197822002A +:10AE4000004000000000000048080C00F3942010AF +:10AE50004B30070C00F3003EC80F3003CC0023102A +:10AE600000CB0520028C60930A2EC40A01074C8097 +:10AE7000D20130C02C300B5A02000000000000004C +:10AE8000401DBC00FF010F400FF013BC00EF267304 +:10AE9000C20CB083BC40FF183DC04AC103FC00FB9C +:10AEA000123FC44DC10BFC81FD003F200FF003D0C9 +:10AEB0000660000000000000A805EC20CB483E0022 +:10AEC0000CB0032D20E980FAC80DB003EE00DB249E +:10AED00076F38E8033EC44EB103EC00F9003E80411 +:10AEE000DC00B3610CB0032A007000000000000019 +:10AEF00048118D0087202F012870020C848D0431A9 +:10AF0000CCC97202DD00373321D8084002DC00B71B +:10AF1000203DC0095022F000970021800AFC0292D7 +:10AF20000460000000000000C0001E8287B02D20D9 +:10AF30000839021E41A78024E0097A328E8207A0D8 +:10AF400025E08B48021E00A7E12DE04B5800DA00F7 +:10AF5000A0802460087A0230002000000000000079 +:10AF60004814CC0083002C000830028C009300228F +:10AF7000C1093042CC00830060C0081A02CE04B37D +:10AF8000E028A0091C824B08A38024A02A30029A42 +:10AF90000410000000000000E815A800CA002F8877 +:10AFA0000CA0132800EE002E802DA003E800DA008C +:10AFB00076800EE803BB80EE402FA28FE603EB867F +:10AFC000FA8037820C20073A04600000000000007D +:10AFD0004800E000F8401E000F800B6100E8C03A16 +:10AFE000000E8003E001F8007E101E8103E008F8E7 +:10AFF000003E000D8003C028DC503B000F8003D2D0 +:10B0000000300000000000000810C402C9003E42E9 +:10B010000F1003A600C9013A400E9401E410F10498 +:10B0200032400F9A232060F8040A420E9013240045 +:10B03000C10032400F900302043000000000000005 +:10B0400080046708A9006E400890022782890026C4 +:10B0500040089C03A410B90036409B1C1A2304B876 +:10B06000003A400E10022402C9A0A2400B900A2010 +:10B0700000100000000000001805258089042C4005 +:10B08000089002848199402E401A9006E401B9008C +:10B09000A6411B90822100B8102E400A920AA401FA +:10B0A0008F2223400B9002060040000000000000A9 +:10B0B00008040480A3202C4109120204808120246A +:10B0C000480A3602C480B12004C84B14020500B1FE +:10B0D0000528500A90020502850021400B12020249 +:10B0E0000100000000000000B80D6000C8006E14F0 +:10B0F0002C8502A140C8503A140E8002E140B050A5 +:10B1000032000B80032000FA003E000E8003A002F4 +:10B11000C80013000F82032E03500000000000003F +:10B12000981DE448F9143F400C9103E442FD1036A9 +:10B13000440D9123A448F91138440FD003E5143984 +:10B14000427B408ED001F500A9403E50079683E631 +:10B1500006700000000000001801F680DDAE3A50D5 +:10B160000D9A0B7680CF8832702DDA03A701E99211 +:10B1700037680D9403E700EDA03A500FD003E702C3 +:10B18000CD8033680CD883060070000000000000FA +:10B190003810E100884020200C8C02230088E02237 +:10B1A00030088402E300B8E022148D8802E300B87E +:10B1B000502EA88B8022E34888502200088C020E73 +:10B1C00004300000000000000805C44091002A4837 +:10B1D0000914820520810820580911028588B14090 +:10B1E000A040081202C580A10028400B1802C484A8 +:10B1F000A10024500810920301700000000000001C +:10B200001815AC109B002240089002040689042007 +:10B2100040099002E401B902224189A082E0A0B96C +:10B22000282E440BB002E402B90026402810020682 +:10B230000460000000000000A015E400D9003840C0 +:10B240000D90032400C9A0A2408D9003A400F90032 +:10B2500036400C8413E200E9003A500F9C02E68469 +:10B26000E900B6400C9003280470000000000000C4 +:10B270002801A400E1003E680E1003A400F1283A62 +:10B28000400E9003E400F9003E420F8023E200F9F3 +:10B29000003E400F9123E440C1003A400F900BCA9A +:10B2A000006000000000000028108000C80032008C +:10B2B0000C8003A020C8403E000E81636000F004B3 +:10B2C0003C010C8403E000C8003E000E8003C10076 +:10B2D000D81032000C80230A042000000000000077 +:10B2E000280538608E0022800AA0023880BE003A0D +:10B2F0008008E0022800BA00239818EC02F820AE7B +:10B300000022800BE482E802CE4428800DA00A0AC5 +:10B310000040000000000000280540008204A0C09A +:10B320000930028E0483506CC00A30860C00B300D2 +:10B3300028300A3612CC80810024C00B3206CC00A3 +:10B3400080886460281002020050000000000000A5 +:10B35000A0011012844021C80A72021000B7002D0B +:10B36000CC0838121C00B3302000087182FE00A403 +:10B370008021C80B7002DC0187002C420951022099 +:10B380000040000000000000A8081200C28031F850 +:10B390004CFC139209C7803CED1E78271E00F78CE9 +:10B3A0007920087A03DE8184803DE00E7803FE2058 +:10B3B000C58135602C58032A0200000000000000FF +:10B3C000081D8000F8043ED00FB013E000FB023AE5 +:10B3D000D00FA00BAC40FB003A002FB003CC00F024 +:10B3E000003AC40FB003FC41F3003A400F5093C23F +:10B3F00006600000000000000005F600CC813FFC64 +:10B400001CF8037640EF923FE48CF803BF10FF80F6 +:10B41000B3200EF913FE24FD9437E01CF903EE006F +:10B42000CD80B3E00C580200007000000000000066 +:10B43000A811944080002FC4087202DD08D7002DA7 +:10B44000CC08DE035C00B7042180C87083DC00B444 +:10B45000A02FC00C7002DE80870021C20A51422A50 +:10B4600004600000000000000000900084002DC86F +:10B47000487002540CA7002CC08972025C00B31003 +:10B4800020000A7006DC00B4202DC0087002DC80A9 +:10B49000930020C0085002000020000000000000BF +:10B4A0002014C00080002EC0083002C408A2422C24 +:10B4B000C10920024C00B3002080083C228C20B03F +:10B4C000082EE0083810CF0A9340A0F00A100208B6 +:10B4D0000430000000000000A815A800C1003FC013 +:10B4E0002CF0036800AA003FC02D80037C00FF0001 +:10B4F00032000EB012ED24FA0827C810B8A2FF607F +:10B5000098A0A2E00C50032A046000000000000094 +:10B510008000C906F8413EC00FB003E9105A203E32 +:10B52000C00E8003EC00F3007E010FB093ED00F835 +:10B53000403EC00EB003FC00E3083CC20FD013E055 +:10B5400000300000000000000110F302CC003BC2FC +:10B550000CF023AE40DF8139C006D003FC00FF04AD +:10B5600031410CF003FC00CCA037C20CF0037C048A +:10B57000CD0033F00CD00308443000000000000080 +:10B5800081046000888022C00AB002E900AB442E2A +:10B59000C0088802EC00BB00A2700AB402CC00A074 +:10B5A0002022C00FBC02CC0A8B80A2C00D900220CA +:10B5B00040100000000000008005200089802AC0A3 +:10B5C00008B002CC0688602EC00A9806EC01BB00C9 +:10B5D000223102B202ECA08A0026C048A802EC0484 +:10B5E000A9802240089002200040000000000000D6 +:10B5F00008040000800020C00A3042CC0080012CEA +:10B60000C01A1202CC00B30020004A3002CC00A0C5 +:10B610000008C00B2006ECA0A300A04029100002E7 +:10B620000100000000000000000D6000C8503BC099 +:10B630000CB003AC00C9003BC00E9283FC00BF00FD +:10B6400012000CB003EC00882616C00C80175C803A +:10B65000E90132402CD0030003500000000000003C +:10B66000A01DD000FC203FC00FF003FC00FC003FF9 +:10B67000C00D8003FC08FF003F000FF003FC10F832 +:10B680004037C00EE021FC08DF003F400FD003E050 +:10B690000670000000000000C005FCC0FF217124FE +:10B6A0000FF183F240FF0037C49FF2473D04C720EB +:10B6B00033C00C7823FE40E81027C40FF2133C84FB +:10B6C000C48133204CF023700070000000000000A3 +:10B6D0008010ED40BF5462C80BF602E000BBD022E0 +:10B6E000F01FF9123D809F812BE00AB812E8008F0D +:10B6F0000422D008B38ABF428B8222E0288C022029 +:10B7000004300000000000008805CC00B3282808A1 +:10B710000B30068080B30224D10B30028D80931051 +:10B7200020CE8B3002CC84A1212CCC0A300A4C00D4 +:10B73000930028C0083C02220170000000000000B5 +:10B74000C015AC10BB026AE00BB002E108BB042AD2 +:10B75000C00AB0128C009B002AC00BB106C8808BB7 +:10B76000826AC10A3002AC1888102A480880023068 +:10B7700004600000000000004015EC00FB00AA304F +:10B780000FB003A800F301B6C10BB002AC084B0028 +:10B79000B2C00FB802EC10A9813EC00FB0030C007C +:10B7A000CBA018D00CB00310047000000000000003 +:10B7B000E001BC08F70037000FF003FD00FF003781 +:10B7C000C00FB0077C00E7003EC00AF003FE00F7A0 +:10B7D0000036C00CF003FC00FF8037E00FA003B878 +:10B7E00000600000000000004010AC00DB003600EC +:10B7F0000EB0036900DB093AC01F3023EC08CB20F0 +:10B8000034C02FB003EC40EB483EC44DB08B6C000D +:10B81000CB0032900F3003900420000000000000A5 +:10B82000C8053C008F00220048F0222C008F002326 +:10B83000E08BF5103C008F8023F08098032D44DBD3 +:10B840000023D408F8023C00830022C00BA48232FB +:10B850000040000000000000E0054C0093002400C0 +:10B860000B30028400B30128F60934328C01B3D0C6 +:10B8700024E80A310A860083002AE00030028C00A6 +:10B88000830028C08938A278005000000000000022 +:10B8900020011E00979423E0093802320097A1216D +:10B8A000E40B78021E40B7A025EC08FC023A009396 +:10B8B000B821E00878829E4087C029A00B58024832 +:10B8C000004000000000000048082C00DB0034208D +:10B8D0000F3A038E00F3B028C40B3A03AE40F3A036 +:10B8E00034EE0F30238400E3F038C00CB00B8E42EE +:10B8F000C30038C00F3063D2020000000000000017 +:10B90000401DBC00EB423AC41EB10788D1E3003FA2 +:10B91000C58FF163AC10CB503BC30FD103C800BB44 +:10B92000203BC02EF1031C00FF0037C04FD1039015 +:10B930000660000000000000A805EC40FB44B2C017 +:10B940004FB3432400DB1036C04CBE226D20CB50D9 +:10B950003EC94CB0132400CF2033C03DF0232CC08F +:10B96000D8003E408F30032A007000000000000025 +:10B9700048119C04B76021C18BF0A2141087000FFE +:10B98000C80D710A1D0087002CCC48702A9C0087C6 +:10B990000C21C00C72020CA287002DC00B70021289 +:10B9A0000460000000000000C0009E00B38021E0A1 +:10B9B0000B7A02DE00B78105E40879025C8087A07B +:10B9C0002DE008F806B600878020E40A7B121E905E +:10B9D00097882DE00B780E3000200000000000005A +:10B9E0004814CC00B30020D00BB0026E34A3002C5E +:10B9F000C10930024C0083002CC04810028D8083A6 +:10BA0000C000C08A30120C0080002C160B380212C5 +:10BA10000430000000000000E815A800FA00338898 +:10BA20000FA0037990FA0136801CA0036800CA00B9 +:10BA30003E812CA00BB90CCEE2B2808EA00B280068 +:10BA4000DA803CB00FE0833A0460000000000000A0 +:10BA50004800E000F0003E000F8003A000C8002E68 +:10BA6000000F8423A000F0403E100F8403E102F891 +:10BA7000483E100C8003C010F8803E000F0003D237 +:10BA800000300000000000000810E400D900364239 +:10BA90000F90032418F9103C48689213E400A91190 +:10BAA000B2600E91032600C90032600C1003240816 +:10BAB000C9003E400C90230204300000000000004A +:10BAC00080046400890022400B9002A40889002EA3 +:10BAD00042489402E40089802270081422A402895A +:10BAE000422A7028900A2400A9002E40289002A023 +:10BAF000001000000000000018050400990026C096 +:10BB00000390022401A9000E400A9046C40A89004D +:10BB100020480A900205808141A05888900224089C +:10BB20008D802FC008980206004000000000000031 +:10BB300008040480812020400B1202840081242C00 +:10BB4000580A3222C584A100205008B0028508811D +:10BB500040205A0816820400A5002D400812828257 +:10BB60000100000000000000B80D6140D8503614FC +:10BB70000F85230140E8003E000E8043C008CA0044 +:10BB800032800E80032000C00032082C02032008FF +:10BB9000C8003F000C82032E03500000000000008C +:10BBA000981DE440F9103F400F9143F404F9103E12 +:10BBB000440D1103E44459403E504F5043D402FD1C +:10BBC000403E400F900BE500F9003E404FD003E6A9 +:10BBD000067000000000000018056660C9E03244ED +:10BBE0000F9C03E400DD843F688FD842E6A0DDA40B +:10BBF00033680D70032500C9E0B2680C9AC32600B3 +:10BC000099003E400F9A03060070000000000000FB +:10BC10003810E3008880AA208B8802E288B8012EC1 +:10BC2000000B8402E2B088502214088002828088CF +:10BC3000E0B63A08CEA2210888002E000BC4020EFE +:10BC400004300000000000000805C48081606848DE +:10BC50005B1602C420A1406C500B1402C400A1006A +:10BC600024400B90221490854221505B501A1500FD +:10BC700095002D400B510A82017000000000000069 +:10BC80001815A40189002A400B9046E400B9012E42 +:10BC9000400B9020E400B900264018B802A4028DA1 +:10BCA000082F408BD00224008D202F480BD0028615 +:10BCB0000460000000000000A015E400C90032404C +:10BCC0000F9002E41049003E400F9002E400E901A9 +:10BCD00036400F18132410C98232407F902324006D +:10BCE000D9203E720F9003A80470000000000000ED +:10BCF00028018402F10116404F9003E510F9082E47 +:10BD0000400F9013E400C9013A401F9003E400F98A +:10BD10002034408C9003C408F9003E600F10034AA1 +:10BD200000600000000000002810A008F8003E009D +:10BD30000C80036000E8003E024F8013E000D0005A +:10BD40003E000E81033000CC4033000CC00B20209D +:10BD5000E8003E100FC003CA0420000000000000ED +:10BD600028052804BA00228008A0022800BEC86F57 +:10BD7000800BE122A8008E202F800BE02368008A30 +:10BD800000228008E00229008A002EA80BA000CA29 +:10BD9000004000000000000028054C00B30024C053 +:10BDA0000930020C00B3C12CE00B38562C101300E4 +:10BDB0002EC00A386A2000880020000980224C42E8 +:10BDC000A3002CE00B2480CA0050000000000000FB +:10BDD000A0011C08B7242FE00939021C01B6002D70 +:10BDE000900B60928E0086822DC20BF0025C06875B +:10BDF0000060C02970025C0086002DC00B6002E864 +:10BE00000040000000000000A8081F40F3E43DE8E7 +:10BE10000D790B1EC067802DE00F70431D80D5008B +:10BE20003D600E78031E00CD8031E00DC8034E004A +:10BE3000E5803DE00F4803EA02000000000000003A +:10BE4000081DAC80FB0070C06EB613AD40FA003E1A +:10BE5000C00F20432D1859003E0003B00BE000FA3C +:10BE600000BE000EB013AC00F8003EC00F8003C24D +:10BE700006600000000000000005FE40FF803FE675 +:10BE80000FF8232E04FF903FE40DBA03FF40CF804C +:10BE900022E10C39433210EC9033208EC803F200BB +:10BEA000DF803F600FF803C000700000000000005A +:10BEB000A8119C40B7903CE00B3A034E80F3B12DA3 +:10BEC000044C3823AE00808034E84D78023E8087F1 +:10BED000A029C0087002C08086022D410B7002EAC2 +:10BEE000046000000000000000009C4837012DC9DC +:10BEF0000B72221C84B5160DC4194042DC808700E9 +:10BF000020C888730A9C80B50029C00A4802C00274 +:10BF100095002D420B5802C00020000000000000D8 +:10BF20002014CC00B3002AE00B30024C20A10124E5 +:10BF3000C10800028C008100248009380A608092C8 +:10BF4000402A000A3002C00080C82C720B1402C8BC +:10BF50000430000000000000A815BC00FF002FF412 +:10BF60008FF0033C00B9003E40099003FC02C3017E +:10BF700032C048B813A100BA002A000AA007EC009A +:10BF8000DBC83E900FA202EA04600000000000003F +:10BF90008000EC00FB023EC40FB063EC01F8403EB1 +:10BFA000400B8003CC00FA423EC00FB500AC58E90C +:10BFB000823EC01D9003EC04FA003E800FA003E017 +:10BFC00000300000000000000110FC0CDF007FC00A +:10BFD0002CF0037C01C70033408FD003FC00D80055 +:10BFE00015440CE01B3C00CB0E33C05C62021C020B +:10BFF000C5002B800FC08780443000000000000087 +:10C0000081446C10BB002EC008B0520C01FAC4224F +:10C01000610B88036C0088472A000E1C02200288EE +:10C0200000AA0028900A2C04A80022900B8002E0AD +:10C03000401000000000000080012C00BB002EC159 +:10C040000830126C0088882A300BB802EC009B087C +:10C050002A4008B80220008210220008A022A00076 +:10C060008B002A020BB002E000400000000000003C +:10C0700008000C00B3202CC20836022CC0A00820F7 +:10C08000000B3346CD28802028C00B32020C2081C3 +:10C090003028C00810028100AA002800033002C224 +:10C0A0000100000000000000000C7C00FB282ECCEA +:10C0B0000C70537D098800BA000F8003FD80DA60A0 +:10C0C0003A508CA2832C804B2030C028A003A100C2 +:10C0D000C9003A000F9003C00310000000000000E8 +:10C0E000A01DFC04FB007EC90BB603FCC0F80C3F8E +:10C0F000004FC3432C00B8383F8E5EF043E010F889 +:10C10000303F010FD0037000FC0037000DD007E96D +:10C110000360000000000000C005FCE0CC8033C0DC +:10C120000DF083FC80DC9433C01CF1037D8CFF3068 +:10C130003F308FC8037E10CF9039A08DF803AE003A +:10C14000D58013E00C5803F00160000000000000EF +:10C150008010DD08880023C408FC02ECA8CB202155 +:10C16000C20DF7121C40DF3022A00B88022E04DB28 +:10C170002122C008B8222E00B9802A600A8802E075 +:10C1800004300000000000008845CC10802C28CA34 +:10C190006830028D009B2028C4083202CC10B30006 +:10C1A00024080B80426C0083002ACA3AB0028C0437 +:10C1B000B00428C0081002E30130000000000000B5 +:10C1C000C0158C028040AAC008B002EC009B202A57 +:10C1D000C088B002AC009B0026E00380822C289B24 +:10C1E0002022E10BB202AC80B8802AC10A9802F08A +:10C1F00004600000000000004015EC00C8503AC088 +:10C200000DB003EC00DB88BAC008B0036C08FB007B +:10C2100036600F8C636C00CBC03A800EBE03AF84D7 +:10C2200079803A88049801D0047000000000000072 +:10C23000E001BC00FC8035C04FF003DC00EF0037AC +:10C24000C0AFF0031C016F0013000FC123FCB8FF47 +:10C250000437C00CF8437E04FD003F040FD003F800 +:10C2600000600000000000004010AC00C8403AC070 +:10C270000CB003EC00FB4038C10EB0432C08C300E7 +:10C280003E400E82036D00DB4032C15FB4A3ED205F +:10C29000C94032E08F984390042000000000000065 +:10C2A000C8053C00880023C028F5C2FC00B3042365 +:10C2B000C148F022BC06AF000E40080002CD00BB12 +:10C2C0000120C0083002EE0081E034A00B90023261 +:10C2D0000040000000000000E0054C02800028C083 +:10C2E000093C024C00B3002CC00AB0020C008301D0 +:10C2F0002C000A0502CD58BB0020000A3D02CF40A9 +:10C30000212060C0091002F8005000000000000069 +:10C3100020011E00848028E4887842DE00B7906502 +:10C32000E4887A429E40A7902DA00A4822DE04B7F6 +:10C33000802360487842FE80AF9065E00BE802C839 +:10C34000004000000000000048080C00C80038C091 +:10C350000C3003CC00FB003CC00EBA030C00C30041 +:10C360003E004E2202CCC0FB4030C00A3003CE80DB +:10C37000E14130C90F3003D202000000000000008C +:10C38000401DBC20FC0037C20EF123EC40FF043AF4 +:10C39000C00FB023FC00FF043EC00DA003FC58FFFB +:10C3A00000BFC006F083DC62DF003FC00FF0031067 +:10C3B0000660000000000000A805ED80C9013EC035 +:10C3C0008CB207AE04CB803AC84CB2032C84CB307D +:10C3D000B0E00D880B2C00EB0030000CBC832D80EE +:10C3E000FB0032C00C9003EA047000000000000063 +:10C3F00048119C4087002CCC0876823C8287002123 +:10C40000C28D32820D4CA72821800840021D80BFBA +:10C410002035400972435CA0B70029C0087002D2E1 +:10C420000460000000000000C0008E0084802DE049 +:10C43000087802DEC08F8028EC287B0A9E948384D3 +:10C4400023E00958509E10A7B023E00B78021E206D +:10C45000B78021E0097802F0002000000000000011 +:10C460004814CC02821C2CC02830024C0083C0200F +:10C47000C00830020C00A30060D2081D020F20BBD0 +:10C480002424C00B3C024F00B38028D8093202D2CA +:10C490000430000000000000E811A800CE843E80B7 +:10C4A0000CA003E800CEC03A8008A003A800CA0090 +:10C4B00033800DEC033B80EE8233800AC08710404E +:10C4C000F6C03390AD6403FA006000000000000085 +:10C4D0004800C002F8003C001F0403A004F8303EEE +:10C4E000000F8003E000F8003E040F8093E000F8A6 +:10C4F000103E002C8403E000F8183E100E8003D29A +:10C5000000300000000000000810E400D9003E40A8 +:10C510000E9003A410F9003E400490032400410053 +:10C520003E400F9113E108F8003240088983A200D1 +:10C53000C98032400C900B02003000000000000067 +:10C540008004640289002E400D90022400B9002E60 +:10C5500040489002A400890022408B9442E220B817 +:10C5600000A240089402E504A990346008900220DB +:10C5700000100000000000001805241099002E4053 +:10C580000A9002E400B90024400A10020400A90045 +:10C590002A400B9082E001B80020403A9002A44467 +:10C5A0008904226208980206004000000000000092 +:10C5B0000804048A81002C480932064480B1002C0A +:10C5C000480A12028480A12020500B1402C500B139 +:10C5D0004020500A2402C900A3002440081102028E +:10C5E0000100000000000000B80D6140D8503E146A +:10C5F0000E8003E140F85136142E85432142E85065 +:10C600003A000F8012E000F80032001E8043A000C4 +:10C61000C80132000C80032E03500000000000000F +:10C62000981DE440FD003E444E1103A440B5003E79 +:10C63000440D9103E440D9103F400F5003E500F949 +:10C64000403F400D4403F100F5023DC02FD203E608 +:10C6500006700000000000001805E700E9003660E1 +:10C660000DDA03E640F9403E680C9A03662089A083 +:10C6700033400E9007A600F9803E500CCA03F380A9 +:10C68000C50233400CC003C600700000000000006B +:10C690003810E30488A22038088002E340B0802EDE +:10C6A00028088A82238088802200DB88026204B8FE +:10C6B000B02EA8888EA2EA8088002A002888038EDF +:10C6C00004300000000000000805C582A9082C52B3 +:10C6D0000B1402C480B1210C5288140244209169C9 +:10C6E00020400A1082C6E0B10C2C48080102E193F8 +:10C6F000A10124410A1002C20170000000000000E4 +:10C700001815A40089042240089000E40039020EA4 +:10C71000400810622400910062408B8002E054B90E +:10C720000C2E4009B652EC00A9002A400A928086DD +:10C730000460000000000000A011E400E160364049 +:10C740000D9023E400F9303E402C90436406C9006C +:10C7500032490E8D93E000F9002E402C9403C7401F +:10C76000E92030550E9003E804700000000000003E +:10C770002801A400F9001E400F9003E400F9803C5A +:10C78000404F9003E400E904BE400F88336200F993 +:10C79000C23E482E8833E200D9003E600D8003CAB5 +:10C7A00000600000000000002810A000C8003E004B +:10C7B0000D8003A004E840BA000C8003E004C80028 +:10C7C0003A000E8C03E000F80232000E8003612074 +:10C7D000F80032160F8003CA042000000000000099 +:10C7E000280528008A002E8008E20328008A0022FB +:10C7F0008008A002E8048A002EA209E802FA04BE1A +:10C8000000A28008CD823320B6C037A04BC882CAB0 +:10C81000004000000000000028056C00830026C0D6 +:10C820000938024C00B30024C0083002EC00830039 +:10C8300028E00B3002CE81B30062C0083C024F00FA +:10C84000B3A020B0033002CA005000000000000076 +:10C85000A0010C4187342DC00860029E40B7A02D76 +:10C86000C0087302DC0087202DC00B7082DD85BFFD +:10C870008163C8887B021C00B74065001B7202E818 +:10C880000040000000000000A8081E00C7813DE035 +:10C89000DD7003FE80F7903FE02C7903FE80C7A097 +:10C8A00039E00F7A02DE84F7C231F20C79035E04BC +:10C8B000F78431600F7E03EA0200000000000000F0 +:10C8C000081DAD0AFB607ED40F30036C00CB003234 +:10C8D000DE2FB203ED421B603EC10DB103EC50F7F9 +:10C8E000803DD82E3203EC30FB003E400FB003C237 +:10C8F00006600000000000000005FF00CBD03FF004 +:10C900004CF813FE00CF883FE00CF8433F00CFC83F +:10C9100033E00CF803FE00FF803FE02CF803BE205C +:10C92000C78033E00CF80100007000000000000038 +:10C93000A801BC4087903DC0084002DC80D7002D94 +:10C94000C00C30037C00871021C41E7020DC44B76B +:10C950000039C00C71021C40D70229400870022A1D +:10C96000046000000000000000009C0087322DC021 +:10C97000087002DC0187002CC02B700A5C00830069 +:10C9800023C0087002DD00B7002DC40BF0029C200C +:10C990008718294008708200002000000000000075 +:10C9A0002014CC00830228C0081002CC0883402E3B +:10C9B000C02A30020C008B0020F20A3002CE00B3F5 +:10C9C000882AD00A30060C0092002878083C4208D9 +:10C9D0000430000000000000A815BC02C7002FC0F2 +:10C9E0002C9002FC028FD83FC04BF0027C02CF009B +:10C9F00020F208B013EE80FF003FD42EBD83AC00C0 +:10CA0000CB803AA0ACB8032A04600000000000000C +:10CA10008000EC00FB103EC00F8403EC10FB003ED6 +:10CA2000C001B003EC00FB00BEC00EB023EC08FB5D +:10CA3000103FC00DB403ED04F9001E14CFB083E025 +:10CA400000300000000000000110FC00CF0030C0EA +:10CA50000C4003AC00FF003FC02CB003BC00FF0043 +:10CA6000B3E00DFA037E80CF0033C00CFC43FF20FF +:10CA7000FF003F4008F803C0443000000000000001 +:10CA800081046C10AB002AC00A8E422C04BB002E1D +:10CA9000C008B0026C00BB003AC00E30020D088323 +:10CAA0000222C00ABC02EF00BBC02C680AB902E037 +:10CAB000401000000000000080050C008B0022C028 +:10CAC00008B802AC00BB022EC008B002EC00BB00EC +:10CAD000264819B0026D008B0022C00AB002EC0497 +:10CAE000BB1C2E200AB002E0004000000000000045 +:10CAF00008140C00AB2028C00A00020C0093042C80 +:10CB0000C10830024C00B300244109B8020C028372 +:10CB100001A0C00A3002CC1093002C000A3002C2DF +:10CB2000010000000000000000057C00CF2833C099 +:10CB30000CA046AC11BF003FC05CF043FC00FF04FA +:10CB400032400DB0036C08CB0431C00CB033ED4063 +:10CB5000FB043E400EB003C0035000000000000084 +:10CB6000A015FC00FF003FC00FC023FC01FF003FE9 +:10CB7000C04FF0877C00FF0039400EF003FC00FF3F +:10CB8000003FC00F7003DC80FF003D400F7003E8E2 +:10CB90000670000000000000C005FC40EB483EC2EB +:10CBA0000E0903BC60C02035240ED2132C60FB6A32 +:10CBB00033C00FCA032220C08037C00DF0037C00B1 +:10CBC000EF0033240FC803300070000000000000A5 +:10CBD0008010DD008F602FD808A202FD80C870226F +:10CBE000002CFD07DC84BF6023D20BBD022300882C +:10CBF00080A22088B0223400BB5022C80BB0022093 +:10CC000004300000000000008805CC40A3032CC2C3 +:10CC10000A00428C82A30A24800B3002CC90B3001D +:10CC200028D80B10028C02900020C00B10424C0040 +:10CC3000B30424C00B300EA20170000000000000FD +:10CC4000C015AC109B042CC0F89806EC00AB8026F5 +:10CC50002008902AAC10BB000AC01BB022AD00987F +:10CC6000402A704BB0022C00B300A6861BB082B0E5 +:10CC700004600000000000004015EC00EB003EC026 +:10CC80008E9803AC08E8C036304FB042EC00F98013 +:10CC90003AC08F88422010C81030F00F30136C104B +:10CCA000EB0036F00FBD03900470000000000000A0 +:10CCB000E001BC00EF047FC00FF043DC00C4003B88 +:10CCC000408BDC037C10F99036C24FF9236241ACF3 +:10CCD00001134004B003E400FF003BC00FC0037821 +:10CCE000006000000000000040108C12CB00F2C079 +:10CCF0000F8003AC08D9003A800F1203AC00E100AA +:10CD000032C00C9003ED02C8403ED00F90132C02AD +:10CD1000DB003E500CB403100420000000000000B3 +:10CD2000C8053C008F0017C00890023C088D002207 +:10CD30005408B4033C00890023C0403502CC248051 +:10CD40000022744CB0022C008F002ED40AB00A329C +:10CD50000040000000000000E0014C02830024C0FD +:10CD60000900028C0190006A410A30204E10310205 +:10CD70002CC0092006CE00800060E00A30820C083A +:10CD800083082CD009B00278005000000000000099 +:10CD900020011E0487B020EC09E9028E589DB02BBB +:10CDA000A5405B06DE4095942DE4197B06DE0084E9 +:10CDB0008060E00A780A161087802D680B79024897 +:10CDC000004000000000000048080C00CBA024E058 +:10CDD0000F2A038E00D2D038FA0F18C3CE2431B0F8 +:10CDE0003CE50C3B17CE04C08238C29E10030C00F9 +:10CDF000C3013EC00D81035202000000000000008C +:10CE0000401DBC00EF103EC20EB1232CC1AB013659 +:10CE1000800FB0232D90E98472C862F117FC00FCEA +:10CE2000003BC41DF003EC00EF083FC80EF1039077 +:10CE30000660000000000000A805EC80FBA43AC8D2 +:10CE40000E90032C04CA0030602D1A276C84CB602E +:10CE500032D20CA0132D84CB023EC00DB803AC809F +:10CE6000CB8132800CB003AA0070000000000000EB +:10CE700048119CA4B72873C208F0023CC08F00314F +:10CE8000C00970829C80870C20D80970221C3084D5 +:10CE9000003DC0087002142487A021C0087012123F +:10CEA0000460000000000000C0009E40B39529E926 +:10CEB0000A68029ED086F0A3E00878129E44A382FE +:10CEC00021E80B38020E1087802FE00B18028E022B +:10CED000870021E0087802300020000000000000F8 +:10CEE0004814CC00B30024C04830020C04838020D6 +:10CEF000D00910028C06A38020C00B30020C0280E7 +:10CF00004028D20A30020C018300223C088702121A +:10CF10000430000000000000E815A818FA003A806C +:10CF20008EE4422802CE8033804DA083E800EAA040 +:10CF3000B2800AA00A2800CE182F800FA013A800E4 +:10CF4000CA0032902CAC0B3A0460000000000000D4 +:10CF50004800E000F8043A000F8083C008E8033A74 +:10CF6000000E8022C000D0007E10A48003C000F814 +:10CF7000003E100D8403C000F800BE000F80015277 +:10CF800000300000000000000810C402C900364054 +:10CF90000C90036402890432420D9203E642C900F8 +:10CFA00032700E120B2408C9003E450E9903E402AC +:10CFB000C10032500494030204300000000000005D +:10CFC0008004640089006E400890022400890022D9 +:10CFD000540B9003E6008900224008900A2400893F +:10CFE000003848089082E404D900224008900220CA +:10CFF00000100000000000001805240089012C40EA +:10D000002810426400A1042250019042E4008904E7 +:10D0100020420A9042340089006E400A9000E400E9 +:10D02000890023400AD002060040000000000000F2 +:10D030000804048081242C480810020480A12028C0 +:10D04000400B100285808120204808506214028124 +:10D05000032E40881682C4A0912821402A50020243 +:10D060000100000000000000B80D6140C8502E14FF +:10D070000C85036140E850B2154D8002C000485055 +:10D08000B2151A80133008C8003E000E8203E080FB +:10D09000C02030000E400B2E0350000000000000A6 +:10D0A000981DE440F9103E440FD003E448DD1037EA +:10D0B000400FD407E440FD103E450F9403E508FD02 +:10D0C0000239D00FD043F4A0F9283E4B0D9283E6ED +:10D0D00006700000000000001805E680C9A632684E +:10D0E0000C9003A681E9E93B400E58033620C9A005 +:10D0F00037780DDA033626C50037690EDE03A682BF +:10D10000CDC033500FD003060070000000000000B7 +:10D110003810E3A488A9223A08080022A0B8E53014 +:10D120002028802243A008E82A3D08A46220008825 +:10D13000002E10088E0323A088A020280B8A820EC0 +:10D1400004300000000000000805C4409140204465 +:10D150000890A28510A1202C420B14128C01911072 +:10D160002C4809110AC40081002C500B1112C50172 +:10D17000B14024480B180E020170000000000000AE +:10D180001815A400910022410894422400B14020C7 +:10D190004049B262240099000A40089002E5808963 +:10D1A000002E4009B0022480B90026504B900206A0 +:10D1B0000460000000000000A015E402D900B240A5 +:10D1C0002C9513A410E900BE608F900BA410590099 +:10D1D0001E409D9423E402890034400F9003E6082A +:10D1E0007900B64007980328047000000000000092 +:10D1F00028018400E9023C402F9802E400F9423AF9 +:10D20000680A1003E410E9003E400E900F2600F972 +:10D21000043E400E1C03E600C1003A500F9983CA39 +:10D2200000600000000000002810A000E8003A00A4 +:10D230000C84032000D84232040C8813E000C8009C +:10D2400030000C040B0000D80036000E80230000D4 +:10D25000C88032000C80010A042000000000000099 +:10D26000280528108A002E8028202228008A0023E2 +:10D27000B088E0022810DA00A3B408E81028008E75 +:10D280002023A048ED1A2800DE0023900AE0020ABD +:10D29000004000000000000028054C00A30028C04A +:10D2A00008300A0C00930020C22A3022A400BB00E0 +:10D2B00008E018090A4C00930224E80208064C0012 +:10D2C000930020D80A90024A00500000000000009D +:10D2D000A0011C8087042DC00870020E0087102555 +:10D2E000000A60025E009700298208501254008FE5 +:10D2F0008061D00804025C01B708A9A00A508268C6 +:10D300000040000000000000A8083E80E78038E4EC +:10D31000087E031F00DF80B1211E7803DC04F38048 +:10D320005BE10828035E00D78035600E68034E007D +:10D33000DF8031E00EF80B6A020000000000000000 +:10D34000081DAD02FB743ED04FB283ED007B683AFE +:10D35000008D8003A420DB0136806FB0418400EB98 +:10D36000003CC00FE683BC40DB00B6800FB00382F8 +:10D3700006600000000000000005FF20DFC03BE663 +:10D380000EF813FF44C7823BE00FF903BE10CFC86D +:10D3900033608DEB033E00DB823FE00CD8033E4060 +:10D3A000CE8033E40FF8030000700000000000009E +:10D3B000A811BC40870021E40B78A2CE90C7B02012 +:10D3C000E80B2892B68887A020640B3503140087E9 +:10D3D000B239C02CC0035E02CF0031CE0B76122AC8 +:10D3E000046000000000000000009C00A31029C899 +:10D3F0000B7402DC808F0029CC0A30061480871061 +:10D4000021C00B66025C0087002DC00B51021C80FE +:10D41000960021C05B748200002000000000000024 +:10D420002014CC08A30020C00BB802CC008B40A86D +:10D43000C08B08228C02830060C00B304204008342 +:10D440004028FC8A00026E008300A0D08B380208BE +:10D450000430000000000000A811BC02EF003BC037 +:10D460004FF802FC02CF0038120E98022C00CF00B9 +:10D4700032C0099003640281C03ED00F90073C0384 +:10D48000D90032600F88032A046000000000000009 +:10D490008000CC00DB003EC08FB003EC00FB023606 +:10D4A000C04F9002E400FB00BE900F9C13EC00E91B +:10D4B000183AD004D503EC40E9003A008F8003E02D +:10D4C00000300000000000000110FC00CF003DC152 +:10D4D0008CF0032C00EF0AB3122C7023140A4F00B7 +:10D4E00035600DB0030400CD8007E80CC4032C00A8 +:10D4F000CD0031E22CE003004430000000000000C9 +:10D5000081046C02AB022EC00EB0022C008B0032E4 +:10D5100030009C036C008B04223608344A2C0889A6 +:10D520009020B80F8400AC02890036A008A4022025 +:10D53000401000000000000080052C008B002EC071 +:10D5400008B0020C008B0022D10888122600A3002C +:10D5500026400BB00226008B0026C05810122C0467 +:10D5600082802A49083002200040000000000000AC +:10D5700008040C00A3142CC81A348A0C848340229B +:10D58000C80803624CC0A36020400A30020C008B24 +:10D590004508C00B10028CA08300264008300A0208 +:10D5A0000100000000000000000D7C00CF402FD2E1 +:10D5B0008CF6033C22CF4032D64CA6C13DA0874812 +:10D5C000360D0FB1022442CB6016C00CD0032C8064 +:10D5D000CA0032C00C3003000350000000000000FD +:10D5E000A019FC00FF203ECA0EB003EC20DB343A49 +:10D5F000C80F8003E410DB213E180DF203FC80FF0E +:10D600003035C00FC013EC00FF003BC00FF003E843 +:10D610000670000000000000C011FC00FB0B2FCAC8 +:10D620008DF203FA0096803BC40DF1037C80EC8000 +:10D630003B080CC2037402CC803F480EF00330A0BC +:10D64000D5803F400CF803F000700000000000009F +:10D650008008EE40BF802FF00BF722EE208A802357 +:10D66000FC8875123D00880022002880022408886A +:10D67000006F5000F502290089002E540D9011A072 +:10D6800004100000000000008805CC00B3002CC18D +:10D69000093082CC82BB0028C0493202CD00B800DC +:10D6A0002C500901020C4080006C4409300220001B +:10D6B000B0002C40183006E20170000000000000AD +:10D6C000C001AC00BB012EC00BB002EE00AA004AA4 +:10D6D000C008B052EC00980226400980026C01AAF2 +:10D6E000042E4009B0022200A9802E41099002F0C8 +:10D6F00004600000000000004005EC00FB003EC09C +:10D700000DB003CE84FA001AC08DB043EC00F002D5 +:10D710003F000DD1033500CB482E402FB0092280A9 +:10D72000F9C81EE008B1E2D004700000000000005B +:10D73000E001BC007B003FC00FF023FC00DE0024B2 +:10D74000C04FF0032C00EC203B000E98039402DD48 +:10D75000003F404EF001F800DD003CE40FD803B874 +:10D7600000600000000000004000ACC0FB2032C898 +:10D770008DB003EC00F9003AC22C30036C04D802DF +:10D780003C448D1003AD03EA003C400C7023E400E0 +:10D79000C8403AC00DBC0350042000000000000047 +:10D7A000C8013D00BF4223F00DF002E500E2013761 +:10D7B000F108F00E3DC0A8002E542890022C008ADB +:10D7C000053B4148F5038C00890022D40E9502F2F6 +:10D7D0000040000000000000E0054C00B30420C041 +:10D7E000893002CC40B2002CC44830022C02A20086 +:10D7F0002C2019201A8008B0006C40083002C400A8 +:10D8000081002C40083002F80050000000000000A9 +:10D8100020011E00B7A0E1E0097802DF04AE802DF0 +:10D82000E00879021E1087902C282968028281B4B2 +:10D83000802D60087810BC008F802D600B6802C8B6 +:10D84000004000000000000048000C05F39230CAC0 +:10D850000D3003CC00F3003CC00C30020C80700093 +:10D860002C400D20038900B1003E402C3003EC50C9 +:10D87000C3203C400C3003D2020000000000000036 +:10D88000401DBC00FF003CC00EB083EC40EA0036F7 +:10D89000C20FB083AC00F8003E480EE00B7A80CF98 +:10D8A000003B440FF003ECC0FF0003440EE003D044 +:10D8B0000660000000000000A805EC00FB233EC845 +:10D8C0001DB003EE00CA003EC80CB2032D90C88400 +:10D8D00036002DB00360189B8033500CF203E20039 +:10D8E000C98032400CB8032A00700000000000001C +:10D8F00048119C00B7280CD2287302FC0086042C27 +:10D90000CC2870830C20950120000930121004856A +:10D91000002152087502D8008700214008600212D9 +:10D920000460000000000000C0009ED4B7B109E10F +:10D93000087822DE0095802DE008780A5E4294C0C7 +:10D9400021600878025A0087802D68087A02D70083 +:10D95000978020600978023000200000000000005D +:10D960004810CC00B3002CC008B002CD8092002C2F +:10D97000C008B002CC009080A04009360248028363 +:10D98000A0AC402A3006CE029304A04009200A121F +:10D990000430000000000000E815A800FA003A80FA +:10D9A0000DA003FB02DE803E800CA0032800CE8089 +:10D9B00032800CA4037800CEA43F800CA007F900AD +:10D9C000DE0032802DE0023A04600000000000001A +:10D9D0004800E100F8007C000F8003E040E8103CC4 +:10D9E00001CF800F2000E8003E000E04039000E805 +:10D9F0000020000D8007E000E8003E040E8003D206 +:10DA000000300000000000000810E400F9107E4122 +:10DA10000E90032400F90036680E900FA408C90088 +:10DA20003A400C900B2412E9003E442C90036424ED +:10DA3000F9022E400C9003C20430000000000000E8 +:10DA400080046510B9803E4008900A2600B1102A73 +:10DA500072089007640289402E40289012250089A0 +:10DA6000453E500D900A2500B9402E40289403E011 +:10DA7000001000000000000018052400B9002E402E +:10DA80004890422601B94026400A904284018B0802 +:10DA90002C4009D0823432A9086E4208100224209A +:10DAA000B9082C40189082C6004000000000000019 +:10DAB00008040480B32028480812020401B1002899 +:10DAC00058081202058981402C5808560615808195 +:10DAD0004028500914020580B1402C5A081402C293 +:10DAE0000100000000000000B80D6800F8002E00E2 +:10DAF0002E85032148F80036008E0502A00880001C +:10DB00003E000D800B1004E0002C004C8003400010 +:10DB1000F0003E080C0003EE03500000000000007F +:10DB2000981DE440F9103E440F9103F400FD003EBF +:10DB3000440F9103E440FD033F441F911BE440FD6B +:10DB4000013F500E9403F440FD003F400FD003A668 +:10DB500006700000000000001815F400CDA07168E8 +:10DB60008D9803D400CD0033600C988F2720C940D6 +:10DB70003E780C9E8B2720D11130608C9C032500B1 +:10DB8000F9403E780F90034600700000000000004E +:10DB90003810E01088012201088C22E80088022A4F +:10DBA00014088C0B239088A02EB0088C4223008888 +:10DBB000A0362A188A022200B8A02E340BCA820E80 +:10DBC00000300000000000000805C400814024501F +:10DBD000091682C400A9002040081292540885004A +:10DBE0002F4C09521214809D002150085422148099 +:10DBF000B5002D480BD00242057000000000000067 +:10DC00001805A4028901A240489002E402A9002A52 +:10DC1000406890026410AD002F4128500234008DFE +:10DC200044274039D0023500BD142F400BD00246A6 +:10DC30000460000000000000A005C400C9003640D8 +:10DC40002D9003E700E1E032400C900B6402C9081C +:10DC50003C500C90022602D9C032400C9013270091 +:10DC6000F9203E400F90036804700000000000009F +:10DC70002801A402F90038400F9003E680D9A03CA7 +:10DC8000400F1003A400D9103E400F9003C492F936 +:10DC9000213C402E900FE680F9803E400F90038A91 +:10DCA00000600000000000002800A040E8103E04D2 +:10DCB0004E80032080D8603A020C80132000F84088 +:10DCC00036102D8003A008E84032000D0003210229 +:10DCD000C840B2000FC003CA0420000000000000CA +:10DCE00028113B1086012FA00DA00238008EE023E2 +:10DCF000A208A0022800BA80228008A00228008280 +:10DD0000002A8028A0022A048A8022A00B6002CA6E +:10DD1000004000000000000028054380A2002CA065 +:10DD20000830022E00920028C02830022C00B38058 +:10DD300024C009300A8C00A30060C008300A4C00DF +:10DD4000830020E00B2002CA005000000000000009 +:10DD5000A001100086002DC0093A0235008600217E +:10DD6000C00873021000BF8821000870021C088FD1 +:10DD7000002BC00820125E20878821830B6002E8F8 +:10DD80000040000000000000A8081200E5813DA04E +:10DD90002C7A0B1E00D48038E00CFA0B1E00F680A3 +:10DDA00034E00D28038A00E68031200C78037A04E1 +:10DDB000CE8431E04F7843EA00000000000000000C +:10DDC000080D8000F8003EC00FB523E400F00436D3 +:10DDD000400FB687E000F2003E001FA00BE800FAFB +:10DDE000003E000EA003A800FA003E800FB003C260 +:10DDF00004600000000000000005F600CC8033A0A5 +:10DE00000CFC033E00FC8037E00FB9213E00FD8290 +:10DE100033E02CF8037E10DF843DE00CF803F600BD +:10DE2000FD803F600CE8230000700000000000004F +:10DE3000A8119840841021C00870021080B40021FD +:10DE4000C80B7A021000FD0021040870021C4287F2 +:10DE5000002DC4486102D680B5002F040861822AD3 +:10DE6000046000000000000000009000810021809C +:10DE70000830021C10BC0825804B300E1C00B4007A +:10DE800020C0082002580096002F000A7002D0809F +:10DE9000B4182D4009F80200002000000000000026 +:10DEA0002014C8028000A0C00830220BC0B0C022DD +:10DEB000800B30020000A004220028A0022B008A60 +:10DEC000002C0008A006C000B0C22C0009BC1A0833 +:10DED0000430000000000000A815A000C80032C0F7 +:10DEE0000CF00B2600F9C036000FF0132C10BB40CD +:10DEF000F2C00890036700D9803EC0089002EC0091 +:10DF0000FBD03EC0298C002A046000000000000005 +:10DF10008000E000F8443CD02FB003E400F9203E3C +:10DF2000400F3003E000FB083E000F9013E442F97D +:10DF3000103EC00F8003EE00FB003E800E8203E027 +:10DF400000300000000000000110E008FC8032E416 +:10DF50000EF0037400FC003F400CF00B3C00FE0090 +:10DF60003FC00DC1032020CC1033000CD10358005A +:10DF7000CE002FC00FD1030044300000000000008D +:10DF800081446200B0402AF108B0122608B8C82EB9 +:10DF9000700AB0022000BA002E00288003224088B8 +:10DFA0000120000A800228008A012E808B90022026 +:10DFB000401000000000000080052600B828224222 +:10DFC0000830026600B8802E3088B0022C00B901FB +:10DFD0002EC0889002A400890022C0089002240C60 +:10DFE00089012E401B8002600040000000000000FC +:10DFF00008040000B00028C02830020000B0002C47 +:10E00000400A30020000B1002C0008100A04008110 +:10E0100001A2C008000A048081002C001B000A0233 +:10E020000100000000000000000D6000F800324018 +:10E030000EF0236408F8002E000CF0032C00F8000A +:10E040003EC00C80032002C80432001C9003200054 +:10E05000C8013E419F904340035000000000000073 +:10E06000A01DF000FC0C3FC00FF003F010F4003FC7 +:10E07000000FF423F000FC003F000EC003B000FCD2 +:10E08000003F000FC003E100FC003F011F5003E808 +:10E090000670000000000000C00DF0D0FF203ED050 +:10E0A0008EB003ECA0DB283ECC0CB303AD08F83CEB +:10E0B00032230E48237A00FD943FE00F7833EE08B8 +:10E0C000BF803FE40FF90330007000000000000043 +:10E0D000A000ECC8BFD10FC80C2682FD248F002EF3 +:10E0E000990AF2621DD099612271888802AC00B849 +:10E0F000222E204B8803A00080002E080B80236076 +:10E1000004300000000000008805CC04B3030CCCF0 +:10E110000A1312CC14A30E0C580A33028C10A3203D +:10E12000A00A18900248A0B02024800A2002CC093E +:10E13000A1002C800B3242A2017000000000000000 +:10E14000E011AC20BB002EC04B80A2EC00AB004E17 +:10E15000462AB0022C049B802A608A9C02AC00B93B +:10E16000812E400B9802A3008A002E400B8004F001 +:10E1700004600000000000004015E100FB043EC008 +:10E180000EB403EC0ADB022ED10EB003AC00FB820E +:10E1900032281E0C036800B9003E404FB043ED002A +:10E1A000EA003E400F800390047000000000000071 +:10E1B000C001B818FF021FC00CE203FC00DF032FF0 +:10E1C000A10F7003FC04AB0437422DD0027C00FC8D +:10E1D000003F800FC003B000FD003F800FF00378C8 +:10E1E00000600000000000004010A900DB003CC0FF +:10E1F0002E94016C11CB00B8C00CB0036C00EB0185 +:10E200003210079203A800F8003E0C07A203AD00ED +:10E21000D80032000C8003D0042000000000000071 +:10E22000C8052808BF002FC08880023C08EF0322E1 +:10E23000000DF5003C008B822260039C022C10B97B +:10E24000B022F00B90022000BB0022E20DB002F2DF +:10E250000040000000000000E0054000B3022CC0B8 +:10E260000830026C00830020C0093404EC00A800D0 +:10E2700022F00B00028800B30028E00B1402A0007B +:10E28000930020C008B002F8005000000000000019 +:10E2900020011E04B7802DE80878020EC8A790213F +:10E2A000A81938529EC1878021E20BD9829E00B600 +:10E2B000A02D200B68021E00B4C12120094802C80D +:10E2C000004000000000000048000C80B3103EE059 +:10E2D0000E3A074E00CB903A610D3803CED1E1984B +:10E2E00030A48F10038800BAA13C8407000382D4B5 +:10E2F000D10072800C3003D2020000000000000048 +:10E300004015BC04FF003FC00FC223ECB0FF003239 +:10E310000406B4237C10BF003E840FB0037C40FF92 +:10E320000033400FF003FC00FE00BF400FC803D0D5 +:10E3300006600000000000008805E400CB333EC802 +:10E340004CB003AC90DBA036C00EBA436C00C900E1 +:10E350003E400F000F2800FB003E400F18436000B6 +:10E36000FA003E404F080B2A007000000000000039 +:10E3700048119C1007082CCA0820021C2087283F3F +:10E38000808AF0021D4087042DC00B70021C00B66D +:10E39000002D800B60031C00B5002D800B70021255 +:10E3A0000460000000000000C0008E0087A02DE483 +:10E3B0000A58021E01839021700B79029E0185C0CC +:10E3C0002DE04B58121A00B6802D200B4802520047 +:10E3D000B4802D200B480230002000000000000017 +:10E3E0004814EC0083002CC08836020C0283006CB9 +:10E3F000C00B300AAC009BE06CC80B32020C01B3BE +:10E40000002CC00B30020C10B3402CC00B3C82120D +:10E410000430000000000000E815B802CA003E8089 +:10E420000EE48B2800CA0033950FA007A802CE4047 +:10E430003FB00FE4822800FA003E800FA02368005E +:10E44000FA403E814FA4E33A04600000000000005F +:10E450004800E080F0003C002F00026000E8003C33 +:10E46000000E80012000E8045E040F8003E000FC41 +:10E47000013F100FC403B000FC093F000FC003D2DE +:10E4800000300000000000000810E400A920364021 +:10E490000E90034404D9003E400D9003E404C900EB +:10E4A00032408F900BE408F9003E440E9803E600DA +:10E4B000F9003E400F9003C204300000000000004D +:10E4C0008004640089002240189002240089002EF4 +:10E4D00040089402E400D90422400B1C0B6400B9EC +:10E4E000942C50089C02E414B9900E400B9002E06A +:10E4F00000100000000000001805240289002640DA +:10E500004A9002640099042E40089882E400890031 +:10E510006A400A9282E400BD012F5012D602F440F4 +:10E52000BD000F400BD002C60040000000000000FC +:10E530000804048081202048081202048081222CD3 +:10E5400048A81206C490912028500B90024500B5AF +:10E55000406D40085012D404B5022D400B5002C249 +:10E560000100000000000000B80D6140C800361432 +:10E570000A85034140D8502E140C8503C140C85071 +:10E58000BA000E8023E00078003E000E8003E00415 +:10E59000F8003E000FC003EE035000000000000032 +:10E5A000981DF440D9103E4407F103E440F9103FB0 +:10E5B00044AF9103E440FD1037500FD003E400F95D +:10E5C000003E400F9003E4A0F9283E4A0F9283E6F4 +:10E5D00006700000000000001805E6D4FDA23A70A5 +:10E5E0008C9E032680C9A032680CDB4327809DA245 +:10E5F000B7400F50036500FD003FC107D003F5048D +:10E60000FD402FC00CD003C60070000000000000C9 +:10E610003810E388B8502238088E00A2A088E8227B +:10E62000384888036210A8E83C000B80036280B879 +:10E63000012E800B8021A200B0842E2A288A82CE4F +:10E6400000300000000000000805C440B100285858 +:10E6500080134005008140205228160285809BC20D +:10E6600064418B98020400B1092C401B1020C400A7 +:10E67000B1002C40481002C20570000000000000EC +:10E680001815A584B900204008900224000100203C +:10E69000500890426400A910AE580398026400B973 +:10E6A000002E400B9046A410B9002E41089002C6DF +:10E6B0000460000000000000A011E700F9002A40FB +:10E6C0002C940B2402C900B2440C90032404D9807A +:10E6D000B6418F18032400F9603E400F9603E40012 +:10E6E000F9803E428C9003E80470000000000000B6 +:10E6F0002801A600F1003E400F1C03C400F9003EB3 +:10E70000408F9023C410F900BE400F900BE400F935 +:10E71000003E40079023E400F9203E408F9003CA5A +:10E7200000600000000000002810A100F800BE00FA +:10E730000E84032000C80032000C00832000F80083 +:10E740003E000C8003A000F80036100F8043E00864 +:10E75000F80032000F8003CA04000000000000002F +:10E7600028052800BA00228048A0036800AA002AD1 +:10E770008008E003680082002F8008E6022804BEBB +:10E780004023800BE802EA00BE0122800BE002CAAF +:10E79000004000000000000028054C01930120C14A +:10E7A0000A30020C00A30020C08838420C00A300ED +:10E7B00024C00A3E428C00B24C24E04B3802C441D3 +:10E7C000B30022C00B1002CA00500000000000007D +:10E7D000A0011C00B70020C9487002DC40A7142C1F +:10E7E000C82830825CC185002DE02AF0121C80B759 +:10E7F000A021820B7082D411B68021404B5002E8D8 +:10E800000040000000000000A8081E80D58029EA12 +:10E810004E3A070E80E3B031FC0C48030E41E7800E +:10E820003DE00E78039E80F4C435E00F7827DE00CB +:10E83000F580B1E00F5803EA00000000000000007E +:10E84000081DAC0031043AC40FB5936D08FB403A83 +:10E85000C8638023EC98E9003EC00DB043EC00F3A0 +:10E86000803E404FA003EC00F8683E408F9803C202 +:10E8700004600000000000000005FE60EB903EE434 +:10E880000FB8003F40CB807FE00EFB032E40CB80D3 +:10E890003FE00F79432E60CA8133648FD903FE00B5 +:10E8A000FF8133E00FD98B000070000000000000F2 +:10E8B000A8019C00878119E40BFA135E8087B22DB2 +:10E8C000EC0D79019E00D5902DF80B78037E08ABF6 +:10E8D0009129850B5102DC48B64021400B50022A99 +:10E8E000046000000000000000008C14B5206DC81A +:10E8F0000B72025C80872069C0885302CC819750DC +:10E900002DC80BF70ADCC0840121441B7022DC00F7 +:10E91000B50021C40B50860000200000000000005C +:10E920002014CF3091002CC00B34024C0083002CFB +:10E93000F20B10220C0091002CC80B180ACD01A379 +:10E940000028600B2102CE20B840A0540B1802080A +:10E950000430000000000000A811BD00F9002FC025 +:10E960000FF4027C12CF033FC20EB003FC049B02E3 +:10E970002EF20FA40BDC00CE00B0C88FA403EF0072 +:10E98000F88032F51FDD032A04600000000000005B +:10E990008000EC40E9003AC00FB103CC00F3003E28 +:10E9A000C00DB409EC18F9103E104FB10A6C80F993 +:10E9B0008936820BA603EC50F9503EC01F900360CD +:10E9C00000300000000000000110FC00FDA03DC070 +:10E9D0000C70832C00EF0235C00DE203FC04FF0233 +:10E9E0002DE08EF0033C10DC003F800CD803FC00CF +:10E9F000DE1833F04FD003C04430000000000000A8 +:10EA000081006C00B9002EC04CB0036C008B023644 +:10EA1000C00DAC12EC0079002E300D3D42AC0089E7 +:10EA2000881A100D8602EE04BB4022E00B9002E033 +:10EA3000401000000000000080052C01B9002EC02D +:10EA400008B042AC000B0526C0099420EC00B98048 +:10EA50006EC488B0822C009B822E42088102E48022 +:10EA6000B80022C10B9002E000400000000000004E +:10EA700008040C10B1252CCA083446CC08830024A5 +:10EA8000C20B0252CC8183002C0019B242AC8081AF +:10EA9000082880090002C440B10020C00B1002C247 +:10EAA000010000000000000000056C00B9003FD02C +:10EAB00008F607BCC2AF3075DC0D1602FCE0B95099 +:10EAC0003ECC0CB0232C10D9003E000C9003EC007F +:10EAD000DE0132C00F9003C00350000000000000B0 +:10EAE000A019FC00FD103FCA2EF6036D949F303A2A +:10EAF000C90C8393FC80FF117E190BB103FC40FD10 +:10EB0000083B000FC003FC807700BFC00F5003E834 +:10EB10000670000000000000C001FC00F49437C83B +:10EB20000D69637C10FF6237C00DB4037C60D48034 +:10EB30003F400F48233200CE00BF408FD10330E06A +:10EB4000FF303B600FD803B00070000000000000F1 +:10EB50008010ED20B82423F449A2023F408F5123B6 +:10EB6000DA08F6123D809B802E494B80034000D985 +:10EB70000122740BD5022100BF422E490B9C02E0FA +:10EB800004300000000000008805CD80B82028C1B6 +:10EB90001BA0024C0093202CD80B3402CC00900117 +:10EBA0002CC61AA00268088300A4400B10020000C3 +:10EBB000B31028420B1402A20170000000000000F4 +:10EBC000C015AC00B8602AC01BA08EAC019B052606 +:10EBD000C003B0426C009B802EC003A00669009960 +:10EBE00080AAC00B900263003B002E584B9002F0AD +:10EBF00004600000000000004011EC04F880BAC07E +:10EC00000F30036C10DB0336C08FB003EC08D880E4 +:10EC10007EE00688034108CBA03E640F900B2A00DB +:10EC20007B003A010F900390047000000000000088 +:10EC3000E001BC00FC8432C00CF9035C10EF003B27 +:10EC4000C00C70039C00EC013FE44FD103F100F3D2 +:10EC50000533600FD003BC04FF003F210FD003F841 +:10EC600000600000000000004010AC00C8403AC640 +:10EC70000DB4036C00F30034C00EB0036C00E91057 +:10EC80003AC00F84032C60CB0032600C500361004B +:10EC9000CB003E900E90A3900420000000000000E6 +:10ECA000C8053C02880101F020B0013E003F00335E +:10ECB000C00BF0323C08898022C0011512AC008BD9 +:10ECC0000022C048DB022F408F002E0108D4803282 +:10ECD0000040000000000000E0054C00080008F0C3 +:10ECE0000800124C00330124C04A30024C00A0201E +:10ECF00028C00B10024604830420C02918020440D7 +:10ED0000B3002C400A1C42B100500000000000007B +:10ED100020011E018D8021E018C8021E00B3A02131 +:10ED2000E01B38020E01A78021E009D840D64087B9 +:10ED30008001E0095902160097842D6008584000B0 +:10ED4000004000000000000048082C40C00038C40B +:10ED50000C30274C20F30134C10E3A034CC4E000C0 +:10ED600018C80F34034440C30030C00D90032E0078 +:10ED7000F3003E400E10019A020000000000000067 +:10ED8000401DBC00F9000ED40EB003EC20FB203F68 +:10ED9000C40FF103EC60DB103FC04FF003A446FB4F +:10EDA00000BDC00ED00BB400EF483F400F5003D061 +:10EDB0000660000000000000A805EC00F80032D456 +:10EDC0000F8003AD00EB0822D20CB6036C00F2807A +:10EDD00036C00EA0032810CB00B2C00FD6032810F7 +:10EDE000FB203E404F99132B0070000000000000F4 +:10EDF00048119D10B40121C18BC0021CA0BF042783 +:10EE0000C80875021CC0B60021C008F04218108F57 +:10EE10000021C00B54A21C00B7042D410B5202125A +:10EE20000460000000000000C0009E80B688A5E0DD +:10EE30000B78129E81A79025E48878021E80BF80FF +:10EE400024600B68021E00878461E00A1A0A1A0017 +:10EE5000B7A02DE00BDA0230002000000000000017 +:10EE60004814CC00BAC0A4C00B34020C00B3002478 +:10EE7000C008B00E2C00B39820600933022C00A308 +:10EE8000C820C00B10020C00B3002CF00B100212B3 +:10EE90000430000000000000E815A800FE80368164 +:10EEA0000BE003A800EA00B28008A0036800FE009F +:10EEB00036A01FE8133B82CEE022808EA0033800EC +:10EEC000BA003FA20FA0033A046000000000000057 +:10EED0004800E000F8203A10078003C100F800382D +:10EEE000002F8003A001F8423E050E800BE080D881 +:10EEF000003E000F8403E100F8003E000F840BD2B7 +:10EF000000300000000000000810E400C9003A5082 +:10EF10008F9083A402D100B2404C90232408C901F1 +:10EF20003E400C90032400C10032400F140A2520FB +:10EF3000E9003E420F9003C20430000000000000D0 +:10EF40008004640A890022700B90122580C9002277 +:10EF5000400A9003640089202C400A900A2400890A +:10EF6000C132400B9802060089902E400B9412E0AB +:10EF700000100000000000001801040089006A422F +:10EF80000A1002A4008900A2400A9002240009008D +:10EF90002E4058100224008980AA600B9002A4041D +:10EFA000A9002E400B9402C60040000000000000A3 +:10EFB00008040480810060480B10020481812060F5 +:10EFC000480A1202448881000E590A140205008181 +:10EFD000C028504930028C8401602C500B1002C2B2 +:10EFE0000100000000000000B80D6140C0542A007C +:10EFF0000E8503A000C85032151E05222142C8000C +:10F000003E000C80030004C8003A004F8503A14075 +:10F0100068003E000F8003EE035000000000000077 +:10F02000981DE440FD033E440FD003E448E9103E40 +:10F03000450F9113E440FD003F440FD003F402FD5F +:10F040004033500FD4237440F9103F400F5403E66F +:10F0500002700000000000001805E400F901336AA6 +:10F06000099003B634F9C832640C9A03E6A0DD00B7 +:10F070003C700F9003A500898033320FD8133C00F9 +:10F08000FD0070500FD0030600700000000000006B +:10F090003810E280B8A822100888022100B8C020E9 +:10F0A000300D8E87838888002E340B8A822280DC84 +:10F0B000E022380B80022000F8A82A280B80020EDC +:10F0C00000300000000000000805C420B10020400E +:10F0D0000A92928411B1246858091102C420910146 +:10F0E0002C481B500274849548AC480B94020404CD +:10F0F000B10224480B10020205700000000000005D +:10F100001811A400B12022400A90062C01B9002A4F +:10F1100040099002A4009B082E480B121A74009517 +:10F12000452E600390022400B9002E400B90020689 +:10F130000460000000000000A015E400F9803040E9 +:10F140000E1603A400B90432400D9002E400D94029 +:10F150002E401F9803E580D900AE6007100B2601F2 +:10F16000B900A6400F900B280470000000000000BA +:10F170002801A400F900BE40AC9203E400F900B4F9 +:10F18000400F9003E400E9003E600F9003A480F973 +:10F190000032000F9083E685E10032440F1003CA6D +:10F1A00000600000000000002810A000F8003200FD +:10F1B0000F8013E094E00032000C80036000C80070 +:10F1C0003E000D80432008F80032000F8003E0402D +:10F1D000F80032004C8023CA042000000000000028 +:10F1E00028052800BA0023800BA002FB046A002235 +:10F1F000800AA003680A8E883A8008A0020800BA34 +:10F2000000B72203E402FA008A00228008E802CA5A +:10F21000004000000000000028054C00B3006041E1 +:10F22000033002CC41A30004C00B30022C00A380A9 +:10F230002CC00938020C00B300A0C00B3402CC80F3 +:10F24000A10020C0083802CA0050000000000000E1 +:10F25000A0011C40B70061000B7102DC00A3002577 +:10F26000C81938025C80A7000FE80964221000B3B7 +:10F270000025C80B6002F200850123E8087082E8CF +:10F280000040000000000000A8081E20FF80A1A090 +:10F290000F7A42DA00E7E835F02F7B621E82E680C3 +:10F2A0001DE00DF80B1E00F78031F00F7803DE0C27 +:10F2B000EF8031F82C7803EA000000000000000025 +:10F2C000081DAD84FB683E000FB003E800FB00FAA8 +:10F2D000D80EB503ED00DB003AC08EA003E000FBC2 +:10F2E000403EC00BB043C404EF02BFC00FB003C226 +:10F2F00004600000000000000005FE42C7383364CF +:10F300000E7C035E00DFA037F00DF803FF20CF81F5 +:10F3100033E20CD803BE007FC033E00CF9037E005B +:10F32000FD803FE00FF803C0007000000000000007 +:10F33000A8119C0087A021140871021410D7203551 +:10F34000C00C7003BC0085082BC04D4602D100B72D +:10F350000021C00860020880F5203DCA0F5403EA6E +:10F36000046000000000000000009C118F01208458 +:10F370001AF0021800A73465C0097102DC008E0083 +:10F3800029C00850069C00BF882DC40A6026582456 +:10F3900097006DC09B7002C00020000000000000BC +:10F3A0002014CC008B4020001830020000BB022447 +:10F3B000C0083020CC0081C028C00B0482E010BB04 +:10F3C000A02CE00A20060000B30028C00A10028822 +:10F3D0000430000000000000A815BC00CF1032006F +:10F3E0000EF00B2400EF0037C00DF003FC06C150F7 +:10F3F0003BC00CB403AC00F8C0BEC82EB0036E0115 +:10F40000FB002DC04B9002EA0460000000000000E9 +:10F410008000EC04FB003E000FB003AD009B003EFB +:10F42000C00F3003AC00F8002EC005B403ED00F8A7 +:10F430004032C0090003E091E3003EC00F9011E0AC +:10F4400000300000000000000110EC00EF0033204D +:10F450004FF003B400EF033AC00FF0033C00DC00B0 +:10F4600031C08DF803FE04CF0032C80CF00B1C0035 +:10F47000CF9333C08C4002004430000000000000F5 +:10F4800081046C00BB00A2040B30020E00AB002A0A +:10F49000C009B0036C08A8C036C008BC02EF02ABBC +:10F4A000D020E008B82226108B0022C0209C022029 +:10F4B000401000000000000080052C00BB0026006A +:10F4C0000AB002A208AB006AC00BB00A0C008B8025 +:10F4D00022C009B102EC40880822C008B802260008 +:10F4E0008B0022C0089802A000400000000000002D +:10F4F00008040C00B30024000BB0020001830020BC +:10F50000C00930024C00000424C00830064C0080C2 +:10F51000002CC008000200418300A2C008100A822B +:10F520000100000000000000000D7C00EF08260034 +:10F530000EF002A000E7003BC00FF5433C02DA00EA +:10F5400032C00DB003EC00CB00B2C00CA0032810F9 +:10F55000CB0032C00C80038003500000000000008C +:10F56000A00DFC00FB003B000FF003F000FF023F8A +:10F57000C00DF203BC00F4003FC00FF003FC00F725 +:10F580000033C00F6003F088FF003FC04FD0036816 +:10F590000670000000000000C005FC40FC313B0884 +:10F5A0004FF943EF00DF3032210F94077D80EF38B1 +:10F5B00032091C3803F221FD0033C40CF002FC00B8 +:10F5C000DF0033C00FF003300070000000000000C7 +:10F5D0008010EC888B6022E50EB222EC80AF112AFD +:10F5E000200BB113AC488B4534CC48B0026B00BA49 +:10F5F000823600088822C0048800A2088B88622016 +:10F6000004300000000000008805CC00A130280074 +:10F610000B3202CC00A3222C008B1206C880A30060 +:10F620002002CA3006C401B10068800920028800A7 +:10F63000830020C20B000AA201700000000000003D +:10F64000C015AC008B6162C00BB202E800AB022AAD +:10F65000611B9002A800AB0020C00AB0026C04BA83 +:10F66000002E40899002E608980022000BB002B0FC +:10F6700004600000000000004015EE00F8013A04AC +:10F680000FAC03EC90FB023EE00B90426780A8C4F5 +:10F690002248228603E140B8022A40299003EC0266 +:10F6A000C94832400FB01390047000000000000001 +:10F6B000E001AC40FB001FA20EF882FC08FF003FF7 +:10F6C000C00FFA439644D4913F400DC003FA00FFA7 +:10F6D0000825800EE003D000EA003F800FC00378C9 +:10F6E00000600000000000004010AC00E1203A5033 +:10F6F0000F90032C00EB0876050EB027E010EA40CF +:10F70000B2C00CA4432500F80032080F8043E80083 +:10F71000D108EE400F0003D00420000000000000DC +:10F72000C8052C008B0022D00B90822C0087402231 +:10F73000608BB002E000D85022D00CA0036C00B364 +:10F74000C83ED00BB80225088A202A808BB882F2E6 +:10F750000040000000000000E0056400A0C024C0DC +:10F760000938022C0083032000103022CC008300D3 +:10F7700060080A30824C00B1C000D10B380284808E +:10F7800082012080033802F80050000000000000D1 +:10F7900020011640849825E00B7A02FA48A32061E4 +:10F7A000240B7900CEC093A421A60B7812DE80B67C +:10F7B000802D240B4B021A40858121600B4802C822 +:10F7C000004000000000000048080C00E2A0B4FE69 +:10F7D0004BB80B0E00A3B024A80E1B02CEC1C3C0B1 +:10F7E00030682E3A474E80F18030800F22838000AF +:10F7F000C21038804F0007D2020000000000000055 +:10F80000400DBC10FE043BC107F0031CC8DF2A0BEF +:10F81000C48FD143F8027F003FC00CF10F3C00F2CF +:10F82000113F411F5203BC0EED143F400FF803D0AF +:10F830000660000000000000A805E400E900328036 +:10F840000EBE4B6F00CB827AC02CB0032C00C900D7 +:10F8500032002C10032C08C00026406C9013241298 +:10F86000C8013E000FB80B2A007000000000000025 +:10F87000481194008D0021800B70823C2083322936 +:10F88000C008F0201400800023000850069C04D714 +:10F89000022880086002081087002DC00B40021269 +:10F8A0000460000000000000C0009E00A78021E06E +:10F8B0000B5C121E0487820DA00978160200B4802A +:10F8C00025E00B78029E00848021220808021201A4 +:10F8D00084C02D200B080230002000000000000032 +:10F8E0004814CC008342A0D80B34820C00A3022021 +:10F8F000E008B0020C88B32124D80B3E028C0093A0 +:10F900000828C00838022C058B012CE00B300212AD +:10F910000430000000000000E815A800EE0033905D +:10F920000FA00B6800CA017FA80CAA033A12FEE2DE +:10F9300037B00FEE021800CA4036A008A08B28008E +:10F94000CA812EA00FE0033A04600000000000000E +:10F950004800E000F8083E000F8003A202D8403EB5 +:10F96000080F8013E0404840B8040884036100FC9D +:10F97000003F004FC003F100FC003F040FC003D262 +:10F9800000300000000000000810C400F9003050F2 +:10F990004CB9036C18F90036400E9C23A4024100B8 +:10F9A000B2440E9A03A680C9003A600A9003A4806C +:10F9B000C90034400C9003C2043000000000000075 +:10F9C0008004640089402278089402E410B9003C65 +:10F9D00062189482A40089C82270481E016780D1F1 +:10F9E00000BC42081002252089022240089002E053 +:10F9F000001000000000000018052400B12822407B +:10FA000008B082640439412E480A90020418A920E3 +:10FA100022424A90022C0489042B4802D002B40AE4 +:10FA20008D8023C048D002C60040000000000000C6 +:10FA3000080404808120A048281002C400B1242AB0 +:10FA4000400812428580A120A048089002440095F9 +:10FA50002C2D5A0A728214A085A8214A085282C20B +:10FA60000100000000000000B80D4140F8503200D5 +:10FA70008C05036140F8512E000A85022000E850F1 +:10FA80003214068517A000C8203A080E8203A08011 +:10FA9000C82032082CC203EE035000000000000012 +:10FAA0009819F440FF103F440BB003E400F9103DF7 +:10FAB000400FD103F4589D103F444FD003D500F9B7 +:10FAC000003E408D9003E4B8F928BA6A0F9003E62F +:10FAD00006700000000000001801E700FD883E608D +:10FAE0008FD0032401DD8073400FD803A604CDA27C +:10FAF00033781CD0033401F5883B680CDA47378033 +:10FB0000CD8832620CDA03060070000000000000AD +:10FB10003810E380B8802E140B0A822280B8F8A235 +:10FB2000000B8FA383E088EB22A9088812A005B8F8 +:10FB3000002AAA88801362828880222888A4020E64 +:10FB400004300000000000000805C500B10A2C4187 +:10FB50000B10060420A10000408B1046C401911137 +:10FB600024586890C20400B100A85009140A0595F1 +:10FB7000A108A04228110A02017000000000000044 +:10FB80001815A418B9202E500B90062409B900228C +:10FB9000408B9102840099642440589002A420BBB9 +:10FBA000002A4009B0020501A900224088920206FD +:10FBB0000460000000000000A015E600F9403E408F +:10FBC0004F980B2480D90022720B9803E484D9004B +:10FBD000B6700899022400B9002A400D94C225008D +:10FBE000A90022400C9403280470000000000000CB +:10FBF0002801A680F9083EC00F9143E400F9003EB9 +:10FC0000500F9803A500E9003A640F9003E400F94F +:10FC1000003C406E9003E420D9003C400F9082CA23 +:10FC200000600000000000002810A000E8003E0076 +:10FC30004F840B2000F80036010E8003E000C8401E +:10FC400032102D8003E054C80036100F0483E050BA +:10FC5000D80412000C000B0A042000000000000071 +:10FC6000280528008E422EA28BEA022808BE89377A +:10FC70008448E01228028EC023B04D6062F80086EE +:10FC80000023800BE002F8000E00228008E4020A44 +:10FC9000004000000000000028054C00A3002C805C +:10FCA0001BB09A4C109B8024C00A30000C049B208F +:10FCB00020D60830028E08A30424C0193402C707D6 +:10FCC000AAA4A0C04834020A0050000000000000AE +:10FCD000A0010E0087002DC00B40025C40B314252C +:10FCE000E0087A029EC09240A000496002CE028ED7 +:10FCF0000121C08B5402C408864021C88810022804 +:10FD00000040000000000000A8081EC0E4803DE2A2 +:10FD10000F58035E90B6A235E00E7C231C00D680FF +:10FD200031E0847803DE00C78035E00F6803DE0031 +:10FD3000E38033E82C78032A020000000000000072 +:10FD4000081DAC90FA007E400F9003AC01FB003C14 +:10FD5000410F300B2D04EB013EC00EB003EC00FA56 +:10FD6000003FC00F8003EC00E9603EE40F9003C247 +:10FD700006600000000000000005FE20FF903E200D +:10FD80000CA9072E44C99130A00CB8632F44CBA115 +:10FD900036208CF8033600CF8233E00CF8232E0097 +:10FDA000CEC03BE00C6803000070000000000000C3 +:10FDB000A8119C84B3542CF428BA8A3E4081A0290F +:10FDC000B00F7842AE00839033E80DE100854082A9 +:10FDD0002423C60D71035EE087002BC10D44022A67 +:10FDE000046000000000000000009C0835146DC095 +:10FDF0008872325C8084302B880A70425CA891083B +:10FE000025C80970024C22830A61C009200204003F +:10FE1000870021C0086002000020000000000000F0 +:10FE20002014CC10B3856CDC0834024D21810028ED +:10FE3000024A3112EF0C91C220F00830428E00824B +:10FE40004020C8192802228183C028D409000A084A +:10FE50000430000000000000A815BC00FBA03EC05C +:10FE60008C04127D10CF023A5008C0427D525801D6 +:10FE7000362269D0132A00888232F009B8822F0016 +:10FE8000C9C823C00C8A032A0460000000000000D7 +:10FE90008000EC00B9403C504F8023AC12FB002A9C +:10FEA000C06D8013AC00E804BA100F8003E800F3C3 +:10FEB000083C800F9083EC04F9602CC20F8083E033 +:10FEC00000300000000000000110DC00EC2C3FF0CE +:10FED0008CFA8BBC00FE003F000F79033C00CE087B +:10FEE0000BC20CF003BC00FC0033408C7A033A00D8 +:10FEF000C50033C04CC803004430000000000000BF +:10FF000081046C0088C02EE00894022C00BB80663F +:10FF10003016B0022C00DA4C22F008F003EC00EBB3 +:10FF2000C022680094022C02A98022C0080C02A002 +:10FF3000401000000000000080052C00AB042EC023 +:10FF400008A4062C04AB102E604380826C018180D3 +:10FF5000280A089100E000B88002E00880022D80A5 +:10FF600088C022C00882022000400000000000007B +:10FF700008040C0080442CC828A0220C04B3262CB2 +:10FF8000C88801060CE09120200C380422C048A348 +:10FF900042A0810800020C80810020C0280002825B +:10FFA0000100000000000000000D7C00A9403E445C +:10FFB00008B1032C40EA492E0D0BB6137D80C940D1 +:10FFC000BAD00CB403AC00F80032400C800B200017 +:10FFD000C500B2C00C800300035000000000000008 +:10FFE000A01DFC04FC003DC50BF100FCD0772937B7 +:10FFF0000C8E7403FC08FD693FD80FF003BC00EFC2 +:10801000003F4007C003F040FD003FC00FC003E831 +:108020000670000000000000C00DFCC0DC803FC8EE +:108030000F48037C20FF6837E00EF1039C00BF204F +:1080400037E00CC8133C40ED60BBE42C434B70A000 +:10805000CC2C3F090FD843700070000000000000D6 +:108060008000EDC0B8802FF40F98023F00BF42227D +:10807000CA08F4023E00BFD0226028880A3D808DE5 +:108080004022C80881022180DBC02EA50B98422027 +:1080900004300000000000008805CC10B0002CC0A7 +:1080A0000B2002CC00B32026C08A36128C41B300CC +:1080B0002E400800020D81A13022C889A24208206A +:1080C000B0002C400B902662017000000000000000 +:1080D000C015AC00B8502EC00A9002AC00BB002204 +:1080E000C008B0622C10BB042AF04A88020C008140 +:1080F0000022C009B8802600B8802E210B900230E3 +:1081000004600000000000008015EC00D8C03EC0F4 +:108110000B8003EC00FB0036800EB003AC00FB00CC +:108120003CE00C0C032C00E90010C00C8C03060092 +:10813000F8CD3E220F18034004700000000000003C +:10814000E001BC00FF003EC00FF0037C00F7023FDF +:10815000E40F70037C04B70037400DC003FC00FD42 +:108160000037D00EC043F400DF003F808FDA03F801 +:1081700000600000000000004010AC00F8103AC0A1 +:108180006DA613EC00CB003AD00FB0032C10DB101F +:1081900036D80D8403EC06C9083AC00E8603A860E1 +:1081A000F8203A400C900354042000000000000026 +:1081B00098053C00BB4023D00830023E10AF0020A1 +:1081C000C00BF0023C008F502EC8068A02FC008DC6 +:1081D0002482D60832022D083A4022800D90036294 +:1081E0000040000000000000E8054C00B02028C25C +:1081F0000804028C00130228C00B30020C3093805C +:1082000024D0092002CC00914008C02A1402810029 +:10821000900068000818023A0050000000000000BA +:1082200070011E00B4A021E008C8129E00B3822194 +:10823000E00B7A0A1E0097802DE10A4802CE409595 +:108240009029E40858029A00B78821E00958025C96 +:1082500000400000000000004A000C00F08038C41C +:108260000C25038C20930038C40FB0030C80D3007E +:1082700034C00D0413CC0899002AC00E21038804D1 +:10828000F30038C00C11831202000000000000004F +:108290004215BC00F4003FC30EC0031C00AF4A7F70 +:1082A000C40FB203FD01EF103F840FC003FC00E9CF +:1082B0000037C20EF1477C00F7003DC00F5003D0DD +:1082C0000660000000000000AA15EC08F8003ECA95 +:1082D0000F9003EF21FB807A408FB2A12F00CB607B +:1082E0003EC00FB003EDA0E93032C02DB003E40072 +:1082F000F8003E000FB003EA00700000000000002C +:10830000C8919D00B4012DC80B7002CC808F202134 +:10831000C08B76035D00870A2DC00B4022FD008DC7 +:108320001023C8085012D400B7002DC00B7002F201 +:10833000046000000000000081009E00B4802DE079 +:108340000B7C02DE40A7822DE00B3A028E00879064 +:108350002DE00B58025E00A5A265E0086882DA00F5 +:1083600095802D600B7802E00020000000000000E6 +:108370000884CC00B0092CC00B3802CC0083002E3E +:10838000C00B30424C0083002CA00B0402CC0081B7 +:1083900000A0C008B006CF80B3102CC40B3102C3BC +:1083A0000430000000000000E805A800FE803E80C8 +:1083B0000FE813E800EA003FB00FA003A802C200D4 +:1083C0002F880FE003E800EA0036000CE003F920F4 +:1083D000DE803FA04FA803FA046000000000000008 +:1083E0004800E000F8103C100F8083E100E8002214 +:1083F000060F0013E001F8003E000F8083E000F854 +:10840000003E000F8423E000F8003E100F8003D2EE +:1084100000300000000000000800E400F9103E44B5 +:108420000D9003E400F9003E400C90122400F91076 +:1084300032408F9003C400C90032100C9C0124000C +:10844000F9103E700F9002C20430000000000000DE +:1084500080146400B9C02E48089102E400B9002ECF +:10846000400D90036700B9802A600B9902E40081F7 +:108470000022402C90122520B9482E520B9402E085 +:10848000001000000000000018052400B9002E4074 +:10849000689046E400B9002EC0089002A460B900BC +:1084A00022480B9006E4028900A040089002A61022 +:1084B000B9000E400B9002C6004000000000000012 +:1084C00008040480B1002C48081002C484B1202C98 +:1084D00040091202C480B12028400B1002C48089D8 +:1084E0002020404B120A8484B1202C488B1002C2F9 +:1084F0001100000000000000B80D6140BA002E001D +:108500000C8003E808F8503E140C85032000B800E6 +:1085100032000FA003E140C85032140CA503A14063 +:10852000F8003E000FA003EE035000000000000022 +:10853000880DE440FD003E440FD003E440B9113FF4 +:10854000400F91036444F9103F400FD003E440FD15 +:10855000103F108CD1037440FF103F440FD003E64E +:10856000067000000000000008056620ED00336979 +:108570004D50435600F9A034400F9A0B3400DD8073 +:108580003B400B5003E400F90032E00ED003F4004E +:10859000FD003F400CD003C600700000000000004A +:1085A0007810E280880422100B80022009B8F022A3 +:1085B000000B8E12A000B8522E000B8002E005B80E +:1085C000AA233E0D8002E000B8003A00088002CEE7 +:1085D00004300000000000004805C420A900A444A5 +:1085E000099002C500A1082C400B11820400B100C3 +:1085F00028400A1042C400B500A140081002C4007F +:10860000B1012C40081020D20170000000000000D1 +:108610001815A400890422400B9000AC0039002AF0 +:10862000400B1002A400B9002E480B9012E400B9D0 +:10863000002160099222E428B9000A50089006C679 +:108640000460000000000000A015E400E9003640CE +:108650000D9003E400F9003E480F90032400D90078 +:108660003A780E9803E400B900B2400E9223E60077 +:10867000B9503E702C9003E8047000000000000028 +:1086800068018400F9003E404F9C236400F90436E1 +:10869000480F9003E400F9003E600F9203E400F9F4 +:1086A000003E408F9083E444F90078640F9003DA31 +:1086B00000600000000000002810A000F8003E004C +:1086C0000F8203A040E8003E000D800320C0C88058 +:1086D0003E120F800360007C0033000D8013E01019 +:1086E000C8643E080C8203CA042000000000000099 +:1086F00028052800B6E00FA00B60823800AA002EE3 +:108700008008A042BA00AE202F880BE5022800BAEC +:10871000D8378008EC02F8048E002F900DE002CAD2 +:10872000004000000000000028054C00B0242C6030 +:108730000B38028E80AB002CC00930020D0800807F +:108740006CD00B3402CC00B8C02000483412CC40AE +:1087500083002CE00A3502CA00500000000000002F +:10876000A0011C40B7002D028B60029E0087202FC5 +:10877000E00872029E00A4002DC00BF8029CC0B35A +:1087800002A5C0085086FE0087002FD0097002E8BD +:108790000040000000000000A8081E00F4803D20FA +:1087A0000F58039E0067803DF80D38021A10448070 +:1087B0003DE00F5803DE20B48033A02C6803D600C0 +:1087C000C7813DE00C7803EA0200000000000000D1 +:1087D000081DAC08F8003E008F80036C003B123E81 +:1087E000CA0FB503C800F8047EC00F90036C80FB6D +:1087F000043A400F9023C800F9013CC00FB003C2F7 +:108800000660000000000000C005FE00AC9031488A +:1088100008F803FA00CF803FE00CFC133E04FC8014 +:1088200035A00C7803BE00DF803B2024F8032E40E7 +:10883000CF8033E003F903D0007000000000000097 +:10884000A811BC0080000100087202D00087002D32 +:10885000C80AF0029840F50061410074021C00B49F +:108860000021C80860023E20860821D80F5002EA85 +:10887000046000000000000018009C00A40021001B +:10888000085002D80097002DC08871021400B00073 +:10889000259008C0829C40930029A1886002141290 +:1088A000874029400B6002C4002000000000000047 +:1088B0006014CC0080D0A000081C02C00093002CE3 +:1088C000D00AB0268000B30024E40808028C00B06F +:1088D0000202410808020301810028421A0042D81E +:1088E0000430000000000000F815BC00E8C0328031 +:1088F0000CB503E4009F003DE00CF00B2400F800F1 +:1089000036E00C2503BC05D8022A0008BA022A006A +:10891000C1023A508B9003EE04600000000000009A +:108920008000EC00FB083E800FA103EC04EB022E5C +:10893000C60FB0174400E8003A400F80026C00FBFD +:10894000003EE00F9093E100D90026708F9001E186 +:1089500000300000000000000010FC00FC03372481 +:108960000DF803E000FF003FC18DF00B3800CC0094 +:108970003FC00FFA033C0CFC043B800CA003942086 +:1089800089053B004FD023C00430000000000000E8 +:1089900080046C00B006201388A802EB00BB002EF8 +:1089A000C008B0022A00A8802EE00B941A2C00BB4D +:1089B00000A240299802E200A98422200B9802E03C +:1089C000001000000000000080052C00B80022000C +:1089D000098202E600BB002EC00BB0022600888090 +:1089E0002EA00BA0022C00B3002A00099802EA2056 +:1089F000A9802A609B9882E00040000000000000EF +:108A000008040C00B8002000090802C400B30026C6 +:108A1000C0003002000081002C410B00020C00B0AD +:108A20000020C00B0002C880A80020410B1002C229 +:108A30000100000000000000000D6C10F850B200B2 +:108A40000D8003E000FB003DC00DF0132402C806BA +:108A50003E800FA0033C04FB0078800CA003E400E0 +:108A6000E9001A400F9003C003500000000000000E +:108A7000A01DFC00F4203F000EC002F001FF003FEB +:108A8000C00FF023F000FD003FC00FC003FC00FC4E +:108A9000003F409CC003F040FD003F400FD043E842 +:108AA0000670000000000000C005F000ED23B7488C +:108AB0000CE1C37CC0DD8037E00FCB03FE08FC284F +:108AC0003FF01CFB237C01FF1477E24FE8237C007E +:108AD000C48033482CF822300070000000000000F1 +:108AE0008010E0E0C9C0225B8896222D00892222F6 +:108AF000CA0B9E22E2A0B9612CE0889F023D85BF8F +:108B000060265048A0023C008800225008B0022095 +:108B100004300000000000008805C080B11020442F +:108B20000BB202CED081082CC00B01028C08B30816 +:108B30002CC90810628C60B33224800AA0026C0336 +:108B40009A01264448B04262017000000000000013 +:108B5000C015A4A08B0222E00BB062AC9899002A49 +:108B6000C20B9806E400BB022EC00891422C10BB39 +:108B7000006E800A80026C001B00064048B80A7034 +:108B800004600000000000000011E700A1007678FA +:108B90000FB003E810D9003ED04B9E13AC08B8A02C +:108BA0007EC608A8022C01BB0026304E20034C18BC +:108BB0009980B4404C3A034004700000000000006B +:108BC000E001B200FDC53BC04CD0036A02ED0633A4 +:108BD000C40FD053F800FC907FC10F7803BC04FF92 +:108BE0000037640CF103A400EDA13B400BF083B807 +:108BF000006000000000000040108C00CB203E719F +:108C00000FB3039802FB0236480F9003EC20F800E4 +:108C10003ECC0484032C00DB043C100FA003EC00CA +:108C20009B0032400C9003D00420000000000000A4 +:108C300088052C028B482EE00B34036B008BF52249 +:108C4000F20B9C03AF00B8502EC008B0027C008F1E +:108C5000000E5D0B8002F54083502354089C02E611 +:108C60000040000000000000E0044C0081812E4024 +:108C7000032C020433990020F04A2880CC40B00035 +:108C800026100820024C0083002CC0092002CC00D2 +:108C9000A00228400808027A0050000000000000EE +:108CA00020010A0085802DF80BDA02D64085A0212C +:108CB000E00B48069204B5802D210800024E008783 +:108CC000A42D600B6802DEC2AD902B60285882DCB8 +:108CD000004000000000000048084C40C3102C6C0D +:108CE0000F300386A2F9B0B0E00F2983CE44F380A1 +:108CF0003CAC0C30030C00C3003CD50F2003CEC1AC +:108D0000E010B8400C0003D2020000000000000098 +:108D1000C01DBC00EB003ECC0F32036408F9003BE1 +:108D2000900FF043E440FB343F8107D103AD20EBCB +:108D3000207FC40FE103FC50CD1035400FD003D08D +:108D40000260000000000000A805E404FD043D40AE +:108D50002D30023C00C9013EC04FB843EC10FB006F +:108D600032400FA023EC80CB3632804DA8032C106C +:108D7000CB0032400C90036A00700000000000003D +:108D8000C8119008B5002DC0085002BC0285042D02 +:108D9000C08E6006D804B70421400B7002FC80AF7F +:108DA0002821C00B70020640870021500850023273 +:108DB000046000000000000080009E20B7802B703F +:108DC00008F8061E0087802DE00B7032DE04378421 +:108DD00025E00B6806DE80878021A11B68021E400B +:108DE0009F80206008580220002000000000000042 +:108DF0004814CC20B3002C8088B4228D0083902CA2 +:108E0000C00A3802CE08BB2024D00BB302CC00A38A +:108E10000060D20B202A04089350204008170A0251 +:108E20000430000000000000E815BA00BAA03F843A +:108E30001CE00B38408E062E800BE303F880FEE426 +:108E4000B7900FEC02E8008A00A3A009E4032A020D +:108E5000DEC0F3800C6C033A0460000000000000E8 +:108E60004801E000F8403E000F8413E000F8002EB7 +:108E7000300A8403E004F8003A020F8013E000F89F +:108E8000003E040D8083E040E8203E002F8003D2A6 +:108E900010300000000000000810A400F9003C643D +:108EA0004E90832480C90032E00F10032500F900A2 +:108EB00032440F92236400C10032400C9013E4004E +:108EC000C90022400C9003020430000000000000A2 +:108ED00080046400B9202E404896222500D9C0A203 +:108EE000700B98022400B940A2704B90022400D964 +:108EF00000A2402C9422E4028900A240289413206E +:108F0000001000000000000018012400B9002E40ED +:108F10000A900204008180A2440B910225001940AE +:108F200062400BB402440089002040089082C401D2 +:108F300083022840489082060040000000000000A4 +:108F400000040580B1006C5108141A05009300203C +:108F5000408B14020500B12020500B1406048091B0 +:108F6000202040091002C4A88100284A08904A42E3 +:108F70000100000000000000B80D6000F8003E0095 +:108F80000E80032801C85032948BA0032000B050FB +:108F900032800F80076151C85022000C0003E0842A +:108FA000C8043A080C00032E035000000000000023 +:108FB000989DF440BD413F500FF403F510FD003E75 +:108FC000400FD403F400FF102F404FD440A448F9C1 +:108FD000123F5A8ED283F4A8F52C374A0FD283A6BB +:108FE00012700000000000001805E680FD283F4CCC +:108FF0000F50033C44CD403FD00DD0021401FDA0E2 +:10900000314003D003E789F9907E500C9403E6C009 +:10901000C910326D0F9102C6007000000000000000 +:109020003810E080B8012E0C8B8482204288A06E1C +:1090300020088003600098E82200098002E3C0E86D +:10904000D02E28088A23E284D8A0223D0BC802CE65 +:1090500000300000000000004805C5B0B1002C48F9 +:109060000B13020402B1202E40881022C400B11458 +:1090700024400B1052C400B1212D480A5202D500E1 +:10908000BD00AD400B5202D2017000000000000094 +:109090001855A500B9822E498BB012241099022EC2 +:1090A0004008B200650099802644099102E409A9AC +:1090B000042E460AD402B400BD402F400BD002C695 +:1090C0000460000000000000A015E740F9802E6257 +:1090D0000F9C42240099012E682C92026400B94032 +:1090E000B6600F9A03E400B9002E703E9906E402C0 +:1090F000F9003E400F9803E80470000000000000F3 +:109100006801A600F9003E401F12ABE400E9903E62 +:10911000490E9803E400F1003A400D9803E400F989 +:10912000013E60059013E400592032408F9103DA2C +:1091300000600000000000006810A000C8083E01A8 +:109140000F84630022E8203E130F8403E1C0D84C53 +:1091500032000C8443E000F80022100F840300006A +:10916000C800B2000CC0030A042000000000000088 +:10917000280528008E002F864BE00239088E202D0E +:10918000900BED92F8028EE0A39808E002E808BA8E +:1091900000628008A00228000280028048E0034AA2 +:1091A000004000000000000068054C0083102CF017 +:1091B0000A142A0D1AB30124D00BBC32CC080300C8 +:1091C00020C80B3002CC00B30222C00930020C11BF +:1091D000830020C02820020A005000000000000088 +:1091E00020011E0185002D000B7002183286002D13 +:1091F000C00B6016FE04860027A08B7042DC80B78F +:1092000080210108F80A1800860820A008E80A68EA +:10921000004000000000000028083E02C6803DE03B +:109220000F48030604F58235E00F7803DA00D38097 +:109230003160077803DE20F3B081E04F68070E024B +:10924000CF8031E00C78132A0000000000000000FD +:10925000081DADA0F9003F000FB053F810A9003E63 +:10926000000F8001EC00FB023AC00CB003EC00FBE5 +:10927000743C000F2003E800FA003E800F3003C268 +:1092800006600000000000004005FE028F8035E00F +:109290008DD9032EC4F68032A40CB803DE00CF9023 +:1092A0003CE40CB803FE65FF800FEC8FF803FE0072 +:1092B000C58033E00F68031000700000000000005C +:1092C000AA119C8084B0202029730A0E82A2A0A239 +:1092D000A04F3B038784B2802CA00A7D02DE80F77A +:1092E000202506087002C840840035800B60036AA0 +:1092F000006000000000000000009C10863827C0BD +:1093000049540654401D2021CA096140F880B72005 +:109310002F00897012DC81B7042DC90A6002CC00CD +:109320008D002DC00BF8020400200000000000009A +:109330006014CD288000240009B0224C02A1012035 +:10934000301B2302AF20B3082C801B3000CC04A3B9 +:1093500001263008AC22E80280082E804BB4025867 +:109360000430000000000000A815BC108B8036F00F +:109370002DBC0B6C01DA0422407D9422E400AB4446 +:109380002EC009B802FC00BF003EF0CA9202E402FF +:10939000CB006E400F84012E04600000000000002E +:1093A0008000EC00FB003AE02EBC039808EA40364F +:1093B000438C9003A4442A403E100EB583EC14FB6A +:1093C0000026000E9203E040FA0016000F8013E022 +:1093D00000300000000000000110EC02FA803FE2C3 +:1093E0000FB00B2400EF92BBE01CD0037400CF053C +:1093F0003B400FC8035C00CF0032C24DC123344054 +:10940000CF0017440CD1830004300000000000009E +:1094100081046C008B842E540BBC0A29808B803213 +:1094200000089C03A700AB842E7C0B80022C10DB71 +:1094300001360008800220008200220008900224E9 +:10944000001000000000000080050C0089106690EC +:109450000BB8026E12A34120040A9822E200891977 +:109460002EC04B31226C08830022C00990022400D8 +:1094700089002A400880022000400000000000000F +:1094800008100C0080202C0E1B300204418020208C +:10949000121816420050A0402C881B30020C8193F9 +:1094A00000240008102A000A8800280028000A0268 +:1094B0000100000000000000000C7C11E80026986C +:1094C0000FB013210CEB603AD82884A2E180C820A9 +:1094D0003E5E1F82037C00CF0032C04D8007250016 +:1094E000C90032400C900300015000000000000051 +:1094F000A111FC00F8131E000BF001F0D0F9191FA8 +:10950000084FC013A100F8623FC00BC407ED00FF75 +:10951000003F000FC023F0A0FC0033000FD003E891 +:109520000670000000000000C005FC00FF0C3F209A +:109530000CC9033200CF383FD00F4803FCA0CE2225 +:1095400033000FC1033C00FF003DC44CC0238CE43A +:10955000FF10372008F103F0007000000000000049 +:109560008010FE00BF802E74052202A210DF612F42 +:10957000D08B90023DA4AA9022F40B07121D20BBB1 +:10958000C02FD8889782FD80EF72220828F623E04A +:1095900004300000000000008805CC40B3002C001F +:1095A0000882022200830108CC8B2082CC0090002C +:1095B00020004B12020D80B3402CD80820428C8032 +:1095C000B3202602183326E20170000000000000DC +:1095D000C015AC09BB002E60088002A2009B002EC3 +:1095E000C00BAC022C00BA0622C20B9402AC10BB1A +:1095F000002EC108A802EC00AB00220008B006F063 +:1096000004600000000000009015EC00FB043E60C8 +:109610002882130E08CB003AC00F8C03EC11DB201C +:10962000B2904BA80B2C00BB002CC00C8813AC00D4 +:10963000F300360648B012C40470000000000000B9 +:10964000E001BC00FB083D408FEA01F400FF012F60 +:10965000C00FD022FC04AF003FC08FE9037C00FFA5 +:10966000003FC00F9043FC20EF023F008FF003B893 +:1096700000600000000000005010AC08EB00124039 +:109680000F90032820AB003AC08F8583AC10F350B5 +:1096900032904C34136C00FB003EC00C98032C40FD +:1096A000EB8032120DB00B500420000000000000CF +:1096B00088013C100F05A2500C100222108F0023CD +:1096C000C00B88123C009B8222C008B0023C008F75 +:1096D000A02FC008B0023C088F02200008F003262B +:1096E0000040000000000000E0054D20930020B283 +:1096F0000B10020100A30068C00B8402AC00B38011 +:1097000020400A30024C00A3042CC00800020D00C7 +:10971000A3002024083002380050000000000000A0 +:1097200070011C20978023600878123A00839129E9 +:10973000E40B59021E00979020FC0A78021E008755 +:10974000902DE01959021E80838061A008780218CC +:10975000004000000000000048080C40D3323006F2 +:109760000F30030464E30138C41F30078C18F10084 +:10977000304C0E30034C00E3002CC00C20030E00D4 +:10978000E30032080CB103120200000000000000E8 +:10979000401D9C80EF103D444FF107CC00FF083680 +:1097A000C6CFB003FC009700BECC0DB103FD04FF93 +:1097B0000C3FD29EE04BFD20FF023F800EF013D005 +:1097C0000660000000000000A815ECC0CB283EC0D9 +:1097D0000F8003EC00FB0132E90C28032C00FB0096 +:1097E00032C00CB4832C01EF00B2C80C20036D0012 +:1097F000CB103E000FB203EA007000000000000032 +:10980000C8919CC487602DC00B6002DC00B7122099 +:10981000CC0A70021CC0B300A0C0C870221C80B764 +:109820002421C84850020C8087102D400B7282F210 +:10983000046000000000000081008E0287802DE09F +:109840000B7812DE00B7A021E008F88E1E40B78822 +:1098500021E00838021E40B3A120E848F8825E02E9 +:1098600087802D220B7902E000200000000000001C +:109870000804CC0483022CD40B3002CC00B300A02B +:10988000C08A38060C00B38020E14839122C00B39E +:109890000022C008B0826C0083002C480B3002C24A +:1098A0000430000000000000E805A800CA003FA046 +:1098B0000FE403D800FA0032800CE8032800FA40D5 +:1098C00032A82CA0092808F20032800CE4036800BA +:1098D000CA003F800FA003FB0460000000000000EE +:1098E0004800C000F8013E120B8003E040F8003E43 +:1098F000004F8403E004F0083E004F0003E000F84E +:10990000413E002F8403A000F8003E000F8003D2E8 +:1099100000300000000000000800E600C9123E50C0 +:109920008F9083E420C1003A410F9003E400F900D6 +:1099300030680C90032400D9003A400E98032400AC +:10994000C9903E690C1003020430000000000000C2 +:109950008004674A89802E500B9002E480A900227F +:10996000400B9002E400B9012240089002241089C3 +:10997000002240089302242289422C604890022051 +:1099800000100000000000001815240099002E406F +:109990000B9002E40089002A400B9002E400B90019 +:1099A000234008D002240099002A400A900624404F +:1099B00089412E400890020600400000000000008F +:1099C00008040C8091202C480B1002C400A1202018 +:1099D000480B1002C480B120A14908524A0480817A +:1099E00000204848120A048081202C4028120202DC +:1099F0000100000000000000B80D6008D8043E809F +:109A00000F8503E000C0503A140FA503E140F802AF +:109A100032802CC5032140DA003A140E85432140E0 +:109A2000C8523E140C850B2E0350000000000000AD +:109A3000881DE444E9103F444FD002FC00F9123E77 +:109A4000440FD003E440FD103E444F9103E440E94D +:109A5000403E440FD103E440F9123F400F9103E62A +:109A600006700000000000000805F6A0FD80B3406D +:109A70000C10031400FDA032400FD103E400F58662 +:109A800033602C9A832404FDA822400D5043F40037 +:109A9000FD0033400F90030600700000000000003E +:109AA0007810E100B80022002880022000B800A24F +:109AB000000B8A12E000B80422140884022000B8C7 +:109AC000402000888002E000B800A2000B80020E57 +:109AD00004300000000000004805C400B1422040EE +:109AE0000810020400B14020400B1006C400B14031 +:109AF00024400810024404B1006040091002C40070 +:109B0000B10020400B1002120170000000000000A4 +:109B10001815A400B90222600894022400B9012299 +:109B2000400B9006E400B92026400894026408B96E +:109B3000002240089202EC08B90422410B100206F0 +:109B40000460000000000000A015E410F100326085 +:109B50000C940B2500F90032408F94D3E400F900F7 +:109B600036404C900B6400F10032400D9212E4003C +:109B7000F90032400F900B28047000000000000034 +:109B80006841A400F9003C408F9203E400F9003ED4 +:109B9000400F9C03E400F900BA402F9023A400F981 +:109BA00008BE40CF9003E410F1013E410F9003DA6C +:109BB00000600000000000002810A0C8F8003E036C +:109BC0000C8403A110E80032008C8583E000C00003 +:109BD000380C2C00036000C8003C000D80022010EF +:109BE000C820B2020F8003CA042000000000000059 +:109BF00028053910BE046FA008A0023A008200A216 +:109C0000808DEC03A8008A00238008A02228008E03 +:109C1000CC2F8008E8C2B8008E6023900BA002CA47 +:109C2000004000000000000028054E08B0722CD053 +:109C300028B0068C01A10220C0083802CC008300A5 +:109C400020C02930024C0081002CC00832020C4098 +:109C5000830020F40B3002CA005000000000000016 +:109C6000A0011C00B4002DD048F2021E2185202046 +:109C7000E80972028E808F0120C00972020E80876F +:109C8000002DCC1858028E00850021C00B7202E80E +:109C90000040000000000000A8081E00B4802DE075 +:109CA0000C78839A00EDD031F40C6A03DE82C78011 +:109CB00039E00DF8835EC2C5803DE80C68031200F0 +:109CC000CF8031E00F7E83EA020000000000000038 +:109CD000080DAC08F8003CC00FB303EC00F9023EDD +:109CE000C80FB003ED40FB00BE800EB303EDC0FB18 +:109CF000003ED22E8003EC02F9003EC00FB003C23A +:109D00000660000000000000C005FE00F09133E096 +:109D10008FF803FE00FD803FE00C78833F00CF808A +:109D20003FA00CF8033E00CD803FE00FF813FE107B +:109D3000FF803F200FF943D00070000000000000BA +:109D4000A8119C00B4C131C00B7002D410E5202FC3 +:109D5000C80F40035C0087002D800870021C4087FC +:109D6000102DC00B7602DC80B7002DC00B7002EA0C +:109D7000046000000000000010009C00B62221D00A +:109D80000B7082D840B5022DC08865020C00871880 +:109D90002C040830028C0285002DC00B70469010F8 +:109DA000B6002D000B7022C400200000000000004F +:109DB0006014CC08B200A4C00B3042C610A1002C25 +:109DC000C00A00024C0083002C080830028C00837B +:109DD000002CC00B1882C400B0002C400B3012D8ED +:109DE0000430000000000000F815AC0038003250CC +:109DF0000FF003E620FD003FC008D0023C02CB80FC +:109E00003C502CF00ABC00C9003FC00FBE03AC00A0 +:109E1000FA022EF74FF003EE04600000000000008D +:109E20008000EC00F1003AF00FB003E900F9013EC8 +:109E3000C00F9013EC00F9003E550FB0016C00FB11 +:109E4000023EC00F9073E000F8413E000F3001E089 +:109E500000300000000000000010FC00FC0033C0D7 +:109E60001FF013F008FD023FC08DC0033C00CFA0DF +:109E70003F800C70033C10FC0037C00FE003B000C3 +:109E8000FE003FC00CF0030404300000000000009E +:109E900084046E00B9C2A2F00BB042EB00B9002EF0 +:109EA000C00F18036C00D9812EB00AB0422C00BA42 +:109EB000C62EC00B8C02E300B8C03CA00DB002203F +:109EC000001000000000000080052F00B88022E292 +:109ED0000BB002E620B9002CC008B8020C008B00C1 +:109EE0002E3048B0022C00B9C02EC10B8802EE10F3 +:109EF000B9C02E2019B00220004000000000000070 +:109F000008040C00B00020C00B3006C00091002CEB +:109F1000C04980024C0491002C008A300A0C04B124 +:109F2000002CC01B00124910B1002E200930020283 +:109F30000100000000000000000D6C00B82022C0ED +:109F40008BF003E008FD003FC00CA0033C00CB00F9 +:109F50003E004CF00A3C00B90037C10FA003E000FE +:109F6000FA003E000DF00B0003500000000000005E +:109F7000A01DF001FC403F804FF002F000FD003FCB +:109F8000C10FC003FC00FD003F004FF063FC00FD6B +:109F9000043FC00FC003F080FC007B000FF043E8DB +:109FA0000670000000000000C005F800C81033046F +:109FB0000C40023400C8851FC02DD903FCC0DB282B +:109FC00037640FDB033E00FF253FC80EF203FE207F +:109FD000FFA437C40CC80330047000000000000068 +:109FE0008010E80088202200088812260489822E2A +:109FF000F448B802FCC498C2227C4B9D422608BF9C +:10A000001877E408F182EF00BBD022D80890836073 +:10A0100002300000000000008845C804A0002400B1 +:10A020000A00020C0082042CE0081002CC8083009D +:10A0300024000B1006C801B3202CC0293202C80826 +:10A04000B10024D00882026201700000000000000C +:10A05000C015A800A80C26000A80022C148A026EE3 +:10A06000E008B0024C08A80026200B9C02E400BBCC +:10A070000422C019B002E801BB1102C0889002F0AE +:10A0800000600000000000000015EC02EA40B6602D +:10A090002E980B2002C8023EC00D9803EC02DB880C +:10A0A000B6210F8803AC08FB002CC00EB043E5803E +:10A0B000F06036C00C01434804700000000000004E +:10A0C000E001BC00D6013B6485D903F00CFF003EE3 +:10A0D000C10FFC21EC00D7903B400F50033C00FF28 +:10A0E000003FC08EF003F440FD883FC02FD00278BF +:10A0F000006000000000000040108C00DA403C408E +:10A100000F10034800F9223CC20E9083EC02DB04DE +:10A110003A080F8487E800CB003EC40EB003ED0080 +:10A12000E8423AC00F800B1004200000000000003D +:10A1300088052C088A002E428B90022818BB4922E1 +:10A14000D038BC82FC00E8022262CB9C00EF60DFCA +:10A15000002FC00BF002EC00094037C00B90023218 +:10A160000040000000000000E005481011002CA095 +:10A170000B2002440090C06434283402CC00938445 +:10A1800028400B0800CE0093002CC20A3002C00009 +:10A19000B24022C00B20023000000000000000008E +:10A1A00070011A4085802DA00B68061680BD902591 +:10A1B00024187B42DE40A08021E00B6802D6009785 +:10A1C000902DE00B7802CE4092806DE40B7802086F +:10A1D000000000000000000048082800D1803C88F2 +:10A1E0000B22034E80F2A13C242A3903CC40D3AC8D +:10A1F00038C50F3082C800D3003CC00E3013C000F9 +:10A20000F10038C00FA0031A060000000000000093 +:10A21000401DB810FD343E800FE003EE0072003A9E +:10A22000000FB063EC40F8223EC00FF003D440FFB3 +:10A23000003FD20FF003EC00CF0037C00FF003D087 +:10A240000620000000000000A805EE00EB0036E04C +:10A250000DB0032000F08033C008B8032C80CB0081 +:10A2600032800FA0136E08CB2832E00DB483E200D9 +:10A27000CA003EE00CA803020070000000000000CD +:10A28000C8118C04830021C04870021000B702215D +:10A29000C04A70020D48D40035C00E6002DC00A731 +:10A2A0004029C0097202D410A6022FC808700212F9 +:10A2B000006000000000000080009E00A78020E0F9 +:10A2C0000A38021A00B58021E008F8225C818380F8 +:10A2D00021A10B78825A1083A020E80A7B02DA00C1 +:10A2E00097C02DE408E802080020000000000000EC +:10A2F0000814CC00831020C00A30020808B3702074 +:10A30000F80A30424C04931426C40A3802CC00A345 +:10A310000028C0AA3002CE40B3882CC028300A12D0 +:10A320000430000000000000E815A900EA80B690A3 +:10A330002F240B3904BEC033920CA00B6818CEC07A +:10A3400033800FE9437800CA0032800FA013F84829 +:10A35000DE003E800CE0023A002000000000000019 +:10A360004800E024F8003E120D8093B028F800BCAD +:10A37000000F8403A000F0003E020E8000E000F811 +:10A38000013E000D8003E000E8003E000F8003D294 +:10A3900004200000000000000810E400F900B27082 +:10A3A0000F90010400C9003E400C9803E404E90842 +:10A3B0003A480C9A03E400F90036400B100B268053 +:10A3C000F18032400F9003C2042000000000000022 +:10A3D00080046400B90022610B9002240889002ED9 +:10A3E000400D9A02E408A90022780D9406E410B901 +:10A3F0000022500B90022580B98036400B9002E07D +:10A40000000000000000000018052400B5002342F1 +:10A410000BD00EB40089042E60089102C404B90464 +:10A420002AC0089402E410B10026420A90022400D7 +:10A43000B92162400B9002C60040000000000000FD +:10A4400008040500B54021504B5006940281002CB1 +:10A4500060291406C500A1222051891402C400B14C +:10A460002020480B14020401B10004500B1002C25A +:10A470000100000000000000B80D6008B8003200C4 +:10A480008F8003B00088003E000C8003E000E804E9 +:10A490003A000C8002E000F85036000F80032004E0 +:10A4A000F80112004F8007EE075000000000000086 +:10A4B000981DE510F9403E500F94026501FD013DE5 +:10A4C000504F5013E500FD101F5007D443D400F93E +:10A4D000101E440F9403D500FD403E500F5283EEF2 +:10A4E00006700000000000001815E440F9603F44C9 +:10A4F0000FD0C3E430F9013E420CD003E780DDA069 +:10A5000033400CD003FC00C9903F681E9103340017 +:10A51000FD003E680C94030E007000000000000077 +:10A520003910E000B8422E090B8402E104BE002E6F +:10A5300010088022C280884022000A8002E000A821 +:10A54000D02E104B8A036000BA002E30088A028693 +:10A5500000300000000000004005C580B1606CD0F4 +:10A560000B1000DC0CB5002C41081002C5809110C6 +:10A5700068C0083002E40C81222C5008104204000C +:10A58000A1002C5A28900252102000000000000068 +:10A590001815A400B9002E410B9012F480BF002EB4 +:10A5A00040089002E400A96060420A9412E500A904 +:10A5B000002E400B90026420B9000E40099002C6A4 +:10A5C0000420000000000000A005E400F9003E4166 +:10A5D0000F9023E400F9003E400C9003E404D1C046 +:10A5E000BA700C9803C400C9003E400E9003254089 +:10A5F000E9403E400C10036800200000000000000D +:10A600006801A414F9003E400F9023E408F9A03C2F +:10A61000C22F9003C400D9803E700F9143E400F92B +:10A62000003E401F9013E620F9A03C404E90039A54 +:10A6300004200000000000002800A000F8003E02F6 +:10A640000F8013200CFC013E000C8003E000C8507A +:10A6500032000F800B2008F80032002C8043E040CD +:10A66000F8023A008F80030A042000000000000076 +:10A67000A88528083A000F804BA1022800BA822E34 +:10A680008848E402E800AE90A3900BE0003800BADE +:10A690000037A008A002F8009EE022800BA0234211 +:10A6A000000000000000000028054C1033002CD0F2 +:10A6B0000B14020C00B2912CD0083E024C008340D7 +:10A6C00024C20B36008C00B30020C009B002CE00BB +:10A6D000B3CC68C00B300202005000000000000044 +:10A6E000E0011C88B7252DC08B581A1C08B6002D18 +:10A6F000C0087402DC40A50025C01B78029408B78E +:10A700008025E30A7102DC00978321C88BF102489F +:10A710000060000000000000A8081F00F7E27DE0D4 +:10A720000F58431E18F6807CE02C68025E90C380B0 +:10A7300035E00FF8039E04FFA120A10D7803D60099 +:10A74000F78039F80F78030A0600000000000000C7 +:10A75000481DAC00FB407F410F1003EC04FA003EA3 +:10A76000D00FA003ED00E9002A000FB0036400FB46 +:10A77000403EC00DB003E400D30036C00F3803C222 +:10A7800006600000000000004005FE48CFC03360B6 +:10A790008CC843D600CC943FB00DF8037F00DF8017 +:10A7A0003F600FD803DE00CFCA3D600CF8133A4477 +:10A7B000DD803FE00FF8431800200000000000009B +:10A7C000A8119C008F1133C0484112C44884112C39 +:10A7D000EC2ABA033C40D7482D410B6002D400D785 +:10A7E000013DC00DF0035A0084182DC00B70036AA0 +:10A7F000002000000000000000408C08870021407D +:10A80000094002D400A4922DC80962825C0087002E +:10A810002DC00B5002FC0087002D040870021C8024 +:10A82000B5002DC00BF00200002000000000000069 +:10A830006010CC0083002040090022C700A0412CFA +:10A84000C14B08022C0093402C7C0B3802C720938C +:10A85000002CC00930024F84B0802CC00B32105045 +:10A860000420000000000000AA15BC02CF00B24086 +:10A870000D1003E824EBC13EC02D98137C0AC2439F +:10A880003EB00FA903E920CF003EC08CF0030D209D +:10A89000FAC03FC00F74012A0060000000000000F1 +:10A8A0008000EC00FB023A408E9003E8145B503CC1 +:10A8B000504E8403EC00F8403E80078103EC08F31F +:10A8C000003AC09F3003EC00CB203EC00FB023E81D +:10A8D00004300000000000000190FC00FF003F4039 +:10A8E0000FD0033820CF0832C10ED003FC00FE0881 +:10A8F00031E50EE4033A00FF0033800FF02B240013 +:10A90000CCA03FC00FF00300443000000000000066 +:10A9100080046C00BB003A690B906E0800834136DE +:10A9200040C888C6EC00884036800DA8036E50BB36 +:10A930000036C00BB0022400D9082EC00BB003E0D3 +:10A94000401000000000000080052C00BB002E60BD +:10A95000038002200089012258089822EC01AB00F4 +:10A9600022000A10022800BB0022400BB00228007F +:10A970008A002EC00BB042200050000000000000F2 +:10A9800008040C00B30028408B0002024089012417 +:10A99000D2281002CC00831024200808024E00B3F5 +:10A9A00004A0C00B3002088892002CC00BB002C279 +:10A9B0000000000000000000000D6C00FF003E00E1 +:10A9C0000F80022010895022D82E9622FC00EB40E6 +:10A9D00032C00A90032800FF0022000FB0032CA011 +:10A9E000C8003EC00FB003000610000000000000C9 +:10A9F000A019FC00FF0C3B000FC0027090FD003E50 +:10AA0000C90F96C3FC00FF003FC00FF003FC04FF1A +:10AA1000043FC00FF003EC00FC003FC00F7003E8E0 +:10AA20000670000000000000C005DC80FB283F002D +:10AA30000CC10BF102ED0037302CF103B240FF00E6 +:10AA4000BBC00F4806B200FC803BCC0CF00370800A +:10AA5000DF2833040FF40330007000000000000012 +:10AA60008010FF40BF602E210882022000A9282A02 +:10AA70000009FA022000BF5123D8099802E430B03F +:10AA80000023D008F5A225A48F423C100BB00A2069 +:10AA900004300000000000008805CC00B3082C0042 +:10AAA00028001AC084200024C84B3142C000930201 +:10AAB00020C6080006C081B3002CD8093202A0408D +:10AAC0009301244C0B3202220170000000000000B0 +:10AAD000C011AC00BB022E0A0880826000A8002EC4 +:10AAE000E01BB00262013B0022C1099002E200BB00 +:10AAF0006026C108B02A26009B042E210BB002302C +:10AB000004600000000000004011EC10FB003E104B +:10AB1000088413EC02A90436200FB003EE80FB007A +:10AB20003AC00CA003A28079401EC08CB0636A10AA +:10AB3000D30036A207B0030004700000000000003C +:10AB4000E001BC00FF003E204D41039C00FD20AB16 +:10AB5000000CF003B800F7003FC04DC903F400FF3C +:10AB6000003BC02EF000F000EF003F004B7003F8F8 +:10AB700000600000000000004010AC80EB007E1080 +:10AB80002E8403EC00E00032500FB0862500DB205D +:10AB90003AC00DB063E110FB4838C10F30032C04FC +:10ABA000FB0832C00CB00B90042000000000000035 +:10ABB000C8053C008F006429288003EC02E804A843 +:10ABC0005608FC07E0000FA0BFC00B9502A000BB19 +:10ABD0000537C089F00A0DC8BF082A8008F0023284 +:10ABE0000040000000000000E0054C01B30224E03A +:10ABF0000A30128003A300A80002B822C000B300EC +:10AC000028C10B04020800B94028C00B300203041D +:10AC1000B34420004A300238005000000000000019 +:10AC200020011E2017A065EC083802C241B3922B08 +:10AC3000640A38023601B7902DE003F8009A00B597 +:10AC4000802DE08978121E00B78029E00A7802087A +:10AC5000004000000000000048080C0073B024C849 +:10AC60004E300A8002E20038940E31A2C800730010 +:10AC700018C40500030000F30038C007B10300004A +:10AC8000F30130410EB0039202000000000000000A +:10AC9000401DBD00EF1026C803B103E000EA817833 +:10ACA000C50CB5E3DC00C3003EC10FF083B000FF6C +:10ACB0000037C00DF403E400F7003F400DF003D06F +:10ACC0000660000000000000A805ED10CB283EC083 +:10ACD0000DB013AC10FB003A8004B403AC00FB04CD +:10ACE0003EC00FA4B3E000FB8032C00FB003E80009 +:10ACF000FB48B2800FB043EA007000000000000083 +:10AD000048119C02874438C08D30024C00FF00215E +:10AD1000C00870039C00B35021D44E6202D000BF23 +:10AD20000035D4097022D800BF2221C00B7202D294 +:10AD30000460000000000000C0009E4087802DE0FD +:10AD4000097802DE00B68029A1287A32DE0037A019 +:10AD500025E0097806D200B78021E80B7902DE00F1 +:10AD6000B79021E00B7902F0002000000000000005 +:10AD70004814CC04830128C089B00A4F00B20020D7 +:10AD8000C4883016CF00BB0420C10A3206C200B30B +:10AD90000024C0093042EF10B30020C00B3002D2B3 +:10ADA0000430000000000000E815A8004A003E80C2 +:10ADB0002DA00BAA80FE002B800CA043FB30FA00D4 +:10ADC0003E800FA083FA04FE1822800FA003FA84AD +:10ADD000F20033A20FA003F20460000000000000A4 +:10ADE0004800E000F0003E002F8003A020FC023E5F +:10ADF000001F8403A000F8403E004F8001E040F8AF +:10AE0000403E000D8013E000F8003E000F8003D2AA +:10AE100000300000000000000810C600D9003640D5 +:10AE20000F900B0400C90036686C9403E420B990BD +:10AE300036400C9403E40029803E400F9003242008 +:10AE4000C90036400F9003C204300000000000002B +:10AE500080046650890020500890022409D90020FF +:10AE600048489006E40499A022400DB822640009E5 +:10AE70005032400B9002279089402A400B9002E00C +:10AE80000010000000000000180124009900664234 +:10AE90000AD0123400850026404A9002E401B9012C +:10AEA0002440589012C40029402E400B100A2480E0 +:10AEB000890526410B9002C60040000000000000FA +:10AEC00008040480812061480852021481952020E2 +:10AED000400A3602C400B12000484110424401A19A +:10AEE0000024480B12120480812028480B1202CA49 +:10AEF0000100000000000000B80D6000D8503600CE +:10AF00000E852321428C5434140E8002E140F85007 +:10AF10003614048003E144E8507E150F8503214276 +:10AF20004A0036140F8003EE0350000000000000BA +:10AF3000981DC440F9101E444E9103E440F9103F9F +:10AF4000C00D9103F400D9143E440F90037400DD4A +:10AF5000007A440F9103F440F9383F440F9383E79C +:10AF600006700000000000001801F680F9A43F6898 +:10AF70000E9E436780D9E43F410FD8430400EDC0E3 +:10AF800036400C9003E400D54032400C9003F400AE +:10AF9000DD0032402C9A03C60130000000000000A2 +:10AFA0003810E000E8C02E144D8F2223C0F8F0AA1C +:10AFB000000C8003A2A0D8822200088002E800D8FA +:10AFC000802A00088002E80888A83600488A82CED5 +:10AFD00004300000000000000805C500B1482E4004 +:10AFE0000A122244009104A4410A940624009142CA +:10AFF0002441091002E40191202440091002C401F7 +:10B0000091002C40091402C2013000000000000031 +:10B010001815A400A9002E404810022400B940AA27 +:10B020004018B002E40899002240199046E4809943 +:10B03000042E40099002E40199042650099002C6AA +:10B040000460000000000000A011E400F9063C408C +:10B050000A90036402D900B6500E90232601F9002D +:10B060003640299483E400D94836400D9003C70048 +:10B07000D1073A50CD9003E8042000000000000002 +:10B080002801A408E9003E408F9003C408F1003A6B +:10B09000688F9003A441F900BE400E9003E400F9CC +:10B0A000C038402E9003E640E9003E68069003CA8F +:10B0B00000200000000000002810A000D8053E007D +:10B0C00007800B2000E8403E100D82036000C8009E +:10B0D000B2008D8303E000D8503A001E8003E124C3 +:10B0E000F800B2000F8003020420000000000000FE +:10B0F000280538008A042F846AA00BE8088E003DDA +:10B100008088EC036810A601368008A800C8108E5D +:10B1100010228008A002FB20BE512A800BA00282D0 +:10B1200000000000000000002805412193002CF0E1 +:10B130003930060C00A300280828BC022C008380AC +:10B140002AC0083000CC009A8028C00A3002CD0006 +:10B15000B30462C10B30020A00500000000000007E +:10B16000A0011E0407112CD00A3222DCC187006D19 +:10B17000D00834027C00A70824C8087002DC800FC5 +:10B180000021C4087306DC00B20061C80B3A0288D3 +:10B190000440000000000000A8080A0057812DA00C +:10B1A0002D7C023E82E3E03BE00C78031E20C7804A +:10B1B000B9E82C7803FF80D6803BEC027A03DE00EE +:10B1C000F78131EC8F7C030A0200000000000000D0 +:10B1D000081DAC00FB001E8023B683EDA0DB643E9F +:10B1E000C00EB003EDC0F2003ED40AB003EC30EE66 +:10B1F000643EC007B0C3E800FB013EC80FB803C2FD +:10B2000004600000000000000005F600EF803BE055 +:10B210000FF8637E04CFC0B7200EF803FC00C78090 +:10B2200033F00CCC03FE08F7C133E04FF803B24013 +:10B23000FFA031E60CF803100470000000000000CD +:10B24000A8119C00EF0221402D70021C00F710296C +:10B2500040087022FCC0A7003DC0084002DC00B7D7 +:10B260004021C00B7002DA80B72429C648F0022AB8 +:10B27000066000000000000000009C00A700288479 +:10B280000B30020C00930025800A6102DC01A7103C +:10B2900024C0084082DC009F0025C40B7002942566 +:10B2A000B73223C41B700200002000000000000021 +:10B2B0002014CC0CA300200029300A0C00A3006C41 +:10B2C00000081042CD10AA00ACC0000402CD00BBA3 +:10B2D0001024C0033042C309B3002CD00A30021836 +:10B2E0000030000000000000A8158000EF003A4088 +:10B2F00007F0433C009FC0B6140E8006FC01CB0152 +:10B3000037C0ACB402FC00D90137C04BF013AE0813 +:10B31000FB0033D02EF00B2A00600000000000007C +:10B320008000EC00FB053E400F3003AC14FBA03A5C +:10B33000C00F8443EC01F9403EC00FA203EC21F999 +:10B34000003AC00FB003E420F000BAC00DB003E033 +:10B3500000300000000000000110F800D70135683F +:10B360006DF0033C01E70033C00DC003FC24CF02A5 +:10B3700037C00DD202FC00DF0133C05E70331C18F1 +:10B38000CF4131C20CF0034040300000000000000B +:10B3900081006C008B0022522AB0036C00AB0028A5 +:10B3A000C00A8C02EC108BE022C00F8002CC008B14 +:10B3B0008022C008B0022A10D98022C0C8B002E0A2 +:10B3C0004010000000000000800524019B00268042 +:10B3D00029B0620C00AB016A00089802CC009B8384 +:10B3E0002EC0CBB412EC038B8028C00AB006A2009A +:10B3F0008B0262C008B002E00050000000000000B4 +:10B4000008040C01831420000A30024C0083002A37 +:10B41000400A1000CC02930028C00A2002EC00036E +:10B420000020C00830160080910060C0083002C2C1 +:10B430000100000000000000000D6C00DB00368001 +:10B440002DF0033C00AF003A800D8003FC005B0050 +:10B4500037C0099003FC00DF0033C00AF003A420CA +:10B46000CB00B3C08CB0034002100000000000000D +:10B47000A01DFC04FF200F0027F003FC00FF002D9F +:10B48000000BD027FC00EF0037C00FC043FC00FFCB +:10B49000003FC00DF00BE000F5003FC01FF003E8D7 +:10B4A0000730000000000000C001F4C0FC227FC093 +:10B4B0000CD0433600C48134C01C8907F280CF8091 +:10B4C00033600F79033CE0CF0833480DC403F050DC +:10B4D000DC9037CC0FF803F0007000000000000093 +:10B4E0008010E990B8807EE488990A2608A9802215 +:10B4F000F42C9903A702898022340B9A037D00DF84 +:10B50000482B60080502E500822022C48BB002E0CF +:10B5100006300000000000008805C500B0102CC0F7 +:10B520002A0002A408A804E0800B0002C441B2046F +:10B53000A40A0BB0028C81832060509812128B8079 +:10B5400089002CC80B3002E20170000000000000EE +:10B55000C011AC20BB022AC00A8802A408A980A29C +:10B56000E11B9C22E600B84026300B9002CC0193F0 +:10B57000042A40399882EC148B652AC00BB202F879 +:10B5800000600000000000004015E700B8482E00F1 +:10B590000E88438400E3C136E80F9C12E280F3C0BA +:10B5A00036705FA823AC01CB0422404D8403E20037 +:10B5B000D8003EC00F9003D00470000000000000CF +:10B5C000E001B309FE103E810DC003740CFF003D85 +:10B5D000C18CD0831400CD203A400DCA017C00FFFD +:10B5E000001F400EC023F246FE8437C00FD803F878 +:10B5F00000600000000000004010AC00DD023D4093 +:10B600000E9003AC00EB483ED00C8063A208CA0049 +:10B6100032080CB003AC08EB003E400CD483582039 +:10B62000F94232C00CB003D004200000000000003A +:10B63000C8052802DB002EE0283A022E00DB6076E7 +:10B64000E00D8C02E000880236586815837C08BF44 +:10B65000002D60089002A900B30523C008B002F2D3 +:10B660000040000000000000E0054C1080000CC10C +:10B67000081C82060093C020F60A200208009300EE +:10B680002460093C020C0083002C60090112004078 +:10B69000B000E0C0083002700010000000000000A0 +:10B6A00020410A4086812DE058180A16A09780256F +:10B6B000E9197882D600978025A019F8025E00B7B4 +:10B6C000802D602848129600B48021E0287802C8B6 +:10B6D000041000000000000048080C0081303CC24B +:10B6E0000E00028400E34028E84C29030C00D3003C +:10B6F00034C40D31038C08E3003C460C2003008069 +:10B70000F20032C00C3003D2021000000000000032 +:10B710004019B800FF102FC00FC023C4807F103E17 +:10B72000C00FB103DC00E7003F8006F143FC00FFDF +:10B73000087D500EE123B408FE103FC40FF003D083 +:10B740000460000000000000A805E402CC003E00F8 +:10B750002CC0030401CB0033602C9013E80073006D +:10B76000B2C10FA003EC80FB283E541FD003FE02A1 +:10B77000C98032C00FB003CA007000000000000092 +:10B780004811800086002D800820021408870029B7 +:10B7900040087002DC00B70021C00B60025CA0977B +:10B7A000202D480B5002DC108D0021C80B7002D2F6 +:10B7B0000660000000000000C0009F0085812C6032 +:10B7C000185802DE20B78228605A7852DE10BF80F7 +:10B7D00021E04B7806DE40B7A02D699B7812CE00A1 +:10B7E0008780E1E40B7802C0002000000000000028 +:10B7F0004814EE0083002CC20836028C0883F068DF +:10B80000400A3E02CD40B30020E00B32064C009BC4 +:10B81000000C400B3002CD80830820C00BB102DA4F +:10B820000030000000000000E815B800CE083FB06E +:10B830000CE423DA02DE40BBB20EE243FA00FE0063 +:10B8400033900BE003E800FA003E810BE013F908A7 +:10B85000CE4032800FA803FA047000000000000000 +:10B860004800E02498083C040F000B6000F8402ECC +:10B87000030D8003E000F8003E060B8003E000D8D3 +:10B88000003C00038C23E100F8007E000F8003D20F +:10B8900000600000000000000810E402C9003E4003 +:10B8A0008C90032500E98032440F9402E420F900D3 +:10B8B00032700F9A43E400F90032400C1033241028 +:10B8C000F9013E400F900302042000000000000038 +:10B8D0008004640089822E40289002248281C0A2C4 +:10B8E000700B9C02E4003142A2600B9482E400B928 +:10B8F000002A400894A22500B9002E400B900A208F +:10B9000000100000000000001805240089642E408B +:10B91000089042A400896022420B9002E600B980A0 +:10B9200022400B9002A404B9002240289002240473 +:10B93000B9002E400B90020E0040000000000000F5 +:10B940000804058081002CC1481002A40281002057 +:10B9500040833402C400BB0020D00B1402C480B169 +:10B9600020A06818141A0D00B1402C500B10020AC8 +:10B970000500000000000000B80D6000C8003E0097 +:10B980008C800BA004E8003200078003E000F80080 +:10B9900032001F8003A140F85032000C80032000C9 +:10B9A000F8003E000F80032E03500000000000004E +:10B9B000981DF446FD403F5023D4137404F5023F14 +:10B9C000500FD403FD00BD002F500FD003E440F909 +:10B9D000103F440FD403F508FD063E500FD283E616 +:10B9E00004700000000000001805E640ED043E4829 +:10B9F0000CB283F400C10032408CD0033400FD004F +:10BA000037400FD003E620F9883D620CD803FE24AE +:10BA1000C1003E780FD00306007000000000000057 +:10BA20003810E10088402E1008C423A00888062A98 +:10BA3000140880036004B80022000B8002E200B802 +:10BA4000802E00088C02E38088022E380B88020EBC +:10BA500006300000000000000805C580A1C02D7060 +:10BA6000085042C400A90020E02A100A0410B100C6 +:10BA700024404B1006C420B1086E400B1682C4202F +:10BA800081002C500B928252002000000000000028 +:10BA90001811A400A9012E4028D020A404A9002A2E +:10BAA000401AB0122400B90C22420B9402E400B9EF +:10BAB000006E400B9602E41189206E400B90024606 +:10BAC0000020000000000000A015E4C0A9C03E5006 +:10BAD000089C83E402E900B2402A92122640F94011 +:10BAE00036700F9403E404F9013C400F9803E6021A +:10BAF000C9223E400F1002680470000000000000E0 +:10BB000028018604D9401C400F9223A4B0DB043CDA +:10BB1000C00D9A03E400F9003E440F9003E400F9DD +:10BB2000003E422C9023E480F9003E408F92039225 +:10BB300000600000000000002810A100C8203200B2 +:10BB40004CC08B2002C83132202D8403E104F84818 +:10BB5000BA000F8903E000C80032000D81132010E5 +:10BB6000F8003A000F8123020420000000000000CA +:10BB7000280528000E40228028A40219005280A225 +:10BB8000804DED82E800B64223BD0BE802E804DAFE +:10BB900000378008E0023A20BA0022800BA80A0A87 +:10BBA000004000000000000028054C00838060C0B9 +:10BBB0000829020D00924024C008B402CC00B30052 +:10BBC00068E01B3002CC00930124C06938026C008D +:10BBD000B3002CC00B30020A00500000000000002F +:10BBE000A0011C4083C020400828069C189C022409 +:10BBF000C0097002D400B70021C00B7002CE40977C +:10BC0000B0254008781A5800BFA265C80B780220FA +:10BC10000440000000000000A8080E028780B1A0C8 +:10BC20000C68031A08D69235E4287842D610F580BD +:10BC300039A00F7823DE30D3A235A04DE8035E0093 +:10BC4000F7D03DF80FF003220200000000000000D2 +:10BC5000081DAC00FB043E000BA0034804FA413A67 +:10BC6000500FB003E400F1003EC00FB003ED88FBBD +:10BC70004D3E000FF003BC08FB203AC00FB003C2DA +:10BC800004600000000000000005FE00DC80B3E05E +:10BC90000CD803CE00C8A031A08DE903BE00B2804D +:10BCA00033E00CE8437E040F8131E40CD803F60046 +:10BCB000FF803FE00FF803000420000000000000B8 +:10BCC000A8119C00B4403540085082DE80D49021F9 +:10BCD000E00D5102D440B6B02B900EE5029C40D747 +:10BCE00022195C0D7002D800B7202DC00BF0036A3A +:10BCF000042000000000000000009C009310218040 +:10BD0000085802DCC0940023D00870A0D420B502EB +:10BD100029800960820C00870225C0194002D400E6 +:10BD2000B7006DC00B700200002000000000000092 +:10BD30002014EC00B3C02001481802CC028144A0BA +:10BD4000C0893802C780B1002C094A0062AC09934F +:10BD5000012840193002CD10B3902CC00B3002C81E +:10BD60000420000000000000A815BC20DB6222E0D7 +:10BD70006CA003E400980032C0EC9823AE08FB08E6 +:10BD80003A780990037C10CF0026400CB003EC00F9 +:10BD9000FF803FC00F90032A0460000000000000F5 +:10BDA0008000EC20FB483C610FA043ED00F8243EEE +:10BDB000500F9083E400FB003A500F8043EC08FBE7 +:10BDC000003E400F4003F000FB003EC10F900360B7 +:10BDD00000300000000000000110FC00DDA03280F7 +:10BDE0000CE001FC00DC9139C03C40033400FF80D2 +:10BDF0003F000FD007FC00CB003D400CE003382093 +:10BE0000CF023DC00CD00308443000000000000009 +:10BE100081046C000140220028A002CE86836422A7 +:10BE2000F4088C0F6400BB102E600B9C03AC01DB8C +:10BE3000003E60088F0223408B003AC00D1043681B +:10BE4000401000000000000080052C009900A2C0F6 +:10BE5000089002A607980002C24888022C00BA0285 +:10BE60006E600A9802EC008B012E600890020500BB +:10BE70008B002EC008B1022000400000000000002E +:10BE800008040C1081002040281026CC808020A0BF +:10BE9000CC1814420400B2206C400B00028C0083CA +:10BEA0000028402800020000830028C009B0024298 +:10BEB0000500000000000000000D6C00D900228089 +:10BEC0000C9003AC80DA292AD22880022400FB20BF +:10BED0003E000F9002FC008F002E400C800B2002D1 +:10BEE000CF003EC00CB00300035000000000000073 +:10BEF000A01DFC00FD003F000FD063FC49F5003E93 +:10BF0000C00BC001F4007F403F401FD003BC00FFC6 +:10BF1000003F400FC003F000FF003BC00FF003E8FC +:10BF20000470000000000000C001F240ECA03FE0FF +:10BF30000D48037D80F480336C0EC8033200DD9021 +:10BF40003BA02DF003FCC0FF003BE08EF0033C045F +:10BF5000EC6031000CF003B0007000000000000045 +:10BF60008010EC00D9C12EE10D88023C80F88036AB +:10BF70007D18A00228B0EA202220087702FD50BBDD +:10BF80008022400BF4423D808831221208F602E004 +:10BF900004300000000000008805CC0080112EC194 +:10BFA0000800024D80B80020000A0282000099209B +:10BFB00022C0093082CC00B30028CA0B34820D2085 +:10BFC0008000A08C083482A20170000000000000F4 +:10BFD000C015AC4099802EC20994022C00A980267D +:10BFE000600838422220BA4162463BB002EC01BBF5 +:10BFF0008022400BB0460C1888C0222208B006F000 +:10C0000004600000000000004015CC00C9813CC164 +:10C010000CA9236C00B28032780A8A0B26009901A1 +:10C0200030E00DB003EC00B9003AC01EB0032C00A4 +:10C03000CB8032610CB0139004700000000000004F +:10C04000E001BC10DD003FC20FE803AC00FE003D84 +:10C05000400FC043F810EF14B7E00CF003FC00F5FC +:10C06000023F444FB04BFC02D4043D402FF003F894 +:10C0700000600000000000004010AC00F9083E60C5 +:10C080000DA003AC00E85032000C8403A500E900C9 +:10C090003AD80FB0032C00F9003AC00F30032C003F +:10C0A000CB443ED40EB003D00420000000000000BA +:10C0B000C8052C08B9802EC00A30423C008904769D +:10C0C000600890622000820422D008F0437C00BB0C +:10C0D0008222400BF0423C008AC02EC108F002F2DE +:10C0E0000040000000000000E0054C10B2D02CC061 +:10C0F0002918028C04A100249C0810028000A101D0 +:10C100000CC12B30528C04B30128404B30024C0040 +:10C1100090202C200A3002F800500000000000009F +:10C1200020411E00B7A225E88A68021E00858025EE +:10C130008088E8023E0085802FE4287802DE00B780 +:10C140008061E00378025E82B7822DE0087802C841 +:10C15000004000000000000048080D00F0103C8086 +:10C160000D10838C00E25026040C11038840EB0074 +:10C170003CC40F30038C00F30838400730036E4096 +:10C18000D0083C880E3043D20200000000000000BE +:10C19000401DBC00FB343CC94EB023ED20FB043FE6 +:10C1A000C88F70534C00EB1031C50EF4036D00F3D3 +:10C1B000003FC00FF40BBC00CD003FC00FF483D094 +:10C1C0000660000000000000A805CE04C904B0C14C +:10C1D0000F98136C90CB023EC04FB063E400F18027 +:10C1E00012C00CB503ECC0CF8332400FB3232DA493 +:10C1F000FB003E000FB4032A0070000000000000A6 +:10C2000048119C00870021C02D60021C00D7003916 +:10C21000C00B6002DC00B50021C02A7012CC808700 +:10C220000035C00B72521C00B7002D410B320212B8 +:10C230000460000000000000C000BE0081C0232098 +:10C240000BD8025E0006C02DA00B7C12DE08BF805A +:10C25000A1E22A7A02DE00938025600B781E5E50F0 +:10C26000B7802DA00B7802300020000000000000F5 +:10C270004814CE00836020C00931022C00930028AE +:10C28000C01BB006CC80B34820F00A3002EC00930B +:10C290008024C00BB0024C10B3C82CD28B300212D9 +:10C2A0000430000000000000E815BB00C6C4318166 +:10C2B0000FE0036800CE803FA20BE803F900FE40C8 +:10C2C00031806EA007E800DA0026810FA002680125 +:10C2D000F6E03D920FA0033A046000000000000069 +:10C2E0004800E0C2F8043E140F8013E010F8013E4D +:10C2F000100F8043E000B8003E00478003E002E8F2 +:10C30000103E000F8007A000F8002E000F800BD217 +:10C3100000300000000000000810E400F901324085 +:10C320008C9003E400C90036420F9003A400C900BA +:10C330003E420D90036400D9003E400F900B640014 +:10C34000F99032410C90030204300000000000001C +:10C3500080046400B9C8A2600A9202E40089402EF9 +:10C36000580B90020400D9002E42089002E4048980 +:10C37000002E400B90062404B9082A404890122051 +:10C38000001000000000000018052400B91022442D +:10C39000089002E400890022458B9002A4008900E5 +:10C3A0002A40099002E40099802E400B9026240038 +:10C3B000B9012270091002060040000000000000D0 +:10C3C00008040408B12020400A1002C48083002C15 +:10C3D000504B1002240091002E40081202C48181AB +:10C3E000A26C400B12020480B9202A4829120202D2 +:10C3F0000100000000000000B80D6140F80032802C +:10C40000088003E142C80032001F8503A140C850E4 +:10C410003A008D85036140D8003E000F050321409E +:10C42000F85032140D850B2E035000000000000060 +:10C43000981DF404FD103F400F5003C440FD003F21 +:10C44000510FD003F400FF013D400F9103E440FD84 +:10C45000103F4A0F9103E440FD103F440E9103E664 +:10C4600002700000000000001805C500CD0031403A +:10C470000DD043E400CD0033404F1102E404C1006D +:10C480003D400C9003E400EDA432500F9003E40013 +:10C49000FD003F400F9003C6007000000000000048 +:10C4A0003810E208D8003201008012C0004800367F +:10C4B000800B8A02E000A8002E000F8002E00088B6 +:10C4C0005034280B8002E000B8002E000B8002CE12 +:10C4D00004300000000000000805C48081002640F0 +:10C4E000091802C408210028408B1002C400B101C1 +:10C4F0002E40181002C400A10120481B1002C400E5 +:10C50000B1006C400B1012C201700000000000006E +:10C510001811A4009980A242489002E400A92A269A +:10C52000440B9082C481B9002E400B9042C4008914 +:10C530000026400B9002E400B9012E410B9002C688 +:10C540000460000000000000A015C520C984307000 +:10C550000D9013E402E90032700F9403E400F940F7 +:10C560003C480C9003E400E10032400F9001E400ED +:10C57000F9903E600F9026E8047000000000000073 +:10C580002801A500F1043A448F9003E410C9043E49 +:10C59000600F9003E400E9203E400F9003E410F99F +:10C5A000903E400F9003E400F9803E640F9007CA6C +:10C5B00000600000000000002810A100C8043A003C +:10C5C0001E80038003C8402A041F800320008800C7 +:10C5D00032300C80032000F8003E000C8003E000A5 +:10C5E000C8803E200F8003CA042000000000000025 +:10C5F00028053800AED0378008EC463800D6042332 +:10C60000A00BA0417804FA0037800DA002A810EE1C +:10C61000212E8008A002E8088E802FA08BA002CADD +:10C62000004000000000000028014C0283C0A8E880 +:10C630004A36028C0013A028C20B30060C00B3004F +:10C6400024840930020C00B32028C0093002CC0039 +:10C6500083802CC00B3002CA0100000000000000E3 +:10C66000A0013C44AF4025C248F8821CC89F082165 +:10C67000C08BF8025C00BFB02780093A029C00A57D +:10C68000022DE8097002CE8085082DC20B7302E8E6 +:10C690000040000000000000A8081E00C782A9E0BA +:10C6A0000A78029E40978439A00B7A833F80D79105 +:10C6B00035A00D7A091E44F7803DE82D7A03DE820D +:10C6C000C6803D204B7B23EA0200000000000000F2 +:10C6D000081DAC00D3003EC10F3003ED80E3003EE7 +:10C6E000800FB621EC08DB213E800FB5036C40F9CA +:10C6F000003EDC0EB203ED40F9023E800FB003C2F3 +:10C7000006600000000000000005FE00CF803DE054 +:10C710000FC843FE00FE843FE00DF8C3FF10AF904A +:10C7200035A00CFC033E14EC843FF00EFCC3FF0864 +:10C730004F8033E40CF8030000700000000000009C +:10C74000A8119C00D7A22DC40C41C2DC00740025A6 +:10C75000800F7242DC90D7382D980A70021C048634 +:10C76000003FC00D7002CC00860837C62870022A30 +:10C77000006000000000000000009C0087602DC2E7 +:10C780000A5002DC00B61025C2097086DC30970022 +:10C7900025800830025C0087082DC0087002CC405C +:10C7A0008600210009700A0004200000000000003B +:10C7B0002014ED8093000CE1281802CC08A000247E +:10C7C000121A3402CF0493402C800AB0224C02810A +:10C7D0008028E0283002CC008882242008B002089B +:10C7E0000430000000000000A815BF20C9E02CF1B3 +:10C7F0000EBD03FC00B940364009F502FD40FF8044 +:10C8000036A208F00B7C00EB802FE00AF043FC021C +:10C810008BD032F00DF0032A04600000000000000D +:10C820008000EC10FB003EC80F9413EC00F940367A +:10C83000401FB003EC10FB013ED00FB003AC00F979 +:10C84000003EC40FB001EC00F9043E480FB003E015 +:10C8500000300000000000000110FC00DF003FC0BD +:10C860000CE007FC00FC0A27004FF003FC00FF0867 +:10C8700033800CF0002C005F0033C00CF001FC0092 +:10C88000FE0023400FB00300443000000000000011 +:10C8900081046C008B862EE0488F02EC08B8A0362D +:10C8A000304BB003AC0C9B023CA00CB0436C00B10D +:10C8B0000028C00DB012EC10B980A2610BB00220AC +:10C8C000401000000000000080052C009B882EE036 +:10C8D00008A002EC01BB8026620BB002EC00B301A1 +:10C8E0002A2108B0122C00B80022C008B012EC14A3 +:10C8F000B98422A20BB002A000400000000000009A +:10C9000008040C0493002CE0080002CC09910020DC +:10C91000400B30064C0413002600083002CC04B251 +:10C92000002AC0013000CD00B00020800B300A0288 +:10C930000100000000000000000D6C00DB246EC050 +:10C940002CA002FC00BA0426404FF057FC003F0127 +:10C950003A002CF0013C00DB0033C084F003FD08FA +:10C96000FA0032000FF00300015000000000000048 +:10C97000A019DC00EA403F0007C003FC04FC003FB4 +:10C98000400FF0039C00FF003F000EF0037C00FD11 +:10C99000003FC10FF003FC84F4003F000FF003E8F8 +:10C9A0000470000000000000C001F080FF0003C21E +:10C9B0000FC2033E00DFC03EC04DDB02B0C0DC3022 +:10C9C0003FE00FDB23F620FF2633E00F52035E002B +:10C9D000FF8033C04C4903300070000000000000AD +:10C9E0008010E1E0B70823F00BAD0A2E009A042E68 +:10C9F000B0098F03A040B9302EA00B9F03A700BB46 +:10CA00008026E00BDD022E00BB8022F40A9202A0F9 +:10CA100004300000000000008805C880B31024C066 +:10CA20000B8002AC00A3242CD0081006C080B201F9 +:10CA30002CEA4B0012C204B31008C00A90020C008A +:10CA4000930424C0098202A20170000000000000CB +:10CA5000C015A500BB0022C00B8002AC08BB182E7D +:10CA6000E0188802EC01BA002E800B9886E200BB29 +:10CA70000022C40B90026C00BB00A6C00B9000B05B +:10CA800004600000000000004011E700FB00B2C09D +:10CA90000FA803AC02EB003E600D9E03EC00D840F3 +:10CAA0003E400F8843E200FB2032C00F100B6F9016 +:10CAB0005B8236C02D080190047000000000000069 +:10CAC000E001B708F7003FC00FF9037C08CF823CB4 +:10CAD00000AFD021BC08FD103F808FC003A400F739 +:10CAE00001BFC007D003BD30FFA438C00EDA03F881 +:10CAF00000600000000000004010A800FB00B2C170 +:10CB00000E8103EC40FB443AC10E9503E000CB419B +:10CB1000324D0F8103E020C90072E84491036D009B +:10CB2000CB023EC00C8003900420000000000000F7 +:10CB3000C8052400BF0033C4081D038C00BB983611 +:10CB4000484D9822ED40DB0036B00B9802E300DB45 +:10CB50000032E088D8022C02C3802FC008900372F4 +:10CB60000040000000000000E0014400B30020F09D +:10CB70001808024F84B1C024C0890602C400910085 +:10CB800020F01B1882C60093002CD1081E020E4410 +:10CB900093942CC0082002B8005000000000000050 +:10CBA00020011E04B78020E20868069E80BF84250D +:10CBB000A8096802C60093A065E40B7812DE009312 +:10CBC00000A1E008D8021ED0A7802DE008F8024896 +:10CBD000104000000000000048080800B32030C0EA +:10CBE0000A2202CE40F3A03CE80B3002C100D0C1C3 +:10CBF00030C00B2113CC21D3002CC02C100B0C8087 +:10CC0000D3613CC82C200392020000000000000009 +:10CC1000401DBC00FF403BC00FE003FC00F7507F0D +:10CC2000C42EF003FC40FE003FC00FF047FC00FFA5 +:10CC3000007DC20FD001BC805F003FC00FF003D069 +:10CC40000260000000000000A805E400FBC032C83C +:10CC50000EE003ACA0EB2032408CA0132C00D900D6 +:10CC60003E600CB003E800FA8030C03C9203EF60F5 +:10CC7000C32031C40CA0032A007000000000000093 +:10CC800048119C00332021DA0B70439C01B5002130 +:10CC9000000AE0021C00B7002FC00D70039C00B614 +:10CCA0000031C8085702DC00875021C00A70429248 +:10CCB0000460000000000000C0009A11B79021E05D +:10CCC0000B6882DE08A78024600870121208958025 +:10CCD0002D60096C02DE00B18023E00A5862FE007C +:10CCE00097A021E809E802301020000000000000B1 +:10CCF0004814CD00B30020C08B3C028C00BB002444 +:10CD0000C41A3D022F88B3482CE0893E028D8093DF +:10CD1000D9A440881002CC0493C820C00B300292E2 +:10CD20000430000000000000E815B940FA00B280AD +:10CD30000FE003E800EA8037A00CE8133B08DE01AF +:10CD40003F820CE043FA80FE8031280CA003F00201 +:10CD5000C4C0B2800DE0033A04600000000000008F +:10CD60004800E000F8003E100B8083E000F8303A05 +:10CD7000006D8083E144B8043E100F8013E000F89A +:10CD8000003A104F0403E300E8103E000E8003D287 +:10CD900000300000000000000810E400C900384026 +:10CDA0000F1A032E00FBA036600C9803E604D10096 +:10CDB00036480E9102E600F9003E000C99036240ED +:10CDC000F800A0680C90030204300000000000008E +:10CDD0008004640289042E64889402A500B980202E +:10CDE000640D9C02E642890022600B9C02E410B9AB +:10CDF000403A50089C022720B900224008100360E6 +:10CE00000010000000000000180504008900224006 +:10CE10000A9082254CB9000240089602E41089006D +:10CE20002650139402E440B9082E4008908A24004A +:10CE3000B9012A40089002060040000000000000EE +:10CE40000804058081402CC80810068400B1042025 +:10CE500049091442CC89812020500B1446C400B1EA +:10CE6000002AC02814020101B0042840389402426C +:10CE70001100000000000000B80D600088003A00BA +:10CE80000E80232000F850B2000C8012E140D850F0 +:10CE900036000E8003E000F8002E000C8053600482 +:10CEA000F8003A000C80032E035000000000000040 +:10CEB000981DF440F9443E440FD403E400F1003FD0 +:10CEC000440FD453F444FD102F400FF403FD00FD34 +:10CED000403B100FD423D1047C4336500F5003E65F +:10CEE00006700000000000001805A600F9102E6270 +:10CEF0000FD283E400BD423E610FD003F6C0C9A249 +:10CF00002B400CD0033400F9813E6808C143FA007D +:10CF1000F5803F620C140306007000000000000062 +:10CF20003810E12088112E100B8002E000B8822E0C +:10CF3000100B8000E3C488F022000B800A2000E878 +:10CF4000402F14088802E200B8002E000888028EE4 +:10CF500004300000000000000804C500A1002C40BF +:10CF60000B1002C418B1226CD10B1026C40081082A +:10CF70002A408810020404B5C00F400B020241A0F1 +:10CF8000B1402C40081202021170000000000000A5 +:10CF90001815A40089062E400B9012E400B9402E0B +:10CFA000400BB082C402894422400A90022400A9A6 +:10CFB00000274809B012EC18B9012E4040900286B3 +:10CFC0000460000000000000A015E784E9013E4075 +:10CFD0000F9003E400F9003E720F9003E7608910A0 +:10CFE0003A400C90032400F9443C402D9003E76044 +:10CFF000F9713E40289003280470000000000000F2 +:10D000002801A448A9003EC00F9A43EC00F9207EF5 +:10D01000C80F9A07660079807E400F1C03E700E97D +:10D02000A03E40468003E020F9003C400F9003CA38 +:10D03000006000000000000028108000F8003A00A6 +:10D040000F8003A008E8403A100C8303A1C0F04011 +:10D050003E060F8403E100F8003B000F810320002F +:10D06000F810B2004C800B0A042000000000000001 +:10D0700028052800BA002EB00BE802E9003E900215 +:10D080008108E4127800BA002DB089E822F80CBAC1 +:10D09000006E8003C5033000BA0022A808A0228ACF +:10D0A000004000000000000028054C00B30028E804 +:10D0B0001B31128CC4A3922C408834068E0093003E +:10D0C0002CF01931A2CC04B30028800138024C00A6 +:10D0D000B38020E00AB012020050000000000000FF +:10D0E000A0011C00B7142D420B6002DC00B78127A1 +:10D0F000E01860025818B7222D80097022DC00B7B2 +:10D10000002D800B3B021DD0BF8028C08AF202A0F8 +:10D110000040000000000000A8081F80F7A039E2CE +:10D120000F68039E00ED843DE24478039E00F7B44F +:10D130002DE00D6803D600F68039E00F79035E908C +:10D14000F78131602E7C032A0200000000000000FD +:10D15000081DAD00FB423EC80FA003EDA0BB003888 +:10D16000C80FB0036800FB113E4009B041EC00FA63 +:10D17000023EC00FB20BED803B0036400DB02342A3 +:10D1800006600000000000000005FF00CFD033E47F +:10D190004FF903DE40DC8036E40CB913FE00CF907B +:10D1A00037E50FF843FE00CF923FA40F78031F002E +:10D1B000C58033600CF82000007000000000000003 +:10D1C000A811BC000F1021810B600384008B082183 +:10D1D000600A7B0398008B1029840E6422DC40D700 +:10D1E000022D840B70021C00851821400AF022AA2F +:10D1F000046000000000000000009C00A71469C04B +:10D200001A6012FC01A4102DC00A52024540870C7E +:10D2100021801B6082D400860325E01B70025C40E5 +:10D220009D0029400870020000200000000000005E +:10D230002014CD00A30028C01B20228C11A300685D +:10D24000F60A3C068200838028840A8C82CC4492B1 +:10D25000002CC00B30024E00910028400A3002889A +:10D260000430000000000000A815BE22EF04BAC080 +:10D270000F1493EC02F1C33EF00E90836600CFD200 +:10D2800032500F9C03CB00C9803E280FB0034F00E3 +:10D29000D1C0AAC00C71032A046000000000000085 +:10D2A0008000EC20DB0026800FA003EC081B00367A +:10D2B000C00F8601E540FB023A480E9403EC80F172 +:10D2C000843E004FB003ADC0EB2036C00FB023E06A +:10D2D00000300000000000000110DC00CF003F60C3 +:10D2E0000CE0833E80ED0833D08F50039E00DF00BA +:10D2F00033400CC0033000CC1033680CF0033C8486 +:10D300008D9030400CF00308443000000000000015 +:10D3100081046C008B022CF408A8620C808B802A9C +:10D32000600F9C022E008B0020600D98022C80D88C +:10D330000014400834122E008B8232400DB003607E +:10D34000401000000000000080052C008B002ED053 +:10D3500008B8022C008A8422C00B8802E4A0830053 +:10D3600022620A98022800890022000AB1062C00D5 +:10D37000AB00224008B00260004000000000000046 +:10D3800008040C02A3002CC10820020C028B002808 +:10D39000C20A00024410831022400B10060C0091B8 +:10D3A00004AA002830022C00A101204009B002424A +:10D3B0001100000000000000000D7C008F003EC046 +:10D3C0002CA0032940A84032CC8B8002E000CF4043 +:10D3D00032000E800A2000880022400CB0032C048A +:10D3E000EB00B2408CB0034003500000000000008E +:10D3F000A01DFC00DF003F400FE003FC80FF283D44 +:10D40000C00BC103B014FF003F000DD003DC00FCD3 +:10D410000037400FF021FC001D007B408FF003E03F +:10D420000670000000000000C005D200DF0031A03F +:10D430004DF0433200CE141B680EDA23B2C02F0029 +:10D440003FC22CE8033C40FD083BC84CF0833CA0A5 +:10D45000CF0033C40CF307F00070000000000000A0 +:10D460008010E2008FC022A008FD422F008B7022A6 +:10D470001E48890227C08F5A2E50483002BDC0BDB9 +:10D480004023C548F4823D2C877022C008F103E098 +:10D4900004300000000000008805E00093102681A1 +:10D4A0004930028040832028400A10028000A324D3 +:10D4B0002CCA0832820C00912820CA1B32020C8828 +:10D4C000830920C8093202E2017000000000000058 +:10D4D000C015A3148B04268908B002AC228B882ABD +:10D4E00020089882A610AB002ECA08B082AC00B902 +:10D4F0000022C029B00A2C018B0022C009B022F002 +:10D5000004600000000000004015E300DB0034E28E +:10D510000DB003A300CA80BA700E8803A600EB000A +:10D520003E900CB5032C00FB10BAC00EB0032C02C9 +:10D53000CB0232C009B002D004700000000000002D +:10D54000E001B008FF00BBE00F70036500F4003598 +:10D55000400F40035400DF003E400FF803EC00F79B +:10D56000013DC10E3003EC00FF003FC08EF003B858 +:10D5700000600000000000004010A040EB083E806A +:10D580000DB003E000C8003A510F82036420DB00B5 +:10D590003D820CBC032C10DB0072C00DB1030C20CB +:10D5A000D30032C00FB00B50042000000000000078 +:10D5B000C805010087C02EA808F112C540880022C6 +:10D5C000400B84022700AF002EC008BC123C008B29 +:10D5D0000123C028F54A3D28DF0033C04BF0033259 +:10D5E0000040000000000000E0054880A3902C00EF +:10D5F000083002C100920428000B14124300B30447 +:10D600002C300AB00A8C00930060C0083C060E0162 +:10D61000B3002EC08B300638005000000000000020 +:10D620002001120087802D24087802D200958021E5 +:10D63000A00B68025A2087802D661A7C029E008704 +:10D640008021E11879029E40B780A1E00B78024862 +:10D65000004000000000000048080000E3A03C403B +:10D660000C3003C422D90038D40F30836840F30053 +:10D670003C800A32028C00DB00A2C40C30030C0098 +:10D68000F3003CC00FB103120200000000000000D4 +:10D69000400DB000FF103F400EF003FC00ED003FD6 +:10D6A000C00F3013BC407F103FC12DF0037C00FB46 +:10D6B000403FC20EF4837C00DF003FC20FF00390B6 +:10D6C0000660000000000000A805EC00DBA032C0EE +:10D6D0000DB703E000CA043E800FB8032C10FB0016 +:10D6E00033008DB0032C80E9403ED20FB4032D806F +:10D6F000EB20B2C00FB203EA00700000000000008F +:10D7000048119000B71011C0087082D80A87012D07 +:10D7100080897003D808B70A21402C70020DC0859B +:10D720000179C80B32020D208F2821C00B7282D2E2 +:10D730000460000000000000C0409610979023E0B5 +:10D74000097A02D60097802DF00B78821E00B3B0C4 +:10D7500021A00878021E00A5802DE00B7A021E8011 +:10D76000A7B021E80B7902F00020000000000000C3 +:10D770004814C000B30020E2083002C64093702C69 +:10D78000C0093C028E00B30020D80818020C0081AA +:10D79000902EC00B302A2C108300A0C00B3002D278 +:10D7A0000430000000000000E811B900DA0233B8CC +:10D7B0000DA003F800DEC03FB04FEC063840FA0081 +:10D7C000B3900C6C0B2808EA017E800FA0032800A0 +:10D7D000EA0032800FA003FA04600000000000009D +:10D7E0004800E000F8403A000F8403E100E8023E00 +:10D7F000000F8403E140F8003E000F8103E000F8D1 +:10D80000003A000F8003E000F8003E000F8003D2D2 +:10D8100000300000000000000810E420F9C03E7055 +:10D820000E9002E480C90032420C9883A484F9006F +:10D83000B2600C90832400C9003E400C1A02240000 +:10D84000C100B2400F9001C204300000000000008F +:10D8500080046500B9812C600D94C2C7088900223C +:10D86000400895C7A400B9002870A8940A2400892C +:10D87000042E4028902A2600890022400B9002E0C6 +:10D88000001000000000000018052400B9402E40E0 +:10D890000A9002E5008100A040099042EC00B1002E +:10D8A00022580890A2040289002E40089002A4A0E9 +:10D8B000890022400B9002C60040000000000000DA +:10D8C00008040400B1202EC0891202C480812020E7 +:10D8D00040611042C500B120284818904204808160 +:10D8E000282C4808128284A0812020480B1282C272 +:10D8F0000100000000000000B80D6800F8002E00D4 +:10D900000E8003E008C85032140D8017E804F85068 +:10D9100032144C050B2140C8203E000C8703A1C2E5 +:10D92000C80032148F8203EE035000000000000094 +:10D93000981DF400F1103D400F9102D442FD103FBC +:10D94000510E5413B500F91035442FD003E450FDA7 +:10D95000283E4E0F90036400F9383E440F9283E650 +:10D9600006700000000000001815F400FD003D40A6 +:10D970002CD003B600F9823E400CD003F400F980AD +:10D9800033700C50033400C9C03E400CDA031680DB +:10D99000C9403E622C988306007000000000000021 +:10D9A0003810E000B8002E000880022800B8502689 +:10D9B0000008A002E800B8002A342AAA0A20008839 +:10D9C000C02E2A0880222100A8802E000880020E86 +:10D9D00004300000000000000805C400B1002E4023 +:10D9E0004810068D00B1002C40281002C400B14040 +:10D9F0002C48081082440081602C4028140A0440FE +:10DA000081202C400810020201700000000000007C +:10DA10001805A440B9002E4008B0022400B9282EF1 +:10DA200050089022E400B9002E600B124264008975 +:10DA3000002C400990022400A9002C400810024646 +:10DA40000460000000000000A005E600F9003C4270 +:10DA50000C9003A740F9403E700C9802E540F90095 +:10DA60003E400C98036406C9012E400C9003240428 +:10DA7000C9003E400C900B2804700000000000001C +:10DA80002801A400F9003E400F9083E610F900360B +:10DA9000680F9C03E600F9003A400E9893A400F941 +:10DAA000003E400E9083C400F9003E400F90038A70 +:10DAB00000600000000000002800A000F8003E0404 +:10DAC0000C80032102C84032000F8003E100F00007 +:10DAD0003E020C80032000F8003E000C00032000F2 +:10DAE000C80032000F80030A04200000000000007C +:10DAF00028153A00BE022FB008681238008A042A9E +:10DB0000800BE042FB20BA002F9108E0022800BA07 +:10DB100000268008EE0A38008A0022800BA0028AC4 +:10DB2000004000000000000028054200B3002CC2A5 +:10DB300028380A4800830422C00B1002CD80B300AD +:10DB40002EC0081C022400B3002CC00834120E4062 +:10DB5000830020C00B30120A0050000000000000BB +:10DB6000A0011100B7002FC00870A24E008FB02195 +:10DB7000CC0B6012DC10B7302DC008D0821480B7F7 +:10DB80001225C8286002140087B221CC0B3102A8EC +:10DB90000040000000000000A8081200F7803DE0EF +:10DBA0000C38035600C790B1E40F7803DE00F790FD +:10DBB0001F602C480B16A0F7803CF40C38031E00A5 +:10DBC000CFA0B1E80F7B032A020000000000000094 +:10DBD000080DA000F8003EC00BB003AC00F3213EDE +:10DBE000C807B002E400FB203F400F8003E480FB45 +:10DBF0000036D00FA003E008FB423ED80FB003C2AE +:10DC000006600000000000000005F080CF8031E1D8 +:10DC10000CF803DA10EF803FE40FD803FE10FF8208 +:10DC20003FE04CD81B1620CF803FE04CD830EE4070 +:10DC3000FFC0B3F40FF803C0007000000000000044 +:10DC4000A8019820834021C0087102DC8487202D20 +:10DC5000C00B6002D960F7002DC008F08214048761 +:10DC6000002DC008F0031E00B72021C08B7002EA0F +:10DC700004600000000000000000B0008700218068 +:10DC8000087002F50427002DC08B7002DC00B7007D +:10DC90002C50084002140087002DC00850025C047C +:10DCA000B700A1C08B7002C000200000000000007F +:10DCB0002014C80080000080083002CE0083C02CF1 +:10DCC000D04B3002CE00AB022C4048BC0204008393 +:10DCD000002CC00810020008B30020C0093002C8A0 +:10DCE0000430000000000000A8158340C80030C0C8 +:10DCF0002CB003EC00EF883FE607B183E100BF00E2 +:10DD00003EE00CB8033400CF003FC02CB0036810D5 +:10DD1000FF0033C00FF003EA0460000000000000C1 +:10DD20008000E400F1403EC00FB403ED40FB083E2C +:10DD3000C00FA003E520FB003EE00DB083E400F33C +:10DD4000003EC00F8003C400FB003EC00F3003E064 +:10DD500000300000000000000110F000CA0033E0B5 +:10DD60004EF0033400FF003FC08FE803F000FF00D7 +:10DD7000B1400CE0033400EF00B3C00CF0033800F6 +:10DD8000CF003DC00AF00300443000000000000056 +:10DD900081046222889022E0083C022E08BB012EFA +:10DDA000C00BA0026600BB0022A008A9022400BB91 +:10DDB0000022C0282C02A200DB002EC00AB002A064 +:10DDC000401000000000000080052200980022C8DA +:10DDD0000A98022704BB002EC00BB102E200BB0070 +:10DDE00022E208B002A400AB0020C00A888223000F +:10DDF0008B002EC008B002A0004000000000000010 +:10DE000008140400914022C00810020C00B3002C3A +:10DE1000C04B28224004B30020C028300A0404B3B9 +:10DE20000060C0080002842093002CC00A300282E7 +:10DE3000010000000000000000056000DA40B28030 +:10DE40000E90032400FF003FC08FA003E009FF00F5 +:10DE5000324008A00B3400EB0031C00C8003288056 +:10DE6000C7003FC00CF0030003500000000000009A +:10DE7000A015D000EC203F000FC00BFC10FF013FAD +:10DE8000C00FE003F400FF003FC00FF003F400FFF9 +:10DE9000003FC04FC001F008FF003FC00FF003E893 +:10DEA0000670000000000000C005FC00CC90372088 +:10DEB0000EF013BD04D4C1332C4CD9233260FF20A3 +:10DEC0003DE04FC103B640CD0037E00CE28B10C0FF +:10DED000CD0033C60FD803300070000000000000F2 +:10DEE0008010EE088A20220008B7022D008A00B6B2 +:10DEF0003C0899022784BF682E820B01022440D976 +:10DF00004220C08AAC022DC28248A2D00B820220DD +:10DF100006300000000000008805CC008804268040 +:10DF20002A30C2A580A92128008A00020000A3107F +:10DF30002CC80B0002C490834224C1080002408810 +:10DF4000A360A8C00B00C222017000000000000006 +:10DF5000C015AC068A0022E048B0022E02AB802E2B +:10DF6000204A8C022620BB006E800B30C246049BE8 +:10DF70000AA2C00A80126C40A8002AC00B8C023092 +:10DF800000600000000000004015EC00C10936618F +:10DF90000E3203AB20F8843A782E98032600EB006B +:10DFA0003E404F9003E200C94036E00CB4036E00DF +:10DFB000EB003AC00F88031004700000000000005E +:10DFC000E001BC00FD003F400FFA13F810DC04270D +:10DFD000400D5043F400FF003F400FD903B000F95B +:10DFE000013FF00FF023B200D4A037C00FC00BF8F0 +:10DFF00000600000000000004010AC20EB10F200B8 +:10E000000EB4032180C9403A480F9013E120FB0071 +:10E010003EC00C84032400FB0136E00C740B9C0012 +:10E02000CF0032E00F8403D0042000000000000085 +:10E03000C8051E008B80204008B802838081A02282 +:10E04000780B9183E300BF000EC10AB4036404B9E6 +:10E050005032C00AB2022000880023D40B8802F29A +:10E060000040000000000000E0054C42A0802000BD +:10E070004800020D0680802AD0030002C800B300C9 +:10E080002CC00836024000B90222C28B26020C10B6 +:10E09000010224C04BA102F80010000000000000A3 +:10E0A00020011E088E8021210828C29E008E80211A +:10E0B000600B78029E20B7822FA10A78025E00B51D +:10E0C00091A1E00B290232448680A5E00B4C02C8E6 +:10E0D000001000000000000048080C00E100228051 +:10E0E0000E000B2400C04428AD0F2002C800F3002E +:10E0F0001CC00C0103484CF20430C00F15038040D3 +:10E10000C10014C80F0003DA021000000000000074 +:10E11000401D9C40F7003FC08FC003E400FA013F60 +:10E12000C00FF023FC08FB003F800FF001FC10FF44 +:10E13000003FC00ED103FC42FE803BC00FC003D0A5 +:10E140000660000000000000A805EC40C8003EC0CA +:10E150000F9003EE08CB0032C00FA023E603CB4C98 +:10E1600032400FB007E800F90016400CA00B6C001D +:10E17000CF0232C50C8003020070000000000000D6 +:10E1800048119C8084042DC10B4040DC0087042191 +:10E19000C04B7012FC018F6029400B70139C00B5BE +:10E1A00000A3400A60020000840021C0084002125F +:10E1B0000660000000000000C0008E0087802DA2D5 +:10E1C0000B4C16D608978821A04B6802DE04A78066 +:10E1D00021E00B4802DA04B68225600AE8621E00DC +:10E1E000878020E8084802080020000000000000A6 +:10E1F0004814CC008B806CF00B3C02CE469BC020B8 +:10E20000E40B3C02CC20A30028E00B30028D80B14F +:10E210008022440A210A03828080A0C008060A12D4 +:10E220000030000000000000E815A802CE803FA0EA +:10E230000FE003FA40DEC0B3900FEA13F908EA04D6 +:10E2400033828FE403FB08FEA036A00CAC0B6B827C +:10E25000C6A032802CE4033A0470000000000000E5 +:10E260004800E000F8903E020F8083E100E8203E85 +:10E27000030F8203E140D8003E200F0093A040F836 +:10E28000003E108F080BF000FC003E000F8003D210 +:10E2900000600000000000000810E400E9003640C3 +:10E2A0000F9407E600F980B0400C9403E440F900B5 +:10E2B00032400F940BA40071C032402C94232402EE +:10E2C000C90032400C90030204200000000000004E +:10E2D00080044400890022400B9802E660B90022C5 +:10E2E000600A9C02E624B90436400B98002400B969 +:10E2F00080A25208900224008940224068940220A3 +:10E30000001000000000000018052400A9002640AD +:10E31000039402E401B9102255089022E400B100F0 +:10E3200026400B90002C09B900226008900A1C04BA +:10E330008D08A0400810820E004000000000000080 +:10E3400008040600810020500B1242C480B1042052 +:10E35000500A1402C500B12224400B12220401B15C +:10E3600040205008100A15008540285008140A0A59 +:10E370000500000000000000B80D6000E850360005 +:10E380000F8502E140F85032000CA023E010F85055 +:10E39000B2140FA503A148FA00B2000C80032004B8 +:10E3A000C40232000C00032E0350000000000000E5 +:10E3B000981DE500FD003F400FD103D444F5003F18 +:10E3C000510FD403F500F9103B400FD100F510F5C3 +:10E3D000407F400F542BE500F94036500FD003E644 +:10E3E00004700000000000001805F610BD40334026 +:10E3F0000FDA033780CD003F400FD003F400E9A0CF +:10E400003E400CDE17A408FDC033418DDA1326A070 +:10E41000F9A832780CB40B06007000000000000070 +:10E420003810E100B8A036200B8A82A2802AA82EDC +:10E43000000B8012E004B8A12E284A8E022AA0BA4E +:10E44000C022280885022108B8E8A23C08C8020EAC +:10E4500006300000000000000805C500B900204A91 +:10E460000B1402058001002C410B1002C404A14AC8 +:10E470002E420814028410B160A04A091002440020 +:10E48000B501294018D2021200200000000000004F +:10E490001815A400B92126400B9602A410A9002E3D +:10E4A000400B9612E420B9002E410A90422400B994 +:10E4B0000022410898226400B9202B4128D402068A +:10E4C0000020000000000000A011E400F9E0325834 +:10E4D0000F98032640C9403E580F9C03E400E90012 +:10E4E0006E400C9A02A600F94432400D9A0B6484E7 +:10E4F000F900BA400C180328047000000000000066 +:10E500002801A400F9003E500F9003E600F9043EF4 +:10E51000480F9003E440F9003E650F9981E450F9FB +:10E52000203E408F9003A480F90034400F9203D224 +:10E5300000600000000000002810A000F8403E101D +:10E540000E84036008C8003E080F8083E028E804BA +:10E550003E000C8403211CF04832000B0003E00253 +:10E56000C00032000CC00B020420000000000000BC +:10E5700028053800B2882E8008E0037A808E002FAC +:10E58000A00BE802F910BA002C8028E4022800BE93 +:10E590004023B808E802E804CA20A28008E8020A7A +:10E5A000004000000000000028054C01B3002C4092 +:10E5B00008B8426C0283002CE00B3800CF40B30057 +:10E5C0002CC008B40A0C00B340A2820A3902CC0065 +:10E5D0009380A0C02920020A005000000000000023 +:10E5E000A0011D00B7002D64287402400087052D8E +:10E5F000900B7402DC10B7302DC80834061C80B7AD +:10E6000000A1C00A7002DE80830001000960822040 +:10E610000440000000000000A8081A00F7803D60D8 +:10E620000ED80B5E00C7803DE00F6803DE10F7A92F +:10E630007FE84878031F30FF9433A00E7803CF247F +:10E64000D680B1E00DF84322020000000000000077 +:10E65000081DAC00BB000C400FB003EC08F9003EF5 +:10E66000000F9041EC00FB617ED00FB003EC80FB0B +:10E67000403F9B0CB003ED90FA003C000EB003C28B +:10E6800004600000000000000005DE00EF80336041 +:10E690000DD8033640EF903EE00FF903FE00FF80F7 +:10E6A00033FE0CFA03FE00CF80B3E00FF803FE0048 +:10E6B000CD8033E00FC843C0002000000000000000 +:10E6C000A8119C0085083540087003522087112C42 +:10E6D000EC0B7102D000E70035C4087402DC4087FF +:10E6E0001021C00B7002FC80850821000B4182EADA +:10E6F000062000000000000000009800AF0023503A +:10E700000950021C80A70129C01B6006DC40B7101D +:10E7100021C84A5202DC00830021C00B7002DC13C6 +:10E72000840025C00B5802C000200000000000003B +:10E730002014CC0081802440083E026E0089002C09 +:10E74000C00BB402CA80A30024C00A0402EC4082B9 +:10E750000A20C00B3002CD1080C0A4000B1C02C8E0 +:10E760000020000000000000A8158400EB8033406A +:10E770000D8C832600E9A03E788F9083E100FF0096 +:10E7800031D10E8423FC00CB8232C08FB002FD4019 +:10E79000CB80B6C00FA403EA0460000000000000B4 +:10E7A0008000EC00FB003E400FA003E000F9013EBA +:10E7B000420F9003E554E3003EC8059303EC80FB51 +:10E7C000C13EC00F2003CC48F3083A000FA043E03D +:10E7D00000300000000000000110F000CF003F40BA +:10E7E0000F30012C0ACD1033000FD0831400CB0260 +:10E7F00033C00CE103EC10CD0033C00CF0333C000F +:10E80000EA0033C00CF083C8443000000000000070 +:10E8100081046E008B002E400BBC022E000B0022E8 +:10E82000300B9C022780AB002AC008B802EC00899C +:10E83000C020E008AE022C088A00220008B042E89E +:10E84000401000000000000080052E008B042E40C8 +:10E850008B8C02AE10890022700B8C02A2008B01FF +:10E8600022C0088002EC108288A27009B8022C082D +:10E87000890020C0288022E0104000000000000035 +:10E8800008040C0481002C400B200280008104A0AD +:10E89000504B000A8000A3012AC1201002CC14832F +:10E8A0000022C00820020C008100E000080002C223 +:10E8B0000500000000000000000D6800CB003E4095 +:10E8C0000F900BAC80C90032100F8003A400CF0260 +:10E8D00031C00C8013FC02CD0033C02C90033C02ED +:10E8E000E800B2C00C9003C003500000000000001C +:10E8F000A01DFC02F5003D408FF0236D00FF003F9E +:10E90000040FC003701CFF013FC04FC003FC00FD9B +:10E91000003FC00FE00FFC18FC003F000FD003E8E1 +:10E920000470000000000000C005FE00D7020F3098 +:10E930000CF2017E0644303F200EF0027C84FD2064 +:10E9400027080CD0013600FF6033CC0BF1132CC428 +:10E95000FF300FCD0CF403F0007000000000000049 +:10E960008010EE008FC02E0008FC022E008A302896 +:10E970005208F6823C68BD903234489C122600CF83 +:10E980004023CC0BF6023D00BF102FCC88F602E0EE +:10E9900004300000000000008805CC0093102C0813 +:10E9A0000931024C009B2064580331624C81A10064 +:10E9B00020004814024400933024C00B33028D849D +:10E9C000B3206CC02A3602E2017000000000000093 +:10E9D000C015AC109B022E410BB002A4009A004A55 +:10E9E0006088B0526C01B9002600089122EC08BB87 +:10E9F0000026C00BB002AC00BB056EC10AB002F02D +:10EA000004600000000000004015EC00DB013E3017 +:10EA10002D30034760D8A016388FB0036C00790200 +:10EA200031600CC80A6600BB00B6C00FB00BAC006A +:10EA3000FB013EC10EB003D00470000000000000D6 +:10EA4000E001BC10EF083F240CF0037620EE903577 +:10EA5000400E7003AC00FD00BB640F88133480CB04 +:10EA6000003BC00FB0036C08FF003EC00DF003F880 +:10EA700000600000000000004010AC01FB8032107C +:10EA80000EB003ED00CB503E408CB0432C10F9008B +:10EA900032600C400B2600C30436C00C30032C003F +:10EAA0009B00B0C00CB003D00420000000000000A8 +:10EAB000C8050E80BF042A4000F500E60082D2227D +:10EAC000400DF0223C00950236400A80022E008F55 +:10EAD0000037C00AF0423C008F0023C028F002F249 +:10EAE0000040000000000000E0054E00B3002220BE +:10EAF0004A3000CC0081C028000830020C10A10070 +:10EB000028801830220404830024C0083002CC0876 +:10EB1000930020C0083006F80050000000000000FC +:10EB200020011E00B78029A0087802FE208D8029D0 +:10EB3000E55B38421E40A18125A80879023700878D +:10EB40008025E00A780ADE81878025E5487802C8BA +:10EB5000004000000000000048080C00B310301214 +:10EB60000E3012CCC0C30038800C31060C40F100CE +:10EB700038800C30430442C30036C00C3203CEC090 +:10EB8000DB0030C00C3003D20200000000000000A7 +:10EB9000401DBC00FF103D844FF103D040FC1033FA +:10EBA000805DB183FC50DD0A25890FB803D400FFD6 +:10EBB000103FC00FF4033C40FF003BC00FF003D0F8 +:10EBC0000660000000000000A805EC00FB203E00ED +:10EBD0000FB5032920F90032A00CB083EC0049C81E +:10EBE000B2C08CA0036400FB0812EA0CB00B2C80AE +:10EBF000FB202ED26CB643EA047000000000000037 +:10EC000048119C00B7492D000B30821001B50283DA +:10EC1000C01A7222DD41850061C01820201400BF97 +:10EC20004035D00D34021D20B72825C1087482D28A +:10EC30000660000000000000C0009E0437A02D20E8 +:10EC40000B7A121601B38021E20878429E0085807B +:10EC500020E11868025600B7A025E0087A021E00DD +:10EC6000B7902CE5887A02F0002000000000000038 +:10EC70004814CC00B3006C241B30020000B000200C +:10EC8000F80A3002CC00810020D81820020400B31A +:10EC90000024C00930020C00B30026C0083002D2A4 +:10ECA0000030000000000000E815A800FA003D80D8 +:10ECB0000F200B2880FE0033A00CA003E802CA023C +:10ECC00032902CE4037800FA0032800CA003280074 +:10ECD000FA003E800CA003FA006000000000000073 +:10ECE0004800E100F0003E004F8003E080F8003E65 +:10ECF000000F8023C000F8023C000FC0836000B802 +:10ED0000003E000F8023E018F80136000F8003D288 +:10ED100000300000000000000810E600F921326019 +:10ED20000C90032C44F900B2400F901B2400E90022 +:10ED30003E400C1003A400F90032400F10332410A1 +:10ED4000F10032400C90030200300000000000008F +:10ED500080046400B940A2410890022480E90022A6 +:10ED6000400B9012240089006E411890422400B993 +:10ED7000042A410B90036400F9002A400A900A20FB +:10ED8000001000000000000018012480B942624811 +:10ED900028900A2400B10022400B10022410B9026E +:10EDA0002E4008D002A400B10022400B900224049F +:10EDB000B9002240081002060040000000000000D8 +:10EDC00008040C00B12060400812020400A12020B9 +:10EDD000400B1202048091202D680852120400B1E9 +:10EDE00028284A09128244A0B12C284A0A12820219 +:10EDF0000100000000000000B80D6000F8003214AF +:10EE00000C80032000F85032140F85030140F800F5 +:10EE10002E0028C003A000F82430080F8223208091 +:10EE2000F82032080C82032E03500000000000007E +:10EE3000981DE408F9103F408F9113E400ED103F56 +:10EE4000500F9103E440A5103E440F9103F404F9E0 +:10EE5000283E4B0B92A3E4A0E9283E4A0F9283E69A +:10EE600006700000000000001805F400CD003340DB +:10EE700080D001F400A50026400F90032600F18801 +:10EE80003E680D98834400C9C03A400C980324089A +:10EE9000F9A032780F9A030600700000000000000D +:10EEA0003810E0028800A200088002E0000A002278 +:10EEB000000B80022000B8402E14088043300088E8 +:10EEC000A0222A0A8A42A005B84232380B80020EDC +:10EED00004300000000000000805C4039100244035 +:10EEE0000B1002C411B10420411B10224500B500D3 +:10EEF0002540095002540181402C400914924400DD +:10EF0000B140244C0B140A420170000000000000C4 +:10EF10001815A400990024420B9002E401992026C0 +:10EF200040CB90026400BB002F410AD0023400891C +:10EF30000026400B1002E400310062400B900246B4 +:10EF40000460000000000000A015C400D901365084 +:10EF50002F9003E660F98036520B900A6400F900A6 +:10EF600036400D9003640209003E400D900364009A +:10EF7000B900B6400F900368047000000000000064 +:10EF80002801A400E1003A410C9023E620E900BAF0 +:10EF9000700F9003A400F9003E400D1013A700F974 +:10EFA000003A400E9043A408F9003A400F90038ABB +:10EFB00000600000000000002810A020F8003200CF +:10EFC0000F80832100F0003A11098003E000C8019E +:10EFD00030010C8003B000D00034000D800320000D +:10EFE000C80032000C80030A04200000000000006A +:10EFF00028053800BE00228003E8021A08BE482215 +:10F00000800AA003B800CA0822800FA40208008A60 +:10F010000022808DA0022800DA002A8108A0028A3E +:10F02000004000000000000028054400B30020401C +:10F030000B30020800B06468C108B022CC0C938089 +:10F0400000C04836028800B30024C00830060C0116 +:10F05000A3022CC008B0020A00500000000000000B +:10F06000A0011408B50021400B38821C21B70023F1 +:10F07000E84A72269E408F81AB404270523800A30E +:10F080002220C44931021E0AB7222DE8087202A8C4 +:10F090000040000000000000A8081200F68021E0F7 +:10F0A0000B780B1E00B4823BE84C7C13FE02978069 +:10F0B00033A00838039A00F78835E20C78E30E0095 +:10F0C000E3E834F80C3C232A0200000000000000B2 +:10F0D000081DA804F1003E420FB013EC00FB00BE77 +:10F0E000CC1EB607ED80FB0036000FB0436800CBA6 +:10F0F000303ED80FB60BED40CB003AC02FB603C25E +:10F1000006600000000000000005F240FB913D4C4D +:10F1100080F803DE40C6801BF04FFD07FF00CD8066 +:10F1200033E00C6803BA00FF8033E007F8033F10B8 +:10F13000CF803FE00CFC03000070000000000000E6 +:10F14000A8119000B5C02D40086202DC20D6022133 +:10F15000C88F7002DC81B50081440D61221804B7AC +:10F160000035C00B7002BC00A7012DC0087003EA77 +:10F17000046000000000000000009001B6012FC0F4 +:10F18000187002DC0A961029C14B7006DC1085004D +:10F1900025800860821A20A30025C00B31025C4044 +:10F1A00087002DC008700200002000000000000051 +:10F1B0002014C800B1002C40882002ED008A602095 +:10F1C000C00A3002CC04B10024002824020A003313 +:10F1D0000024C00BB002CC00A3002CC088300288F1 +:10F1E0000430000000000000A815A000FB003EC68F +:10F1F0000C8003E50009C8ABE20BF002FC004A00FA +:10F2000036C0089003A600FF0033C00FF0037C0057 +:10F210008F002FC028F0022A0460000000000000C8 +:10F220008000E100FA013EC00F8003EC00F9403E8F +:10F23000C007B003EC00FA003A400F9023E500FB52 +:10F24000003EC00FB003AC00FB003CC00FB023E099 +:10F2500000300000000000000110F000FC203FC062 +:10F260000CC803FC20CD81B3C24FF003FC00CA00E0 +:10F270003C800CD0823601FF003FC00FF0033C08F9 +:10F28000CF043AC05CB003C044300000000000006E +:10F2900081046204B8402C60088902EE80A9602ACB +:10F2A000C00BB0038C00AA402E000810022681EB90 +:10F2B0000026C08BB0136C00DB002EC03DB002E016 +:10F2C000401000000000000080052300BB032EC892 +:10F2D00009B002EE008B1026C00BB002EC00A800B3 +:10F2E0002EC0088822A480BB002EC04BB0220C0088 +:10F2F0008B002EC00BB002E00040000000000000B8 +:10F3000008040000B2002EC0292802EC01A002204F +:10F31000C0093002CC00A0002C40080042840093B9 +:10F32000006CC00B30064D0093002CC0083002C2A8 +:10F330001100000000000000000D6000F8202FC048 +:10F340000DB003EC00CB0033C00BF003FC18E80059 +:10F350002E80088003A400BF003FC00FF0433D1182 +:10F36000CF033EC15DF023C0035000000000000049 +:10F37000A01DF000FC103F400EE003FC00FC003F2D +:10F38000C00FF003BC00FC003F002FC0037400EF6F +:10F390000027C00FF003FC18FF003FC00FF003E888 +:10F3A0000670000000000000C015FC889C293F0882 +:10F3B0000FD283EC00FF083F280FCA033C41CF2047 +:10F3C000732C0CC0033020CF6033D80F78033F80FC +:10F3D000DD9233C80F5003300070000000000000C1 +:10F3E0008010E54088402E048B9402E400B9000EA2 +:10F3F0007F8F9E836582CF683E508D04922F04D309 +:10F400004074DC0DA2022040890022F00B980220FB +:10F4100004300000000000008805C809A0852C0108 +:10F420000B0010CC40A2082C00DB110289009330A5 +:10F4300020050813028008A36060C00AB082088417 +:10F44000812020D00B1002A20170000000000000FB +:10F45000C015A41288806E200B8882EE00BA812E1F +:10F46000605A9802A2008B002A6008111A2C00BB77 +:10F470000022C008B80A2800812002C00B9002B008 +:10F4800004600000000000004005ED00D9803E202F +:10F490004F9800EB20FBE02E600B8C62AE208B00BF +:10F4A000226008BC03A020EB0022C10A180B250033 +:10F4B000D900B2C00F900B90047000000000000053 +:10F4C000E0019488FF003F010FD001F008DD013F0B +:10F4D000420740035C00AF003F400FF800F000DF40 +:10F4E000003FC00FC023F450FD803FC00FD0037811 +:10F4F00000600000000000004000AC00D9003E4069 +:10F500000F9403A820CA403A400F9403EA08FB0076 +:10F510003A004CF6232C30CB0036C00D9003A102EC +:10F52000D900BAC00F9803100420000000000000AA +:10F53000C80524008A002E400B9502E0088880222E +:10F54000708F8C02E000BF02200008B8020E00DFBE +:10F550000023DD0898822A00898023C00B501A32CC +:10F560000040000000000000E00544008305244145 +:10F57000091002CE0083902C801B2482CC00BB009B +:10F580002C8008040804018B0022C02812026C8021 +:10F59000814824C40B100238005000000000000015 +:10F5A00020013E4286802D600B6802F6908D8021FE +:10F5B000220B5802D740B79021E00849921E53977A +:10F5C0008121E048C80A5222858825E00B580208AC +:10F5D000004000000000000048080C00830034C018 +:10F5E0000F0003CE20C3307C940B3483CC14F30281 +:10F5F0003C800C04030460C300B0C00C1003EC009A +:10F60000C9003CC40F1103120200000000000000FA +:10F61000401D9C00EE013FC04FE103D440F5167A37 +:10F62000C04EF003F41037053DC00FC00BDC40FFA7 +:10F63000003BC20ED007BC02EF003BC60FD003D088 +:10F640000660000000000000A805F400DD8433809F +:10F6500004F0036C02CB027EC01FA053EC00CB2051 +:10F6600034400CD00B2010EB001EE00F300B2C00B0 +:10F67000C10032C00F9103EA0070000000000000DA +:10F6800048119C0087002180086000140085002D2F +:10F69000800B7052D404832829C02850035000875F +:10F6A0004025C80F60020400A7003DC80B5202D2DB +:10F6B0000460000000000000C0008E00958021E082 +:10F6C0000938021E11A7802DF00B7852CE0A9795AB +:10F6D00021E0195C020E00A78029C80BF8021E2049 +:10F6E0008D8021E00B5802F0002000000000000097 +:10F6F0004814CC0082E0A0E82930060E50AB802CE4 +:10F70000F00B3142CC00930028C40998024C2883A6 +:10F710000024C00AB0020D00A25828C00B1002D26B +:10F720000430000000000000E815B900DE8031A0C0 +:10F7300009E20B7804EEA42FA48BEC02D800DA00C7 +:10F7400027810DEC061B00EA043E800BE0033B0022 +:10F75000CEC022800FA003FA046000000000000069 +:10F760004800E080F8103E050E8803E00898403E0F +:10F77000000F8483E140E8003A020E8043E140F844 +:10F780000036000F8003E020F8003E000F8003D217 +:10F7900000300000000000000810C400E9003E40F6 +:10F7A0000C90030420E99032680E9803A400C10075 +:10F7B00030400C94832408C9003E400C9003A40000 +:10F7C000C90030500C1A0302043000000000000091 +:10F7D0008004640089402E5028900A240889061667 +:10F7E000610B9C02E420A90036400D90022760A91D +:10F7F000002E4028901A24008900364028980220C4 +:10F80000001000000000000018052C00A9082EC2FE +:10F810000910002400A9000640899606E600890028 +:10F8200022C00890022402890024400890020C069D +:10F830008300224008900206004000000000000003 +:10F840000804050081442C500814020580812064BE +:10F85000701B1402E480A120644019120A0480A1E4 +:10F86000002C5018140285008140244040100202F0 +:10F870000100000000000000B80D6000E0003C0046 +:10F880000D80020000AA5036000F8003E140C852EC +:10F8900072140C05162008C8503E010C8003A00409 +:10F8A000C800B2000C800B2E0350000000000000C6 +:10F8B0009819F502FD403FD00FD423F444FD147F86 +:10F8C000500FD407F440F9103F5007D123F440F90A +:10F8D000401E5007D00B7500FD023E500FD403E6CA +:10F8E00006700000000000001805F600C9A83E726E +:10F8F0000F9803E6C0FDA0B3400FD0037780CD90F2 +:10F900007F400FDAA31690A9C032604CB1032400E7 +:10F91000C100336A0BDA030600700000000000002B +:10F920003810E34088E02E300B8D02F340B8E876C3 +:10F93000004F800A228088906E288F8A036144F8E5 +:10F94000E13E2A08880342A0DCA03E100B850A0E87 +:10F9500004300000000000000805C4A085082D4800 +:10F960001B5282D480B11420400B18020582810002 +:10F970006C420B12820400A16021500B50021490C3 +:10F98000952C28400B1002020170000000000000BE +:10F990001815A4018D442F400BD402F404B9082299 +:10F9A000400A92022C8489002E400A14026C80A91D +:10F9B000012A4009500A5C028D602A400B904206E1 +:10F9C0000460000000000000A015E662C9023E5479 +:10F9D0000F9003E400F94022460B98036720C90109 +:10F9E0002E690B940B2520A90022402D920A262275 +:10F9F00099002A408F900328047000000000000046 +:10FA000028018602F9003E400F9003E680F1A03EF7 +:10FA1000620F9883C620F9003E490F9083E400717D +:10FA2000023E400E900BE680F9803E400F9003CAE4 +:10FA300000600000000000002810A010C8003E0078 +:10FA40004F8043B000C84132000F80032102C8023A +:10FA50003E104C80030120C8003B000CC003B000E6 +:10FA6000CC0432000F80030A0420000000000000D4 +:10FA7000280528008A802E800BA002F8048E00231F +:10FA8000B20EE082F9048A002E810CE00A3A80DA94 +:10FA90000022B608A00228008E002A800B600B0A04 +:10FAA00000400000000000002805440293812CC0A3 +:10FAB0004B3002C80083CA20E019B0068C008104D4 +:10FAC00044400834020D0083002A0008000A8040E8 +:10FAD000880020C00B30024B0050000000000000E6 +:10FAE000A001040297082DC00B6006CA00830921FB +:10FAF000C00A7002DC0085312D680930021C1493A5 +:10FB00002020C008F0429C028F0029400370122878 +:10FB10000040000000000000A808160096843DA0E8 +:10FB20000F78039A028780B1E00B7803B600C5A076 +:10FB300035610C78131E02C78029000C4803900021 +:10FB4000C48031600F58036A02000000000000000A +:10FB5000081DA400EA003E800FA003E808FB003E59 +:10FB6000800F9013E408F9003C502EF003E808FBE6 +:10FB7000403EC00B30136C00FB003E400F3003C210 +:10FB800006600000000000000005D600CD8033E0D4 +:10FB90000CF803FA00FD803FA00DF803FA40CDD029 +:10FBA000777E0CE8431E00CFD83FE00CC8033AC470 +:10FBB000CC8033E00CF8030000700000000000006F +:10FBC000A81194028D0021C0086003D81035208B45 +:10FBD000D40D6403D8C085002F4E0764029C02D761 +:10FBE000302F040DF10B5440AF0035400870022A4D +:10FBF0000060000000000000000094408418218094 +:10FC0000087002DA20B5000900087002D4048500EB +:10FC10006D4C8960025C4097006DC00940025880BD +:10FC20008488254008D00200002000000000000069 +:10FC30002014C6488000208008AC02A800B100A8AB +:10FC400088092202864281006C520B2002C752832F +:10FC5000002C000834826700A3802040083002088E +:10FC60000430000000000000A815A300CBC0B24083 +:10FC70002C9082E600BB80BE78088E02EE008D00DC +:10FC800027600D900A6F009F022E0009B403678061 +:10FC9000CA40E4C00C30032A0460000000000000E9 +:10FCA0008000E080FB223E400F8013E400FB803E9A +:10FCB000400F9003E500F9003E400E7023AC20FB9E +:10FCC000003EC08F8003E920F9083E400FB013E0EA +:10FCD00000300000000000000110F000C6003200FB +:10FCE0000FD1833440CF003D400CD003DE500D00D7 +:10FCF00073400CD1037C408702B3000DF403240051 +:10FD0000CE2032400CD00300443000000000000040 +:10FD1000810461228A0022000B8040250089C32EC5 +:10FD2000200A9803A100890036408894020F01AB95 +:10FD30000032C008040A2900A902A2400DB00A201E +:10FD400040100000000000008005000089002261D2 +:10FD50000B900225019B882E60088802E800B10202 +:10FD600024401890022C00AB0120C108B4422C00A2 +:10FD7000820022C008B00220004000000000000005 +:10FD800008040000010020400B000A044683012CF7 +:10FD9000401A000680008100244008200A0C01A3BC +:10FDA0000024000880020000A10020400930020267 +:10FDB0000100000000000000000D6002C8002200E9 +:10FDC0000F90022500DA003E400C9002CC00FD00AE +:10FDD00037400C10132C02AF0032C00DB0032C00C2 +:10FDE000CA0032404C900B0001500000000000009F +:10FDF000A01DF000FC003F0007C003F41CF4003F0E +:10FE0000001FC023B0029D013F408FC007FC02FFCE +:10FE1000007B000FC003F000FD003F400F7003E8BF +:10FE20000670000000000000C005FA00CB803F24EF +:10FE30000AC103FC24CD20370A0CC2833080DC02C7 +:10FE40003FCC0DD9033C58DF3033C80DF4233C4080 +:10FE5000FF003FC54FF023B000700000000000001D +:10FE60008000EC020B822E080DB702FD0083180AF9 +:10FE7000580A84A2A5A089302255081262BD908F2D +:10FE80006221D648F3023CC5BF482FD84BB702E0E9 +:10FE900004300000000000008805EC0083002E897B +:10FEA000280002ECA08922288208120228409A0821 +:10FEB00028C888B20A0D109310A0C82830024C0040 +:10FEC000B3602CC40B30C2E20170000000000000DF +:10FED000C015AC408B002E8008B102EC028B0020D4 +:10FEE000D00A9002AC000B0126400894028C008BD3 +:10FEF0000022C008B0022C10BB002EC00BB002F0D4 +:10FF0000046000000000000000148C20CB023E2D95 +:10FF1000088003EC08C9801E040CB00301085018C7 +:10FF20003E400C04032C00DB0132C00CB00B2C084B +:10FF3000BB003EC00FB00380047000000000000052 +:10FF4000E100BC00FF003F600FC023EC00FFC0BE1B +:10FF5000608FC923F650ED80B850AFC003FC00FF9E +:10FF6000003FC10EB003FC04FF023FC00FF003F8D6 +:10FF700000600000000000004010AC00EB00328088 +:10FF80000D90032C0089003E988C30036180FA406C +:10FF90003E402CA5032C00FB013CC02C30032C0060 +:10FFA000DB0232C00FB003D00420000000000000CC +:10FFB000CA002E808B82A0C08C90023C008BF02265 +:10FFC000C20D800227008B1022400880223C00BF17 +:10FFD000002FC008F0023C00BF01A3C00BF012F2DA +:10FFE0000040000000000000E0054C00B31C204071 +:10FFF0000800062C009B0020D00820024C00A30023 +:108010002CC008100A0C00BB0028C00930020C005C +:10802000B30020C00B3002F8005000000000000038 +:1080300022111E0097A021A00879021E009790210E +:108040006009E8223E00AF8421E4485C021E00B7CC +:10805000902DE00978001E09B39021E40B7802D836 +:10806000004000000000000048182C40B3B032402F +:108070002C81130C42D100B0C08C30034820E301A6 +:108080003CC00C30030C00F3103CC0CD320B0C4054 +:10809000D30030C00F3003D2020000000000000007 +:1080A0004015BC00E7003F800BF103FD006D00327E +:1080B000401F7007D841C3103BC00FD103FD00FF24 +:1080C000103FC00EF003EC10FF083FC30FF003D0C9 +:1080D0000660000000000000A815EC04FB023E4012 +:1080E0000BA003AC00DB0036800DB003AC00E80051 +:1080F00036C12E90032C00CBA036DC0FB0032D68C8 +:10810000FBA092C20CB103EA007000000000000066 +:1081100048119C0837002DC00BE0021D80B70423D6 +:10812000000A40021C18840025C01850320D80A39C +:108130003021CC0B34821C10B73021C8087002D219 +:108140000460000000000000C0009E20B7802D6089 +:108150000BFC229E008D8025A008F8229200B4809E +:1081600025E008F8021E0087B021E0097A021E18F7 +:10817000B38021E0087802F0002000000000000039 +:108180004804C520B3012CD80B3C022C08B90020B0 +:10819000030A00822208900D26E40810020C00A3B6 +:1081A0000022C00B30026C00B30022C0283002C293 +:1081B0000430000000000000E8059900FA023F903A +:1081C0000FEC23A800DA0035800DE002BA02FEC2EF +:1081D000B6A00EE40B2800CA00B2800FA00B280046 +:1081E000FA0032800CA003FA0460000000000000D6 +:1081F0004800E000F8003E000F8203E000F8003E77 +:10820000000F8103E040E8103A004F8483E000F85B +:10821000003A000F0003A000F8003E000F8003D2D8 +:1082200000300000000000000800E500C9023E40E8 +:108230000F90232400C90032682F10032400E91492 +:1082400032400D900B0400D9001E400C9003240016 +:10825000C90036400C90030204300000000000000A +:108260008014640089012E404B9012240089C2A220 +:1082700060889003640089C1A240481603640289A3 +:10828000002E40089022240089003E4028900A20B9 +:1082900000100000000000001804240089022E4095 +:1082A0000B1002240089102240899002AC00A10822 +:1082B0002240099802A40089002A40089002240064 +:1082C000890026400810020600400000000000005F +:1082D0000800240081002C410B120204818120221D +:1082E00048081202C481812402480A900284A081B5 +:1082F000286C4A0812D204A181282C4A0812820252 +:108300000100000000000000B8086140C8002E1401 +:108310000F850B2142CA5022140D8543A140E8501D +:1083200030000D8502A1C0D8203A082C820B208293 +:10833000C82034098C82032E035000000000000086 +:10834000980DFC02F9003F404FD103E440F514BF03 +:10835000440D51235C40F5101F4E4D50036408F945 +:10836000283E4A8F9283E4A0F9283A4B0F9283E685 +:1083700006700000000000000805F440FD003040D9 +:108380000C90032400DD003B400E900374005D0060 +:1083900036640DD000A600F94032780C99032440D1 +:1083A000C99032500F9B03060070000000000000CF +:1083B0003810E280B800220108800A200088002AD4 +:1083C00000088002200088002220088A8BE100B883 +:1083D000802230280D022200D8E422280B8F0A0EBA +:1083E00004300000000000000805C480B100A04077 +:1083F0000810020400890008400A904244009100DD +:10840000205828900285008120A04C09120A04807F +:108410009140A0400B10020201700000000000001B +:108420001815A400B9022040089002040089012216 +:1084300040289022040089102240089002E400B1F4 +:108440000022408190020400910022400B9002061D +:108450000460000000000000A015E500F10032609B +:108460002C92132402D1103A400E12036604D90054 +:10847000B6400D1903A400F9003240099001240010 +:10848000D90222400F900328047000000000000071 +:108490002A01A500F9003E640F1003E400F9813EB3 +:1084A000668F9023E480F9043E408F9003E404F942 +:1084B000003C400E9003E400F9003E400F1003CA58 +:1084C00000600000000000002A10A000F8243E0018 +:1084D0002C84032000B8203E008C8003A000708212 +:1084E00032000F80032008F80032002C800B200897 +:1084F000C8003E000C8003CA0420000000000000F9 +:1085000028052804BE803A8008A00228048E006D49 +:10851000900DA0023A008E80A2800EE00B6800BA97 +:1085200000228008A0022800DA002E8008A002CADB +:10853000004000000000000028814C00B1002CC069 +:108540000830020C18A3022C108830068281A0008B +:108550002AC00B300A4C00B30020C01AB0028C01B4 +:1085600083002CC0083002CA005000000000000048 +:1085700020011C10B40A2BC80831261C0086002DCF +:10858000C00972021D00A54029C00A60025C88B3C0 +:108590002025C80A72029C8097202CE8807202E88D +:1085A000004000000000000028081600B5803DE2F1 +:1085B0000C7A8B0EC0A7812C200CFC039202EF805A +:1085C00039E40BD8011F00F780B3F48E79038E00D5 +:1085D000C7C43DE82C7B03EA020000000000000055 +:1085E000081DAC00F8003EDD87B603EDCCE9003E87 +:1085F000400FB007CC100B0036D80F8043AD80FB86 +:10860000283AC00DB4036CE2EB603ED40FB003C255 +:1086100006600000000000004005FE00FE903FE5FF +:108620000EF8033E10FF9017600FFC037A00EE80F7 +:1086300037E20E780FFF40EF881FE00CF883FE80D2 +:10864000CFD0B3F00CF8C3100070000000000000A1 +:10865000A8119C40B4100FCC0072021C00B6020995 +:10866000C028F0029800A60021C00B6003FC02871E +:10867000002DC0087002DE008F1021C008F0036AD0 +:10868000046000000000000080009400B6022FC2C9 +:108690001A30801C00B60801400AF002180087005A +:1086A00021C00BD0029C10870029C0087002DC4456 +:1086B000871064C00870020600200000000000005F +:1086C0006014CE60B0002CC008340A0C08B004005E +:1086D000400830A28980A26220E00B000ACC088307 +:1086E000006CC0083052CC00830024C0083002580F +:1086F0000430000000000000A815AE00F8003FD0D4 +:108700000EFC033C00F90092840FFC03640080001F +:10871000B7C30FB883BC04EF003FC03CF003FC02BA +:10872000CF0037C028F0132A0460000000000000CA +:108730008000EC00F8413EC80F3203EC00F8003A2C +:10874000C40FB103C400F90036C00FE40BEC04FB06 +:10875000003EC10FB043EC04FB003AC00FB003E48D +:1087600000300000000000000110F400FC803FC059 +:108770001FF0033C08FB0033802EF013A404CB0051 +:10878000B9C02CD80B3C00FF003FC00970002C047E +:10879000FF003FC00FF003C00430000000000000E5 +:1087A000C1006C00B8802EC00BB0036C00B9162855 +:1087B0007208B0222740DB0022C008BD822C08BB13 +:1087C000002EC048B0022C00BB002EC10BB002E04E +:1087D000401000000000000080052C00B8602EC092 +:1087E0000BB0022C00B1002A844A3022AC209880C1 +:1087F0002AC0083002AC003B002CC00AB002AC0812 +:10880000BB002EC00BB042E00040000000000000A2 +:1088100008040C01B0002CC00B30024C04B0002A3C +:10882000800830020000100428C00820428C00B3E9 +:10883000002CC042300A8C00B3002CC08B3002C226 +:108840000100000000000000000D6400F8503FC06F +:108850000BF0033C00FA0432800EF023AC00D90088 +:108860003BC00C9003BC04FF003DC02EF00B3C004D +:10887000FF043FC00FF003C00350000000000000E1 +:10888000A01DFC00FC003FC007F003FC047C02B507 +:10889000000FF003F000FC0037C00FF0137C00FF66 +:1088A000003FC00DF0036D00FF003FC01FF003E864 +:1088B0000670000000000000C005D200D580330A19 +:1088C0004CF803F200FC0037261FCA03BCC4CF20BB +:1088D00033E40F78033E44CF003BCE9F6813D000B3 +:1088E000CD80B3600FFA83F0047000000000000038 +:1088F0008010E080C928223008B222EA01B8822024 +:10890000504F9C00A8D1DB10A6E017B803EC80DB29 +:10891000081FD00BB802F600FB8022400BB00260AB +:1089200004300000000000008805C4208180200081 +:108930008B3082C000B01028088B1130C48490287E +:1089400024C80B30024C00831004C80B3002CC004A +:10895000B30024400B3002E2017000000000000070 +:10896000C015A600810022100BB012EA20BB002A1D +:10897000700A9C026200988826C802B2028E088B98 +:108980001822C00BA002EE203B0026400BB0027064 +:1089900004600000000000004015E000CB003280C1 +:1089A0000FB003E700B8523E204B0C43EF829BC050 +:1089B00032C00BB0026C018B802EC00BA083E6008E +:1089C000FB0036400FF003D00470000000000000F0 +:1089D000E001B002FF043F900CF101F4087D803704 +:1089E000000FC0239800F7002BE00FF823FC06FBD4 +:1089F00083BFC087D003DC00EF003BC00FB001F89D +:108A000000600000000000004010A600CB00338092 +:108A10000FB003E110F240B2003D94172D44FA412B +:108A200032C09FB0232C02CB4032C04F90033D0098 +:108A3000CB003E400FB003100420000000000000F7 +:108A4000880526008B7120D5039902E000BB8022A7 +:108A5000601C80036000B80222C20B32022C018F1E +:108A600002D7C00BA0036D4053802EC00EF043729E +:108A70000040000000000000E005680280002400C3 +:108A80000B3526C200B09020C08800024F20B302F0 +:108A900060E21B38020C00880060C00B34824C027C +:108AA000A1902C400B30023001500000000000006B +:108AB00020013A088CA02D204B7802DA00B29021D8 +:108AC00066487902DE40B791A1E0DBF8021E4084DF +:108AD0009001E08BF9025E0197802D600A780048D2 +:108AE000041000000000000048080C00800024046E +:108AF0000F3203C4A0F14230C42C31024400F11102 +:108B0000A0C00B300B0C42830000C00F30034C029E +:108B1000E3003C400B3001120200000000000000A6 +:108B2000C01DBC00FCA533C00FD003FC01BF003F3B +:108B3000C40E7103740075103FC005F003DC40FFE4 +:108B4000043FC00FF043FC007F003F400EF003D015 +:108B50000460000000000000A804E800F204B380F4 +:108B60000FB80B2C00EB8032C00C20132E08CB0169 +:108B700032C50FB103EC48C81032FA8C38033C9070 +:108B8000CB003E400FB013C2047000000000000094 +:108B9000C8109800F60061810BF0021C00D700B7E6 +:108BA000800C7002BC108F0021C88B7243FC88DCE3 +:108BB0000037C80D50021C2287002DC00B7002D355 +:108BC000046000000000000080009E00B680A9A0A4 +:108BD0004B7C025E30A38821F00878021600858065 +:108BE00021E00B7802DE008780A1E408D8024E0065 +:108BF00097802D700B7802C8002000000000000054 +:108C00004814EC00B20028C00B10024E90930222D0 +:108C1000F00838428C42830422E44B38028E4083B1 +:108C20000020C00938224E2193002EE00B3002DBD9 +:108C30000430000000000000E815A801FA003B899C +:108C40000FA0027808AE4023802C6C0B3A008E8C6B +:108C5000B2000B8082E0028E0022800CE8027B8052 +:108C60009A803E800FA003FA04700000000000000C +:108C70004800E009EC0036210B8013A100F8603EAB +:108C8000000F8103E000F8003E000F8043E010F881 +:108C900000BE000F850B8000E8103E000F8003D25D +:108CA00000600000000000000810E402C902304823 +:108CB0000C9913A402C9003E420C908F2400F900C5 +:108CC00032280C8803E000C900B2400F9003E7008F +:108CD000C9103E400C1003020420000000000000F8 +:108CE000800464018980A248289242C50089402EF0 +:108CF000402C90062500B9002250089802C4008933 +:108D00000176404B9202E50289002E400D900360EF +:108D100000100000000000001805240C8520A2406F +:108D2000089006E50089402E40099042A4A0310039 +:108D30002250189102E400810022400B9006E400CA +:108D400089002E400990020E004000000000000043 +:108D50000004150085402040081426E40081002C02 +:108D6000401810028480B120A050081402E502814E +:108D70004020480B1006CC0081012C500914024AF7 +:108D80000500000000000000B80D60008C003200FB +:108D90000C8023E000C8003E140D8012A144F8515D +:108DA00032002C8003E000880422140F8007E000CA +:108DB000C8003E000D80032E03500000000000009C +:108DC000989DE400F9003F500FD003DC01BD423F05 +:108DD000504FD4437441FD103F101FC413F100FDE8 +:108DE000407E440FD043F501FD003F400F9403E661 +:108DF00004700000000000001805F400DF05336176 +:108E00000F50533410FD0433444F500376C1CDE06E +:108E100033600CCE03F6C0E1C0B6648F500B3682CF +:108E2000CD003E444C9EC3C601700000000000000F +:108E30003810EA2880A0B2040B8A836000FA00365A +:108E4000288B8003E3C8C8842214088A02E280D8F1 +:108E50008234341B8003600488002E200A8E42CEA8 +:108E600006300000000000004805C480810804416D +:108E70000B92020400B1002C400B18022400B160D8 +:108E800026400A1602C500A1C020480B90024700E8 +:108E900091012C48181202D201600000000000006D +:108EA0001815A40C8B04A2500B91022404A9012EC6 +:108EB000420B9002A400A90026600A9002E60081FD +:108EC0000022408BB002240899102E401A9002C64E +:108ED0000020000000000000A015E500C900364099 +:108EE0000F10022500B1002E600F10122402B9A04D +:108EF000A4402E9103E600A90022400B19806404CF +:108F0000D9812E404C9003E814700000000000004E +:108F10006801A40AE900BE480F980BE400F9C436C2 +:108F2000701F9203E690C1903A408D8803E400F9E7 +:108F3000903E400B9803E640E9003E400F9003D27C +:108F400000600000000000006810A102D820B210EC +:108F50000C80832140C858B2104C800B2000F8428E +:108F600032000F8003E002D80072001C8000200055 +:108F7000F8043E000F8003020420000000000000FF +:108F800028053804CE41238008E0023910AE402283 +:108F90008008E0021A00BA002BAD038002E800CA84 +:108FA000002A800AE0021800BA001A800BA0034AC7 +:108FB000004000000000000068056C128900A0E07D +:108FC0000838020D88830004E00838320E2531018C +:108FD00024E08B3802E401830020C00830028C00BA +:108FE000B3002EC00B30020A005000000000000049 +:108FF000A0011420862029B008F0823E04A7002199 +:10900000708870921C20BD0069C00B7602D4808FDE +:109010002129E00A60869801B7002DC80B3B026049 +:109020000440000000000000A8083E00C7A0B0E017 +:109030002C780B1A00C38037E02878031A08F590C3 +:1090400035E00F7C12D682C79021E40878039E0099 +:10905000F5803DF10F7803220200000000000000BF +:109060000819A400EE8036C14FD003C800FB003EB3 +:10907000510FB003E408F1603EC00FB003C500EB30 +:10908000103EC00FB0096C00FB003AC00FB003C225 +:1090900004600000000000000001FE00FD88336055 +:1090A0000FF903CE40D78437700CD8233600C5881B +:1090B00033E04FF813F728DF8037E20C58033E0007 +:1090C000FF903FE00CF803000020000000000000CB +:1090D000A9119C08F600A1000B6302D6308541312E +:1090E000C80850231C00D520B1800F7003B400C7FE +:1090F0000021C00F40A35840B7003FC40AF0022A25 +:10910000062000000000000000009C40B71021D2A3 +:109110000B7002DC42860025610851025000950068 +:1091200025C0097082D400870024C00850025C006A +:1091300095042DC00870020000200000000000000F +:109140002014CC08B2D020E04B0802C4008080205C +:10915000F0081A028548811020400A3002C6109398 +:109160000020C00A1C020D40B30068C40AB0020906 +:109170000030000000000000A815AC01FE0032F035 +:109180000F8803E600C8C836F628A60A6D009D00C1 +:1091900032000BB003F603C70037C0089C0A6E000C +:1091A000BB002FC00CF0032A046000000000000088 +:1091B0008000E401EB403E804FC103E400B8083A70 +:1091C000408FA4136C20F9003E700FB003A440EB55 +:1091D000003EC00F9223E800F9803EC00FB063E06C +:1091E00000300000000000000110FC08CE0833C071 +:1091F0000FDA033000E40435C00DA0032800C500D9 +:1092000033000BFA03F403CB0031C00CD403142059 +:10921000CD8023C10CF002084430000000000000A3 +:1092200081044410CBD022C00B94022284B8C60221 +:1092300040082802A580890022600BB80264008BD8 +:10924000002AC0C800036600810000C00DB00AA853 +:10925000401000000000000080052C001300224098 +:109260008B24022A00BB82224000AC0284008900C9 +:1092700022220BB002C4009B002AC008B0022E00BC +:109280008B102AC008B002A01040000000000000AF +:1092900008040C10830020010B20020080B1002084 +:1092A000C108200288018100A0000B300244019B0C +:1092B0000028C008B002480689002AC0093002828E +:1092C0000500000000000000008D6C00C300B2C06B +:1092D0000FB0032820FA00B1400DA007A000CD0078 +:1092E00022000FB003F4009F003BC02CB00B240001 +:1092F000C900BAC00CB00380035000000000000099 +:10930000A01DFC06FF02AFC00FC003F010FC003F21 +:10931000C09FE013F000FD043F404FF0037400EFE6 +:10932000003FC08FE002B401FD0437C00FF0436876 +:109330000470000000000000C005FC00C720B3C896 +:109340001CF1037C20CF0A3FD00DF0037C808F32CC +:1093500033C40FF1833CE0CF1033C40DF2833CE201 +:10936000C78017CC4CF38330007000000000000071 +:109370008010E3408868223008060201A188C40EEC +:109380001408878001C0285002048B8602A19888A7 +:10939000412A040A8482BD808B082BC488F40360B0 +:1093A00004300000000000008805CC088240201036 +:1093B000082112440482042C0889900244218B0065 +:1093C00024888BA00040848930224888B002CC08D1 +:1093D0008820A4C800320A220170000000000000AA +:1093E000C015A000890022C1889062280889082E33 +:1093F000C008A0022808A80026420B9002CC508A80 +:10940000222A860A8002EC0088842AC108B026300D +:1094100004600000000000004015F002CF0033C0DF +:1094200048F84379008DC03F308D60837860C45820 +:1094300037200F58137B02CCC431200C4403EC02BC +:109440008B8036C024B012100470000000000000B1 +:10945000E0019C00F4103D006FC913D412FE903F50 +:10946000F00FDA23F414FF023BF00FEA23B600FFFB +:10947000823FE18FF403BC00FF003FC0AF7003F8F0 +:1094800000600000000000004010A000CA00320888 +:109490001CA003A520CB40BA101FB003AC00EB000A +:1094A00072900CB4032904C95232500CB4030C005E +:1094B000F84032C10EB00B50042000000000000044 +:1094C000C8052D80898022D90890222A008854223C +:1094D000C08B80222019C80022408D801A2410D20F +:1094E0004422810D80037C00B00037C088F0023236 +:1094F0001040000000000000E0054E008100A0F0D8 +:109500000890028902800022C00B0022A000B00057 +:1095100020400800020400826020800800020C083D +:10952000B20022C0083002380050000000000000E5 +:10953000200103108E902324086B0216608F802177 +:10954000280BF9061E408F8023A44979023A409DDA +:1095500090236409F8025E40BE9024E42879020852 +:10956000004000000000000048080C42C009300024 +:1095700028020384008A2030C48B11038450B30076 +:1095800020C00CA4220400CB4030C50C30030E4098 +:10959000F31030C40CB00312020000000000000001 +:1095A000401DB004FB043DC00FF243F804FD013F31 +:1095B0000C0F6103F848F4003D010FD003C800FC14 +:1095C00004BD040B4803FC18FF143FD50DF00390B5 +:1095D0000660000000000000A805E000F90132C0AC +:1095E0008E90032802D10032C00DA80B0800E800BD +:1095F0002E400C980B2E02CA00B2A06C80232D8046 +:10960000CA8032D00CBA032A0070000000000000AB +:1096100048119C00B600A3000860020400860429DB +:10962000000850421404A7000D804A600200008127 +:109630000021400870029D42860120C0083282123B +:109640000460000000000000C0009200BC806320A5 +:10965000820802520084C22320880C0233008480D6 +:109660002F21894C02121494C56421084C020E80EB +:109670009782A1EC08790230002000000000000071 +:109680004814CD44B30020C00830024D8003882820 +:10969000C0083C060F00A3432CC21B38020F009BDE +:1096A0008864D008B8028C10930020C008300A12D9 +:1096B0000430000000000000E815AA00FA0532801E +:1096C0008EA00B6900CA4032A03CA8032A00EA26FB +:1096D0003EB00DA1632820CA4036A00CE013280933 +:1096E000DE0032802CA0033A04600000000000007D +:1096F0004800F020F4003F000F4023B000EC003F92 +:10970000061EC213F088FC203F048EC003F080ECDC +:10971000403B0C0FC0A3E000E8003E004F8003D2A6 +:1097200000300000000000000810E400F9003240A2 +:109730000C90032400C98032400F9053E410C900FC +:1097400032400D9003E400F90036408F900324105E +:10975000C9013C400C9003C204300000000000002E +:109760008004474489002040089002250A81102285 +:1097700040489003C40089007640289002E410B964 +:1097800040B2400B9003640089002E41089042E0F3 +:10979000001000000000000018052402BD0023484E +:1097A00008D0061D048D0029C04AD022F40085008F +:1097B000614018D012FC00BD40A3404BF0020401F0 +:1097C0008B002E40089002C6004000000000000000 +:1097D000080436808520A34808520A148185202970 +:1097E00048085202B48085202548885202D480B5AA +:1097F0002021480B520244A281002C4A081282C246 +:109800000100000000000000B80D6000F8512200C7 +:109810002C85022148C800BA140F8512E142C850B5 +:1098200022000C0003E000F85032000745032080BE +:10983000C0013E082C8203EE03500000000000002F +:10984000980DE440F1103E44079143E458F9113477 +:10985000444F9102E450F9103C4F0F9383E4F0F928 +:10986000113A4F0F9103E4A0FD283E4A0F9283E680 +:1098700006700000000000001805F6A0CDA0B36837 +:109880008C9A033680C5A022600C9A232604F9A086 +:1098900032660C9A830620C5A022600C9B032648E2 +:1098A000C9003E780C9A030600700000000000001A +:1098B0003800E10088442295088512A142884002C0 +:1098C0009008840223A0BA4022A0088E92A3A0A8E8 +:1098D000402A1008AE02234088002E380884120E59 +:1098E00004300000000000000815C4008B12224064 +:1098F00008900244008140A05008110A0500B110F0 +:10990000A04808900204008140205028110244829F +:1099100081002C50081102020170000000000000BC +:109920001815A40289402240089412A50089282213 +:10993000490894022448B9142240089402A440A182 +:10994000502A50089142640089402E4008100206B7 +:109950000460000000000000A015E400C9003070A1 +:109960002C100B6600C94032500C90032620F9C021 +:1099700032700C90032620C90032400C9C03640016 +:10998000C9413E402C900B280470000000000000EC +:109990002801A400F9043E480F9003E488F900343C +:1099A000412F9C03E410F9003E442F9903E410F981 +:1099B000003E500F104BA410F9203C400F90034A7A +:1099C00000600000000000002810A000C8003E1049 +:1099D0002C80032002C04032001C040F2100C00470 +:1099E00038000F80032108C86030100F800220006B +:1099F000F80032000C8003CA0420000000000000C0 +:109A000028051A2082042F8008A00238008E8022A8 +:109A10008008E00228008A0022810B20022800DE54 +:109A2000E436800BA0422800BA04228008A002CAB3 +:109A3000004000000000000028054C0083012C803D +:109A40000830022E608290A0C04830020C028300D1 +:109A500028C00B300A2C0083C220C00B302A2C00F7 +:109A6000B300A0C0083002CA00500000000000008F +:109A7000A0013C0087012DC208F3123C008F012198 +:109A8000C86872221E04872021C40B70023C849F88 +:109A90000025C44B70021C04B78121C8087202E87B +:109AA0000040000000000000A8001E00C7813CA08C +:109AB0004C7A0B1A00C68030E008F8820E40CFF0D6 +:109AC00039E80F3A031E20C78031E30F38231F08FF +:109AD000FFC033F20C7E03EA020000000000000029 +:109AE0000815880A7B003EC10B3423C810FB023ED8 +:109AF000CA0FB743EC80FB002EC20BB483EDD0FA43 +:109B0000003ED90FB383EC80BB203ED82FB403C2F4 +:109B100006600000000000000005FE00F59131A085 +:109B20000CFC03FE00C48131EE8DF80A3E30CF8478 +:109B300033E02CF883FE10FE8033E00CF9193F4827 +:109B4000CFC033E004FC03C0007000000000000040 +:109B5000A8119C08B7A121C8087102F0A085202196 +:109B6000CE0870023C808F002BC5087102DC10B457 +:109B70000021C10AF3820C00870129C00871026A22 +:109B8000046000000000000000009D00BD2127824D +:109B9000007002FC048C00A7CCA870023C08AF0047 +:109BA00021C0087002DC00B70021C40870161C0A2E +:109BB0008F0021C0087002C00020000000000000DB +:109BC0002010C800BB4424E208B102C280018024F6 +:109BD000D08830020F52839128E4883D02CED0B065 +:109BE000B2A2C00A34120C02830028C00830024816 +:109BF0000430000000000000A815AC00FB01E440A8 +:109C00002CF043E5008A8837E000FA023D00EF00BF +:109C100033D10CF403FD00F94033E80CFC013C04A3 +:109C2000CF0233C02CF003EA046000000000000003 +:109C30008000EE08F9103AD00FB093EC00FB0B3A1D +:109C4000C08EB083EC80FB097EC80FB213EC00F924 +:109C5000003EC28FB24BCC04FB003EC00FB003608D +:109C600000300000000000000110FC00FF0833C0BD +:109C70001CF0037040C4C033C20FF0031C10C700B7 +:109C800031C00C70031C00C54133C00CF0232C0004 +:109C9000CF00B3C06CF0038044300000000000002F +:109CA00081046A00B99032F108B0020A10D900228A +:109CB000C10BB0022C00CB0622C088B0122C008849 +:109CC0008022C10DB0022C00830022C108B046E002 +:109CD000401000000000000080012E00B90022F0BA +:109CE00008B01264008A0022C00B30422C008B00A6 +:109CF00022C008B0022C008A0022C088300A2C0042 +:109D00008B0020C008B002E000400000000000000E +:109D100008040C04B102E4C108B022200293002020 +:109D2000C00B30120C028302A0C028300E0C02803F +:109D300000A0C049300A0C028B0020C0083002C2CB +:109D40000100000000000000000D6C00F92432C08A +:109D500008F0036400C800B3C01FF00B3C008F0084 +:109D600033C04CF0433C08C30031C00CF0033D4805 +:109D7000CF0031C00CF00380035000000000000051 +:109D8000A01DF004F9413BC04FF003F011FD003F6E +:109D9000C0877027FC00EF063FC00FF002FC08FCF4 +:109DA000003FC047F043FC0077003FC00FF003E8DE +:109DB0000670000000000000C005D200C701370C8B +:109DC0000FE823104AC4C031300CC9033446CF1009 +:109DD00033D00CF4033C58CF0033C02DF1033E02C6 +:109DE000CF213FE40FF203300070000000000000BC +:109DF0008010E4840B40224C0BA8022CC08B202244 +:109E0000C84A32022480832020C008300220008B00 +:109E10002132CA4832022C308F902E880BBD12207E +:109E200004300000000000008805CE20A340E04878 +:109E30004B20220C0282002A00082002048080208D +:109E400020C80802020C00800C60000820122C8838 +:109E500083002CE80B30026201700000000000005B +:109E6000C015AE00AB01A2600BA002200181002250 +:109E7000C00A901204208A0822C108A00228008883 +:109E800000244408A202AC008B042E8803B00270A8 +:109E900004600000000000004015EC00EA90322849 +:109EA0000FB6032008C9043AC04C90222400CB40CE +:109EB00032A80CB2032C00CB80B2E00CB00B040033 +:109EC000CB003EC04FB00B500470000000000000FB +:109ED000E001BC00DF803B810FF0C3FC00BE011F2E +:109EE000000FE023F400FF003FB04FF043D402FF27 +:109EF000913AE04EF0037C0CFF002F800F3003B846 +:109F000000600000000000004010AC01CA00725068 +:109F100004B4032C82CB0032E00CB8032704C8C879 +:109F2000B2A20C88032C00C1003E002C301B2C0474 +:109F3000FB103EC00FB00310042000000000000022 +:109F4000C8052C040350A2E00834423300880020E6 +:109F5000100D840325008A40229008A5022C008958 +:109F6000A43A4008B0022C00BF842E800BF052327D +:109F70000040000000000000E0056C808180248823 +:109F8000893C2621009000200208808200209B004E +:109F9000224088B0120C0883802CC00810020C00EC +:109FA000B3802C400B30023800500000000000004D +:109FB00020013E0A85A0A56008FB823E849F816344 +:109FC000E089791252809782216C187802120087FA +:109FD000A129E0085B021E00B7C02D600B780208C3 +:109FE000004000000000000048080C00810826C264 +:109FF0002C32130EA4D200B0001C21122402D12056 +:10A0000030C80C10030C00C2103C800C23030C4021 +:10A01000F3003C480F300B1202000000000000006B +:10A02000401DBC00FD20BB40077202F010ED103F48 +:10A03000C40FD163B480EF003FC80FF003D800FE17 +:10A04000343FC40FEB43FC00FF087F400FF183D087 +:10A050000660000000000000A805EC00C800338086 +:10A060008F28032000490232C00F90032000CB004C +:10A0700032404CB00B2C00CB8032C00E9E0324002B +:10A08000FB203EC00FB0032A00700000000000005B +:10A0900048119C008D0121C00B60021D00D60021DB +:10A0A000000BE00200008304204008704234028765 +:10A0B0000123C028510A1C04B7302DC00B72039233 +:10A0C0000460000000000000C0009E00A64021A027 +:10A0D0000B68020E008F8021E00B78021610A5801D +:10A0E00021E00818021E00838021A00878021F00CA +:10A0F000B7802DE00B380230002000000000000087 +:10A100004814EC12A16420E60B20020010904A20B3 +:10A11000204B00420400830020C20830028C0083E0 +:10A120000420C00830020E00B3002CE04B30029235 +:10A130000430000000000000E815B800EEC03390C5 +:10A140000FA01B0800CA40B2820FA00B2802CA0051 +:10A15000B290ACA0032900CA40B2808EA4032A00AA +:10A16000FA003FA80FA00B3A0460000000000000B6 +:10A170004800E20290003E000F8803F100FC023F1D +:10A18000200FC803C100F0003E008F00016002F8FC +:10A19000083E000F8083E000F8002E008F801392AD +:10A1A00000300000000000000810E402C900B264A2 +:10A1B0000F9103E404C90032406C90032502C9905A +:10A1C000B0400C90032420C9A03E404C9023E400F2 +:10A1D000F10092400C100302043000000000000067 +:10A1E000800464008980A2400B9642E50489002225 +:10A1F00040089002240809412240489042240489E2 +:10A20000802640089002E400B90022400894022011 +:10A2100000100000000000001805250089202240E1 +:10A220000B9002F4848500214048500224208D08C0 +:10A23000234008D00294008D0029400AD002A408CF +:10A24000B90028401890C20600400000000000003D +:10A2500008040500810020510B1002F58085C1A182 +:10A260005008540A050685402150885402950085FF +:10A27000442D502A5412C501B100085008100202A2 +:10A280000100000000000000B80D6000CA503280DC +:10A290000F8003E802C80132002CC0032000C8026E +:10A2A00032002C800BA000C8003A004E4023A008CA +:10A2B000F8003A002C800B2E035000000000000034 +:10A2C000981DDC04FD403F504F9063E440F1023E96 +:10A2D000410F9013F504F9413E500F94436502F984 +:10A2E0004136504D9403F400F94137404F9403E652 +:10A2F00006700000000000001801FC00CDA83370BB +:10A300000FD013F688CD0032504F142307A0C9C0D8 +:10A3100032780C9E033702CDC032640F98032400BC +:10A32000CD0032402CDA030600700000000000006F +:10A330003810E20888EB22300B8012E804A0A02A33 +:10A34000200B8A0A23008880222800C842238080AC +:10A35000D420280980022294A8002A008885020EB1 +:10A3600004300000000000000805C4A0830024D8C9 +:10A370008B1002E514890A21480B52025480854053 +:10A3800025580956024502812020500B1402043042 +:10A39000810020400810024201700000000000000F +:10A3A0001815A4128900A6400B9042E498A9802BAE +:10A3B000400B510255009D08274809F602440081D0 +:10A3C00004224019918A2480A9002A40089002465C +:10A3D0000460000000000000A015E702C904365820 +:10A3E0000F9003C500C90032400F90136402C900EA +:10A3F00036402D900B6604C9E0B2488F9847240080 +:10A40000C90072400C1003680470000000000000D6 +:10A410002801A508F9213A400F9003E604F9003E0F +:10A42000404F9883A400E940BA600E9003A480F9DD +:10A43000A33E480F980BE400F9001E400F90038ADA +:10A4400000600000000000002810A248C820320868 +:10A450001F8083E122C80133002CC0033004CC40AC +:10A46000B1000C44032012C84132002D840B60005F +:10A47000F800B2004C800B0A04200000000000002D +:10A4800028053A00A600239003E492F800820036E3 +:10A490008008A0036800CA00228308A00228038A5B +:10A4A00000228008A0022800B68022800DE8020A5F +:10A4B000004000000000000028056E00824220C01D +:10A4C0000B3402CD09800020000800020002980031 +:10A4D000202028000A0410818020C008B0022C002F +:10A4E000B30022C01831020A005000000000000032 +:10A4F000A0013802A30021401B7002DC2084056506 +:10A50000E008F0027C10970024C0083002548887CD +:10A510000921E80933021C80B60863C809381228EB +:10A520000040000000000000A8081E00C7A0A1E035 +:10A530000B7803FE00C58233200C48031E01DF8028 +:10A5400031200C48030640878231F80D7B035F0001 +:10A55000F38031F20C60032A0200000000000000CA +:10A56000081D9C00FB012F4007B003E804F9003EE2 +:10A57000C10FB003E006E8023AC00FB001A410F921 +:10A5800040BED006B003EE00FA003CD80FA003C2D4 +:10A5900006600000000000000005F600CF8833646C +:10A5A0002CF803FE02C4B033208CD8033200CCB4A4 +:10A5B00033A00CC8031620CFC033F00CF803FE0004 +:10A5C000CD803FE00FD803000070000000000000C5 +:10A5D000A811B5048712A1500A7412C44084112333 +:10A5E000C028E0021C02A711215848700A14008DEF +:10A5F0000023C00B7002FC4086002DC00B50022AC5 +:10A600000460000000000000000095008740210069 +:10A61000187102DC009528E1020850023C42A72292 +:10A62000218088410214008500A1C0097102DC006C +:10A63000B5102DC00B4002000020000000000000FB +:10A640002014C41083842011083002C310912020EC +:10A65000C00828120000A08420400830020426838D +:10A660000020D00B3002CC00B2002CC00B0002083E +:10A670000430000000000000A815AD00CF88B2E84B +:10A680000C3013CEC2D08232000C0E0B2000C888D2 +:10A69000B2402CBA433702CB00B3C02CF003FC12FB +:10A6A000FB007FD10F300B2B046000000000000086 +:10A6B0008000ED02F1403E410FB023ED00E8013E85 +:10A6C000C80FB013EC04DB003C800F0403E440F936 +:10A6D000003CC20EB003EE004B413EC00FB003E0A1 +:10A6E00000300000000000000110FC004B0032426E +:10A6F0000CF0033680CD0033004CC0833C04F700DF +:10A7000032400CB1431400CD8033C00CF003FC0088 +:10A71000FF00B3C20CA003004430000000000000A2 +:10A7200081044F028B80203008BC02201089002257 +:10A73000C000B0036004B800A290288C1A24028BD9 +:10A740008322C108B002FC00B36020C00DA003E06A +:10A75000401000000000000080052E00ABC0226009 +:10A7600008B8022900880120000890022000B800E3 +:10A7700022C008B002E4008124A2C009B046EC0067 +:10A78000B90022C008900220004000000000000034 +:10A7900008042C00A100A04108B00A205388002022 +:10A7A000C028A0024C00B30020008800028400836F +:10A7B0000420C0283002CC00B30262C0091002C2DB +:10A7C0000100000000000000000D6C00E900220004 +:10A7D0000CB0030004C900B2000C90032C00F3007D +:10A7E000B2C08CB003B4028F0023C004F003EC08A5 +:10A7F000F90033C00C80030003500000000000008B +:10A80000A01DFC10DD043F000FC023F090FD002FC1 +:10A81000C00FE043D000FC003F008FC0227400FD59 +:10A82000043FC00FF003FC00FF063FC00FC043E829 +:10A830000670000000000000C005FC80EF2011C081 +:10A840000E7203BDB0CF31BFCC02F003FCC6CF0106 +:10A850000BC50FF1033C04EF6133D807F0033480DC +:10A86000CD3073CC0FE80330007000000000000012 +:10A870008018E90088692210088C00218488412210 +:10A88000108886920100886222104B870221A088DE +:10A890006020100B86A235A0AB60A1C40BB80220CB +:10A8A00004300000000000008805CDA8334120C618 +:10A8B0004A31008C10933328CC2934128C50931CCD +:10A8C000288401204A4C41831024CC4B31424C4017 +:10A8D000911024C00B8002220170000000000000D3 +:10A8E000C005A820900222000880002030B8082669 +:10A8F0000001808220201808424003910260000875 +:10A9000001A6000B80006C10BB0126C04B900A30E2 +:10A9100004600000000000000011FD00FD4133A1B3 +:10A920000ED203B502DF423B010FD443B500CD4048 +:10A930001BC40D78037002EC0017A10FE80B2C026A +:10A94000D99026C00FAC0300047000000000000086 +:10A95000E001B800EE001F644FE003D810C41833C4 +:10A96000C00CA0A1B809E60936220F8823BC00FB61 +:10A97000003B640FD9039C00E3043BC00FF403F8D1 +:10A98000006000000000000040108D00C940B6804B +:10A990000F1003A720FB50B6084C14036522D940C2 +:10A9A000B6800EA00B0000D800768228A023640099 +:10A9B000C90412C08E800390042000000000000033 +:10A9C000C8052B608A09205008A023E900B8C022DE +:10A9D000F008AC0228048AC222500890062C008B92 +:10A9E000042251089402E4048B0437C0081842265C +:10A9F0000040000000000000C0044B0082C8244357 +:10AA00000B260A8800B08022E40B20426900A29045 +:10AA10002840E810020C00BB002850889082C40136 +:10AA2000830020C00A1002BA00500000000000009D +:10AA300020104E80810021A8085802D601B79068E6 +:10AA4000200359825600A5842DA2186922020034E1 +:10AA50008029A8086806C614858225E00858821C4B +:10AA6000004000000000000048084800C2F03440E8 +:10AA70000F20038880F81030C027210B4880EA207F +:10AA800038000C00120C087300B8400C12234C0262 +:10AA9000433430C00E110392020000000000000099 +:10AAA0004015AC90F9012E884B90116400FB1032D8 +:10AAB00000009103A400C90032C44DB043E004C8B3 +:10AAC0000036890FA803ED00F9143EC00F1043D0E3 +:10AAD00006600000000000000805E800C8003A0019 +:10AAE0000C0053A000E80132010E80532010C80072 +:10AAF0003A400C90032010E804B6008480032D1225 +:10AB0000CB002ECA049003EA007000000000000091 +:10AB10004C198C00870221C00870020C00830021B0 +:10AB2000C00830624C048300218048E0123C00875A +:10AB30000021C00870021C00850124D00A5002F2D6 +:10AB4000046000000000000020009A00808028209F +:10AB5000084C22D200A48024300B4802520084C04A +:10AB600021200948681300A48060200908025600CB +:10AB700097802DE0885802E01020000000000000BF +:10AB80006C04CC00838020D80830024C4083002421 +:10AB9000D109B9424E00830020C18930420C0083A4 +:10ABA000F0A0D9193622660691000CC10A1002C223 +:10ABB0000430000000000000E815E802CAA52A9150 +:10ABC00028A803EA02AA00B6A00FA00A2A92CA8304 +:10ABD000BA8029A0032B00EA4066902DE40B6A801E +:10ABE000DA003E800CE003FA046000000000000080 +:10ABF00048018000FC003D000FC003B014FC003B86 +:10AC0000120EC043B114FC003D000EC003F020F44E +:10AC10000031000E4413A000E80636004F8013D226 +:10AC200000300000000000000810A400D1003660D1 +:10AC30001C180B4600D98030402C98058600C18036 +:10AC400092400D10034402890032700C98012400D8 +:10AC5000C90430400C9003C2043000000000000022 +:10AC60008004640089002240089402248089012223 +:10AC7000404891022400D990224108901224108962 +:10AC800000324008951224028100A2410D9042E05A +:10AC90000010000000000000380524029D0023443D +:10ACA00008D2067480B52023401AD00635908D0254 +:10ACB0002F4419D00274008D00634018D402A411EF +:10ACC0008900224008B002C60040000000000000D9 +:10ACD00028140480852021680852021480A520A130 +:10ACE000480A7238148095242D4828520214808511 +:10ACF00020214808520684808120204A091002C27F +:10AD00000100000000000000380D6140D850B2146E +:10AD100028A0036140F85032944E85042142C85067 +:10AD20003C140D800361408850B2142CC509A14029 +:10AD3000C850321C0C8003EE0350000000000000DD +:10AD40009815E440F9103A440F9103E440D9143EB9 +:10AD5000440D91436440E91032440793C3E450D159 +:10AD6000107E440391015444FD143E400FD003E68D +:10AD700006700000000000001805F680DDA03368B2 +:10AD80001EDA033690CDA03B680AD823760CED80FE +:10AD90002B620B9902A780F9E137680CDA03278050 +:10ADA000C9A222684C5003C60070000000000000D9 +:10ADB0003818E1408850221408802260008804225C +:10ADC0000008042601008850221008AF02230088E2 +:10ADD000C0A0108884022380A0402A100880124E50 +:10ADE0000430000000000000480084008101204081 +:10ADF0000A1402450081412C500B14020504A100E5 +:10AE000028408210028440A132805009140204C4F8 +:10AE100091106444281002D201700000000000006C +:10AE20001804AC02810022C1089002440289022663 +:10AE30004109900A240C8904225008902624008994 +:10AE40000022410910222440B9012E4008900246F8 +:10AE50000460000000000000A015E41089003240EA +:10AE60000A900B241089001E409B90022410290098 +:10AE70001A400E9441A4002900124005904126007A +:10AE8000D90024400C9003E804700000000000008A +:10AE90004801A402A900BC400F9003A404F9003AA1 +:10AEA000410E90838400F9003C400E9002C408E9F2 +:10AEB000003A402E900BE600E1043A400F92035A0C +:10AEC00000600000000000000810A020D80036023A +:10AED0000E00A3E018C00030030F803320004000B4 +:10AEE000320D0F040BA002C80232028C8203200232 +:10AEF000C80416004E80010A042000000000000073 +:10AF000028053B008ED8238008E002F8808E1023AD +:10AF1000A20BE0827A208E3023A10BE00228008E63 +:10AF2000002B8808E44238008E04238008A0020A1F +:10AF3000004000000000000028056F4093C6244038 +:10AF40000A3802CC008301ACF00BB4024C04A3809D +:10AF500028D04B30024C00AB042AC02A300AAC1077 +:10AF6000930020C10A31020A0050000000000000D6 +:10AF700080111C0082002142887406DC0B86022DA1 +:10AF8000800B702A5800A600A9C00B70025C88A72D +:10AF90002029C00A70029C109720A1C808D8022856 +:10AFA000004000000000000088080E00D7803760D5 +:10AFB0000E6813FE00CF803DE00F78231E00EF8265 +:10AFC00031E00F3CC37E04EF80B1E00EE803BE80A9 +:10AFD000D7E033EA0E78032A0200000000000000E8 +:10AFE0000815AC00FA013E000FB003E004F800328F +:10AFF000800F8043AC0AD80036400FB0032C0CDB26 +:10B000000026C109A0136C40EB403ADC0F900BC244 +:10B0100006600000000000004004BE00CF8133E95C +:10B020001FF913B650EF801FE404C8037E006D8142 +:10B0300033640CF81B3E202F8893E80FFB032E800F +:10B04000CFC073E02CD903D00070000000000000D6 +:10B05000A8189042891821C01F710214C0F7202738 +:10B06000404071121800872021804871023C0887F7 +:10B070002021820B61A21E44DF0131C8087302EA5D +:10B08000046000000000000010008C00870021C850 +:10B090000B70029C0987022D829940020400A509C9 +:10B0A00021401970021C00870525484B72020C4094 +:10B0B0008700A1C0485002C400200000000000002A +:10B0C0006804C120894CA0B40A38022200A1D0240F +:10B0D00030098002274481C62214093D2A0F028BC1 +:10B0E000C0A6200B24000C10938120C0483006D845 +:10B0F0000430000000000000B815A10089C132D161 +:10B1000003BC03A92089413E6085BC8B2540EB41EF +:10B11000A2A00DF0133E20CF9036304FBC0B3C0068 +:10B12000CF8033C10CB103EA0460000000000000CE +:10B130008000ED00F8013CD00FB303E882D8203640 +:10B14000802EB213E100FA007EC82EB003EC80DB43 +:10B15000103A084FB223CC02FB103AC00F9003E420 +:10B160000030000000000000A010F000CD103342BD +:10B170000CCA237C00CF00336206F0013A00CF08EE +:10B1800033801CF0813C00FF0033A00CCA01FC049A +:10B19000CF003FC00FF003C00430000000000000EB +:10B1A000A1046D408848A231081002201088B42202 +:10B1B000A00880006A848820225208B00A2C10BBA4 +:10B1C0000032B3888002EC00DB002EC00B9012E14D +:10B1D0000010000000000000000500108A0122A0FD +:10B1E00008B0426020800020441A801AE442A00681 +:10B1F0002200783002AC00BB00A24408B012EC0080 +:10B200008B000EC00B9002E0004000000000000028 +:10B21000081400088000208108300240128000A03D +:10B220004008B002C000820000800830028C00BBE1 +:10B23000002000082002CC8093002CC00B3002C2FA +:10B240000100000000000000000D6000CA14320080 +:10B250000CB0034C00CA0032000E0012A000C00067 +:10B26000700028F013AC00FB0032402C1043EC00BF +:10B27000CF003FC00F9003C003500000000000004B +:10B280002015F002FC001F00677003B000FC003FB7 +:10B29000002DC0033010FC01BF000F70037C00F7CD +:10B2A000043B000FC013FD10FF003DC00FF003E88A +:10B2B0001270000000000000C005F4C0CF803360B1 +:10B2C0000EC9133650CE863F080CC0033E02D7800D +:10B2D00039E00FF8133E40C7303BCE0DF6033D88F2 +:10B2E000CF3133E40F78033000700000000000001D +:10B2F0008010E5D0DB807260889202E4108A802E94 +:10B30000344A8C032E00AB8002E00BB8022C808FF5 +:10B310006013D84A76029D84AF3022480B8812A071 +:10B3200004300000000000008805C4008B002400E9 +:10B330004A0002AC8083002C01280402AC008B017F +:10B3400020C003B0020C80834020C1A834228D139A +:10B350008320ACC80BB00262017000000000000046 +:10B36000C01586009B04AE000A9002EC000B142E60 +:10B37000C602B1126C00AB202AC10BB0422C008B6C +:10B380000226C10AB002AC00AB042A400B9002F0C6 +:10B3900004600000000000000011E700C301364017 +:10B3A0000E88132402CA001E202C8E0B2C00CB000A +:10B3B0002AC00FB8032E06CB003AC04CB013AC0C19 +:10B3C000CB003EC80FB043500470000000000000E6 +:10B3D000E001B408FF91334009DC01F4207E022E25 +:10B3E000400D9801BC80EF80B7E48FF40BFE407FE6 +:10B3F00000B9C04EF003FC08F70037C00FE002B8F8 +:10B4000000600000000000004010A144CB023200A8 +:10B410000D800A6D00EB04109028220B2CC2CB206B +:10B4200076C00EB103EC01CB0632C10C30032C0206 +:10B43000CB003ED00CB00310042000000000000040 +:10B44000C8052148AB0020000095234C08BB012211 +:10B45000C008B2020C08838892D5283402EC028F0F +:10B460002023C04DF0017C00DF002EC00D300372A0 +:10B470000040000000000000E00544008310206050 +:10B480000925020008A0004C000B0C224F1293402B +:10B4900000C0093E02EC00AB80A4C00930222C0899 +:10B4A000B3010C8108300238005000000000000099 +:10B4B00060011609B78021640878061200B4822D55 +:10B4C000A41B69067E04179225E6097806DE80A78C +:10B4D0009025E00979505E04B7922F6109C80248AF +:10B4E000004000000000000048082500C300B00331 +:10B4F0000DA3420940E100BC400F11034C001300B2 +:10B5000020C0093203CC10A30026C48D302B0C8040 +:10B51000F3007C800C3001120200000000000000EB +:10B52000401DBC00E7103D012FF142E800F59003FB +:10B53000C10CF1439C04EF083BC20CF081DCA0DF9E +:10B54000003BC33FF083FC05DF0C3D400FD103D02F +:10B550000660000000000000A805F400CB80304029 +:10B560002CA003E000F88032C02EB80B2C46D3008C +:10B5700030C00C30030C00DB4832C01FB4032C88F1 +:10B58000CB4832800C30132A00700000000000000D +:10B590004811B40087012140087042D008B4002946 +:10B5A000C00870021C00870021C80C720A1C848F1E +:10B5B0004009C48F73129C40832021C0086002920E +:10B5C0000460000000000000C0009601AF80212050 +:10B5D000086802DA00BD8021E00978021E008F8829 +:10B5E00083E229F8825F8087A025E00B3A120E5093 +:10B5F00097A421A02978023000200000000000005C +:10B600000814CC02A1810000487002C800B1002CCF +:10B61000F80931420C10830020E00838124E0083F4 +:10B62000006AC00B30028C04930020E009380292BB +:10B630000430000000000000E815B940EE20308022 +:10B640000CA003E800FA0033B00DE4033288CC808C +:10B6500023000DC0036202CA0036800FA0432806F3 +:10B66000DA0033A00D6A033A046000000000000015 +:10B670004800E0009801BE000F8003F000BC0038D5 +:10B68000040880A3E000F8003E000F8013A000E053 +:10B69000003E000E0003C000E800BE044E8007D24A +:10B6A00000300000000000000810E480C9003E687F +:10B6B0000C90036400C9003E400C9043E000C800B9 +:10B6C00032000C80132000C90036400C9003640047 +:10B6D000810032400490130204300000000000009A +:10B6E0008004650689402E601A142A052089002EE0 +:10B6F00040089002C408C102204008101A240089A2 +:10B7000010324108901224008904364088940A209F +:10B7100000100000000000001805042089552E408C +:10B7200008D50234008D002E40189002E4009900E4 +:10B730002640089002040A8900264038900A240016 +:10B74000A90020400A90820600400000000000008E +:10B750000804050081002F400AD402340085012C22 +:10B7600040081042E40699002240081002050081BA +:10B770004028500814120500A14024505A1002021B +:10B780000100000000000000B80D6000C8043E0089 +:10B790000880032142CC003E002C8002E000D8004B +:10B7A000B6002C80022002C80036000C8003600224 +:10B7B000E80032008E80032E0350000000000000DD +:10B7C000981DF500F5003E40879003E400F1003D30 +:10B7D000500F5403D100EC403F100BC443F100F96B +:10B7E0004036500F9413E510D9443D402DD003E668 +:10B7F00006700000000000001805F660CD023B4016 +:10B800000CD003B440FD063E400C90036604C98290 +:10B81000B6620F180B3600CD4032610C9023240A1B +:10B82000C90032404CD04306007000000000000008 +:10B830003910E380D80022000D80022294B8002E37 +:10B84000000D80032100884022000BC42221508873 +:10B85000802222088002201080012A000A80034EE4 +:10B8600004300000000000000005C60089002A40E6 +:10B8700088100A8408B10029400A700AB5008F4078 +:10B8800029C00BF4022400812028448910020404FA +:10B8900081022A400810020201700000000000002E +:10B8A0001815A600992022400990122480B9002F73 +:10B8B0004403D002F4008D002B410BD002261089E6 +:10B8C000042A4009906E240089002A400A94024606 +:10B8D0000460000000000000A215E600C900384224 +:10B8E0000C1013A60479083A78069203A408C9003C +:10B8F0003A608F98230602C9023A400D9003040073 +:10B90000C90038400C9003280470000000000000BB +:10B9100028018410F980BE404F9002E400F9003CF9 +:10B92000608D92032442E91032500F9403E400F931 +:10B9300000B6412E1003E400F9002E400F9003CA18 +:10B9400000600000000000002810A008C8003E10A1 +:10B950000F88032008F8C01E102C4003F200CC0012 +:10B960003F000CC0132002C00030000C802B2010C0 +:10B97000C00432000F80030A042000000000000011 +:10B98000A8053A8086E02FA01BE0023A80BA042E78 +:10B990008008A0038808C2002E8108600228108E4B +:10B9A00081038008E00178008E040380096803CADF +:10B9B000004000000000000028054C0083602C447B +:10B9C0000B38020F80B1002CE5033010CC1083003F +:10B9D0000CC02930220409911024C0C830004C0446 +:10B9E000930224C00B31020A005000000000000046 +:10B9F000E001188087002D400B74421C01B5012C1A +:10BA0000C00B6002B00094042F2009C0021490976C +:10BA10000025C80870024C80972025C0097002E8F4 +:10BA20000040000000000000A8083A82C6802D6097 +:10BA30000BF80B1A00F5803DE08F7803DE02C7801B +:10BA40002DE00D780B1702DF8024F82CFD035E0C2F +:10BA5000D7E035E00F68032A020000000000000074 +:10BA6000481DAE40FA043E400F8013EC04F9003E3E +:10BA7000C10CA013C010E8003C004E8043C42089D4 +:10BA800000BAC007B621ED06EB68BACC0F2013C28E +:10BA900006600000000000004005BE00C680316066 +:10BAA0002D780B3E48EC923D600C58035A40D580EF +:10BAB00031610C58233600CF823FE00CF803FF6061 +:10BAC000CF9033F00C520300007000000000000023 +:10BAD000A811B8848614B5C00870021EC0C4002D19 +:10BAE0004008400214D0861021804C62423440A5A8 +:10BAF0000035C0287042DCC28F3023C00850022AB3 +:10BB00000460000000000000020098288E00A5409C +:10BB100008F1021864B4006D42085002180185084B +:10BB20002140095822540085102DC4097002DC04FC +:10BB3000970025C00844020010200000000000000B +:10BB400060148C00828024C00880022D00804A2C62 +:10BB500042080A420600928420A08828424400A39A +:10BB60000624C00B3002CC10930424C10900020843 +:10BB70000430000000000000A815BC00CB003640D7 +:10BB80000CB4132C00F9003EA00CA2030408C280E0 +:10BB900030A80D2A035400CB003FC00DF003FC0871 +:10BBA000DF0037D00CB0032A046000000000000062 +:10BBB0008000E000FB103A400EB003ED90F9117EDA +:10BBC000804FB053E840E9003E400F9003A608F9CB +:10BBD000013AC00CB013CC00EB023AC68EB803E0B9 +:10BBE00000300000000000000110F00CCE003FE02B +:10BBF0002CF0833A48CD0135800C6012340ACE0017 +:10BC0000B3802CE00B7400C910B3C10FF01B3C00D3 +:10BC1000CF00B7C02CE0030044300000000000005B +:10BC200081046E1088802CC01898022D8081003607 +:10BC30009108B0036800C9002240089002240083E4 +:10BC40008036C00B30022C02830020C00820036025 +:10BC50004010000000000000800506008A802E458C +:10BC6000288802240288020202088002A2009800AA +:10BC700022000880122400890122C10AB0026C004F +:10BC8000AB0022C1089012600040000000000000DC +:10BC90000804000080002CC04808120080800224A4 +:10BCA00000081842AC028B8022E008B8120402831C +:10BCB0000020C00B30420C00A30160C048100242BB +:10BCC0000100000000000000000D6808CA002E40BE +:10BCD0000880030000C80632000C8002A000D800D3 +:10BCE00032000C80037400CB0022C00FF0033C0034 +:10BCF000EF0037C00C80014003500000000000003E +:10BD0000A019FC00FC043FC00FC003E100FC003B95 +:10BD1000000FD0037C00EF002FC00FF011F410FDD6 +:10BD2000023DC04FF003DC00DF043FC00FC043E919 +:10BD3000067000000000000000C541027020DC1009 +:10BD400067040DC10270209C1037040DC1067040BD +:10BD50004C10371415C1037040DC1013040DC107DB +:10BD60007040DC1037040DC03100000000000000FE +:10BD700000C5440571215C40571015C40571055C70 +:10BD800040571015C40671014C4057100DC4057181 +:10BD9000055C40531015C40771015C40571015C075 +:10BDA00011500000000000000080020120804820A7 +:10BDB0001208048201208048201208048201208099 +:10BDC00048201208048201208048201208048201C1 +:10BDD000208048201208048020000000000000009D +:10BDE000008400016000580056000580016004587E +:10BDF0000016000580012001580016000580016032 +:10BE000000580056000580016000580016000180AF +:10BE1000200000000000000000C5480572115C8091 +:10BE2000172015D80532111C804720148800720194 +:10BE30001C80572005C80472015C80572015C8017A +:10BE400072015C80572415C01150000000000000F2 +:10BE500000C140006000180006000180402000186A +:10BE6000000600019000600018000600418000609C +:10BE70000018000600018000600018100600018014 +:10BE8000310000000000000000C5480422010880C5 +:10BE900002201088046201088042201088002001DE +:10BEA00008804220008804220108004220108800F7 +:10BEB00022010880423010803100000000000000A4 +:10BEC00000C54A05428150A00428150A0552811078 +:10BED000A04428111A00408010A05428050A0542E9 +:10BEE0008151201428150A01428150A054281500C0 +:10BEF000315000000000000000800C01534054C08D +:10BF00001530055C01574054C01530055C015300E5 +:10BF100055C01574054C01530055C01574054C01EE +:10BF2000530054C0113001402110000000000000F7 +:10BF300000800000400010000400010000400010DC +:10BF40000004000100004200100004001100004045 +:10BF50000010C104000100004000100001100101A8 +:10BF6000200000000000000000C560020800820000 +:10BF7000208008200208008200208008200208009B +:10BF80008200208400200208008200208408200211 +:10BF9000080082002180080111500000000000000C +:10BFA00000C54005600158009600159005640258D0 +:10BFB0000056005590056001D900164015800560B7 +:10BFC0000159007640158005600158005600158023 +:10BFD000310000000000000000C440036000D800F1 +:10BFE00036004D80036000D80036000D80076200E7 +:10BFF000580036000D80076000D88016000D8003C1 +:10C000006000D80036001D803100000000000000F4 +:10C0100000C5420430810C20430810C20430810C5A +:10C0200020430810C20430C10C20430810C206305F +:10C03000810C20430810C20430810C20430818C032 +:10C04000115000000000000000C0000030000C0093 +:10C05000030000C00030000C00030000C0403000AE +:10C060000C00030000C00030000C00030000C00002 +:10C0700030000C00030000C00000000000000000C1 +:10C080000080020130804C20130804C20130804C33 +:10C0900020130804C22530814C20130804C201304B +:10C0A000804C32530804C20130804C20130804C075 +:10C0B000204000000000000000C5420562815820B9 +:10C0C000560815820460815820460815820160C117 +:10C0D000582046081582016081583056081582059F +:10C0E00060815820560805801150000000000000B3 +:10C0F00000C542002080082002080082002080083D +:10C1000020020800820020800C200208008200200B +:10C110008008200308008200208008200208008098 +:10C12000210000000000000000C5420466811820C4 +:10C13000460811820464811820460811820060813B +:10C140000C204608118200608119204308118204E6 +:10C1500060811920464801801100000000000000A5 +:10C1600000C56005580156005580156004580156F9 +:10C170000045801160005800060045801560015898 +:10C1800001160001801560055801560055800540D4 +:10C19000115000000000000000800601498010607E +:10C1A00014180506017980506014180106014180B9 +:10C1B000506004180506014180106014180506013E +:10C1C00041805060141805002000000000000000AD +:10C1D0000080020104804020100804020004044092 +:10C1E000201008040201008440201008040201000D +:10C1F00080412010080402110080412010480400F2 +:10C20000000000000000000000C546035180D4601B +:10C2100035180D46021180D46035180D4603118083 +:10C22000D46035180D46035180D46035180D46038F +:10C230005180D46035180D403150000000000000DE +:10C2400000C5460570815C60071815C60471811C25 +:10C2500060171815C6053181DC60571815C60571C1 +:10C26000801C60771815CE0571815C60571815C069 +:10C2700011000000000000000005460271809C6172 +:10C2800077180DC60271809C6037180DC20331808B +:10C290005C6027180DC60371809C6017180DCE03D3 +:10C2A0007180DC6037180DC0110000000000000034 +:10C2B0000045460575815C60771815C60575815C7B +:10C2C00060571815C60531810C60571815C60571E1 +:10C2D000815C60431815C60571815C60571815C0F4 +:10C2E00011500000000000000040020120804820A2 +:10C2F0001208048201208048201208048201208054 +:10C300005C20120804820120804800170804820182 +:10C310002080482012080480000000000000000077 +:10C320000000060163805860161805860161805878 +:10C33000601618058601618158601618058601612E +:10C34000805860561805860161805860161805806F +:10C3500000000000000000000045400570015C0086 +:10C36000170015C08574011C00470011C00570013D +:10C370005C00530010C00570015C00570014C90434 +:10C3800070011C00570015C0115000000000000093 +:10C390000045420060C01820060801820060801835 +:10C3A00020060801820020801830020800821060F8 +:10C3B000801820060800820060801820060801808E +:10C3C0001100000000000000004442042081082009 +:10C3D0000208108204208108204208108204208173 +:10C3E0000820460811820420810820420811820496 +:10C3F0002081082042081080110000000000000089 +:10C400000045420540C550201408150004408150E5 +:10C4100020540811020500801020450C11420440F0 +:10C42000815020140C15420440811020540815003E +:10C4300011500000000000000040030150C04430D3 +:10C44000150C05430150C04C30150C05432150C05C +:10C450005430150C05430150C05430150C054301F0 +:10C4600050C05420150C05400000000000000000E2 +:10C47000000008004200048004200108004200047B +:10C48000800420010800020010000400010800429E +:10C490000010800400010800420010800420010008 +:10C4A00000000000000000000045420200808420DF +:10C4B0002008080202008084202008080202008070 +:10C4C00080A0202808020200808020202808020284 +:10C4D00000808020200808001150000000000000AB +:10C4E0000045400560415800560015800560015820 +:10C4F0000056001580052001D80056001580056003 +:10C50000015800760015800560015800560015801E +:10C51000110000000000000000C540036000D800CA +:10C5200026000D80026000D80036000D80076001F3 +:10C530005C0036000D80036000D80057000D8002BB +:10C540006000980036000D80000000000000000030 +:10C550000000000430210C00430010C00430010C26 +:10C5600000430010C00430011800430010C0043024 +:10C57000010C00460010C00430010C00430010C044 +:10C5800000000000000000000000000030000C006F +:10C59000030000C00035080C00030000C6001400B2 +:10C5A0000800034000C00030000D40020000C00041 +:10C5B00030000C00030000C000000000000000007C +:10C5C0000000050131404C50131404C50131C04C2A +:10C5D00050131404C50531414C50131404C50131E6 +:10C5E000404C70531404C50131404C40131404C036 +:10C5F00000000000000000000000230568C15A3060 +:10C60000568C15A30569C15A30468C11A70168C024 +:10C610001A30568C11A30468C11A30168C15A30465 +:10C6200068C15A30568C11800000000000000000E4 +:10C630000000000020000800020000800024000824 +:10C6400001020000800024000880026000800020B9 +:10C650000009400220008000200008000200008045 +:10C66000000000000000000000000844621118846F +:10C67000462111884462091884462111886062109D +:10C68000180446011188446211188006011188447B +:10C690006211188446211180000000000000000093 +:10C6A00000000045501154045501154044501154E8 +:10C6B00004450111404050105404450115404450B8 +:10C6C0001114001501154044501154045500114037 +:10C6D0000000000000000000000008214208508215 +:10C6E0001420850821420050821420850820420829 +:10C6F0005082152005482142085082142081402193 +:10C700004208508214208500000000000000000054 +:10C7100000000A01028040A01028040A010284409F +:10C72000A11028040A01028040A00028000A01028A +:10C730008040B01028000A01028040A010280400A8 +:10C74000000000000000000000000C035300D4C0F3 +:10C7500035300D4C035300D4C035300D4C0353001D +:10C76000D4C02130084C035300D4C03530084C03EA +:10C770005300D4C035300D40000000000000000020 +:10C780000000080470015C80072025C90472015C68 +:10C7900080472015C8007205DC80572015C8057237 +:10C7A000011C90672015C80572011C80572015C018 +:10C7B00000000000000000000000231848C21231F1 +:10C7C000848C61031840C81231848C61031848C4FA +:10C7D0001031840C41231848C61030040C61231812 +:10C7E00048C61230848C21000000000000000000C8 +:10C7F00000003FFF4FFFD3FFF4FFFD3FFF4FFFD38C +:10C80000FFF4FFFD3FFF4FFFD3FFF4FFFD3FFF4F5E +:10C81000FFD3FFF4FFFD3FFF4FFFD3FFF4FFBD0049 +:10C820000000000000000000000000000000000008 +:10C8300000000000000000000000000000000000F8 +:10C8400000000000000000000000000000000000E8 +:10C8500000000000000000000000000000000000D8 +:10C8600000002CDB0B36C2CDB0B36C2CDB0936C21A +:10C87000CDB0B36C2CDB0B36C2CDB0B36C2CDB0B64 +:10C8800036C2CDB0B36C2CDB0B36C2CDB0B32C00AE +:10C8900000000000000000000000333C4CCF1333C8 +:10C8A000C4CCF1333C4D4E9333C4CCF12B3C4CCF34 +:10C8B0001333C4CCE9333C4CCF12B5C4CCF1333C78 +:10C8C0004CCF1333C4CD3100000000000000000045 +:10C8D00000003B7E4EC793B7E4EDF9237E4E4793AD +:10C8E000B7E4EDF93F7E4EDE1237E48DF93B7E4E24 +:10C8F000DF93F7848DF93B7E4EDF93B1E4EDB90011 +:10C9000000000000000000000000010270409C11C7 +:10C91000670419C30270409C10270409C1027040CB +:10C920001C10271401C10270409C50070409C10269 +:10C9300070409C10671411C000000000000000004F +:10C940000000040571015C40571015C40571015CBD +:10C9500040571015C60571015C40571010C4057191 +:10C96000015C64031055C40571015C40571015C08B +:10C9700000000000000000000000020120804820AC +:10C9800012080482012180482012080480012080BE +:10C990004820120805C2012080482417080482019B +:10C9A00020804820120804800000000000000000E1 +:10C9B00000000000600018004600118400600018AC +:10C9C00000060001800060011800061091800060E0 +:10C9D000001846461801800060001800061001800B +:10C9E00000000000000000000000080473011C802B +:10C9F000072001C80472011C80472011C80472017D +:10CA00001C80472211C80472011C80072011C80431 +:10CA100072011C80072811C0000000000000000007 +:10CA2000000000006000180006000180006000188F +:10CA30000006000180006000180006000180006010 +:10CA40000018004604018000600018000600018004 +:10CA5000000000000000000000000D04220108801A +:10CA600002200090042781088042201098042401AD +:10CA7000088042481088042201094042601088045E +:10CA8000220108C0024010800000000000000000E9 +:10CA900000002A044B8112A004A8012A044A811232 +:10CAA000A044A8112A04488012A04488012A044AFC +:10CAB00081122004AC112A044A8112B0449C110056 +:10CAC000000000000000000008C00C00530014C06B +:10CAD0000530014400530014C00530040C0053001D +:10CAE00014C005B0014C00530016C00130014C00C9 +:10CAF000530014C001380040100000000000000086 +:10CB000008C0001040001000040001100044801014 +:10CB10000004000110004600000004600100004015 +:10CB200000116002400100104000106001501040F0 +:10CB3000300000000000000008C04002000080003B +:10CB40002000080802000080002000080002000009 +:10CB500080002000080002000080000000080002A1 +:10CB600000008000210008403000000000000000AC +:10CB700008C04004600118004600118004600118DC +:10CB80000046001180046001C80046001980006062 +:10CB90000018006600118004600118000600118072 +:10CBA000300000000000000010010002600098004A +:10CBB00026000981026001980026000980066200B3 +:10CBC0004800262001C00260019800070009800289 +:10CBD0006000980026001182100000000000000094 +:10CBE0004045420430810C20430810C20430858C3B +:10CBF00020430810C20430810C20434811820430C5 +:10CC0000818D20460810C20430810C20430C10C0D6 +:10CC100011500000000000004004000030000C0033 +:10CC2000030000C00010000C00030000C000300032 +:10CC30000800030000800030000C80020000C000EB +:10CC400030000C00032000C0104000000000000075 +:10CC50004000020030800C21030800C20030800C2C +:10CC600020030800C20430C10C20030C10C20030A5 +:10CC7000800CB0430800C20030800C20032810C094 +:10CC800000000000000000004045420460811820C0 +:10CC900046081182046080182046081182006081D5 +:10CCA00018204608118204608018200608118204AA +:10CCB00060811820460C11C01150000000000000D7 +:10CCC00040014200208008200208008200208008E5 +:10CCD00020020800820020800C20020800C20020F0 +:10CCE000800820420800820020800820020801807D +:10CCF0000000000000000000500142046081182084 +:10CD0000460811820460801820460811820060C124 +:10CD10000C20460C10C204608018304208118204B6 +:10CD200060811820460810800040000000000000CC +:10CD300040454004500114004500114004500014C7 +:10CD40000045001140005000040045000040045020 +:10CD5000001400010011400450011400450000427D +:10CD600001500000000000004800060041801060F3 +:10CD7000041801060041801060041801060041807B +:10CD800010600418010600418010600418010600BC +:10CD90004180106004180100100000000000000035 +:10CDA0004800020100804021100804020100804078 +:10CDB0002010080402010080402110080402010034 +:10CDC0008040301008040211008440201008140034 +:10CDD0000000000000000000404546035180D46080 +:10CDE00035180D46035180D46035180D4603518027 +:10CDF000D46035100D46035180D44035180D4603DC +:10CE00005180D46035180D40115000000000000022 +:10CE10000001460471811C60071811CE0471811C49 +:10CE200060471801C60471819C60471819C60471D7 +:10CE3000801C60671811C60471811C60471811C0FE +:10CE400000000000000000004000460271809C606D +:10CE5000271809C60671801C60271809C601318091 +:10CE60001C60071809C60271809C60071809C61269 +:10CE700071809C60331801C00000000000000000B9 +:10CE80005045460571815C60571815C60571805C78 +:10CE900060571815C60131810C60171810C605714E +:10CEA000815C60031815C60571815C605318188297 +:10CEB0001050000000000000404012012480482073 +:10CEC0001208048201248048201208048201208074 +:10CED0005820520C0582012080492002080482015A +:10CEE000208049201248048001000000000000005A +:10CEF00040040600618018600618018604618018ED +:10CF00006006180186006181486006181486006179 +:10CF10008018604218018600618018600618008041 +:10CF200001000000000000000045600478011E00C0 +:10CF3000478011E80078011E00478011E004780165 +:10CF40001E00438011E00478011E00038015E004F8 +:10CF500078011E00478011C0105000000000000042 +:10CF600040011200648018200608018200648018C5 +:10CF700020060801820060801830020801820060EB +:10CF80008019304208008200608019200648018024 +:10CF90000000000000000000400142042081082041 +:10CFA000420810820020810820420810820420815B +:10CFB00008204608108204208108204208118204BB +:10CFC00020810820420810800000000000000000BE +:10CFD0004045420440811020440811020040811065 +:10CFE000204408110204408010204508010204403A +:10CFF000811021000C11020440811020440801001E +:10D0000011500000000000004000030050C0143028 +:10D01000050C01430050C01430050C01430050C002 +:10D020001430050C01430050C01430050C014300BE +:10D0300050C01430050C014000000000000000004A +:10D040004000080042041080042001090042011041 +:10D050008004200108004200100004200108004262 +:10D06000001000040001080042001080042011009C +:10D0700000000000000000004045420200808020C7 +:10D08000200808020200800020200808020000801A +:10D0900080A0000A08020200808034622808020290 +:10D0A00000808030200C08001150000000000000BB +:10D0B000400140046001180046001180046003181C +:10D0C000004600118006600198004600118004604F +:10D0D00001180066001180046001180046001180EC +:10D0E0000000000000000000400100026000980005 +:10D0F0002600098002640098002600199002600052 +:10D100001D00260001C0026000990006401980023F +:10D110006000980066000180000000000000000030 +:10D120004045600438010E00438010E00438010ED1 +:10D1300000438010E00438011A00438011A0043835 +:10D14000010E00028040E00438010E004380188088 +:10D1500011500000000000005004010030400C108D +:10D16000030400C90030400C10030400C10030402B +:10D170000810030400810030400C78021400C10044 +:10D1800030400C100304008000000000000000008C +:10D190004000050031400C50031400C50035400C20 +:10D1A00050031410D50031410D50031410C5003147 +:10D1B000400D48435410C50031400C40431000C29C +:10D1C00001000000000000004045430460C1183029 +:10D1D000460C11830461C11830460C01870460C1FC +:10D1E0001830460811830460C11820060C0183041E +:10D1F00060C11830460C1180105000000000000083 +:10D2000040014000200008000200008000200008CB +:10D2100000020000810020000880020000C0002001 +:10D220000008404330008000200008000200008019 +:10D230000000000000000000400148446211188412 +:10D240004621118844630118844621018804621133 +:10D250001804462110C8446211180543018188440E +:10D2600062111884462111800000000000000000B7 +:10D27000404540045001140445011140445001143C +:10D28000044501014045001014044503004044508A +:10D2900011140401054140445011140405010140DA +:10D2A00011500000000000004000082042081082D9 +:10D2B00004208108004200108204208108004208F6 +:10D2C000108205208108204208108A0520050820C8 +:10D2D00042081082042281000000000000000000CB +:10D2E00000000A01028040A01028040201028040D0 +:10D2F000A01028040A01028040A00029040A0102AB +:10D300008040A40028040A01028040A8102B1400C9 +:10D31000004000000000000040454D035340D4D0C1 +:10D3200035340D4D035340D4D035340D4D035340A7 +:10D33000D4D021344D4D035340D4D96134040D036E +:10D340005340C0D835370D40115000000000000098 +:10D350004001480472001C80472011C80472011C5F +:10D3600080472011C80472009C80472019C80072B1 +:10D37000011C88672011C80472015C82472211C019 +:10D3800000000000000000000000230848C2123125 +:10D39000848C61231040C01231848C61031048C416 +:10D3A0001031848C41231848C61030040C412318D6 +:10D3B00048C61230848C010000000000000000000C +:10D3C00000003FFF4FFFD3FFF4FFFD3FFF4FFFD3B0 +:10D3D000FFF4FFFD3FFF4FFFD3FFF4FFFD3FFF4F83 +:10D3E000FFD3FFF4FFDD3FFF4FFFD3FFF4FFFD004E +:10D3F000000000000000000000000000000000002D +:10D40000000000000000000000000000000000001C +:10D41000000000000000000000000000000000000C +:10D4200000000000000000000000000000000000FC +:10D4300000002CDB0B36C2CDB0B36C2CDB0B36C23C +:10D44000CDB0B36C2CDB0B36C2CDB0B36C2CDB0B88 +:10D4500036C2CDB0B34C2CDB0B36C2CDB0B36C00B2 +:10D4600000000000000000000000335C4CD71333C4 +:10D47000C4CCF1333A4AD69333C4CCF12B3A4CCFD7 +:10D480001333C4CCE9333C4CCF12B5A4ACC9333C04 +:10D490004CCF1335C4CD690000000000000000002F +:10D4A00000003B7E4EDF93B7E4EDF93B7E4EDF9309 +:10D4B000B7E4EDF93B7E4EDE1237E4EDE13B7E4E04 +:10D4C000DF9231848DD93B7E4EDF93B1E4EC610075 +:10D4D00000000000000000000000008404A1832C74 +:10D4E000030A1082C134108F004009140203149102 +:10D4F0000008420B1882C40031CA0C520210808509 +:10D5000000218228400A10000000000000000000F6 +:10D5100000000A0402014080732810480706010435 +:10D52000A44121140844061140807020140A04020A +:10D5300000C88441211C08061201C080602014002C +:10D5400000000000000000000000028404218208A6 +:10D5500053021080C500814A0442021400042021B5 +:10D5600080A872221C88C406A1428C52221C888585 +:10D570002621C08850221800000000000000000092 +:10D5800000000244000101006200100004000101DB +:10D590002040001C00440401022062001C8004049E +:10D5A00080892050081480042401C1005000180014 +:10D5B0000000000000000000000002803820040C81 +:10D5C000310A00000218208CA810280888C1141005 +:10D5D000C600220308020108B0000C21020082806C +:10D5E00008004908000200000000000000000000E0 +:10D5F00000000001008008200300040243200040D6 +:10D600000020000442011080842011080400000062 +:10D6100000442420090840030090C42020080C0284 +:10D6200000000000000000000800088108200488B5 +:10D6300002220808C32A90408410200480C22620B9 +:10D64000498822220C08C126A0C98C122A048843CA +:10D650000EA0CB8810220C02000000000000000089 +:10D6600008000A4032000180312800000112808D3C +:10D670008400280C080132008C8002200C08012E46 +:10D6800000C38002200408430200408010200402EE +:10D690000000000000000000080008870A2104883C +:10D6A000112A1C0A06222140A0422A1088850AA1BC +:10D6B00006A462221C0AC40221808C5222144886CD +:10D6C000222008A8602A14020000000000000000C8 +:10D6D000000008450601898063201C884034110140 +:10D6E000A450281848040E014B8073281C8A040695 +:10D6F00091490463201C8A06260185807020180247 +:10D7000000000000000000000800008500B1452C6A +:10D71000700214C00708214900420114820500115B +:10D72000840052021C00C40021C42C53021C02813C +:10D7300004A1CD0850021402000000000000000007 +:10D74000081012043401CC0073401C9045040148B9 +:10D7500004604118C0440401050473481450473460 +:10D7600001452062081CC2040C81C700738018C2E6 +:10D770000400000000000000080010841021CC28E4 +:10D7800042021412C51021840440001C80840091C0 +:10D79000000873821C90050C01CF0C400214304528 +:10D7A00020A1C0085002100200000000000000008C +:10D7B000000000450C8100000108080005189105D3 +:10D7C00004000104400618000224704004004000D8 +:10D7D00001C4240088040043100040200088000099 +:10D7E0000000000000000000000012852431020C3F +:10D7F00002C20410C42821490C02C004B2061C2035 +:10D80000030850420C800104A1490C00C20C1043D3 +:10D8100024A0C10810420000000000000000000029 +:10D820000010A2002000CD000040042001100009DB +:10D830000402490C92073000000033080C924100AA +:10D8400080CC0000000C00432880C20010000000C3 +:10D850000420000000000000000030105080000094 +:10D86000100000F00010800000008000D0808000D8 +:10D8700000000080109080800000000080109080E8 +:10D880000000000000C01080000000000000000048 +:10D890003C3C10808000000000001090A080000040 +:10D8A000000040109080A000000000C0109080A0F8 +:10D8B00000000020801090A0A00000000080108FC9 +:10D8C0000F0000000000000000002CC2E481803F37 +:10D8D000D9BFD998719D428000267FE672AB7C3A11 +:10D8E000400019802648DD3C91C026402640383152 +:10D8F000DB61C01999BFC980000000000000000072 +:10D90000000010801014800684979686960690007A +:10D910003FA1280102901200801788169E90900463 +:10D92000100036BEBE9E861612848013BE97AE804F +:10D93000000000000000000000000000000008825D +:10D940008184214000000008A13801780000000017 +:10D9500008B8217268800000000898448868800038 +:10D96000000008B80178014000000000000000003D +:10D9700000003FFFFFFFC0000000003FF7AFFFC007 +:10D98000000000003FFFFFFFC0000000003FFFFF5E +:10D99000FFC0000000003FFFBFFFC000000000000C +:10D9A000000000000000000000003FFFFFFFC0007B +:10D9B0000000003FFFFF7F40000000003FFFFFFF2F +:10D9C000C0000000003FFFFFFFC0000000003FFF5D +:10D9D0002FFFC00000000000000000000000000059 +:10D9E00000003FFFFFFFC0000000003FFFFF7FC0BF +:10D9F000000000003FFFFFFFC0000000003FFFFFEE +:10DA0000FFC0000000003FFFFF7F8000000000001B +:10DA1000000000000000000000003FFFFFFFC0000A +:10DA20000000003FFFBFBFC0000000003FDFBFDFBE +:10DA3000C0000000003FEFFFFF80000000003FDF5C +:10DA4000FFFFC00000000000000000000000000018 +:10DA500000003FFFFFFFC0000000003F3EAFFFC0DF +:10DA6000000000001FFFDFFFC0000000003FE7FED6 +:10DA7000EFC0000000003FFFFFDFC000000000001B +:10DA8000000000000000000000003FFFFFFFC0009A +:10DA90000000003FFFFFFFC0000000002FF7FFFF66 +:10DAA000C0000000002FFFFFDFC0000000003FF7B4 +:10DAB000DFF7C000000000000000000000000000D0 +:10DAC000000002C400B1C32C50091482C43091C7B5 +:10DAD0002460081C820734914C04430A10C2840459 +:10DAE000918424520B1802C424B1C32C400A108024 +:10DAF0000000000000000000000008050201C480D2 +:10DB000060201C08442201C08450019C08070A01BF +:10DB1000C08472201CC8041211448041011C80077B +:10DB20000811C4007000100000C0000000000000D8 +:10DB3000000000862C214A0C52021C80042021CABD +:10DB40001062021C81470421C32051011C80042C57 +:10DB500001CB0452031440C72031C80C502210805E +:10DB600001200000000000000000000620018900E4 +:10DB700052001480042801450462001080463011D0 +:10DB80000D00420114C0440011050050001C004467 +:10DB90002801490070001080000000000000000013 +:10DBA000000008C002300C8C30220888C226000811 +:10DBB0008020220C88810210C48010220C084002B0 +:10DBC000104888012304C8420210468C122200002B +:10DBD0000010000000000000080002000080C820C3 +:10DBE000110900804110900824300804424100903F +:10DBF000C420000804420010804C20230904C243C2 +:10DC000030804020110800020000000000000000E9 +:10DC1000080008810220C98C122004484122000912 +:10DC20008830200C88030E00498C10220C88402E6E +:10DC300000C984132104C8C32200CB8C3222000007 +:10DC400004000000000000000800080102004B80F2 +:10DC5000322108884102100F8010218C08410200F7 +:10DC6000878410200488000200478010210C88411E +:10DC70001610468030200002000000000000000066 +:10DC800000000AC422A108A4722A140A8502818411 +:10DC9000A042281C0AC5029140B8732910CAC402C8 +:10DCA000A180A4422A14CA85229180A8702A180251 +:10DCB0000080000000000000080008041E01C88069 +:10DCC00043201808453E010C8061209C48061281C3 +:10DCD000C08073001088060201C800422010C807E7 +:10DCE0000211CD80512014820000000000000000CD +:10DCF000080000C42421C80C420114000028104C64 +:10DD000008520214804524294004720010C00524E2 +:10DD1000114408430114C04724204808720210002F +:10DD200000000000000000000810000710110600AD +:10DD3000720018D04620014D00714010500730117C +:10DD4000C300714110B0052C01490043001C50452F +:10DD500030018C0061401842040000000000000007 +:10DD6000000030C50021C00C40011412440431846D +:10DD700024408014A1C70001400840011420052060 +:10DD800011C002608218008724114008404210022E +:10DD90000000000000000000000002000C80C4240D +:10DDA00031480C000108C14100004900420308103D +:10DDB000802021090C02021880C12430080C420185 +:10DDC0001080832011080000000000000000000007 +:10DDD000000010C10420480C1242040083003148A6 +:10DDE00000024104A0070C20400012C20C80C12098 +:10DDF00020C80012C10CB0412000490802420000B6 +:10DE000000000000000000000010800100108100F0 +:10DE100030400820030010C12002000480403090F0 +:10DE20000114024004804020000904320108A003CC +:10DE30000410080022400000043000000000000030 +:10DE40000000300010800000004000F000000000E2 +:10DE500000108000F00080800000200000F010A082 +:10DE6000000000200000F00010000000208000CC26 +:10DE700040000000000000003C3C10A080000000BA +:10DE80000000109080C040000000001090808000D2 +:10DE900000000000109080800000000000109080C2 +:10DEA000E00000000000108C0800000000000000EE +:10DEB0000000094DB1E90026402A7FE3F25498C0E2 +:10DEC0003FE64000014291D0C013E5876383B8CD9F +:10DED000F900267F0000352ED503403FD9BFB18021 +:10DEE00001F0000000000000000004021614001CF5 +:10DEF000A83F881600808480379EBAA05010021276 +:10DF0000001796972650101082801E80DEBE941453 +:10DF100002108017BE819400000000000000000085 +:10DF200000000000000008A84494288000000008B9 +:10DF30009421445100000000088442410100000087 +:10DF40000008A17223414000000008B80178324067 +:10DF5000000000000000000000003FFFFFFFC000C5 +:10DF60000000003FF7FED7C0000000003FFFD7DFF2 +:10DF7000C0000000003FFF7FFFC000000000377FAF +:10DF8000FFFFC000000000000000000000000000D3 +:10DF900000003FFFFFFFC0000000001EFFDE77C053 +:10DFA000000000001FEFFFFFC0000000003FFFFF68 +:10DFB000FFC0000000003FFFFF7FC0000000000026 +:10DFC000000000000000000000003FFFFFFFC00055 +:10DFD0000000001FCFDFFFC0000000003FFFFFBFB9 +:10DFE000C0000000003FFFFFBFC0000000003FFF77 +:10DFF000FFBFC000000000000000000000000000A3 +:10E0000000003FFFFFFFC0000000003FFFFFFFC018 +:10E01000000000003FFFFFFFC0000000001FFF1FC7 +:10E020007FC0000000002FDFFFCFC0000000000015 +:10E03000000000000000000000003FFFFFFFC000E4 +:10E040000000003FBFAFFFC0000000003FFFFFFF28 +:10E05000C0000000003EDE7FFFC0000000003FFF68 +:10E06000FFF7C000000000000000000000000000FA +:10E0700000003FFFFFFFC0000000003F7FFFFFC028 +:10E08000000000003FFFFFFFC0000000003FFEBE99 +:10E090007FC0000000003EFFD77FC00000000000EE +:10E0A0000000000000000000000000000000000070 +:10E0B0000000000000000000000000000000000060 +:10E0C0000000000000000000000000000000000050 +:10E0D0000000000000000000000000000000000040 +:10E0E00030002001020000003000438E00000000DC +:10E0F0000000000000000000000000000000000020 +:10E10000000000000000000000000000000000000F +:10E1100000000000000000000000000000000000FF +:10E1200000000000000000000000000000000000EF +:10E1300000000000000000000000000000000000DF +:10E1400000000000000000000000000000000000CF +:10E1500000000000000000000000000000000000BF +:10E1600000000000000000000000000000000000AF +:10E17000000000000000000000000000000000009F +:10E18000000000000000000000000000000000008F +:10E19000000000000000000000000000000000007F +:10E1A000000000000000000000000000000000006F +:10E1B000000000000000000000000000000000005F +:10E1C000000000000000000000000000000000004F +:10E1D000000000000000000000000000000000003F +:10E1E000000000000000000000000000000000002F +:10E1F000000000000000000000000000000000001F +:10E20000000000000000000000000000000000000E +:10E2100000000000000000000000000000000000FE +:10E2200000000000000000000000000000000000EE +:10E2300000000000000000000000000000000000DE +:10E2400000000000000000000000000000000000CE +:10E2500000000000000000000000000000000000BE +:10E2600000000000000000000000000000000000AE +:10E27000000000000000000000000000000000009E +:10E28000000000000000000000000000000000008E +:10E29000000000000000000000000000000000007E +:10E2A000000000000000000000000000000000006E +:10E2B000000000000000000000000000000000005E +:10E2C000000000000000000000000000000000004E +:10E2D000000000000000000000000000000000003E +:10E2E000000000000000000000000000000000002E +:10E2F000000000000000000000000000000000001E +:10E30000000000000000000000000000000000000D +:10E3100000000000000000000000000000000000FD +:10E3200000000000000000000000000000000000ED +:10E3300000000000000000000000000000000000DD :10E3400000000000000000000000000000000000CD :10E3500000000000000000000000000000000000BD :10E3600000000000000000000000000000000000AD -:10E37000000000000000000000002CDB0FB6C2CD42 -:10E38000B0B36C2CDB0B36C2DFB0B36C2CDB0B7E76 -:10E39000C2CDB0B7FD2CDB0B36C2CDB0B36C0000E4 -:10E3A00000000000000000000000333C4FCF13339A -:10E3B000C4CCF1333C4CCF133FC4CCF1333C4CFFC5 -:10E3C0001333C4CFFD333C4CCF1333C4CCF1000026 -:10E3D000000000000000000000003B7E4EDF93B70D -:10E3E000E4EC793B1E4EDF93BFE48DF93B784EFFA2 -:10E3F00093B7E4EDFD3B1E4EDF93B784EDF90000CB -:10E4000000000000000000000000010270409C10AD -:10E41000271C09C10130401C10670409C10270416A -:10E420009C11071401C10270409C50071C01C000E0 -:10E4300000000000000000000000040571015C40C5 -:10E44000571055C40131005C40571015C4057101C7 -:10E45000DC4017181DC40571055C4057101DC00035 -:10E4600000000000000000000000020120804820A1 -:10E4700012000482012080482012080482012080BA -:10E48000482012080482012080486012080480009D -:10E490000000000000000000000000006000180004 -:10E4A0000600418000600018004600018000600006 -:10E4B0001000061001800060001820461001800046 -:10E4C00000000000000000000000080472011C8031 -:10E4D000472011C80472011C80072011C804730072 -:10E4E0001C80472011CC0472011C80472011C00001 -:10E4F00000000000000000000000000060001800A4 -:10E5000006000184006000180006000180006040E1 -:10E510001800060401810060001800061401800044 -:10E520000000000000000000000008042201088034 -:10E530004270108C04220108C002201088042200BE -:10E540000880425010080422010900424010800057 -:10E55000000000000000000000002E044A8112A00C -:10E5600044A8112A044A8112A004A8112A044B804D -:10E5700012A04488012E044A811220049801000050 -:10E58000000000000000000008C00E00530014C08E -:10E590000530014C00530014E00530014C005300DD -:10E5A00004C00530004C00030014C00530004010CA -:10E5B000000000000000000008C00400400010003F -:10E5C0000458010400400010000400010000410054 -:10E5D00004004458104400000011800450104030E2 -:10E5E000000000000000000008C0400200008000A1 -:10E5F0002000080040000000002000080002000089 -:10E600008400000008400200008000200008403024 -:10E61000000000000000000008C040006001180079 -:10E6200046000180066001980046001180046001E8 -:10E630001800460011800420011800660011803087 -:10E640000000000000000000100140006000980081 -:10E6500026000980026001980006000C800260001C -:10E660001800060001800260009880060001820008 -:10E6700000000000000000004045420030810C20F6 -:10E68000430810C22430818C20030810C20420806B -:10E690000C20030818C20430810C20430818C01154 -:10E6A00050000000000000004000000030000C009E -:10E6B000030000C04030000C000300008000300068 -:10E6C0000C00032000C00030000C00032000C0003C -:10E6D00000000000000000004001021030800C200B -:10E6E000030800C20030800C20030800C201208013 -:10E6F0000C20032C00C20030800C30432C00C000E2 -:10E7000040000000000000004045420460811820E5 -:10E710004608118204608018204608118204608136 -:10E720001820460C11C20460811830460C11C0112B -:10E73000500000000000000040014200208008203E -:10E740000228008200208008200208008200208029 -:10E7500008200208018200208008200308018000B0 -:10E7600000000000000000005001420460811820F9 -:10E7700046281182046080182046081182046081B6 -:10E780001820460810820460811820430810800079 -:10E79000000000000000000040454004500114004B -:10E7A00045001140250000140045001140045001AF -:10E7B00014004500004004500140000100004211D7 -:10E7C000500000000000000048000600418010607A -:10E7D0000418010600418010600418010600418001 -:10E7E0001060041801060041801060041801000048 -:10E7F00000000000000000004800020500804021E9 -:10E80000100804000100804020100804020100806C -:10E810004020500814021100844020100814000009 -:10E820000000000000000000404546015180D46017 -:10E8300035180D46035180D46015180D46035180DC -:10E84000546015180D46035180D46035180D4011E1 -:10E8500050000000000000000001460471811C60AF -:10E86000451811D60471811C60671811C6047181A6 -:10E870009C60471811C60471811C60671811C000A4 -:10E8800000000000000000004005460271809C600E -:10E89000271809C60071809C60671809C60271803C -:10E8A0009C61271801C60271809C60071801C00096 -:10E8B00000000000000000005045460571815C60CA -:10E8C000571855D60171815C60571815C6057181BE -:10E8D0005C60571818C60571815C60431818821176 -:10E8E0005000000000000000400452012080482039 -:10E8F00012480490012080492012080482012480DB -:10E9000048201248009201208048201748048001C6 -:10E910000000000000000000400006006180186058 -:10E92000063C0186006180186046180186006180FF -:10E930001860061801860061801860461801800181 -:10E9400000000000000000000041600478011E008B -:10E95000478011E02478011E00078011E00478014F -:10E960001E00478011E00438011E00478011C011CD -:10E9700050000000000000004001120060801820DC -:10E980000648019200608019200608018200648018 -:10E9900018200648019300208018200648018000B6 -:10E9A0000000000000000000400142042081082017 -:10E9B000420810820420810820020810820420816D -:10E9C00008204208108A0460810820420810800054 -:10E9D000000000000000000040454204408110207B -:10E9E00044081102044081102004081102044081EF -:10E9F0001021440801020450811020040801001174 -:10EA000050000000000000004000030050C014301F -:10EA1000050C01430050C01430050C014300508028 -:10EA200014300508014A0050C014300508014000A8 -:10EA300000000000000000004000080042001080BC -:10EA40000420010800420010800420010800420058 -:10EA500010800420110000420010800420110010DA -:10EA6000400000000000000040454202008080207D -:10EA70002008080200008080202008080202008090 -:10EA80008020200808020200808020200808001151 -:10EA9000500000000000000040014000600118002C -:10EAA00046001180066001180046001180046001D4 -:10EAB00018004600118004600118006600118010E3 -:10EAC00000000000000000004001400264009800C7 -:10EAD0002600099006600198002640098002600027 -:10EAE0009800260000900260009800070001800056 -:10EAF00000000000000000004045600438050E00E2 -:10EB0000438010E04438010E00438010E0043801D7 -:10EB10000E00438018A00438010E004680188011B2 -:10EB200050000000000000005000010030400C10B8 -:10EB3000030400C50030400C10031400C100304035 -:10EB40000C10030400874030400C100204008000C9 -:10EB500000000000000000004004050035400C509B -:10EB6000031400D50431410C50035C00C500310092 -:10EB70000C50031000940031400C50431000C200B0 -:10EB800000000000000000004045430520C118308F -:10EB9000460C11970060C01830461C11830460C1F8 -:10EBA0001830520C11870460C11830460C118011C6 -:10EBB000500000000000000040010000214008005B -:10EBC00002000080002000080002000080002000F9 -:10EBD0000800020000800020000800020000800001 -:10EBE0000000000000000000400148442201188499 -:10EBF0004621119800621018844420118844621143 -:10EC00001884422111804462111884462111800029 -:10EC100000000000000000004045400450111404B2 -:10EC2000450011410050101400450111404450119D -:10EC30001404450101404450111404050101401120 -:10EC40005000000000000000400008204208108230 -:10EC50000420010820420810820420810820420874 -:10EC6000108204228108205208108A0422810000A8 -:10EC7000000000000000000000040A01028440A11E -:10EC80001028000A01028040A01028040A01028016 -:10EC900040A0102C140A00028040B0102C14000078 -:10ECA000000000000000000040454D035340D4D058 -:10ECB00035300C4D035340D4D035340D4D03534003 -:10ECC000D4D035340D4D021340D4D035340D40111D -:10ECD00050000000000000004001080472011C8088 -:10ECE000472015C80472011C80472011C804721106 -:10ECF0001C80472611C84472011C90672611C00071 -:10ED000000000000000000000000230840C612318F -:10ED1000848C01030848C61230840C61231848C251 -:10ED20001231848C01030848C61231048C010000A2 -:10ED3000000000000000000000003FFF4FFFD3FF75 -:10ED4000F4FFFD3FFF4FFFD3FFF4FFFD3FFF4FFFF9 -:10ED5000D3FFF4FFFD3FFF4FFFD3FFF4FFFD0000A3 +:10E37000000000000000000000000000000000009D +:10E38000000000000000000000000000000000008D +:10E39000000000000000000000000000000000007D +:10E3A000000000000000000000000000000000006D +:10E3B000000000000000000000000000000000005D +:10E3C000000000000000000000000000000000004D +:10E3D000000000000000000000000000000000003D +:10E3E000000000000000000000000000000000002D +:10E3F000000000000000000000000000000000001D +:10E40000000000000000000000000000000000000C +:10E4100000000000000000000000000000000000FC +:10E4200000000000000000000000000000000000EC +:10E4300000000000000000000000000000000000DC +:10E4400000000000000000000000000000000000CC +:10E4500000000000000000000000000000000000BC +:10E4600000000000000000000000000000000000AC +:10E47000000000000000000000000000000000009C +:10E48000000000000000000000000000000000008C +:10E49000000000000000000000000000000000007C +:10E4A000000000000000000000000000000000006C +:10E4B000000000000000000000000000000000005C +:10E4C000000000000000000000000000000000004C +:10E4D000000000000000000000000000000000003C +:10E4E000000000000000000000000000000000002C +:10E4F000000000000000000000000000000000001C +:10E50000000000000000000000000000000000000B +:10E5100000000000000000000000000000000000FB +:10E5200000000000000000000000000000000000EB +:10E5300000000000000000000000000000000000DB +:10E5400000000000000000000000000000000000CB +:10E5500000000000000000000000000000000000BB +:10E5600000000000000000000000000000000000AB +:10E57000000000000000000000000000000000009B +:10E58000000000000000000000000000000000008B +:10E59000000000000000000000000000000000007B +:10E5A000000000000000000000000000000000006B +:10E5B000000000000000000000000000000000005B +:10E5C000000000000000000000000000000000004B +:10E5D000000000000000000000000000000000003B +:10E5E000000000000000000000000000000000002B +:10E5F000000000000000000000000000000000001B +:10E60000000000000000000000000000000000000A +:10E6100000000000000000000000000000000000FA +:10E6200000000000000000000000000000000000EA +:10E6300000000000000000000000000000000000DA +:10E6400000000000000000000000000000000000CA +:10E6500000000000000000000000000000000000BA +:10E6600000000000000000000000000000000000AA +:10E67000000000000000000000000000000000009A +:10E68000000000000000000000000000000000008A +:10E69000000000000000000000000000000000007A +:10E6A000000000000000000000000000000000006A +:10E6B000000000000000000000000000000000005A +:10E6C000000000000000000000000000000000004A +:10E6D000000000000000000000000000000000003A +:10E6E000000000000000000000000000000000002A +:10E6F000000000000000000000000000000000001A +:10E700000000000000000000000000000000000009 +:10E7100000000000000000000000000000000000F9 +:10E7200000000000000000000000000000000000E9 +:10E7300000000000000000000000000000000000D9 +:10E7400000000000000000000000000000000000C9 +:10E7500000000000000000000000000000000000B9 +:10E7600000000000000000000000000000000000A9 +:10E770000000000000000000000000000000000099 +:10E780000000000000000000000000000000000089 +:10E790000000000000000000000000000000000079 +:10E7A0000000000000000000000000000000000069 +:10E7B0000000000000000000000000000000000059 +:10E7C0000000000000000000000000000000000049 +:10E7D0000000000000000000000000000000000039 +:10E7E0000000000000000000000000000000000029 +:10E7F0000000000000000000000000000000000019 +:10E800000000000000000000000000000000000008 +:10E8100000000000000000000000000000000000F8 +:10E8200000000000000000000000000000000000E8 +:10E8300000000000000000000000000000000000D8 +:10E8400000000000000000000000000000000000C8 +:10E8500000000000000000000000000000000000B8 +:10E8600000000000000000000000000000000000A8 +:10E870000000000000000000000000000000000098 +:10E880000000000000000000000000000000000088 +:10E890000000000000000000000000000000000078 +:10E8A0000000000000000000000000000000000068 +:10E8B0000000000000000000000000000000000058 +:10E8C0000000000000000000000000000000000048 +:10E8D0000000000000000000000000000000000038 +:10E8E0000000000000000000000000000000000028 +:10E8F0000000000000000000000000000000000018 +:10E900000000000000000000000000000000000007 +:10E9100000000000000000000000000000000000F7 +:10E9200000000000000000000000000000000000E7 +:10E9300000000000000000000000000000000000D7 +:10E9400000000000000000000000000000000000C7 +:10E9500000000000000000000000000000000000B7 +:10E9600000000000000000000000000000000000A7 +:10E970000000000000000000000000000000000097 +:10E980000000000000000000000000000000000087 +:10E990000000000000000000000000000000000077 +:10E9A0000000000000000000000000000000000067 +:10E9B0000000000000000000000000000000000057 +:10E9C0000000000000000000000000000000000047 +:10E9D0000000000000000000000000000000000037 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA00000000000000000000000000000000000006 +:10EA100000000000000000000000000000000000F6 +:10EA200000000000000000000000000000000000E6 +:10EA300000000000000000000000000000000000D6 +:10EA400000000000000000000000000000000000C6 +:10EA500000000000000000000000000000000000B6 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000000000000000000096 +:10EA80000000000000000000000000000000000086 +:10EA90000000000000000000000000000000000076 +:10EAA0000000000000000000000000000000000066 +:10EAB0000000000000000000000000000000000056 +:10EAC0000000000000000000000000000000000046 +:10EAD0000000000000000000000000000000000036 +:10EAE0000000000000000000000000000000000026 +:10EAF0000000000000000000000000000000000016 +:10EB00000000000000000000000000000000000005 +:10EB100000000000000000000000000000000000F5 +:10EB200000000000000000000000000000000000E5 +:10EB300000000000000000000000000000000000D5 +:10EB400000000000000000000000000000000000C5 +:10EB500000000000000000000000000000000000B5 +:10EB600000000000000000000000000000000000A5 +:10EB70000000000000000000000000000000000095 +:10EB80000000000000000000000000000000000085 +:10EB90000000000000000000000000000000000075 +:10EBA0000000000000000000000000000000000065 +:10EBB0000000000000000000000000000000000055 +:10EBC0000000000000000000000000000000000045 +:10EBD0000000000000000000000000000000000035 +:10EBE0000000000000000000000000000000000025 +:10EBF0000000000000000000000000000000000015 +:10EC00000000000000000000000000000000000004 +:10EC100000000000000000000000000000000000F4 +:10EC200000000000000000000000000000000000E4 +:10EC300000000000000000000000000000000000D4 +:10EC400000000000000000000000000000000000C4 +:10EC500000000000000000000000000000000000B4 +:10EC600000000000000000000000000000000000A4 +:10EC70000000000000000000000000000000000094 +:10EC80000000000000000000000000000000000084 +:10EC90000000000000000000000000000000000074 +:10ECA0000000000000000000000000000000000064 +:10ECB0000000000000000000000000000000000054 +:10ECC0000000000000000000000000000000000044 +:10ECD0000000000000000000000000000000000034 +:10ECE0000000000000000000000000000000000024 +:10ECF0000000000000000000000000000000000014 +:10ED00000000000000000000000000000000000003 +:10ED100000000000000000000000000000000000F3 +:10ED200000000000000000000000000000000000E3 +:10ED300000000000000000000000000000000000D3 +:10ED400000000000000000000000000000000000C3 +:10ED500000000000000000000000000000000000B3 :10ED600000000000000000000000000000000000A3 :10ED70000000000000000000000000000000000093 :10ED80000000000000000000000000000000000083 -:10ED9000000000000000000000002DFB0FB6C2CDF7 -:10EDA000B0B7FD3FFB0B36C2DFB0FB6C2CDB0B7E3C -:10EDB000C2CDB0B7FD3FFB0B36C2CDF4B7FD0000AE -:10EDC0000000000000000000000033FC4FCF1333B0 -:10EDD000C4CFFD3FFC4CCF133FC4FCF1333C4CFF90 -:10EDE0001333C4CFFD3FFC4CCF1333F4CFFD0000F1 -:10EDF000000000000000000000003B7E4EDF93B7E3 -:10EE0000E4EDF93FFE4EDF93B7E4EDF93B7E4EC7EC -:10EE100093B7E4EC61231E4EDF93B784EC610000EE -:10EE20000000000000000000000000C524A14A24EA -:10EE3000630114024400810B2871021082403811D2 -:10EE4000410450081882873831C32C520A10000040 -:10EE5000000000000000000000000845128144800E -:10EE600071211C0A071A8102A0522014480712813E -:10EE7000C680602008884702014A80702010000088 -:10EE80000000000000000000000002C52C014A0044 -:10EE900052091C800724210808710210804520A116 -:10EEA0004928520114C0450091C4007202100000AC -:10EEB0000000000000000000000002072001C10067 -:10EEC0007109108007000101007008188007000117 -:10EED000892052010C8046308145046000100000FA -:10EEE0000000000000000000000008C202200088AE -:10EEF00020220008C22280408802220008820AA044 -:10EF00000CA802220008800A00808C022200000067 -:10EF10000000000000000000080002430000402044 -:10EF200030080440413010C8000000000203001007 -:10EF3000C000110800C2431080C020010800020078 -:10EF40000000000000000000080008C30A20C18C77 -:10EF500012220488013620C3081228040801040084 -:10EF60004AA8220104C8412630C0880221000200BC -:10EF70000000000000000000080008000A10C18026 -:10EF800032210C88430280448012290408420A90EE -:10EF90008A8000200448030A1082800020000200BA -:10EFA000000000000000000000000A8702A180AC01 -:10EFB0004329148A8402A100AC412010080626319E -:10EFC00080A46020144A44328181AC602A18020077 -:10EFD0000000000000000000080008072201C580B2 -:10EFE00073211CC8072A010C807220104847261183 -:10EFF000C58073201C88072A1149807020140200E4 -:10F000000000000000000000080000451031C90C9D -:10F0100073021CC04704010A0C510A1082472031B8 -:10F02000C80072021C40053011C4007201180200B1 -:10F030000000000000000000081010062401450434 -:10F04000518118904714010404718810120534018D -:10F050004404514018D0073801C404520114C204BA -:10F060000000000000000000000000870021890C63 -:10F0700060011CD0452401C10C42010000C52031B3 -:10F08000410840001880450021410C70421CC2001C -:10F090000000000000000000000002011C80C420ED -:10F0A00031081042420880C62031090020031C901C -:10F0B000C42001490C424310804420310810000054 -:10F0C0000000000000000000000030832030480CE9 -:10F0D00032401090812420C80432401020C3208088 -:10F0E000C800024A0CA0012410C8083241100000D8 -:10F0F0000000000000000000001090030000C904A0 -:10F10000304000900020008000104010004020108F -:10F11000C20000800820430810810032400CC00467 -:10F12000200000000000000000003000400000004F -:10F13000100000F01020000000100000F0108040CF -:10F140000000004000F01090800000000000C000AF -:10F1500000000000000000003C3C108090400000D7 -:10F1600000801090A09000000000001090808000AF -:10F1700000000000109080900000000040108F0FF1 -:10F180000000000000000000000024C6BA06C01CF9 -:10F19000492861142B1C0E403FD9BFD9AABC1A5F65 -:10F1A0000010A6503B61B325BC4019BFFFE98000A9 -:10F1B0000000000000000000000010921494800C79 -:10F1C000073F2B948614848028000049140486127B -:10F1D0008000412734D0908492002D8A211E800027 -:10F1E000000000000000000000000000000008A275 -:10F1F000B10101000000000884B17828000000007F -:10F2000008B13214140000000008A8235421400063 -:10F21000000000000000000000003FFFFFFFC000F2 -:10F220000000002FFFFEF7C0000000002FD7FEEF08 -:10F23000C0000000003FFF7FFFC000000000000092 -:10F24000000000000000000000003FFFFFFFC000C2 -:10F250000000000FEF77FFC0000000003EFFFEEF50 -:10F2600040000000003FFFBFFF4000000000000022 -:10F27000000000000000000000003FFFFFFFC00092 -:10F280000000003FFFDFFFC0000000003FFFFFFF66 -:10F29000C0000000003F7F2FFFC000000000000002 -:10F2A000000000000000000000003FFFFFFFC00062 -:10F2B0000000001FFFFFEFC0000000001FEFEFEF96 -:10F2C000C0000000002FFFFFFFC000000000000092 -:10F2D000000000000000000000003FFFFFFFC00032 -:10F2E0000000003FFFEFFFC0000000002FAFDFFF76 -:10F2F000C0000000003FEFFFF7C00000000000006A -:10F30000000000000000000000003FFFFFFFC00001 -:10F310000000003FDFDFFFC0000000003FFFFFFFF5 -:10F32000C0000000001FFFDFFFC000000000000061 -:10F330000000000000000000000002C424A1002C16 -:10F34000520B18C2862CA18038620A0840C42CA136 -:10F350000828420B14008514A10828430A10000055 -:10F3600000000000000000000000080412010380FB -:10F3700061201008071241428070201C08041A0105 -:10F3800084814020180846368105806320100001E2 -:10F390008000000000000000000000842421000C18 -:10F3A00052021400872821810872061C82842021C1 -:10F3B0004818420354804530254A18530210000172 -:10F3C000200000000000000000000804220101806D -:10F3D000422018C8442201808442201C8804220153 -:10F3E0000080402010884436014080410010000019 -:10F3F0000000000000000000000000C00820000C19 -:10F4000022030440810020840803000080C2002001 -:10F41000C408000308888216A040883222800000B9 -:10F42000000000000000000008000201008004202D -:10F4300010080CC2121084C82212080402030088AB -:10F440000021000C0C404130008420100800020014 -:10F450000000000000000000080008820620088C60 -:10F4600032220C888126204D882322808883062022 -:10F4700008880023048A8136204B8832220000004D -:10F4800000000000000000000800080202000980DF -:10F49000322004886022008984002008980002003D -:10F4A000008000200008023A8048803020000200DE -:10F4B000000000000000000008000AC41AA180A893 -:10F4C000412A10CAC71AA104AD712A184AD406B13C -:10F4D00000A8712A100884262906AC522A100200BE -:10F4E0000000000000000000080008042A0141801C -:10F4F00042201C00040A01098451201C8844020196 -:10F5000008804020104A4702014880632010020012 -:10F510008000000000000000080000C41021810CE1 -:10F5200041020C00C020610D0E72021C40C4083163 -:10F530000418420210808720B1C40C53021000004E -:10F540000000000000000000081020072401CC008B -:10F55000724014000424010800734110C0073011E8 -:10F56000CC007101100204208146104240100204B8 -:10F570000000000000000000080000C51021000885 -:10F5800062021C90C52421000C70821C10C4203122 -:10F59000880240061C008500A1000C4042000200C9 -:10F5A000000000000000000000002205148001207F -:10F5B00030080C42060080012451080C02410080F2 -:10F5C0004C2000080C304204000420000800000019 -:10F5D0000000000000000000000010C62420000C05 -:10F5E00032C20480C73020000C53C20410C22870FD -:10F5F0000C0902024C80810430090C024210000008 -:10F60000000000000000000000108001380002002F -:10F6100012400C200734040200630108100024107B -:10F620000400020104820108800910024010000455 -:10F6300030000000000000000000302010800000BA -:10F64000208000F02010800000208000D08000008A -:10F650004000000000301000800000000000CC409E -:10F6600000000000000000003C3C10808000000012 -:10F67000000010908080000000000010908000903A -:10F68000800010000010A0800000002000108C08F6 -:10F6900000000000000000000000341ABE178000C7 -:10F6A0003E40266FBAE32480001659BD828182D87D -:10F6B000800000199986806480C03FD9998000013C -:10F6C000F000000000000000000006160294001682 -:10F6D000C01694829016108021182828020A020869 -:10F6E00080000000000282801400011411A040007C -:10F6F000000000000000000000000000000008847E -:10F700000284A8800000000891228441A2082401FC -:10F7100030000000000000000008840144010000E7 -:10F72000000000000000000000003FFFFFFFC000DD -:10F730000000003EF7FFF7C0000000002FE7B7FF12 -:10F74000C0000000002FFE7FF7C000000000000096 -:10F75000000000000000000000003FFFFFFFC000AD -:10F7600000000036BFFEDFC0000000000FF7DFFF23 -:10F77000C0000000003DB7B7EFC00000000000006F -:10F78000000000000000000000003FFFFFFFC0007D -:10F790000000001FDFDFFFC0000000000FDFDFFF01 -:10F7A000C0000000003FEFFFFFC0000000000000AD -:10F7B000000000000000000000003FFFFFFFC0004D -:10F7C0000000003FBF7FFFC0000000003FFF7FF749 -:10F7D000C0000000003FDFFFFFC00000000000008D -:10F7E000000000000000000000003FFFFFFFC0001D -:10F7F0000000003F7EFFFF40000000003FFEFFFFD3 -:10F80000C0000000003FFFFFFFC00000000000003C -:10F81000000000000000000000003FFFFFFFC000EC -:10F8200000000037FF6FFFC0000000003FFFFFFF38 -:10F83000C0000000003FFFFFFFC00000000000000C +:10ED90000000000000000000000000000000000073 +:10EDA0000000000000000000000000000000000063 +:10EDB0000000000000000000000000000000000053 +:10EDC0000000000000000000000000000000000043 +:10EDD0000000000000000000000000000000000033 +:10EDE0000000000000000000000000000000000023 +:10EDF0000000000000000000000000000000000013 +:10EE00000000000000000000000000000000000002 +:10EE100000000000000000000000000000000000F2 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400000000000000000000000000000000000C2 +:10EE500000000000000000000000000000000000B2 +:10EE600000000000000000000000000000000000A2 +:10EE70000000000000000000000000000000000092 +:10EE80000000000000000000000000000000000082 +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB0000000000000000000000000000000000052 +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000000000000000000022 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF100000000000000000000000000000000000F1 +:10EF20000000000030002001020200003000438099 +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000000000000C1 +:10EF500000000000000000000000000000000000B1 +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF80000000000000000000000000000000000081 +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB0000000000000000000000000000000000051 +:10EFC0000000000000000000000000000000000041 +:10EFD0000000000000000000000000000000000031 +:10EFE0000000000000000000000000000000000021 +:10EFF0000000000000000000000000000000000011 +:10F000000000000000000000000000000000000000 +:10F0100000000000000000000000000000000000F0 +:10F0200000000000000000000000000000000000E0 +:10F0300000000000000000000000000000000000D0 +:10F0400000000000000000000000000000000000C0 +:10F0500000000000000000000000000000000000B0 +:10F0600000000000000000000000000000000000A0 +:10F070000000000000000000000000000000000090 +:10F080000000000000000000000000000000000080 +:10F090000000000000000000000000000000000070 +:10F0A0000000000000000000000000000000000060 +:10F0B0000000000000000000000000000000000050 +:10F0C0000000000000000000000000000000000040 +:10F0D0000000000000000000000000000000000030 +:10F0E0000000000000000000000000000000000020 +:10F0F0000000000000000000000000000000000010 +:10F1000000000000000000000000000000000000FF +:10F1100000000000000000000000000000000000EF +:10F1200000000000000000000000000000000000DF +:10F1300000000000000000000000000000000000CF +:10F1400000000000000000000000000000000000BF +:10F1500000000000000000000000000000000000AF +:10F16000000000000000000000000000000000009F +:10F17000000000000000000000000000000000008F +:10F18000000000000000000000000000000000007F +:10F19000000000000000000000000000000000006F +:10F1A000000000000000000000000000000000005F +:10F1B000000000000000000000000000000000004F +:10F1C000000000000000000000000000000000003F +:10F1D000000000000000000000000000000000002F +:10F1E000000000000000000000000000000000001F +:10F1F000000000000000000000000000000000000F +:10F2000000000000000000000000000000000000FE +:10F2100000000000000000000000000000000000EE +:10F2200000000000000000000000000000000000DE +:10F2300000000000000000000000000000000000CE +:10F2400000000000000000000000000000000000BE +:10F2500000000000000000000000000000000000AE +:10F26000000000000000000000000000000000009E +:10F27000000000000000000000000000000000008E +:10F28000000000000000000000000000000000007E +:10F29000000000000000000000000000000000006E +:10F2A000000000000000000000000000000000005E +:10F2B000000000000000000000000000000000004E +:10F2C000000000000000000000000000000000003E +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A000000000000000000000000000000000005D +:10F3B000000000000000000000000000000000004D +:10F3C000000000000000000000000000000000003D +:10F3D000000000000000000000000000000000002D +:10F3E000000000000000000000000000000000001D +:10F3F000000000000000000000000000000000000D +:10F4000000000000000000000000000000000000FC +:10F4100000000000000000000000000000000000EC +:10F4200000000000000000000000000000000000DC +:10F4300000000000000000000000000000000000CC +:10F4400000000000000000000000000000000000BC +:10F4500000000000000000000000000000000000AC +:10F46000000000000000000000000000000000009C +:10F47000000000000000000000000000000000008C +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:10F5F000000000000000000000000000000000000B +:10F6000000000000000000000000000000000000FA +:10F6100000000000000000000000000000000000EA +:10F6200000000000000000000000000000000000DA +:10F6300000000000000000000000000000000000CA +:10F6400000000000000000000000000000000000BA +:10F6500000000000000000000000000000000000AA +:10F66000000000000000000000000000000000009A +:10F67000000000000000000000000000000000008A +:10F68000000000000000000000000000000000007A +:10F69000000000000000000000000000000000006A +:10F6A000000000000000000000000000000000005A +:10F6B000000000000000000000000000000000004A +:10F6C000000000000000000000000000000000003A +:10F6D000000000000000000000000000000000002A +:10F6E000000000000000000000000000000000001A +:10F6F000000000000000000000000000000000000A +:10F7000000000000000000000000000000000000F9 +:10F7100000000000000000000000000000000000E9 +:10F7200000000000000000000000000000000000D9 +:10F7300000000000000000000000000000000000C9 +:10F7400000000000000000000000000000000000B9 +:10F7500000000000000000000000000000000000A9 +:10F760000000000000000000000000000000000099 +:10F770000000000000000000000000000000000089 +:10F780000000000000000000000000000000000079 +:10F790000000000000000000000000000000000069 +:10F7A0000000000000000000000000000000000059 +:10F7B0000000000000000000000000000000000049 +:10F7C0000000000000000000000000000000000039 +:10F7D0000000000000000000000000000000000029 +:10F7E0000000000000000000000000000000000019 +:10F7F0000000000000000000000000000000000009 +:10F8000000000000000000000000000000000000F8 +:10F8100000000000000000000000000000000000E8 +:10F8200000000000000000000000000000000000D8 +:10F8300000000000000000000000000000000000C8 :10F8400000000000000000000000000000000000B8 :10F8500000000000000000000000000000000000A8 :10F860000000000000000000000000000000000098 -:10F870000000000000000000300020010200000035 -:10F880003000430C000000000000000000000000F9 +:10F870000000000000000000000000000000000088 +:10F880000000000000000000000000000000000078 :10F890000000000000000000000000000000000068 :10F8A0000000000000000000000000000000000058 :10F8B0000000000000000000000000000000000048 :10F8C0000000000000000000000000000000000038 :10F8D0000000000000000000000000000000000028 :10F8E0000000000000000000000000000000000018 -:10F8F00000000000000000000030C00000000030E8 -:10F90000C000000000000000000000000000000037 +:10F8F0000000000000000000000000000000000008 +:10F9000000000000000000000000000000000000F7 :10F9100000000000000000000000000000000000E7 :10F9200000000000000000000000000000000000D7 :10F9300000000000000000000000000000000000C7 :10F9400000000000000000000000000000000000B7 -:10F95000000000000000000000000030C030C000C7 +:10F9500000000000000000000000000000000000A7 :10F960000000000000000000000000000000000097 :10F970000000000000000000000000000000000087 :10F980000000000000000000000000000000000077 :10F990000000000000000000000000000000000067 :10F9A0000000000000000000000000000000000057 -:10F9B00000000000000000000030C030C030C03047 -:10F9C000C000000000000000000000000000000077 +:10F9B0000000000000000000000000000000000047 +:10F9C0000000000000000000000000000000000037 :10F9D0000000000000000000000000000000000027 :10F9E0000000000000000000000000000000000017 :10F9F0000000000000000000000000000000000007 :10FA000000000000000000000000000000000000F6 -:10FA10000000000000000000000F00000000000FC8 +:10FA100000000000000000000000000000000000E6 :10FA200000000000000000000000000000000000D6 :10FA300000000000000000000000000000000000C6 :10FA400000000000000000000000000000000000B6 :10FA500000000000000000000000000000000000A6 :10FA60000000000000000000000000000000000096 -:10FA70000000000000000000003FC0000000003F48 -:10FA8000C0000000000000000000000000000000B6 +:10FA70000000000000000000000000000000000086 +:10FA80000000000000000000000000000000000076 :10FA90000000000000000000000000000000000066 :10FAA0000000000000000000000000000000000056 :10FAB0000000000000000000000000000000000046 :10FAC0000000000000000000000000000000000036 -:10FAD0000000000000000000000F0030C030C00F28 +:10FAD0000000000000000000000000000000000026 :10FAE0000000000000000000000000000000000016 :10FAF0000000000000000000000000000000000006 :10FB000000000000000000000000000000000000F5 :10FB100000000000000000000000000000000000E5 :10FB200000000000000000000000000000000000D5 -:10FB3000000000000000000000136B00C000CF2C8C -:10FB40004000000000000000000000000000000075 +:10FB300000000000000000000000000000000000C5 +:10FB400000000000000000000000000000000000B5 :10FB500000000000000000000000000000000000A5 :10FB60000000000000000000000000000000000095 :10FB70000000000000000000000000000000000085 :10FB80000000000000000000000000000000000075 -:10FB900000000000000000000000000F000F000047 +:10FB90000000000000000000000000000000000065 :10FBA0000000000000000000000000000000000055 :10FBB0000000000000000000000000000000000045 :10FBC0000000000000000000000000000000000035 :10FBD0000000000000000000000000000000000025 :10FBE0000000000000000000000000000000000015 -:10FBF00000000000000000000030C00F000F0030C7 -:10FC0000C000000000000000000000000000000034 +:10FBF0000000000000000000000000000000000005 +:10FC000000000000000000000000000000000000F4 :10FC100000000000000000000000000000000000E4 :10FC200000000000000000000000000000000000D4 :10FC300000000000000000000000000000000000C4 :10FC400000000000000000000000000000000000B4 -:10FC500000000000000000000000003FC03FC000A6 +:10FC500000000000000000000000000000000000A4 :10FC60000000000000000000000000000000000094 :10FC70000000000000000000000000000000000084 :10FC80000000000000000000000000000000000074 :10FC90000000000000000000000000000000000064 :10FCA0000000000000000000000000000000000054 -:10FCB00000000000000000000030C03FC03FC03026 -:10FCC000C000000000000000000000000000000074 +:10FCB0000000000000000000000000000000000044 +:10FCC0000000000000000000000000000000000034 :10FCD0000000000000000000000000000000000024 :10FCE0000000000000000000000000000000000014 :10FCF0000000000000000000000000000000000004 :10FD000000000000000000000000000000000000F3 -:10FD10000000000000000000000F000F000F000FA7 +:10FD100000000000000000000000000000000000E3 :10FD200000000000000000000000000000000000D3 -:10FD300000000000000000000000000000000000C3 -:10FD400000000000000000000000000000000000B3 +:10FD30003000000100005FA73000800100000003D8 +:10FD40003000400E00000000000000000000000035 :10FD500000000000000000000000000000000000A3 :10FD60000000000000000000000000000000000093 -:10FD70000000000000000000003FC00F000F003F27 -:10FD8000C0000000000000000000000000000000B3 -:10FD90000000000000000000000000000000000063 -:10FDA0000000000000000000000000000000000053 -:10FDB0000000000000000000000000000000000043 -:10FDC0000000000000000000000000000000000033 -:10FDD0000000000000000000000F003FC03FC00F07 -:10FDE0000000000000000000000000000000000013 -:10FDF0000000000000000000000000000000000003 -:10FE000000000000000000000000000000000000F2 -:10FE100000000000000000000000000000000000E2 -:10FE200000000000000000000000000000000000D2 -:10FE3000000000000000000006335D80C000FDAC43 -:10FE400002000000000000000000000000000000B0 -:10FE500000000000000000000000000000000000A2 -:10FE60000000000000000000000000000000000092 -:10FE70000000000000000000000000000000000082 -:10FE80000000000000000000000000000000000072 -:10FE90000000000000000000000000000000000062 -:10FEA0000000000000000000000000000000000052 -:10FEB0000000000000000000000000000000000042 -:10FEC0000000000000000000000000000000000032 -:10FED0000000000000000000000000000000000022 -:10FEE0000000000000000000000000000000000012 -:10FEF00000000000000000000030C00000000030E2 -:10FF0000C000000000000000000000000000000031 -:10FF100000000000000000000000000000000000E1 -:10FF200000000000000000000000000000000000D1 -:10FF300000000000000000000000000000000000C1 -:10FF400000000000000000000000000000000000B1 -:10FF5000000000000000000000000030C030C000C1 -:10FF60000000000000000000000000000000000091 -:10FF70000000000000000000000000000000000081 -:10FF80000000000000000000000000000000000071 -:10FF90000000000000000000000000000000000061 -:10FFA0000000000000000000000000000000000051 -:10FFB00000000000000000000030C030C030C03041 -:10FFC000C000000000000000000000000000000071 -:10FFD0000000000000000000000000000000000021 -:10FFE0000000000000000000000000000000000011 -:10FFF0000000000000000000000000000000000001 -:108010000000000000000000000000000000000060 -:108020000000000000000000000F00000000000F32 -:108030000000000000000000000000000000000040 -:108040000000000000000000000000000000000030 -:108050000000000000000000000000000000000020 -:108060000000000000000000000000000000000010 -:108070000000000000000000000000000000000000 -:108080000000000000000000003FC0000000003FB2 -:10809000C000000000000000000000000000000020 -:1080A00000000000000000000000000000000000D0 -:1080B00000000000000000000000000000000000C0 -:1080C00000000000000000000000000000000000B0 -:1080D00000000000000000000000000000000000A0 -:1080E0000000000000000000000F0030C030C00F92 -:1080F0000000000000000000000000000000000080 -:10810000000000000000000000000000000000006F -:10811000000000000000000000000000000000005F -:10812000000000000000000000000000000000004F -:10813000000000000000000000000000000000003F -:108140000000000000000000001374C0C000F0EC4C -:1081500040000000000000000000000000000000DF -:10816000000000000000000000000000000000000F -:1081700000000000000000000000000000000000FF -:1081800000000000000000000000000000000000EF -:1081900000000000000000000000000000000000DF -:1081A00000000000000000000000000F000F0000B1 -:1081B00000000000000000000000000000000000BF -:1081C00000000000000000000000000000000000AF -:1081D000000000000000000000000000000000009F -:1081E000000000000000000000000000000000008F -:1081F000000000000000000000000000000000007F -:1082000000000000000000000030C00F000F003030 -:10821000C00000000000000000000000000000009E -:10822000000000000000000000000000000000004E -:10823000000000000000000000000000000000003E -:10824000000000000000000000000000000000002E -:10825000000000000000000000000000000000001E -:1082600000000000000000000000003FC03FC00010 -:1082700000000000000000000000000000000000FE -:1082800000000000000000000000000000000000EE -:1082900000000000000000000000000000000000DE -:1082A00000000000000000000000000000000000CE -:1082B00000000000000000000000000000000000BE -:1082C0000000000000000000001986108030823D90 -:1082D000800000000000000000000000000000001E -:1082E000000000000000000000000000000000008E -:1082F000000000000000000000000000000000007E -:10830000000000000000000000000000000000006D -:10831000000000000000000000000000000000005D -:108320000000000000000000000F000F000F000F11 -:10833000000000000000000000000000000000003D -:10834000000000000000000000000000000000002D -:10835000000000000000000000000000000000001D -:10836000000000000000000000000000000000000D -:1083700000000000000000000000000000000000FD -:108380000000000000000000003FC00F000F003F91 -:10839000C00000000000000000000000000000001D -:1083A00000000000000000000000000000000000CD -:1083B00000000000000000000000000000000000BD -:1083C00000000000000000000000000000000000AD -:1083D000000000000000000000000000000000009D -:1083E0000000000000000000000F003FC03FC00F71 -:1083F000000000000000000000000000000000007D -:10840000000000000000000000000000000000006C -:10841000000000000000000000000000000000005C -:10842000000000000000000000000000000000004C -:10843000000000000000000000000000000000003C -:108440000000000000000000376525E48000B088CF -:10845000AB40000000000000000000000000000031 -:10846000000000000000000000000000000000000C -:1084700000000000000000000000000000000000FC -:1084800000000000000000000000000000000000EC -:1084900000000000000000000000000000000000DC -:1084A00000000000000000000000000000000000CC -:1084B00000000000000000000000000000000000BC -:1084C00000000000300020010202000030004300E4 -:1084D000000000000000000000000000000000009C -:1084E000000000000000000000000000000000008C -:1084F000000000000000000000000000000000007C -:10850000000000000000000000000000000000006B -:10851000000000000000000000000000000000005B -:10852000000000000000000000000000000000004B -:10853000000000000000000000000000000000003B -:10854000000000000000000000000000000000002B -:10855000000000000000000000000000000000001B -:10856000000000000000000000000000000000000B -:1085700000000000000000000000000000000000FB -:1085800000000000000000000000000000000000EB -:1085900000000000000000000000000000000000DB -:1085A00000000000000000000000000000000000CB -:1085B00000000000000000000000000000000000BB -:1085C00000000000000000000000000000000000AB -:1085D000000000000000000000000000000000009B -:1085E000000000000000000000000000000000008B -:1085F000000000000000000000000000000000007B -:10860000000000000000000000000000000000006A -:10861000000000000000000000000000000000005A -:10862000000000000000000000000000000000004A -:10863000000000000000000000000000000000003A -:10864000000000000000000000000000000000002A -:10865000000000000000000000000000000000001A -:10866000000000000000000000000000000000000A -:1086700000000000000000000000000000000000FA -:1086800000000000000000000000000000000000EA -:1086900000000000000000000000000000000000DA -:1086A00000000000000000000000000000000000CA -:1086B00000000000000000000000000000000000BA -:1086C00000000000000000000000000000000000AA -:1086D000000000000000000000000000000000009A -:1086E000000000000000000000000000000000008A -:1086F000000000000000000000000000000000007A -:108700000000000000000000000000000000000069 -:108710000000000000000000000000000000000059 -:108720000000000000000000000000000000000049 -:108730000000000000000000000000000000000039 -:108740000000000000000000000000000000000029 -:108750000000000000000000000000000000000019 -:108760000000000000000000000000000000000009 -:1087700000000000000000000000000000000000F9 -:1087800000000000000000000000000000000000E9 -:1087900000000000000000000000000000000000D9 -:1087A00000000000000000000000000000000000C9 -:1087B00000000000000000000000000000000000B9 -:1087C00000000000000000000000000000000000A9 -:1087D0000000000000000000000000000000000099 -:1087E0000000000000000000000000000000000089 -:1087F0000000000000000000000000000000000079 -:108800000000000000000000000000000000000068 -:108810000000000000000000000000000000000058 -:108820000000000000000000000000000000000048 -:108830000000000000000000000000000000000038 -:108840000000000000000000000000000000000028 -:108850000000000000000000000000000000000018 -:108860000000000000000000000000000000000008 -:1088700000000000000000000000000000000000F8 -:1088800000000000000000000000000000000000E8 -:1088900000000000000000000000000000000000D8 -:1088A00000000000000000000000000000000000C8 -:1088B00000000000000000000000000000000000B8 -:1088C00000000000000000000000000000000000A8 -:1088D0000000000000000000000000000000000098 -:1088E0000000000000000000000000000000000088 -:1088F0000000000000000000000000000000000078 -:108900000000000000000000000000000000000067 -:108910000000000000000000000000000000000057 -:108920000000000000000000000000000000000047 -:108930000000000000000000000000000000000037 -:108940000000000000000000000000000000000027 -:108950000000000000000000000000000000000017 -:108960000000000000000000000000000000000007 -:1089700000000000000000000000000000000000F7 -:1089800000000000000000000000000000000000E7 -:1089900000000000000000000000000000000000D7 -:1089A00000000000000000000000000000000000C7 -:1089B00000000000000000000000000000000000B7 -:1089C00000000000000000000000000000000000A7 -:1089D0000000000000000000000000000000000097 -:1089E0000000000000000000000000000000000087 -:1089F0000000000000000000000000000000000077 -:108A00000000000000000000000000000000000066 -:108A10000000000000000000000000000000000056 -:108A20000000000000000000000000000000000046 -:108A30000000000000000000000000000000000036 -:108A40000000000000000000000000000000000026 -:108A50000000000000000000000000000000000016 -:108A60000000000000000000000000000000000006 -:108A700000000000000000000000000000000000F6 -:108A800000000000000000000000000000000000E6 -:108A900000000000000000000000000000000000D6 -:108AA00000000000000000000000000000000000C6 -:108AB00000000000000000000000000000000000B6 -:108AC00000000000000000000000000000000000A6 -:108AD0000000000000000000000000000000000096 -:108AE0000000000000000000000000000000000086 -:108AF0000000000000000000000000000000000076 -:108B00000000000000000000000000000000000065 -:108B10000000000000000000000000000000000055 -:108B20000000000000000000000000000000000045 -:108B30000000000000000000000000000000000035 -:108B40000000000000000000000000000000000025 -:108B50000000000000000000000000000000000015 -:108B60000000000000000000000000000000000005 -:108B700000000000000000000000000000000000F5 -:108B800000000000000000000000000000000000E5 -:108B900000000000000000000000000000000000D5 -:108BA00000000000000000000000000000000000C5 -:108BB00000000000000000000000000000000000B5 -:108BC00000000000000000000000000000000000A5 -:108BD0000000000000000000000000000000000095 -:108BE0000000000000000000000000000000000085 -:108BF0000000000000000000000000000000000075 -:108C00000000000000000000000000000000000064 -:108C10000000000000000000000000000000000054 -:108C20000000000000000000000000000000000044 -:108C30000000000000000000000000000000000034 -:108C40000000000000000000000000000000000024 -:108C50000000000000000000000000000000000014 -:108C60000000000000000000000000000000000004 -:108C700000000000000000000000000000000000F4 -:108C800000000000000000000000000000000000E4 -:108C900000000000000000000000000000000000D4 -:108CA00000000000000000000000000000000000C4 -:108CB00000000000000000000000000000000000B4 -:108CC00000000000000000000000000000000000A4 -:108CD0000000000000000000000000000000000094 -:108CE0000000000000000000000000000000000084 -:108CF0000000000000000000000000000000000074 -:108D00000000000000000000000000000000000063 -:108D10000000000000000000000000000000000053 -:108D20000000000000000000000000000000000043 -:108D30000000000000000000000000000000000033 -:108D40000000000000000000000000000000000023 -:108D50000000000000000000000000000000000013 -:108D60000000000000000000000000000000000003 -:108D700000000000000000000000000000000000F3 -:108D800000000000000000000000000000000000E3 -:108D900000000000000000000000000000000000D3 -:108DA00000000000000000000000000000000000C3 -:108DB00000000000000000000000000000000000B3 -:108DC00000000000000000000000000000000000A3 -:108DD0000000000000000000000000000000000093 -:108DE0000000000000000000000000000000000083 -:108DF0000000000000000000000000000000000073 -:108E00000000000000000000000000000000000062 -:108E10000000000000000000000000000000000052 -:108E20000000000000000000000000000000000042 -:108E30000000000000000000000000000000000032 -:108E40000000000000000000000000000000000022 -:108E50000000000000000000000000000000000012 -:108E60000000000000000000000000000000000002 -:108E700000000000000000000000000000000000F2 -:108E800000000000000000000000000000000000E2 -:108E900000000000000000000000000000000000D2 -:108EA00000000000000000000000000000000000C2 -:108EB00000000000000000000000000000000000B2 -:108EC00000000000000000000000000000000000A2 -:108ED0000000000000000000000000000000000092 -:108EE0000000000000000000000000000000000082 -:108EF0000000000000000000000000000000000072 -:108F00000000000000000000000000000000000061 -:108F10000000000000000000000000000000000051 -:108F20000000000000000000000000000000000041 -:108F30000000000000000000000000000000000031 -:108F40000000000000000000000000000000000021 -:108F50000000000000000000000000000000000011 -:108F60000000000000000000000000000000000001 -:108F700000000000000000000000000000000000F1 -:108F800000000000000000000000000000000000E1 -:108F900000000000000000000000000000000000D1 -:108FA00000000000000000000000000000000000C1 -:108FB00000000000000000000000000000000000B1 -:108FC00000000000000000000000000000000000A1 -:108FD0000000000000000000000000000000000091 -:108FE0000000000000000000000000000000000081 -:108FF0000000000000000000000000000000000071 -:109000000000000000000000000000000000000060 -:109010000000000000000000000000000000000050 -:109020000000000000000000000000000000000040 -:109030000000000000000000000000000000000030 -:109040000000000000000000000000000000000020 -:109050000000000000000000000000000000000010 -:109060000000000000000000000000000000000000 -:1090700000000000000000000000000000000000F0 -:1090800000000000000000000000000000000000E0 -:1090900000000000000000000000000000000000D0 -:1090A00000000000000000000000000000000000C0 -:1090B00000000000000000000000000000000000B0 -:1090C00000000000000000000000000000000000A0 -:1090D00030000001000044723000800100000003F5 -:1090E0003000400C00000000000000000000000004 -:1090F0000000000000000000000000000000000070 -:10910000000000000000000000000000000000005F -:109110000000000030008001000000053000A001C8 -:1091200000000000300000010000E15A00000000D3 -:0C91300000000000000000000000000033 +:10FD700000000000000000000000000030008001D2 +:10FD8000000000053000A00100000000300000016C +:10FD900000006B9700000000000000000000000061 +:04FDA000000000005F :00000001FF // VERSION= 1.0.0.191 // DATE= 2002oct28 diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h index 6d722695e027..e273e5ac19c9 100644 --- a/include/linux/phy/phy.h +++ b/include/linux/phy/phy.h @@ -38,6 +38,14 @@ struct phy_ops { }; /** + * struct phy_attrs - represents phy attributes + * @bus_width: Data path width implemented by PHY + */ +struct phy_attrs { + u32 bus_width; +}; + +/** * struct phy - represents the phy device * @dev: phy device * @id: id of the phy device @@ -46,6 +54,7 @@ struct phy_ops { * @mutex: mutex to protect phy_ops * @init_count: used to protect when the PHY is used by multiple consumers * @power_count: used to protect when the PHY is used by multiple consumers + * @phy_attrs: used to specify PHY specific attributes */ struct phy { struct device dev; @@ -55,6 +64,7 @@ struct phy { struct mutex mutex; int init_count; int power_count; + struct phy_attrs attrs; }; /** @@ -127,6 +137,14 @@ int phy_init(struct phy *phy); int phy_exit(struct phy *phy); int phy_power_on(struct phy *phy); int phy_power_off(struct phy *phy); +static inline int phy_get_bus_width(struct phy *phy) +{ + return phy->attrs.bus_width; +} +static inline void phy_set_bus_width(struct phy *phy, int bus_width) +{ + phy->attrs.bus_width = bus_width; +} struct phy *phy_get(struct device *dev, const char *string); struct phy *devm_phy_get(struct device *dev, const char *string); void phy_put(struct phy *phy); @@ -199,6 +217,16 @@ static inline int phy_power_off(struct phy *phy) return -ENOSYS; } +static inline int phy_get_bus_width(struct phy *phy) +{ + return -ENOSYS; +} + +static inline void phy_set_bus_width(struct phy *phy, int bus_width) +{ + return; +} + static inline struct phy *phy_get(struct device *dev, const char *string) { return ERR_PTR(-ENOSYS); diff --git a/include/linux/platform_data/usb-ehci-orion.h b/include/linux/platform_data/usb-ehci-orion.h index 6fc78e430420..52b0acb35fd7 100644 --- a/include/linux/platform_data/usb-ehci-orion.h +++ b/include/linux/platform_data/usb-ehci-orion.h @@ -1,13 +1,11 @@ /* - * arch/arm/plat-orion/include/plat/ehci-orion.h - * * This file is licensed under the terms of the GNU General Public * License version 2. This program is licensed "as is" without any * warranty of any kind, whether express or implied. */ -#ifndef __PLAT_EHCI_ORION_H -#define __PLAT_EHCI_ORION_H +#ifndef __USB_EHCI_ORION_H +#define __USB_EHCI_ORION_H #include <linux/mbus.h> diff --git a/include/linux/platform_data/usb-omap1.h b/include/linux/platform_data/usb-omap1.h new file mode 100644 index 000000000000..43b5ce139c37 --- /dev/null +++ b/include/linux/platform_data/usb-omap1.h @@ -0,0 +1,53 @@ +/* + * Platform data for OMAP1 USB + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive for + * more details. + */ +#ifndef __LINUX_USB_OMAP1_H +#define __LINUX_USB_OMAP1_H + +#include <linux/platform_device.h> + +struct omap_usb_config { + /* Configure drivers according to the connectors on your board: + * - "A" connector (rectagular) + * ... for host/OHCI use, set "register_host". + * - "B" connector (squarish) or "Mini-B" + * ... for device/gadget use, set "register_dev". + * - "Mini-AB" connector (very similar to Mini-B) + * ... for OTG use as device OR host, initialize "otg" + */ + unsigned register_host:1; + unsigned register_dev:1; + u8 otg; /* port number, 1-based: usb1 == 2 */ + + const char *extcon; /* extcon device for OTG */ + + u8 hmc_mode; + + /* implicitly true if otg: host supports remote wakeup? */ + u8 rwc; + + /* signaling pins used to talk to transceiver on usbN: + * 0 == usbN unused + * 2 == usb0-only, using internal transceiver + * 3 == 3 wire bidirectional + * 4 == 4 wire bidirectional + * 6 == 6 wire unidirectional (or TLL) + */ + u8 pins[3]; + + struct platform_device *udc_device; + struct platform_device *ohci_device; + struct platform_device *otg_device; + + u32 (*usb0_init)(unsigned nwires, unsigned is_device); + u32 (*usb1_init)(unsigned nwires); + u32 (*usb2_init)(unsigned nwires, unsigned alt_pingroup); + + int (*ocpi_enable)(void); +}; + +#endif /* __LINUX_USB_OMAP1_H */ diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h index adae88f5b0ab..a964f7285600 100644 --- a/include/linux/scatterlist.h +++ b/include/linux/scatterlist.h @@ -345,6 +345,7 @@ struct sg_mapping_iter { void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl, unsigned int nents, unsigned int flags); +bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset); bool sg_miter_next(struct sg_mapping_iter *miter); void sg_miter_stop(struct sg_mapping_iter *miter); diff --git a/include/linux/tty.h b/include/linux/tty.h index 978d0f09d039..90b4fdc8a61f 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -142,6 +142,7 @@ struct tty_bufhead { #define C_CLOCAL(tty) _C_FLAG((tty), CLOCAL) #define C_CIBAUD(tty) _C_FLAG((tty), CIBAUD) #define C_CRTSCTS(tty) _C_FLAG((tty), CRTSCTS) +#define C_CMSPAR(tty) _C_FLAG((tty), CMSPAR) #define L_ISIG(tty) _L_FLAG((tty), ISIG) #define L_ICANON(tty) _L_FLAG((tty), ICANON) diff --git a/include/linux/usb.h b/include/linux/usb.h index 512ab162832c..c716da18c668 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -965,6 +965,7 @@ struct usb_dynid { }; extern ssize_t usb_store_new_id(struct usb_dynids *dynids, + const struct usb_device_id *id_table, struct device_driver *driver, const char *buf, size_t count); diff --git a/include/linux/usb/chipidea.h b/include/linux/usb/chipidea.h index 7d399671a566..708bd119627f 100644 --- a/include/linux/usb/chipidea.h +++ b/include/linux/usb/chipidea.h @@ -24,6 +24,7 @@ struct ci_hdrc_platform_data { * but otg is not supported (no register otgsc). */ #define CI_HDRC_DUAL_ROLE_NOT_OTG BIT(4) +#define CI_HDRC_IMX28_WRITE_FIX BIT(5) enum usb_dr_mode dr_mode; #define CI_HDRC_CONTROLLER_RESET_EVENT 0 #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1 diff --git a/include/linux/usb/composite.h b/include/linux/usb/composite.h index 5e61589fc166..dba63f53906c 100644 --- a/include/linux/usb/composite.h +++ b/include/linux/usb/composite.h @@ -468,6 +468,8 @@ struct usb_function_instance { struct config_group group; struct list_head cfs_list; struct usb_function_driver *fd; + int (*set_inst_name)(struct usb_function_instance *inst, + const char *name); void (*free_func_inst)(struct usb_function_instance *inst); }; diff --git a/include/linux/usb/functionfs.h b/include/linux/usb/functionfs.h index 65d0a88dbc67..71190663f1ee 100644 --- a/include/linux/usb/functionfs.h +++ b/include/linux/usb/functionfs.h @@ -3,34 +3,4 @@ #include <uapi/linux/usb/functionfs.h> - -struct ffs_data; -struct usb_composite_dev; -struct usb_configuration; - - -static int functionfs_init(void) __attribute__((warn_unused_result)); -static void functionfs_cleanup(void); - -static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev) - __attribute__((warn_unused_result, nonnull)); -static void functionfs_unbind(struct ffs_data *ffs) - __attribute__((nonnull)); - -static int functionfs_bind_config(struct usb_composite_dev *cdev, - struct usb_configuration *c, - struct ffs_data *ffs) - __attribute__((warn_unused_result, nonnull)); - - -static int functionfs_ready_callback(struct ffs_data *ffs) - __attribute__((warn_unused_result, nonnull)); -static void functionfs_closed_callback(struct ffs_data *ffs) - __attribute__((nonnull)); -static void *functionfs_acquire_dev_callback(const char *dev_name) - __attribute__((warn_unused_result, nonnull)); -static void functionfs_release_dev_callback(struct ffs_data *ffs_data) - __attribute__((nonnull)); - - #endif diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h index 942ef5e053bf..c3a61853cd13 100644 --- a/include/linux/usb/gadget.h +++ b/include/linux/usb/gadget.h @@ -148,6 +148,9 @@ struct usb_ep_ops { * @maxpacket:The maximum packet size used on this endpoint. The initial * value can sometimes be reduced (hardware allowing), according to * the endpoint descriptor used to configure the endpoint. + * @maxpacket_limit:The maximum packet size value which can be handled by this + * endpoint. It's set once by UDC driver when endpoint is initialized, and + * should not be changed. Should not be confused with maxpacket. * @max_streams: The maximum number of streams supported * by this EP (0 - 16, actual number is 2^n) * @mult: multiplier, 'mult' value for SS Isoc EPs @@ -171,6 +174,7 @@ struct usb_ep { const struct usb_ep_ops *ops; struct list_head ep_list; unsigned maxpacket:16; + unsigned maxpacket_limit:16; unsigned max_streams:16; unsigned mult:2; unsigned maxburst:5; @@ -182,6 +186,21 @@ struct usb_ep { /*-------------------------------------------------------------------------*/ /** + * usb_ep_set_maxpacket_limit - set maximum packet size limit for endpoint + * @ep:the endpoint being configured + * @maxpacket_limit:value of maximum packet size limit + * + * This function shoud be used only in UDC drivers to initialize endpoint + * (usually in probe function). + */ +static inline void usb_ep_set_maxpacket_limit(struct usb_ep *ep, + unsigned maxpacket_limit) +{ + ep->maxpacket_limit = maxpacket_limit; + ep->maxpacket = maxpacket_limit; +} + +/** * usb_ep_enable - configure endpoint, making it usable * @ep:the endpoint being configured. may not be the endpoint named "ep0". * drivers discover endpoints through the ep_list of a usb_gadget. @@ -485,6 +504,11 @@ struct usb_gadget_ops { * @max_speed: Maximal speed the UDC can handle. UDC must support this * and all slower speeds. * @state: the state we are now (attached, suspended, configured, etc) + * @name: Identifies the controller hardware type. Used in diagnostics + * and sometimes configuration. + * @dev: Driver model state for this abstract device. + * @out_epnum: last used out ep number + * @in_epnum: last used in ep number * @sg_supported: true if we can handle scatter-gather * @is_otg: True if the USB device port uses a Mini-AB jack, so that the * gadget driver must provide a USB OTG descriptor. @@ -497,11 +521,8 @@ struct usb_gadget_ops { * only supports HNP on a different root port. * @b_hnp_enable: OTG device feature flag, indicating that the A-Host * enabled HNP support. - * @name: Identifies the controller hardware type. Used in diagnostics - * and sometimes configuration. - * @dev: Driver model state for this abstract device. - * @out_epnum: last used out ep number - * @in_epnum: last used in ep number + * @quirk_ep_out_aligned_size: epout requires buffer size to be aligned to + * MaxPacketSize. * * Gadgets have a mostly-portable "gadget driver" implementing device * functions, handling all usb configurations and interfaces. Gadget @@ -530,16 +551,18 @@ struct usb_gadget { enum usb_device_speed speed; enum usb_device_speed max_speed; enum usb_device_state state; + const char *name; + struct device dev; + unsigned out_epnum; + unsigned in_epnum; + unsigned sg_supported:1; unsigned is_otg:1; unsigned is_a_peripheral:1; unsigned b_hnp_enable:1; unsigned a_hnp_support:1; unsigned a_alt_hnp_support:1; - const char *name; - struct device dev; - unsigned out_epnum; - unsigned in_epnum; + unsigned quirk_ep_out_aligned_size:1; }; #define work_to_gadget(w) (container_of((w), struct usb_gadget, work)) @@ -558,6 +581,23 @@ static inline struct usb_gadget *dev_to_usb_gadget(struct device *dev) /** + * usb_ep_align_maybe - returns @len aligned to ep's maxpacketsize if gadget + * requires quirk_ep_out_aligned_size, otherwise reguens len. + * @g: controller to check for quirk + * @ep: the endpoint whose maxpacketsize is used to align @len + * @len: buffer size's length to align to @ep's maxpacketsize + * + * This helper is used in case it's required for any reason to check and maybe + * align buffer's size to an ep's maxpacketsize. + */ +static inline size_t +usb_ep_align_maybe(struct usb_gadget *g, struct usb_ep *ep, size_t len) +{ + return !g->quirk_ep_out_aligned_size ? len : + round_up(len, (size_t)ep->desc->wMaxPacketSize); +} + +/** * gadget_is_dualspeed - return true iff the hardware handles high speed * @g: controller that might support both high and full speeds */ diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index b8aba196f7f1..efe8d8a7c7ad 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -134,6 +134,7 @@ struct usb_hcd { unsigned rh_registered:1;/* is root hub registered? */ unsigned rh_pollable:1; /* may we poll the root hub? */ unsigned msix_enabled:1; /* driver has MSI-X enabled? */ + unsigned remove_phy:1; /* auto-remove USB phy */ /* The next flag is a stopgap, to be removed when all the HCDs * support the new root-hub polling mechanism. */ @@ -352,6 +353,8 @@ struct hc_driver { void (*reset_bandwidth)(struct usb_hcd *, struct usb_device *); /* Returns the hardware-chosen device address */ int (*address_device)(struct usb_hcd *, struct usb_device *udev); + /* prepares the hardware to send commands to the device */ + int (*enable_device)(struct usb_hcd *, struct usb_device *udev); /* Notifies the HCD after a hub descriptor is fetched. * Will block. */ diff --git a/include/linux/usb/musb.h b/include/linux/usb/musb.h index eb505250940a..a4ee1b582183 100644 --- a/include/linux/usb/musb.h +++ b/include/linux/usb/musb.h @@ -76,6 +76,9 @@ struct musb_hdrc_config { unsigned dma:1 __deprecated; /* supports DMA */ unsigned vendor_req:1 __deprecated; /* vendor registers required */ + /* need to explicitly de-assert the port reset after resume? */ + unsigned host_port_deassert_reset_at_resume:1; + u8 num_eps; /* number of endpoints _with_ ep0 */ u8 dma_channels __deprecated; /* number of dma channels */ u8 dyn_fifo_size; /* dynamic size in bytes */ diff --git a/include/linux/usb/omap_control_usb.h b/include/linux/usb/omap_control_usb.h index 596b01918813..69ae383ee3cc 100644 --- a/include/linux/usb/omap_control_usb.h +++ b/include/linux/usb/omap_control_usb.h @@ -24,6 +24,7 @@ enum omap_control_usb_type { OMAP_CTRL_TYPE_USB2, /* USB2_PHY, power down in CONTROL_DEV_CONF */ OMAP_CTRL_TYPE_PIPE3, /* PIPE3 PHY, DPLL & seperate Rx/Tx power */ OMAP_CTRL_TYPE_DRA7USB2, /* USB2 PHY, power and power_aux e.g. DRA7 */ + OMAP_CTRL_TYPE_AM437USB2, /* USB2 PHY, power e.g. AM437x */ }; struct omap_control_usb { @@ -64,6 +65,11 @@ enum omap_control_usb_mode { #define OMAP_CTRL_USB2_PHY_PD BIT(28) +#define AM437X_CTRL_USB2_PHY_PD BIT(0) +#define AM437X_CTRL_USB2_OTG_PD BIT(1) +#define AM437X_CTRL_USB2_OTGVDET_EN BIT(19) +#define AM437X_CTRL_USB2_OTGSESSEND_EN BIT(20) + #if IS_ENABLED(CONFIG_OMAP_CONTROL_USB) extern void omap_control_usb_phy_power(struct device *dev, int on); extern void omap_control_usb_set_mode(struct device *dev, diff --git a/drivers/usb/phy/phy-fsm-usb.h b/include/linux/usb/otg-fsm.h index 7441b46a27f1..b6ba1bfb86f2 100644 --- a/drivers/usb/phy/phy-fsm-usb.h +++ b/include/linux/usb/otg-fsm.h @@ -15,6 +15,12 @@ * 675 Mass Ave, Cambridge, MA 02139, USA. */ +#ifndef __LINUX_USB_OTG_FSM_H +#define __LINUX_USB_OTG_FSM_H + +#include <linux/mutex.h> +#include <linux/errno.h> + #undef VERBOSE #ifdef VERBOSE @@ -110,7 +116,7 @@ struct otg_fsm { /* Current usb protocol used: 0:undefine; 1:host; 2:client */ int protocol; - spinlock_t lock; + struct mutex lock; }; struct otg_fsm_ops { @@ -234,3 +240,5 @@ static inline int otg_start_gadget(struct otg_fsm *fsm, int on) } int otg_statemachine(struct otg_fsm *fsm); + +#endif /* __LINUX_USB_OTG_FSM_H */ diff --git a/include/linux/uwb/umc.h b/include/linux/uwb/umc.h index 891d1d5f3947..ba82f03d8287 100644 --- a/include/linux/uwb/umc.h +++ b/include/linux/uwb/umc.h @@ -143,7 +143,7 @@ int umc_match_pci_id(struct umc_driver *umc_drv, struct umc_dev *umc); static inline struct pci_dev *umc_parent_pci_dev(struct umc_dev *umc_dev) { struct pci_dev *pci_dev = NULL; - if (umc_dev->dev.parent->bus == &pci_bus_type) + if (dev_is_pci(umc_dev->dev.parent)) pci_dev = to_pci_dev(umc_dev->dev.parent); return pci_dev; } diff --git a/lib/scatterlist.c b/lib/scatterlist.c index d16fa295ae1d..3a8e8e8fb2a5 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -495,7 +495,7 @@ static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) * true if @miter contains the valid mapping. false if end of sg * list is reached. */ -static bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset) +bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset) { sg_miter_stop(miter); @@ -513,6 +513,7 @@ static bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset) return true; } +EXPORT_SYMBOL(sg_miter_skip); /** * sg_miter_next - proceed mapping iterator to the next mapping |