From f7c1be0cca2aa39dcea68f54287fb00f840a5ff4 Mon Sep 17 00:00:00 2001 From: Marek Belisko Date: Wed, 22 Sep 2010 07:56:27 +0200 Subject: [PATCH] Staging: Add support for Flarion OFDM usb and pcmcia devices. This drivers add support for following devices: (usb)-> Qleadtek FLASH-OFDM USB Modem [LR7F04] -> Qleadtek Express Card -> Leadtek Multi-band modem HSDPA Sources for usb: https://sourceforge.net/projects/ft1000/files/ft1000_usb/ft1000_usb_v01.04.tar.gz/download (pcmcia) -> Multimedia Net Card Sources for pcmcia : https://sourceforge.net/projects/ft1000/files/ft1000_pcmcia_2.6.30-2.6.31.tgz/download More informations (in Slovak language): http://ft1000.qintec.sk/home.html Signed-off-by: Marek Belisko Signed-off-by: Greg Kroah-Hartman --- drivers/staging/Kconfig | 2 + drivers/staging/Makefile | 1 + drivers/staging/ft1000/Kconfig | 22 + drivers/staging/ft1000/Makefile | 3 + drivers/staging/ft1000/TODO | 9 + drivers/staging/ft1000/ft1000-pcmcia/Makefile | 3 + drivers/staging/ft1000/ft1000-pcmcia/boot.h | 158 ++ drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf | 14 + drivers/staging/ft1000/ft1000-pcmcia/ft1000.h | 409 +++ drivers/staging/ft1000/ft1000-pcmcia/ft1000.img | Bin 0 -> 305770 bytes drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c | 513 ++++ drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h | 1 + drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h | 66 + drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c | 940 +++++++ drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c | 2286 ++++++++++++++++ drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c | 219 ++ drivers/staging/ft1000/ft1000-usb/Makefile | 3 + drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c | 934 +++++++ .../staging/ft1000/ft1000-usb/ft1000_download.c | 1416 ++++++++++ drivers/staging/ft1000/ft1000-usb/ft1000_hw.c | 2762 ++++++++++++++++++++ drivers/staging/ft1000/ft1000-usb/ft1000_hw.h | 10 + drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h | 140 + drivers/staging/ft1000/ft1000-usb/ft1000_proc.c | 232 ++ drivers/staging/ft1000/ft1000-usb/ft1000_usb.c | 349 +++ drivers/staging/ft1000/ft1000-usb/ft1000_usb.h | 609 +++++ drivers/staging/ft1000/ft1000-usb/ft3000.img | Bin 0 -> 280414 bytes 26 files changed, 11101 insertions(+) create mode 100644 drivers/staging/ft1000/Kconfig create mode 100644 drivers/staging/ft1000/Makefile create mode 100644 drivers/staging/ft1000/TODO create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/Makefile create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/boot.h create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000.h create mode 100755 drivers/staging/ft1000/ft1000-pcmcia/ft1000.img create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c create mode 100644 drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c create mode 100644 drivers/staging/ft1000/ft1000-usb/Makefile create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_download.c create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_hw.c create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_hw.h create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_proc.c create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_usb.c create mode 100644 drivers/staging/ft1000/ft1000-usb/ft1000_usb.h create mode 100644 drivers/staging/ft1000/ft1000-usb/ft3000.img diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index e6c3ee6..35a3ed1 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -165,5 +165,7 @@ source "drivers/staging/keucr/Kconfig" source "drivers/staging/bcm/Kconfig" +source "drivers/staging/ft1000/Kconfig" + endif # !STAGING_EXCLUDE_BUILD endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 88a934e..6221ffd 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -63,3 +63,4 @@ obj-$(CONFIG_SBE_2T3E3) += sbe-2t3e3/ obj-$(CONFIG_ATH6K_LEGACY) += ath6kl/ obj-$(CONFIG_USB_ENESTORAGE) += keucr/ obj-$(CONFIG_BCM_WIMAX) += bcm/ +obj-$(CONFIG_FT1000) += ft1000/ diff --git a/drivers/staging/ft1000/Kconfig b/drivers/staging/ft1000/Kconfig new file mode 100644 index 0000000..7c8af88 --- /dev/null +++ b/drivers/staging/ft1000/Kconfig @@ -0,0 +1,22 @@ +config FT1000 + tristate "Drivers for Flarion ft1000 devices" + +if FT1000 + +config FT1000_USB + tristate "Driver for ft1000 usb devices." + depends on USB + depends on NET + help + Say Y if you want to have support for Qleadtek FLASH-OFDM USB Modem [LR7F04], + Qleadtek Express Card or Leadtek Multi-band modem HSDPA. + +config FT1000_PCMCIA + tristate "Driver for ft1000 pcmcia device." + depends on PCMCIA + depends on NET + help + Say Y if you want to have support for Flarion card also called + Multimedia Net Card. + +endif diff --git a/drivers/staging/ft1000/Makefile b/drivers/staging/ft1000/Makefile new file mode 100644 index 0000000..3e98777 --- /dev/null +++ b/drivers/staging/ft1000/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_FT1000_USB) += ft1000-usb/ +obj-$(CONFIG_FT1000_PCMCIA) += ft1000-pcmcia/ + diff --git a/drivers/staging/ft1000/TODO b/drivers/staging/ft1000/TODO new file mode 100644 index 0000000..1d346bc --- /dev/null +++ b/drivers/staging/ft1000/TODO @@ -0,0 +1,9 @@ +TODO: + - checkpatch.pl cleanups + - coding style + - sparse fixes + - adapt to latest usb and pcmcia api changes + - change firmware loading for usb driver to proper kernel method (request_firmware) + +Please send patches to Greg Kroah-Hartman and +Cc: Marek Belisko diff --git a/drivers/staging/ft1000/ft1000-pcmcia/Makefile b/drivers/staging/ft1000/ft1000-pcmcia/Makefile new file mode 100644 index 0000000..30ad208 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_FT1000_PCMCIA) = ft1000_pcmcia.o +ft1000_pcmcia-objs := ft1000_hw.o ft1000_dnld.o ft1000_proc.o ft1000_cs.o + diff --git a/drivers/staging/ft1000/ft1000-pcmcia/boot.h b/drivers/staging/ft1000/ft1000-pcmcia/boot.h new file mode 100644 index 0000000..c376daee --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/boot.h @@ -0,0 +1,158 @@ +//--------------------------------------------------------------------------- +// FT1000 driver for Flarion Flash OFDM NIC Device +// +// Copyright (C) 2002 Flarion Technologies, All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) any +// later version. This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - +// Suite 330, Boston, MA 02111-1307, USA. +//--------------------------------------------------------------------------- +// +// File: boot.h +// +// Description: boatloader +// +// History: +// 1/11/05 Whc Ported to Linux. +// +//--------------------------------------------------------------------------- +#ifndef _BOOTH_ +#define _BOOTH_ + +// Official bootloader +unsigned char bootimage [] = { +0x00,0x00,0x01,0x5E,0x00,0x00 +,0x00,0x00,0x00,0x00,0x02,0xD7 +,0x00,0x00,0x01,0x5E,0x46,0xB3 +,0xE6,0x02,0x00,0x98,0xE6,0x8C +,0x00,0x98,0xFB,0x92,0xFF,0xFF +,0x98,0xFB,0x94,0xFF,0xFF,0x98 +,0xFB,0x06,0x08,0x00,0x98,0xFB +,0x96,0x84,0x00,0x98,0xFB,0x08 +,0x1C,0x00,0x98,0xFB,0x51,0x25 +,0x10,0x1C,0x00,0xE6,0x51,0x01 +,0x07,0xFD,0x4C,0xFF,0x20,0xF5 +,0x51,0x02,0x20,0x08,0x00,0x4C +,0xFF,0x20,0x3C,0x00,0xC0,0x64 +,0x98,0xC0,0x66,0x98,0xC0,0x68 +,0x98,0xC0,0x6A,0x98,0xC0,0x6C +,0x98,0x90,0x08,0x90,0x09,0x90 +,0x0A,0x90,0x0B,0x90,0x0C,0x90 +,0x0D,0x90,0x0E,0x90,0x0F,0x90 +,0x04,0x90,0x06,0xFB,0x51,0x22 +,0x16,0x08,0x03,0xFB,0x51,0x52 +,0x16,0x08,0x04,0xFB,0x51,0x24 +,0x2B,0x08,0x06,0xFB,0x51,0x54 +,0x2B,0x08,0x07,0xFB,0x51,0x24 +,0x2B,0x08,0x09,0xFB,0x51,0x54 +,0x2B,0x08,0x0A,0xFB,0x51,0x12 +,0x16,0x08,0x0C,0xFB,0x51,0x52 +,0x16,0x08,0x0D,0x78,0x00,0x00 +,0x00,0x16,0x00,0x00,0xEC,0x31 +,0xAE,0x00,0x00,0x81,0x4C,0x0F +,0xE6,0x43,0xFF,0xEC,0x31,0x4E +,0x00,0x00,0x91,0xEC,0x31,0xAE +,0x00,0x00,0x91,0x4C,0x0F,0xE6 +,0x43,0xFF,0xEC,0x31,0x5E,0x00 +,0x00,0xA1,0xEB,0x31,0x08,0x00 +,0x00,0xA6,0xEB,0x31,0x08,0x00 +,0x00,0xAC,0x3C,0x00,0xEB,0x31 +,0x08,0x00,0x00,0xA8,0x76,0xFE +,0xFE,0x08,0xEB,0x31,0x08,0x20 +,0x00,0x00,0x76,0xFF,0xFF,0x18 +,0xED,0x31,0x08,0x20,0x00,0x00 +,0x26,0x10,0x04,0x10,0xF5,0x3C +,0x01,0x3C,0x00,0x08,0x01,0x12 +,0x3C,0x11,0x3C,0x00,0x08,0x01 +,0x0B,0x08,0x00,0x6D,0xEC,0x31 +,0xAE,0x20,0x00,0x06,0xED,0x4D +,0x08,0x00,0x00,0x67,0x80,0x6F +,0x00,0x01,0x0B,0x6F,0x00,0x02 +,0x2E,0x76,0xEE,0x01,0x48,0x06 +,0x01,0x39,0xED,0x4D,0x18,0x00 +,0x02,0xED,0x4D,0x08,0x00,0x04 +,0x14,0x06,0xA4,0xED,0x31,0x22 +,0x00,0x00,0xAC,0x76,0xEE,0x07 +,0x48,0x6D,0x22,0x01,0x1E,0x08 +,0x01,0x58,0xEB,0x31,0x08,0x00 +,0x00,0xAC,0x06,0xFF,0xBA,0x3C +,0x00,0xEB,0x31,0x08,0x20,0x00 +,0x04,0x3C,0x30,0xEB,0x31,0x08 +,0x20,0x00,0x02,0x3C,0x10,0xEB +,0x31,0x08,0x20,0x00,0x00,0xED +,0x31,0x08,0x20,0x00,0x00,0x04 +,0x10,0xF7,0xED,0x31,0x08,0x00 +,0x00,0xA2,0x91,0x00,0x9C,0x3C +,0x80,0xEB,0x31,0x08,0x20,0x00 +,0x04,0x3C,0x20,0xEB,0x31,0x08 +,0x20,0x00,0x02,0x3C,0x10,0xEB +,0x31,0x08,0x20,0x00,0x00,0xED +,0x31,0x08,0x20,0x00,0x00,0x04 +,0x10,0xF7,0xED,0x31,0x08,0x20 +,0x00,0x04,0x42,0x10,0x90,0x08 +,0xEC,0x31,0xAE,0x20,0x00,0x06 +,0xA4,0x41,0x08,0x00,0xB6,0xED +,0x41,0x28,0x7D,0xFF,0xFF,0x22 +,0xB3,0x40,0x98,0x2A,0x32,0xEB +,0x41,0x28,0xB4,0x43,0xFC,0x05 +,0xFF,0xE6,0xA0,0x31,0x20,0x00 +,0x06,0xEB,0x31,0x08,0x20,0x00 +,0x04,0x3C,0x20,0xEB,0x31,0x08 +,0x20,0x00,0x02,0x3C,0x10,0xEB +,0x31,0x08,0x20,0x00,0x00,0xED +,0x31,0x08,0x20,0x00,0x00,0x04 +,0x10,0xF7,0xED,0x31,0x08,0x20 +,0x00,0x04,0x42,0x10,0x90,0x08 +,0xEC,0x31,0xAE,0x20,0x00,0x06 +,0xA4,0x41,0x08,0x00,0x68,0xED +,0x41,0x28,0x7D,0xFF,0xFF,0x22 +,0xB3,0x40,0x98,0x2A,0x32,0xEB +,0x41,0x28,0xB4,0x43,0xFC,0x05 +,0xFF,0xE6,0x48,0x04,0xEB,0x31 +,0x08,0x20,0x00,0x04,0xEB,0x31 +,0x18,0x20,0x00,0x02,0x3C,0x11 +,0xEB,0x31,0x18,0x20,0x00,0x00 +,0xED,0x31,0x08,0x20,0x00,0x00 +,0x04,0x10,0xF7,0xED,0x31,0x08 +,0x20,0x00,0x02,0x66,0x00,0x6F +,0x00,0x01,0x16,0x76,0xEE,0x06 +,0x48,0x4A,0x1E,0x48,0x04,0xED +,0x31,0x08,0x20,0x00,0x04,0xEB +,0x31,0x08,0x00,0x00,0xA4,0x48 +,0x04,0xED,0x31,0x08,0x20,0x00 +,0x04,0xEB,0x31,0x08,0x00,0x00 +,0xA2,0x48,0x04,0x20,0x20,0x4A +,0x7C,0x46,0x82,0x50,0x05,0x50 +,0x15,0xB5,0x1E,0x98,0xED,0x31 +,0x08,0x00,0x00,0xA8,0x10,0x47 +,0x3B,0x2C,0x01,0xDB,0x40,0x11 +,0x98,0xC1,0x1E,0x98,0x10,0x07 +,0x30,0xF9,0x40,0x07,0x18,0x98 +,0x2A,0x10,0xEB,0x31,0x08,0x00 +,0x00,0xA8,0xA4,0x1E,0x98,0xBB +,0x1E,0x98,0x50,0x14,0x50,0x04 +,0x46,0x83,0x48,0x04,0x02,0x01 +,0x00,0x50,0x05,0x50,0x15,0x10 +,0x87,0x3F,0x90,0x2B,0x18,0x01 +,0x00,0xC0,0x31,0x00,0x00,0xAE +,0xDF,0x41,0x00,0x08,0x00,0x1A +,0x42,0x11,0x67,0x01,0xDF,0x41 +,0x02,0x08,0x00,0x10,0x42,0x11 +,0x62,0x01,0xB4,0x43,0x4A,0x68 +,0x50,0x14,0x50,0x04,0x24,0x10 +,0x48,0x04,0xF2,0x31,0x00,0x01 +,0x00,0x00,0xAE,0xF6,0x31,0x00 +,0x01,0x00,0x00,0xAE,0x62,0xE4 +,0xE5,0x61,0x04,0x48,0x04,0xE5 +,0x63,0x05,0x48,0x04,0x20,0x20 +,0x00,0x00,0x00,0x00 +}; + +#endif diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf new file mode 100644 index 0000000..e2321a4 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf @@ -0,0 +1,14 @@ +device "ft1000_cs" + class "network" module "ft1000","ft1000_cs" + +card "flarion FT1000" + manfid 0x02cc, 0x0100 + bind "ft1000_cs" + +card "flarion FT1000" + manfid 0x02cc, 0x1000 + bind "ft1000_cs" + +card "flarion FT1000" + manfid 0x02cc, 0x1300 + bind "ft1000_cs" diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h new file mode 100644 index 0000000..93b0ad3 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h @@ -0,0 +1,409 @@ +//--------------------------------------------------------------------------- +// FT1000 driver for Flarion Flash OFDM NIC Device +// +// Copyright (C) 2002 Flarion Technologies, All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) any +// later version. This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - +// Suite 330, Boston, MA 02111-1307, USA. +//--------------------------------------------------------------------------- +// +// File: ft1000.h +// +// Description: Common structures and defines +// +// History: +// 8/29/02 Whc Ported to Linux. +// 7/19/04 Whc Drop packet and cmd msg with pseudo header +// checksum +// 10/27/04 Whc Added dynamic downloading of test image. +// 01/11/04 Whc Added support for Magnemite ASIC +// +//--------------------------------------------------------------------------- +#ifndef _FT1000H_ +#define _FT1000H_ + + +#define FT1000_DRV_VER 0x01010300 + +#define DSPVERSZ 4 +#define HWSERNUMSZ 16 +#define SKUSZ 20 +#define EUISZ 8 +#define MODESZ 2 +#define CALVERSZ 2 +#define CALDATESZ 6 + +// Pseudo Header structure +typedef struct _PSEUDO_HDR +{ + unsigned short length; // length of msg body + unsigned char source; // hardware source id + // Host = 0x10 + // Dsp = 0x20 + unsigned char destination; // hardware destination id (refer to source) + unsigned char portdest; // software destination port id + // Host = 0x00 + // Applicaton Broadcast = 0x10 + // Network Stack = 0x20 + // Dsp OAM = 0x80 + // Dsp Airlink = 0x90 + // Dsp Loader = 0xa0 + // Dsp MIP = 0xb0 + unsigned char portsrc; // software source port id (refer to portdest) + unsigned short sh_str_id; // not used + unsigned char control; // not used + unsigned char rsvd1; + unsigned char seq_num; // message sequence number + unsigned char rsvd2; + unsigned short qos_class; // not used + unsigned short checksum; // pseudo header checksum +} __attribute__ ((packed)) PSEUDO_HDR, *PPSEUDO_HDR; + +// Definitions to maintain compatibility between other platforms +#define UCHAR u8 +#define USHORT u16 +#define ULONG u32 +#define BOOLEAN u8 +#define PULONG u32 * +#define PUSHORT u16 * +#define PUCHAR u8 * +#define PCHAR u8 * +#define UINT u32 + +#define ELECTRABUZZ_ID 0 // ASIC ID for Electrabuzz +#define MAGNEMITE_ID 0x1a01 // ASIC ID for Magnemite + +// MEMORY MAP common to both ELECTRABUZZ and MAGNEMITE +#define FT1000_REG_DPRAM_ADDR 0x000E // DPADR - Dual Port Ram Indirect Address Register +#define FT1000_REG_SUP_CTRL 0x0020 // HCTR - Host Control Register +#define FT1000_REG_SUP_STAT 0x0022 // HSTAT - Host Status Register +#define FT1000_REG_RESET 0x0024 // HCTR - Host Control Register +#define FT1000_REG_SUP_ISR 0x0026 // HISR - Host Interrupt Status Register +#define FT1000_REG_SUP_IMASK 0x0028 // HIMASK - Host Interrupt Mask +#define FT1000_REG_DOORBELL 0x002a // DBELL - Door Bell Register +#define FT1000_REG_ASIC_ID 0x002e // ASICID - ASIC Identification Number + // (Electrabuzz=0 Magnemite=0x1A01) + +// MEMORY MAP FOR ELECTRABUZZ ASIC + +#define FT1000_REG_UFIFO_STAT 0x0000 // UFSR - Uplink FIFO status register +#define FT1000_REG_UFIFO_BEG 0x0002 // UFBR - Uplink FIFO beginning register +#define FT1000_REG_UFIFO_MID 0x0004 // UFMR - Uplink FIFO middle register +#define FT1000_REG_UFIFO_END 0x0006 // UFER - Uplink FIFO end register +#define FT1000_REG_DFIFO_STAT 0x0008 // DFSR - Downlink FIFO status register +#define FT1000_REG_DFIFO 0x000A // DFR - Downlink FIFO Register +#define FT1000_REG_DPRAM_DATA 0x000C // DPRAM - Dual Port Indirect Data Register +#define FT1000_REG_WATERMARK 0x0010 // WMARK - Watermark Register + +// MEMORY MAP FOR MAGNEMITE +#define FT1000_REG_MAG_UFDR 0x0000 // UFDR - Uplink FIFO Data Register (32-bits) +#define FT1000_REG_MAG_UFDRL 0x0000 // UFDRL - Uplink FIFO Data Register low-word (16-bits) +#define FT1000_REG_MAG_UFDRH 0x0002 // UFDRH - Uplink FIFO Data Register high-word (16-bits) +#define FT1000_REG_MAG_UFER 0x0004 // UFER - Uplink FIFO End Register +#define FT1000_REG_MAG_UFSR 0x0006 // UFSR - Uplink FIFO Status Register +#define FT1000_REG_MAG_DFR 0x0008 // DFR - Downlink FIFO Register (32-bits) +#define FT1000_REG_MAG_DFRL 0x0008 // DFRL - Downlink FIFO Register low-word (16-bits) +#define FT1000_REG_MAG_DFRH 0x000a // DFRH - Downlink FIFO Register high-word (16-bits) +#define FT1000_REG_MAG_DFSR 0x000c // DFSR - Downlink FIFO Status Register +#define FT1000_REG_MAG_DPDATA 0x0010 // DPDATA - Dual Port RAM Indirect Data Register (32-bits) +#define FT1000_REG_MAG_DPDATAL 0x0010 // DPDATAL - Dual Port RAM Indirect Data Register low-word (16-bits) +#define FT1000_REG_MAG_DPDATAH 0x0012 // DPDATAH - Dual Port RAM Indirect Data Register high-word (16-bits) +#define FT1000_REG_MAG_WATERMARK 0x002c // WMARK - Watermark Register + +// Reserved Dual Port RAM offsets for Electrabuzz +#define FT1000_DPRAM_TX_BASE 0x0002 // Host to PC Card Messaging Area +#define FT1000_DPRAM_RX_BASE 0x0800 // PC Card to Host Messaging Area +#define FT1000_FIFO_LEN 0x7FC // total length for DSP FIFO tracking +#define FT1000_HI_HO 0x7FE // heartbeat with HI/HO +#define FT1000_DSP_STATUS 0xFFE // dsp status - non-zero is a request to reset dsp +#define FT1000_DSP_LED 0xFFA // dsp led status for PAD device +#define FT1000_DSP_CON_STATE 0xFF8 // DSP Connection Status Info +#define FT1000_DPRAM_FEFE 0x002 // location for dsp ready indicator +#define FT1000_DSP_TIMER0 0x1FF0 // Timer Field from Basestation +#define FT1000_DSP_TIMER1 0x1FF2 // Timer Field from Basestation +#define FT1000_DSP_TIMER2 0x1FF4 // Timer Field from Basestation +#define FT1000_DSP_TIMER3 0x1FF6 // Timer Field from Basestation + +// Reserved Dual Port RAM offsets for Magnemite +#define FT1000_DPRAM_MAG_TX_BASE 0x0000 // Host to PC Card Messaging Area +#define FT1000_DPRAM_MAG_RX_BASE 0x0200 // PC Card to Host Messaging Area +#define FT1000_MAG_FIFO_LEN 0x1FF // total length for DSP FIFO tracking +#define FT1000_MAG_FIFO_LEN_INDX 0x1 // low-word index +#define FT1000_MAG_HI_HO 0x1FF // heartbeat with HI/HO +#define FT1000_MAG_HI_HO_INDX 0x0 // high-word index +#define FT1000_MAG_DSP_LED 0x3FE // dsp led status for PAD device +#define FT1000_MAG_DSP_LED_INDX 0x0 // dsp led status for PAD device + +#define FT1000_MAG_DSP_CON_STATE 0x3FE // DSP Connection Status Info +#define FT1000_MAG_DSP_CON_STATE_INDX 0x1 // DSP Connection Status Info + +#define FT1000_MAG_DPRAM_FEFE 0x000 // location for dsp ready indicator +#define FT1000_MAG_DPRAM_FEFE_INDX 0x0 // location for dsp ready indicator + +#define FT1000_MAG_DSP_TIMER0 0x3FC // Timer Field from Basestation +#define FT1000_MAG_DSP_TIMER0_INDX 0x1 + +#define FT1000_MAG_DSP_TIMER1 0x3FC // Timer Field from Basestation +#define FT1000_MAG_DSP_TIMER1_INDX 0x0 + +#define FT1000_MAG_DSP_TIMER2 0x3FD // Timer Field from Basestation +#define FT1000_MAG_DSP_TIMER2_INDX 0x1 + +#define FT1000_MAG_DSP_TIMER3 0x3FD // Timer Field from Basestation +#define FT1000_MAG_DSP_TIMER3_INDX 0x0 + +#define FT1000_MAG_TOTAL_LEN 0x200 +#define FT1000_MAG_TOTAL_LEN_INDX 0x1 + +#define FT1000_MAG_PH_LEN 0x200 +#define FT1000_MAG_PH_LEN_INDX 0x0 + +#define FT1000_MAG_PORT_ID 0x201 +#define FT1000_MAG_PORT_ID_INDX 0x0 + +#define HOST_INTF_LE 0x0 // Host interface little endian mode +#define HOST_INTF_BE 0x1 // Host interface big endian mode + +// PC Card to Host Doorbell assignments +#define FT1000_DB_DPRAM_RX 0x0001 // this value indicates that DSP has + // data for host in DPRAM +#define FT1000_ASIC_RESET_REQ 0x0004 // DSP requesting host to reset the ASIC +#define FT1000_DSP_ASIC_RESET 0x0008 // DSP indicating host that it will reset the ASIC +#define FT1000_DB_COND_RESET 0x0010 // DSP request for a card reset. + +// Host to PC Card Doorbell assignments +#define FT1000_DB_DPRAM_TX 0x0100 // this value indicates that host has + // data for DSP in DPRAM. +#define FT1000_ASIC_RESET_DSP 0x0400 // Responds to FT1000_ASIC_RESET_REQ +#define FT1000_DB_HB 0x1000 // Indicates that supervisor + // has a heartbeat message for DSP. + +#define FT1000_DPRAM_BASE 0x0000 // Dual Port RAM starting offset + +#define hi 0x6869 // PC Card heartbeat values +#define ho 0x686f // PC Card heartbeat values + +// Magnemite specific defines +#define hi_mag 0x6968 // Byte swap hi to avoid additional system call +#define ho_mag 0x6f68 // Byte swap ho to avoid additional system call + +// +// Bit field definitions for Host Interrupt Status Register +// +// Indicate the cause of an interrupt. +// +#define ISR_EMPTY 0x00 // no bits set +#define ISR_DOORBELL_ACK 0x01 // Doorbell acknowledge from DSP +#define ISR_DOORBELL_PEND 0x02 // Doorbell pending from DSP +#define ISR_RCV 0x04 // Packet available in Downlink FIFO +#define ISR_WATERMARK 0x08 // Watermark requirements satisfied + +// Bit field definition for Host Interrupt Mask +#define ISR_MASK_NONE 0x0000 // no bits set +#define ISR_MASK_DOORBELL_ACK 0x0001 // Doorbell acknowledge mask +#define ISR_MASK_DOORBELL_PEND 0x0002 // Doorbell pending mask +#define ISR_MASK_RCV 0x0004 // Downlink Packet available mask +#define ISR_MASK_WATERMARK 0x0008 // Watermark interrupt mask +#define ISR_MASK_ALL 0xffff // Mask all interrupts + +// Bit field definition for Host Control Register +#define DSP_RESET_BIT 0x0001 // Bit field to control dsp reset state + // (0 = out of reset 1 = reset) +#define ASIC_RESET_BIT 0x0002 // Bit field to control ASIC reset state + // (0 = out of reset 1 = reset) + +// Default interrupt mask (Enable Doorbell pending and Packet available interrupts) +#define ISR_DEFAULT_MASK 0x7ff9 + +// Application specific IDs +#define DSPID 0x20 +#define HOSTID 0x10 +#define DSPAIRID 0x90 +#define DRIVERID 0x00 +#define NETWORKID 0x20 + +// Size of DPRAM Message +#define MAX_CMD_SQSIZE 1780 + +#define ENET_MAX_SIZE 1514 +#define ENET_HEADER_SIZE 14 + +#define SLOWQ_TYPE 0 +#define FASTQ_TYPE 1 + +#define MAX_DSP_SESS_REC 1024 + +#define DSP_QID_OFFSET 4 +#define PSEUDOSZ 16 +#define PSEUDOSZWRD 8 + +// Maximum number of occurrence of pseudo header errors before resetting PC Card. +#define MAX_PH_ERR 300 + +// Driver message types +#define MEDIA_STATE 0x0010 +#define TIME_UPDATE 0x0020 +#define DSP_PROVISION 0x0030 +#define DSP_INIT_MSG 0x0050 +#define DSP_HIBERNATE 0x0060 + +#define DSP_STORE_INFO 0x0070 +#define DSP_GET_INFO 0x0071 +#define GET_DRV_ERR_RPT_MSG 0x0073 +#define RSP_DRV_ERR_RPT_MSG 0x0074 + +// Driver Error Messages for DSP +#define DSP_HB_INFO 0x7ef0 +#define DSP_FIFO_INFO 0x7ef1 +#define DSP_CONDRESET_INFO 0x7ef2 +#define DSP_CMDLEN_INFO 0x7ef3 +#define DSP_CMDPHCKSUM_INFO 0x7ef4 +#define DSP_PKTPHCKSUM_INFO 0x7ef5 +#define DSP_PKTLEN_INFO 0x7ef6 +#define DSP_USER_RESET 0x7ef7 +#define FIFO_FLUSH_MAXLIMIT 0x7ef8 +#define FIFO_FLUSH_BADCNT 0x7ef9 +#define FIFO_ZERO_LEN 0x7efa + +#define HOST_QID_OFFSET 5 +#define QTYPE_OFFSET 13 + +#define SUCCESS 0x00 +#define FAILURE 0x01 +#define TRUE 0x1 +#define FALSE 0x0 + +#define MAX_NUM_APP 6 + +#define MAXIMUM_ASIC_HB_CNT 15 + +typedef struct _DRVMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u8 data[0]; +} __attribute__ ((packed)) DRVMSG, *PDRVMSG; + +typedef struct _MEDIAMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u16 state; + u32 ip_addr; + u32 net_mask; + u32 gateway; + u32 dns_1; + u32 dns_2; +} __attribute__ ((packed)) MEDIAMSG, *PMEDIAMSG; + +typedef struct _TIMEMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u8 timeval[8]; +} __attribute__ ((packed)) TIMEMSG, *PTIMEMSG; + +typedef struct _DSPINITMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u8 DspVer[DSPVERSZ]; // DSP version number + u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number + u8 Sku[SKUSZ]; // SKU + u8 eui64[EUISZ]; // EUI64 + u8 ProductMode[MODESZ]; // Product Mode (Market/Production) + u8 RfCalVer[CALVERSZ]; // Rf Calibration version + u8 RfCalDate[CALDATESZ]; // Rf Calibration date +} __attribute__ ((packed)) DSPINITMSG, *PDSPINITMSG; + +typedef struct _DSPHIBERNATE { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u32 timeout; + u16 sess_info[0]; +} DSPHIBERNATE, *PDSPHIBERNATE; + +typedef struct _APP_INFO_BLOCK +{ + u32 fileobject; // Application's file object + u16 app_id; // Application id +} APP_INFO_BLOCK, *PAPP_INFO_BLOCK; + +typedef struct _PROV_RECORD { + struct list_head list; + u8 *pprov_data; +} PROV_RECORD, *PPROV_RECORD; + +typedef struct _FT1000_INFO { + struct net_device_stats stats; + u16 DrvErrNum; + u16 AsicID; + int ASICResetNum; + int DspAsicReset; + int PktIntfErr; + int DSPResetNum; + int NumIOCTLBufs; + int IOCTLBufLvl; + int DeviceCreated; + int CardReady; + int DspHibernateFlag; + int DSPReady; + u8 DeviceName[15]; + int DeviceMajor; + int registered; + int mediastate; + u16 packetseqnum; + u8 squeseqnum; // sequence number on slow queue + spinlock_t dpram_lock; + u16 CurrentInterruptEnableMask; + int InterruptsEnabled; + u16 fifo_cnt; + u8 DspVer[DSPVERSZ]; // DSP version number + u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number + u8 Sku[SKUSZ]; // SKU + u8 eui64[EUISZ]; // EUI64 + time_t ConTm; // Connection Time + u16 LedStat; + u16 ConStat; + u16 ProgConStat; + u8 ProductMode[MODESZ]; + u8 RfCalVer[CALVERSZ]; + u8 RfCalDate[CALDATESZ]; + u16 DSP_TIME[4]; + struct list_head prov_list; + int appcnt; + APP_INFO_BLOCK app_info[MAX_NUM_APP]; + u16 DSPInfoBlklen; + u16 DrvMsgPend; + int (*ft1000_reset)(void *); + void *link; + u16 DSPInfoBlk[MAX_DSP_SESS_REC]; + union { + u16 Rec[MAX_DSP_SESS_REC]; + u32 MagRec[MAX_DSP_SESS_REC/2]; + } DSPSess; + struct proc_dir_entry *proc_ft1000; + char netdevname[IFNAMSIZ]; +} FT1000_INFO, *PFT1000_INFO; + +typedef struct _DPRAM_BLK { + struct list_head list; + u16 *pbuffer; +} __attribute__ ((packed)) DPRAM_BLK, *PDPRAM_BLK; + +extern u16 ft1000_read_dpram (struct net_device *dev, int offset); +extern void card_bootload(struct net_device *dev); +extern u16 ft1000_read_dpram_mag_16 (struct net_device *dev, int offset, int Index); +extern u32 ft1000_read_dpram_mag_32 (struct net_device *dev, int offset); +void ft1000_write_dpram_mag_32 (struct net_device *dev, int offset, u32 value); + +#endif // _FT1000H_ diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.img b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.img new file mode 100755 index 0000000000000000000000000000000000000000..aad3c80d07c83c6564918cba5b74c3048f1bba24 GIT binary patch literal 305770 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�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 z%0DFA?UaArx@1V{Wn{4lG7z3lF1-{7hBKOrCsGG`K9nYiz-I3$Xo@e}n86Y}u1=;2+T23dSgeX z8osYvh~cDTRJ)U3yPyA!M@v4_guPmm4j7Jb%OT8JK~8`%_7PRb8`L#vJSB zT0+_Uy^xS1-sB_*aY4?{emIfY(85{m8=9}(x|3hcE%~5eB@0g;q~B32e$=?BY|-u& zLRJ?cX{9gRF2@e=K`%kBeZaAz$d@UFY>y+mj+>|G05>g%06K^wd}PHTc#4ByyccDkemfLC5x={7%u+ zsK6Niv&7xRyxft#;u)m-!H_#=y|G=;K(7shLz^qPwZ1|A&59Bz?TkAb&8zh3%+$lN zCsHp&&`caCf~n2ZD@%bVX>QygX6X5vAt8OMbig&u?vEecr5h6JG9UX5Dbcb8D&mD@ zYC!&xo>cw8XvDXTWv6E;OJ+t>E)2nfV)*!Ysgv_n9%K0GRiybdO6v51BDFU_1k~eM z#@RRegM(B2liKv~_zEIeA+zB4rLI0qGo7aAKR!jNq*WbM>LbXh1%4+^b^e8sEZHujtXwMG8emqW{IczkY~I^7bQC@g_<2vdJzvjtP*~{0k~WxN zOZUc;7Mi|rVO>>P*qNzVKMVr9qe5ic^{Wv)pk->S^{2!ja)#0IH8P3BD`AU`$2204 zb0|AoT2aRT+0OTCzE@mRg z?=GC@ejY$7BwpjuG|zX5t4S4(*~NMobVdTKkNS#FC1DA|Ab|=sakz02*wsl?p>=M? zuZNx(;ZXuNHos~3>%V`N3U}@D6?xX}eL>o7S#w|%VJlBpC*`NueD}>-bRsrl%Mqt9m^`V_#JM2s*^rJ!JGS#r(nSV)bNxE;Y4|my z#Oki&kaG|jymi;_IhJ}>(7Ay6jtBoyP?femeJCtpHV{pIK5y`Q5*6Fy{j?^??+vbJ zCEMo#F^yc2rAdx8K(TAxnkMUG9!}7N^&id=&IN6q=UQZFi}E7=wbl~oQg)f~KsdBt zfve_Cnn3!ImX;_3G{HbyaoewwBxX`J&Xdzr-p?_0U>{?BR9GET&B5TL)Q28P z4SHKndpDC1?G93F0mUU`%I(XIQYa?~1EvOK;*;2p^RM05YP%z!gevFM!9TAfurhzi z(lFKbfq8Q_CwVN{4Vr*1rcB&U7ByxsQiM}7@DEk=h`ogT>Vh(o1kMvdA?;5J7P_sid*f?Efo6nltnB0u z-Uo$I5fI{lXd5QFjEKC59HykG$d9qQL;4X>#(y+jSvc|j*a$c3jKG#V;({NTT3){S=ohcsuf%#KP9WC*p@738w74DZ|iDS9eEu# zOEI|=RN)g=Nq#++9(k8A`doa0JDkBR=k|JKE}?R}97WuVjU|qo6B-)^iW!W;FY~I{ zAo5%{Y^gpaEs^^z=NPM>OIP-+nq}`>0K<+9xSY5)DVbB8Xi>#k`vKQvpILDBiO9Z4 zPJ^s%)IHR4hw@u1;_WL=dp^Ls$J|o5SXJOwuuulQB@G9{6KRe95xXux{E9|7Z4d0l z>l&o{H+`kE=VuC0@0tgKd?jXz)&27|RqP|C*{TtW#fJ2z#N((v)-T1dkVH0zJ>iF7 zQ}UIlhBOdsPHo-GKnFZ4QL7n_8X5LcnwnV(?xN+I#6LDienvO?9hP4> zp%Xj{h}?wD|7nTF;^l%wO#H{A2xEV|mAlX26Qa}6icuV&45`xN1`@k)^gc8)^P=4l zYa`JTiR<_jDPS(uxIOUSAicMlalRH6Co;IuBZ+&hCPbPZH!OHr!GC+tgv#fpPZs7c z+tI&0gKCWU8k^ocZ;wQ`*f1{Pqb{bb%AzvyD2xN$V=nXe`aNr!vnsJ*+F`#wXsru%lC1%86B-&*j3`+d#mRWhHC^9$eW z$dDY4{T_V1?-1EtAqYJ0O8_<5hK^(&UMX0UpqvJkaY|8h^%Gb3w|s58?bo2LfNWf6 zz_HP<)`IuWfn1@$kwZ_NC+tPF+h*%*ppKAO-%Ht2sUR>JB1L;jEAy?=mKja5;_o;e zP79@_9djFU2*2pE*S<7P)_8eo$T#;wW%R%%}dK%K{Fwn%o5KbCEj~!jEeB z574x4!kQ;+mb(%BbPR|Lx5aHL17P@ZV%=lw_C|cF4g7G4Lc44WC!xuHj1m8{02tD9;0o_fT#^V54HB*9+_Qu?( zpQtW69UXBkshnKU${{DfRUe-6X{U{{ivOclZ})}xbr~}=J3umVJ-7yT)d(C^an6Kj3!9u3jA=5?6}$IUV!1R&Oldk)lG9h7e?W%u%i=0JQdrKg+kC zA8WZ;wMf8|0@hEk1@LzQ{v2gs|2c9jtQRQf z70-$q3(;Q+1&yT74^w$%K{^IS4NSKfV!=R@R%`aO*(&`7g$(Tx^ZUo&vdYS)7D>o* zv}Xo`r6lQrZ`BJ2NgnDkm=8$|cO`h$&sO?fP0`_igM6Gp zAdlf_3?`2)qmd~faMX^6m<}}rCd}~fZ~csE1U!D;D%6!Rm$ZCdIidbjAL#Zl1x>KS6p{1T?zPm=V`&R^Rr%KToTP ziGAHm#m$nr)*9g952f7XF{k}7yRz`WR-M_O4)b`&fwxKY6W61&jrmCLo=a*^YEFsI zf$_E)G$LwTt>@VQ^Oq)|^dy=&tQ;&9@vYAYlWBcOPptXLk^Z+HeD(wmo91qV=3w1f zdAQOg$}f>t*Szoazi1c*Sguy%S$MI#8#_EcU5|*o!0j2AIa6zQ*EF)JlZ<)k9i=+W*zAl&gkXqSiDpwNq+Gr63*zzR)g<5( z^>*FA?x~WCpU{07({)PIbVDRr>_z35!)QlKZG_&1Ux2s1rznOwL@C+n!Z4s~5-BelTa&PUL&;`9Kk> z#0wZI&JJpK)>mX}-`HSxvis${KlOVZsuIzw*6Im=%YZ!fI=a((YU#gf_mId1-}{bK z$n7gcU!Y1|v&!?WFZ{L_+FP`-1X;CH!Bl>Dt+9q5ANR%hBFo9aX2#^98+78W?)yY$IOde1tQ^Cr4EjX>9nN;pzkiT>3+v?6|-3#vPP)Jm0WFU z*7tN1FIz)3z)Pi_|7skrwRyI)G|jYIhqu|4xHeFC9LWjrC^G=od%$)H^}80hMW)q&T)Wwh{aVeE>UG}rLwp8` zLHAZ;<$nLM`%Lhb&p4`;H!|RYf{sJyJD(_SN#3qABGKKOX}qbV0b%6Zyj*Mb;Cdc# z{qIk^!t8*i!!qgfggxB-EqujIEV6WK~j9^FNiYneandJ zke9*+FMH%sEIO?$1XuELZGcBz$1k?=ucMKzE1HU|ZJLxCpC;*G!|3fP{qG7>X@c6d zNZJtS!IRKy82O2bL4JbVgHXV5zBC2TJF1Lz{YAeVFGa{|9kM` zU@G-D9XojtCQdx&cjWQ)PjZY2$CcuWpfETwW{83L}vmc9b;60 z%Dn8UGk6%_Bgh|zt{DK4PgHik{6$tZsLy{Dqn0D8tv;NnZ1&|htjB_T@ujMT0{Qjd=Bd`f-RWkdhbym+u4iaZ75hFxBXCcVPTnFBBU+0XRue=*E`? zBrMA1!Lmj3g`wbo)eaOy&Nzgi=WrSmg4eIS7ua?$BxXS{K;NG9`33VD_cCK?{tkX1 z+*wV+>4Oeid}NXhbaHgQERIr64hBalP0@dQ27Z;MR062b-+8PMgj9T`vim7vcP}x&4$0-Np^N3^Q)^9`oEwb3(HL)3e>dBjLNiY zoZoKZOdvhFx*N~Q_7+w4eqYj?s2-etET&J^M}1^}i(qcGBP$qr&`i^`eAPw;et4yj zjRM)=RhztUDi8&wQv4m6q~n&(07Fxtlnp9WQ@WQ5J@%)@tA!%{yrc~rvyf>mFmt=f zuIl#*YSREKS?VBa#sR&5-F9qJaiU`=b_nrtiB~bJ^~_ zL9WfmWvesX`CY)QcDDKYv>t|>um17_@s)$V<;^CP6Qj1$pc9pGysc|Zj7ywNlv6UC zs`bIUqv(YpzQ6@6Rr!u|uGTC* zu!8;d$bq%V^#G8v|8X}Z<3TveT;}f!q{6Lfj#b|+(z7v?T{rCt=DYFJUGGg`Mj=dd@OMf6P#aG8*8U3V6GNc_E8>zkCK3K#we_ zs`&W=KRTfo=*y7}V1Py?tjcJc5S8|L^o3Up`uAzG3EpANFP0S@?)eKVI5-FSMAczd z`FwR((h_yeaupl1_P`l3pOf``+4eI>=AN4%IN>RK@Ez~#{{|R0s=T9^*G$h7_joqU~p`FvY@IrD>SzIoOrwpS7Nm2MW)&q@y8P18G{J>odAq@dbk-5ETbUP<&pNL&k zZw)Nbtm}q&;|E;KkB00DxRRliCC{vop+!#LD|mib^~q=ar*E`&lC3a8bn}3*Av3xx z$P2Q_L&BTmYYP*fZrBo?(Z?>fNhpO((KeGnI@*M+LHJl0{z3uh^6?xo7S1QrU@IY;?l|E!M> zb`5n&uWD^qz|>AS0li2@v(A8S*=iqTCoogC4y=9 z`$t;?IFu!BxGtYEPHFA{YWLW5pAFrCHUL#Vr1;sU@Y~Y=(ZgOhpt(J4@KajB(s{Yn zarG8AJ1=e87U@i01jz9r*EgUZ47)U(wfA#Ms9Stcee|_@;d$$Kir%hk_mc)X7V!I1 z1iN&8dOpQJaNQugc*y{}1F0%aU*e2G%v`#6i)8{~QHl^Et8;1SpBr1nR% zY3J8e$jvTkg8csEl?Uw4>Vk_ni*uzd@_tv+G5mj1Q?onhPaFd+OOzu%g#_TZ0iCP& zI1vn^I}8_sROOh z1fhnkfctxBsXJnG45yr)MPctJ(zK4GD%o(S=&B#MPbE>zV7MBq5JOTz=&||i1XvY6 zZMH$-0#2V+8ED?&-4OW@5UKfUyy6GIj>Hb|LlwrjTCo5JC;AIlMDER9}qly8^INb8*aLU^ZAA`;s$80DSAR{s+NG{VG!%vjdyiK!A_O?d=y&^=Sw_c?!= z)om01Q#N_M!DksPH^YF^{youoyHlC|mDNZ&VBD#`-o-{cB-E6R^_Lo)JP4?-KkIa@ zIssNXn&MMuVuz8=3YI?!T}}_VEy>gESZT9Z-tfGm`R4#e3n)p7|6g#;k>F)_*Y!-w zc_90PprP&*no9(nNE#vjYJwfXB1b}N)f(R-3|r9a;G!L^d7a~|1G?<_0?8_F>Q>K| zIvInci4=f)@%ahmW^S=9DFj--a~<9R#ON4Wdf=*=CDrLl!ruj!(sZ?HVJtC`|DHqu zEvAI)ZpDW1lA*siDJ*}-8u-DN!kqA-+dsDYg3QeTs`yLxJAjZ@)k(CQGeucyO}i`# z_mh8Ob-<$S|C1O}%)t;w0ONaVtn|^t0)))7a(mMPh#ivrGNorG#Nk|Ekjk%GB?)|L zeVxetIR25#Qeh8p-W@&!OQ4xs|3}eJJrMOd8@eHN^dt)X%!Lt0zaE!H!)rN}b z`$KYxb&92`!0g)mW)V>>5Z7okp9Bu*Lcr)YTE_sSyM7;jqbpXxP0qsvI+| z`=d7!1XqY6$^NL2(mSG0=HHt-`r_NJ0GEPCQ@%eGP~EkW2$!ivN+bCEU@98Ai$_9Z zZp2%}mg&t`g8w}^hdVYpAXzR7?NE$@H;5u~7%(4)I6bRq(I;_v7HY}`gG^)_;(o&~k&tiuvl{(tf|#Icv?w$wvsEU+w%Hb_}a3mPytX+2hXFb0M%% z;fBroW?jj_fmPQG=sPq%G(<^|jnnimQL6oO zKVIz+z?VVdF$RA6oUE2V6tH%MgdAXt`_nvYwdPrbT--CXx6y2;!6L)(SoJ)ePTyz4iK4SrN7Cxf?*r>p-OWYGp|aCkRG94cl|oTPsl zaj;Abtm_-VXVc1Gg_eUe9rd1Nwosair7exdEfG{Q(F%l)qOeAj`qml9IQ_wVIQ@XC zbho0x4MQDa9o9PLVXbEtle@2ZYc`kY@_O*ey!vq+=;VQ6W8Cl%8?$*``o)^U8)Z$S z^UJp!sS4ada{yTcvNzbBtM6gN=|Z-Doff^X%Yav{;#slt@8@2DUj~^owVb(EG;0Ll-^i_EvG622*cAc-{uZFH<;?>3? ze;ovz;f&xyRVm)fKtIr5@3($PXIr&Y_Io5Zdnu$wn}??9iqvZ)sR-Te#Qd->X97kk zEJO)bvYC-wwUfUeKh4#d$glXnuwH58j%a-W!#!en8EA%=4j)|oP%NM;mz!Holic*7 zF20smTL|~i6Zgw?V8mElz4!A7?_h$} zE%PekpUF=hZK0{R@e#>4y%^ra4pV*DmzUhB^wA*O_QwSDX#{?cA#k8mNn$Y|-tWo( zyax1kQ~QPw;Zh{;l&rz)9{3I+$NpMS6P^8&rg0Guo` z?wI4j2(<$m+nfa81cizMtJ1(Gdm3p?s%UWmRhi{+R~#+mN1F$}wWZ11b>Rgsu(zHq z@Go@5P4!l{86i^ur zd$XMfUa$d*DnsC2fSpDEI34I_M6HZ;#x(A978a^g1Z`{rmBtmZ3sA$?a1lB806QBS zT&iKN)Z6+xlpMe6!eX&3tEOR#uJ|$y(1Y;0luXfjA-G`$NO~<6zrpL49RY5>2+$9W zV!h+U1#*qvB$~D7EObv^U|$kxd@dubDYcP8x$ph}T+~_WqQKVW_>$AN4>Dj;MqNjs)&dDIOD*1C5AX#(M&W=O#DEGzi$ zlR+pn-uXmu;Yz~*s4)5V&lHZC;1BK1D8OHdV#5C#s}XV@ppf=ADM*`0HN~R9^m_4{ z^?P$(QLFx#T%!c4b_8)5-q1QO4G&$ubFE-eR#QK9wc%gn_k7D%)~cC3b&`hGtYj7*t5=#JuUulwo(IxzO$>7A$D_m4s$2!}dCM zy$SuqV)dT|TDBE`+BZh()>-C7QF4M+e)K){US9SgqS_a?vhZ!pMk@$(Oag|}uwTTy zSfnG-b@itp_0pQ%^dt4fx#yOdsez&`F8A$#e4uyqr6K);!+aO|;bQ`6&4z~-9q?v< zQn3g*n1_Oz)Z%Pwe&gY{_V$?S$fm6X@8um_t`<_hSH%Mp$ZxW^{FIc)il+YlYKl%p zEpPkz3EG(ZA*BL-PE-FM%_zDl51C#JmXv=Xf)$lQ6HYtPS4_8aq^L$)clm|v+>$nv z^LM`eruu@-)l$be3dUdGE4+(CR)q?aJKp7J8PR*#$???Vn-omONp5iO#k*ak=YM-l z_sd!3>{~b%ufolCAP-Wh?p5fPovwJJ@}z{8e--SLF>P_V z5BN^#dYw3iN1&IJNL~h$i*uhtaP~Oz4M8PgWC&ODPZFgM+nBU4qjGKjR=mf(A>_}3 zS;MO`0667C#b6i9T?8J1egXkirL6VD*B9`$R%|<7({ym4Z@l^0g8MI?Cp7WRS!cr> zIx@|OeY;*dXbeIyo1N{}S~}a#-CazZU_2$)ID*I0#OjL4r zp5`D%9|@-9=PF`8^RVdeeCkVp!Bnxy{Y3Zm{9qE1m1rHO)H_C!VmJJAcxsqC-<9wd ze}C7C&p4cdyWa17f4q}7YHpZJi7k8B+=RVNpL6A9gRPp(o;17z_r(|Bbo<3(>`QWA zDeQFO)eY8}HeeJ_Ze5gX44C30q5~1tN&*fNL&BEFO^GRU8EGrO`kOzNDpo_81B|)i zr`xkws&56Xwfr45FK`&NIh5BJ!yE0XxEl$z7Vq4SlIwZrs(E_5RXlw$P(Hrud>U`_ zuiqMllmhMDL$OU)DqzdRGs{$Mk4-;3H~y&HVD_f+vhKBOIH{F-3|SwJzZ>Pg7xLhS zN??n0_^^}PMq+m(r7;(A+*e~URHSLM!5hKdNu6Za^xx!#&v02LTcfeFF-KVzIMv4N zmHYX1!eo5XoJUuwl6X468H3Yex@?C270=Ca@;>Z)w51Duxi=ESwyyGSVm}0uv=z~L zY}fH%7fpoJx(&bPVRvs@vy1f^M{(108?#RZdT|_h-L?#LMl-56 z;?k80=bb=ov3$Aat{Ab_ycRBL}&tQnp;8%UUALM6FDhtvTY~A)T#}CBqNH4*ui29j zt&oX<|Mrii<0iOq-=>WZP6$tChz+u3O&`N1x{`gmJ~H$N-F;^W~zM6X}zIVHtihTqgE%IK`AX`+dt^?O3@ zc+N^O^8Fk5`~5xEHLiV~8OVq1T=y9;0;j)i$X-=n5uEs=izI_%t&@!ClApMXdU8Mp zMb~f+UKjPrL}SjYb$ZSs6>D|T+$6jgeq;YjL3lKo*_+b_y_#Z93N#Gu64^QylYaTx zDh3gwbG9n){GUL}g1Hk_S51dKy?$+4yv5>`M|Pu^+EBs5STS(d*gr2^gUQ6@nlC(N z28pEJ`8XX`eQ=V6&PnD9ElXd()<$9O5e+j)T?*{?{viJxrfWWXDJtx%k43?Ix``Q) z=VBx<32Rf^)ozqknUg%gna0>CIhk$t<@H#p>yZjFD%t5g+Dku8dx#5D>Vw8_(0%;2 z%pOw_*DNyay_a?E`vrzNX_I_kJ!*^5UQ>>(&N%*Ein#rZM(7u!ayx<6Pj@M-R zQQ(PTnw((66s9tc>3ss2PI%vhrPS6OvZM2R&bTT4>n3<=LpTn;%!HWxKdNWGJom5n znOnga_%Xe;J*TKIJ%9a4{OR^9n-BS{eC&qU_)Wtp(nEby3*_rx9p&VG&A9|83Lzup zb0Yd*M(3@(j!Q;|qwm$_TeT;dArg1ag@O0TbDBnzW#nZshb7Hh$W9gDzgJcr@y11? zOYvhBnxVjsxO%B6rxsprwf1)&t52g%2-U86#VRLtCXiDB&~L(zcNZaftD6=u7d7Qv z?{Q_OD5St#q-N24qc;Z;QrfPtH(EQ~YtNg_%HOn>NB5wZr?|#3#K6eN7!88&GP`*U z+yj)}tqk8O&ge+hlmpKm}@x4BpW6_g#vOKCe>lmH*ndV<{aQ zz2xJP&iq9|@)EWU6qp2k&#ZUQt95RYTe(fSuoG@A#B;~3OhW%i-0<&&osaT9@A8|E ztLE-`QuD^AKCiJ$wI<<_&?cX#>g)2znb(?^^seP-O;SCsIauXZmwya*xmg()tf05V zq&;Y0>DQ*c1Zb}wQf%HsNqgjSl9?ta9x!ox1iFw>62%YL9!=E)HDQG3;NeIJK#pI{ zee++s9%9DtNxpR!*HEeZsHMYWGJDEts;X7#NU+uXayDBkm`mctA1;2t^Q&HF18&-H zEQsZW37le&;N+k3uz~4Kbe)j+bGp!?DWA3jX}=rx)D(`r$m56pBajPA{%9<10CqU0 z=3H8_3VqlvY}=6|{`;iH(4&k&k@*-U^b!5q#tiIXC%d(_DW1u2vi+C$RrI7qH821( z2B}k_d=<|6kKbnldX6u+v#H*9DSziVs*1(y5Wr%gA3ain({8g%4Okk#4}XY49}xeZ zeRlIS#rpKM*I$n@esy@VSoJ~g6Wq(lnNL)A6GHV?LoEK^yQRxan!BTTx_ z8B|z``rr&d@XMd2S&^#paSDxcfO(y%c^gTKt`W|oLb#FI?ooWkQs$rz{)I{w^z@&m zljc0usJ5AQD(&=LdvYr56$@oCz@Axw9>mXjKrVLwT0)*hKW(096aKcDM?^nmnN}y? z&r8ghNd7w@=&_Dgx8{MJXpCz-lMKV@>zC)tp_1s)RwzXevbR0lCdwfthlHGRS(C<& ztEa5aREAgi4jrDa^xIE-K1P8(2szv#jOEAQF?MbT7&CrvJZ~*zdijwu%r5!z0d;@> zYyR#)Lk@}@>a4MV@F2%i5kl`XtWMQ}&$)nll+zF0e5{P~WqYtt_Cr6s-fXl64?}9; zeJjS>uooc=b()TJ8p=LMmo&}-{iMR0vuNk2dRJ(%YKyHXK0>Qp*rx;Z`Kd2I-zUqI zpv6hF+zqzJv_hbGzWV&6DeGMCgcCP8fz5WURB zGx`PX4sfFm4C?CLTyE?Ktx*CEf`V`#NJKli&4R{6-rt`7MYFLK1tmLhe_rREB9WYu z@Gs_3`rqq%o)X(EN6FQIPJ%0@HnlLzw$)Qin6i{L+0z8}@Zx+#ifPIgx>H-thmNxj z14F~3Ol*MIXq=%<|Bxb%pK$YsY|2;?ocFt`&i}e7YM~X;VN|X=Nk$=#9So9Fi)_tuQMf~vh70wY>9aE6DSdB5RecRGRh`I z`&dDL@ra}Vr(N5hk*MfHg0+oXMA7nBF+OtEE0Sdmdb&_ka+E#wSiL3OsFTjjUlROQ z<9)nUe)Q?SEn<_(&{=&FQ<0_(e1JSHLiA(RFQMPODE|o?_3x?>L}B-iKGuo=9qyF2 zfHT3Q`EOeJo7X8ReWCsqZ=-nf);8w)nIM^)#9r=UaoM0x^(lxtzd0 z8mu;$*sS{CBN48M&6^l=(Re{vnC$j?D{JMlUa-8fDQ=H;VY$z$`2=+|o7@HNOL-Q_ z=txx7Pu_g*&51}}c;kEZ$779RDSM)z5>yaKTc;U10Sd27LMN|=&|%0&r9V2z!c)|6 z=D3K5CB#Z0_1;I6uOybjWQM&`>7fmbGhG^T`{y?IIfFkvYO|o3)K_7%wz=P!x7M z;&olkQy-b?yqoI;b8zhXle;vD9;KmDqJ@(};Mi??5rD%L?rRm?E*gJ!na>_X6RRrmi>dFywT= z*vL}R4_7cG7X&dx2c)k z-T9AsR8`?B`0bCscHLwChQe#Ur4U|ik$a%FaWxkWCu%FP+1lZ<5_6a0uJq%8lD24h zAF`NMUn5d>%_BuP7L6v?PVw*sGmEUDsn4W zeBH6~Pt(OY_H+u(dHS)JoBdm{$c@pfr3sV#IGE@NjdHuc-^#w)g2`9t)R^98_jpxk;}T2D{&rzZ++iDwQ6+vl#F_`>;k9PdM9J$OoS~RdeG( zbb_5-`BLc6qsoBbV{IZM;!oEu`k;{Nah>OAO_lx=_2n4O0#($|F{<|4!$eda>4r)=E20#DwP=*!OKz&uTUdyPo|ORS3N z>ouT!nlT(RtBAVA$;Q_FZnI-)V+2{`zrqOwWMuStmy1|iSoT(W2HRBV|DGef#d8z7 z6?^@>FL0NGC3nH7JT=_kL2h-~jMuMd`b$>M-`hvDYd5R6miHL;EFxDK5fbE>DvAj) zdmK}hN8g%@A`=I$0zys3sRz7zaWOe4RAwrSo#{Z`7w)DCDq5dUU!@+9f6aJVsElMO z;;1B(fT~^26$%`9popF}y=MSRcJOWGYgjo?&piM3&A_@K@un zVqCoZ9Y3A$+8*OqrL$}`oD&Y1RUCB7-cNsTc)fCm{g}+q_5*> zEpxR5PT?2vqx#tL&)?x`nx&9{r>3@|D`+8hp4DQH%}wBsfQp_$R9=$`x*AG1BMf4C z%Ry!J?JKV93hTUPC*sFnMJmPHDwto)Vn(5-z8V`8Nn@b!BP+a56DsLlW$q)oPK)!+ zM)q?OnmRWrFtf?`<%78e1>v-C6I zMTXNNb7MC#@1VGr|cA`@na^00;{+d z>~9MnTHHH{(r`X#zob{o{rcQ~Ov8`70hB%8jmyE0W?xDC^N)dlo1=gWJYWA-R2#;z zALmYZk5DDnEHH#?TB{2y&#Aw3H+>`gbI=CAKDV5Dc$W2>!P_!ZT>7#>O<|wB!dmZD zRPma6%tamjpI0tj^|z@?W1EfEnqZLM#$hI>`67SxYMQ?9E~p`#S|x9B`vF6wmQs7p zObhE5xa&k7E0kOfUdgmdlYbfb7}x*kc@20f#$k`>sas}y^EnU$E6c5BomR2V+Crp- zZ9mf8Ok#;?R$qGD=2-e1FU) zl&dZ(r7t-XEoeKhJ?sKH6dt{OEK_8GXhTOdS=E|5#>t`9MQaX)m6=;>F+Dc4MnPZ- zOE^M<_=03x=HdjEYT-29xc|Gu6nq>^AHPp;rkKvV1J*PI484HG`xK_jw5L4JOG@&g zJN}JeNmE6Uwm;u}^aA5(Oi(n4aH%h&;9!bqX)PqCMo+=L^+PuLH}R`ePEk+_cftI` z?ulfpPG#SV&cc#6arlGbH=M%J@@~Yw5JX3umo}k)RoXmC`ON5kM8;ZG`~8sl?o^wK zE$aGe_BC9Z1!0tMbM61hcML~JRRqf zD~D|DNOxHokozCIJ8FTRcCZ5nFhA`!1I}Geb$bQUIsr>nX5iM%ejON>YE6gEOO1M9 z?ctSwxVwLQip`w)ibW}L^&2A3V72`kU8oAq(Ax{#m4T*>lgZlV66%><_9yJ*^4)?W zYoJ!x1*N8eT-Nz7;pfor8v`4XW6fJYQd82$5>9B+V7{0p>&0v5756?!eFtVX3T(dDz|L)liC1FMO8=dhhKe_Zlfz zLtA|~&oa&;Q$@G$v5#pqpgGWNzN6Li6RLaWXsb=?sO2y_6#e-=ee1}BpDh}|wNc*3 zhaRiBer7sN0W@I=3;bhQId2g42{snaUbkRtC>3=Cbf!CdOmZJyG;?A zKrL#ootSJ4V7cqhF$ico^0-O}rlfMMh5OPHydPFJq31?6O@I$3LEFTWRJ3y;@h9=F zdp?0xl0q?TV<~>QGv1I#(9$`3nfL69DQ-b7w^F5kscOvf^0i7c?DVJvD*|IUzclX| zCrK!?-EWTKEFk#DW4=VoKQr_x0Y~r8)c}dnyJn3Zj)5sGHDEN8g6c#lw8I^hE;a?#Bv2j}9fNs?N zJ%#o|n9cOH`>~ZjKL8z0iDoQwvxD}IPvlQfzPF(Mfi}t4QAOLkT23>~;GIBwhYen< zH%`~J(${4IW*Vzc@6!ZG`KhIUoY~Yt|K==qcuzK`e?#`;+!AJ?kHSn5L%jNT+>7?^ zZQAFDew=Zd-qa?2XaDUBjpVfOmgU*5OUd(4%)M0A+6*%eRI>5&8!FgZm|p)1$siTm zTv&sa*w2g8!Q0Q_d{lHkZ1S#y)eU31_wtSLj%5J$=buap;Va^So%-MB{K+2i?8P4c zU_X|5h9vfs29%4qz;SsG;a7i;in?4U()J>{((3$s{m3Zc2OXSGUf{|aDma-;DtZPx zcQtyjnS2xbIyTuhrM|||sk!j%l_Iyq_$93>nQ_;$qbI2D0GnD!BkMtp1P0 z)xoq?PC6*3zZN(<9A+G5T;?Lr7S276ppQYFLBN|OuyV1+d;I{->xFrN{E~J9uOzrv zh-6rBHdH>|`F^LnvYv4OE`w}WnLx_gjPf&J8xDt4OlrQ>n!gaVSbJYFLj!`ECLR>3VNDgQWgjB>3kgh!F&czpjQY6oPnt1U(Ubk>NjLD zry`z=H&9sz+Dbpjj^fYQIA3Gw`7>X>S*PN$`bGKYz563wxxo1{JIWjIrI^hXv9ACt zVL|L4=WIPGSqA)Kl=$#I2kp|*zY|-~!0w^<$&`Z&toi26)E4D$yl2{)($*QsA4`T8 zVG6tv-#SVKZ6?iu>{8bBL1IPVQ!G2QD|pj+*cSVo;$}pMebQ?d83YhSscibH&c(b< zW$lX)3TVn-ZW6Oa+_c3K{bIvC=*k{Kua|7wc5ws;Lm`ejq2{6qUos&npmAGB-GFnu zRPHv@o40+?e>K1w;uIB8xI`7y*#78Kt!hIut;hGe9IP@^Gy2r=4o(CqE840)o0QBJ z!=4u(eZGIq;e_9dyAXrAVhZ2j&ql?S%V-J30P!q1MQx`oCz(Kpd;tuYW5qkK53o}) zHg!dZ-gC_({ya{Dgeq1;s5=1eExc|F+S^?`xT`8#Cy47qTizeCBM9^Fob(L*__=0N zHvERWlMEVg)>bAiYekBljGHQP=RGRO`u=D2o74l(1))?EXh0bPOghZ<6EIT|CG~r$ zC)s|U<&a01A@CK^VWKd_`nMD|i641MeSOPb_^P;khJ7vNpQqhEpw}uOD*-$!PbuK! zSGn+9sHmef^GA-a3&=nA`?O0%hVWwHuR3(`y){f|_#S1f*he-NY zDnx9Y|Mh%J>VP^EQ2*Du1yZIp2ibr?!G|=m_agFw&xS?Kl~DzQOHsdvmiZv%zwZkhXp?s9tgmzytRksm#J zqL#p8OooA*9VsW;$l{TZiGs$CYa7N>J6=Jgj0roqVZg(rHe|_?A7gyi{)_40@xC>(FZ&$6T>*qdm>lpa8Cv;k6^sN8#lAHL`wBWY|el`ka?B}-u zs?C4NpWLdw{Yl{BbW-u(86N-Qr-U5qCwK}4>UD=kVcM=DWSHk$*We2L^1@Jnl~FR=_aliM%}|E>4?pFT;@JbMSGD|}?}?Ik zm`zGt4pA}%Xeq=3IKvS+x-zEs&fBmdJ!L1gy!2lOHwIZDCJj5GChe$jSIX~l8b3fdC_ATV{zC)rzP-}(J+R*=X#3H!(rrG^nK}$ zQ!V!nNI6UB(F&=#;n)aR*gBi3K~VR!;VX82u=1_rHR)eI_%uzvLniTm;~7^*Zoot0 zY#jmjtK{%^ss!*+_rJD=X%e02r8}}|fO^rrB=96sgBKEyNY%YgE=T=u42iR1!Le6JAKy{+sr1%G6Mqe+Hvl3bHmentx$T4mzw3N=k{w-R)6+oE zRF=WV+u{vLD`TalpM%MY7H11QrW@=5Ud<&2;P%Sr)P*U;6I2WHU-M~Dyg|zR52pk@5!Up@I zigGfGPkeb&r0xT_SV`O9u1$Hj$G->6Q*2PsY(g`cJDR!d^Q__qC%4mTtZf+$F5UHs z_k)12#Qjx}nu86(0p7O=*x*?oGo)Dk{Vtlrax<{=BX`^hyw$xel;_C0qiNiR2G0gL zFgrN`pG$its^Abm+1QTLrP+pz68W6r%BU3lXtC{C;CDvs-qfksXZelwvDx>b@KVzi(?4E20lvS5WvV0@(nXfuWPNTIh~@!r z7xrL^>ltn9fOKNO*CWhN*0MOsuKG?Fb(7rl)OjPHg2-e1{a^7TE_5yUwci~2q8UE* zB0os{Q$6|}X;Td=+Jon40^Y;d%K?gIFylr8o-k!)ky=&eiSPtp8#KcVk`@iy1h^`T zLpY6(jAGlPf4!q-g>00elC$pRS2`xazwhgQtta1Y1J~*&T$&PZ&~hZsCO0y>OGv2; z*=Z-y`{eyO=+8BRDwtUFS!i^t5wqj15B%wYw}AAK5Ag59G0YxaKn|k831;wRH6Cd~ z`h1=vA>>KT1N|?Rt)Mdc$}e@qm5kVU-z~Okw>7_sCD=2)H9>0`#ymT*Y zuv-pwVSU9m#-}dRf-@C8*8#Vyv0Woi2)5ZZ{%OdQi2}d!Tn8pG)pS~>qsUW(_lDT*Dl{N$hk+OI7ycM-!<* zHJ_+oTVyw%b=N~@;6xou)x z9CL%l%$$OqiGoijfON24;qF(NbD-49ZH#54$c~aD$-$Tz`+PsAKg3i|C z->jD{D5CTI5H|cdVt^fh5$kYfy&vpe#PRgcUa=OE3#YRe>*|OX>d~tBB5w6^m-V-x zz*#EKW{!u7fA#qn#x@YM&JMC;#MhHvJ$s2Eb7yk5OHZdRO6G9ce0iTBCvdps(RpN+ z#i!-R6u8ba&4@1e;O+SF#F2-y*NlwSXE$7pRK#aL(is^s{5f0hW}-c^@JaBcZdW|c zh|<#7@}>v%C7E@YCFgU8A9q(*al3TtB0M%#+g=31>Tb4wbl?A{ptBnWHHtyH&yTx{ z>8R&0Eg2^q)8Ha|mM>M+fd-BaGt(2>>O(@>1Kery#fKOpgO12S{bzDrzoZ3?rYg8y zT|XG(p{7oenTKf&d<_4Ih?(vAPQ%Emqvt^>LDeWdb%=K8wT8KMp8`Ycd+Fs>HQ`T{ zJtal!kveVg>22Ta7NBNCb;{PhTa;!%peSY7wC+-L!pJ-E*kdZ0nR)1Q|Az3oNbn+I zl$%DkICI0%-ofCooMH(fQEu=j0Wv`VTEfCpVZnex1p3couU0#pr&^>ZML>y}{kb1n zQtaJ)Gu;Iyu*vFQbde+$g*n62{;pthpbju^MErtS*&Wp+zsIZB3zT9yPcQG8U9TIk zyh(D<5jbL)=0EZc#-^V*Zp26Im~f*#!0crEqzFvc38|*ylEl23d@H(}`%Dm5YrNGG zd0>F1?VG*A(s$oTd+sqry1;!tXD5&oHQ~6Un2=07`8}^bBuAnm@E+x745i&R?0c>` zE6d)Tj4vmcC*Wo|ZjymhMY%EO`HNZU->BeuKT321-ZUiw7tkV1&7pf2%XM$g@{?khUR7GRpfOTRbRsA$jm>29n34oO3?zAGO9U(lFyGn;WutN9J1n?d(3J zQb<{hk^}{}oM?lG<_aFa9*@!DReoc}^SX@mevpVr)&c_1jFE8~NNl>=30Y%J>T2$_ zqJyL*JS0;b4un0P$>gR+w9g|`-!n+3OwFN6)Q(h={<3A0N#QunN2z$RqULk(r{Hjs z@hIUVdyK((0}>i$yb)^}2IMK`HSFW3gik&lyfW8*tSWd#21-dvy${gaUIS7l8#MO*X7L0CzfBn>ETEdAroR`utW)?LatA}B7;+Voip)+UbE zp2t)s1%*$g()x{Bd=N4eqs?y%692oIZuPrOj`nGgUL{3GoDRdkYoyLs|4 zjw%s*s~zmlnEPc3pH4-wly5gW_B=+9l%t3i5?4HvW3HNeTmy*<)mDX|{-z*e2c!zg zf68m_E0${zSlP2M@o0QyRJoNc30W)bf9XFw$crWJ3>eq(dU)Fa2`3XzoheTd{X6=c zS0T0MzHnL2@2jxVi(jF-LouiwD+YJBQ{<0tNbeeQ?)E-jjr;M&4^*u1UDCXuA;s`r zSzZ!~ONNvP&)Jjkr?h10HTlYdBulNoU5#{epQA5=;!gouS%fkZl`MR}D#p3}__z(< z$o)k5ya1h;xy+6EJea&Qs&Z{@Gu`5BQu3D-8%>eHm!tyviYC%(!J_67s%yWYE%A`k znViRJ8Oz7P;8Jlb_QoTS^G@!;igUA_i2XWAg?nwJTLYTA+uT^ai+fHvJi&1mOQXVX zl0SE|{?Hf@E-%oI$XvlqnBvoPc)3x2!F=9=?B8#O5F%9|Qz7<(!G-?sSwxz~D|~S* z_>_182`p1{bQba3EsiDlPXAW1Z9i@teEcNKAZAa_l#^G_jbkzD29q zeBXifPk)1!0$CP!4Em3@6|LrToKJ2}e^q4g@l!&sro`mVW@o?P@3=?VhZg$8RL#*u zN)}Dk^9?_XriyHIf2m;FBv*Q1bmV=;0($koXqXfbcNl8?ko%U_Jo*g*%xFp;L*Zer zMmC~l4>^C)SwfB*Oa3Q)!+r(g{D89^r9|@K(0g|a!f6;@ZUY2O#%;eX`hIaE_=uL% z(XIPS|!w*FAB*XO}y7SShZratiJwHq&g5Z4W@T7lW>o7l9S za+<78OL+pguiIs}w@`}N1?}bx<$_iz!7Z)^$i;F|(LWaJlh*{Zm1U%y_r>O5Cza(3 zqJZ_NkG~wZi#^nkR9;%SN=Q|Dt^K;3_gjQ`Tomy{Qv&E99=Yh8MpN<`Pna?xcCJ+S z9KlT4l{@_5nK>!G_jMnp0MB{h3&i}1^_&&JMw<hv=J?JhHl`_Nrtm$KV88`>66#o$rs7O*1R%! zilC1D=68*%w~>@0-!i-ClWV6x8G@-^eUzZb8pO&sEP7Q$*+ff}?8j7nm}rx5-=tTo z2t%q;!|&{en@g>^l@TGsrLhm*k!O)*HexZj?Jl)8`@x=;njiF-Y~9e8Ux{0M+24`F z&3;821THp3$iK@87iBMn-zk&qn&j}Y!Z&~CzS_s#DR$r2lK=RF>Qkgk$XA!GVVxC| zPRK?(hd-{+^P$byP+=`(_xp(|>$s0_&5~Z6CG8Lm3sPS!f8GUmB^zZ6ZB6&6e7ign zBWL|(`edx~)=cN8-v*YN7(cpXTfYESk9BlVx!Lk^7+03x*O+7O8~@W0I>&GGy@_yy|&eEO7hv?YFr8GhSQbyxYNx$&@<2APh2cV23nJ+p@u*MZV67;UW zlPZ!mElYPaa~~*Iv)JLK6=iQS{cKTamOOVhdi?W zl1KZdG}i>G-s$0&*B?X^q`ut8=YU*`o@1UjHyI@pRgn*QqT+5@-UZ{s@0aYV<E$$iZ;SYv3-Y3y7dX^XqncQPSy(pUTJXRvZVWXM!O zlASnFKcw0%FST#ai6aD<<=K=G@!saJ2O^O=K+<3g{60B1Sy?+bQ)yH#zA67PIaKog z7VLHVjEB>5-9;|@C8A{&=6v_OvtDQ2o@U?cyW%|5w<5_7QhJldY};zVSpDS3?d2?b zid_r%Q<123zAeh!f5funSW!VGv_KGSfOp29R^k*g)OP)W*+MJgvR4%$TTN?`5bH?( z0u+F;`s_@h+ERs_bGcw5~B#qp8suj%#^?Cp!V09b3fyJLF?%5aV23|nZdOrT&B1+H;SY_Y_ z?QC4lM>eoJeS;*6GtL0i-#0%&&GgTd1|=S}F4pzgRcQ#Eq~CbX3Ye>fp*w@^97o$+ z#~3odLP3{F)#CU4Oa52jPxeKK!Bs>kd>ih9xvr%#N%LOK>nQXdvj&>7sGz~X zYOm97li?4gtc$apUm~!I>OL+%@j)HsI;5W9YIJe#Zs5@zFLHSb1?1ma5-1DYjI!w>%W^&wv>H~4ev{qE$0d5Bu>c53va)!=Byz2{cxpv}2ijEdHiL@{MLj|5j>3T=e^L4+ni;F=~YF>U#Cb2XDT?oOA`>6ghYtBo&3(kQ(&lbKK$z+*9e+ zbvQFf3_zjsGNk;D>a5}uA!6+;DxjTB7M`i1TNM5o}YCzb@$a`^`v;N$gEQ?DM1 z>TIU;hE_WUp?VkJe@f5$qp^fvrR#RVw5pak{%f>gON~ABSi3G=ocBY1O$QA!s!Qpk zx)ZuwDY<7Kz=zZmYj~R|!e*QbsqozjpY{)A$IjS?@IY515{ORGPdo}~rr)i#5I+wM z|0xcOUh|vkKsO;29C@?XGyfm26x93=T?{d$kFLe#XQ^%zWaOnD%zlf3dDqM%5W^w$ zCgddN>kKdOauXi|J5l2cK6T;{an0mXk?Xdzr7Qw(Zj*wt_Z{5LGYtl>m5-Jh%Xv|z z)Ft%k+adkaHj1T4xR(2eT;^k9=lw+$>2&{Q8t{yhBT~n`_3`Me99)n;R11n|gp>l# zwzupul$ZD3<-||^4AciLxw|g$zkF6SzEX^_!3W$JFA^-dgm(gV7WW-wmxh;(g=JyK z4cmSRA*ZyEl@!{=9WZ!6HRRzd`}l4ChsWuia(6%;b4tH;E$ubXG@Od zLbDA;nODWFYT)GJ5{PG^YK`D`oMbyT`9R^c-&B;ZBzT>0LfyCaFwP&&i%+=6fd74; zFD>jB(_~$drt$Y-^SyF`+y+lbg5VOKNqquLz-($jwccGq#RTiP?nG)&EJk;8A z_>I!ga5N?sn~UGjhAOaQ90u3_a6C)+yMsji_@g^$Eg}#?A!Qw9uiD)<*0}jUUN0FWb=6DB_D^S1xIdmV(kpwR8 zA-(PJ-#V5XHdAKW3kzb!V-+iQNJ4V09Dx*r-@)yY{sZdi)j2dD^@^HLegMAU2mVp( zxIrF-VJqiszrcQB_EJl-r%n`ZO4K>NqfJCu8U(8EK*6S?$OR6$WMdz$mkUk2^j#9cv^aInZP+;~shg3}5vAK@5#nJ+w9eDH}W)mviu|r_J?Oq*l zUvtT9p%tSuszG+tV7~*#4&+MtBzz_m9eX?*TJ^^4GxT#7+rNbz$}eWCn|1_&kZe&o zzZ+r{_lrYvVfPdRSeqiDLP3EO?|n;**HPtbZP#*got@iDSdo&X7gQw$6<2Zt7k$xd zk3$y!nD1%D2gTnM)_bt+4_=@wnKbT0E{eHWsH}IkI)f8kiq19X38ap0jJ3qvG$b=W z7Wqw~^t9+vURU_X=RHYzkALjf*iygQ_Gdwea%mV8_4Z<#s>3nnGg6DH&9CLT4Z*%W z!&uHTIOwQ!zKlloE~9kuUKb+NK4w*YywO%`*3;IdUz#wD@$*vL!#DoJgjnwjF1gX4 z#Q4jlW|cSJqo?qR57T%Z<{C*|O*y#xNs!Ir_vh^g%@tA5SeTNF5L%4t_TCnVwK(4d zMoQCe{x!5C3FjlS(%H%Te$mk)zIHvy+0IkgDnrT07M%RjORU!HaK_Y&e&&?ddQ5yY zT`*yh>+OVgz880pv=u6J4PbD9^a+o z`T2p@Zg2YcIe6szZHtj{1v*jVvdeip?_Z92hldksebail9`}Nno$#V+K{Q1BX0D7C zh1V-+mBy2w|K?zOK0>%CdI@DqO1kvNie`$ zL6Rz%@IWnk4af7-%Scp|v*%BA^o{!;Y0vq#XnuVBE1a|Ba8QE)i|Hlm$FZNKn3FPc zK?|c>w%3ws`wbFO)FxAl`pknb6bzc%Eg=_ATb)az7>AXOa?EpIk<3w*qrM0EIXsCm z%3+E;kT1Lcf)zDvG#radDepJBF5<~fC)9Uvf5Lt6=ci6wE(g{Q-Fms_t*bJcjuHA3 z4yK8cm6EQWt2uvCH?qC@^%2){vqqvs(q#fPW~u}J+3U~;vNh9~8|2?U5qj>Uibe@^ zn+s7|D3)6d6{H`Xl;=j<5v(zE0*hw8#t`?;@)1)Lpp|>>Q<(0Ky4H~}<;C3?&dKP! z?yAr0Uhrv6;v&pUNJ|2p%0x}~IxkxM%N*y#qM(hI+cIgDkCl*B$-7@wb^eT5+;vVV zOg=;{JnX@uXBmH8gTb@Jp7&`(6w^L=UJ3OpF=dCAIp*N^X>(Q2LJQ4v?=#wAthhcV z(IkF|UAiEcy0_5J!94z(Uo6venTv=*59uMQ;Hw`lEuEJKeMOKG+xuJLiFD&5*A|GLJ{I=lr+TlNw8H1=z9ZB56HrkKNP<>5VRhpl~mF zTXM*wy-)Gt*}adur=n2f8>*Yy6kbi$T7084c2ya_P=jk9sYA3aV|3>X377_p+qu$^ zw?o7$!ETGopK+e_GA&ZT?$xQPB)7Q-%U$6h;hJ_iK@a~-W!;dlW6z_(rQZ>x?{$Pf zpKpXOOzlzq@t6J|NoN@rWZJD!5do#88zhw!5ReWDX=#v>25F>2KpG?@q+3dmlJ1rU zrMo+%kv@CA^JA|0z^AQo_9p)ZDO_7XJsRy zqOsgPbr5Zw9l(#fE_WzOFnaTXFV4*$`nQ!Qifqc*zV~Ao`qxS%(xx8yNA`S37(g0H z3)y&vKBJeS>Q&VO*9~t42ezZPfZ@ORF)LLdMh68;FMkZw^&;Y?5D$4_7B@IPr&38wKNO1W@}ZFy7R zstA&O>`27)!%(^3100LOlsd{4JY+17{pMtzdpf%OLnZZQ846=uT``zI6bozKEc(}H zleFu0RzGo%iv;b_XDO%b0J$oRLUHYv0=FY)2M<-ZF4S%yOJLMO%V^_}YM!q+FS;C%S^oTV^$+7I0-)p_Mh(c?YTiW&qnKwIE z%VScQ)ZW1_@?CgMXjbN?ORMm>qX{p&tLA{`PH)sp%_hNe#brD+rR;d*X6}ZV=6agv zj$akIvwv#54?YOD4P?SFU)ugg2h7d~Hd=2k_z|pr_&gcInbPZhERqp=u4-ne-O>Mp zmzkoO8TH3EIYYY-`h38B)SqpHWOGSjqG%kM9ycEspEwm(lyXUf2;|*oc1#$X zzs67WlE`F#T(fV!JH0@z6gQ<#&g;l&bHH!&XDp-@spL|SbZysaXxI%%tuI`3XsFC* z7=BfMgD=oqLcvvg-+%^RIo+LfCeUA#9P=z01zH6$pgPu4bJ(p4DWy(sr%emctX$=Z zylsi3tBcPG{%S$|dMT0;-pIBb^eAD_z`|8qaaZqJv@FLhBBFC<8GI=+zZtu?CSla# zRX>dqGJWM>={gnKAB+>mTk`X>R^cO7(6G-j$Ins(-yN$hhXns1tnPj&MQTD zb?b0dXD@WY^_)z+Oqwvx+FqGW6T~Dm>B0fBuCZl|+=aAeh}3e~ zh3T6Wjt{Zcavv}s3HVLae}7P99&jG~5}&$#Veu>_lwyo9G?^ipVZ4X;A8GI)I$?5L zN`l8ry!N8`T6*L=apy+pxrj}AIOW{85)RW(O%w#WjwG@giLU7WLFKi?CBptnuY=>~ z#v))d*)6T;*obU92i=5|q(BCO-N%Gjs^!MZmF1^|R`WQX$3q0v8oSnPU&ipR90dj@ zPnUJ%cF!+$zjkAO_vBnyVkypEQF{cjEK~b0J67&c>$N@SE2($VkWQT`6<@QW*`~N) zxr1E`1=`0N)6o(n!Z><5rx0`9S-W8vN~M_D0dvw<-LqfJofy z)Q6pxA8@=}M2LAu+VaKy+(#pXMq*c=MACKWwU8^#ZLi-BX+f?pHmJhnkkk_^|tW26ozHUVCw3i*e(&_QiI~-cOUDyc^&O!3)PLHuz-uROnYizH;P~ z4kKGW=A=@Jbj}?menW2Y zc+G4Ay;)_>_;>e3Ik%+AVptLX&+j-xFt&&*sy)Ge zU`*q~$bo{N)&}pb-){W&;M}ol)K(ob{QT`fN7sAWqK;uoLyvH(hS`35?5jL37BQLE z_rE4k$mzS~Xh-5Tq25?CXa$G7Id;eZ}>aOUP5t^fdz~$CI_)-CqbP zhu&1DIQr-Qbk2;b&!KhJ7ag{zK~8vApuk#r#yUSrMH?gfb;vRpLu~Sf!p&VXPHt(6 za_gUVWcbj^x=tw1Th&*u78kC4hlk9pCp;JZst+e55qXQ*li2KR?~}_6Q!v@sp{)Ed zwQptDK+h=>Nn#SX9;@woV1n}Y{q^FutV|nJtXflr9rA+X3;{nD@A-(RxlkqSyZiqmjWQ2v&7R<` zK%}(VnGsvT{MfDZ>|BSR*b`q3zVd~JqF#pkufOxJQ03Y~(9S3v#cjDIX^uouD{PA_*7!C#< za4H<`MaESXOvx5~UjF?2Ve6}wHr8NI;5tXE?HwQW)_FWXk9f~hE! z`5kdC{sWB{wMi-8mF6k0fcxCx?j0Qj5oj691>MbqmOgRvrq!chCIbO^nlh zEN*FRRHHl!)BgPFQ3Q^(Xim8W_9(4v0gizm8_y9iO_&@BCt3yyA3e;om&GgU6(Wp@ z|9+RZvZuv(IISldFFCKKl6sP&yi5{DbschnKNOXYaaQxyY+0ey@F;LQgRY$8chVhC zL5NtX@>eI%95W!Hn%CxCwX@c&r)65+rp69%bxT>9m?P{TgdOLP5_!7xa!J}Qra>ns zJKYN-x3jKqzi19u^_OGb6p9b_*Jq6E8HQ2lQ6CTe#3nha#a!3E$j67PzmO!s7xQ7A zas$fO29Z--Pc@5-r_qnEbL?WqqMZqNsYEyyVs`g1FU7RzR&bt18+txGv5X=Na4f{8 zy|=33j6U6qi6cQRtCcB5UsGPCPX@X6z#iu}SY}%618SeNda}_`$(6ImMxZ~rm1n)y zt9;GnYnYF1s?4fi`e*m}m7D>>$HAEd4lUZV`4*)OBlLBVO~kCn?$8SJJP#Sg(`%$9 z-=0TpwoiHJWNXpEg2WMC@Ri!X#m@C6L%Fd7gU8TnEAQo;)$-Dn1+P++(_3lz{frp= zjJ#nN8KRGVPa4te|GqIR`Qu_@E9#c^ePZd*8~1TKs{M1_zlWTfWrWsz&&tuxN%F}u zsKaZrygc6XSE@W*Onp8$rj&3?_Odz|gqx2D4V19P#@2qLVF~+U`U!8)x6H^jS`iMd zAPClQUdZt{7ZfVt3{VV7tB*kH7-vhf%N@B!(ubAQeK^ybPoz;M{V`Bm9=XnnX(La$ zbVzeLXu{8BlX6jH0~$IZT}6JGKt$3QukCqLVt`?EAj&#;i+ebu7kv20aAdhU$8qs; zc9Ig;w-%pk*CkZlnG3_E=s`I_^@IM-4;un*wW@Q|kl{`IRNhKodCn|6L&doSgvi=l zJvSv=0v;36_k?{wE2jKe)w%YosE2VNhaRL$jOTG;w*|i5CB=pVlQSgzbIh5g{+!7TaF=xGIu0G6m0Ubc zS|iS`7WKM;RG`PSydqoS8zj%ye^qIb8oRL=>R%DYj_{qYci(A&sj0$aja)WYuKDeo zmpYm3>^csRIOd1+{Juvq?{C!?GWj1vn`5nP0^K7QhNsvvY|ckC)(_*3if6}oyUYG- zqG_}@5uM1M*vPj|m{fDZR9i>bIR1IZw)YdOcfQS28grkjJ@G|PYf)_}91>WZF}tcn zH{gjjmTKMpw2K*Y;!Pu&y>#m4>6G1E^$#94c3SLdCNCjYifSp>n8G+n^bf5@j42)s z6-`3-0?ROLU?2DZ7YoRDPk#4g28&c{-Pa7JN1%I%GswtMCRDhr_Xmeua^CU7rp;G8 zWd`lG&)9rV{)qsKbH{Yz=(zNgpF;)enC0T`IqmB!Jv;}eV|TmZLO%B2Y%wmQTvE=t zA)hulkRpD+UZRE+v3IU>RtRMIQG))hwAyy+uKO2D#LuPFsK7J+?J8Ehe~N*qJh(tw z*(Ow1p9D!%56H#fb{4eR3h7RKjgvY%$xM(TqU8wL{hbv*2)`--7|e=I;SC*M+{vt$rlCTfIdO1msr_;m$h>^o%kC zF)49R!?Eir@u5%Q4HUN5;r}&iClLjsQRSaOQ;rn&jhScGe;pw0TLC>NtMrh%W8l8e zDCAl2LR(sp!d$+6+>f-dUR;s9yf7X0;)4!?-Br`8$;y|HR{Ox_Sf(tX{u9x-xei(p zZc0vf=F%a+UY8JFhZ#p)c3Yy}uMP-y4E4=lO6XQf8MqONm-=G;jR@VOa7cY<-M|MIx4DUxn|tq{zKs zY#=qCOl6%ON6`)|?8^~;gq3j&eh`PxwZ2W$DOAs5WgK7j=S3tq5ChSEF=%Dq#z2zB zk^M+$D*ifiF~M0Ujo(@QVG&2cvikfBM#x`9;P;hx7NApGHYfqxl(g25LHl{yXF0;B z-FC!%pY$0ff#`xu{BA5eC~iCvzYaV-DJMLAO-Gq&ZW0v9S}d@1h5l#{FO|m~|7^Q~U|tTyiqiqAZ+We5wJ$#Y%*KJOVc1DIRCQ31vhyi9I&DJ~UdHOK~0v{Yr*ROh&rP+dx`#x|fZRb_q zlmjWVw%8)v6}GC_|B%6>UOQK!;_9`D>G}~jKl_jHXPaok7 zfC0cj3un(5rLhGO!MhH7Q54SH$w2Dw|4v(1b{${q_oPgZ1PDJ4KL2&of1o1)x$#F| z@HT7nDcIn~Zl+F1=Nbzb**n1*MEO#wdtAnh#6$J96ZLnpZ?-v(Y(5{~{MJNXGFSZc z4e|#X+qeAsl3!JoUEh!T;Wm9_-7fg|X!Xw}&oOnm^iD4r8#*f+9A3%6NU5&wrMP~W z<^#v;#kwrVUxMYD8Su!ZGSExKM|hrou@@u;Vq3DF8B@` zTV8>8Vy5moE-|T|hgM-hb%Tm8wf$=fo&YeLZHm)QW$e7}FxwR)CT&Z#vD5N}b;f*|kB(YkRWaeV%QuFVE| zC);nU+0jIOfMh8O%$OunrOx?(PBUE4#uNinU5=v;cp*y)MBs1r5X@fMqhCla34C>n zGk+3tv?dIF-|3U-hB=+5*|_85$uro17`fhqD=`t8SSb(nFyB4$UnPVm!DBG2{LS}F zpN_Mx4)fiY1fYX^n*^U$tVj0K?(V5qpx_{wF2P9v7>2Y$C-mJfA2T zZVc=NHT3piLmCKoJL5$d&C16QExK&IZ)L%-Btp&rU8CI7O`31eLF5Ybpta5Q$}?r{ zSvUpC{$h5Et>$CSIrr{GaPXXwS;H3YgEt@1B`k$G^V7w@HP*YEsPOj&RjGX7Z*5AQYc2 zk)aw9dF#1Jm}f>nPNL~z3M~toa9V;1e1?->;aPpP>{_`3-I9#n7)T>T%esDP&C5{e zgJGHk)<}tA5WYM75!Q`XcFeXjC4epa%gh@Id z%dD2hV6PsM`$5cpjemxAQTa}ikpS#Zp8~a&>h-k3lc!Hgseh*gGjg?a_X5>t#OBLU z^_TYtf4(E+-_6n*c5ON(zneSz91orc5zbPALd+a<%InRbIG;23Pe3JqIO`@a_?_t6 ztJ0a`hP6-?uOqr?0Wi9@wF!d}wgZV0vKtYu+Wob*PAKfYKNl3I4{@JP4gkLgjiuP2 z-+-R5-cL7I2s-kD(Ok;hDltK;do}MfFYSNZ-84Omu`M%w1GLv|m@b{!rG6gOvVgwQ zk9+#80smt2r9Q2=zwKZ`!cKYe4%tsN&wxdWU_da7!B0QBTHCHIODXfljlo619cjB5 znAWDtYZsVCGC;Q6)&2Hu;@>fJK(W$~A@5w-f{*&^^_`BJyl7mZA6m%j*ho`ov#9P= za&5UR%!4$j3+5%?KC~%8KWTR?fP}co7m0 zx6q(H`UTflDQc!W+a2#a%^zfZqQC&tjfn}$@7>X}R#c8PHEaS3?7^#oX#@B|x&1bF zQS^Kf*n-CJC#ZlXbE6Ly%IO*brS@FYxnn@;nP9z{*DZOEy=($AV{ zu==(9SDe!BYu+Q=i|L0h#Nxm3zN*+2#r^}UXhXsVup^V4MJ|k$Ej?8xcL;EmGQXnf z22{*7oCiOkc_-NQ_&*=VT`AiH_pdu-4utIFlo&ovjbA#GUU+95KapGNqsw_n|H{o?=wgw7x<#8-% zfrBr9Uh>Eon%Vymu7BozphbX`c9*#FOPwK=*kOL!kCX9UD>Bf8b-wLSb?=TfCo3lW zxy5gVA+P+P&Cu=KQfA?(D!VwfuzgZl>7D+vM;K(O7010&6O3u zjYU#!W$KqE%6Ce(AH$hLIX|W2eMrV?82s6o!S5~H(OTWl3L+3_RP)}VG(9x<7aeh zd}%R8Jo%3@1hO1#g;u1eafo99K*k_`(xAC7e-62fYM?pUeid~q6$)<%sj3ge#wG^R zLkbYapU_JDYyrj><-$%VH+wZX>D4)&ve!AfI*GY%Zq8TT5B+39`s2PN$qXrPyrA_^ zCgj@L)Uz?_WsA#|^MD$1RWb=r9XrbO-oFYSe{Ds0_U&fR8qh7V)i$kLI!WhzAx<*^)wD2QQhhqBO9zqKA;-OAB4n8rV(a8H%|% z-IDjES=!aZVRxOS9|#?>P~ggMS(;EvEMyc%-VDPTzaWB%MHT+tR)?~)syh_bOOKK~ z?l1ddB}=Y^5q!kFj&@tSN@0F8%bi;ja>XV?cFFLq)(Mu15({RIzz~*lmU#z}7}<>5 z%Wk#af|xtjtKr|;lI zk>=!Jwcp{VQXhlSn_|o#j#@?vD@qLoYvNMZnNNbw1RFSQ;s!_C}grk z$D-5C2AvRzeSE|a9(IYmBwIx&o0owzTK_2}FbX?GYo>F7^^6J=rh&QE_?Y<22zkmI zU-lGP)qUENtt+4rMUqD~z3l831L&o6d28v{|dg6r5(0!kul zgWkUhEB)WoX1B`~QUm?v&e3o&1Z;VcUuFxmALiN*QVFE>P*wn~{t8n7h%d*C`hjt8 zT4_418_i8(Xy$k~*{YSCeu7c;gtUlUHY0IJ*7?DkEnJprYo;fB#0$Z@Y7NjEKc+whW7`an z#E;5-LsN}QIz96Bfq$FjH?S3HaOaA)mJTLyzP%1L>lF#MW&=#v!41H(@X4P(){4c- z$yXw`o-y@Xq$F@!zHMWIv)0ag>e_##GsZ~KSPC^jmqx9{4@RNBJa;jbZ|*0?c%Ua- z%+#uwe0;$vE-0z$Wj(I*x#J-omc~NqQQdk%+x-FSOJH|-K<@53L^YBOc#0bcc3_h) ziruAqftB%BmZ%UImI-|8i8?(5B?LT~m`aaDH|`9(|GvSu+pDmeh6Y4?-G7#yYJA+e z_{MQEuJ;d%So1z>8mqLH6ud_-HVLC@7)y*PiE_qVu;nC}J;*4$DL))>pJglp0lNvB$&V6- z9^Al8Zd*AWX>%o5hMM=1q#s(JjnLjs{u|(#nPpdY_mb`0)W-jx`PkP~h7BhMB5dr} zDi1q=(e_5k;8fZ^{N8{`_?rqiThqNIGPcNhh>a_qvgw-I8Ml%vQu`XRbR=%lqW`Yu z5XPVboBwtUVfC~DeA2b$@8IpeQ>Ah+3M8S0-R~PUVsRqh-jtFoK|hrD#A59&WDYC; zz3$X#$}Y4fwV3)aE2^|pF1qyt-m$XRaWzF?1=yxOI8L~4&n~2W0TZoR_*NwN`B!jX^jj6iuDaTJMx!a8#`P|#k zp|mvV05{2xAszoL{>vBmZ`2L_0M_xp5AjHmzx|<+PILO7PcZ~D1=y8lk_>1Dsr29t zuAzwHu()9|;G%eDgtZ^8ENE7PV+$iNU*U^GKybOo z0byV&?RxS=2Ar(&r`Ozv;XOY^yS7^!W$wj5i(l%xweKO+fF`zu#jU zIu;r-( z>E8m_)c2T8{9Y9$-7#6X5~qOGI-!jlH`ybqNv~t7;(=GS_I$a=Fp79HGtj0Uiyv6leduFMSl6s{vZV#@F~PZ_`!J+@XIVHQV~wfJdX+6q zWp&%X0h|-*!+-~Ax`?L{j|qozcFCIX;Oj_Qetwd`(i;aC?%pj@r2Xx|9P@WyRx5KJ z=s}M5(+VL!)izpd?wt6|t$)>74Xk zcmew-sS5DX|D#Rsonq_QOAFR%cl5YiQDa0zcs+Y(0OWq%zT%5G=JK6taFyu*J2iHb zx-8`(GL0DXF*In=?d6RE6bx+Zx`~d)Iwl_xKk&)x(Q8&Fz96i- z`s!>*3XG5%HmaK2l)n$|te)rVlk7}(A|&?WQ;#m?$J+lq=f?x%3kEz9wfpCFkilDh zV)N#UC!9x%xqb_O8=*Vcnc!`q#ELx;VAp(@c)61F&`K}uWwNV8IDxnarxVPEXCiGS zJE~wmIR)g7zrjpg_aR45J(XSUY+Bul6qpOi43>|N;d|$698IT0^(^~ixl~|J#Luk+ z$^kpFGFH~nKT6YDn<$sP1iC_#l;-eks-HpI8WQ;f4lrGCnrS_r1#2*#GO{dg&Z#~oW*Yo?jzA9lt_CWecm$3}+rbph!QgHzX|DYt&Egpz)iGfFk z2gkmc74N=Jl)&6@c8wb=44!+(w;W5|MmjWz7!8|CBlicqLkVaEaX6K9cW&UHPw+E! z2)+gH@hy-?=Ft@iMmTzlX$tUJePJ4=PyY#==gr^%XEQ>?_z6C*vy&qKG8sYc7i}l@ zebj@y2&HksnGSmELhwCeC*eE(kD(o0pngE%iI{rbdOyGnX6XWfnKEjKaUBQXQ(uFb zXD)P(Xq}ItW$AnyQo3K!SvE-Zu555 zHj&^-fnMLv`jcP+CPwc4ChH-#LL2Z|(*=?foKulWn|(#h{nkAN)Huc5)X|&>uZQH2 ztrQ8MNTytAc+*Ud3HMm9v+{xE|14=vihP-Iaz`>rW{P|X;C595E9T&+f-}~_SloWb z=oS%pQ=56sm2M&DTARe@lm%a7d6|@GzWd|Dy0$(aE&E9X)%65T-xmcQGAdoyhS3Db z^{VrVzj~evd?d$-q!@+;$6v`KJ`wL8ZU5O5d~Wr9qe|lMqFf#>elwiTg(jMOvnP!I z{!yoTeWG=lG=Px^odQOSaXBQ8OmI=*+a#a=<~gD-1$)LFu(4$(wd4zyWsAbj=btl= zcY|9s7!qmn^`l5C4KekD&>0!Zuesfdbnvfu9cLa3(-i}7Z6dNS!32kl&vKU3>k#W1 zw1#$|_ucS$So>`YGko*of>-*hmJ^uQy*7xjiR7?fzV1Yc_enF5miN0j7PbDRx=vLx zM!3+QsMQm^Yy*>~2z-+b9Zq+nUpH@=*I)wWun`k7te<0 zVv(@g|EH`JFj*7cDvJ@Ll=P5&_l%E^3ym?k(^27v4csQd4l6>Vf-;-FZ7&|RC-}Uy z4jYM8`m4=7)8oMCIKZ{Uz=lTGgm@7GC)!7vmEd6=1AEM*x4HCxSLWW9I1rtid%Tkb zoa4X5M4oj-Yh!GWwf+P5DgPs!A8*0#z4{}?^=-cZoaKK5#WoX|WP7mX5PM_k_-?5{ znNlipDz?ZWIM4pIfhl)pC>NMhuezLQsK^!(zjXC}e6}kd!#Xn%ayN-%fk~r5zx9`k zUaD>rCI`6qzF)`K=b?kCGh`e&IH{w^1>_W&Qnwpg)81RPk@bdE-^Q9u4 z@b)L&`egQi!c2x$xSGxttUfmCMd+!}CI6`KOLG{_G_8_KsUXC#VmJ^8#C`Nd{g(mcRv7;4_|COiwLMili%6Nb{0<0v_tXIGro^HyJp$FMih# zJSslictHf$$r*a3xn(S)MCxRNz(`UyKaL3sp>JCC6AjicN29RGUf=BP;s@I1XP`v~ z=EyuZJ?aJ)Nz#yDmT~9Bk~zj@$ZLIk_j3L|>4 zW}MSs1cClI@pDXVJ0LFf%WEZOS2IZ)#{TACqLiCq0h8r@HRt`zZMNpuTIz#He6>~g zCdqAn>}sb>Q;<8?1pc)`{;6d!ViSM3$9^Ad>8e1WC(>avQ{%a!)`N))d2tR*19jQ_ zya$QcT<+^WIAa_LI$Z@T5DPVZatX8~Jx(}!4i;*&5JMIxMyf*7MS!kYP%gdK2iEmx zqv+~S<$5$C5-E4a!QRArl}xkb?JjZwlyYg4B-l(<@7ZDGtQutAM{+CR7M{it(%2}% zue*&cdhplSvG9+i2Q7cNLNuf9uJ6_5tL{N@Ne=Hb{j;?KE8K1%V*KWef#+mEX*_Hq z_0EKT`OLdY_>5ZtwdNaou0a<3zK<3oI-QFP|0!9k;85cn zaE!EHcw$Wf@A}=nAMe5?GU4=b{?7#n<=ei4m=Pvov}5$TsxESa+A2TjRg&)Y`ey5DoegZDeu-5&yH!*7$x zY_m#~eLK@g?~nfE5*L+D7aNE5_IeR=b~3{A+RN2C}; zK*6`YZ^$Dkc4)OQJ4-G#en=zpRK)i&JcsY^$-(X&2{qOD>y$2Jtd3Z=Q+enu+ClGd!&S8pH|Nlnnq^X3y-Ps|58Q|g%z=j=Jm1dZ!VKVvId6ky2QgU< zoGn62glTY?V=oARS-LZL@9|BI6!7XEZi?oM`9Ad`abtFf{Pr+Tu`TnhoT75$-aQE* zI_jne#^&Dp1inhh8?rQ;GlDJM@MX*=WK@+x7XlT#5_oLr^b=ol)uK-<+{bw)G--hGSgE!6cTTL!dmdmR8#DFEgh@U} z_{q`s9kb*K(w|G2;FkhvjY48(LWI@(PxB5X6c7aRsp7i(Bpa*=_*uLeY!L+NN@iU* zzEIE?44Py7>M5h>7~C_2SyYMZZf5GLAFP#|2_G$g?&oKr z;3qd+zKqLQJ=}l3lRp222kf3N#V>5p`EbEddHRK6f~vn)T?8BjLhYS@n+%d<$+AQW zX~7exeT5zuY@L}Hqx_&U6Zt>#bM{{}-cWGvS@CBI;e!XJ`E{gm(?vXscqF**&oCt*4NH8x!irf7u-I^vI^_x?rt_MbMy{}PUSyj z1hVAXYvQ{EYE2~5@TtZcNoexlTUv1tD>e^Lyev!h{r=-ZU#8GoMRgmC@Mi{PEaXiX z_B-dkXLbLT2Y01;-JehX)uqUYU_{IB)ABi&vwMV`C(L*;VhC>(F86f26cs`VQMHlR zT~mwByA2+{Sz};rTz_531IED3g}?$uCO2H~_5Y}N;)UXb2&eAvi`QDg?N}z}PHxzF zSKvuH8i3rCQfUV7w9Gn*WwC;Lbe>ErdK7xA54X-9Oe={tOr|}6PiOqy%pRj+NVi&+ zk`DZt$I<-8UI={hr3IT64TcTiH;(V3SJ`z72;YKLCg%k2`1<*L5n81lw4JsiA2gW{ ztaVD4wKA+(E8sBcl3tv?*v|9Wd=r9SoZU8Kwhva5Yqi$252DY(MYbj_7?Y8H6!bBR zJqpQE9Yw;s_*t=iAam+X62FVOtY?|u-67rpS>4N%fZDgxlFUte=W;TF{n#Sl^5Wju z68o+ldC-tDPll)|Dlu2FnfHc^$i9>$+&q2nK=E`pWBo9X2E!|iEh9X2*`XO1vMJ;DyFw=3 z=S2NZXmVj1C9jE|yT(B;Tept$)cZY6t&{${fw=>fty@h$V3UZp;9&}bxAUspdto$Q z^476Eu`NLog~R3eSzIRU2upYFJr#$%Tc_6v?Y&s@CmHHJ!W9@EpK0*|uzxcR8kD_7 z*2FMP9i0*$6(}tX2BX`;=ns}`lc)ULE<23ur5|ti!fifvSg2y*f>*(aOjTQADCt<- z))D1yY#wsuFs%5~lRrNUtis`6QRh zuI`hPFZ=UsGfwk*tU&8sVWINlq6s+vq01kGj@vM4_FHg#%=!ZXz#{$t@m5_6?y zFx*?WyJrM!X`r`@T{*ws4L&28BOjrgeF2k_fRt}k|8|O$9<`+_js2*yK2*dma>*Vs z9$N~MC}~y9O5R7VBg;c2HXNNIFfiwXFEqR~Z`*ST$!aRODhppl#{6Ehdt|R52XmI= z`m|PvZ*9wnA2>5ScM5MkRI%;XUYOIxgU4rHaGux@FM+~M!X~To;+FV2?SVV@aU6@m zgJ+1ffBIS2nOSnFL!$N{L;lY5=XcVbBo}2R1AprRBe5hWmBr>Eb|k5^DblSI-DaO8 z1?)MBD=pEG9oa|ImntpYW_qNd-{oPCV?&*`n{Y?JyWFZ0SVgFN4A6K&sk;`+ z`!{L4E-o3UeS}p33;)i`QqgCzN#%L-t(pkVwYUlq)$#_FYSPx_vW-Mo7%+dBJN*#B ze=+E<1iLcG=ReRhG{D6w8NulN`GH>l)~CgYmGm-tlEIqE8^;#D;#hJ~Q*~!@8Z_rH zq1}Ijfa!-ENmNSnTN?c6F@??cujFOENUjS9aR=qE*s+f@Gv<^kjK4v%LWC{D9lXze zb*j~83tP)tCUCy#q05utijXAXcVf1D!P5Yz1<#p)0OFK6_)Z%Wyr6Cz79??joWj^= zFElh@a+(Y7Jw2QK^5|r)=KJc@U0D`E>0e0-JO|oiA*Jwo1)0ZG$wS>U&riPj++!uM?kTzSnXSQ zH&D7?v^zGHQFRi`%{T5th{jZF!gC5- zzkwHw&fka{1b!Rygoyz=TYV{BzL({jarI)~*)$|8V^bdK$^k!C)_Cy5Ve{%d_JJYQ z!Brb35qWw+liL|t1Q(KelF)H9jTQ!2Bb0`DWZ$KphTDaIK5%>h2~?oGRuNFWo-oj3 zLIn!Eu6Hfk=UuJgVWxGRW12}bB59@YlY!F#Z1COLml3_jd4>aAP^y%#yjrk5ZHOI% zPRD`pEV=n6K>;aH1nPcXa&*+nTHrCi@~PEx0KNcnJnz<$BPnIgqil|u|9jBTtvK_OgA=-Z0Fx#NrfH- zM~H1igHyhP>gS9hjVpTu!n4{+0X(F?i_~92zyE1h&iXmRHe-9d@T3ji`bu7L_)_P` zR4YeL$KsMJmh`u^xk_ag#qfT2VZ7KXa`rdfxRQOzV^ttLFqd}};DNd3 z64>5UA^{@Jy1FxC;L^PhG&6PJw7z^-Ir#{<<=_NzN8RILdk3cBSB<1@A=LlQ=h)Y{ zY-NAI%rXTVOR8fuk)jLiLb5Fx9_Z#2CE}EH`=W`F!O{o~M8jyWKKp3<=ii6ljh?5S zQ2Qja-11s&CelZQ?qznnP3~5oSdtWF%q)1A5X%-2WV7mbcRN?s-M|vH`m99?EwQGq zEmRU!3Ux+u3nsYq*~MDLV4Feco`=SO5qN)?KW%!qQvOQGq6v~8UQila$$eL_rQ&pc zUzZAgW<#0-VCZC#;UNiNy!q>fVBh%Ms%1oHMGCxy-!+Fp|6FuYzgT}s8(<&B}wr3SCICq8Vx1_%tC|)}C;uNov z-hiBi)|c=CQb+|1!gMr@vNF69CMx;#V}}XwXNd8eTk1FX0DJE(VB%bViO!9fbLda} z7}C^Q&I#VBbgy{9T1I7Wh?Xh_T>HrXUZ@4qPDDB@Tv}r~hi2BFck8B=RHsJ;=Njh+k~yMx12F5Va74lSQBJviYsZ zb0R;QADS=K>~8X@<5~*Txx{$(!tG;^=buPSJ~kg)gGndZ0$^AIeBjqm<$+w zlV;u@${I$_{ep?joL2+Y(TLt6UD8MOFv^t(df|Ao=kKE-dC9!ry+E;pj(B=*>mWFe zuJ_PW?l!(`h1+f^N%liy70b1B(LwH)#9K) zjm+F<4+&mY%_cx$47oa97np~95rHCJ`XZ3a#&o|lm1SAP9x!$cj==Ws=_!I*Z{;-K zR=Q{V--{(e!`<_44KOUdnhc>&nm}1dfi%u0WS^`HnQ^t2j(u}R%?$M-6OOQj*D!28 z<=MrA4e^-Rs^CpLHad~SI2fv3HvD38PG8Ca49BFj2tm5U+B)~q+@}hGkHOsI`{#f} zTf7Ub&ByzXV91ZxrOL^qCAXb%b@MwaLYRS22>TFGk-lVEp;+9QdY$)xayVXR`s{J* zovMZwTrqt%KF(`!XJ*msmzVx<#*FZ?de2>53i}MD#ys>nt-D|^O0C~nP4rt$uX1LM zM3@QYxW)t*h}N+K5eRZyul$)szg*VcHqw}=2t?I=7*;mN^DCdY$>gDYvHs~OFvR@J z^mo?gBQ~KYo8WVhJAU|@k?W6;^$=@eo|h|psTzqtgWTpXyfkvtu4om>eb<2QV^uS3 zJU;npFa(rvDT9d|GYmO!#&JDat94=X=M|fW?CU==j<~0lcGf*A*We(i=nhj5rjf(T zM#T1)dGV~n81|vkkn^_d30yN__&_TN*(OXjFGTxF70>@j_YvlY3!=+-@RiN2ofsw` zG6vUQX!4ugwm(wuw-ywp(QS0%DMl2w?P2pg8^e z7w>COk1gS0iV~k!{t?Dwty=0b#)==RiG*}AD!Z%O805wZNVq@vVfjM7QRVr!s002< zM5fZ3v?VmXPh2=kuQ3_e9~e9##F~fe5pnJ~LW<-Nj5jRB&x-6r9)ndSi?f@_h9r}Z zh%`D+t(%^+d$bgFs>WfmpZRaggU$nRaa#khXD#$t`K4+e0$24dZONyYSM!Vf6$52a zuq|BX_>rRLvdEN7HN2yS(lNS0`}$1rw)jVj#F71h%fLI3xP}(X9y$Y>AzncK_aymhei$O zWHYDB)!?`4Uu!h|=wJqaJpv=yr=M0{VxO>Q2|e4l577=zu%R!US5?sOO8clhPK6(O zt+v?wi;F_byr=G}6XST08&%_e4Y<(oS#S4DP!Pc$WR~{EH6q7}&Ek<``mf5zIw8;= zUU1!rl2h=9y@&z<(%VDu-@f1*2tOJeb0vleo8UNt<}DYoW)DhJ>)76eP9swAi01m% zUt_Grb+267a7&*F^Mrk>0y=Kvoh~^<_DjB@&)?pK!&dOt4cqF48pa<#w7k(fW?o20 zQ#)lqZ88s%*$joo+;VpeQ5(CU@qBQT5!zn9dN2{OS~Y+W8vukhz34Oy9UD)~uAIE(y44=Y`zJ2Sc(#qmiho*zRBI|Y(e+K{uW zT(!=#r{lsz;tMRGWLnZ!h7;X14#Mji4cDbklP2k~m2~sh0m= zUa$2zq!k4pDc=75EQw?6F^Z&BJBenPGESspnmS&|zfN`l`Nhl2y;P0)ET#^5&#<*Q z&OJ2tR)#|}9Zn-pAt1W(gZV-doaoHCWo^n-#Ne2IC}PZ6K!Wr>e7AQ0%@?kDD)Zhh zaelgwj_m_mp+>Loow?_H!UGD#F`LDB z|L1bD&o6|A&cGdPbvFzKzn4*W0>Xc}F%>DgDS<=6)lO;OsaNOnM^K%~cqubiZjwybjh1eL)ZQK54=#{_j%Tu^S;NR&@a5$W%A6ej6rlw z$+C{s{d{kJ`h_sB`!eWPuMJxxNKi*fp2kaFw;re0Y;KXz$g zzumhsd5Cl+ZptNdDQ5WE%<3Xu4At_2DX>4YQr#Vi zgUMF~uo*uH%D!?P%SCGv7JyWp5McjD3+k;>n;{fVfZUOa7oVr{1spH&`L}1HedvY* zLHps8WA?gIj5)Xd;@%3$8B2CBe7u^q63g*NhC1i82c{9L#dq`QQpXLqHDhY8Pe>_Az&GIY~KB68Z z17FsJq&1+i{opJM)!>j5-F#S{pr)|znHN-8Wa1iUA1p(FYxUoUo09iW^fXY^s`(Xg zUlXHSi#^^ubg`*l8MCG|D~P#J$Ppn~t(a5bX6_?0&3k3!D1n=sFqy|u8y50?FH=7s zfI6RM9lLmKA`d>JSfIAt8F+hWQJY7|40v{ebl*{u=T$ZOO*hYu1}!SP@&12CWQ&eH z&V^Rkols!MwzH33yNr7nWP^hw+gnOtnClY;lve2r*Z0SctMhKBU!wzDuNoi}co{oD z;;>yf3$V*B;HcP7yBdM9@bSm}=i105&=VwFTm3HI+h;yzCm)^VBl+wy%Y8}%QXyTz zv`{p;OMoybt9nr@x>cp(_+`91IH4kq=JKFc=ZuiAS*VJP4%mnf2M%9~g`N>oO{Hjv zQ-}D%sONo0FxlrHDmCg`6L(--D`W5YWxJ=y)DB_BuY&G4&v0Sd@u7VJ=H0V5en@}d;>~Efo$?3r0 zS4kJNa|!yX6q5D8r1r^PCPn57S2_9i!w^EY>Mhb7n}iSwG52EaO7}xqi3gIL6+wYO zC2v=w?L>m-bWr{}AIR}L=ig`-$Auj=`)2b7{b*2D>1?kGa+=b{TClQf20b*DWtJN# z#hr_PBKnN!Z=%bIpV;A>YdMTf1=vNYA|27yh#W9bYu*%)izeq*COtng-^thQO_^ zae39DA}Ns9z7ZusLW*_oHagai_HUTz4JlYRttun9NJNBO1gX^Ol86?}@S3wsMRdWA zvo?0l^Ez`)R3C7v%Q#**q%0aoMx-%2DK?*l{{f#lZE?zU7)Z&`P~I8TGKabkaOb8B zXTQIJb-rt(bmy`Lx6GwM$d8$6(T0Sl5jX3iy8Sgn#ye2ybsf@?HLdllwMb6-6Pby1tVee zpXN3f?OE#nlpin=BYhMV)CU{CYQ8ddzBx~aCwb)Zpp(+C5Ah6|sg0SrVPMX;+|v3% z9cHM66f}647KEgjQKuHoPUFB+hT6&jG#xU4W837ZQE(J+CN47|YzTqPs7rwi9x-nP zoHY=^)QlMz8WNP!T+Z0gEH9mw)YW&N&wH;QfyanJ^6El~fIuO|b2)Bcy^aDh-;@j6 zD3tG=B@HujcNoZQU3n0AUS>W6Z(^o=$y^Ao);>DxZ}4`b>%08dhSkUM2xv`Qe`8pg zj=Ab@u8a=V z38W?b)@Pn5jZphNGQl|)uy-|?(Hr+bmw?EReFTQ)?{54bb&)PG(Uk@LkEG$fGi{KI z3z^D9ed|q<9-p;(eF)}8EPB;g(OfM1apDPo`%r3{;QK=1-cP!b7zr}7+Nm3yZ5d43 zVYxX)YJxD=gJmcJVwMk%NX1a!+dJCWneQDzLd6I4+^s(8Kr(_i02&=)G&vbsI5Y)B zxYUPlj#3~|8TcZtR4!%A{ij*(mE#B-mMr=~#u%m5YG{f;Q7;|Jv_jo%o)x&1M?tT$ z_-xmnq+1VAZ)st_#6fmV;l)x>n- zF5y~e0B4?U46*$AfW0n}Rb}}-4Z^-oy#R|hx}r`tVySl)h3UFz(-OM@+-Jo3pl0 zH%qf+vt2p7+@>m+%W3aNZa{#WdFAD=qFKNCNObb5t_`sFx`i`DECqbK zDJNn=+81BkPlv{_54PnV?E;ga8rZOWvxIO%paSL5oMgHhBq~ zHb2lDmpz{yQ~TIcNq4+(M=pkZ)Nejt9P)bfT^uI5+Bm(Q>Q6V<4_LFx#20y)N8{Xd z6&b$i_rn4Kuwk!T^~MqHi=e%omY*Xl5hm8jwC@h?A83GdtOycP_hd_G55x7m!Vm+w zPM{as*O5bR&Z+*m8e{i=w?m4uE>Gz3-=hn_1g$C?I?-rf&`!MH_p7uF` z;wW5vI<}b^n-;%XuVB_cFTcQNjgJ%@#jVMV{)`v`oTm7w7)>;eBn=))UN9e{){kC{ ze8hg}Q-BFy?C#*5mOsB~ypkV_46*9c1D+b7K4I9O_Psr=f`lQ@`(?KSAw-vCBqbck zlE0?^fCutP=MM@do{h$(>VBi<%U|BAT4GyUbm|3i(-?^;6hmO)oCPGgK}gh~>-&)& zbA``{F^5Sfqw=#q+odO-R20pEA1u5>LKcoG4*!i1vfc8oo-v*d$N$t~=bih8fv*r_ zi1o@3&g5HwqweJA1WZu!Ac9i1f!}#LBCyRrR1irUVpZSZCz`w3HAmXeGf0ltHFRKzlxd=-Uvoce4Y+$y zDYckdk@D>GOCIf@Lm!yf=LlFJq}cD63MqUY2i;=w!ir(pwg)0X$Gqd%GZYRbJH@!F zLx?=dAD4g;|8KEA>}H?phYq>Q%niH20Reb(P1$t5c2$bDIxo+;o_8*$@A66xWC$j= zvOg_Q$EgN+`mIl6K4kRk#e8nVGBoEuW<)@rr)2x z^sA60uvg?#4kjDOCG{kzpN1`IE4={=rj=d;!6yDz6+CNc>Mi+*xh)^3-)2gF)G3|vYaruu`nGL0FV1vbYvIhp- zfuDsk3o^WdLkV>`dKwg>Lwh~4hEXA>b;nR;Px=^pB!n8nzV~Tf4)uxJ3Bn67(62We&Cj#0_TKYxn;@lLuioH7PxHwo>;>{ z{SMpkWuGV!WDgcNC2wk2Yf_}{A(mt$b=pwPbAdg%HL&l~ne%pbr)g3@9gXcgf6BO6%$EEHY!2egNg5rwi zJ45qh{2IL_juCDUvso5`P$_HUV2An|RXp>Z=xwj#`>x1}cpoz&Fo+2uk zxjzVtIa5p@%|v4f=r`(}nLVdumJPDDjXqH=-v!hp(D9a0hgakIrFLGyc|ppGJe&wv zF^+R8Sk$m!yb)|ExEhi6L{Z9Hu6(^IeLa*+$hb4#;tzQ)=)PnO-TUuz_>JeRpL99% zQJ#4r$>%*E>wX2@dUx*jpbDZs%wh0M6tS59`&X&Xj4xSCx2@Y7_tyc5SVPifoXgPiDRU@zEOkKygdwD=dnUj;Z*=OA%F+<&BXP8V}; z@L=I|Xr`MVA{jP63DP$qx07HF6T^E7tP_lCk38*Ay%&UFTYNO{0hp(<=nIud#k^J6 zf+L_)I_c@P#4Pn>G9=_Fi^Pc`@4v?$D^01xOg77S z0rCZPKLHFnxSM}W%FD@P7(cL~Z}Oo6eYF2Fk}o7+KtzTb_Wi|Iooj(X@!P%4APTO? zUsFlcq`pvQz`92!X`p1};MN`mtx=)zYp;Dhf$&^dGUB%@T~ z424l#`*!vEPdq&ZXu_1D!U|F3+4W2kb6K8P5*|ahI^hLu9#qB5lZ+1<$F#Ll+jcGq zRvXk8@Eu`HFLE4svxq&w=El;4W|#wJxs%YrD*oF43g3+sxc#9(Er!XNNruxv((+W0 zL(>GlRpj;`i4}xY?W1v}$N&DeGWUHt*6Ze)z{{pm11A;?nBDHeWUgGNj(wB@ z8LO4!z!Q32?Hx)Y=`L4=KJ}%@p9Yb!n;mxsAj=l2FRZact)FL=u!Lnkq@EiwvGPByQrZX}=w>&_f z-6i_yP^HK3zQH>cikQzE9w?>2zN zqzQ0jED169MqHTGEWMdRcJP1uLj@YI2qBMvJNrkF+W$C^zmDp^j)o=YNK#9&3GmT= z<7Qda)a$BE>F7vE+(lptG2^HUEI~Vg)EuKMwJOJ;XFUCH1FaKG^>`=FCGtL55biEF zcg+zC_vafK9)Q&t3lW&ZoSbtNP-X1m_f?C1SD%On{_S~i-+_mC^$p^Q#zRpmcf9F0 z2Y(xiWMbo8U=w(P)&Fic{VLn|YBA9CH;=XncyTr#mIxx5VdXP-Bv?3UDp)~U^7+%M zKR9FXrSD!R28jB{Y7w=huL`iR`4$G?e8mG<>&BJDsu{=)O0Jg+5ei_DR|4O z$bk}s1In{9r@-3&7x4I5=1bdqTt z(m(-uPbe!SYkxu9ufkt)2?S%@9Eq^Z1$5cBX2!*hy_tk&1~XYMFoAV*x? zwoE~h9zc;bxaw%AIiua1~#HF1VR|+OSF@-5tq8353Z?)u8j>hIAtfop7h9yH9 z&{{Y}*N&G1@fQywwk~28RDoq4spty8@^0xSDMgHtDZGaM+IGR$#B2Eb6r9!PzNN}L z<~;-AgW2G%ZI%ss>D9`A90i(#D{Fc%Gc(JI=Hwc~qxuSFYYd{Vpp6nTa-t<9g^9l3 z*ba==OS9DL&Z6bBgH>#dAEK}1V1^VL&?Ly|*APy6b%laIlsp{^R5xPdZrm{PB1AGvQvi znvoSe_$l5^OB^8Jix0j!yvin=-}KuGsTfl1r5bunGBFc2g=6rjLr>y!PBdxw%jr1l zzNIgcd-6UxAGWl`sd-=z8^iRG>hY{DW#pjlXYPxT6Sx==}C`x$B;@A_;WkO^XQwEOqaINInu6Z z_wrl%GU%vnlSJX@YxK~iU!=K@5X{50f;Zo-OC|+s)XYw++77?pKULLO;4JYOp1n^1 zmW4yy6F@YGjC~Wi62^4jq|H?w2F=x!tYB8JzjP+8>)D(`b&mos0zItUD-#i8{Zb4@ zp#<2zr?X@Gk7p@ruROL`%uJcXz{I!BJTWuI+)?&Z0u}eTJo0C`QmNzUhRtZ|V3(qV zwKv(^k(m&>@9teN*5!vb{ex^H@F$J?wZ&B)Eq7E1>=OTuFFTr7%z1xleh_r{62JWV zJvw52!cjotcE`zhxQ!*bsoSEjOz+ z4oe>?iXT?A@^v$FD$b`ICtrmcmo&DG!KDOJEGGStY1_H32Onj}j4JqP9OA}|BSB#Y z0!c}DfOHK^RE_K~!wpf=;*;Sp=-(lQxGVxH0^@e^<;V54#(=~sB75nV@skx@$mm`| zbpMEtR)hSB#fbVDdKAuKjX4D!2fvZ@#*cy$z|>2WD|pe1OQrpr zZJs2S6(!K4AecrO;7Fkz_A98J$s-sh_a|T?*@ZWZdU@FrCUwcfi6ail#@RsN)&*y1 z?FL5uDW)AM2ITHub^2_ZoU>4OrcWbs3aH5Ku2a8}?E;bo4K}Ju8L||$nowsK3_LuP zySDJ*#-+I4slc6Re?^4=H&l+&?-v6g?^OCO)#iBd&17J^ZpK}&Mi3IvBhepU8=bbX zmhkM+T3Oa31;~-hwy85PWIDV*V;*!e?zdgES&6?Mho-7h|C>W+)?RF!Z+l}SS3#C4 zRf_Nnjn74m8@RvS=*;PY1bzuYv+?t*fzK_4z@L_2)_=^{{jL4WObGaSetHs}tHrx} zllhDRexZ|}`+!fwB%NL~_d7|3u=i{bS`7MC4zORgbA~*snL~Bh%ve{dABP{o+v0%H zHsoW}`IVRNXXTnBDC%PniX<*VrH^~JvDwiShU>oW_k3pe#?(B*SAkpvvup5h@Nk}1IL+fzCImZZWqmkCV z9X51_Kk@K*SlI*GU5Y{Xf8~1I-)SK<6O*hQ% zI|@J(z2GCsJJi&x_6d<_;Ofgc|gSZG;ZMGw{joBeQd zu?d#V=TJ)-o0nx2VNY?)Y@+aV6t!DaT^e;VS(epD1KF`#;E@UhQf#)av|{k$9X&%f z51Q@qTL<2kD*co2XV&TLPn98eWdGY_p#;av;sLMI_R(lTGrG}+S6n|&S4}`uXlGvX z2b?&B#s>}N>BZ1t(xlW7-h2k^p2rK&&0Bm;ZgpE?^CUQf1#AizNaOMs(6TxJQ-S@} z9wsk%_{#czOFm@B1wgZ*A-zfUQ8L2v@dvdY&o6&w5Zw8b@`DwSx%W$Z{#vWaNxq(> zI6t&9+$E4?u%Hv0{hR@x7*FiEE=&z&j}{3pCPKd7^pu>^n4vM!sVRK;w$J*{z`v(} zb4{7G>mL<1n0A^4DE%;`>`@&m3eo6BF5M0pN&Ljm76%#L&x^H5x$T#bX)u5S>_Oda z11$1*^@GBw&LR01k=}G+oS~-9F;LyPv8>4t2GNelBlq)Z4`%n5IWaN``iG_W$JHBi!Dy1^e_edMdr|rFbgKSiDcb`t zv^r;L=(L`(*s&;iGQ9*0#yaxzNTpJ-C z`v(}3-mI9T-Jr#LP-*@R7HYKLnxA+-bz1UZ*YRZ105tb}245Um^YWQ~RpZMeYkuUR ztY0eeCgaIOJ}!LRh>rBo{*s=m_gU=`YUHEvFcH7QgMu2{y->)H*r3nj+M5gR zs-_^_IMqU_NK?|M#h~~Ei208I%Nzu;===7!jm zvZ|@b{5dSvL2_PQRv`=-F=7AP9~g1V4kjDy@~DgN`s`OHWc}N2wFWN3x^xSg5>YMV6f$`p@O3Ik z{=#DA7=!O1Te#!9@-NblQ@LMz)4;i~)|;=G=p5Wt=O@cT|xJjv&P?bKGpOi9R$mL#*VVkfGjFKOfRmvro{FLtpzK)Rt1c->!c@LYDw7s4~2I>?TNbG2h0JpwlG_A zp>hWengv!VDKntpR6Kr?O0ngQ?D+l)*yrfrZuE?$9<3+5FdV+Z&CBjAz!|`}zBX;} z4hG2N3lh|W){kWm^4F$X_`!4|e#;28NL0eQL2yD0?Sj)SZcO^@d%-}TB!!RD^-*g^ z-DLK-_^Axs*LX4|fA8(iymsO0(3*@p(;{JZns9DTZ~Le*d)xFI z-+26nMy_)@bFm7Zt@E%Nbh!|N4L)K*h7LWRY<{sh4S3h6LZE0H0PQsbWhO3HN+<7; zicoNK4ZE#Wj=kU58zsHEl*l4f3Z%`tByv*z$f$**oB^3c=X`M6=< zA9^Jz7c2w{UyqVcG27Y!_NJVEOuUr|krjz=8S&rK5r=Ol_X$5+BNwf>`rFTRe&1y5 zT!6ICeCcFO2`>ljy-;0>yC}?n*uRp#6>OZ=fC|xkRPOf576wx|60RKe6iWY5AdD&8 zRp_S~Bzo+TG1d9}^mBVwC1EmwvCA(c@ID|;tbsQuNbG}*Ujz+jZl?)R#mEoBBB0$K z1UlrVKK)6MAVIB{#i*>1@gWP^m0*afhMb9=G3h0j{8-<3pu<(^oU~<7$ih)1T{a|Z z$=iTYSu2eUY~U*=nnldnK4vZk2Y?%gW%VZoax$z)4-6&g`@K-m)ZSQHBxfal1X-SM zAaQwzjy^H0k_^Yi?+XaJYhGD&ka^{AT>W|yb6(dZC$#CV93T;GU`{}n`TLs(xx&6k z!B?8+bNkr4Wr0~1LCSVuTxBD2aI89WI9*>wa5q##6J`7{ZwUysBs6x9z>#E$N}53i zS`6=de&coEw8D0X&|%dgY`KPoPo6&xSB?zYJgsY}D*&_n)cY1m_W6z|#i+GI_O7K~ zD|Xk*itfh3*RmcjCRej*&ObdaFj6m8ni(Eie7C$4<6850tUg`QKB!}V>_PS28+5cd zKsvSzw1{UgVCCx{`h@eCABX>Keri;B5ciq;PIs9bQ-9H54Tq;8ZwBtGoPV;YY(Uz9 zVg9jVSv+QBM~%^F5$y_NM?k$o7xL|~Caa6iV4S(5idStbRTdMFw9rO)Fm{FVQZsNp z_OUyRq>OP&;04;OwFrEADj|)n!4oHuAcpz=MN@j8Ip^$-nZEbmbx&ZN=>sN2H8?}m>BZh2SpRz_Bo5u!bA@8lH4!yN=ABIOmur$? zojL+pIMB!Ym9k$v_@pDt*2#bI3y{qTz?d&0M=x|R3%j*$&$h4j!uDA+uW{Nb|Hs@ zeN?FjbpAP9W+I>=3&WD~d8B2Y>jKz8PwMGb#{o@-wNA`Znf;=3F95m1ln6ciyQ6y$ zM&-k(jEmn_kx{;c>FQgyc$8zMT6v`?S+7XSDQjO!d(i&2yo?O{=<|6z0Uvt*bEF~E zEJ$gX*p};2_#RVy8{-EAEC`s)jq3mBF?fGbd&ZgKaPSs(v)0a!{Dg(Amq;lFQ`D=* ztMpTk^YckZeH= zXbP%~CRWLv6|>u`0^HWXOzDGD-ba{8n9`Ud$pZ6n5iU51{~;v zU?dzLr&?vR*c&-JqBB6e1$;n3B*k++1Wh)Y3(Q?43@*V&1 z`cEjm6NZ|JL5&wz6@)3w{%-nl#sNN+UE$JrA4BZ&OspZLxu9&hTr{_avu!Zp zU<~#0e)6i=ruWF_f0ZKVgUb@FnKeNWOgN@EFErNkhd&zV{!9w!h0#A!aYX3c$7Ef* zE4yA!K(o{R;77meJ@hDb7nB=gJ7r4->3oUsMVSSjEf#XnS4@*bWV&L_jXCa8R(q5Y zhbUx`!=po#iD3LC7w-s9(bO+{1OB-qZzRx;c#M$au1f6omYu2|6gadF=mh%Pw46x{ zwb#L94k57tlO0fPo>nKYy;ASVW>Vft4@+??BC!H6W)1lc9S(P=55|*s1+MSvsOb|N zb3h948CfOUxt?#1P5|1`>p8THS%Hs{eF05H3;TC%$^*HA5#T85H&7Th0oL_}c3Gsa zP5!kwIFp&Rd=w7`uIk4*2{(d|Z^6Ato8rCkPr?#pMN^3U;v)wvZz8#X&gP<2@adS^ zg~{2KX`KQ`*>CE!@$kHYovQ~BROCp{A{@_T(5)gcszmJC?pb>fz2;o6>+dF$+|t1R zcOk5LV>w7Z!2xF7J`bw?6Uc)z=JVqxg1HeM&n@)`(xB?Q_Nyd^;A9;_40V&O=xezr zx{Zk?vZ&!vz%-p0i*qO@fV61ib@RFaUklk ztSsJOjyE#J^5>H#^qrv`He~$2VPO(c)}BEYQ|8$nXeI$dh84xf@UZ&Z#H2X5V%GM$_%c^IB9@qx(0cDh>ML3lX=IJMs>XMY zo@!Or54JH|@LD>!{;V<2KPe?jzISV-S|QT1$JJw!*R~?-lt-kG@zr2zP!L3o5)*u8zf8Ae2>;{5|bkV=R~war_{V`eUu9C;t9WIMb_ z{5{siQmP9&Qn2qZ z%qgiTnozLC)_B^4l(yvc8k-|t&s2!t19rt9xofpDhR4N`xL?bwUBA#*a%2qY=CJi% zDE{8*C`MebfjptspJS2%W`ZVb?$u8$cAl<-&$et9R1#tmo*pdM*ri_u3*T_V$H;z` zL$v4p$@A;1I$RjnM$c>*ZuCfI8ceHT9@(?`;~SN ziIxS*?c0LsgeLC1=J-gj5W~@2F;|~}r$zh%@~18z%lojDcRLrK?{mxZCTE5z9{awu zq3nzqdQ*brM0KSw<2gn%T6MPfI}ZZunCIU((5 zWaGW??~R)npaa{FH5wO08tgU9-|<^9x$vKViZi-+*1l5+T@&}0w*GEUyQ8!CVr5ea zE7T|jDW9^b39&ViM15j=n7US~URMwyT!^pCZaJC!?O8q*TWRp!TU$JHE9R<0>4%^n ztR}-9Ou?e3q@z_|c6ezHA)^pc zCZKdCiRX(|{lf=YlG6{k>rYiT2F#JHBms5M#H#QV9bp}w)3ax7or0}AiA7}cNJp%!w8JUkrCWYY|u83uoPr4slWewfp8 zS;X7IOT;g3)A5EePj}m7Yhv1!|8v8phia^~{PoZ@cd_tktJ`)+K4aG4JaK?5p|Xd} zL^Ifye#Cxi@!j>0_*V=$YijbJj{V29bz&MUiVO)PeLOYyNs3^L$7i;b+|Q32JwO=AUEo`wTLzi0BwkV^=FAeogeBJAKWaJ01K# zy0Cp?PjbBs3u0aSZo%jNX{=;goX$O;{ZM@@mj!~K?vk}S@0`Tk_e;sP9!abx>$234 z0?bNIGH=m)iXaN))=n))9o2%LQy;qJ_DCPbA!QXx48m8u&M%o2SI>@{n&xIcl6o`W zN1bq%{Fd`b(!tBxP!zM^_#+geck-v@#_e@HtHms_PX623Z$$dKLwnf#e%SmuZc1}} z!Zn!t^n$x9Mk~UUv@#qPG?4tO0e8?3T(Rg3dvdH~yYR`Kyk2XJ3mR@hR=Y=~Qg)0R zhcpebLM=?NFy}PzWh1Fjj_?NVZVhkVf5QfkjNV>fTEqkVV`|R^Oummcj-XL&EQTZ~ z&Xl5_>^=CmqT1zzV^Ar|bwIg)mXe`LyeWc3>AXyv$T5hlRuMhGM1c~ zecEp8cDu*VN(+og1ZW=o?syfDZ)2|bF0U3jZt=V$_s)Vx(5CrXYlM{@a(iIM5$#ae z!=9{UU5~`n6=#<*bZHt66}f+&>!4Pmz}6g##gQ$K7tEaRU87wN@dNds#FGT(SXRmo zy?8=!nu`C{LM!$*xHtTy7r~GPFN8g zU&h$6Pn~6w+5nt`6dPkp7afh}W#~+DHdo@~aaYq2PobAYoM)8|hP1Pc0*_!-j?8&+ z)my!GZ`1|Lr7I_M?6_GLox0jqgS9AkbcH+2$k6q}ExO05hbP~(?(p9~8^9d!28~BV zAe(q0#V|Cwx#J+9?ku$p)2%sMTqeX%GP_VH8TLL`=Ir~|vdA(&yxtA_{{5ucm(X3? zXSBr^B`8ZXySvb7GL&>g!uq;{z9c)SV|NModFfv@V)z1?*`kBIDv1X0bIP(%eb1M zkl?5446?+=;3U@W=R6jRwSE2Vx7aB`u`_)x`gf+_`1}FAXhGW-v%D6D9btbI^?awh z+w&aV$jX%Jk$&UU!Z*l6KPRRD!9$oRmv;hXr7qJ;aI5-=!a8lm*nC@7y!zp5T-qP= zmRoEZ?vvaqUGxnCD3SD!v8Zs-Y19u?Jv;^&k>Z@%@L7vaB$}8dwq}|{jA*YM=xiCa zBhIROGC5RL0>@gY`m-auS|)ru#CvnKgx7=HU$L62k`%j;j35=r$f~!jxsi@L9z4`$ zC|C>8(p7!!#oxf}-vIFODdCH5$!>ivB9y2ZOsb3s8~{7QA?k5PIPejQ1qug zRBZ<&R968$Rk(}7?pXe*2x$gqudc}745<~D=Ml}X?DKjr$f_(;aDFohB~>?a`s|h8 zHD3uIi8d71FlSbojCd*_g_^?>+XZ-h)|x+G6iU&&e^H=j`T0frH7k`(87rIlwC~Y( zs*$ra!lEOG&CHm3%LuY;qb0&F3rA)2L%5U}N8$%_T!RhfP22AX#|#PQ?I?qzzU)%e z5Yq6v-#VQ`BLq{4RW1J5>F33lqB-eEN(s>Q4@!`rd~L{W%x`k8N{a=mMJE=ZqwO6q zZ}d9C6a_StmQTKzQvHTY&Y!mof=EuUv&z~-G~;tFotBNbeMWN9PQ#i$emOO=PWc+8 z6~Ri#rK9yJc?#=nRpaxm>h|{ty=sh-ix&sE{f(6e(^oCl#?<%QU7jT*@>}Z@@3Ob+6V%+J^Vd5Wq8$Du4wv z`=Y$>lk*XVQHckb*by13q7#p5BcD>lZ;wi3`8G@z4yCq3M;$QhQpsgL3OB$C1=?b3 zzh#5!Z0cWWtrup|@0Iz<3Pj!6jnf^4f@ABrZoQ6vq5aRDjSW#u?T%qbCthffB9|{# zMjf>1SciVK1tUEsiqpn(fYc{W^i!lsN5^nJ`vsTVM#euw- zAxn*|Apca5C0H>+f#iC8;x1nlXyY~le$yV{%Z{{@zV_H}6xQ8J40!YFt&y z+WK~TS4KeZjmL0jZ(gZ$j1vy5*Mw|o$d^i2;%cCW0j(wKbpa79B6N;jzt^TOQv$lI zOpgBs9ZDQNNTT+yBm430W;HJNgmn6Wb|z(l=TVL=g;27fJK!kydcYXXkyGJRD~czl zeW$)x_-CSc_#;Lp$lQ%7+i*P>V z@#MG6DH93@GXGohRYjlj>a@VJ-pCh%64Abc?*-)P7V5*5{gETe7Q?8Skqp)uqQI8- zvhYi2L6PMLd-4GL@5=4|0JU!H$RB-9IadaswB8e9j{wre&&&4%Iw}w#iS#QZo3S0Eub*HuF8Xh+vsK>5dvDnneR^7CFkxzC>* zhQiK?8cQ)w-?ZcM0+6{Km=vU$yQ0y~toS7xTWfOFlywBF3>YDVOsAp;S^E%W!0oiO zBZ#p@Nc9%Ap|D~gK6b1XXh4et2*cyW+6qVzK+pF| z8aDT_{WSY5Vrx;yrHz2ZT3j%o+&9f`>AksXks?PhNXwJMc>?xGjUhYmOF+Ri{5Ck5 zlrgYwkhTRqAvriC8t5Gi7~KfjfMShTrh09&)11EzEPSl`r_Yo2sDo#DR-yUSIJEKy zt2l%oo&@QWz5daAb&j;-hITc5p7PR)l9XoeRo{BgvJG$An zxziE`n;b#sYPn=ibF|@3G5fKm@!hn$AH?IQ(>c(iLzSO>JCDv%@JHcg35c7Eb4NfNlHIOtL_y@bvro=Y{>npaEbz z2lOvlt8y(0o(K22WrzpdY&-Tl&LgUmox@E<>u z(TP5khDNM9kY>)g8|Hkj&V0D%G=2-6LX#2fraKM0nr5lfrkV`#w4E1mUlKsHO>kUp zVUuu1N9>Ce70SRid%iE(I{0ig!(t5UZ>_|N_eJjw>mA6nT^DbC;@~2sWX1aPu_@1> z#toX}z=+-RE&`(qYf3;~2f~CH6$3G6tBO1bvTIX>@P~)m^vjTKvlE1n%x254Q)p zMzph0QGY>#PrLaXP$H0wK7Y^ysgMtRg3saAblH>f{>*(V>))s`>|THTz*Q=9^az{< ze~YuK_bt>)D(H^av3Glb>9{Dd{>plIlgV~VJ{1K!^mm$c5i1&t31p}0e^Xb#0~S9+ zzm(dx95t2q;!iia==z7jCcQh>9|iVM1TraObU3^e`y-WM-rRb>0^ZP(_j@OG@Qf?S zoDLh>U3?7buVpRluzNo(+;J z3|l?A_>V{6H{Hi!s=qz^X&p09u0lFTOhWNh0qT7v91X`Ie_1#6@t>beCRu0J_4>492HBXqEEQc6fNeiI&}SVc8{W*CAQTECRs*|R zGn>DL$k&+sk$jpC-6dT%rt*`^Ma=C$s^Bb@@rbV1h zQ$6$wyFouWnIh|@OZ7{B=vT5p%-+A~0r;$JtzZJ4r=eRmM5Htvp1BIQ>q_z3ouk>+4Zg@Epg41pu$lx`lzoK( z@14s}>d?^|5Goj=xubo#qH9;E4F_zRa+fkgi?1zZ$P~-g*(!H{Z9LS4>tFt1M#`ch z&#%6LP_!T9H*BwXbuw#SMSpF*d^POhHys2%TH2_8Q%qVn6g){e0bXq$MkxQ-EWWPA z0QR#~s2VHpYEs7*sqFF#cx&ybnS0XTGW~=ndPR_vOfhLC_j#VIK-wVp-az>0$XXt+XN}dWq_R6dS@Lp5H z8e;pEZ_WLFMGAas5KYIxQ=SQ7KyF(v@B`ylu@O?{&G7?+A~NT;BTUYXsE!iLQn7!x zK}pr$#{$ja8oZI^h-pUri0(~~gax3j(xwMO?O9f4D>C^m34YOn6sGo9^vx0LE#P(XY)^kIIqdXIuvM^0O z`KnFDsIUm~_~Q%o3f-f+ugcvBL@|-2Q+r@OKDiur?aJHJ0oAFe z;_x7m7K->S&%fKX_X~em*{FD%8mxTxRX6@bxEwS$VA&^vO#A(7a4koEr%t<82|W4g zZ>)0IsFh}}RAQPEEF1-=SJ9K}$x8Uf-TZ}9zDk-Oo@|8*%(V3$oKmx{@qwLBb_rE<=6vGHP@`_UYzPgzIx^Bullr|YOj#E=@*a|`H-!; zmL^ok{GqDcyao~{&hy)Wv;1!F4gHd*VPwUSVp)0dQ;ktb)d3+jCPb^h^ZGsbcH#1K8Z7fIL>8I8K;MK=J%&Lnm5PSoLTg z$TgzIh5luAi1(vDM$g-J{atxI=8PU*&fPFUU*qEI?WeX3*sO(&S{eR;(C+h0x;eroZwtQx&6 z(ay*5=LyIR5s^44eMXdwEAJ3;{Q$f$h2eXunz(mGmcq`G;q7X@ZhWX9z1C^7q-+t_ z6;8&wRwTnl#x!FjV`%lWa$-uK_wa3X0-UM7XOMX|w$4T#ZLsa)pF-8``9`qsA0mR= z4lLB1B|GvoASgh8*{m2;y!;*a)FFVjOZF{9Bv#U_60cLYFt2~mmWTm?NeTyBO~q8* z@GOA%WDfB7NtDHj0@&NrY>%jwE)>*tm_5RXui`9F^UrldQr9^5(c|j~;wdl!Z0ne2 z46Pd_$RU_n++h{AS#oJFxM^dS(&!hFHVkgzD}hhu3x7uof-V!t3LwAjhu`WlT-^(b zPhD`5Y`}Yl0IO9b$jHZW<-hOq4rSVws+`F271JOvR1AzzO7doRzh|sH-T}t?vHx*& zRsmUVTNDN9lm?M*5Tv`iyQRB3rArWy?(PNwN$KwHMjGjs=I(P}k1vP6zP;C)bBrsy zHzX@nkS(B$fTt(RTRhq8){n?EMFQs=!Qgm6XRd}3m-@%ApBJ_8t(Z%~q!|6$h-y5jB$5>uP?P z08Dm!`mJ8NDQw{DhU;z7v0fSy$4f=Az`?~@c&80%TX$>%5^$N23i&88$Sp?jWX$tm z8#c0tKP?FMrOV(hNn>8y1EXs6Vk#N3<}g7?=bZ?r8rf5-AK~Xas72DTp1y3l_?9P1 zvHu4)7#@&gNNG;z(SZFe>hSx%7%Q3>6a1JsdV3@NdjHmekX(Xy8tCywab=f({!EU^kxwcaVP}V;DtBYCNe{H`KTh28#4wbDT_+?^mDJe^u9<@f5X7 zAyC`_x4;?X>7~%g%lLbcmUj7?0eVXao^`z9ie(^W`r~UBP1LSl=XNL^VBT?5uYqo7 z(XwpUEXXHd?sl>^Yv9s^8TO=RJA4b3?4SNtKqLGJIF0 zlsMFFA($2bFRtMaD)L?5Va%q=nxo-j#f~BOsX9WuGpsE#xoRGe5W&3sD7_7~r4}wy zRtO|Qd7Qu~5*=&lcJygZ+$Ohd0cJ+pZcN$WXgK=y?~V( zEpN?AA6Ppp{_B@+ukWR-84Ep7LSa`2NKw*3(#17n7??K#gUA$UdEuYPrI1otl&c3% z9bg+wr7+EVoZ(`ytB}xDJrkX=<}nk9sS26-e$qv1yEp)ZJ(EI~@F8$tjZhVw{k+n^ zBrxDf`FNaTbmll;b^r+IEK4-5b7-lkI^dVAVLiX3S{fz)z|r_(^O)B3r*DQu zGa$W;Jksup)jPBA0#b@R?A@F*AS3@m^74Z6F)KIH59(n9-T*a_xBGqYgazVgrs5X9> z1vy-R!OFWQ$Et^rb$Fg+wC6(a8d>1sW`Rk+u_i@-Gu(cEm)c&Rn*G_~QWB}_#4R32 z+ie|e;1_`pTJY+}5B|^P=Vx8Wuwv3yag^20&_Sx}c{jIV*b{&ln#${?6c2j!)LXWdQOugzx!mrN$hy=j>^_%0n7yj0AgB1fsLykdr!^C4ei zt6^oB%q2MV_!!RO{)b-JB&F6AnxQnlZ#7%L3Nj=n;COq%IhFjSgpy7QiZoidYKmi4 zW1k${Gy68Rr|WOA^gq>`Zx@5#;&Q(qZ6;ku?tjSHa9)8oLYl2G;LH_u(b|wJGgZK= zubyWlTATBX=F}FwxhI${Ih&$l(5-|HVM+8$u1{w#(S$l(chlt8Ky1akz6edcDRfA< zu!Hf-No)tR_l75_uO8Pno+4lxhyq+Z=}}yzRqY9a5xg=|)T4aBU4Nw?$XbW%Tok4r z=Fu(KDa86g^xNan4RCJ0Dmi<`2O2h1f#)e&J~9GnEehxS^i(PtzUhp~ z%XU0+sZL)@;rGEAykd&7S6Lw=9#o1w8;MNzAY(3;#4*{m!D_@rAmA`vt%KHsH;T` z53y@}LenaHTHKg@o(#L3*Hl7(=KpSj-?b;i0P7FH1lA^^s&=M#x&UmDt+e& zX-E%T5$BO-FyUQ4=1;glXagpQ*pW%9kmp(A83kjQttt{=n`$i+w@8g^PUc(&hQX%_ zlN|oL6AuQb7ZkES^wsjcW%{ePQ(6*zwB(F;0pP|XWWeyt%0$}E&bb3 zuMc#&{BJOqE4C{(bua=EFQBM%AdCFzXxmu+_P0kdt*&JVo^ivNC(P#O1Db#rRBZ;_jHEh-k@1yfj$ zz&#rP!cwW3EnP2}eWSWVPN+s%k{I`D3!wG0EYwo9VD`Hyw7y>h_Dfq5eLbyGkV zAWjyPbSZQwMh3mTJxH>oxto}zU2t!vnP!;brGSY)^SwoR5BxwEfUQ9r5~X%eWmQGY zTgBxF$TU907`MJ(t}ycOkBI741AY<%gOvQ=d!4uN!kbF*J;p^LR zq}n^a_Da+yD#erGzq91)HeD7hPGEu%Rl3 z-gc>i!xQRKPztbMKPD=DmGqD1hBMGy=wfZgh=?gXNdwRMrc$D6RMt64xD>vgZNNVr zVhB5;?}$lktI!0zW6L?%6A5z4a0*iV2SldIh&M`0ei~6 zX8YD@_H#!fy+jd$&i4s95j432Ynt3h+GZADz9X}9dvAphvBL_$_~fD{sYKiUl5a?*o2TmxS%&?EnR_#c+_!^F>R2A zrDI`i{>P_yij_IYkKrM^7{F-)N$SnT;356Bnb-bH7`oSeUwHBoZg+jl>Vg%WO2QvD*Gu}v8-Jnpr zx@Cg`DJB+E^F|H`t$9MB>hi4{oaGXzzia zG54BHqrW+*fDG9BlmV}C?`0J~s?s*By<5FH#ZB2ajzj(WZ)-9o8Qj8+)S992!*vOv zpiPB0nPkN%2C(hv1C!Iu?^ASxV`Z3$OCRqmqG956Rw7XkkXv6lCuG^JO-2#LDgh0H z-hpU}*cB4)xX-2LL@5r(gK~?&vtW=N%B=`|8a~uP1~i~^9|WwyK7JxgXwE+Wve1_* z@MzBFPK%1fd_TACPPcSN-mc5fUUJ&ntdR3z3;>E&KX8cunBviEt~dd6&t+sNwPW{amDY`GwT!dpg+kUl9Rc69d?(Q4!cW66!cLG3VhH zi(&lA1CD1TQ2Z~!lp$i1*GdDG3Rqz$r9>c9Xw)MYKr@Dyer3ZCu&{`FdE%z1mD#iL z!blUb3054H%M%vpKbLIT*X^JBzEPRW-Tn<%s z2$%d|)eu+xY|HN^2Wyu&RPc#?bWa7WkuNWFM)?{m9J0>>=hqXVUwueZEh=SL@IT?F79!WCfIDnP|&M*{PvJ6#ba zAHYvlc9cJ;vMO_yu$hrCgqXM5SFspuyTDSv$3aWXo*U-mtA<=D|=3fz&IoDNyeKzZL@B9WPhn*eZG$9Y3C3MQ-2Z?Jv7>1tkyUd3f z=V8A7GH9hI^FQL6)8oJfLlUEmi05=fg!r(L<^^+C&WjVyH-_z%@ ziGr*T#B{t3p#Dk8qQx$5aa88l6ZDfIrw?k`G`97J>@D89ZS+ltY%Lpwm&cIwo>9?Xzfla` zV(5ufW zLAFG+Ub5(M>Jn_+(U!e{5p#!gdb(8V1kG;H*jq6{L=c|WxxdKpoyC+_%3=Y0Ua}w0 z@;|y+vi|)z5R$5@b8!2d{!fDAZ?zbajIM>qq-~_Xrp7gRzQXQogOhzjsdKEpJqLKE zckLh{6s~g}KChiat6D)(Ca+y0DF6y9JJ?Eo?+qIdJ~Imc3UTk>LAq)^0z860fd9sl z59dj7R4t67ziAvM?DVfRDKdB-aTIi)%YezPmYust01=~k*Ap&L6yMCp?wFugvr*~h zx6F5d%42NmQO*aZmYN5|m=W=s#^W#V+(^V2U~w~;Zk9WnDEVdIrrcffh&)(PWf^%^ zL#JGPT*~lZj2ka3uGs!m&+B_{LPUurYYWXq;1Wjq#UJ}P4#zpLQB^0d3LJc|@frkV zH@0*waVyed^@7j^N2^`OvMmiqqiE^Aes1_gOWJzgapA(CS+{wjRru+(GT7psBa!dI zkVmbc_M;$3?E_}zb)-U+FgRIQuM#h2=8V&t=ga>x?FW4d3fZAGblh$j{@6EdsZdn* zt-dmzixZEei?RGnM|XT7Hnw{$ADcH4p5@#qwggX=HqiLNvIQ4!5$)Mcy645JVCNzWKWyz zwJFc#rI4cQ+Ryp$&TDtZJBuW&yJ!wpq*EPN-&Qg0YP>2|(IXTwa|qYuL?Rv?{h^iN zp85X6Ny1aD|330=mkk>YFc-HucO-QI*BmOac!>Wpx&NYo#>5XCJtDw6z%f$otEt~Y zJulWSXBH?3XzU? zTMhUwVXJo&btN|j%##XMi?~rHqErT6Y2e;cUema zb-MjqoK;Fb2=_=GS5)QjJ}d>m?*>V@^^YrB-P{nZ`F8f-k6YmE8U zF}eb~gyQzbt|4u_!zXw~PJE`}l4^(~sT3ns`Ul0;nIph3Dg?>e5yo>ViFZ8Mo8aF& zNU>1St<>LlC!5-YnOT$k0H1gF|C*{!S@6-e_Mt!JVVk5ck%af^b>BqoT5Lin6ZQ4N_3afV}Ujk?0f=GgVnFcE(3qXg=p-^u<#9Yt&&-8tw z)J?v_*#>bb5~EpDX{Q&B6wCccv<#?n_J{+Y0EFxE=EPwn&f^OzK*i$L|4KMWWNu9(A9V`UGb9( zY3~4K1=vY>8;E9i+h;5YF={YJ%DEe!X*-=H&0|$QiVqZ#!PHKYSK$CpqY$tLzqQHC zd71qb9O8MzGr%1gEgM1}uG(Au{F;lFTtjL%SwvJTj+Y z;1Sn6(gyCcHz^7hqCxQvvcDIa3-z3`e7}AH>!Arj0}WSu3jY+CuaWUzqp|`@-=31O z<8!5Y#%)qjh$!HiEJZL1D(W0$e((+Cn5yH@T;+L7R8W`$bcngHMw+(ADR#>`5x_p< zczC#&558Y$>Vx&qU@kKAN_AZK{%~|+n6~E2sWJ43AJISKlbhjRC6WR=tNl?4KXp^+ zN9YB%K&qv>nfn>-;foZCM;6*JBRiECc%BPxX4bd@e`LL{spRq#fw2sI?4xCURN@TM z*EqJmF*ifIFL<(jq!4J_g5IVYOhUUt{6z8wYK!6?UWTa?btYztNjJ}x@0-@SpYRz# zyL{6w%`2xca`Ah{X`0xeefgQ%A@w=aRvn6rFD_@lWnP_u(7KG4wc0vAlv}5eC`lEV z??dcT29d^c>k9g>VyrqCV4Nz#H?uzcBftmU&X%4gW%*WoBkfNqX18V-ght|KCGU_w z@)tq(IpHW=i`a3}N)h~2j(Y-|@PRUOoOvehH4hnf7E&c8E8+jRu#ZaJPHk@1qsQKJF0e1~>8#a#k_mu>h?H1ycf6m9G|s|!!Sx^iFb!8c{^R?p zx@;_$?kwInl7d<7t&@i!Y7+(%XgEYtE`pri?C%0=Nt6n$7JN1vLMl98`jibT=SBtI zJ$zl>OL75C!QHVvVKMN;`wDDWT?WGIOQT71jC-l&#iIPOD@y~ zU#6r^zu^Qyw{^zGS!}FN0Hx(T5jz0Ntt8w=G)Wpo00(N3M#e=%O^djcgkDK{O|yI$K=c?w#bz8 zQi=rkyXdxnUtVq_EG`#*uR9svDi8P7>w=<@`2QheaH~;uJrS_3lYZ}F{h&LFSVpA~ z?7bqp+12xhH|zcN7_A>B#YPBdvz6P6XXJNwk}~u6VMEMU1XB>K_O%5$VZ zO|i5zO;|4Iu@?q@H34_o=Q8RLT{}spkW;?qpSh7#os(&{v!}nkv;t(a{wyyrD2S&M zS?IHnFY`r8hmU3mk9TSG0?!cqyso!{!fMEg3f7RTYki&V&6QWjwJr02!dNuR}ik zF{fx0xCFC@kSMdkez*m=1TP8<`G*rKQ#*92O@#h)Ttnl0qy(mUq&*cr6fpfDG6|8h zg~h|tWKDveaJ{IQLSu%W(?|JgVS5fC+5oHNK8piBZ$TUNp6y+gNP@wD|{Xrx+=4Z;BRy)xhv2 zkxy3l3DwxhLqPVMO)hEf(cMu_RjKa5qjBY$qDE$B0`DC*S%26`;MHx-r+JBgC|@SA zAe8ttHre`_(~%6r(r0~JDmpbdw#x^H{E2wYDut@mf5bu!Q#LBRHBn*&x0|W$6dy>&#`sx=?`zC-P78h)IP#Y2j~J z*=FGNlgFuj=cI*cwGMKC{kNoImJ~|AU9g5Y?QK%b=24{M!hk7Zzd5=H15nm-J(^&6 zo6!&FhLjMf@BH>pz%%m5zVamBWWrK!fD3w1JFF-gf`_oQ;JXZ;U=ck@DQbxTu(q^< z8%$>c?=gKR9G|gpALPcVmI)mbQJ7`|$*xeuG2t#u}C6Ucr zZr!`o;1on6m(ym2HLPNG{olPCHuT*bWuG`@qgj6N+>)y9kO%fy721V{rV^#G=8^W< zZh#ueC6Uq59Zc{p@!co~P|CwxNR|4P6Pgj>i4nX);?SJ`; zf`P1{iP;f1QCffho$6}4q^2(8a|`^5?}EMk`nqjz^0Rf{l1D5KbJvyEZ1CovnO^>Q zT#+hW2Zc7%@ytski)1q!$jXOF5wIKi4rt8gkJ97ai$X77jk+y%%x$aFuMwrqlK*^a zcU-IT)rqXw)>l@J92NP&O`+KM2jq3QseDRC>5S6kdj>2OnzWsUfg^9Z;!=}MqE%AA zZc9+WIBKj8IB*cwbPbfEYR>M4`i1Yo9lzfYItU)C9zI;b0O!vqyN}eb79$Asb;m5g zDAIPyOfPfmVXyLAQ{f6Kx!-(qBwbY~L$TGy1IO5C+^9tEL_7`b_|>0~ty#jAqYg)N zwsIG;u`$=6oHF6_oGCMich(HmD>}gL-GPIpyH?|?88M6ES<1akpBU>SOI(nhASVa; zFjC%-i9z{PU$QhKrryr9#rWj_1zijF_Q0V;kTol@C^wi{$?dP)2{rcwS%aAflu z3Sgtv%;1X)@t;73k95i6bvw2{dkVa@k-&$Dv5+jScxbpYD*6U%lpuZhx4Zg!ANoUA zLkHn7;p(t+60HDJ+G`j;ga?VeD7Tu?iTWiDguzf&OHcs73gWi|esnXJwyx&rrup9|kl6F#E-XUzAaB1~se;S|%H*HP?Ueb3QmCFYsU*2;{cYV6 z47R;IJxuhzXgNLNs3~X>I32Y?>(btyn};qquV1l2I%Wr^lHh4+(WK}#9z|Y610QAj zY?tY&GoH6k`aQ=k5k{_#5Fg7J6Wov0MkS&RlF#V(zz)9SzxQvHwZYc-*X;M8W{r5T zH!ZISx9%E=w!;zZCu|LpW29o_B02wYAv?7C5+}W-O`Et|3zAT^+3&tWnA(*f;5Bih z7^e>SQ1^j3_~P2mI~szik0Om-t*FA{CBuQZF)W=#?DRx=Zi$XY@jI>m^e)2etrFLQ$HGVV&i8H9JL>O0uF}<(@Oa| z;vsKdVwj7tY(Ne$7fkF@aQ_ver~bj5>1&jptsI|EFe?}B1)kUV?(wZ&z=1*mJ4S3k zgb~Ruq2&kUD|g$p*Zhid?*(cU{0M$=%?xe{2_}eto<86{Q~j~20lDi7JzIJDfe%;H zZ+g$elxH2pzed>9gH}B(=%t4&zk4b(-hNTXX|$khEU9?K<(FZdQ#cf}2Z@nxyN|AM z+L$)j7~=h)rNAxw<-YS%)Z{vYBR!)?Z*&{mO;vWMU=2; zXc)3wHHYo^UzvXH4p)IQSJncLcw#5E`>pKu#xKA~+y5nXN(5+qI#7$d3-`X8a78=_ zAss=js9PxSj{W2}n_`0AOm(jjS&q)u+UfDz;n;m_DtXdN^zSpO+YJe$3%JSMq`hr* z!XbtLIhfDA>jB&TtT7{H3Bfy+(wS$zu%umxkU&~J3}n(r_v?E7OXr4JawyN7WGHzI zmm>-|u@~Bq03rG{C{AR`gp`0v_T$l$RzzeXKPyVz)oMSX~MF0R7$d>8E|>7`BCOB}L2R^6X8{`F9ONft)tP17IAO zAAkBSDe=G$>%j$RQO;~hsrxF}BI)dE{?3ggfRfuzgI=EZh!)RiAoTux2*U=C1SXh1 zJr{mh^6>Z_16`gsm*?cf5(VJ<(#jw7xqb?_9+bM#-n}c0j!_eK>UJx8M+{mS?Q9nn zS#%$ZTHjH99O+d8%?2qe=S(?Gm_B9h6DF9R?}{TUQu6r+`+)EJ?z#%k3YnII4m4jI z5pLIsys7=2a9mAJfK$*>tU-zd*hu@ zAEQn{^?M{RjJnP7L%3Fj(1f7kdIGM_I+}-d+nq)VzU6v8F+RjFj!O5O}oMpFSsWkGb1x2N)Get?V^lJcVewpAf# zq`*j+)v##uOh0&!CboyqQ$80RI>uT!d*8SoKhAW0GAH1$S=TCN?g0C4E$-2GKi9Ee z2ZO#)Km)(R0IfcvB_YT8_%iPUJkMMpe}xt#OX100u7nyZE9g$})6mwNXLQzb_^l=J z3@Zc~g6u@xGuc)X99w9e^Ic73SkJ477J)s%*p3K|Jj$<-JUdo@=aBCot9+5j1_L+Z zJelu#Duv^Ye=$v^$GC=-)s&|^jKI*1-^l-~gA;B)3G6zMGup7kpIhX5XrvjdH1(~9 zYNt28jcmI0VdgNXEA{~#dg^Pvoe()s!8Ve?vH}leS>0f*yc^%(CMPo+W48E9z}AWc ztoGU~*iiv+hYZpanui!y$z;XbM9wwF309zs+fEuuHGg+xpPkO(`F|%ulIhSt4|U6} z5t}T-l>4!7=$ZWXRG*Y#w#U%8R03b`@4^?y>TE1QPbBazeOx+j4CMU$7~2g|!vZ&o zO7Ax_%aN*P04cOj?mLbn9sX7cP1fckiV$u5j+y^d*m|#>wIAyX!hr3X^E8i5Q8e7wtmI*vSbZC6~+3c@0eZpb= zsefn^r^)n-$!Y?F`a#0+Q+qPMB7BGMoxX~a1(I8e!x3cZx_rY4MlVwMXn{4?Yt*Ma z60By_+@s4`)rB;iY+%4ndkSVucM-9D&$-C@%^IZsV8_W`(5`vQDAsat2ss-%Sq^^ zj1?#phWG8m%)`A_nqIr|h@5$E{l{Pf`Yipobgv_wZ5*NlLsZv?%V%LNyAJuRX=v;-#a zZkz_p)CF(VLeOw!-qh?5GE_IgEgm`LvP6WR$u=D1IiKkMtmX+EMQ>;jXfQBp;8?@h z=U4okoe2X-IyP(a-%>X9uF0#@VF$pc>c(=`wjG?*7rz2;s~y(R=gmPoriX*8n%6W2 z92sdF+Y!)orfIQ1o+W<&^oS{Qs1SN; zr=8}vvdDtnlP@Akw;zs>Th^3@@e`yd2l0%Q4bQs_nEU5nwiR>F_Wl%3J@dQB@&EjG zUlGOjvnk-G`fWW;Ujo?-*ksq@(}OeJAUX=eBe&lSXYN@ z96hbNxc>2B4b9gd(~U+bq^rw>8>0cuhyM(sloR<2je2UjnurbGS2RB*P5zzO5vO5?2ZrvB~|G}<%xZ0-$$OyT7#Q!bsNZ>1v;eGk*{*T zMS>2A*tlZ+kit*9W2n>~#rJH*<&)_3G1z7YYVymgKQ1GoRw|sarr%lcpn_RSWUG-L z*};;FrdX|vDP8=IE0sZGa;&_?zdcOC{f@2-oZ`x{1EY2=1a@B=VPI0%H}LP#`OKUv zus|X;B8ish`+0e>9yFo{n&ZkBd-SO|k0Q>=O}nmbWvmD#79xoGj2W`YRpUbA9Q*R5 zrG_M}A6R^^-WQ!P)2bj-DzR#-^yB9I1)gVgD`+Z+)Jf5AkDFZ3B)lX&5vi8w+7Ha%ZlrcjXaNBYqTzMZc`DdKa#wbPD z&I)T}I9aiL24k~;c}D{DsT$&vek^E>!Pt{YRq@!Ad+)MI-v%%S`CCaP0E>pE$Q5t~ z%MsT6tjR5$T9+&xnf=%seI+`2bPe+C)+`xe;l2CM-95$HFU^8)(%Li^10=hb*FI?- zVX1hwl*iddnt}}0gvHqLkBwqaqHsO0_Wzby10-kf#^((DGV7myN`ahR+1Ou66L3FE z7L#PT&kp0xqOJ3{9&P}qLq+$k3cHV=pU&}^J$YVsVXC@hC=e3+kbXW~yB-%Se`*43VfOoWaW1Mg%31SWzxy?3%JqA5Is6}(T&xC~H&@>@P{jM_Z@gP-3 zfs-5!mI-1uaD1y#FRdjB$lQbnAGZ&_^dNd-&vuOVeTF-z_J*))h(Yg2`_F+@h)-k7V*Ftt4;4U&a8hoB*eDczFU`+pS2$_niR?dV} z(lc+WikpTFbaT{d^KqBMub13{xXi7WX6<37*Miq-=EkuMt0eSK*~$GSK6q`?RsnuuFY&-fd>rvX9+J ze+SIW@Eg=c`&^pDq0=z%t4_T`4SK&!`B354cCehfpeMi!&U#IY>$NK&&mKT#*?#tp z`lHDH&+!IwQ~~CRqkB;b0@9bM3`p0iS8fo|hN> zYxf7lEsf7oS*m~sIU<$ea2--D4i9?N)u1;fohmFmQtFguJ~;mHgfA}pSI20be9>;ZqUS~Uj3V)FOn_J4rV5kQ6HMqf#pR8+jghXe-dv3+J=G* za{ne`ex(I-mU>gP=*W1Wc8ilu@eJ7Tz!_$Cq+ABdYXvn_2j@Qi3~m!-M}4Y#gg6}d_LIwm@{B4xKtnssh%42>UV zQP0IAXIm3Y-;N@N6-R~y1!bg1dkRFzKHTSTJ>eNS^8X}-h9yWoVJM(iOm5NqFxBZG zPJCX=rS)cxn1%b6!ZP0C<26K|URm-I<#g$wWv6MdTKyZA2;YqYyguGHeYFUPTRL*U0BOr3KY24a{4_(1 zcJq1AuI+p0O}^aXqzi9i=FSk$>NzuE>~)ac;Sm1!1+4Jp&J-M)*! zpglw3ym`BHZ@PyqT$)GI)$rB~@_1A-+Hj=emu%0+>~CBnp>73qAD#kSdB;5YUSB}x zD?k1l{1Y-7m)hvT8pcC5EsR)){4?N%h->J1+!3NbpJg>xHQA9;2r$fh-Gv1SD|Oe5b%#7kyD9jnrbK3ElE$*5XHVf-C@NS#uc{1B-% zdDcPbY)bN9nn_vb0kE|G`1IxyEigwg<*O20&_y6$vCtRy{gq&W zynHL8V`DMCkD2^jvFOIGfQjd-vkO*W^v@HCt~L<#Ux0;vU|+hu)^9zj<;Xm}3s_%P zSz#4*6XuG{iyeOYw3~>@>I-SJu7xq@p(eNt=!G@ZBNrP@ofEO@ctIQ@>^U)zLnGs` z8FM8*VM)6^gTF<+SF9REtCj~cuUI`LQ&_q4KB$11Usmaqz3#mm$Pz1pez^`X#nIB* zpjoPYwethXs7V^1oCm1NrE@SJsn%YK6v_-_nZB}p`z?ftkb5`tOW)i%H~3P~_;vj- zIOu24la999q(FYjvh|dlg<^}*GSyy|R=AJq(&eWxyB&)N9h66xDaWsortDwP_XQB~*>ca1+}aiveW z0yC>S*+^<1^?tX)*cTj+NfXee?(5xLR?u5&MBqC8W%c&*m@&{)c$66vWW)y+Dp}&I z&^Is#3AP{I=)yoz=)%_)UwQo59^AwwRIEey5GR%|dY+b8X_=_#e$gU3_5)N~QtM8D+rZ zf)#;HHWs#V;nbzeh^d%-t8Pvf{x z2*$QxeQU|)(}wzQ7qAq-j+Ytm-;s#*OAeO*nlw@y-p{Jy_;oQX3b^NB5B+F-A&!7w4e%Kd>PPh#!s za}wh7pU~5QN++Pc3&$KI9{bD!CFPiez$W%0i2L(y~(L;{#`k!-f$SvL$8d z!M;#sN)1S@2A05xS}A*+1H+*MR#&_=L|gNqQ_!e;^5VYHD}u%SdYuhvQyTz_58dO8 zS^B!R1b8moKNzXS0gtG&pzMnq+1M#GaY&o*#sq zQ{Q2UKc9^i;4?Y40grKHuRy}zRtW_c2uy^L9vXrWCg=P8*noH5Y*f8jU1zS#o#mfm zQ4abLsps9A4r0N^4jv62P>adPik9&2tWWx<59<~=-7HXq*Z=k%^!h!7VI|x8Q157B z7loL1%N02LA0ztW+>vZ%_MyMycUPDJMls#YQmWWA#h$8-5H82%w&t@%*iEsv>j<(P zLpwIZ4fI1*w=G4MKht=gi~)e4a(o=is^>0T;j-68^-*76CdHu9%li zqVKiiIv<~tnw67)=gvhAQQ$Jz=x(in^Mn`pl7CvA7~8acEY6;%;9mvSx?;B^IGvjL zo>&q5^S`pN)yBw`@AVQczFu@8({$4x2z?zr#)TZ zrKDkgj|i)Lb%W5DVR3P;jW;l#zK&s`UNtQ&>2|hv4k*)L7J{Xj9XXfWJ9Q3QyM#lA zVDe5{Zhf^3++H>Rd#(nO!k$01l5lt5r`$*!+gn7CbMs(`*`T6Ho5e;Mhx}IHAW!|e zgF~zv&Ca@D1RD0}xtE7U7h<{hZy7b2!1g8Uc{s*Eg>?4XcidMkZqO26U?W<%)@_LR zO&kkk{f}AMrHy@?Y_&F!Ny|6;?tx=P{m>)bhI+)yLYw|7Its0gXF!Dsr|X9pO(V)i z5>s{**50MVJ9ol`o^YRx^a2QEMPEBnrhjwnj({3rT5@S2!Cr%U;TZi*kjeY`^Fgyn z7Vb$|ysoX}zTj^%u?iHrqKxA9n0E@FO@%!=q#Hj^?uGO@x#LtJqYOkEl$P%=HGZM= z`dUmCSqRGl8P!#!gyppSX_CB2U0T*WyB6d|%)Z;=?#CqEY-+Xu8~Mni&3TBA?TQeV|HZx zZ79@;Mie{r0I*=by^naZ)@l{R0Ca^*N85j`-RYwkMM&r)m(-d#^)83zOoE#T_Z3Y- zAS0oe_BR32;31eH9oHo1i=|%tS{EiGX|QD2dQ#ins8E!CAVi2*s*tb<@ITL^O5*p@ z!coWFd|ZD4L~Ba%+1KA^_#2WtHzXv{KBBft%56N%7u}6zrCLJbpD^+p2 zL2F37OP3Vkt1UMLEV?H!CuuYC=b?_*GV@;*9qUx^gUw+>TN34_cV1uX#%x1x$TX0H zVOe^)K^YD35xld@`MR~w8Eh0P#;eSc6gv!N$!N{ibJyi`?Y)F9V`y}+75==#NY_n_ zvb;jllmYTEjUm8jl4L(S^Qw#awYc9V7jxyKSqCQhI{$Yx8it8gjmKh&h!)qP0A<-f zn?2`$6wh*vYRQV+KL?au>+9GT9=26MvR%(?@e*urKPFYE!O`D;%T37@$<>;})Xt`1 zZnim})Y?WINJ-~@tK504k@aCy1| zBwR=s`ddct|2FtAfpL2?on+rWP-tA^lX{=oh!6Z6=U%(_O30UfT<_|;oW zqUW1bE1TorJ+V_WVK(Q(r^cP~uV!T;F1*W70}F8&{WS7noxhinihLfU&jr(28PK?O z{RI=*{6nMlNB~9YBZt{B8zTbO%+4SGZ0X>GUxQ}V=58{MzMvur>Zsf%R?4*jH09?~DQD_tJj&SWl0b4|kxK;r^4P^i0jyfyCn4-0Kd1 zUaPf|YkB|f&j32b!VbyvOFB<`{fBwg=g?uaN(L&{K*X6ZraVmpeBABxge$;WyOi)+ z)A}R8S?Yim9$B!8hHPj<&L?_PZ5X;ph>;)N=il!^=sFgt;Y_QqA26eXz2m8-uMcIY zcrP4$p}sPYknv7@g)vKF8D9!2H&{O$=%PqS`BojAzq#@!x?inGhDkoVox+~FN{WM7 zKxcf1oRFoBdgmROuP-!sTfzbcqMOPRwI-ZNCCUT`d1hCllrm3po&y@OVn;?#w1A>l zKxb95FXG44e8t62!*=PD$fKXh%Ci4fJ9)B*9dpyk#c2FX!HxuOW_$PI@Y<}&*hB2( ztaopsx>GI>tlDvSLstHE)V!d_ma7x2j3}K#Fvbf0+rvI#cNX$ z=`|Lah5^5;YwnY{f0ruFTQNuQS}KX-G+o3wq{AP@-4g2eG!ZQxZ_@Vh@mJh){Ggu^ zNW`*<33SCPTmpX7@!DM!F<37uVVd2R`Q74*D5QP# zE!uPBmNlx?1#{J8Zygj5-<7_z=hPMvVWW=Ramt@f(-I`XPERoJf2Zqwrx<&5smzco zF$`B^&{d}E*i_eaI99Z$VLX&55t5=0iF;qRCMbH>38wJJ0hk;px3Rs=*sljl}ZCR|1tCN z$VjSH;znAut2qcuOtk}t%1rUi((}bmjXR`!8~l+!kzg)$LbQmBa%Msf>@ZZYV)nAW z^kje1syX&WWBaG1VnSw)Vu;%B$j48{Qd@+N-we}>v}QX=s#0xhV=&Sc_vB!*-oEpp>m`S^I88{CxD zov^#HMV9#6XA|D@a_j^Wncom1r0?Ad)5B(g!_(NJj}&kZXmWWnuz+o`+QNjA#hX$& zqFbhrSospIY|A5lsH(nGBnn(cRspI{xERo{+a z^2M+3(_BcBxts8OsWf3)mY2o_-k-JZALPs_z2-_(widqZCyk3-HV7Hc<~JWU%R4Pq zuge>c>?n`kB#bpysUv-G34v8<2;}cq4}8f-Qjm=+^?x>U$s9T#Au?7+X<&#WdH#eK z@jd%N^J6AE?i1tfElL7#u3O3SgFb^7ScejPaqTwD<0UHt^ZXG=E|^JRjjIQ5TszJY z1>q-x?Z0|~(1!|qw;510Ek6%+0y?>;adEJ9+cY|ECq$1!(6-medO z7jlK)>f^`23YJVLq|tmg_{t5qsOuUkPDEK&QtZizIX4cWm&zc6Izt@AZSdD9)h%g( zKiVioz=$7a8xQ1aruk~&9m-G`nY7oMp9ETjDnU)CeY^KK{UA@pW_N$H@R9ufB;?wT zDV1PS1+PcYk9lrsYFDK}wM}*YO$LEjO`qk8lH-I^1=Q(vrTl(tG-og|3Y2g%aDUv+ z{B^#o(?oOS|8K9v%Q@3M_aI6S!*KSS)m&UQ0h$V_vzU#1Bgm{gpkNCu%FBe3iWXNs z4A%Ais55xR?DhMN+$bF|?_WU8`H;kHVCh+=XItUocW30T&aL_{>vofF`!8B27qBZx zOeEZSfILIK#t)dWtbD2jltbB)rt-S*a-$sfqyut!-ViL-R?SE8p5nl|%^96@2l4R^w8Bw7r1 zZMzGH*W{YRqDe3nSYdp~`oJDnBqZc2%ET&^zAWTv&(*`q6w6g0rA@e4&T~r9A9b&K z2-c`xFm%uuF$%<7gd;(sfF~6UW(fk!IMc)K?x>M=k&_EQ*On23`aUjT&SWQ&_5R#A z{JzXs`gZHZ*UP`HlTW#+T6nj4@$|hHGHP4C=vEx~fWC1?gR^Uptd{9P6fKxrd1jl} zLXxG9`Dy2qEICpM}QrgxCL&p_&Kn2p1@NN3Ni5hxkws)z_vB2DUb|OiB;rFZ+SAgM4C4~7o z?;>E*I$fh{rYT_(f)V#AclR;~tcQw7^p`@EY+x4_JPt<4FQ1rgM*DR-G8(blt!0d< z^Lj)@mWZ;8ua?(5nqx4A&6D-7c3O;HbWF(5Uf+*<=)LGyH@}1QOQBIlBA~WgW7!r3 zwkil7S+Ce^11$xTg{*Vf&S84slNR_oXFCaUWcuDA#B98+VZLB(>$mE!>U`AfYw$Pk zn0$L!sfH_+N7%u)UD*K$*&m3vK`u+RF`w&|QoUGhL`$uVtWSTiThA_s`*=2x&~T+PHUt{Kkn#Z$v@s&Eo;sfTM4uwEo9qT zeA(`?)g^^)q(EcIDT{2%)jd7Mfl*iN=jv$JSN@7(q?(Y(K^Mu|4|+VhOYOsf)bVJzVDoZOYDxYnII z_B4Xdwk&W@bhG|JE^OK#@cJ4eHj@-Q9Qx|z9D%7m7=NPa*EO{A3bR9s82 zc!BTDFf3>T?dgNjzF~U)@blR>D`I8cf4`Pr#lfsB-0$g9pO2;uB{7^7iOl7@`CSQ$ zLRfH$qP35lL!&<}@GUXYT)_Ee6jHCmSR5L1ad8I=Wz02NHQ|yABA}jHwOv6?Z~%cA z*|U#_)TZR0@SMy)GlK$tC(s+`PWC$(uDk-_0vn2R`LAM!!hX}*PCfw62xsWo%fU}_*|^^tVoFzS1eYc z-7vaXc5jZVzkq&Q*V7lA^z_nYW1|(CSI(`%FAfvkeWK`D_L$V&*XA0-McS97A)iz;pr3j^1% znyr`e>XK~5nS`NVAZyVPJl%IWT*iLjxE`y*;vs)O>1W_q%jc%cI9v-RY^ocipPD${ z$>X$}OH+82gNngn&TfjC?F6z-dNQayoX#T|2MpDJ^11u+p)W292AbTh=?|zNBc7fN z7&n$7t5heUXq&^p;eh;?vrs)ZK)Jccs7ab}UV42w3K%9z8|G@4Fy-IuD6(OgA@dp- zS2oJT0Nz{2%*J}Wswv&< zJwlP7lP|<`n5&N-D*tr9CMdE42OlfozagwKZ%-siy7+$PJi4}uH>s7cdD}IePon%_?)s0t@v=|5eng=f$2f|(v%_*N9R#Y>!Q2D^r28YEh4&fCa92ICaW`U&{? zs1ubDQ49iB0l(-%+@*%KuTGgZ{4tpC-dRR;h~l z+A_gf3h%ZCy>5I)V~OQl9L5lP?+pW4ddzj7yQIPax+P+EOlo}tC&H);n*h{8`jzZp z%7uUB21!w8Px3!z*F)dlB7<3^lBU>#{Vxk~SysdD&-$nFX}%VVTJjku_^3D?+{JIJ z96n`SngH1s4^qYarw(B~XxEY?+6a>vQeEdh(Eo1Q8sZZwl+z#EUs6SCbnzB+0J~5S zFhEXb7sZqXj1?bBpXd7O1V%~ddcQpVmHUAP?fbj#yK{yISl3U83hWY}G8X(nIMHzc zbhVTv;l~#%Pc}hGGWe(B%<~t+>^x!uX0NN@rs*MC$tJhoZCM>_eaR}_r&WQ}q(lz#FTY3@`!r%|e<#wjw z6j=a$p|~32y(XvZaaF4NZ9cHZb0GqDk%^&JL`s*CfO|5`lBcqJp|CyZT`D-}XPv_k z(U=I@fO}v4Jwe3vM5r;+;fEE>LiVp6=y!c6Y#VCP+OB8*78l+{FF|~iqHVvPMuXkQ zp_Z&i3F`Q-5_1BtQj?OP7}n=yee_Np?1hBfRaD`q|vtSp3xLIx!_UqkXoEJVys?6*(}M zxhk$gYrK(BYafnA=Za>9j6X)y{D2wuZSse6j|0eYJpxnf@BElCe)_E$*ZFyNa=;M% z-FNcQHIcBZ&(B>;jQ8!A>@vSczPp~eq9M;e&pd3@!r0>DhD8G`QS5P z!_uw0A6vJ3oW!Rn5?nZdbkF z_L|l6xbxNz2+z_zt{e;!jPbdz zuOYcL`I(F0{LZD@6m-TWL#pW1zH1N8TQg4u!d@eELRit2Ta6#-qk0k0=o~Of|M)CM zQ}@hVH>iZs#p>?oj?6WuG2+GLVL@BGXG4U#a+|2Ihk#QEwMF2-Q}w^z5@QE`+y%g_ z@qiVIpj{I=rUY{W24EgO*IE?1Y5GJ|1dWy{S+=v==TGIsAGLO3LY@znDZe4QsOX(i zhE;JJqAhv9$JcMssq1>}uiOx3AG`(HL22Vcu+tABk2Ev_|a)+ zgdo6IJd0FE!`8B*4@FimF!OOLIHivnZpUtPj6x~Smj`r;ZUQJA>_Xox4P%~URPn`n zm5%Qh5)SO?wcI_t=K;^W@WdTQl99jeK1Jn=OB#a*(zo>GF@Jsi49%w+_0o}Xb1F)b z=ch5m(nwmN7`-L*qYPiIHzN}hiM&C}{1O&U{0r%w91By*?4lDpmO9%#DB;OW3eZ8B z8E0U2ywSK<3HfK!2>OF!nC}lf@q&p?@1MaWz_HhjykK(=50QRuQZ|Y7U&yA6{Xegp zBcE`iwkU8&*&3|6K+hMQpji|ulVH>F*3m*2*a3d8sE*`#gv5PxvwOY*efZcfZz0qI zmbzVYU5)&lZ*@GtRbX~lbSVNja8#EUVp9&=J>L`o@y6*x_=Z`YN-Nbg`NZp;awdsG&gJ1f0vNy@V2u$+H|8@7 zdfIb+d*+ZZ4s`JyD(gZz`}F(q(g$(6ze95k?-OgYWeo<&8IzMvMJic!t3x4O*2@_h zTcH`tjG)cKMjt3VTadr~zBYm0e3?_(+8Iut3nU?fQ`6?7%wJtg4nJuav z-8qE|^J=_af3<+guV;{>^9^GU8F+_fPJozvdbjoH8$C9&zNv90q5x=r26dzLs^)15 zj9#o0QQKVc{7Xn%F2c!8jljz>4wCU!_Xj&sP{tH{n!=ZWI;N2{ z&rgX6Q%L#@f4#;v#;}e!KWgH9_ntx9ZZmWL$80j-4H_dyAC6{A=^a_g@Y38-_c`e?PIzzc3? zq)-UIE1L3n>jyS>O5Mtc>c%2e$@&3qxYDWKz7RfS+KGxo1|@FB&QK@T#>AWY4RbHi zw6}ZcgT23IKZE305ZPnC@md!v+@lQZW<+c*)YLa2#X-D7^$g{Kl0zXUPX}zu_kVWR z!iO_X$T&O#I-n_kR0fx=eA?v6AO{nZRn^+gL8+Ym`;C7D7XY(2&q&N!Q)iIBCV@=$ zIk#nF@*q{a*jKC9qSHdjOU?p=3-|~WWRlbvL@O&Iuuq$x34eElsvDi~ea5^m1+{ML zrsj_KOTLR0fMm7=SmL+9ZQ+zb?OWS)m-Y$&Eth^E+UQkVWJF4xWm>^s&6x8?Pl`wf z%B%U6?D72^*BIqpJq&{mnkji`vy2AEwWt?3k4i0>yJY{_W=$BtiCB(|~u_OF|aigCVs1sga*r`NH`A)V4W)8eHA8Ii?C)i)= zx@sXUNZpagYP>!KTf^|*w+a3pM}D{ zpbwo*18drx?=NoJ9;XYwzM$O7w9Gdel2oO^-0++P=Ah z5N$>KG!HYYT1otxuK<;)y_pD*-S;kz9k|AssZ+7QifgD9A!OFII5NP8vD80S;5&do=+?*LDIIee#?1l;Tzw{3uJW8@gKHxm*u@ui zH_fv&lHTNEIqv~48dpIZdJlK8)#tF3Of&7u zzZ-R)b#C?kf=#VYj>R@kDXI4K{Fm{fE3a3N4cT=Bs}uyCB8V3XyR3cMLhVR@jXLpp z2hW?GHQq~-!pkkH$WYPCf6E3&?n)B60}V0wfE!cx-TfXbA%6y8!P~`pe$9tiiYBSR z@hFsAd3wP4+E$`ftBy+35j#>EPFk(E@j7{MIOXs61WP(X|hKnIP4&AD-dNS44u< z#iRzS$Q~4oFhs+t4eIC4UMRp~;%5UTPY;|BPs`j;jq2=1w}=55CNf{(VvV!-^~V-g z`!WB+a(GcDY??#t9vpbaxECHTcIv%)YLEf{$GD+?9R|XsAc`m~xH0tPrSpNYJy!c9 zUp?^QiS0=bR4^RNP(Sn?nSPkv63f)GSw~C^K!?u=Td}KDx0Vmi zlyh(4^S`)2sLoqfsrE^9*)+hsNs%Cqbo9p62}VxY`w;R|%5modAZMiiJ7&EDmX-;W zF{|&IE%ukXpMf`=lnIB{KgVle8I6OS8!)Eg3e8Kf9ASB*ifdk_3wi?h#Btib&QWpg;C zUmfCX37iL2frr4TZ9hbkk0T=c#mTCK$3d2w^1&pS0_TtFVWer1>!%AdWKW9`p!O^0 z=n4>JKMdRsRvaBR0P_eFO_!OP<$+fVz&GRj=`M|!)iW6C8&tC9=UmY3a^nuJ?PZMt z1~tRDBm`m6ro!j?DY58J17FEv*QP4tpIXSkbtFBZ8BaE0O9&o)a5VyO-64U4=A+IW zM=o9zF@+i4cT>=#kpT=R*9gYyWjnF|bnUCjg5QAM%P_ZbN%Sd_NfxcgfaK%M)n;n~ z9Vcuf$cSXal4Ru2yxOE5jfKGIH5N#gGO z%8JRmLu0Q)5r8FV4J=TbC5M{Npe85WQ?Dkgan0$^rbtl1%u+}m9%qMm^RM_He_LC} z%N+`V7Ouev8lrIg$h4#??Z7?75Gfle6$~0_fS_jOI0OypYbcgp%CeR?{XxfhqS?6qmFDDI`obnp;N7V zNEvocfN1)>(Fo?DK2>KR+XkA~BMw~|q|w4={8o6mt@tX6KmHqbWYaJrKWyO1&M6UNRFrPi2h%cfrXj6J z0MV>u-A|dQc8ucGwd9?bX>qPUa4*4gg+T5;8jRu#ZR1tIAM7sP5o?H=b`~e>HA;I{ z5eZ!4EOGPnP!Lf0Xv)Cjf?j31+iWl?ntL$(^VYSO$B_-mT=Hu3d({s?IZ8O34sVqd zX;SK?A)v!C^B9%~kIGeGPQwGog-+PS{5q5)H)VHU-VqLR%7><-De;8)ogEZi&bE;E zccHk}`?@WADS0qBxFaEw0X(iwZDz_c}UDwwR%W17duc4gEPwlE}iLE^!)WJ1Ai!e_X?Ai4hLcFG*l$)|0`4f003%t^hXTqZ%^ zUl-tN-^Gyz^LECH{WM^?mx}2=z1IU1@&`Dyip%49mgmRF6~CM~ON#vMRoa|MI1lS3 z{EJv1gg%)TRq)dgV4%u7r|)Jt%1Ty;pdbk}@?dBs5LwOHAL13cu=$~0Olaq}_v|4nfHBD=YFaLE))|nyFM-nhd{#BAu zus##73Rb%@g)9zm1j+in3#F??wEi-%aq;Uhe+jMjaARB$?%8*vnbxyAn5s|V5Qjp+ z=HfHVEa&@)j@;La{cZcC^V3zzF2%GHQ-M7>S8D%n)kDGhF^&^K_KUX$p$XN5P7><@ zS2i-PW-^-nzH225F>K1&J9@7;Ykx_@_{xxbQjo)bHR>huStfGK_ThD9)<{4V&P$Sr z8OE(V86=3K*C*J!Hp^Q^a)cG)@-(w~AMr8sElpagdp~+LS}ab;N_)8mX^aS52Qmu$ z>0;GHbO^Ley`YzBe$y{FbvhZRqdBygv;S)4M~M*PKvyj{ z{+=5BpzAZYP`^vXtl9y)^s!~!D&1s&r>tV#a)-oh7T#w^Wl&cUDQWU8uc?aDHIpqZ zc_q2O%oMxV8PF2m`c9O01Nt?I994v}V`|AXxRqU&Y&t7N+}w3b~9~TAHjg zyzBf<1B<3ITh_+>S-HtW+Xfc|q-K8~w=?1x@k=HpVIWB&pN$uj(-OWy#48kgg{4L( z4irV}Ex{))Erpd1CN2~Q?RhEO=>+guL*TsA%!#Hcwac0y9wIUvF-E3n6JMfxh-6N_ za=mo-z@OgYy9V7;S+|nZsb(IJ;l@20c8GF=ee8+im@_sO8rHfa1aih7J=uCDj?$Fh zT6!1$7VWfwS!lw=DR`!@k*arnFz=XMY~LIu7EYV@jatUPW&k4c^tOA;cD%^sh0qWB z@S`_%{soDbRw^u{H`D53^rA5BjhdwI;$MTL42xT?B0>b<6omcyKGSNo#?pDyVy5+@ zaWU3ECgo}s`jl;}Lyv*f^H}OjK0SBcJz%$lnfKUk$aTpbnQCpYY+JQ@82v+tavV1G z7#C*EJGM);Iogmqy~LBu)d)f0=gmoe``M=Vm$144Z${%}K*<~G>QjAf45V*UV;%fV zcOC>{=k*=Pv03u2)GCs?X-Rr8W(sDUnzC{(GSU7X??e`@!8XR0l**aY>*}Nf_bT=q zK%2uAzMpe(e#@stPw@2fGjUYKZx;2&G;J#F?EPO@V>QEMxzK9VtE@Y9ihWbX0u?DR}Ei0 zfD2ZpN;YUFI27icg|5X8EA~oh*d7-wd!T2hiUylTFJ;^M5exze(xr%69e%*EWN4Wz zLB=s@mY9ot#*R5J?7W0aS*rRQyPZ)iVf!;&uy%4*FWLFmUwYpe$GRpz=FCN9s~J7R zR*urKRN0)&)60~I6TqmkPn1R<;Nm3^*c-WvtCRN~yX7R+@eb;>J1V{pIkIWIn$CA? z-XZwT_M$p4InKH~kE*+0&?x<>5GQ*8`?>*T!R1u`M|Y;$c#+kXwF7nc(;hC;`YXC# zTCI?{RCv#&pRTjVE04K`} zJ2^|C%Hj=W#VgSFk-p~-b8h_@l->Co zWAVia8K^h?yJts=g4Lav@<*ropkk`<&1QMr1kdCP>P>ODD9=v>+jp1_m;H~sdndx8 zQ)#sRxNeYx(TiEsMI%Gf=$RSi=uP#Fvaa!P(b@zHZxybnR3(?Xe+vy;-$)#WD_$<4 zF8z4FC`_UJ!7pl7BIXOlObUK_(=*6o1{p~CtgRmsx4>f(cN%v!T<~VbkTaUpBM`{& z)d{n643l!>Ac}ye1?tT0sPUX~c&ElVq67ZAldPtgx)s8~I2mdqyjH_$yO$^`-t~~* zW$NnpM9Cjj-IT9bA+XQe8YKs&Ygu?+bup@VQTPWxV*#hjNww}|Qf@_pIxA9GVWYCZ zgRWi)n@7@*!$arJ&(R$=ab~X4;+ttBmhoaD$Lb4ImI^=h{!yCsvVSGBaISk}2EiMK zV}O{${xDbd2alr?%Xg7fO4Nv1(PGXLLh%P}Lfbq)aBkY8MCj}`svcD#` zGP+JtbZY$NOUD|b3DoDkx@m6X6~Dk5_@TcVh!bYqn#9oHA0o(dNoQ2f_8Hwem@kdU za`R+N0^@7B5xdRTzle=uN_;efzOR|gw|@j`_-YZl72$uuC5kKul3TUNb%*@%P3O6N zq&&XKj(@Hro2rVpeBO*&(1?Ij6I36DDeW34k#VPI>9FlrZOJZB78X0u6s{;2s`!W? ziKzLl|2Yff9Y*Q{?9hHWlto&=!`Jm4ITimMp2`Uh?MF%Q0GvsVfLp}9HSL9}2(7S& z{)|}~`G*;|=Y&=YPY>s4ZwO7HWqsw^b1HJ$#M9aetSb=`cXuBnDcQVAgH(n~U3_rY z|B-dKTdio&<-F-7ZjDNiw1!z86gCBb%`$Bt8uZSo|IW@7mfY#r9sby5+*-4Oq@u(! zT~qFs*Z76%ZOg&*?_j`6-sx=Nm){vw?7)VNN;>1|n|C$Q%-#pVg;?|g_CJh846zTZ z+%#&GDDmf2j`wB7gch=f8P7g<9}`m;(q~_?Ld. Portions created by David A. Hinds. + + This file was modified to support the Flarion Flash OFDM NIC Device + by Wai Chan (w.chan@flarion.com). + + Port for kernel 2.6 created by Patrik Ostrihon (patrik.ostrihon@pwc.sk) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - + Suite 330, Boston, MA 02111-1307, USA. +-----------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//#include // Slavius 21.10.2009 removed from kernel +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "ft1000_cs.h" // Slavius 21.10.2009 because CS_SUCCESS constant is missing due to removed pcmcia/version.h + +/*====================================================================*/ + +/* Module parameters */ + +#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i") + +MODULE_AUTHOR("Wai Chan"); +MODULE_DESCRIPTION("FT1000 PCMCIA driver"); +MODULE_LICENSE("GPL"); + +/* Newer, simpler way of listing specific interrupts */ + +/* The old way: bit map of interrupts to choose from */ +/* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */ + +/* + All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If + you do not define PCMCIA_DEBUG at all, all the debug code will be + left out. If you compile with PCMCIA_DEBUG=0, the debug code will + be present but disabled. +*/ +#ifdef FT_DEBUG +#define DEBUG(n, args...) printk(KERN_DEBUG args) +#else +#define DEBUG(n, args...) +#endif + +/*====================================================================*/ + +struct net_device *init_ft1000_card(int, int, unsigned char *, + void *ft1000_reset, struct pcmcia_device * link, + struct device *fdev); +void stop_ft1000_card(struct net_device *); + +static int ft1000_config(struct pcmcia_device *link); +static void ft1000_release(struct pcmcia_device *link); + +/* + The attach() and detach() entry points are used to create and destroy + "instances" of the driver, where each instance represents everything + needed to manage one actual PCMCIA card. +*/ + +static void ft1000_detach(struct pcmcia_device *link); +static int ft1000_attach(struct pcmcia_device *link); + +typedef struct local_info_t { + struct pcmcia_device *link; + struct net_device *dev; +} local_info_t; + +#define MAX_ASIC_RESET_CNT 10 +#define COR_DEFAULT 0x55 + +/*====================================================================*/ + +static void ft1000_reset(struct pcmcia_device * link) +{ + conf_reg_t reg; + + DEBUG(0, "ft1000_cs:ft1000_reset is called................\n"); + + /* Soft-Reset card */ + reg.Action = CS_WRITE; + reg.Offset = CISREG_COR; + reg.Value = COR_SOFT_RESET; + pcmcia_access_configuration_register(link, ®); + + /* Wait until the card has acknowledged our reset */ + udelay(2); + + /* Restore original COR configuration index */ + /* Need at least 2 write to respond */ + reg.Action = CS_WRITE; + reg.Offset = CISREG_COR; + reg.Value = COR_DEFAULT; + pcmcia_access_configuration_register(link, ®); + + /* Wait until the card has finished restarting */ + udelay(1); + + reg.Action = CS_WRITE; + reg.Offset = CISREG_COR; + reg.Value = COR_DEFAULT; + pcmcia_access_configuration_register(link, ®); + + /* Wait until the card has finished restarting */ + udelay(1); + + reg.Action = CS_WRITE; + reg.Offset = CISREG_COR; + reg.Value = COR_DEFAULT; + pcmcia_access_configuration_register(link, ®); + + /* Wait until the card has finished restarting */ + udelay(1); + +} + +/*====================================================================*/ + +static int get_tuple_first(struct pcmcia_device *link, tuple_t * tuple, + cisparse_t * parse) +{ + int i; + i = pcmcia_get_first_tuple(link, tuple); + if (i != CS_SUCCESS) + return i; + i = pcmcia_get_tuple_data(link, tuple); + if (i != CS_SUCCESS) + return i; + return pcmcia_parse_tuple(tuple, parse); // Slavius 21.10.2009 removed unused link parameter +} + +static int get_tuple_next(struct pcmcia_device *link, tuple_t * tuple, + cisparse_t * parse) +{ + int i; + i = pcmcia_get_next_tuple(link, tuple); + if (i != CS_SUCCESS) + return i; + i = pcmcia_get_tuple_data(link, tuple); + if (i != CS_SUCCESS) + return i; + return pcmcia_parse_tuple(tuple, parse); // Slavius 21.10.2009 removed unused link parameter +} + +/*====================================================================== + + +======================================================================*/ + +static int ft1000_attach(struct pcmcia_device *link) +{ + + local_info_t *local; + + DEBUG(0, "ft1000_cs: ft1000_attach()\n"); + + local = kmalloc(sizeof(local_info_t), GFP_KERNEL); + if (!local) { + return -ENOMEM; + } + memset(local, 0, sizeof(local_info_t)); + local->link = link; + + link->priv = local; + local->dev = NULL; + + link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; + link->irq.IRQInfo1 = IRQ_LEVEL_ID; + link->conf.Attributes = CONF_ENABLE_IRQ; + link->conf.IntType = INT_MEMORY_AND_IO; + link->irq.Handler = NULL; + + return ft1000_config(link); +} /* ft1000_attach */ + +/*====================================================================== + + This deletes a driver "instance". The device is de-registered + with Card Services. If it has been released, all local data + structures are freed. Otherwise, the structures will be freed + when the device is released. + +======================================================================*/ + +static void ft1000_detach(struct pcmcia_device *link) +{ + struct net_device *dev = ((local_info_t *) link->priv)->dev; + + DEBUG(0, "ft1000_cs: ft1000_detach(0x%p)\n", link); + + if (link == NULL) { + DEBUG(0,"ft1000_cs:ft1000_detach: Got a NULL pointer\n"); + return; + } + + if (dev) { + stop_ft1000_card(dev); + } + + ft1000_release(link); + + /* This points to the parent local_info_t struct */ + free_netdev(dev); + +} /* ft1000_detach */ + +/*====================================================================== + + ft1000_config() is scheduled to run after a CARD_INSERTION event + is received, to configure the PCMCIA socket, and to make the + device available to the system. + +======================================================================*/ + +#define CS_CHECK(fn, ret) \ + do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) + +#define CFG_CHECK(fn, ret) \ + last_fn = (fn); if ((last_ret = (ret)) != 0) goto next_entry + +static int ft1000_config(struct pcmcia_device * link) +{ + tuple_t tuple; + cisparse_t parse; + int last_fn, last_ret, i; + u_char buf[64]; + cistpl_lan_node_id_t *node_id; + cistpl_cftable_entry_t dflt = { 0 }; + cistpl_cftable_entry_t *cfg; + unsigned char mac_address[6]; + + DEBUG(0, "ft1000_cs: ft1000_config(0x%p)\n", link); + + /* + This reads the card's CONFIG tuple to find its configuration + registers. + */ +// tuple.DesiredTuple = CISTPL_CONFIG; +// tuple.Attributes = 0; + tuple.TupleData = buf; + tuple.TupleDataMax = sizeof(buf); + tuple.TupleOffset = 0; +// CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); +// CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); +// CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse)); +// link->conf.ConfigBase = parse.config.base; +// link->conf.Present = parse.config.rmask[0]; + + /* + In this loop, we scan the CIS for configuration table entries, + each of which describes a valid card configuration, including + voltage, IO window, memory window, and interrupt settings. + + We make no assumptions about the card to be configured: we use + just the information available in the CIS. In an ideal world, + this would work for any PCMCIA card, but it requires a complete + and accurate CIS. In practice, a driver usually "knows" most of + these things without consulting the CIS, and most client drivers + will only use the CIS to fill in implementation-defined details. + */ + tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; + tuple.Attributes = 0; + CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); + while (1) { + cfg = &(parse.cftable_entry); + CFG_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple)); + CFG_CHECK(ParseTuple, + pcmcia_parse_tuple(&tuple, &parse)); // Slavius 21.10.2009 removed unused link parameter + + if (cfg->flags & CISTPL_CFTABLE_DEFAULT) + dflt = *cfg; + if (cfg->index == 0) + goto next_entry; + link->conf.ConfigIndex = cfg->index; + + /* Do we need to allocate an interrupt? */ + if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) + link->conf.Attributes |= CONF_ENABLE_IRQ; + + /* IO window settings */ + link->io.NumPorts1 = link->io.NumPorts2 = 0; + if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { + cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; + link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; + if (!(io->flags & CISTPL_IO_8BIT)) { + DEBUG(0, "ft1000_cs: IO_DATA_PATH_WIDTH_16\n"); + link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; + } + if (!(io->flags & CISTPL_IO_16BIT)) { + DEBUG(0, "ft1000_cs: IO_DATA_PATH_WIDTH_8\n"); + link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; + } + link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; + link->io.BasePort1 = io->win[0].base; + link->io.NumPorts1 = io->win[0].len; + if (io->nwin > 1) { + link->io.Attributes2 = link->io.Attributes1; + link->io.BasePort2 = io->win[1].base; + link->io.NumPorts2 = io->win[1].len; + } + /* This reserves IO space but doesn't actually enable it */ + pcmcia_request_io(link, &link->io); + } + + break; + + next_entry: + last_ret = pcmcia_get_next_tuple(link, &tuple); + } + if (last_ret != CS_SUCCESS) { + cs_error(link, RequestIO, last_ret); + goto failed; + } + + /* + Allocate an interrupt line. Note that this does not assign a + handler to the interrupt, unless the 'Handler' member of the + irq structure is initialized. + */ + CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); + + /* + This actually configures the PCMCIA socket -- setting up + the I/O windows and the interrupt mapping, and putting the + card and host interface into "Memory and IO" mode. + */ + CS_CHECK(RequestConfiguration, + pcmcia_request_configuration(link, &link->conf)); + + /* Get MAC address from tuples */ + + tuple.Attributes = tuple.TupleOffset = 0; + tuple.TupleData = buf; + tuple.TupleDataMax = sizeof(buf); + + /* Check for a LAN function extension tuple */ + tuple.DesiredTuple = CISTPL_FUNCE; + i = get_tuple_first(link, &tuple, &parse); + while (i == CS_SUCCESS) { + if (parse.funce.type == CISTPL_FUNCE_LAN_NODE_ID) + break; + i = get_tuple_next(link, &tuple, &parse); + } + + if (i == CS_SUCCESS) { + node_id = (cistpl_lan_node_id_t *) parse.funce.data; + if (node_id->nb == 6) { + for (i = 0; i < 6; i++) + mac_address[i] = node_id->id[i]; + } + } + + ((local_info_t *) link->priv)->dev = + init_ft1000_card(link->irq.AssignedIRQ, link->io.BasePort1, + &mac_address[0], ft1000_reset, link, + &handle_to_dev(link)); + + /* + At this point, the dev_node_t structure(s) need to be + initialized and arranged in a linked list at link->dev. + */ + + /* Finally, report what we've done */ + + return 0; + +cs_failed: + cs_error(link, last_fn, last_ret); +failed: + ft1000_release(link); + return -ENODEV; + +} /* ft1000_config */ + +/*====================================================================== + + After a card is removed, ft1000_release() will unregister the + device, and release the PCMCIA configuration. If the device is + still open, this will be postponed until it is closed. + +======================================================================*/ + +static void ft1000_release(struct pcmcia_device * link) +{ + + DEBUG(0, "ft1000_cs: ft1000_release(0x%p)\n", link); + + /* + If the device is currently in use, we won't release until it + is actually closed, because until then, we can't be sure that + no one will try to access the device or its data structures. + */ + + /* Unlink the device chain */ + link->dev_node = NULL; + + /* + In a normal driver, additional code may be needed to release + other kernel data structures associated with this device. + */ + + /* Don't bother checking to see if these succeed or not */ + + pcmcia_disable_device(link); +} /* ft1000_release */ + +/*====================================================================== + + The card status event handler. Mostly, this schedules other + stuff to run after an event is received. + + When a CARD_REMOVAL event is received, we immediately set a + private flag to block future accesses to this device. All the + functions that actually access the device should check this flag + to make sure the card is still present. + +======================================================================*/ + +static int ft1000_suspend(struct pcmcia_device *link) +{ + struct net_device *dev = ((local_info_t *) link->priv)->dev; + + DEBUG(1, "ft1000_cs: ft1000_event(0x%06x)\n", event); + + if (link->open) + netif_device_detach(dev); + return 0; +} + +static int ft1000_resume(struct pcmcia_device *link) +{ +/* struct net_device *dev = link->priv; + */ + return 0; +} + + + +/*====================================================================*/ + +static struct pcmcia_device_id ft1000_ids[] = { + PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x0100), + PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1000), + PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1300), + PCMCIA_DEVICE_NULL, +}; + +MODULE_DEVICE_TABLE(pcmcia, ft1000_ids); + +static struct pcmcia_driver ft1000_cs_driver = { + .owner = THIS_MODULE, + .drv = { + .name = "ft1000_cs", + }, + .probe = ft1000_attach, + .remove = ft1000_detach, + .id_table = ft1000_ids, + .suspend = ft1000_suspend, + .resume = ft1000_resume, +}; + +static int __init init_ft1000_cs(void) +{ + DEBUG(0, "ft1000_cs: loading\n"); + return pcmcia_register_driver(&ft1000_cs_driver); +} + +static void __exit exit_ft1000_cs(void) +{ + DEBUG(0, "ft1000_cs: unloading\n"); + pcmcia_unregister_driver(&ft1000_cs_driver); +} + +module_init(init_ft1000_cs); +module_exit(exit_ft1000_cs); diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h new file mode 100644 index 0000000..2b5e383 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.h @@ -0,0 +1 @@ +#define CS_SUCCESS 0x00 diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h new file mode 100644 index 0000000..1c9d163 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h @@ -0,0 +1,66 @@ +//--------------------------------------------------------------------------- +// FT1000 driver for Flarion Flash OFDM NIC Device +// +// Copyright (C) 2002 Flarion Technologies, All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) any +// later version. This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - +// Suite 330, Boston, MA 02111-1307, USA. +//--------------------------------------------------------------------------- +// +// File: ft1000_dev.h +// +// Description: Register definitions and bit masks for the FT1000 NIC +// +// History: +// 2/5/02 Ivan Bohannon Written. +// 8/29/02 Whc Ported to Linux. +// +//--------------------------------------------------------------------------- +#ifndef _FT1000_DEVH_ +#define _FT1000_DEVH_ + +//--------------------------------------------------------------------------- +// +// Function: ft1000_read_reg +// Descripton: This function will read the value of a given ASIC register. +// Input: +// dev - device structure +// offset - ASIC register offset +// Output: +// data - ASIC register value +// +//--------------------------------------------------------------------------- +static inline u16 ft1000_read_reg (struct net_device *dev, u16 offset) { + u16 data = 0; + + data = inw(dev->base_addr + offset); + + return (data); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_write_reg +// Descripton: This function will set the value for a given ASIC register. +// Input: +// dev - device structure +// offset - ASIC register offset +// value - value to write +// Output: +// None. +// +//--------------------------------------------------------------------------- +static inline void ft1000_write_reg (struct net_device *dev, u16 offset, u16 value) { + outw (value, dev->base_addr + offset); +} + +#endif // _FT1000_DEVH_ + diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c new file mode 100644 index 0000000..be9c749 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c @@ -0,0 +1,940 @@ +/*--------------------------------------------------------------------------- + FT1000 driver for Flarion Flash OFDM NIC Device + + Copyright (C) 2002 Flarion Technologies, All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - + Suite 330, Boston, MA 02111-1307, USA. + -------------------------------------------------------------------------- + + Description: This module will handshake with the DSP bootloader to + download the DSP runtime image. + +---------------------------------------------------------------------------*/ + +#define __KERNEL_SYSCALLS__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ft1000_dev.h" +#include "ft1000.h" +#include "boot.h" + +#ifdef FT_DEBUG +#define DEBUG(n, args...) printk(KERN_DEBUG args); +#else +#define DEBUG(n, args...) +#endif + +#define MAX_DSP_WAIT_LOOPS 100 +#define DSP_WAIT_SLEEP_TIME 1 /* 1 millisecond */ + +#define MAX_LENGTH 0x7f0 + +#define DWNLD_MAG_HANDSHAKE_LOC 0x00 +#define DWNLD_MAG_TYPE_LOC 0x01 +#define DWNLD_MAG_SIZE_LOC 0x02 +#define DWNLD_MAG_PS_HDR_LOC 0x03 + +#define DWNLD_HANDSHAKE_LOC 0x02 +#define DWNLD_TYPE_LOC 0x04 +#define DWNLD_SIZE_MSW_LOC 0x06 +#define DWNLD_SIZE_LSW_LOC 0x08 +#define DWNLD_PS_HDR_LOC 0x0A + +#define HANDSHAKE_TIMEOUT_VALUE 0xF1F1 +#define HANDSHAKE_RESET_VALUE 0xFEFE /* When DSP requests startover */ +#define HANDSHAKE_DSP_BL_READY 0xFEFE /* At start DSP writes this when bootloader ready */ +#define HANDSHAKE_DRIVER_READY 0xFFFF /* Driver writes after receiving 0xFEFE */ +#define HANDSHAKE_SEND_DATA 0x0000 /* DSP writes this when ready for more data */ + +#define HANDSHAKE_REQUEST 0x0001 /* Request from DSP */ +#define HANDSHAKE_RESPONSE 0x0000 /* Satisfied DSP request */ + +#define REQUEST_CODE_LENGTH 0x0000 +#define REQUEST_RUN_ADDRESS 0x0001 +#define REQUEST_CODE_SEGMENT 0x0002 /* In WORD count */ +#define REQUEST_DONE_BL 0x0003 +#define REQUEST_DONE_CL 0x0004 +#define REQUEST_VERSION_INFO 0x0005 +#define REQUEST_CODE_BY_VERSION 0x0006 +#define REQUEST_MAILBOX_DATA 0x0007 +#define REQUEST_FILE_CHECKSUM 0x0008 + +#define STATE_START_DWNLD 0x01 +#define STATE_BOOT_DWNLD 0x02 +#define STATE_CODE_DWNLD 0x03 +#define STATE_DONE_DWNLD 0x04 +#define STATE_SECTION_PROV 0x05 +#define STATE_DONE_PROV 0x06 +#define STATE_DONE_FILE 0x07 + +USHORT get_handshake(struct net_device *dev, USHORT expected_value); +void put_handshake(struct net_device *dev, USHORT handshake_value); +USHORT get_request_type(struct net_device *dev); +long get_request_value(struct net_device *dev); +void put_request_value(struct net_device *dev, long lvalue); +USHORT hdr_checksum(PPSEUDO_HDR pHdr); + +typedef struct _DSP_FILE_HDR { + long build_date; + long dsp_coff_date; + long loader_code_address; + long loader_code_size; + long loader_code_end; + long dsp_code_address; + long dsp_code_size; + long dsp_code_end; + long reserved[8]; +} __attribute__ ((packed)) DSP_FILE_HDR, *PDSP_FILE_HDR; + +typedef struct _DSP_FILE_HDR_5 { + long version_id; // Version ID of this image format. + long package_id; // Package ID of code release. + long build_date; // Date/time stamp when file was built. + long commands_offset; // Offset to attached commands in Pseudo Hdr format. + long loader_offset; // Offset to bootloader code. + long loader_code_address; // Start address of bootloader. + long loader_code_end; // Where bootloader code ends. + long loader_code_size; + long version_data_offset; // Offset were scrambled version data begins. + long version_data_size; // Size, in words, of scrambled version data. + long nDspImages; // Number of DSP images in file. +} __attribute__ ((packed)) DSP_FILE_HDR_5, *PDSP_FILE_HDR_5; + +typedef struct _DSP_IMAGE_INFO { + long coff_date; // Date/time when DSP Coff image was built. + long begin_offset; // Offset in file where image begins. + long end_offset; // Offset in file where image begins. + long run_address; // On chip Start address of DSP code. + long image_size; // Size of image. + long version; // Embedded version # of DSP code. +} __attribute__ ((packed)) DSP_IMAGE_INFO, *PDSP_IMAGE_INFO; + +typedef struct _DSP_IMAGE_INFO_V6 { + long coff_date; // Date/time when DSP Coff image was built. + long begin_offset; // Offset in file where image begins. + long end_offset; // Offset in file where image begins. + long run_address; // On chip Start address of DSP code. + long image_size; // Size of image. + long version; // Embedded version # of DSP code. + unsigned short checksum; // Dsp File checksum + unsigned short pad1; +} __attribute__ ((packed)) DSP_IMAGE_INFO_V6, *PDSP_IMAGE_INFO_V6; + +void card_bootload(struct net_device *dev) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + unsigned long flags; + PULONG pdata; + UINT size; + UINT i; + ULONG templong; + + DEBUG(0, "card_bootload is called\n"); + + pdata = (PULONG) bootimage; + size = sizeof(bootimage); + + // check for odd word + if (size & 0x0003) { + size += 4; + } + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + + // need to set i/o base address initially and hardware will autoincrement + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, FT1000_DPRAM_BASE); + // write bytes + for (i = 0; i < (size >> 2); i++) { + templong = *pdata++; + outl(templong, dev->base_addr + FT1000_REG_MAG_DPDATA); + } + + spin_unlock_irqrestore(&info->dpram_lock, flags); +} + +USHORT get_handshake(struct net_device *dev, USHORT expected_value) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + USHORT handshake; + ULONG tempx; + int loopcnt; + + loopcnt = 0; + while (loopcnt < MAX_DSP_WAIT_LOOPS) { + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_HANDSHAKE_LOC); + + handshake = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + } else { + tempx = + ntohl(ft1000_read_dpram_mag_32 + (dev, DWNLD_MAG_HANDSHAKE_LOC)); + handshake = (USHORT) tempx; + } + + if ((handshake == expected_value) + || (handshake == HANDSHAKE_RESET_VALUE)) { + return handshake; + } else { + loopcnt++; + mdelay(DSP_WAIT_SLEEP_TIME); + } + + } + + return HANDSHAKE_TIMEOUT_VALUE; + +} + +void put_handshake(struct net_device *dev, USHORT handshake_value) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + ULONG tempx; + + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_HANDSHAKE_LOC); + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, handshake_value); /* Handshake */ + } else { + tempx = (ULONG) handshake_value; + tempx = ntohl(tempx); + ft1000_write_dpram_mag_32(dev, DWNLD_MAG_HANDSHAKE_LOC, tempx); /* Handshake */ + } +} + +USHORT get_request_type(struct net_device *dev) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + USHORT request_type; + ULONG tempx; + + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_TYPE_LOC); + request_type = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + } else { + tempx = ft1000_read_dpram_mag_32(dev, DWNLD_MAG_TYPE_LOC); + tempx = ntohl(tempx); + request_type = (USHORT) tempx; + } + + return request_type; + +} + +long get_request_value(struct net_device *dev) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + long value; + USHORT w_val; + + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_SIZE_MSW_LOC); + + w_val = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + + value = (long)(w_val << 16); + + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_SIZE_LSW_LOC); + + w_val = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + + value = (long)(value | w_val); + } else { + value = ft1000_read_dpram_mag_32(dev, DWNLD_MAG_SIZE_LOC); + value = ntohl(value); + } + + return value; + +} + +void put_request_value(struct net_device *dev, long lvalue) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + USHORT size; + ULONG tempx; + + if (info->AsicID == ELECTRABUZZ_ID) { + size = (USHORT) (lvalue >> 16); + + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_SIZE_MSW_LOC); + + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); + + size = (USHORT) (lvalue); + + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + DWNLD_SIZE_LSW_LOC); + + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); + } else { + tempx = ntohl(lvalue); + ft1000_write_dpram_mag_32(dev, DWNLD_MAG_SIZE_LOC, tempx); /* Handshake */ + } + +} + +USHORT hdr_checksum(PPSEUDO_HDR pHdr) +{ + USHORT *usPtr = (USHORT *) pHdr; + USHORT chksum; + + chksum = ((((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^ + usPtr[4]) ^ usPtr[5]) ^ usPtr[6]); + + return chksum; +} + +int card_download(struct net_device *dev, void *pFileStart, UINT FileLength) +{ + FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + int Status = SUCCESS; + USHORT DspWordCnt = 0; + UINT uiState; + USHORT handshake; + PPSEUDO_HDR pHdr; + USHORT usHdrLength; + PDSP_FILE_HDR pFileHdr; + long word_length; + USHORT request; + USHORT temp; + PPROV_RECORD pprov_record; + PUCHAR pbuffer; + PDSP_FILE_HDR_5 pFileHdr5; + PDSP_IMAGE_INFO pDspImageInfo = NULL; + PDSP_IMAGE_INFO_V6 pDspImageInfoV6 = NULL; + long requested_version; + BOOLEAN bGoodVersion = 0; + PDRVMSG pMailBoxData; + USHORT *pUsData = NULL; + USHORT *pUsFile = NULL; + UCHAR *pUcFile = NULL; + UCHAR *pBootEnd = NULL; + UCHAR *pCodeEnd = NULL; + int imageN; + long file_version; + long loader_code_address = 0; + long loader_code_size = 0; + long run_address = 0; + long run_size = 0; + unsigned long flags; + unsigned long templong; + unsigned long image_chksum = 0; + + // + // Get version id of file, at first 4 bytes of file, for newer files. + // + file_version = *(long *)pFileStart; + + uiState = STATE_START_DWNLD; + + pFileHdr = (PDSP_FILE_HDR) pFileStart; + pFileHdr5 = (PDSP_FILE_HDR_5) pFileStart; + + switch (file_version) { + case 5: + case 6: + pUsFile = + (USHORT *) ((long)pFileStart + pFileHdr5->loader_offset); + pUcFile = + (UCHAR *) ((long)pFileStart + pFileHdr5->loader_offset); + + pBootEnd = + (UCHAR *) ((long)pFileStart + pFileHdr5->loader_code_end); + + loader_code_address = pFileHdr5->loader_code_address; + loader_code_size = pFileHdr5->loader_code_size; + bGoodVersion = FALSE; + break; + + default: + Status = FAILURE; + break; + } + + while ((Status == SUCCESS) && (uiState != STATE_DONE_FILE)) { + + switch (uiState) { + case STATE_START_DWNLD: + + handshake = get_handshake(dev, HANDSHAKE_DSP_BL_READY); + + if (handshake == HANDSHAKE_DSP_BL_READY) { + put_handshake(dev, HANDSHAKE_DRIVER_READY); + } else { + Status = FAILURE; + } + + uiState = STATE_BOOT_DWNLD; + + break; + + case STATE_BOOT_DWNLD: + handshake = get_handshake(dev, HANDSHAKE_REQUEST); + if (handshake == HANDSHAKE_REQUEST) { + /* + * Get type associated with the request. + */ + request = get_request_type(dev); + switch (request) { + case REQUEST_RUN_ADDRESS: + put_request_value(dev, + loader_code_address); + break; + case REQUEST_CODE_LENGTH: + put_request_value(dev, + loader_code_size); + break; + case REQUEST_DONE_BL: + /* Reposition ptrs to beginning of code section */ + pUsFile = (USHORT *) ((long)pBootEnd); + pUcFile = (UCHAR *) ((long)pBootEnd); + uiState = STATE_CODE_DWNLD; + break; + case REQUEST_CODE_SEGMENT: + word_length = get_request_value(dev); + if (word_length > MAX_LENGTH) { + Status = FAILURE; + break; + } + if ((word_length * 2 + (long)pUcFile) > + (long)pBootEnd) { + /* + * Error, beyond boot code range. + */ + Status = FAILURE; + break; + } + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, + flags); + if (file_version == 5) { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + ft1000_write_reg(dev, + FT1000_REG_DPRAM_ADDR, + DWNLD_PS_HDR_LOC); + + for (; word_length > 0; word_length--) { /* In words */ + //temp = *pUsFile; + //temp = RtlUshortByteSwap(temp); + ft1000_write_reg(dev, + FT1000_REG_DPRAM_DATA, + *pUsFile); + pUsFile++; + pUcFile += 2; + DspWordCnt++; + } + } else { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) { + word_length++; + } + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = *pUsFile++; + templong |= + (*pUsFile++ << 16); + pUcFile += 4; + outl(templong, + dev->base_addr + + FT1000_REG_MAG_DPDATAL); + } + } + spin_unlock_irqrestore(&info-> + dpram_lock, + flags); + break; + default: + Status = FAILURE; + break; + } + put_handshake(dev, HANDSHAKE_RESPONSE); + } else { + Status = FAILURE; + } + + break; + + case STATE_CODE_DWNLD: + handshake = get_handshake(dev, HANDSHAKE_REQUEST); + if (handshake == HANDSHAKE_REQUEST) { + /* + * Get type associated with the request. + */ + request = get_request_type(dev); + switch (request) { + case REQUEST_FILE_CHECKSUM: + DEBUG(0, + "ft1000_dnld: REQUEST_FOR_CHECKSUM\n"); + put_request_value(dev, image_chksum); + break; + case REQUEST_RUN_ADDRESS: + if (bGoodVersion) { + put_request_value(dev, + run_address); + } else { + Status = FAILURE; + break; + } + break; + case REQUEST_CODE_LENGTH: + if (bGoodVersion) { + put_request_value(dev, + run_size); + } else { + Status = FAILURE; + break; + } + break; + case REQUEST_DONE_CL: + /* Reposition ptrs to beginning of provisioning section */ + switch (file_version) { + case 5: + case 6: + pUsFile = + (USHORT *) ((long)pFileStart + + + pFileHdr5-> + commands_offset); + pUcFile = + (UCHAR *) ((long)pFileStart + + + pFileHdr5-> + commands_offset); + break; + default: + Status = FAILURE; + break; + } + uiState = STATE_DONE_DWNLD; + break; + case REQUEST_CODE_SEGMENT: + if (!bGoodVersion) { + Status = FAILURE; + break; + } + word_length = get_request_value(dev); + if (word_length > MAX_LENGTH) { + Status = FAILURE; + break; + } + if ((word_length * 2 + (long)pUcFile) > + (long)pCodeEnd) { + /* + * Error, beyond boot code range. + */ + Status = FAILURE; + break; + } + if (file_version == 5) { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + ft1000_write_reg(dev, + FT1000_REG_DPRAM_ADDR, + DWNLD_PS_HDR_LOC); + + for (; word_length > 0; word_length--) { /* In words */ + //temp = *pUsFile; + //temp = RtlUshortByteSwap(temp); + ft1000_write_reg(dev, + FT1000_REG_DPRAM_DATA, + *pUsFile); + pUsFile++; + pUcFile += 2; + DspWordCnt++; + } + } else { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) { + word_length++; + } + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = *pUsFile++; + templong |= + (*pUsFile++ << 16); + pUcFile += 4; + outl(templong, + dev->base_addr + + FT1000_REG_MAG_DPDATAL); + } + } + break; + + case REQUEST_MAILBOX_DATA: + // Convert length from byte count to word count. Make sure we round up. + word_length = + (long)(info->DSPInfoBlklen + 1) / 2; + put_request_value(dev, word_length); + pMailBoxData = + (PDRVMSG) & info->DSPInfoBlk[0]; + pUsData = + (USHORT *) & pMailBoxData->data[0]; + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, + flags); + if (file_version == 5) { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + ft1000_write_reg(dev, + FT1000_REG_DPRAM_ADDR, + DWNLD_PS_HDR_LOC); + + for (; word_length > 0; word_length--) { /* In words */ + temp = ntohs(*pUsData); + ft1000_write_reg(dev, + FT1000_REG_DPRAM_DATA, + temp); + pUsData++; + } + } else { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) { + word_length++; + } + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = *pUsData++; + templong |= + (*pUsData++ << 16); + outl(templong, + dev->base_addr + + FT1000_REG_MAG_DPDATAL); + } + } + spin_unlock_irqrestore(&info-> + dpram_lock, + flags); + break; + + case REQUEST_VERSION_INFO: + word_length = + pFileHdr5->version_data_size; + put_request_value(dev, word_length); + pUsFile = + (USHORT *) ((long)pFileStart + + pFileHdr5-> + version_data_offset); + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, + flags); + if (file_version == 5) { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + ft1000_write_reg(dev, + FT1000_REG_DPRAM_ADDR, + DWNLD_PS_HDR_LOC); + + for (; word_length > 0; word_length--) { /* In words */ + ft1000_write_reg(dev, + FT1000_REG_DPRAM_DATA, + *pUsFile + /*temp */ + ); + pUsFile++; + } + } else { + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) { + word_length++; + } + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = + ntohs(*pUsFile++); + temp = + ntohs(*pUsFile++); + templong |= + (temp << 16); + outl(templong, + dev->base_addr + + FT1000_REG_MAG_DPDATAL); + } + } + spin_unlock_irqrestore(&info-> + dpram_lock, + flags); + break; + + case REQUEST_CODE_BY_VERSION: + bGoodVersion = FALSE; + requested_version = + get_request_value(dev); + if (file_version == 5) { + pDspImageInfo = + (PDSP_IMAGE_INFO) ((long) + pFileStart + + + sizeof + (DSP_FILE_HDR_5)); + for (imageN = 0; + imageN < + pFileHdr5->nDspImages; + imageN++) { + if (pDspImageInfo-> + version == + requested_version) { + bGoodVersion = + TRUE; + pUsFile = + (USHORT + *) ((long) + pFileStart + + + pDspImageInfo-> + begin_offset); + pUcFile = + (UCHAR + *) ((long) + pFileStart + + + pDspImageInfo-> + begin_offset); + pCodeEnd = + (UCHAR + *) ((long) + pFileStart + + + pDspImageInfo-> + end_offset); + run_address = + pDspImageInfo-> + run_address; + run_size = + pDspImageInfo-> + image_size; + break; + } + pDspImageInfo++; + } + } else { + pDspImageInfoV6 = + (PDSP_IMAGE_INFO_V6) ((long) + pFileStart + + + sizeof + (DSP_FILE_HDR_5)); + for (imageN = 0; + imageN < + pFileHdr5->nDspImages; + imageN++) { + temp = (USHORT) + (pDspImageInfoV6-> + version); + templong = temp; + temp = (USHORT) + (pDspImageInfoV6-> + version >> 16); + templong |= + (temp << 16); + if (templong == + requested_version) { + bGoodVersion = + TRUE; + pUsFile = + (USHORT + *) ((long) + pFileStart + + + pDspImageInfoV6-> + begin_offset); + pUcFile = + (UCHAR + *) ((long) + pFileStart + + + pDspImageInfoV6-> + begin_offset); + pCodeEnd = + (UCHAR + *) ((long) + pFileStart + + + pDspImageInfoV6-> + end_offset); + run_address = + pDspImageInfoV6-> + run_address; + run_size = + pDspImageInfoV6-> + image_size; + image_chksum = + (ULONG) + pDspImageInfoV6-> + checksum; + DEBUG(0, + "ft1000_dnld: image_chksum = 0x%8x\n", + (unsigned + int) + image_chksum); + break; + } + pDspImageInfoV6++; + } + } + if (!bGoodVersion) { + /* + * Error, beyond boot code range. + */ + Status = FAILURE; + break; + } + break; + + default: + Status = FAILURE; + break; + } + put_handshake(dev, HANDSHAKE_RESPONSE); + } else { + Status = FAILURE; + } + + break; + + case STATE_DONE_DWNLD: + if (((UINT) (pUcFile) - (UINT) pFileStart) >= + (UINT) FileLength) { + uiState = STATE_DONE_FILE; + break; + } + + pHdr = (PPSEUDO_HDR) pUsFile; + + if (pHdr->portdest == 0x80 /* DspOAM */ + && (pHdr->portsrc == 0x00 /* Driver */ + || pHdr->portsrc == 0x10 /* FMM */ )) { + uiState = STATE_SECTION_PROV; + } else { + DEBUG(1, + "FT1000:download:Download error: Bad Port IDs in Pseudo Record\n"); + DEBUG(1, "\t Port Source = 0x%2.2x\n", + pHdr->portsrc); + DEBUG(1, "\t Port Destination = 0x%2.2x\n", + pHdr->portdest); + Status = FAILURE; + } + + break; + + case STATE_SECTION_PROV: + + pHdr = (PPSEUDO_HDR) pUcFile; + + if (pHdr->checksum == hdr_checksum(pHdr)) { + if (pHdr->portdest != 0x80 /* Dsp OAM */ ) { + uiState = STATE_DONE_PROV; + break; + } + usHdrLength = ntohs(pHdr->length); /* Byte length for PROV records */ + + // Get buffer for provisioning data + pbuffer = + kmalloc((usHdrLength + sizeof(PSEUDO_HDR)), + GFP_ATOMIC); + if (pbuffer) { + memcpy(pbuffer, (void *)pUcFile, + (UINT) (usHdrLength + + sizeof(PSEUDO_HDR))); + // link provisioning data + pprov_record = + kmalloc(sizeof(PROV_RECORD), + GFP_ATOMIC); + if (pprov_record) { + pprov_record->pprov_data = + pbuffer; + list_add_tail(&pprov_record-> + list, + &info->prov_list); + // Move to next entry if available + pUcFile = + (UCHAR *) ((UINT) pUcFile + + (UINT) ((usHdrLength + 1) & 0xFFFFFFFE) + sizeof(PSEUDO_HDR)); + if ((UINT) (pUcFile) - + (UINT) (pFileStart) >= + (UINT) FileLength) { + uiState = + STATE_DONE_FILE; + } + } else { + kfree(pbuffer); + Status = FAILURE; + } + } else { + Status = FAILURE; + } + } else { + /* Checksum did not compute */ + Status = FAILURE; + } + + break; + + case STATE_DONE_PROV: + uiState = STATE_DONE_FILE; + break; + + default: + Status = FAILURE; + break; + } /* End Switch */ + + } /* End while */ + + return Status; + +} diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c new file mode 100644 index 0000000..d168a73 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c @@ -0,0 +1,2286 @@ +/*--------------------------------------------------------------------------- + FT1000 driver for Flarion Flash OFDM NIC Device + + Copyright (C) 2002 Flarion Technologies, All rights reserved. + Copyright (C) 2006 Patrik Ostrihon, All rights reserved. + Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - + Suite 330, Boston, MA 02111-1307, USA. +-----------------------------------------------------------------------------*/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifdef FT_DEBUG +#define DEBUG(n, args...) printk(KERN_DEBUG args); +#else +#define DEBUG(n, args...) +#endif + +#include +#include "ft1000_dev.h" +#include "ft1000.h" + +int card_download(struct net_device *dev, void *pFileStart, UINT FileLength); + +void ft1000InitProc(struct net_device *dev); +void ft1000CleanupProc(struct net_device *dev); + +const struct firmware *fw_entry; + +static void ft1000_hbchk(u_long data); +static struct timer_list poll_timer = { + function:ft1000_hbchk +}; + +static u16 cmdbuffer[1024]; +static u8 tempbuffer[1600]; +static u8 ft1000_card_present = 0; +static u8 flarion_ft1000_cnt = 0; + +static irqreturn_t ft1000_interrupt(int irq, void *dev_id); +static void ft1000_enable_interrupts(struct net_device *dev); +static void ft1000_disable_interrupts(struct net_device *dev); + +/* new kernel */ +MODULE_AUTHOR(""); +MODULE_DESCRIPTION + ("Support for Flarion Flash OFDM NIC Device. Support for PCMCIA when used with ft1000_cs."); +MODULE_LICENSE("GPL"); +MODULE_SUPPORTED_DEVICE("FT1000"); + +#define MAX_RCV_LOOP 100 + +//--------------------------------------------------------------------------- +// +// Function: ft1000_asic_read +// Descripton: This function will retrieve the value of a specific ASIC +// register. +// Input: +// dev - network device structure +// offset - ASIC register to read +// Output: +// value - value of ASIC register +// +//--------------------------------------------------------------------------- +inline u16 ft1000_asic_read(struct net_device *dev, u16 offset) +{ + return (ft1000_read_reg(dev, offset)); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_asic_write +// Descripton: This function will set the value of a specific ASIC +// register. +// Input: +// dev - network device structure +// value - value to set ASIC register +// Output: +// none +// +//--------------------------------------------------------------------------- +inline void ft1000_asic_write(struct net_device *dev, u16 offset, u16 value) +{ + ft1000_write_reg(dev, offset, value); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_read_fifo_len +// Descripton: This function will read the ASIC Uplink FIFO status register +// which will return the number of bytes remaining in the Uplink FIFO. +// Sixteen bytes are subtracted to make sure that the ASIC does not +// reach its threshold. +// Input: +// dev - network device structure +// Output: +// value - number of bytes available in the ASIC Uplink FIFO. +// +//--------------------------------------------------------------------------- +static inline u16 ft1000_read_fifo_len(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + + if (info->AsicID == ELECTRABUZZ_ID) { + return (ft1000_read_reg(dev, FT1000_REG_UFIFO_STAT) - 16); + } else { + return (ft1000_read_reg(dev, FT1000_REG_MAG_UFSR) - 16); + } +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_read_dpram +// Descripton: This function will read the specific area of dpram +// (Electrabuzz ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// Output: +// value - value of dpram +// +//--------------------------------------------------------------------------- +u16 ft1000_read_dpram(struct net_device * dev, int offset) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + u16 data; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + data = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + spin_unlock_irqrestore(&info->dpram_lock, flags); + + return (data); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_write_dpram +// Descripton: This function will write to a specific area of dpram +// (Electrabuzz ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// value - value to write +// Output: +// none. +// +//--------------------------------------------------------------------------- +static inline void ft1000_write_dpram(struct net_device *dev, + int offset, u16 value) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, value); + spin_unlock_irqrestore(&info->dpram_lock, flags); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_read_dpram_mag_16 +// Descripton: This function will read the specific area of dpram +// (Magnemite ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// Output: +// value - value of dpram +// +//--------------------------------------------------------------------------- +u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + u16 data; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + // check if we want to read upper or lower 32-bit word + if (Index) { + data = ft1000_read_reg(dev, FT1000_REG_MAG_DPDATAL); + } else { + data = ft1000_read_reg(dev, FT1000_REG_MAG_DPDATAH); + } + spin_unlock_irqrestore(&info->dpram_lock, flags); + + return (data); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_write_dpram_mag_16 +// Descripton: This function will write to a specific area of dpram +// (Magnemite ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// value - value to write +// Output: +// none. +// +//--------------------------------------------------------------------------- +static inline void ft1000_write_dpram_mag_16(struct net_device *dev, + int offset, u16 value, int Index) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + if (Index) { + ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAL, value); + } else { + ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAH, value); + } + spin_unlock_irqrestore(&info->dpram_lock, flags); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_read_dpram_mag_32 +// Descripton: This function will read the specific area of dpram +// (Magnemite ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// Output: +// value - value of dpram +// +//--------------------------------------------------------------------------- +u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + u32 data; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + data = inl(dev->base_addr + FT1000_REG_MAG_DPDATAL); + spin_unlock_irqrestore(&info->dpram_lock, flags); + + return (data); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_write_dpram_mag_32 +// Descripton: This function will write to a specific area of dpram +// (Magnemite ASIC only) +// Input: +// dev - device structure +// offset - index of dpram +// value - value to write +// Output: +// none. +// +//--------------------------------------------------------------------------- +void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + unsigned long flags; + + // Provide mutual exclusive access while reading ASIC registers. + spin_lock_irqsave(&info->dpram_lock, flags); + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); + outl(value, dev->base_addr + FT1000_REG_MAG_DPDATAL); + spin_unlock_irqrestore(&info->dpram_lock, flags); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_enable_interrupts +// Descripton: This function will enable interrupts base on the current interrupt mask. +// Input: +// dev - device structure +// Output: +// None. +// +//--------------------------------------------------------------------------- +static void ft1000_enable_interrupts(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 tempword; + + DEBUG(1, "ft1000_hw:ft1000_enable_interrupts()\n"); + ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, + info->CurrentInterruptEnableMask); + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); + DEBUG(1, + "ft1000_hw:ft1000_enable_interrupts:current interrupt enable mask = 0x%x\n", + tempword); + info->InterruptsEnabled = TRUE; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_disable_interrupts +// Descripton: This function will disable all interrupts. +// Input: +// dev - device structure +// Output: +// None. +// +//--------------------------------------------------------------------------- +static void ft1000_disable_interrupts(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 tempword; + + DEBUG(1, "ft1000_hw: ft1000_disable_interrupts()\n"); + ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, ISR_MASK_ALL); + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); + DEBUG(1, + "ft1000_hw:ft1000_disable_interrupts:current interrupt enable mask = 0x%x\n", + tempword); + info->InterruptsEnabled = FALSE; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_reset_asic +// Descripton: This function will call the Card Service function to reset the +// ASIC. +// Input: +// dev - device structure +// Output: +// none +// +//--------------------------------------------------------------------------- +static void ft1000_reset_asic(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 tempword; + + DEBUG(1, "ft1000_hw:ft1000_reset_asic called\n"); + + (*info->ft1000_reset) (info->link); + info->ASICResetNum++; + + // Let's use the register provided by the Magnemite ASIC to reset the + // ASIC and DSP. + if (info->AsicID == MAGNEMITE_ID) { + ft1000_write_reg(dev, FT1000_REG_RESET, + (DSP_RESET_BIT | ASIC_RESET_BIT)); + } + mdelay(1); + if (info->AsicID == ELECTRABUZZ_ID) { + // set watermark to -1 in order to not generate an interrrupt + ft1000_write_reg(dev, FT1000_REG_WATERMARK, 0xffff); + } else { + // set watermark to -1 in order to not generate an interrrupt + ft1000_write_reg(dev, FT1000_REG_MAG_WATERMARK, 0xffff); + } + // clear interrupts + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); + DEBUG(1, "ft1000_hw: interrupt status register = 0x%x\n", tempword); + ft1000_write_reg(dev, FT1000_REG_SUP_ISR, tempword); + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); + DEBUG(1, "ft1000_hw: interrupt status register = 0x%x\n", tempword); + +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_reset_card +// Descripton: This function will reset the card +// Input: +// dev - device structure +// Output: +// status - FALSE (card reset fail) +// TRUE (card reset successful) +// +//--------------------------------------------------------------------------- +static int ft1000_reset_card(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 tempword; + int i; + unsigned long flags; + PPROV_RECORD ptr; + + DEBUG(1, "ft1000_hw:ft1000_reset_card called.....\n"); + + info->CardReady = 0; + info->ProgConStat = 0; + info->squeseqnum = 0; + ft1000_disable_interrupts(dev); + +// del_timer(&poll_timer); + + // Make sure we free any memory reserve for provisioning + while (list_empty(&info->prov_list) == 0) { + DEBUG(0, + "ft1000_hw:ft1000_reset_card:deleting provisioning record\n"); + ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + list_del(&ptr->list); + kfree(ptr->pprov_data); + kfree(ptr); + } + + if (info->AsicID == ELECTRABUZZ_ID) { + DEBUG(1, "ft1000_hw:ft1000_reset_card:resetting DSP\n"); + ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); + } else { + DEBUG(1, + "ft1000_hw:ft1000_reset_card:resetting ASIC and DSP\n"); + ft1000_write_reg(dev, FT1000_REG_RESET, + (DSP_RESET_BIT | ASIC_RESET_BIT)); + } + + // Copy DSP session record into info block if this is not a coldstart + if (ft1000_card_present == 1) { + spin_lock_irqsave(&info->dpram_lock, flags); + if (info->AsicID == ELECTRABUZZ_ID) { + if (info->DspHibernateFlag == 0) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_RX_BASE); + for (i = 0; i < MAX_DSP_SESS_REC; i++) { + info->DSPSess.Rec[i] = + ft1000_read_reg(dev, + FT1000_REG_DPRAM_DATA); + } + } + } else { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_RX_BASE); + for (i = 0; i < MAX_DSP_SESS_REC / 2; i++) { + info->DSPSess.MagRec[i] = + inl(dev->base_addr + FT1000_REG_MAG_DPDATA); + } + } + spin_unlock_irqrestore(&info->dpram_lock, flags); + } + + DEBUG(1, "ft1000_hw:ft1000_reset_card:resetting ASIC\n"); + mdelay(10); + //reset ASIC + ft1000_reset_asic(dev); + + info->DSPResetNum++; + + DEBUG(1, "ft1000_hw:ft1000_reset_card:downloading dsp image\n"); + + if (info->AsicID == MAGNEMITE_ID) { + // Put dsp in reset and take ASIC out of reset + DEBUG(0, + "ft1000_hw:ft1000_reset_card:Put DSP in reset and take ASIC out of reset\n"); + ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); + + // Setting MAGNEMITE ASIC to big endian mode + ft1000_write_reg(dev, FT1000_REG_SUP_CTRL, HOST_INTF_BE); + // Download bootloader + card_bootload(dev); + + // Take DSP out of reset + ft1000_write_reg(dev, FT1000_REG_RESET, 0); + // FLARION_DSP_ACTIVE; + mdelay(10); + DEBUG(0, "ft1000_hw:ft1000_reset_card:Take DSP out of reset\n"); + + // Wait for 0xfefe indicating dsp ready before starting download + for (i = 0; i < 50; i++) { + tempword = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DPRAM_FEFE, + FT1000_MAG_DPRAM_FEFE_INDX); + if (tempword == 0xfefe) { + break; + } + mdelay(20); + } + + if (i == 50) { + DEBUG(0, + "ft1000_hw:ft1000_reset_card:No FEFE detected from DSP\n"); + return FALSE; + } + + } else { + // Take DSP out of reset + ft1000_write_reg(dev, FT1000_REG_RESET, ~DSP_RESET_BIT); + mdelay(10); + } + + if (card_download(dev, fw_entry->data, fw_entry->size)) { + DEBUG(1, "card download unsuccessful\n"); + return FALSE; + } else { + DEBUG(1, "card download successful\n"); + } + + mdelay(10); + + if (info->AsicID == ELECTRABUZZ_ID) { + // Need to initialize the FIFO length counter to zero in order to sync up + // with the DSP + info->fifo_cnt = 0; + ft1000_write_dpram(dev, FT1000_FIFO_LEN, info->fifo_cnt); + // Initialize DSP heartbeat area to ho + ft1000_write_dpram(dev, FT1000_HI_HO, ho); + tempword = ft1000_read_dpram(dev, FT1000_HI_HO); + DEBUG(1, "ft1000_hw:ft1000_reset_asic:hi_ho value = 0x%x\n", + tempword); + } else { + // Initialize DSP heartbeat area to ho + ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, ho_mag, + FT1000_MAG_HI_HO_INDX); + tempword = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_HI_HO, + FT1000_MAG_HI_HO_INDX); + DEBUG(1, "ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", + tempword); + } + + info->CardReady = 1; + ft1000_enable_interrupts(dev); + + /* Schedule heartbeat process to run every 2 seconds */ +// poll_timer.expires = jiffies + (2*HZ); +// poll_timer.data = (u_long)dev; +// add_timer(&poll_timer); + + return TRUE; + +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_chkcard +// Descripton: This function will check if the device is presently available on +// the system. +// Input: +// dev - device structure +// Output: +// status - FALSE (device is not present) +// TRUE (device is present) +// +//--------------------------------------------------------------------------- +static int ft1000_chkcard(struct net_device *dev) +{ + u16 tempword; + + // Mask register is used to check for device presence since it is never + // set to zero. + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); + if (tempword == 0) { + DEBUG(1, + "ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n"); + return FALSE; + } + // The system will return the value of 0xffff for the version register + // if the device is not present. + tempword = ft1000_read_reg(dev, FT1000_REG_ASIC_ID); + if (tempword == 0xffff) { + DEBUG(1, + "ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n"); + return FALSE; + } + return TRUE; +} + + +//--------------------------------------------------------------------------- +// +// Function: ft1000_hbchk +// Descripton: This function will perform the heart beat check of the DSP as +// well as the ASIC. +// Input: +// dev - device structure +// Output: +// none +// +//--------------------------------------------------------------------------- +static void ft1000_hbchk(u_long data) +{ + struct net_device *dev = (struct net_device *)data; + + FT1000_INFO *info; + USHORT tempword; + + info = (FT1000_INFO *) netdev_priv(dev); + + if (info->CardReady == 1) { + // Perform dsp heartbeat check + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = ft1000_read_dpram(dev, FT1000_HI_HO); + } else { + tempword = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_HI_HO, + FT1000_MAG_HI_HO_INDX)); + } + DEBUG(1, "ft1000_hw:ft1000_hbchk:hi_ho value = 0x%x\n", + tempword); + // Let's perform another check if ho is not detected + if (tempword != ho) { + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = ft1000_read_dpram(dev, FT1000_HI_HO); + } + else { + tempword = ntohs(ft1000_read_dpram_mag_16(dev, FT1000_MAG_HI_HO, FT1000_MAG_HI_HO_INDX)); + } + } + if (tempword != ho) { + printk(KERN_INFO + "ft1000: heartbeat failed - no ho detected\n"); + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev) == 0) { + printk(KERN_INFO + "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer.expires = jiffies + (2*HZ); + poll_timer.data = (u_long)dev; + add_timer(&poll_timer); + return; + } + + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + // Let's check doorbell again if fail + if (tempword & FT1000_DB_HB) { + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + } + if (tempword & FT1000_DB_HB) { + printk(KERN_INFO + "ft1000: heartbeat doorbell not clear by firmware\n"); + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev) == 0) { + printk(KERN_INFO + "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer.expires = jiffies + (2*HZ); + poll_timer.data = (u_long)dev; + add_timer(&poll_timer); + return; + } + // Set dedicated area to hi and ring appropriate doorbell according + // to hi/ho heartbeat protocol + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_dpram(dev, FT1000_HI_HO, hi); + } else { + ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, hi_mag, + FT1000_MAG_HI_HO_INDX); + } + + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = ft1000_read_dpram(dev, FT1000_HI_HO); + } else { + tempword = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_HI_HO, + FT1000_MAG_HI_HO_INDX)); + } + // Let's write hi again if fail + if (tempword != hi) { + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_dpram(dev, FT1000_HI_HO, hi); + } + else { + ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, hi_mag, FT1000_MAG_HI_HO_INDX); + } + + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = ft1000_read_dpram(dev, FT1000_HI_HO); + } + else { + tempword = ntohs(ft1000_read_dpram_mag_16(dev, FT1000_MAG_HI_HO, FT1000_MAG_HI_HO_INDX)); + } + + } + + if (tempword != hi) { + printk(KERN_INFO + "ft1000: heartbeat failed - cannot write hi into DPRAM\n"); + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev) == 0) { + printk(KERN_INFO + "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer.expires = jiffies + (2*HZ); + poll_timer.data = (u_long)dev; + add_timer(&poll_timer); + return; + } + ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_HB); + + } + + /* Schedule this module to run every 2 seconds */ + poll_timer.expires = jiffies + (2 * HZ); + poll_timer.data = (u_long) dev; + add_timer(&poll_timer); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_send_cmd +// Descripton: +// Input: +// Output: +// +//--------------------------------------------------------------------------- +void ft1000_send_cmd (struct net_device *dev, u16 *ptempbuffer, int size, u16 qtype) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + int i; + u16 tempword; + unsigned long flags; + + size += PSEUDOSZ; + // check for odd byte and increment to 16-bit word align value + if ((size & 0x0001)) { + size++; + } + DEBUG(1, "FT1000:ft1000_send_cmd:total length = %d\n", size); + DEBUG(1, "FT1000:ft1000_send_cmd:length = %d\n", ntohs(*ptempbuffer)); + // put message into slow queue area + // All messages are in the form total_len + pseudo header + message body + spin_lock_irqsave(&info->dpram_lock, flags); + + // Make sure SLOWQ doorbell is clear + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + i=0; + while (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + i++; + if (i==10) { + spin_unlock_irqrestore(&info->dpram_lock, flags); + return; + } + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + } + + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_TX_BASE); + // Write total length to dpram + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); + // Write pseudo header and messgae body + for (i = 0; i < (size >> 1); i++) { + DEBUG(1, "FT1000:ft1000_send_cmd:data %d = 0x%x\n", i, + *ptempbuffer); + tempword = htons(*ptempbuffer++); + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, tempword); + } + } else { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_TX_BASE); + // Write total length to dpram + ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAH, htons(size)); + // Write pseudo header and messgae body + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_TX_BASE + 1); + for (i = 0; i < (size >> 2); i++) { + DEBUG(1, "FT1000:ft1000_send_cmd:data = 0x%x\n", + *ptempbuffer); + outw(*ptempbuffer++, + dev->base_addr + FT1000_REG_MAG_DPDATAL); + DEBUG(1, "FT1000:ft1000_send_cmd:data = 0x%x\n", + *ptempbuffer); + outw(*ptempbuffer++, + dev->base_addr + FT1000_REG_MAG_DPDATAH); + } + DEBUG(1, "FT1000:ft1000_send_cmd:data = 0x%x\n", *ptempbuffer); + outw(*ptempbuffer++, dev->base_addr + FT1000_REG_MAG_DPDATAL); + DEBUG(1, "FT1000:ft1000_send_cmd:data = 0x%x\n", *ptempbuffer); + outw(*ptempbuffer++, dev->base_addr + FT1000_REG_MAG_DPDATAH); + } + spin_unlock_irqrestore(&info->dpram_lock, flags); + + // ring doorbell to notify DSP that we have a message ready + ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_DPRAM_TX); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_receive_cmd +// Descripton: This function will read a message from the dpram area. +// Input: +// dev - network device structure +// pbuffer - caller supply address to buffer +// pnxtph - pointer to next pseudo header +// Output: +// Status = 0 (unsuccessful) +// = 1 (successful) +// +//--------------------------------------------------------------------------- +BOOLEAN ft1000_receive_cmd(struct net_device *dev, u16 * pbuffer, int maxsz, u16 *pnxtph) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 size; + u16 *ppseudohdr; + int i; + u16 tempword; + unsigned long flags; + + if (info->AsicID == ELECTRABUZZ_ID) { + size = ( ft1000_read_dpram(dev, *pnxtph) ) + PSEUDOSZ; + } else { + size = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_PH_LEN, + FT1000_MAG_PH_LEN_INDX)) + PSEUDOSZ; + } + if (size > maxsz) { + DEBUG(1, + "FT1000:ft1000_receive_cmd:Invalid command length = %d\n", + size); + return FALSE; + } else { + ppseudohdr = (u16 *) pbuffer; + spin_lock_irqsave(&info->dpram_lock, flags); + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_RX_BASE + 2); + for (i = 0; i <= (size >> 1); i++) { + tempword = + ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + *pbuffer++ = ntohs(tempword); + } + } else { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_RX_BASE); + *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAH); + DEBUG(1, "ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_RX_BASE + 1); + for (i = 0; i <= (size >> 2); i++) { + *pbuffer = + inw(dev->base_addr + + FT1000_REG_MAG_DPDATAL); + pbuffer++; + *pbuffer = + inw(dev->base_addr + + FT1000_REG_MAG_DPDATAH); + pbuffer++; + } + //copy odd aligned word + *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAL); + DEBUG(1, "ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAH); + DEBUG(1, "ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + } + if (size & 0x0001) { + //copy odd byte from fifo + tempword = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); + *pbuffer = ntohs(tempword); + } + spin_unlock_irqrestore(&info->dpram_lock, flags); + + // Check if pseudo header checksum is good + // Calculate pseudo header checksum + tempword = *ppseudohdr++; + for (i = 1; i < 7; i++) { + tempword ^= *ppseudohdr++; + } + if ((tempword != *ppseudohdr)) { + DEBUG(1, + "FT1000:ft1000_receive_cmd:Pseudo header checksum mismatch\n"); + // Drop this message + return FALSE; + } + return TRUE; + } +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_proc_drvmsg +// Descripton: This function will process the various driver messages. +// Input: +// dev - device structure +// pnxtph - pointer to next pseudo header +// Output: +// none +// +//--------------------------------------------------------------------------- +void ft1000_proc_drvmsg(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 msgtype; + u16 tempword; + PMEDIAMSG pmediamsg; + PDSPINITMSG pdspinitmsg; + PDRVMSG pdrvmsg; + u16 len; + u16 i; + PPROV_RECORD ptr; + PPSEUDO_HDR ppseudo_hdr; + PUSHORT pmsg; + struct timeval tv; + union { + u8 byte[2]; + u16 wrd; + } convert; + + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = FT1000_DPRAM_RX_BASE+2; + } + else { + tempword = FT1000_DPRAM_MAG_RX_BASE; + } + if ( ft1000_receive_cmd(dev, &cmdbuffer[0], MAX_CMD_SQSIZE, &tempword) ) { + + // Get the message type which is total_len + PSEUDO header + msgtype + message body + pdrvmsg = (PDRVMSG) & cmdbuffer[0]; + msgtype = ntohs(pdrvmsg->type); + DEBUG(1, "Command message type = 0x%x\n", msgtype); + switch (msgtype) { + case DSP_PROVISION: + DEBUG(0, + "Got a provisioning request message from DSP\n"); + mdelay(25); + while (list_empty(&info->prov_list) == 0) { + DEBUG(0, "Sending a provisioning message\n"); + // Make sure SLOWQ doorbell is clear + tempword = + ft1000_read_reg(dev, FT1000_REG_DOORBELL); + i = 0; + while (tempword & FT1000_DB_DPRAM_TX) { + mdelay(5); + i++; + if (i == 10) { + break; + } + } + ptr = + list_entry(info->prov_list.next, + PROV_RECORD, list); + len = *(u16 *) ptr->pprov_data; + len = htons(len); + + pmsg = (PUSHORT) ptr->pprov_data; + ppseudo_hdr = (PPSEUDO_HDR) pmsg; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + DEBUG(1, "checksum = 0x%x\n", + ppseudo_hdr->checksum); + for (i = 1; i < 7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + DEBUG(1, "checksum = 0x%x\n", + ppseudo_hdr->checksum); + } + + ft1000_send_cmd (dev, (u16 *)ptr->pprov_data, len, SLOWQ_TYPE); + list_del(&ptr->list); + kfree(ptr->pprov_data); + kfree(ptr); + } + // Indicate adapter is ready to take application messages after all + // provisioning messages are sent + info->CardReady = 1; + break; + case MEDIA_STATE: + pmediamsg = (PMEDIAMSG) & cmdbuffer[0]; + if (info->ProgConStat != 0xFF) { + if (pmediamsg->state) { + DEBUG(1, "Media is up\n"); + if (info->mediastate == 0) { + netif_carrier_on(dev); + netif_wake_queue(dev); + info->mediastate = 1; + do_gettimeofday(&tv); + info->ConTm = tv.tv_sec; + } + } else { + DEBUG(1, "Media is down\n"); + if (info->mediastate == 1) { + info->mediastate = 0; + netif_carrier_off(dev); + netif_stop_queue(dev); + info->ConTm = 0; + } + } + } + else { + DEBUG(1,"Media is down\n"); + if (info->mediastate == 1) { + info->mediastate = 0; + netif_carrier_off(dev); + netif_stop_queue(dev); + info->ConTm = 0; + } + } + break; + case DSP_INIT_MSG: + pdspinitmsg = (PDSPINITMSG) & cmdbuffer[0]; + memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); + DEBUG(1, "DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", + info->DspVer[0], info->DspVer[1], info->DspVer[2], + info->DspVer[3]); + memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, + HWSERNUMSZ); + memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); + memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); + dev->dev_addr[0] = info->eui64[0]; + dev->dev_addr[1] = info->eui64[1]; + dev->dev_addr[2] = info->eui64[2]; + dev->dev_addr[3] = info->eui64[5]; + dev->dev_addr[4] = info->eui64[6]; + dev->dev_addr[5] = info->eui64[7]; + + if (ntohs(pdspinitmsg->length) == + (sizeof(DSPINITMSG) - 20)) { + memcpy(info->ProductMode, + pdspinitmsg->ProductMode, MODESZ); + memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, + CALVERSZ); + memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, + CALDATESZ); + DEBUG(1, "RFCalVer = 0x%2x 0x%2x\n", + info->RfCalVer[0], info->RfCalVer[1]); + } + + break ; + case DSP_STORE_INFO: + DEBUG(1, "FT1000:drivermsg:Got DSP_STORE_INFO\n"); + tempword = ntohs(pdrvmsg->length); + info->DSPInfoBlklen = tempword; + if (tempword < (MAX_DSP_SESS_REC - 4)) { + pmsg = (PUSHORT) & pdrvmsg->data[0]; + for (i = 0; i < ((tempword + 1) / 2); i++) { + DEBUG(1, + "FT1000:drivermsg:dsp info data = 0x%x\n", + *pmsg); + info->DSPInfoBlk[i + 10] = *pmsg++; + } + } + break; + case DSP_GET_INFO: + DEBUG(1, "FT1000:drivermsg:Got DSP_GET_INFO\n"); + // copy dsp info block to dsp + info->DrvMsgPend = 1; + // allow any outstanding ioctl to finish + mdelay(10); + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + tempword = + ft1000_read_reg(dev, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + } + } + + if ((tempword & FT1000_DB_DPRAM_TX) == 0) { + // Put message into Slow Queue + // Form Pseudo header + pmsg = (PUSHORT) info->DSPInfoBlk; + ppseudo_hdr = (PPSEUDO_HDR) pmsg; + ppseudo_hdr->length = + htons(info->DSPInfoBlklen + 4); + ppseudo_hdr->source = 0x10; + ppseudo_hdr->destination = 0x20; + ppseudo_hdr->portdest = 0; + ppseudo_hdr->portsrc = 0; + ppseudo_hdr->sh_str_id = 0; + ppseudo_hdr->control = 0; + ppseudo_hdr->rsvd1 = 0; + ppseudo_hdr->rsvd2 = 0; + ppseudo_hdr->qos_class = 0; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + // Insert application id + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + for (i = 1; i < 7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + } + info->DSPInfoBlk[8] = 0x7200; + info->DSPInfoBlk[9] = + htons(info->DSPInfoBlklen); + ft1000_send_cmd (dev, (PUSHORT)info->DSPInfoBlk, (USHORT)(info->DSPInfoBlklen+4), 0); + } + info->DrvMsgPend = 0; + + break; + case GET_DRV_ERR_RPT_MSG: + DEBUG(1, "FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n"); + // copy driver error message to dsp + info->DrvMsgPend = 1; + // allow any outstanding ioctl to finish + mdelay(10); + tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + tempword = + ft1000_read_reg(dev, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + } + } + + if ((tempword & FT1000_DB_DPRAM_TX) == 0) { + // Put message into Slow Queue + // Form Pseudo header + pmsg = (PUSHORT) & tempbuffer[0]; + ppseudo_hdr = (PPSEUDO_HDR) pmsg; + ppseudo_hdr->length = htons(0x0012); + ppseudo_hdr->source = 0x10; + ppseudo_hdr->destination = 0x20; + ppseudo_hdr->portdest = 0; + ppseudo_hdr->portsrc = 0; + ppseudo_hdr->sh_str_id = 0; + ppseudo_hdr->control = 0; + ppseudo_hdr->rsvd1 = 0; + ppseudo_hdr->rsvd2 = 0; + ppseudo_hdr->qos_class = 0; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + // Insert application id + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + for (i=1; i<7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + } + pmsg = (PUSHORT) & tempbuffer[16]; + *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); + *pmsg++ = htons(0x000e); + *pmsg++ = htons(info->DSP_TIME[0]); + *pmsg++ = htons(info->DSP_TIME[1]); + *pmsg++ = htons(info->DSP_TIME[2]); + *pmsg++ = htons(info->DSP_TIME[3]); + convert.byte[0] = info->DspVer[0]; + convert.byte[1] = info->DspVer[1]; + *pmsg++ = convert.wrd; + convert.byte[0] = info->DspVer[2]; + convert.byte[1] = info->DspVer[3]; + *pmsg++ = convert.wrd; + *pmsg++ = htons(info->DrvErrNum); + + ft1000_send_cmd (dev, (PUSHORT)&tempbuffer[0], (USHORT)(0x0012), 0); + info->DrvErrNum = 0; + } + info->DrvMsgPend = 0; + + break; + default: + break; + } + } +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_parse_dpram_msg +// Descripton: This function will parse the message received from the DSP +// via the DPRAM interface. +// Input: +// dev - device structure +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_parse_dpram_msg(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 doorbell; + u16 portid; + u16 nxtph; + u16 total_len; + int i = 0; + int cnt; + unsigned long flags; + + doorbell = ft1000_read_reg(dev, FT1000_REG_DOORBELL); + DEBUG(1, "Doorbell = 0x%x\n", doorbell); + + if (doorbell & FT1000_ASIC_RESET_REQ) { + // Copy DSP session record from info block + spin_lock_irqsave(&info->dpram_lock, flags); + if (info->AsicID == ELECTRABUZZ_ID) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_RX_BASE); + for (i = 0; i < MAX_DSP_SESS_REC; i++) { + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, + info->DSPSess.Rec[i]); + } + } else { + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_MAG_RX_BASE); + for (i = 0; i < MAX_DSP_SESS_REC / 2; i++) { + outl(info->DSPSess.MagRec[i], + dev->base_addr + FT1000_REG_MAG_DPDATA); + } + } + spin_unlock_irqrestore(&info->dpram_lock, flags); + + // clear ASIC RESET request + ft1000_write_reg(dev, FT1000_REG_DOORBELL, + FT1000_ASIC_RESET_REQ); + DEBUG(1, "Got an ASIC RESET Request\n"); + ft1000_write_reg(dev, FT1000_REG_DOORBELL, + FT1000_ASIC_RESET_DSP); + + if (info->AsicID == MAGNEMITE_ID) { + // Setting MAGNEMITE ASIC to big endian mode + ft1000_write_reg(dev, FT1000_REG_SUP_CTRL, + HOST_INTF_BE); + } + info->DspAsicReset = 0; + } + + if (doorbell & FT1000_DSP_ASIC_RESET) { + DEBUG(0, + "FT1000:ft1000_parse_dpram_msg: Got a dsp ASIC reset message\n"); + info->DspAsicReset = 1; + ft1000_write_reg(dev, FT1000_REG_DOORBELL, + FT1000_DSP_ASIC_RESET); + udelay(200); + return SUCCESS; + } + + if (doorbell & FT1000_DB_DPRAM_RX) { + DEBUG(1, + "FT1000:ft1000_parse_dpram_msg: Got a slow queue message\n"); + nxtph = FT1000_DPRAM_RX_BASE + 2; + if (info->AsicID == ELECTRABUZZ_ID) { + total_len = + ft1000_read_dpram(dev, FT1000_DPRAM_RX_BASE); + } else { + total_len = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_TOTAL_LEN, + FT1000_MAG_TOTAL_LEN_INDX)); + } + DEBUG(1, "FT1000:ft1000_parse_dpram_msg:total length = %d\n", + total_len); + if ((total_len < MAX_CMD_SQSIZE) && (total_len > PSEUDOSZ)) { + total_len += nxtph; + cnt = 0; + // ft1000_read_reg will return a value that needs to be byteswap + // in order to get DSP_QID_OFFSET. + if (info->AsicID == ELECTRABUZZ_ID) { + portid = + (ft1000_read_dpram + (dev, + DSP_QID_OFFSET + FT1000_DPRAM_RX_BASE + + 2) >> 8) & 0xff; + } else { + portid = + (ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_PORT_ID, + FT1000_MAG_PORT_ID_INDX) & 0xff); + } + DEBUG(1, "DSP_QID = 0x%x\n", portid); + + if (portid == DRIVERID) { + // We are assumming one driver message from the DSP at a time. + ft1000_proc_drvmsg(dev); + } + } + ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_DPRAM_RX); + } + + if (doorbell & FT1000_DB_COND_RESET) { + // Reset ASIC and DSP + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + info->DrvErrNum = DSP_CONDRESET_INFO; + DEBUG(1, "ft1000_hw:DSP conditional reset requested\n"); + ft1000_reset_card(dev); + ft1000_write_reg(dev, FT1000_REG_DOORBELL, + FT1000_DB_COND_RESET); + } + // let's clear any unexpected doorbells from DSP + doorbell = + doorbell & ~(FT1000_DB_DPRAM_RX | FT1000_ASIC_RESET_REQ | + FT1000_DB_COND_RESET | 0xff00); + if (doorbell) { + DEBUG(1, "Clearing unexpected doorbell = 0x%x\n", doorbell); + ft1000_write_reg(dev, FT1000_REG_DOORBELL, doorbell); + } + + return SUCCESS; + +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_flush_fifo +// Descripton: This function will flush one packet from the downlink +// FIFO. +// Input: +// dev - device structure +// drv_err - driver error causing the flush fifo +// Output: +// None. +// +//--------------------------------------------------------------------------- +static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 i; + u32 templong; + u16 tempword; + + DEBUG(1, "ft1000:ft1000_hw:ft1000_flush_fifo called\n"); + if (info->PktIntfErr > MAX_PH_ERR) { + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + info->DrvErrNum = DrvErrNum; + ft1000_reset_card(dev); + return; + } else { + // Flush corrupted pkt from FIFO + i = 0; + do { + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = + ft1000_read_reg(dev, FT1000_REG_DFIFO); + tempword = + ft1000_read_reg(dev, FT1000_REG_DFIFO_STAT); + } else { + templong = + inl(dev->base_addr + FT1000_REG_MAG_DFR); + tempword = + inw(dev->base_addr + FT1000_REG_MAG_DFSR); + } + i++; + // This should never happen unless the ASIC is broken. + // We must reset to recover. + if ((i > 2048) || (tempword == 0)) { + if (info->AsicID == ELECTRABUZZ_ID) { + info->DSP_TIME[0] = + ft1000_read_dpram(dev, + FT1000_DSP_TIMER0); + info->DSP_TIME[1] = + ft1000_read_dpram(dev, + FT1000_DSP_TIMER1); + info->DSP_TIME[2] = + ft1000_read_dpram(dev, + FT1000_DSP_TIMER2); + info->DSP_TIME[3] = + ft1000_read_dpram(dev, + FT1000_DSP_TIMER3); + } else { + info->DSP_TIME[0] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER0, + FT1000_MAG_DSP_TIMER0_INDX); + info->DSP_TIME[1] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER1, + FT1000_MAG_DSP_TIMER1_INDX); + info->DSP_TIME[2] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER2, + FT1000_MAG_DSP_TIMER2_INDX); + info->DSP_TIME[3] = + ft1000_read_dpram_mag_16(dev, + FT1000_MAG_DSP_TIMER3, + FT1000_MAG_DSP_TIMER3_INDX); + } + if (tempword == 0) { + // Let's check if ASIC reads are still ok by reading the Mask register + // which is never zero at this point of the code. + tempword = + inw(dev->base_addr + + FT1000_REG_SUP_IMASK); + if (tempword == 0) { + // This indicates that we can not communicate with the ASIC + info->DrvErrNum = + FIFO_FLUSH_BADCNT; + } else { + // Let's assume that we really flush the FIFO + info->PktIntfErr++; + return; + } + } else { + info->DrvErrNum = FIFO_FLUSH_MAXLIMIT; + } + return; + } + tempword = inw(dev->base_addr + FT1000_REG_SUP_STAT); + } while ((tempword & 0x03) != 0x03); + if (info->AsicID == ELECTRABUZZ_ID) { + i++; + DEBUG(0, "Flushing FIFO complete = %x\n", tempword); + // Flush last word in FIFO. + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + // Update FIFO counter for DSP + i = i * 2; + DEBUG(0, "Flush Data byte count to dsp = %d\n", i); + info->fifo_cnt += i; + ft1000_write_dpram(dev, FT1000_FIFO_LEN, + info->fifo_cnt); + } else { + DEBUG(0, "Flushing FIFO complete = %x\n", tempword); + // Flush last word in FIFO + templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); + tempword = inw(dev->base_addr + FT1000_REG_SUP_STAT); + DEBUG(0, "FT1000_REG_SUP_STAT = 0x%x\n", tempword); + tempword = inw(dev->base_addr + FT1000_REG_MAG_DFSR); + DEBUG(0, "FT1000_REG_MAG_DFSR = 0x%x\n", tempword); + } + if (DrvErrNum) { + info->PktIntfErr++; + } + } +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_copy_up_pkt +// Descripton: This function will pull Flarion packets out of the Downlink +// FIFO and convert it to an ethernet packet. The ethernet packet will +// then be deliver to the TCP/IP stack. +// Input: +// dev - device structure +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_copy_up_pkt(struct net_device *dev) +{ + u16 tempword; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 len; + struct sk_buff *skb; + u16 i; + u8 *pbuffer = NULL; + u8 *ptemp = NULL; + u16 chksum; + u32 *ptemplong; + u32 templong; + + DEBUG(1, "ft1000_copy_up_pkt\n"); + // Read length + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + len = tempword; + } else { + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); + len = ntohs(tempword); + } + chksum = tempword; + DEBUG(1, "Number of Bytes in FIFO = %d\n", len); + + if (len > ENET_MAX_SIZE) { + DEBUG(0, "size of ethernet packet invalid\n"); + if (info->AsicID == MAGNEMITE_ID) { + // Read High word to complete 32 bit access + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + } + ft1000_flush_fifo(dev, DSP_PKTLEN_INFO); + info->stats.rx_errors++; + return FAILURE; + } + + skb = dev_alloc_skb(len + 12 + 2); + + if (skb == NULL) { + DEBUG(0, "No Network buffers available\n"); + // Read High word to complete 32 bit access + if (info->AsicID == MAGNEMITE_ID) { + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + } + ft1000_flush_fifo(dev, 0); + info->stats.rx_errors++; + return FAILURE; + } + pbuffer = (u8 *) skb_put(skb, len + 12); + + // Pseudo header + if (info->AsicID == ELECTRABUZZ_ID) { + for (i = 1; i < 7; i++) { + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + chksum ^= tempword; + } + // read checksum value + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + } else { + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + chksum ^= tempword; + + // read checksum value + tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); + DEBUG(1, "Pseudo = 0x%x\n", tempword); + } + + if (chksum != tempword) { + DEBUG(0, "Packet checksum mismatch 0x%x 0x%x\n", chksum, + tempword); + ft1000_flush_fifo(dev, DSP_PKTPHCKSUM_INFO); + info->stats.rx_errors++; + return FAILURE; + } + //subtract the number of bytes read already + ptemp = pbuffer; + + // fake MAC address + *pbuffer++ = dev->dev_addr[0]; + *pbuffer++ = dev->dev_addr[1]; + *pbuffer++ = dev->dev_addr[2]; + *pbuffer++ = dev->dev_addr[3]; + *pbuffer++ = dev->dev_addr[4]; + *pbuffer++ = dev->dev_addr[5]; + *pbuffer++ = 0x00; + *pbuffer++ = 0x07; + *pbuffer++ = 0x35; + *pbuffer++ = 0xff; + *pbuffer++ = 0xff; + *pbuffer++ = 0xfe; + + if (info->AsicID == ELECTRABUZZ_ID) { + for (i = 0; i < len / 2; i++) { + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + *pbuffer++ = (u8) (tempword >> 8); + *pbuffer++ = (u8) tempword; + if (ft1000_chkcard(dev) == FALSE) { + return FAILURE; + } + } + + // Need to read one more word if odd byte + if (len & 0x0001) { + tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); + *pbuffer++ = (u8) (tempword >> 8); + } + } else { + ptemplong = (u32 *) pbuffer; + for (i = 0; i < len / 4; i++) { + templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); + DEBUG(1, "Data = 0x%8x\n", templong); + *ptemplong++ = templong; + } + + // Need to read one more word if odd align. + if (len & 0x0003) { + templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); + DEBUG(1, "Data = 0x%8x\n", templong); + *ptemplong++ = templong; + } + + } + + DEBUG(1, "Data passed to Protocol layer:\n"); + for (i = 0; i < len + 12; i++) { + DEBUG(1, "Protocol Data: 0x%x\n ", *ptemp++); + } + + skb->dev = dev; + skb->protocol = eth_type_trans(skb, dev); + skb->ip_summed = CHECKSUM_UNNECESSARY; + netif_rx(skb); + + info->stats.rx_packets++; + // Add on 12 bytes for MAC address which was removed + info->stats.rx_bytes += (len + 12); + + if (info->AsicID == ELECTRABUZZ_ID) { + // track how many bytes have been read from FIFO - round up to 16 bit word + tempword = len + 16; + if (tempword & 0x01) + tempword++; + info->fifo_cnt += tempword; + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, FT1000_FIFO_LEN); + ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, info->fifo_cnt); + } + + return SUCCESS; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_copy_down_pkt +// Descripton: This function will take an ethernet packet and convert it to +// a Flarion packet prior to sending it to the ASIC Downlink +// FIFO. +// Input: +// dev - device structure +// packet - address of ethernet packet +// len - length of IP packet +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + union { + PSEUDO_HDR blk; + u16 buff[sizeof(PSEUDO_HDR) >> 1]; + u8 buffc[sizeof(PSEUDO_HDR)]; + } pseudo; + int i; + u32 *plong; + + DEBUG(1, "ft1000_hw: copy_down_pkt()\n"); + + // Check if there is room on the FIFO + if (len > ft1000_read_fifo_len(dev)) { + udelay(10); + if (len > ft1000_read_fifo_len(dev)) { + udelay(20); + } + if (len > ft1000_read_fifo_len(dev)) { + udelay(20); + } + if (len > ft1000_read_fifo_len(dev)) { + udelay(20); + } + if (len > ft1000_read_fifo_len(dev)) { + udelay(20); + } + if (len > ft1000_read_fifo_len(dev)) { + udelay(20); + } + if (len > ft1000_read_fifo_len(dev)) { + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:Transmit FIFO is fulli - pkt drop\n"); + info->stats.tx_errors++; + return SUCCESS; + } + } + // Create pseudo header and send pseudo/ip to hardware + if (info->AsicID == ELECTRABUZZ_ID) { + pseudo.blk.length = len; + } else { + pseudo.blk.length = ntohs(len); + } + pseudo.blk.source = DSPID; // Need to swap to get in correct order + pseudo.blk.destination = HOSTID; + pseudo.blk.portdest = NETWORKID; // Need to swap to get in correct order + pseudo.blk.portsrc = DSPAIRID; + pseudo.blk.sh_str_id = 0; + pseudo.blk.control = 0; + pseudo.blk.rsvd1 = 0; + pseudo.blk.seq_num = 0; + pseudo.blk.rsvd2 = info->packetseqnum++; + pseudo.blk.qos_class = 0; + /* Calculate pseudo header checksum */ + pseudo.blk.checksum = pseudo.buff[0]; + for (i = 1; i < 7; i++) { + pseudo.blk.checksum ^= pseudo.buff[i]; + } + + // Production Mode + if (info->AsicID == ELECTRABUZZ_ID) { + // copy first word to UFIFO_BEG reg + ft1000_write_reg(dev, FT1000_REG_UFIFO_BEG, pseudo.buff[0]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 0 BEG = 0x%04x\n", + pseudo.buff[0]); + + // copy subsequent words to UFIFO_MID reg + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[1]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 1 MID = 0x%04x\n", + pseudo.buff[1]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[2]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 2 MID = 0x%04x\n", + pseudo.buff[2]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[3]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 3 MID = 0x%04x\n", + pseudo.buff[3]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[4]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 4 MID = 0x%04x\n", + pseudo.buff[4]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[5]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 5 MID = 0x%04x\n", + pseudo.buff[5]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[6]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 6 MID = 0x%04x\n", + pseudo.buff[6]); + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[7]); + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:data 7 MID = 0x%04x\n", + pseudo.buff[7]); + + // Write PPP type + IP Packet into Downlink FIFO + for (i = 0; i < (len >> 1) - 1; i++) { + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, + htons(*packet)); + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:data %d MID = 0x%04x\n", + i + 8, htons(*packet)); + packet++; + } + + // Check for odd byte + if (len & 0x0001) { + ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, + htons(*packet)); + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:data MID = 0x%04x\n", + htons(*packet)); + packet++; + ft1000_write_reg(dev, FT1000_REG_UFIFO_END, + htons(*packet)); + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:data %d MID = 0x%04x\n", + i + 8, htons(*packet)); + } else { + ft1000_write_reg(dev, FT1000_REG_UFIFO_END, + htons(*packet)); + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:data %d MID = 0x%04x\n", + i + 8, htons(*packet)); + } + } else { + outl(*(u32 *) & pseudo.buff[0], + dev->base_addr + FT1000_REG_MAG_UFDR); + DEBUG(1, "ft1000_copy_down_pkt: Pseudo = 0x%8x\n", + *(u32 *) & pseudo.buff[0]); + outl(*(u32 *) & pseudo.buff[2], + dev->base_addr + FT1000_REG_MAG_UFDR); + DEBUG(1, "ft1000_copy_down_pkt: Pseudo = 0x%8x\n", + *(u32 *) & pseudo.buff[2]); + outl(*(u32 *) & pseudo.buff[4], + dev->base_addr + FT1000_REG_MAG_UFDR); + DEBUG(1, "ft1000_copy_down_pkt: Pseudo = 0x%8x\n", + *(u32 *) & pseudo.buff[4]); + outl(*(u32 *) & pseudo.buff[6], + dev->base_addr + FT1000_REG_MAG_UFDR); + DEBUG(1, "ft1000_copy_down_pkt: Pseudo = 0x%8x\n", + *(u32 *) & pseudo.buff[6]); + + plong = (u32 *) packet; + // Write PPP type + IP Packet into Downlink FIFO + for (i = 0; i < (len >> 2); i++) { + outl(*plong++, dev->base_addr + FT1000_REG_MAG_UFDR); + } + + // Check for odd alignment + if (len & 0x0003) { + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:data = 0x%8x\n", + *plong); + outl(*plong++, dev->base_addr + FT1000_REG_MAG_UFDR); + } + outl(1, dev->base_addr + FT1000_REG_MAG_UFER); + } + + info->stats.tx_packets++; + // Add 14 bytes for MAC adddress plus ethernet type + info->stats.tx_bytes += (len + 14); + return SUCCESS; +} + +static struct net_device_stats *ft1000_stats(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + return (&info->stats); +} + +static int ft1000_open(struct net_device *dev) +{ + + DEBUG(0, "ft1000_hw: ft1000_open is called\n"); + + ft1000_reset_card(dev); + DEBUG(0, "ft1000_hw: ft1000_open is ended\n"); + + /* schedule ft1000_hbchk to perform periodic heartbeat checks on DSP and ASIC */ + init_timer(&poll_timer); + poll_timer.expires = jiffies + (2 * HZ); + poll_timer.data = (u_long) dev; + add_timer(&poll_timer); + + DEBUG(0, "ft1000_hw: ft1000_open is ended2\n"); + return 0; +} + +static int ft1000_close(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + + DEBUG(0, "ft1000_hw: ft1000_close()\n"); + + info->CardReady = 0; + del_timer(&poll_timer); + + if (ft1000_card_present == 1) { + DEBUG(0, "Media is down\n"); + netif_stop_queue(dev); + + ft1000_disable_interrupts(dev); + ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); + + //reset ASIC + ft1000_reset_asic(dev); + } + return 0; +} + +static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u8 *pdata; + + DEBUG(1, "ft1000_hw: ft1000_start_xmit()\n"); + if (skb == NULL) { + DEBUG(1, "ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n"); + return 0; + } + + DEBUG(1, "ft1000_hw: ft1000_start_xmit:length of packet = %d\n", + skb->len); + + pdata = (u8 *) skb->data; + + if (info->mediastate == 0) { + /* Drop packet is mediastate is down */ + DEBUG(1, "ft1000_hw:ft1000_copy_down_pkt:mediastate is down\n"); + return SUCCESS; + } + + if ((skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE)) { + /* Drop packet which has invalid size */ + DEBUG(1, + "ft1000_hw:ft1000_copy_down_pkt:invalid ethernet length\n"); + return SUCCESS; + } + ft1000_copy_down_pkt(dev, (u16 *) (pdata + ENET_HEADER_SIZE - 2), + skb->len - ENET_HEADER_SIZE + 2); + + dev_kfree_skb(skb); + + return 0; +} + +static irqreturn_t ft1000_interrupt(int irq, void *dev_id) +{ + struct net_device *dev = (struct net_device *)dev_id; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + u16 tempword; + u16 inttype; + int cnt; + + DEBUG(1, "ft1000_hw: ft1000_interrupt()\n"); + + if (info->CardReady == 0) { + ft1000_disable_interrupts(dev); + return IRQ_HANDLED; + } + + if (ft1000_chkcard(dev) == FALSE) { + ft1000_disable_interrupts(dev); + return IRQ_HANDLED; + } + + ft1000_disable_interrupts(dev); + + // Read interrupt type + inttype = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); + + // Make sure we process all interrupt before leaving the ISR due to the edge trigger interrupt type + while (inttype) { + if (inttype & ISR_DOORBELL_PEND) { + ft1000_parse_dpram_msg(dev); + } + + if (inttype & ISR_RCV) { + DEBUG(1, "Data in FIFO\n"); + + cnt = 0; + do { + // Check if we have packets in the Downlink FIFO + if (info->AsicID == ELECTRABUZZ_ID) { + tempword = + ft1000_read_reg(dev, FT1000_REG_DFIFO_STAT); + } else { + tempword = + ft1000_read_reg(dev, FT1000_REG_MAG_DFSR); + } + if (tempword & 0x1f) { + ft1000_copy_up_pkt(dev); + } else { + break; + } + cnt++; + } while (cnt < MAX_RCV_LOOP); + + } + // clear interrupts + tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); + DEBUG(1, "ft1000_hw: interrupt status register = 0x%x\n", tempword); + ft1000_write_reg(dev, FT1000_REG_SUP_ISR, tempword); + + // Read interrupt type + inttype = ft1000_read_reg (dev, FT1000_REG_SUP_ISR); + DEBUG(1,"ft1000_hw: interrupt status register after clear = 0x%x\n",inttype); + } + ft1000_enable_interrupts(dev); + return IRQ_HANDLED; +} + +void stop_ft1000_card(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv(dev); + PPROV_RECORD ptr; +// int cnt; + + DEBUG(0, "ft1000_hw: stop_ft1000_card()\n"); + + info->CardReady = 0; + ft1000_card_present = 0; + netif_stop_queue(dev); + ft1000_disable_interrupts(dev); + + // Make sure we free any memory reserve for provisioning + while (list_empty(&info->prov_list) == 0) { + ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + list_del(&ptr->list); + kfree(ptr->pprov_data); + kfree(ptr); + } + + if (info->registered) { + unregister_netdev(dev); + info->registered = 0; + } + + free_irq(dev->irq, dev); + release_region(dev->base_addr,256); + release_firmware(fw_entry); + flarion_ft1000_cnt--; + ft1000CleanupProc(dev); + +} + +static void ft1000_get_drvinfo(struct net_device *dev, + struct ethtool_drvinfo *info) +{ + FT1000_INFO *ft_info; + ft_info = (FT1000_INFO *) netdev_priv(dev); + + snprintf(info->driver, 32, "ft1000"); + snprintf(info->bus_info, ETHTOOL_BUSINFO_LEN, "PCMCIA 0x%lx", + dev->base_addr); + snprintf(info->fw_version, 32, "%d.%d.%d.%d", ft_info->DspVer[0], + ft_info->DspVer[1], ft_info->DspVer[2], ft_info->DspVer[3]); +} + +static u32 ft1000_get_link(struct net_device *dev) +{ + FT1000_INFO *info; + info = (FT1000_INFO *) netdev_priv(dev); + return info->mediastate; +} + +static const struct ethtool_ops ops = { + .get_drvinfo = ft1000_get_drvinfo, + .get_link = ft1000_get_link +}; + +struct net_device *init_ft1000_card(unsigned short irq, int port, + unsigned char *mac_addr, void *ft1000_reset, + void *link, struct device *fdev) +{ + FT1000_INFO *info; + struct net_device *dev; + int i; + + static const struct net_device_ops ft1000ops = // Slavius 21.10.2009 due to kernel changes + { + .ndo_open = &ft1000_open, + .ndo_stop = &ft1000_close, + .ndo_start_xmit = &ft1000_start_xmit, + .ndo_get_stats = &ft1000_stats, + }; + + DEBUG(1, "ft1000_hw: init_ft1000_card()\n"); + DEBUG(1, "ft1000_hw: irq = %d\n", irq); + DEBUG(1, "ft1000_hw: port = 0x%04x\n", port); + + flarion_ft1000_cnt++; + + if (flarion_ft1000_cnt > 1) { + flarion_ft1000_cnt--; + + printk(KERN_INFO + "ft1000: This driver can not support more than one instance\n"); + return NULL; + } + + dev = alloc_etherdev(sizeof(FT1000_INFO)); + if (!dev) { + printk(KERN_ERR "ft1000: failed to allocate etherdev\n"); + return NULL; + } + + SET_NETDEV_DEV(dev, fdev); + info = (FT1000_INFO *) netdev_priv(dev); + + memset(info, 0, sizeof(FT1000_INFO)); + + DEBUG(1, "address of dev = 0x%8x\n", (u32) dev); + DEBUG(1, "address of dev info = 0x%8x\n", (u32) info); + DEBUG(0, "device name = %s\n", dev->name); + + memset(&info->stats, 0, sizeof(struct net_device_stats)); + + spin_lock_init(&info->dpram_lock); + info->DrvErrNum = 0; + info->ASICResetNum = 0; + info->registered = 1; + info->link = link; + info->ft1000_reset = ft1000_reset; + info->mediastate = 0; + info->fifo_cnt = 0; + info->DeviceCreated = FALSE; + info->DeviceMajor = 0; + info->CurrentInterruptEnableMask = ISR_DEFAULT_MASK; + info->InterruptsEnabled = FALSE; + info->CardReady = 0; + info->DSP_TIME[0] = 0; + info->DSP_TIME[1] = 0; + info->DSP_TIME[2] = 0; + info->DSP_TIME[3] = 0; + flarion_ft1000_cnt = 0; + + INIT_LIST_HEAD(&info->prov_list); + + info->squeseqnum = 0; + +// dev->hard_start_xmit = &ft1000_start_xmit; +// dev->get_stats = &ft1000_stats; +// dev->open = &ft1000_open; +// dev->stop = &ft1000_close; + + dev->netdev_ops = &ft1000ops; // Slavius 21.10.2009 due to kernel changes + + DEBUG(0, "device name = %s\n", dev->name); + + for (i = 0; i < 6; i++) { + dev->dev_addr[i] = mac_addr[i]; + DEBUG(1, "ft1000_hw: mac_addr %d = 0x%02x\n", i, mac_addr[i]); + } + + netif_stop_queue(dev); + dev->irq = irq; + dev->base_addr = port; + + if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, dev)) { + printk(KERN_ERR "ft1000: Could not request_irq\n"); + kfree(dev); + return (NULL); + } + + request_region(dev->base_addr, 256, dev->name); + + if (register_netdev(dev) != 0) { + DEBUG(0, "ft1000: Could not register netdev"); + return NULL; + } + + info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID); + if (info->AsicID == ELECTRABUZZ_ID) { + DEBUG(0, "ft1000_hw: ELECTRABUZZ ASIC\n"); + if (request_firmware(&fw_entry, "ft1000.img", fdev) != 0) { + printk(KERN_INFO "ft1000: Could not open ft1000.img\n"); + unregister_netdev(dev); + free_irq(dev->irq, dev); + kfree(dev); + return NULL; + } + } else { + DEBUG(0, "ft1000_hw: MAGNEMITE ASIC\n"); + if (request_firmware(&fw_entry, "ft2000.img", fdev) != 0) { + printk(KERN_INFO "ft1000: Could not open ft2000.img\n"); + unregister_netdev(dev); + free_irq(dev->irq, dev); + kfree(dev); + return NULL; + } + } + + ft1000_enable_interrupts(dev); + + ft1000InitProc(dev); + ft1000_card_present = 1; + SET_ETHTOOL_OPS(dev, &ops); + printk(KERN_INFO + "ft1000: %s: addr 0x%04lx irq %d, MAC addr %02x:%02x:%02x:%02x:%02x:%02x\n", + dev->name, dev->base_addr, dev->irq, dev->dev_addr[0], + dev->dev_addr[1], dev->dev_addr[2], dev->dev_addr[3], + dev->dev_addr[4], dev->dev_addr[5]); + return dev; +} + +EXPORT_SYMBOL(init_ft1000_card); +EXPORT_SYMBOL(stop_ft1000_card); +EXPORT_SYMBOL(flarion_ft1000_cnt); diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c new file mode 100644 index 0000000..94b2755 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c @@ -0,0 +1,219 @@ +/*--------------------------------------------------------------------------- + FT1000 driver for Flarion Flash OFDM NIC Device + + Copyright (C) 2006 Patrik Ostrihon, All rights reserved. + Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - + Suite 330, Boston, MA 02111-1307, USA. +-----------------------------------------------------------------------------*/ + +#include +#include +#include +#include +#include +#include +#include +#include "ft1000.h" + +#define FT1000_PROC "ft1000" +#define MAX_FILE_LEN 255 + +#define PUTM_TO_PAGE(len,page,args...) \ + len += snprintf(page+len, PAGE_SIZE - len, args) + +#define PUTX_TO_PAGE(len,page,message,size,var) \ + len += snprintf(page+len, PAGE_SIZE - len, message); \ + for(i = 0; i < (size - 1); i++) \ + { \ + len += snprintf(page+len, PAGE_SIZE - len, "%02x:", var[i]); \ + } \ + len += snprintf(page+len, PAGE_SIZE - len, "%02x\n", var[i]) + +#define PUTD_TO_PAGE(len,page,message,size,var) \ + len += snprintf(page+len, PAGE_SIZE - len, message); \ + for(i = 0; i < (size - 1); i++) \ + { \ + len += snprintf(page+len, PAGE_SIZE - len, "%d.", var[i]); \ + } \ + len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i]) + +int ft1000ReadProc(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct net_device *dev; + int len; + int i; + FT1000_INFO *info; + char *status[] = + { "Idle (Disconnect)", "Searching", "Active (Connected)", + "Waiting for L2", "Sleep", "No Coverage", "", "" + }; + char *signal[] = { "", "*", "**", "***", "****" }; + int strength; + int quality; + struct timeval tv; + time_t delta; + + dev = (struct net_device *)data; + info = (FT1000_INFO *) netdev_priv(dev); + + if (off > 0) { + *eof = 1; + return 0; + } + + /* Wrap-around */ + + if (info->AsicID == ELECTRABUZZ_ID) { + if (info->DspHibernateFlag == 0) { + if (info->ProgConStat != 0xFF) { + info->LedStat = + ft1000_read_dpram(dev, FT1000_DSP_LED); + info->ConStat = + ft1000_read_dpram(dev, + FT1000_DSP_CON_STATE); + } else { + info->ConStat = 0xf; + } + } + } else { + if (info->ProgConStat != 0xFF) { + info->LedStat = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_DSP_LED, + FT1000_MAG_DSP_LED_INDX)); + info->ConStat = + ntohs(ft1000_read_dpram_mag_16 + (dev, FT1000_MAG_DSP_CON_STATE, + FT1000_MAG_DSP_CON_STATE_INDX)); + } else { + info->ConStat = 0xf; + } + } + + i = (info->LedStat) & 0xf; + switch (i) { + case 0x1: + strength = 1; + break; + case 0x3: + strength = 2; + break; + case 0x7: + strength = 3; + break; + case 0xf: + strength = 4; + break; + default: + strength = 0; + } + + i = (info->LedStat >> 8) & 0xf; + switch (i) { + case 0x1: + quality = 1; + break; + case 0x3: + quality = 2; + break; + case 0x7: + quality = 3; + break; + case 0xf: + quality = 4; + break; + default: + quality = 0; + } + + do_gettimeofday(&tv); + delta = (tv.tv_sec - info->ConTm); + len = 0; + PUTM_TO_PAGE(len, page, "Connection Time: %02ld:%02ld:%02ld\n", + ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60)); + PUTM_TO_PAGE(len, page, "Connection Time[s]: %ld\n", delta); + PUTM_TO_PAGE(len, page, "Asic ID: %s\n", + (info->AsicID) == + ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC"); + PUTX_TO_PAGE(len, page, "SKU: ", SKUSZ, info->Sku); + PUTX_TO_PAGE(len, page, "EUI64: ", EUISZ, info->eui64); + PUTD_TO_PAGE(len, page, "DSP version number: ", DSPVERSZ, info->DspVer); + PUTX_TO_PAGE(len, page, "Hardware Serial Number: ", HWSERNUMSZ, + info->HwSerNum); + PUTX_TO_PAGE(len, page, "Caliberation Version: ", CALVERSZ, + info->RfCalVer); + PUTD_TO_PAGE(len, page, "Caliberation Date: ", CALDATESZ, + info->RfCalDate); + PUTM_TO_PAGE(len, page, "Media State: %s\n", + (info->mediastate) ? "link" : "no link"); + PUTM_TO_PAGE(len, page, "Connection Status: %s\n", + status[((info->ConStat) & 0x7)]); + PUTM_TO_PAGE(len, page, "RX packets: %ld\n", info->stats.rx_packets); + PUTM_TO_PAGE(len, page, "TX packets: %ld\n", info->stats.tx_packets); + PUTM_TO_PAGE(len, page, "RX bytes: %ld\n", info->stats.rx_bytes); + PUTM_TO_PAGE(len, page, "TX bytes: %ld\n", info->stats.tx_bytes); + PUTM_TO_PAGE(len, page, "Signal Strength: %s\n", signal[strength]); + PUTM_TO_PAGE(len, page, "Signal Quality: %s\n", signal[quality]); + return len; +} + +static int ft1000NotifyProc(struct notifier_block *this, unsigned long event, + void *ptr) +{ + struct net_device *dev = ptr; + FT1000_INFO *info; + + info = (FT1000_INFO *) netdev_priv(dev); + + switch (event) { + case NETDEV_CHANGENAME: + remove_proc_entry(info->netdevname, info->proc_ft1000); + create_proc_read_entry(dev->name, 0644, info->proc_ft1000, + ft1000ReadProc, dev); + snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name); + break; + } + return NOTIFY_DONE; +} + +static struct notifier_block ft1000_netdev_notifier = { + .notifier_call = ft1000NotifyProc +}; + +void ft1000InitProc(struct net_device *dev) +{ + FT1000_INFO *info; + + info = (FT1000_INFO *) netdev_priv(dev); + + info->proc_ft1000 = proc_mkdir(FT1000_PROC, init_net.proc_net); + create_proc_read_entry(dev->name, 0644, info->proc_ft1000, + ft1000ReadProc, dev); + snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name); + register_netdevice_notifier(&ft1000_netdev_notifier); +} + +void ft1000CleanupProc(struct net_device *dev) +{ + FT1000_INFO *info; + + info = (FT1000_INFO *) netdev_priv(dev); + + remove_proc_entry(dev->name, info->proc_ft1000); + remove_proc_entry(FT1000_PROC, init_net.proc_net); + unregister_netdevice_notifier(&ft1000_netdev_notifier); +} + +EXPORT_SYMBOL(ft1000InitProc); +EXPORT_SYMBOL(ft1000CleanupProc); diff --git a/drivers/staging/ft1000/ft1000-usb/Makefile b/drivers/staging/ft1000/ft1000-usb/Makefile new file mode 100644 index 0000000..7845c47a --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_FT1000_USB) += ft1000.o + +ft1000-objs := ft1000_chdev.o ft1000_download.o ft1000_hw.o ft1000_proc.o ft1000_usb.o diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c b/drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c new file mode 100644 index 0000000..c135c9d --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_chdev.c @@ -0,0 +1,934 @@ +//--------------------------------------------------------------------------- +// FT1000 driver for Flarion Flash OFDM NIC Device +// +// Copyright (C) 2006 Flarion Technologies, All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) any +// later version. This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - +// Suite 330, Boston, MA 02111-1307, USA. +//--------------------------------------------------------------------------- +// +// File: ft1000_chdev.c +// +// Description: Custom character device dispatch routines. +// +// History: +// 8/29/02 Whc Ported to Linux. +// 6/05/06 Whc Porting to Linux 2.6.9 +// +//--------------------------------------------------------------------------- +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "ft1000_usb.h" +//#include "ft1000_ioctl.h" + +void ft1000_DestroyDevice(struct net_device *dev); +u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, u8 highlow); +u16 ft1000_read_register(struct ft1000_device *ft1000dev, short* Data, u16 nRegIndx); + +extern inline u16 ft1000_asic_read (struct net_device *dev, u16 offset); +extern inline void ft1000_asic_write (struct net_device *dev, u16 offset, u16 value); +extern void CardSendCommand(struct ft1000_device *ft1000dev, unsigned short *ptempbuffer, int size); + +static int ft1000_ChOpen (struct inode *Inode, struct file *File); +static unsigned int ft1000_ChPoll(struct file *file, poll_table *wait); +static int ft1000_ChIoctl (struct inode *Inode, struct file *File, unsigned int Command, + unsigned long Argument); +static int ft1000_ChRelease (struct inode *Inode, struct file *File); + +static int ft1000_flarion_cnt = 0; + +//need to looking usage of ft1000Handle + + + +// Global pointer to device object +static struct ft1000_device *pdevobj[MAX_NUM_CARDS + 2]; +//static devfs_handle_t ft1000Handle[MAX_NUM_CARDS]; + +// List to free receive command buffer pool +struct list_head freercvpool; + +// lock to arbitrate free buffer list for receive command data +spinlock_t free_buff_lock; + +int numofmsgbuf = 0; + +// Global variable to indicate that all provisioning data is sent to DSP +//BOOLEAN fProvComplete; + +// +// Table of entry-point routines for char device +// +static struct file_operations ft1000fops = +{ + ioctl: ft1000_ChIoctl, + poll: ft1000_ChPoll, + open: ft1000_ChOpen, + release: ft1000_ChRelease +}; + + + + +//--------------------------------------------------------------------------- +// Function: exec_mknod +// +// Parameters: +// +// Returns: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +static int exec_mknod (void *pdata) +{ + PFT1000_INFO info; + char mjnum[4]; + char minornum[4]; + char temp[32]; + int retcode; +// int i; //aelias [-] reason : unused variable + char *envp[] = { "HOME=/", "PATH=/usr/bin:/bin", NULL }; + char *argv[]={"-m 666",temp,"c",mjnum,minornum,NULL}; + + info = pdata; + DEBUG("ft1000_chdev:exec_mknod is called with major number = %d\n", info->DeviceMajor); + sprintf(temp, "%s%s", "/dev/", info->DeviceName) ; + sprintf(mjnum, "%d", info->DeviceMajor); + sprintf(minornum, "%d", info->CardNumber); + + //char *argv[]={"mknod","-m 666",temp,"c",mjnum,minornum,NULL}; +// char *argv[]={"-m 666",temp,"c",mjnum,minornum,NULL}; + + //for (i=0; i<7;i++) + // DEBUG("argv[%d]=%s\n", i, argv[i]); + + + retcode = call_usermodehelper ("/bin/mknod", argv, envp, 1); + if (retcode) { + DEBUG("ft1000_chdev:exec_mknod failed to make the node: retcode = %d\n", retcode); + } + + + + return retcode; + +} + +//--------------------------------------------------------------------------- +// Function: rm_mknod +// +// Description: This module removes the FT1000 device file +// +//--------------------------------------------------------------------------- +static int rm_mknod (void *pdata) +{ + + PFT1000_INFO info; + //char *argv[4]={"rm", "-f", "/dev/FT1000", NULL}; + int retcode; + char temp[32]; + char *argv[]={"rm", "-f", temp, NULL}; + + info = (PFT1000_INFO)pdata; + DEBUG("ft1000_chdev:rm_mknod is called for device %s\n", info->DeviceName); + sprintf(temp, "%s%s", "/dev/", info->DeviceName) ; + +// char *argv[]={"rm", "-f", temp, NULL}; + + retcode = call_usermodehelper ("/bin/rm", argv, NULL, 1); + if (retcode) { + DEBUG("ft1000_chdev:rm_mknod failed to remove the node: retcode = %d\n", retcode); + } + else + DEBUG("ft1000_chdev:rm_mknod done!\n"); + + + return retcode; + +} +//--------------------------------------------------------------------------- +// Function: ft1000_get_buffer +// +// Parameters: +// +// Returns: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +PDPRAM_BLK ft1000_get_buffer (struct list_head *bufflist) +{ + unsigned long flags; + PDPRAM_BLK ptr; + + spin_lock_irqsave(&free_buff_lock, flags); + // Check if buffer is available + if ( list_empty(bufflist) ) { + DEBUG("ft1000_get_buffer: No more buffer - %d\n", numofmsgbuf); + ptr = NULL; + } + else { + numofmsgbuf--; + ptr = list_entry(bufflist->next, DPRAM_BLK, list); + list_del(&ptr->list); + //DEBUG("ft1000_get_buffer: number of free msg buffers = %d\n", numofmsgbuf); + } + spin_unlock_irqrestore(&free_buff_lock, flags); + + return ptr; +} + + + + +//--------------------------------------------------------------------------- +// Function: ft1000_free_buffer +// +// Parameters: +// +// Returns: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +void ft1000_free_buffer (PDPRAM_BLK pdpram_blk, struct list_head *plist) +{ + unsigned long flags; + + spin_lock_irqsave(&free_buff_lock, flags); + // Put memory back to list + list_add_tail(&pdpram_blk->list, plist); + numofmsgbuf++; + //DEBUG("ft1000_free_buffer: number of free msg buffers = %d\n", numofmsgbuf); + spin_unlock_irqrestore(&free_buff_lock, flags); +} + +//--------------------------------------------------------------------------- +// Function: ft1000_CreateDevice +// +// Parameters: dev - pointer to adapter object +// +// Returns: 0 if successful +// +// Description: Creates a private char device. +// +// Notes: Only called by init_module(). +// +//--------------------------------------------------------------------------- +int ft1000_CreateDevice(struct ft1000_device *dev) +{ + PFT1000_INFO info = netdev_priv(dev->net); + int result; + int i; + pid_t pid; + + // make a new device name + sprintf(info->DeviceName, "%s%d", "FT100", info->CardNumber); + + // Delete any existing FT1000 node + pid = kernel_thread (rm_mknod,(void *)info, 0); + msleep(1000); + + DEBUG("ft1000_CreateDevice: number of instance = %d\n", ft1000_flarion_cnt); + DEBUG("DeviceCreated = %x\n", info->DeviceCreated); + + //save the device info to global array + pdevobj[info->CardNumber] = dev; + + DEBUG("ft1000_CreateDevice: ******SAVED pdevobj[%d]=%x\n", info->CardNumber, (unsigned int)pdevobj[info->CardNumber]); //aelias [+] reason:up + + if (info->DeviceCreated) + { + DEBUG("ft1000_CreateDevice: \"%s\" already registered\n", info->DeviceName); + return -EIO; + } + + + // register the device + DEBUG("ft1000_CreateDevice: \"%s\" device registration\n", info->DeviceName); + info->DeviceMajor = 0; + + result = register_chrdev(info->DeviceMajor, info->DeviceName, &ft1000fops); + if (result < 0) + { + DEBUG("ft1000_CreateDevice: unable to get major %d\n", info->DeviceMajor); + return result; + } + + DEBUG("ft1000_CreateDevice: registered char device \"%s\"\n", info->DeviceName); + + // save a dynamic device major number + if (info->DeviceMajor == 0) + { + info->DeviceMajor = result; + DEBUG("ft1000_PcdCreateDevice: device major = %d\n", info->DeviceMajor); + } + + // Create a thread to call user mode app to mknod + pid = kernel_thread (exec_mknod, (void *)info, 0); + + // initialize application information + info->appcnt = 0; + +// if (ft1000_flarion_cnt == 0) { +// +// DEBUG("Initialize free_buff_lock and freercvpool\n"); +// spin_lock_init(&free_buff_lock); +// +// // initialize a list of buffers to be use for queuing up receive command data +// INIT_LIST_HEAD (&freercvpool); +// +// // create list of free buffers +// for (i=0; ipbuffer = kmalloc ( MAX_CMD_SQSIZE, GFP_KERNEL ); +// // link provisioning data +// list_add_tail (&pdpram_blk->list, &freercvpool); +// } +// numofmsgbuf = NUM_OF_FREE_BUFFERS; +// } + + + // initialize application information + info->appcnt = 0; + for (i=0; iapp_info[i].nTxMsg = 0; + info->app_info[i].nRxMsg = 0; + info->app_info[i].nTxMsgReject = 0; + info->app_info[i].nRxMsgMiss = 0; + info->app_info[i].fileobject = 0; + info->app_info[i].app_id = i+1; + info->app_info[i].DspBCMsgFlag = 0; + info->app_info[i].NumOfMsg = 0; + init_waitqueue_head(&info->app_info[i].wait_dpram_msg); + INIT_LIST_HEAD (&info->app_info[i].app_sqlist); + } + + + + +// ft1000Handle[info->CardNumber] = devfs_register(NULL, info->DeviceName, DEVFS_FL_AUTO_DEVNUM, 0, 0, +// S_IFCHR | S_IRUGO | S_IWUGO, &ft1000fops, NULL); + + + info->DeviceCreated = TRUE; + ft1000_flarion_cnt++; + + return result; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_DestroyDeviceDEBUG +// +// Parameters: dev - pointer to adapter object +// +// Description: Destroys a private char device. +// +// Notes: Only called by cleanup_module(). +// +//--------------------------------------------------------------------------- +void ft1000_DestroyDevice(struct net_device *dev) +{ + PFT1000_INFO info = netdev_priv(dev); + int result = 0; + pid_t pid; + int i; + PDPRAM_BLK pdpram_blk; + DPRAM_BLK *ptr; + + DEBUG("ft1000_chdev:ft1000_DestroyDevice called\n"); + + + + if (info->DeviceCreated) + { + ft1000_flarion_cnt--; + unregister_chrdev(info->DeviceMajor, info->DeviceName); + DEBUG("ft1000_DestroyDevice: unregistered device \"%s\", result = %d\n", + info->DeviceName, result); + + pid = kernel_thread (rm_mknod, (void *)info, 0); + + // Make sure we free any memory reserve for slow Queue + for (i=0; iapp_info[i].app_sqlist) == 0) { + pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, DPRAM_BLK, list); + list_del(&pdpram_blk->list); + ft1000_free_buffer(pdpram_blk, &freercvpool); + + } + wake_up_interruptible(&info->app_info[i].wait_dpram_msg); + } + + // Remove buffer allocated for receive command data + if (ft1000_flarion_cnt == 0) { + while (list_empty(&freercvpool) == 0) { + ptr = list_entry(freercvpool.next, DPRAM_BLK, list); + list_del(&ptr->list); + kfree(ptr->pbuffer); + kfree(ptr); + } + } + +// devfs_unregister(ft1000Handle[info->CardNumber]); + + info->DeviceCreated = FALSE; + + pdevobj[info->CardNumber] = NULL; + } + + +} + +//--------------------------------------------------------------------------- +// Function: ft1000_ChOpen +// +// Parameters: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_ChOpen (struct inode *Inode, struct file *File) +{ + PFT1000_INFO info; + int i,num; + + DEBUG("ft1000_ChOpen called\n"); + num = (MINOR(Inode->i_rdev) & 0xf); + DEBUG("ft1000_ChOpen: minor number=%d\n", num); + + for (i=0; i<5; i++) + DEBUG("pdevobj[%d]=%x\n", i, (unsigned int)pdevobj[i]); //aelias [+] reason: down + + if ( pdevobj[num] != NULL ) + //info = (PFT1000_INFO)(pdevobj[num]->net->priv); + info = (FT1000_INFO *) netdev_priv (pdevobj[num]->net); + else + { + DEBUG("ft1000_ChOpen: can not find device object %d\n", num); + return -1; + } + + DEBUG("f_owner = 0x%8x number of application = %d\n", (u32)(&File->f_owner), info->appcnt ); + + // Check if maximum number of application exceeded + if (info->appcnt > MAX_NUM_APP) { + DEBUG("Maximum number of application exceeded\n"); + return -EACCES; + } + + // Search for available application info block + for (i=0; iapp_info[i].fileobject == 0) ) { + break; + } + } + + // Fail due to lack of application info block + if (i == MAX_NUM_APP) { + DEBUG("Could not find an application info block\n"); + return -EACCES; + } + + info->appcnt++; + info->app_info[i].fileobject = (u32)(&File->f_owner); + info->app_info[i].nTxMsg = 0; + info->app_info[i].nRxMsg = 0; + info->app_info[i].nTxMsgReject = 0; + info->app_info[i].nRxMsgMiss = 0; + + File->private_data = pdevobj[num]->net; + + return 0; +} + + +//--------------------------------------------------------------------------- +// Function: ft1000_ChPoll +// +// Parameters: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- + +static unsigned int ft1000_ChPoll(struct file *file, poll_table *wait) +{ + struct net_device *dev = file->private_data; + PFT1000_INFO info; + int i; + + //DEBUG("ft1000_ChPoll called\n"); + if (ft1000_flarion_cnt == 0) { + DEBUG("FT1000:ft1000_ChPoll called when ft1000_flarion_cnt is zero\n"); + return (-EBADF); + } + + info = (FT1000_INFO *) netdev_priv (dev); + + // Search for matching file object + for (i=0; iapp_info[i].fileobject == (u32)(&file->f_owner) ) { + //DEBUG("FT1000:ft1000_ChIoctl: Message is for AppId = %d\n", info->app_info[i].app_id); + break; + } + } + + // Could not find application info block + if (i == MAX_NUM_APP) { + DEBUG("FT1000:ft1000_ChIoctl:Could not find application info block\n"); + return ( -EACCES ); + } + + if (list_empty(&info->app_info[i].app_sqlist) == 0) { + DEBUG("FT1000:ft1000_ChPoll:Message detected in slow queue\n"); + return(POLLIN | POLLRDNORM | POLLPRI); + } + + poll_wait (file, &info->app_info[i].wait_dpram_msg, wait); + //DEBUG("FT1000:ft1000_ChPoll:Polling for data from DSP\n"); + + return (0); +} + +//--------------------------------------------------------------------------- +// Function: ft1000_ChIoctl +// +// Parameters: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_ChIoctl (struct inode *Inode, struct file *File, unsigned int Command, + unsigned long Argument) +{ + struct net_device *dev; + PFT1000_INFO info; + struct ft1000_device *ft1000dev; + int result=0; + int cmd; + int i; + u16 tempword; + unsigned long flags; + struct timeval tv; + IOCTL_GET_VER get_ver_data; + IOCTL_GET_DSP_STAT get_stat_data; + u8 ConnectionMsg[] = {0x00,0x44,0x10,0x20,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x93,0x64, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0a, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x02,0x37,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x7f,0x00, + 0x00,0x01,0x00,0x00}; + + unsigned short ledStat=0; + unsigned short conStat=0; + + //DEBUG("ft1000_ChIoctl called\n"); + + if (ft1000_flarion_cnt == 0) { + DEBUG("FT1000:ft1000_ChIoctl called when ft1000_flarion_cnt is zero\n"); + return (-EBADF); + } + + //DEBUG("FT1000:ft1000_ChIoctl:Command = 0x%x Argument = 0x%8x\n", Command, (u32)Argument); + + dev = File->private_data; + info = (FT1000_INFO *) netdev_priv (dev); + ft1000dev = info->pFt1000Dev; + cmd = _IOC_NR(Command); + //DEBUG("FT1000:ft1000_ChIoctl:cmd = 0x%x\n", cmd); + + // process the command + switch (cmd) { + case IOCTL_REGISTER_CMD: + DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_REGISTER called\n"); + result = get_user(tempword, (unsigned short *)Argument); + if (result) { + DEBUG("result = %d failed to get_user\n", result); + break; + } + if (tempword == DSPBCMSGID) { + // Search for matching file object + for (i=0; iapp_info[i].fileobject == (u32)(&File->f_owner) ) { + info->app_info[i].DspBCMsgFlag = 1; + DEBUG("FT1000:ft1000_ChIoctl:Registered for broadcast messages\n"); + break; + } + } + } + break; + + case IOCTL_GET_VER_CMD: + DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_GET_VER called\n"); + + get_ver_data.drv_ver = FT1000_DRV_VER; + + if (copy_to_user((PIOCTL_GET_VER)Argument, &get_ver_data, sizeof(get_ver_data)) ) { + DEBUG("FT1000:ft1000_ChIoctl: copy fault occurred\n"); + result = -EFAULT; + break; + } + + DEBUG("FT1000:ft1000_ChIoctl:driver version = 0x%x\n",(unsigned int)get_ver_data.drv_ver); + + break; + case IOCTL_CONNECT: + // Connect Message + DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_CONNECT\n"); + ConnectionMsg[79] = 0xfc; + CardSendCommand(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c); + + break; + case IOCTL_DISCONNECT: + // Disconnect Message + DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_DISCONNECT\n"); + ConnectionMsg[79] = 0xfd; + CardSendCommand(ft1000dev, (unsigned short *)ConnectionMsg, 0x4c); + break; + case IOCTL_GET_DSP_STAT_CMD: + //DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_GET_DSP_STAT called\n"); + + memcpy(get_stat_data.DspVer, info->DspVer, DSPVERSZ); + memcpy(get_stat_data.HwSerNum, info->HwSerNum, HWSERNUMSZ); + memcpy(get_stat_data.Sku, info->Sku, SKUSZ); + memcpy(get_stat_data.eui64, info->eui64, EUISZ); + + if (info->ProgConStat != 0xFF) { + ft1000_read_dpram16(ft1000dev, FT1000_MAG_DSP_LED, (PUCHAR)&ledStat, FT1000_MAG_DSP_LED_INDX); + get_stat_data.LedStat = ntohs(ledStat); + DEBUG("FT1000:ft1000_ChIoctl: LedStat = 0x%x\n", get_stat_data.LedStat); + ft1000_read_dpram16(ft1000dev, FT1000_MAG_DSP_CON_STATE, (PUCHAR)&conStat, FT1000_MAG_DSP_CON_STATE_INDX); + get_stat_data.ConStat = ntohs(conStat); + DEBUG("FT1000:ft1000_ChIoctl: ConStat = 0x%x\n", get_stat_data.ConStat); + } + else { + get_stat_data.ConStat = 0x0f; + } + + + get_stat_data.nTxPkts = info->stats.tx_packets; + get_stat_data.nRxPkts = info->stats.rx_packets; + get_stat_data.nTxBytes = info->stats.tx_bytes; + get_stat_data.nRxBytes = info->stats.rx_bytes; + do_gettimeofday ( &tv ); + get_stat_data.ConTm = (u32)(tv.tv_sec - info->ConTm); + DEBUG("Connection Time = %d\n", (int)get_stat_data.ConTm); + if (copy_to_user((PIOCTL_GET_DSP_STAT)Argument, &get_stat_data, sizeof(get_stat_data)) ) { + DEBUG("FT1000:ft1000_ChIoctl: copy fault occurred\n"); + result = -EFAULT; + break; + } + DEBUG("ft1000_chioctl: GET_DSP_STAT succeed\n"); + break; + case IOCTL_SET_DPRAM_CMD: + { + IOCTL_DPRAM_BLK dpram_data; + //IOCTL_DPRAM_COMMAND dpram_command; + USHORT qtype; + USHORT msgsz; + PPSEUDO_HDR ppseudo_hdr; + PUSHORT pmsg; + USHORT total_len; + USHORT app_index; + u16 status; + + //DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_SET_DPRAM called\n"); + + + if (ft1000_flarion_cnt == 0) { + return (-EBADF); + } + + if (info->DrvMsgPend) { + return (-ENOTTY); + } + + if ( (info->DspAsicReset) || (info->fProvComplete == 0) ) { + return (-EACCES); + } + + info->fAppMsgPend = 1; + + if (info->CardReady) { + + //DEBUG("FT1000:ft1000_ChIoctl: try to SET_DPRAM \n"); + + // Get the length field to see how many bytes to copy + result = get_user(msgsz, (unsigned short *)Argument); + msgsz = ntohs (msgsz); + //DEBUG("FT1000:ft1000_ChIoctl: length of message = %d\n", msgsz); + + if (msgsz > MAX_CMD_SQSIZE) { + DEBUG("FT1000:ft1000_ChIoctl: bad message length = %d\n", msgsz); + result = -EINVAL; + break; + } + + //if ( copy_from_user(&(dpram_command.dpram_blk), (PIOCTL_DPRAM_BLK)Argument, msgsz+2) ) { + if ( copy_from_user(&dpram_data, (PIOCTL_DPRAM_BLK)Argument, msgsz+2) ) { + DEBUG("FT1000:ft1000_ChIoctl: copy fault occurred\n"); + result = -EFAULT; + } + else { +#if 0 + // whc - for debugging only + ptr = (char *)&dpram_data; + for (i=0; iapp_info[i].fileobject == (u32)(&File->f_owner) ) { + break; + } + } + if (i==MAX_NUM_APP) { + DEBUG("FT1000:No matching application fileobject\n"); + result = -EINVAL; + break; + } + app_index = i; + + // Check message qtype type which is the lower byte within qos_class + //qtype = ntohs(dpram_command.dpram_blk.pseudohdr.qos_class) & 0xff; + qtype = ntohs(dpram_data.pseudohdr.qos_class) & 0xff; + //DEBUG("FT1000_ft1000_ChIoctl: qtype = %d\n", qtype); + if (qtype) { + } + else { + // Put message into Slow Queue + // Only put a message into the DPRAM if msg doorbell is available + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); + //DEBUG("FT1000_ft1000_ChIoctl: READ REGISTER tempword=%x\n", tempword); + if (tempword & FT1000_DB_DPRAM_TX) { + // Suspend for 2ms and try again due to DSP doorbell busy + mdelay(2); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + // Suspend for 1ms and try again due to DSP doorbell busy + mdelay(1); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + // Suspend for 3ms and try again due to DSP doorbell busy + mdelay(3); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + DEBUG("FT1000:ft1000_ChIoctl:Doorbell not available\n"); + result = -ENOTTY; + break; + } + } + } + } + } + + //DEBUG("FT1000_ft1000_ChIoctl: finished reading register\n"); + + // Make sure we are within the limits of the slow queue memory limitation + if ( (msgsz < MAX_CMD_SQSIZE) && (msgsz > PSEUDOSZ) ) { + // Need to put sequence number plus new checksum for message + //pmsg = (PUSHORT)&dpram_command.dpram_blk.pseudohdr; + pmsg = (PUSHORT)&dpram_data.pseudohdr; + ppseudo_hdr = (PPSEUDO_HDR)pmsg; + total_len = msgsz+2; + if (total_len & 0x1) { + total_len++; + } + + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + ppseudo_hdr->portsrc = info->app_info[app_index].app_id; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum); + for (i=1; i<7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum); + } + pmsg++; + ppseudo_hdr = (PPSEUDO_HDR)pmsg; +#if 0 + ptr = (char *)&dpram_data; + DEBUG("FT1000:ft1000_ChIoctl: Command Send\n"); + for (i=0; iapp_info[app_index].nTxMsg++; + break; + } + else { + result = -EINVAL; + break; + } + } + } + } + else { + DEBUG("FT1000:ft1000_ChIoctl: Card not ready take messages\n"); + result = -EACCES; + } + + } + break; + case IOCTL_GET_DPRAM_CMD: + { + PDPRAM_BLK pdpram_blk; + PIOCTL_DPRAM_BLK pioctl_dpram; + int msglen; + + //DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_GET_DPRAM called\n"); + + if (ft1000_flarion_cnt == 0) { + return (-EBADF); + } + + // Search for matching file object + for (i=0; iapp_info[i].fileobject == (u32)(&File->f_owner) ) { + //DEBUG("FT1000:ft1000_ChIoctl: Message is for AppId = %d\n", info->app_info[i].app_id); + break; + } + } + + // Could not find application info block + if (i == MAX_NUM_APP) { + DEBUG("FT1000:ft1000_ChIoctl:Could not find application info block\n"); + result = -EBADF; + break; + } + + result = 0; + pioctl_dpram = (PIOCTL_DPRAM_BLK)Argument; + if (list_empty(&info->app_info[i].app_sqlist) == 0) { + //DEBUG("FT1000:ft1000_ChIoctl:Message detected in slow queue\n"); + spin_lock_irqsave(&free_buff_lock, flags); + pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, DPRAM_BLK, list); + list_del(&pdpram_blk->list); + info->app_info[i].NumOfMsg--; + //DEBUG("FT1000:ft1000_ChIoctl:NumOfMsg for app %d = %d\n", i, info->app_info[i].NumOfMsg); + spin_unlock_irqrestore(&free_buff_lock, flags); + msglen = ntohs(*(u16 *)pdpram_blk->pbuffer) + PSEUDOSZ; + pioctl_dpram->total_len = htons(msglen); + //DEBUG("FT1000:ft1000_ChIoctl:msg length = %x\n", msglen); + if(copy_to_user (&pioctl_dpram->pseudohdr, pdpram_blk->pbuffer, msglen)) + { + DEBUG("FT1000:ft1000_ChIoctl: copy fault occurred\n"); + result = -EFAULT; + break; + } + + ft1000_free_buffer(pdpram_blk, &freercvpool); + result = msglen; + } + //DEBUG("FT1000:ft1000_ChIoctl: IOCTL_FT1000_GET_DPRAM no message\n"); + } + break; + + default: + DEBUG("FT1000:ft1000_ChIoctl:unknown command: 0x%x\n", Command); + result = -ENOTTY; + break; + } + info->fAppMsgPend = 0; + return result; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_ChRelease +// +// Parameters: +// +// Description: +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_ChRelease (struct inode *Inode, struct file *File) +{ + PFT1000_INFO info; + struct net_device *dev; + int i; + PDPRAM_BLK pdpram_blk; + + DEBUG("ft1000_ChRelease called\n"); + + dev = File->private_data; + info = (FT1000_INFO *) netdev_priv (dev); + + if (ft1000_flarion_cnt == 0) { + info->appcnt--; + return (-EBADF); + } + + // Search for matching file object + for (i=0; iapp_info[i].fileobject == (u32)(&File->f_owner) ) { + //DEBUG("FT1000:ft1000_ChIoctl: Message is for AppId = %d\n", info->app_info[i].app_id); + break; + } + } + + if (i==MAX_NUM_APP) + return 0; + + while (list_empty(&info->app_info[i].app_sqlist) == 0) { + DEBUG("Remove and free memory queue up on slow queue\n"); + pdpram_blk = list_entry(info->app_info[i].app_sqlist.next, DPRAM_BLK, list); + list_del(&pdpram_blk->list); + ft1000_free_buffer(pdpram_blk, &freercvpool); + } + + // initialize application information + info->appcnt--; + DEBUG("ft1000_chdev:%s:appcnt = %d\n", __FUNCTION__, info->appcnt); + info->app_info[i].fileobject = 0; + + return 0; +} + diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_download.c b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c new file mode 100644 index 0000000..4751a1d --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_download.c @@ -0,0 +1,1416 @@ +//===================================================== +// CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. +// +// +// This file is part of Express Card USB Driver +// +// $Id: +//==================================================== +// 20090926; aelias; removed compiler warnings; ubuntu 9.04; 2.6.28-15-generic + +#include +#include +#include +#include +#include +#include +#include +#include "ft1000_usb.h" + +#define FIFO_DNLD 1 + +#define DWNLD_HANDSHAKE_LOC 0x02 +#define DWNLD_TYPE_LOC 0x04 +#define DWNLD_SIZE_MSW_LOC 0x06 +#define DWNLD_SIZE_LSW_LOC 0x08 +#define DWNLD_PS_HDR_LOC 0x0A + +#define MAX_DSP_WAIT_LOOPS 40 +#define DSP_WAIT_SLEEP_TIME 1000 /* 1 millisecond */ +#define DSP_WAIT_DISPATCH_LVL 50 /* 50 usec */ + +#define HANDSHAKE_TIMEOUT_VALUE 0xF1F1 +#define HANDSHAKE_RESET_VALUE 0xFEFE /* When DSP requests startover */ +#define HANDSHAKE_RESET_VALUE_USB 0xFE7E /* When DSP requests startover */ +#define HANDSHAKE_DSP_BL_READY 0xFEFE /* At start DSP writes this when bootloader ready */ +#define HANDSHAKE_DSP_BL_READY_USB 0xFE7E /* At start DSP writes this when bootloader ready */ +#define HANDSHAKE_DRIVER_READY 0xFFFF /* Driver writes after receiving 0xFEFE */ +#define HANDSHAKE_SEND_DATA 0x0000 /* DSP writes this when ready for more data */ + +#define HANDSHAKE_REQUEST 0x0001 /* Request from DSP */ +#define HANDSHAKE_RESPONSE 0x0000 /* Satisfied DSP request */ + +#define REQUEST_CODE_LENGTH 0x0000 +#define REQUEST_RUN_ADDRESS 0x0001 +#define REQUEST_CODE_SEGMENT 0x0002 /* In WORD count */ +#define REQUEST_DONE_BL 0x0003 +#define REQUEST_DONE_CL 0x0004 +#define REQUEST_VERSION_INFO 0x0005 +#define REQUEST_CODE_BY_VERSION 0x0006 +#define REQUEST_MAILBOX_DATA 0x0007 +#define REQUEST_FILE_CHECKSUM 0x0008 + +#define STATE_START_DWNLD 0x01 +#define STATE_BOOT_DWNLD 0x02 +#define STATE_CODE_DWNLD 0x03 +#define STATE_DONE_DWNLD 0x04 +#define STATE_SECTION_PROV 0x05 +#define STATE_DONE_PROV 0x06 +#define STATE_DONE_FILE 0x07 + +#define MAX_LENGTH 0x7f0 + +// Temporary download mechanism for Magnemite +#define DWNLD_MAG_TYPE_LOC 0x00 +#define DWNLD_MAG_LEN_LOC 0x01 +#define DWNLD_MAG_ADDR_LOC 0x02 +#define DWNLD_MAG_CHKSUM_LOC 0x03 +#define DWNLD_MAG_VAL_LOC 0x04 + +#define HANDSHAKE_MAG_DSP_BL_READY 0xFEFE0000 /* At start DSP writes this when bootloader ready */ +#define HANDSHAKE_MAG_DSP_ENTRY 0x01000000 /* Dsp writes this to request for entry address */ +#define HANDSHAKE_MAG_DSP_DATA 0x02000000 /* Dsp writes this to request for data block */ +#define HANDSHAKE_MAG_DSP_DONE 0x03000000 /* Dsp writes this to indicate download done */ + +#define HANDSHAKE_MAG_DRV_READY 0xFFFF0000 /* Driver writes this to indicate ready to download */ +#define HANDSHAKE_MAG_DRV_DATA 0x02FECDAB /* Driver writes this to indicate data available to DSP */ +#define HANDSHAKE_MAG_DRV_ENTRY 0x01FECDAB /* Driver writes this to indicate entry point to DSP */ + +#define HANDSHAKE_MAG_TIMEOUT_VALUE 0xF1F1 + + +// New Magnemite downloader +#define DWNLD_MAG1_HANDSHAKE_LOC 0x00 +#define DWNLD_MAG1_TYPE_LOC 0x01 +#define DWNLD_MAG1_SIZE_LOC 0x02 +#define DWNLD_MAG1_PS_HDR_LOC 0x03 + +#pragma pack (push, pack_save, 1) +typedef struct _DSP_FILE_HDR { + long build_date; + long dsp_coff_date; + long loader_code_address; + long loader_code_size; + long loader_code_end; + long dsp_code_address; + long dsp_code_size; + long dsp_code_end; + long reserved[8]; +} DSP_FILE_HDR, *PDSP_FILE_HDR; + +typedef struct _DSP_FILE_HDR_5 { + long version_id; // Version ID of this image format. + long package_id; // Package ID of code release. + long build_date; // Date/time stamp when file was built. + long commands_offset; // Offset to attached commands in Pseudo Hdr format. + long loader_offset; // Offset to bootloader code. + long loader_code_address; // Start address of bootloader. + long loader_code_end; // Where bootloader code ends. + long loader_code_size; + long version_data_offset; // Offset were scrambled version data begins. + long version_data_size; // Size, in words, of scrambled version data. + long nDspImages; // Number of DSP images in file. +} DSP_FILE_HDR_5, * PDSP_FILE_HDR_5; + +typedef struct _DSP_IMAGE_INFO { + long coff_date; // Date/time when DSP Coff image was built. + long begin_offset; // Offset in file where image begins. + long end_offset; // Offset in file where image begins. + long run_address; // On chip Start address of DSP code. + long image_size; // Size of image. + long version; // Embedded version # of DSP code. +} DSP_IMAGE_INFO, *PDSP_IMAGE_INFO; + +typedef struct _DSP_IMAGE_INFO_V6 { + long coff_date; // Date/time when DSP Coff image was built. + long begin_offset; // Offset in file where image begins. + long end_offset; // Offset in file where image begins. + long run_address; // On chip Start address of DSP code. + long image_size; // Size of image. + long version; // Embedded version # of DSP code. + unsigned short checksum; // DSP File checksum + unsigned short pad1; +} DSP_IMAGE_INFO_V6, *PDSP_IMAGE_INFO_V6; + + +u16 ft1000_read_register(struct ft1000_device *ft1000dev, short* Data, u16 nRegIndx); +u16 ft1000_write_register(struct ft1000_device *ft1000dev, USHORT value, u16 nRegIndx); +u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt); +u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt); +u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, u8 highlow); +u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, USHORT indx, USHORT value, u8 highlow); +u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer); +u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer); + +//--------------------------------------------------------------------------- +// Function: getfw +// +// Parameters: char *fn - input DSP image file name +// int *pimgsz - output DSP image file size +// Returns: DSP image buffer +// +// Description: Read the DSP image file into a char buffer +// +// Notes: +// +//--------------------------------------------------------------------------- +char *getfw (char *fn, int *pimgsz) +{ + struct file *fd; + mm_segment_t fs = get_fs(); + loff_t pos; + char *pfwimg; + int fwimgsz; + + set_fs(get_ds()); + + fd = filp_open(fn, 0, 0); + if ( IS_ERR(fd) ) + { + DEBUG("FT1000:%s:can not open dsp image\n", __FUNCTION__); + set_fs(fs); + return NULL; + } + + fwimgsz = i_size_read(fd->f_dentry->d_inode); + *pimgsz = fwimgsz; + + if (fwimgsz <= 0) + { + DEBUG("FT1000:%s:invalid file size\n", __FUNCTION__); + filp_close(fd, current->files); + set_fs(fs); + return NULL; + } + pfwimg = (char*)vmalloc ( fwimgsz ); + if (pfwimg == NULL) { + DEBUG("FT1000:%s:can not allocate memory for dsp image\n", __FUNCTION__); + filp_close(fd, current->files); + set_fs(fs); + return NULL; + } + pos = 0; + if (vfs_read(fd, pfwimg, fwimgsz, &pos) != fwimgsz) { + vfree(pfwimg); + DEBUG("FT1000:%s:failed to read firmware image\n",__FUNCTION__); + filp_close(fd, current->files); + set_fs(fs); + return NULL; + } + + filp_close(fd, current->files); + set_fs(fs); + + return pfwimg; +} + +//--------------------------------------------------------------------------- +// Function: check_usb_db +// +// Parameters: struct ft1000_device - device structure +// +// Returns: 0 - success +// +// Description: This function checks if the doorbell register is cleared +// +// Notes: +// +//--------------------------------------------------------------------------- +ULONG check_usb_db (struct ft1000_device *ft1000dev) +{ + int loopcnt; + USHORT temp; + ULONG status; + + loopcnt = 0; + while (loopcnt < 10) + { + + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL); + DEBUG("check_usb_db: read FT1000_REG_DOORBELL value is %x\n", temp); + if (temp & 0x0080) + { + DEBUG("FT1000:Got checkusb doorbell\n"); + status = ft1000_write_register (ft1000dev, 0x0080, FT1000_REG_DOORBELL); +#if FIFO_DNLD + status = ft1000_write_register (ft1000dev, 0x0100, FT1000_REG_DOORBELL); +#endif + status = ft1000_write_register (ft1000dev, 0x8000, FT1000_REG_DOORBELL); + break; + } + else + { + loopcnt++; + msleep (10); + } + + } //end of while + + + loopcnt = 0; + while (loopcnt < 20) + { + + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL); + DEBUG("FT1000:check_usb_db:Doorbell = 0x%x\n", temp); + if (temp & 0x8000) + { + loopcnt++; + msleep (10); + } + else + { + DEBUG("check_usb_db: door bell is cleared, return 0\n"); + return 0; + } +#if 0 + // Check if Card is present + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_SUP_IMASK); + if (temp == 0x0000) { + break; + } + + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_ASIC_ID); + if (temp == 0xffff) { + break; + } +#endif + } + + return HANDSHAKE_MAG_TIMEOUT_VALUE; + +} + +//--------------------------------------------------------------------------- +// Function: get_handshake +// +// Parameters: struct ft1000_device - device structure +// USHORT expected_value - the handshake value expected +// +// Returns: handshakevalue - success +// HANDSHAKE_TIMEOUT_VALUE - failure +// +// Description: This function gets the handshake and compare with the expected value +// +// Notes: +// +//--------------------------------------------------------------------------- +USHORT get_handshake(struct ft1000_device *ft1000dev, USHORT expected_value) +{ + USHORT handshake; + int loopcnt; + ULONG status=0; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + + loopcnt = 0; + while (loopcnt < 100) + { + +#if FIFO_DNLD + // Need to clear downloader doorbell if Hartley ASIC + status = ft1000_write_register (ft1000dev, FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL); + //DEBUG("FT1000:get_handshake:doorbell = 0x%x\n", temp); + if (pft1000info->fcodeldr) + { + DEBUG(" get_handshake: fcodeldr is %d\n", pft1000info->fcodeldr); + pft1000info->fcodeldr = 0; + status = check_usb_db(ft1000dev); + if (status != STATUS_SUCCESS) + { + DEBUG("get_handshake: check_usb_db failed\n"); + status = STATUS_FAILURE; + break; + } + status = ft1000_write_register (ft1000dev, FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL); + } + + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (PUCHAR)&handshake, 1); + //DEBUG("get_handshake: handshake is %x\n", tempx); + handshake = ntohs(handshake); + //DEBUG("get_handshake: after swap, handshake is %x\n", handshake); +#else + // Need to clear downloader doorbell if Hartley ASIC + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL); + //DEBUG("FT1000:get_handshake:doorbell = 0x%x\n", temp); + if (temp) + { + if (temp & FT1000_DB_DNLD_RX) + { + //DEBUG("get_handshake: write FT1000_DB_DNLD_RX to doorbell register\n"); + status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL); + } + + if (pft1000info->fcodeldr) + { + DEBUG(" get_handshake: fcodeldr is %d\n", pft1000info->fcodeldr); + pft1000info->fcodeldr = 0; + status = check_usb_db(ft1000dev); + if (status != STATUS_SUCCESS) + { + DEBUG("get_handshake: check_usb_db failed\n"); + status = STATUS_FAILURE; + break; + } + + status = ft1000_read_register (ft1000dev, &temp, FT1000_REG_DOORBELL); + //DEBUG("FT1000:get_handshake:doorbell = 0x%x\n", temp); + if (temp) + { + if (temp & FT1000_DB_DNLD_RX) + status = ft1000_write_register(ft1000dev,FT1000_DB_DNLD_RX, FT1000_REG_DOORBELL); + } + } + + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (PUCHAR)&handshake, 1); + //DEBUG("get_handshake: handshake is %x\n", tempx); + handshake = ntohs(handshake); + //DEBUG("get_handshake: after swap, handshake is %x\n", handshake); + + } //end of if temp +#endif + + + if (status) + return HANDSHAKE_TIMEOUT_VALUE; + + //DEBUG("get_handshake: handshake= %x\n", handshake); + if ((handshake == expected_value) || (handshake == HANDSHAKE_RESET_VALUE_USB)) + { + //DEBUG("get_handshake: return handshake %x\n", handshake); + return handshake; + } + else + { + loopcnt++; + msleep (10); + } + //DEBUG("HANDSHKE LOOP: %d\n", loopcnt); + + } + + //DEBUG("get_handshake: return handshake time out\n"); + return HANDSHAKE_TIMEOUT_VALUE; +} + +//--------------------------------------------------------------------------- +// Function: put_handshake +// +// Parameters: struct ft1000_device - device structure +// USHORT handshake_value - handshake to be written +// +// Returns: none +// +// Description: This function write the handshake value to the handshake location +// in DPRAM +// +// Notes: +// +//--------------------------------------------------------------------------- +void put_handshake(struct ft1000_device *ft1000dev,USHORT handshake_value) +{ + ULONG tempx; + USHORT tempword; + int i; + ULONG status; + + + + tempx = (ULONG)handshake_value; + tempx = ntohl(tempx); + + tempword = (USHORT)(tempx & 0xffff); + status = ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, tempword, 0); + tempword = (USHORT)(tempx >> 16); + status = ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, tempword, 1); + status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, FT1000_REG_DOORBELL); +#if FIFO_DNLD + for (i=0; i<1000; i++); +#else + for (i=0; i<10; i++) + { + status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_DOORBELL); + if ((tempword & FT1000_DB_DNLD_TX) == 0) + break; + } + if (i==10) + { + DEBUG("FT1000:put_handshake could not clear Tx doorbell\n"); + status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_DOORBELL); + DEBUG("FT1000:put_handshake:doorbell = 0x%x\n",tempword); + } +#endif + +} + +USHORT get_handshake_usb(struct ft1000_device *ft1000dev, USHORT expected_value) +{ + USHORT handshake; + int loopcnt; + USHORT temp; + ULONG status=0; + + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + loopcnt = 0; + handshake = 0; + while (loopcnt < 100) + { + if (pft1000info->usbboot == 2) { + status = ft1000_read_dpram32 (ft1000dev, 0, (PUCHAR)&(pft1000info->tempbuf[0]), 64); + for (temp=0; temp<16; temp++) + DEBUG("tempbuf %d = 0x%x\n", temp, pft1000info->tempbuf[temp]); + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (PUCHAR)&handshake, 1); + DEBUG("handshake from read_dpram16 = 0x%x\n", handshake); + if (pft1000info->dspalive == pft1000info->tempbuf[6]) + handshake = 0; + else { + handshake = pft1000info->tempbuf[1]; + pft1000info->dspalive = pft1000info->tempbuf[6]; + } + } + else { + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, (PUCHAR)&handshake, 1); + } + loopcnt++; + msleep(10); + handshake = ntohs(handshake); + if ((handshake == expected_value) || (handshake == HANDSHAKE_RESET_VALUE_USB)) + { + return handshake; + } + } + + return HANDSHAKE_TIMEOUT_VALUE; +} + +void put_handshake_usb(struct ft1000_device *ft1000dev,USHORT handshake_value) +{ + int i; + + for (i=0; i<1000; i++); +} + +//--------------------------------------------------------------------------- +// Function: get_request_type +// +// Parameters: struct ft1000_device - device structure +// +// Returns: request type - success +// +// Description: This function returns the request type +// +// Notes: +// +//--------------------------------------------------------------------------- +USHORT get_request_type(struct ft1000_device *ft1000dev) +{ + USHORT request_type; + ULONG status; + USHORT tempword; + ULONG tempx; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + + if ( pft1000info->bootmode == 1) + { + status = fix_ft1000_read_dpram32 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (PUCHAR)&tempx); + tempx = ntohl(tempx); + } + else + { +#if FIFO_DNLD + tempx = 0; +#else + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (PUCHAR)&tempword, 0); + tempx = tempword; +#endif + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (PUCHAR)&tempword, 1); + tempx |= (tempword << 16); + tempx = ntohl(tempx); + } + request_type = (USHORT)tempx; + + //DEBUG("get_request_type: request_type is %x\n", request_type); + return request_type; + +} + +USHORT get_request_type_usb(struct ft1000_device *ft1000dev) +{ + USHORT request_type; + ULONG status; + USHORT tempword; + ULONG tempx; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + if ( pft1000info->bootmode == 1) + { + status = fix_ft1000_read_dpram32 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (PUCHAR)&tempx); + tempx = ntohl(tempx); + } + else + { + if (pft1000info->usbboot == 2) { + tempx = pft1000info->tempbuf[2]; + tempword = pft1000info->tempbuf[3]; + } + else { + tempx = 0; + status = ft1000_read_dpram16 (ft1000dev, DWNLD_MAG1_TYPE_LOC, (PUCHAR)&tempword, 1); + } + tempx |= (tempword << 16); + tempx = ntohl(tempx); + } + request_type = (USHORT)tempx; + + //DEBUG("get_request_type: request_type is %x\n", request_type); + return request_type; + +} + +//--------------------------------------------------------------------------- +// Function: get_request_value +// +// Parameters: struct ft1000_device - device structure +// +// Returns: request value - success +// +// Description: This function returns the request value +// +// Notes: +// +//--------------------------------------------------------------------------- +long get_request_value(struct ft1000_device *ft1000dev) +{ + ULONG value; + USHORT tempword; + ULONG status; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + + + if ( pft1000info->bootmode == 1) + { + status = fix_ft1000_read_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC, (PUCHAR)&value); + value = ntohl(value); + } + else + { + status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (PUCHAR)&tempword, 0); + value = tempword; + status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (PUCHAR)&tempword, 1); + value |= (tempword << 16); + value = ntohl(value); + } + + + //DEBUG("get_request_value: value is %x\n", value); + return value; + +} + +long get_request_value_usb(struct ft1000_device *ft1000dev) +{ + ULONG value; + USHORT tempword; + ULONG status; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + + if (pft1000info->usbboot == 2) { + value = pft1000info->tempbuf[4]; + tempword = pft1000info->tempbuf[5]; + } + else { + value = 0; + status = ft1000_read_dpram16(ft1000dev, DWNLD_MAG1_SIZE_LOC, (PUCHAR)&tempword, 1); + } + + value |= (tempword << 16); + value = ntohl(value); + +#if FIFO_DNLD + if (pft1000info->usbboot == 1) + pft1000info->usbboot = 2; +#endif + + //DEBUG("get_request_value_usb: value is %x\n", value); + return value; + +} + +//--------------------------------------------------------------------------- +// Function: put_request_value +// +// Parameters: struct ft1000_device - device structure +// long lvalue - value to be put into DPRAM location DWNLD_MAG1_SIZE_LOC +// +// Returns: none +// +// Description: This function writes a value to DWNLD_MAG1_SIZE_LOC +// +// Notes: +// +//--------------------------------------------------------------------------- +void put_request_value(struct ft1000_device *ft1000dev, long lvalue) +{ + ULONG tempx; + ULONG status; + + tempx = ntohl(lvalue); + status = fix_ft1000_write_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC, (PUCHAR)&tempx); + + + + //DEBUG("put_request_value: value is %x\n", lvalue); + +} + + + +//--------------------------------------------------------------------------- +// Function: hdr_checksum +// +// Parameters: PPSEUDO_HDR pHdr - Pseudo header pointer +// +// Returns: checksum - success +// +// Description: This function returns the checksum of the pseudo header +// +// Notes: +// +//--------------------------------------------------------------------------- +USHORT hdr_checksum(PPSEUDO_HDR pHdr) +{ + USHORT *usPtr = (USHORT *)pHdr; + USHORT chksum; + + + chksum = ((((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^ + usPtr[4]) ^ usPtr[5]) ^ usPtr[6]); + + return chksum; +} + + +//--------------------------------------------------------------------------- +// Function: write_blk +// +// Parameters: struct ft1000_device - device structure +// USHORT **pUsFile - DSP image file pointer in USHORT +// UCHAR **pUcFile - DSP image file pointer in UCHAR +// long word_length - lenght of the buffer to be written +// to DPRAM +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function writes a block of DSP image to DPRAM +// +// Notes: +// +//--------------------------------------------------------------------------- +ULONG write_blk (struct ft1000_device *ft1000dev, USHORT **pUsFile, UCHAR **pUcFile, long word_length) +{ + ULONG Status = STATUS_SUCCESS; + USHORT dpram; + long temp_word_length; + int loopcnt, i, j; + USHORT *pTempFile; + USHORT tempword; + USHORT tempbuffer[64]; + USHORT resultbuffer[64]; + PFT1000_INFO pft1000info = netdev_priv(ft1000dev->net); + + //DEBUG("FT1000:download:start word_length = %d\n",(int)word_length); + dpram = (USHORT)DWNLD_MAG1_PS_HDR_LOC; + tempword = *(*pUsFile); + (*pUsFile)++; + Status = ft1000_write_dpram16(ft1000dev, dpram, tempword, 0); + tempword = *(*pUsFile); + (*pUsFile)++; + Status = ft1000_write_dpram16(ft1000dev, dpram++, tempword, 1); + + *pUcFile = *pUcFile + 4; + word_length--; + tempword = (USHORT)word_length; + word_length = (word_length / 16) + 1; + pTempFile = *pUsFile; + temp_word_length = word_length; + for (; word_length > 0; word_length--) /* In words */ + { + loopcnt = 0; + + for (i=0; i<32; i++) + { + if (tempword != 0) + { + tempbuffer[i++] = *(*pUsFile); + (*pUsFile)++; + tempbuffer[i] = *(*pUsFile); + (*pUsFile)++; + *pUcFile = *pUcFile + 4; + loopcnt++; + tempword--; + } + else + { + tempbuffer[i++] = 0; + tempbuffer[i] = 0; + } + } + + //DEBUG("write_blk: loopcnt is %d\n", loopcnt); + //DEBUG("write_blk: bootmode = %d\n", bootmode); + //DEBUG("write_blk: dpram = %x\n", dpram); + if (pft1000info->bootmode == 0) + { + if (dpram >= 0x3F4) + Status = ft1000_write_dpram32 (ft1000dev, dpram, (PUCHAR)&tempbuffer[0], 8); + else + Status = ft1000_write_dpram32 (ft1000dev, dpram, (PUCHAR)&tempbuffer[0], 64); + } + else + { + for (j=0; j<10; j++) + { + Status = ft1000_write_dpram32 (ft1000dev, dpram, (PUCHAR)&tempbuffer[0], 64); + if (Status == STATUS_SUCCESS) + { + // Work around for ASIC bit stuffing problem. + if ( (tempbuffer[31] & 0xfe00) == 0xfe00) + { + Status = ft1000_write_dpram32(ft1000dev, dpram+12, (PUCHAR)&tempbuffer[24], 64); + } + // Let's check the data written + Status = ft1000_read_dpram32 (ft1000dev, dpram, (PUCHAR)&resultbuffer[0], 64); + if ( (tempbuffer[31] & 0xfe00) == 0xfe00) + { + for (i=0; i<28; i++) + { + if (resultbuffer[i] != tempbuffer[i]) + { + //NdisMSleep (100); + DEBUG("FT1000:download:DPRAM write failed 1 during bootloading\n"); + msleep(10); + Status = STATUS_FAILURE; + break; + } + } + Status = ft1000_read_dpram32 (ft1000dev, dpram+12, (PUCHAR)&resultbuffer[0], 64); + for (i=0; i<16; i++) + { + if (resultbuffer[i] != tempbuffer[i+24]) + { + //NdisMSleep (100); + DEBUG("FT1000:download:DPRAM write failed 2 during bootloading\n"); + msleep(10); + Status = STATUS_FAILURE; + break; + } + } + } + else + { + for (i=0; i<32; i++) + { + if (resultbuffer[i] != tempbuffer[i]) + { + //NdisMSleep (100); + DEBUG("FT1000:download:DPRAM write failed 3 during bootloading\n"); + msleep(10); + Status = STATUS_FAILURE; + break; + } + } + } + + if (Status == STATUS_SUCCESS) + break; + + } + } + + if (Status != STATUS_SUCCESS) + { + DEBUG("FT1000:download:Write failed tempbuffer[31] = 0x%x\n", tempbuffer[31]); + break; + } + + } + dpram = dpram + loopcnt; + } + + return Status; +} + +static void usb_dnld_complete (struct urb *urb) +{ + //DEBUG("****** usb_dnld_complete\n"); +} + +//--------------------------------------------------------------------------- +// Function: write_blk_fifo +// +// Parameters: struct ft1000_device - device structure +// USHORT **pUsFile - DSP image file pointer in USHORT +// UCHAR **pUcFile - DSP image file pointer in UCHAR +// long word_length - lenght of the buffer to be written +// to DPRAM +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function writes a block of DSP image to DPRAM +// +// Notes: +// +//--------------------------------------------------------------------------- +ULONG write_blk_fifo (struct ft1000_device *ft1000dev, USHORT **pUsFile, UCHAR **pUcFile, long word_length) +{ + ULONG Status = STATUS_SUCCESS; + int byte_length; + long aligncnt; + + byte_length = word_length * 4; + + if (byte_length % 4) + aligncnt = 4 - (byte_length % 4); + else + aligncnt = 0; + byte_length += aligncnt; + + if (byte_length && ((byte_length % 64) == 0)) { + byte_length += 4; + } + + if (byte_length < 64) + byte_length = 68; + +#if 0 + pblk = kzalloc(byte_length, GFP_KERNEL); + memcpy (pblk, *pUcFile, byte_length); + + pipe = usb_sndbulkpipe (ft1000dev->dev, ft1000dev->bulk_out_endpointAddr); + + Status = usb_bulk_msg (ft1000dev->dev, + pipe, + pblk, + byte_length, + &cnt, + 10); + DEBUG("write_blk_fifo Status = 0x%8x Bytes Transfer = %d Data = 0x%x\n", Status, cnt, *pblk); + + kfree(pblk); +#else + usb_init_urb(ft1000dev->tx_urb); + memcpy (ft1000dev->tx_buf, *pUcFile, byte_length); + usb_fill_bulk_urb(ft1000dev->tx_urb, + ft1000dev->dev, + usb_sndbulkpipe(ft1000dev->dev, ft1000dev->bulk_out_endpointAddr), + ft1000dev->tx_buf, + byte_length, + usb_dnld_complete, + (void*)ft1000dev); + + usb_submit_urb(ft1000dev->tx_urb, GFP_ATOMIC); +#endif + + *pUsFile = *pUsFile + (word_length << 1); + *pUcFile = *pUcFile + (word_length << 2); + + return Status; +} + +//--------------------------------------------------------------------------- +// +// Function: scram_dnldr +// +// Synopsis: Scramble downloader for Harley based ASIC via USB interface +// +// Arguments: pFileStart - pointer to start of file +// FileLength - file length +// +// Returns: status - return code +//--------------------------------------------------------------------------- + +u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, ULONG FileLength) +{ + u16 Status = STATUS_SUCCESS; + UINT uiState; + USHORT handshake; + PPSEUDO_HDR pHdr; + USHORT usHdrLength; + //PPROV_RECORD pProvRecord; + PDSP_FILE_HDR pFileHdr; + long word_length; + USHORT request; + USHORT temp; + USHORT tempword; + + PDSP_FILE_HDR_5 pFileHdr5; + PDSP_IMAGE_INFO_V6 pDspImageInfoV6 = NULL; + long requested_version; + BOOLEAN bGoodVersion; + PDRVMSG pMailBoxData; + USHORT *pUsData = NULL; + USHORT *pUsFile = NULL; + UCHAR *pUcFile = NULL; + UCHAR *pBootEnd = NULL, *pCodeEnd= NULL; + int imageN; + long loader_code_address, loader_code_size = 0; + long run_address = 0, run_size = 0; + + ULONG templong; + ULONG image_chksum = 0; + + USHORT dpram = 0; + PUCHAR pbuffer; + PPROV_RECORD pprov_record; + FT1000_INFO *pft1000info = netdev_priv(ft1000dev->net); + + DEBUG("Entered scram_dnldr...\n"); + + pft1000info->fcodeldr = 0; + pft1000info->usbboot = 0; + pft1000info->dspalive = 0xffff; + + + // + // Get version id of file, at first 4 bytes of file, for newer files. + // + + uiState = STATE_START_DWNLD; + + pFileHdr = (PDSP_FILE_HDR)pFileStart; + pFileHdr5 = (PDSP_FILE_HDR_5)pFileStart; + + ft1000_write_register (ft1000dev, 0x800, FT1000_REG_MAG_WATERMARK); + + pUsFile = (USHORT *)(pFileStart + pFileHdr5->loader_offset); + pUcFile = (UCHAR *)(pFileStart + pFileHdr5->loader_offset); + + pBootEnd = (UCHAR *)(pFileStart + pFileHdr5->loader_code_end); + + loader_code_address = pFileHdr5->loader_code_address; + loader_code_size = pFileHdr5->loader_code_size; + bGoodVersion = FALSE; + + while ((Status == STATUS_SUCCESS) && (uiState != STATE_DONE_FILE)) + { + switch (uiState) + { + case STATE_START_DWNLD: + DEBUG("FT1000:STATE_START_DWNLD\n"); + if (pft1000info->usbboot) + handshake = get_handshake_usb(ft1000dev, HANDSHAKE_DSP_BL_READY); + else + handshake = get_handshake(ft1000dev, HANDSHAKE_DSP_BL_READY); + + if (handshake == HANDSHAKE_DSP_BL_READY) + { + DEBUG("scram_dnldr: handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n"); + put_handshake(ft1000dev, HANDSHAKE_DRIVER_READY); + } + else + { + DEBUG("FT1000:download:Download error: Handshake failed\n"); + Status = STATUS_FAILURE; + } + + uiState = STATE_BOOT_DWNLD; + + break; + + case STATE_BOOT_DWNLD: + DEBUG("FT1000:STATE_BOOT_DWNLD\n"); + pft1000info->bootmode = 1; + handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST); + if (handshake == HANDSHAKE_REQUEST) + { + /* + * Get type associated with the request. + */ + request = get_request_type(ft1000dev); + switch (request) + { + case REQUEST_RUN_ADDRESS: + DEBUG("FT1000:REQUEST_RUN_ADDRESS\n"); + put_request_value(ft1000dev, loader_code_address); + break; + case REQUEST_CODE_LENGTH: + DEBUG("FT1000:REQUEST_CODE_LENGTH\n"); + put_request_value(ft1000dev, loader_code_size); + break; + case REQUEST_DONE_BL: + DEBUG("FT1000:REQUEST_DONE_BL\n"); + /* Reposition ptrs to beginning of code section */ + pUsFile = (USHORT *)(pBootEnd); + pUcFile = (UCHAR *)(pBootEnd); + //DEBUG("FT1000:download:pUsFile = 0x%8x\n", (int)pUsFile); + //DEBUG("FT1000:download:pUcFile = 0x%8x\n", (int)pUcFile); + uiState = STATE_CODE_DWNLD; + pft1000info->fcodeldr = 1; + break; + case REQUEST_CODE_SEGMENT: + //DEBUG("FT1000:REQUEST_CODE_SEGMENT\n"); + word_length = get_request_value(ft1000dev); + //DEBUG("FT1000:word_length = 0x%x\n", (int)word_length); + //NdisMSleep (100); + if (word_length > MAX_LENGTH) + { + DEBUG("FT1000:download:Download error: Max length exceeded\n"); + Status = STATUS_FAILURE; + break; + } + if ( (word_length*2 + pUcFile) > pBootEnd) + { + /* + * Error, beyond boot code range. + */ + DEBUG("FT1000:download:Download error: Requested len=%d exceeds BOOT code boundry.\n", + (int)word_length); + Status = STATUS_FAILURE; + break; + } + /* + * Position ASIC DPRAM auto-increment pointer. + */ + dpram = (USHORT)DWNLD_MAG1_PS_HDR_LOC; + if (word_length & 0x1) + word_length++; + word_length = word_length / 2; + + Status = write_blk(ft1000dev, &pUsFile, &pUcFile, word_length); + //DEBUG("write_blk returned %d\n", Status); + break; + default: + DEBUG("FT1000:download:Download error: Bad request type=%d in BOOT download state.\n",request); + Status = STATUS_FAILURE; + break; + } + if (pft1000info->usbboot) + put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE); + else + put_handshake(ft1000dev, HANDSHAKE_RESPONSE); + } + else + { + DEBUG("FT1000:download:Download error: Handshake failed\n"); + Status = STATUS_FAILURE; + } + + break; + + case STATE_CODE_DWNLD: + //DEBUG("FT1000:STATE_CODE_DWNLD\n"); + pft1000info->bootmode = 0; + if (pft1000info->usbboot) + handshake = get_handshake_usb(ft1000dev, HANDSHAKE_REQUEST); + else + handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST); + if (handshake == HANDSHAKE_REQUEST) + { + /* + * Get type associated with the request. + */ + if (pft1000info->usbboot) + request = get_request_type_usb(ft1000dev); + else + request = get_request_type(ft1000dev); + switch (request) + { + case REQUEST_FILE_CHECKSUM: + DEBUG("FT1000:download:image_chksum = 0x%8x\n", image_chksum); + put_request_value(ft1000dev, image_chksum); + break; + case REQUEST_RUN_ADDRESS: + DEBUG("FT1000:download: REQUEST_RUN_ADDRESS\n"); + if (bGoodVersion) + { + DEBUG("FT1000:download:run_address = 0x%8x\n", (int)run_address); + put_request_value(ft1000dev, run_address); + } + else + { + DEBUG("FT1000:download:Download error: Got Run address request before image offset request.\n"); + Status = STATUS_FAILURE; + break; + } + break; + case REQUEST_CODE_LENGTH: + DEBUG("FT1000:download:REQUEST_CODE_LENGTH\n"); + if (bGoodVersion) + { + DEBUG("FT1000:download:run_size = 0x%8x\n", (int)run_size); + put_request_value(ft1000dev, run_size); + } + else + { + DEBUG("FT1000:download:Download error: Got Size request before image offset request.\n"); + Status = STATUS_FAILURE; + break; + } + break; + case REQUEST_DONE_CL: +#if FIFO_DNLD + pft1000info->usbboot = 3; +#endif + /* Reposition ptrs to beginning of provisioning section */ + pUsFile = (USHORT *)(pFileStart + pFileHdr5->commands_offset); + pUcFile = (UCHAR *)(pFileStart + pFileHdr5->commands_offset); + uiState = STATE_DONE_DWNLD; + break; + case REQUEST_CODE_SEGMENT: + //DEBUG("FT1000:download: REQUEST_CODE_SEGMENT - CODELOADER\n"); + if (!bGoodVersion) + { + DEBUG("FT1000:download:Download error: Got Code Segment request before image offset request.\n"); + Status = STATUS_FAILURE; + break; + } +#if 0 + word_length = get_request_value_usb(ft1000dev); + //DEBUG("FT1000:download:word_length = %d\n", (int)word_length); + if (word_length > MAX_LENGTH/2) +#else + word_length = get_request_value(ft1000dev); + //DEBUG("FT1000:download:word_length = %d\n", (int)word_length); + if (word_length > MAX_LENGTH) +#endif + { + DEBUG("FT1000:download:Download error: Max length exceeded\n"); + Status = STATUS_FAILURE; + break; + } + if ( (word_length*2 + pUcFile) > pCodeEnd) + { + /* + * Error, beyond boot code range. + */ + DEBUG("FT1000:download:Download error: Requested len=%d exceeds DSP code boundry.\n", + (int)word_length); + Status = STATUS_FAILURE; + break; + } + /* + * Position ASIC DPRAM auto-increment pointer. + */ + dpram = (USHORT)DWNLD_MAG1_PS_HDR_LOC; + if (word_length & 0x1) + word_length++; + word_length = word_length / 2; + +#if FIFO_DNLD + write_blk_fifo (ft1000dev, &pUsFile, &pUcFile, word_length); + if (pft1000info->usbboot == 0) + pft1000info->usbboot++; + if (pft1000info->usbboot == 1) { + tempword = 0; + ft1000_write_dpram16 (ft1000dev, DWNLD_MAG1_PS_HDR_LOC, tempword, 0); + } +#else + write_blk (ft1000dev, &pUsFile, &pUcFile, word_length); + //ft1000_write_dpram32 (ft1000dev, dpram, (PUCHAR)pUcFile, word_length); +#endif + break; + + case REQUEST_MAILBOX_DATA: + DEBUG("FT1000:download: REQUEST_MAILBOX_DATA\n"); + // Convert length from byte count to word count. Make sure we round up. + word_length = (long)(pft1000info->DSPInfoBlklen + 1)/2; + put_request_value(ft1000dev, word_length); + pMailBoxData = (PDRVMSG)&(pft1000info->DSPInfoBlk[0]); + /* + * Position ASIC DPRAM auto-increment pointer. + */ + + + pUsData = (USHORT *)&pMailBoxData->data[0]; + dpram = (USHORT)DWNLD_MAG1_PS_HDR_LOC; + if (word_length & 0x1) + word_length++; + + word_length = (word_length / 2); + + + for (; word_length > 0; word_length--) /* In words */ + { + + templong = *pUsData++; + templong |= (*pUsData++ << 16); + Status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (PUCHAR)&templong); + + } + break; + + case REQUEST_VERSION_INFO: + DEBUG("FT1000:download:REQUEST_VERSION_INFO\n"); + word_length = pFileHdr5->version_data_size; + put_request_value(ft1000dev, word_length); + /* + * Position ASIC DPRAM auto-increment pointer. + */ + + pUsFile = (USHORT *)(pFileStart + pFileHdr5->version_data_offset); + + + dpram = (USHORT)DWNLD_MAG1_PS_HDR_LOC; + if (word_length & 0x1) + word_length++; + + word_length = (word_length / 2); + + + for (; word_length > 0; word_length--) /* In words */ + { + + templong = ntohs(*pUsFile++); + temp = ntohs(*pUsFile++); + templong |= (temp << 16); + Status = fix_ft1000_write_dpram32 (ft1000dev, dpram++, (PUCHAR)&templong); + + } + break; + + case REQUEST_CODE_BY_VERSION: + DEBUG("FT1000:download:REQUEST_CODE_BY_VERSION\n"); + bGoodVersion = FALSE; + requested_version = get_request_value(ft1000dev); + + pDspImageInfoV6 = (PDSP_IMAGE_INFO_V6)(pFileStart + sizeof(DSP_FILE_HDR_5)); + + for (imageN = 0; imageN < pFileHdr5->nDspImages; imageN++) + { + + temp = (USHORT)(pDspImageInfoV6->version); + templong = temp; + temp = (USHORT)(pDspImageInfoV6->version >> 16); + templong |= (temp << 16); + if (templong == (ULONG)requested_version) + { + bGoodVersion = TRUE; + DEBUG("FT1000:download: bGoodVersion is TRUE\n"); + pUsFile = (USHORT *)(pFileStart + pDspImageInfoV6->begin_offset); + pUcFile = (UCHAR *)(pFileStart + pDspImageInfoV6->begin_offset); + pCodeEnd = (UCHAR *)(pFileStart + pDspImageInfoV6->end_offset); + run_address = pDspImageInfoV6->run_address; + run_size = pDspImageInfoV6->image_size; + image_chksum = (ULONG)pDspImageInfoV6->checksum; + break; + } + pDspImageInfoV6++; + + + } //end of for + + if (!bGoodVersion) + { + /* + * Error, beyond boot code range. + */ + DEBUG("FT1000:download:Download error: Bad Version Request = 0x%x.\n",(int)requested_version); + Status = STATUS_FAILURE; + break; + } + break; + + default: + DEBUG("FT1000:download:Download error: Bad request type=%d in CODE download state.\n",request); + Status = STATUS_FAILURE; + break; + } + if (pft1000info->usbboot) + put_handshake_usb(ft1000dev, HANDSHAKE_RESPONSE); + else + put_handshake(ft1000dev, HANDSHAKE_RESPONSE); + } + else + { + DEBUG("FT1000:download:Download error: Handshake failed\n"); + Status = STATUS_FAILURE; + } + + break; + + case STATE_DONE_DWNLD: + DEBUG("FT1000:download:Code loader is done...\n"); + uiState = STATE_SECTION_PROV; + break; + + case STATE_SECTION_PROV: + DEBUG("FT1000:download:STATE_SECTION_PROV\n"); + pHdr = (PPSEUDO_HDR)pUcFile; + + if (pHdr->checksum == hdr_checksum(pHdr)) + { + if (pHdr->portdest != 0x80 /* Dsp OAM */) + { + uiState = STATE_DONE_PROV; + break; + } + usHdrLength = ntohs(pHdr->length); /* Byte length for PROV records */ + + // Get buffer for provisioning data + pbuffer = kmalloc ( (usHdrLength + sizeof(PSEUDO_HDR) ), GFP_ATOMIC ); + if (pbuffer) { + memcpy(pbuffer, (void *)pUcFile, (UINT)(usHdrLength + sizeof(PSEUDO_HDR))); + // link provisioning data + pprov_record = kmalloc( sizeof(PROV_RECORD), GFP_ATOMIC ); + if (pprov_record) { + pprov_record->pprov_data = pbuffer; + list_add_tail (&pprov_record->list, &pft1000info->prov_list); + // Move to next entry if available + pUcFile = (UCHAR *)((UINT)pUcFile + (UINT)((usHdrLength + 1) & 0xFFFFFFFE) + sizeof(PSEUDO_HDR)); + if ( (UINT)(pUcFile) - (UINT)(pFileStart) >= (UINT)FileLength) { + uiState = STATE_DONE_FILE; + } + } + else { + kfree(pbuffer); + Status = STATUS_FAILURE; + } + } + else { + Status = STATUS_FAILURE; + } + } + else + { + /* Checksum did not compute */ + Status = STATUS_FAILURE; + } + DEBUG("ft1000:download: after STATE_SECTION_PROV, uiState = %d, Status= %d\n", uiState, Status); + break; + + case STATE_DONE_PROV: + DEBUG("FT1000:download:STATE_DONE_PROV\n"); + uiState = STATE_DONE_FILE; + break; + + + default: + Status = STATUS_FAILURE; + break; + } /* End Switch */ + + if (Status != STATUS_SUCCESS) { + break; + } + +/**** + // Check if Card is present + Status = Harley_Read_Register(&temp, FT1000_REG_SUP_IMASK); + if ( (Status != NDIS_STATUS_SUCCESS) || (temp == 0x0000) ) { + break; + } + + Status = Harley_Read_Register(&temp, FT1000_REG_ASIC_ID); + if ( (Status != NDIS_STATUS_SUCCESS) || (temp == 0xffff) ) { + break; + } +****/ + + } /* End while */ + + DEBUG("Download exiting with status = 0x%8x\n", Status); + ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, FT1000_REG_DOORBELL); + + return Status; +} + diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c new file mode 100644 index 0000000..3dea39c --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c @@ -0,0 +1,2762 @@ +//===================================================== +// CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. +// +// +// This file is part of Express Card USB Driver +// +// $Id: +//==================================================== +// 20090926; aelias; removed compiler warnings & errors; ubuntu 9.04; 2.6.28-15-generic + +#include +#include +#include +#include +#include +#include +#include "ft1000_usb.h" +#include +//#include //aelias [-] reason : file moved +//#include //aelias [+] reason : file moved +//#include +//#include + +#define HARLEY_READ_REGISTER 0x0 +#define HARLEY_WRITE_REGISTER 0x01 +#define HARLEY_READ_DPRAM_32 0x02 +#define HARLEY_READ_DPRAM_LOW 0x03 +#define HARLEY_READ_DPRAM_HIGH 0x04 +#define HARLEY_WRITE_DPRAM_32 0x05 +#define HARLEY_WRITE_DPRAM_LOW 0x06 +#define HARLEY_WRITE_DPRAM_HIGH 0x07 + +#define HARLEY_READ_OPERATION 0xc1 +#define HARLEY_WRITE_OPERATION 0x41 + +//#define JDEBUG + + +extern void *pFileStart; +extern ULONG FileLength; + + +extern int numofmsgbuf; + + +int ft1000_poll_thread(void *arg); + +static void ft1000_hbchk(u_long data); +int ft1000_reset(struct net_device *ft1000dev); +static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev); +static int ft1000_open (struct net_device *dev); +int ft1000_close (struct net_device *dev); +static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev); +u16 scram_dnldr(struct ft1000_device *ft1000dev, void *pFileStart, ULONG FileLength); +int ft1000_submit_rx_urb(PFT1000_INFO info); +static struct timer_list poll_timer[MAX_NUM_CARDS]; +static int ft1000_chkcard (struct ft1000_device *dev); +/* +static const struct net_device_ops ft1000net_ops = { + .ndo_start_xmit = ft1000_start_xmit, + .ndo_get_stats = ft1000_netdev_stats, + .ndo_open = ft1000_open, + .ndo_stop = ft1000_close, +}; +*/ + +//Jim + +static u8 tempbuffer[1600]; +int gCardIndex; + +#define MAX_RCV_LOOP 100 + + +extern struct list_head freercvpool; +extern spinlock_t free_buff_lock; // lock to arbitrate free buffer list for receive command data + +//end of Jim + +extern int ft1000_CreateDevice(struct ft1000_device *dev); +extern PDPRAM_BLK ft1000_get_buffer (struct list_head *bufflist); +extern void ft1000_free_buffer (PDPRAM_BLK pdpram_blk, struct list_head *plist); + + +static int atoi(const char *s) +{ + int k = 0; + int cnt; + + k = 0; + cnt = 0; + while (*s != '\0' && *s >= '0' && *s <= '9') { + k = 10 * k + (*s - '0'); + s++; + // Let's put a limit on this while loop to avoid deadlock scenario + if (cnt > 100) + break; + cnt++; + } + return k; +} +/**************************************************************** + * ft1000_control_complete + ****************************************************************/ +static void ft1000_control_complete(struct urb *urb) +{ + struct ft1000_device *ft1000dev = (struct ft1000_device *)urb->context; + + //DEBUG("FT1000_CONTROL_COMPLETE ENTERED\n"); + if (ft1000dev == NULL ) + { + DEBUG("NULL ft1000dev, failure\n"); + return ; + } + else if ( ft1000dev->dev == NULL ) + { + DEBUG("NULL ft1000dev->dev, failure\n"); + return ; + } + //spin_lock(&ft1000dev->device_lock); + + if(waitqueue_active(&ft1000dev->control_wait)) + { + wake_up(&ft1000dev->control_wait); + } + + //DEBUG("FT1000_CONTROL_COMPLETE RETURNED\n"); + //spin_unlock(&ft1000dev->device_lock); +} + +//--------------------------------------------------------------------------- +// Function: ft1000_control +// +// Parameters: ft1000_device - device structure +// pipe - usb control message pipe +// request - control request +// requesttype - control message request type +// value - value to be written or 0 +// index - register index +// data - data buffer to hold the read/write values +// size - data size +// timeout - control message time out value +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function sends a control message via USB interface synchronously +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_control(struct ft1000_device *ft1000dev,unsigned int pipe, + u8 request, + u8 requesttype, + u16 value, + u16 index, + void *data, + u16 size, + int timeout) +{ + u16 ret; + + if (ft1000dev == NULL ) + { + DEBUG("NULL ft1000dev, failure\n"); + return STATUS_FAILURE; + } + else if ( ft1000dev->dev == NULL ) + { + DEBUG("NULL ft1000dev->dev, failure\n"); + return STATUS_FAILURE; + } + + ret = usb_control_msg(ft1000dev->dev, + pipe, + request, + requesttype, + value, + index, + data, + size, + LARGE_TIMEOUT); + + if (ret>0) + ret = STATUS_SUCCESS; + else + ret = STATUS_FAILURE; + + + return ret; + + +} +//--------------------------------------------------------------------------- +// Function: ft1000_read_register +// +// Parameters: ft1000_device - device structure +// Data - data buffer to hold the value read +// nRegIndex - register index +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function returns the value in a register +// +// Notes: +// +//--------------------------------------------------------------------------- + +u16 ft1000_read_register(struct ft1000_device *ft1000dev, short* Data, u16 nRegIndx) +{ + u16 ret = STATUS_SUCCESS; + + //DEBUG("ft1000_read_register: reg index is %d\n", nRegIndx); + //DEBUG("ft1000_read_register: spin_lock locked\n"); + ret = ft1000_control(ft1000dev, + usb_rcvctrlpipe(ft1000dev->dev,0), + HARLEY_READ_REGISTER, //request --READ_REGISTER + HARLEY_READ_OPERATION, //requestType + 0, //value + nRegIndx, //index + Data, //data + 2, //data size + LARGE_TIMEOUT ); //timeout + + //DEBUG("ft1000_read_register: ret is %d \n", ret); + + //DEBUG("ft1000_read_register: data is %x \n", *Data); + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + return ret; + +} + +//--------------------------------------------------------------------------- +// Function: ft1000_write_register +// +// Parameters: ft1000_device - device structure +// value - value to write into a register +// nRegIndex - register index +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function writes the value in a register +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 ft1000_write_register(struct ft1000_device *ft1000dev, USHORT value, u16 nRegIndx) +{ + u16 ret = STATUS_SUCCESS; + + //DEBUG("ft1000_write_register: value is: %d, reg index is: %d\n", value, nRegIndx); + + ret = ft1000_control(ft1000dev, + usb_sndctrlpipe(ft1000dev->dev, 0), + HARLEY_WRITE_REGISTER, //request -- WRITE_REGISTER + HARLEY_WRITE_OPERATION, //requestType + value, + nRegIndx, + NULL, + 0, + LARGE_TIMEOUT ); + + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + return ret; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_read_dpram32 +// +// Parameters: ft1000_device - device structure +// indx - starting address to read +// buffer - data buffer to hold the data read +// cnt - number of byte read from DPRAM +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function read a number of bytes from DPRAM +// +// Notes: +// +//--------------------------------------------------------------------------- + +u16 ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt) +{ + u16 ret = STATUS_SUCCESS; + + //DEBUG("ft1000_read_dpram32: indx: %d cnt: %d\n", indx, cnt); + ret =ft1000_control(ft1000dev, + usb_rcvctrlpipe(ft1000dev->dev,0), + HARLEY_READ_DPRAM_32, //request --READ_DPRAM_32 + HARLEY_READ_OPERATION, //requestType + 0, //value + indx, //index + buffer, //data + cnt, //data size + LARGE_TIMEOUT ); //timeout + + //DEBUG("ft1000_read_dpram32: ret is %d \n", ret); + + //DEBUG("ft1000_read_dpram32: ret=%d \n", ret); + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + return ret; + +} + +//--------------------------------------------------------------------------- +// Function: ft1000_write_dpram32 +// +// Parameters: ft1000_device - device structure +// indx - starting address to write the data +// buffer - data buffer to write into DPRAM +// cnt - number of bytes to write +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function writes into DPRAM a number of bytes +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, USHORT cnt) +{ + u16 ret = STATUS_SUCCESS; + + //DEBUG("ft1000_write_dpram32: indx: %d buffer: %x cnt: %d\n", indx, buffer, cnt); + if ( cnt % 4) + cnt += cnt - (cnt % 4); + + ret = ft1000_control(ft1000dev, + usb_sndctrlpipe(ft1000dev->dev, 0), + HARLEY_WRITE_DPRAM_32, //request -- WRITE_DPRAM_32 + HARLEY_WRITE_OPERATION, //requestType + 0, //value + indx, //index + buffer, //buffer + cnt, //buffer size + LARGE_TIMEOUT ); + + + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + + return ret; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_read_dpram16 +// +// Parameters: ft1000_device - device structure +// indx - starting address to read +// buffer - data buffer to hold the data read +// hightlow - high or low 16 bit word +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function read 16 bits from DPRAM +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, u8 highlow) +{ + u16 ret = STATUS_SUCCESS; + + //DEBUG("ft1000_read_dpram16: indx: %d hightlow: %d\n", indx, highlow); + + u8 request; + + if (highlow == 0 ) + request = HARLEY_READ_DPRAM_LOW; + else + request = HARLEY_READ_DPRAM_HIGH; + + ret = ft1000_control(ft1000dev, + usb_rcvctrlpipe(ft1000dev->dev,0), + request, //request --READ_DPRAM_H/L + HARLEY_READ_OPERATION, //requestType + 0, //value + indx, //index + buffer, //data + 2, //data size + LARGE_TIMEOUT ); //timeout + + //DEBUG("ft1000_read_dpram16: ret is %d \n", ret); + + + //DEBUG("ft1000_read_dpram16: data is %x \n", *buffer); + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + return ret; + +} + +//--------------------------------------------------------------------------- +// Function: ft1000_write_dpram16 +// +// Parameters: ft1000_device - device structure +// indx - starting address to write the data +// value - 16bits value to write +// hightlow - high or low 16 bit word +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function writes into DPRAM a number of bytes +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 ft1000_write_dpram16(struct ft1000_device *ft1000dev, USHORT indx, USHORT value, u8 highlow) +{ + u16 ret = STATUS_SUCCESS; + + + + //DEBUG("ft1000_write_dpram16: indx: %d value: %d highlow: %d\n", indx, value, highlow); + + u8 request; + + + if ( highlow == 0 ) + request = HARLEY_WRITE_DPRAM_LOW; + else + request = HARLEY_WRITE_DPRAM_HIGH; + + ret = ft1000_control(ft1000dev, + usb_sndctrlpipe(ft1000dev->dev, 0), + request, //request -- WRITE_DPRAM_H/L + HARLEY_WRITE_OPERATION, //requestType + value, //value + indx, //index + NULL, //buffer + 0, //buffer size + LARGE_TIMEOUT ); + + + if ( ret != STATUS_SUCCESS ) + return STATUS_FAILURE; + + + return ret; +} + +//--------------------------------------------------------------------------- +// Function: fix_ft1000_read_dpram32 +// +// Parameters: ft1000_device - device structure +// indx - starting address to read +// buffer - data buffer to hold the data read +// +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function read DPRAM 4 words at a time +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 fix_ft1000_read_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer) +{ + UCHAR tempbuffer[16]; + USHORT pos; + u16 ret = STATUS_SUCCESS; + + //DEBUG("fix_ft1000_read_dpram32: indx: %d \n", indx); + pos = (indx / 4)*4; + ret = ft1000_read_dpram32(ft1000dev, pos, (PUCHAR)&tempbuffer[0], 16); + if (ret == STATUS_SUCCESS) + { + pos = (indx % 4)*4; + *buffer++ = tempbuffer[pos++]; + *buffer++ = tempbuffer[pos++]; + *buffer++ = tempbuffer[pos++]; + *buffer++ = tempbuffer[pos++]; + } + else + { + DEBUG("fix_ft1000_read_dpram32: DPRAM32 Read failed\n"); + *buffer++ = 0; + *buffer++ = 0; + *buffer++ = 0; + *buffer++ = 0; + + } + + //DEBUG("fix_ft1000_read_dpram32: data is %x \n", *buffer); + return ret; + +} + + +//--------------------------------------------------------------------------- +// Function: fix_ft1000_write_dpram32 +// +// Parameters: ft1000_device - device structure +// indx - starting address to write +// buffer - data buffer to write +// +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function write to DPRAM 4 words at a time +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 fix_ft1000_write_dpram32(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer) +{ + USHORT pos1; + USHORT pos2; + USHORT i; + UCHAR tempbuffer[32]; + UCHAR resultbuffer[32]; + PUCHAR pdata; + u16 ret = STATUS_SUCCESS; + + //DEBUG("fix_ft1000_write_dpram32: Entered:\n"); + + pos1 = (indx / 4)*4; + pdata = buffer; + ret = ft1000_read_dpram32(ft1000dev, pos1, (PUCHAR)&tempbuffer[0], 16); + if (ret == STATUS_SUCCESS) + { + pos2 = (indx % 4)*4; + tempbuffer[pos2++] = *buffer++; + tempbuffer[pos2++] = *buffer++; + tempbuffer[pos2++] = *buffer++; + tempbuffer[pos2++] = *buffer++; + ret = ft1000_write_dpram32(ft1000dev, pos1, (PUCHAR)&tempbuffer[0], 16); + } + else + { + DEBUG("fix_ft1000_write_dpram32: DPRAM32 Read failed\n"); + + return ret; + } + + ret = ft1000_read_dpram32(ft1000dev, pos1, (PUCHAR)&resultbuffer[0], 16); + if (ret == STATUS_SUCCESS) + { + buffer = pdata; + for (i=0; i<16; i++) + { + if (tempbuffer[i] != resultbuffer[i]){ + + ret = STATUS_FAILURE; + } + } + } + + if (ret == STATUS_FAILURE) + { + ret = ft1000_write_dpram32(ft1000dev, pos1, (PUCHAR)&tempbuffer[0], 16); + ret = ft1000_read_dpram32(ft1000dev, pos1, (PUCHAR)&resultbuffer[0], 16); + if (ret == STATUS_SUCCESS) + { + buffer = pdata; + for (i=0; i<16; i++) + { + if (tempbuffer[i] != resultbuffer[i]) + { + ret = STATUS_FAILURE; + DEBUG("fix_ft1000_write_dpram32 Failed to write\n"); + } + } + } + } + + return ret; + +} + + +//------------------------------------------------------------------------ +// +// Function: card_reset_dsp +// +// Synopsis: This function is called to reset or activate the DSP +// +// Arguments: value - reset or activate +// +// Returns: None +//----------------------------------------------------------------------- +void card_reset_dsp (struct ft1000_device *ft1000dev, BOOLEAN value) +{ + u16 status = STATUS_SUCCESS; + USHORT tempword; + + status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_CTRL); + if (value) + { + DEBUG("Reset DSP\n"); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); + tempword |= DSP_RESET_BIT; + status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + } + else + { + DEBUG("Activate DSP\n"); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); +#if 1 + tempword |= DSP_ENCRYPTED; + tempword &= ~DSP_UNENCRYPTED; +#else + tempword |= DSP_UNENCRYPTED; + tempword &= ~DSP_ENCRYPTED; +#endif + status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); + tempword &= ~EFUSE_MEM_DISABLE; + tempword &= ~DSP_RESET_BIT; + status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); + } +} + +//--------------------------------------------------------------------------- +// Function: CardSendCommand +// +// Parameters: ft1000_device - device structure +// ptempbuffer - command buffer +// size - command buffer size +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function sends a command to ASIC +// +// Notes: +// +//--------------------------------------------------------------------------- +void CardSendCommand(struct ft1000_device *ft1000dev, unsigned char *ptempbuffer, int size) +{ + unsigned short temp; + unsigned char *commandbuf; + + DEBUG("CardSendCommand: enter CardSendCommand... size=%d\n", size); + + commandbuf =(unsigned char*) kmalloc(size+2, GFP_KERNEL); + //memset((void*)commandbuf, 0, size+2); + memcpy((void*)commandbuf+2, (void*)ptempbuffer, size); + + //DEBUG("CardSendCommand: Command Send\n"); + /*** + for (i=0; inet); + + pft1000info->CardReady = 0; + pft1000info->DSP_loading= 1; + + // Program Interrupt Mask register + status = ft1000_write_register (ft1000dev, 0xffff, FT1000_REG_SUP_IMASK); + + status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET); + tempword |= ASIC_RESET_BIT; + status = ft1000_write_register (ft1000dev, tempword, FT1000_REG_RESET); + msleep(1000); + status = ft1000_read_register (ft1000dev, &tempword, FT1000_REG_RESET); + DEBUG("Reset Register = 0x%x\n", tempword); + + // Toggle DSP reset + card_reset_dsp (ft1000dev, 1); + msleep(1000); + card_reset_dsp (ft1000dev, 0); + msleep(1000); + + status = ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL); + + // Let's check for FEFE + status = ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (PUCHAR)&templong, 4); + DEBUG("templong (fefe) = 0x%8x\n", templong); + + // call codeloader + status = scram_dnldr(ft1000dev, pFileStart, FileLength); + + if ( status != STATUS_SUCCESS) + return; + + msleep(1000); + pft1000info->DSP_loading= 0; + + DEBUG("dsp_reload returned\n"); + + +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_reset_asic +// Descripton: This function will call the Card Service function to reset the +// ASIC. +// Input: +// dev - device structure +// Output: +// none +// +//--------------------------------------------------------------------------- +static void ft1000_reset_asic (struct net_device *dev) +{ + FT1000_INFO *info = netdev_priv(dev); + struct ft1000_device *ft1000dev = info->pFt1000Dev; + u16 tempword; + + DEBUG("ft1000_hw:ft1000_reset_asic called\n"); + + info->ASICResetNum++; + + // Let's use the register provided by the Magnemite ASIC to reset the + // ASIC and DSP. + ft1000_write_register(ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET ); + + mdelay(1); + + // set watermark to -1 in order to not generate an interrrupt + ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK); + + // clear interrupts + ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR); + DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword); + ft1000_write_register (ft1000dev, tempword, FT1000_REG_SUP_ISR); + ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_ISR); + DEBUG("ft1000_hw: interrupt status register = 0x%x\n",tempword); + +} +/* +//--------------------------------------------------------------------------- +// +// Function: ft1000_disable_interrupts +// Descripton: This function will disable all interrupts. +// Input: +// dev - device structure +// Output: +// None. +// +//--------------------------------------------------------------------------- +static void ft1000_disable_interrupts(struct net_device *dev) { + FT1000_INFO *info = netdev_priv(dev); + struct ft1000_device *ft1000dev = info->pFt1000Dev; + u16 tempword; + + DEBUG("ft1000_hw: ft1000_disable_interrupts()\n"); + ft1000_write_register (ft1000dev, ISR_MASK_ALL, FT1000_REG_SUP_IMASK); + ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_IMASK); + DEBUG("ft1000_hw:ft1000_disable_interrupts:current interrupt enable mask = 0x%x\n", tempword); + info->InterruptsEnabled = FALSE; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_enable_interrupts +// Descripton: This function will enable interrupts base on the current interrupt mask. +// Input: +// dev - device structure +// Output: +// None. +// +//--------------------------------------------------------------------------- +static void ft1000_enable_interrupts(struct net_device *dev) { + FT1000_INFO *info = netdev_priv(dev); + struct ft1000_device *ft1000dev = info->pFt1000Dev; + u16 tempword; + + DEBUG("ft1000_hw:ft1000_enable_interrupts()\n"); + ft1000_write_register (ft1000dev, info->CurrentInterruptEnableMask, FT1000_REG_SUP_IMASK); + ft1000_read_register (ft1000dev, &tempword, FT1000_REG_SUP_IMASK); + DEBUG("ft1000_hw:ft1000_enable_interrupts:current interrupt enable mask = 0x%x\n", tempword); + info->InterruptsEnabled = TRUE; +} +*/ + +//--------------------------------------------------------------------------- +// +// Function: ft1000_reset_card +// Descripton: This function will reset the card +// Input: +// dev - device structure +// Output: +// status - FALSE (card reset fail) +// TRUE (card reset successful) +// +//--------------------------------------------------------------------------- +static int ft1000_reset_card (struct net_device *dev) +{ + FT1000_INFO *info = netdev_priv(dev); + struct ft1000_device *ft1000dev = info->pFt1000Dev; + u16 tempword; + PPROV_RECORD ptr; + + DEBUG("ft1000_hw:ft1000_reset_card called.....\n"); + + info->fCondResetPend = 1; + info->CardReady = 0; + info->fProvComplete = 0; + //ft1000_disable_interrupts(dev); + + // Cancel heartbeat task since we are reloading the dsp + //del_timer(&poll_timer[info->CardNumber]); + + // Make sure we free any memory reserve for provisioning + while (list_empty(&info->prov_list) == 0) { + DEBUG("ft1000_hw:ft1000_reset_card:deleting provisioning record\n"); + ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + list_del(&ptr->list); + kfree(ptr->pprov_data); + kfree(ptr); + } + + DEBUG("ft1000_hw:ft1000_reset_card: reset asic\n"); + //reset ASIC + ft1000_reset_asic(dev); + + info->DSPResetNum++; + +#if 0 + DEBUG("ft1000_hw:ft1000_reset_card:resetting ASIC and DSP\n"); + ft1000_write_register (ft1000dev, (DSP_RESET_BIT | ASIC_RESET_BIT), FT1000_REG_RESET ); + + + // Copy DSP session record into info block if this is not a coldstart + //if (ft1000_card_present == 1) { + spin_lock_irqsave(&info->dpram_lock, flags); + + ft1000_write_register(ft1000dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR); + for (i=0;iDSPSess.MagRec[i] = inl(dev->base_addr+FT1000_REG_MAG_DPDATA); + ft1000_read_dpram32(ft1000dev, FT1000_REG_MAG_DPDATA, (PCHAR)&(info->DSPSess.MagRec[i]), 4); + } + + spin_unlock_irqrestore(&info->dpram_lock, flags); + //} + info->squeseqnum = 0; + + DEBUG("ft1000_hw:ft1000_reset_card:resetting ASIC\n"); + mdelay(10); + //reset ASIC + ft1000_reset_asic(dev); + + info->DSPResetNum++; + + DEBUG("ft1000_hw:ft1000_reset_card:downloading dsp image\n"); + + + // Put dsp in reset and take ASIC out of reset + DEBUG("ft1000_hw:ft1000_reset_card:Put DSP in reset and take ASIC out of reset\n"); + ft1000_write_register (ft1000dev, DSP_RESET_BIT, FT1000_REG_RESET); + + // Setting MAGNEMITE ASIC to big endian mode + ft1000_write_register (ft1000dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL); + + // Take DSP out of reset + + ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); + tempword |= DSP_ENCRYPTED; + tempword &= ~DSP_UNENCRYPTED; + ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + tempword &= ~EFUSE_MEM_DISABLE; + ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + tempword &= ~DSP_RESET_BIT; + ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); + + + // FLARION_DSP_ACTIVE; + mdelay(10); + DEBUG("ft1000_hw:ft1000_reset_card:Take DSP out of reset\n"); + + // Wait for 0xfefe indicating dsp ready before starting download + for (i=0; i<50; i++) { + //tempword = ft1000_read_dpram_mag_16(dev, FT1000_MAG_DPRAM_FEFE, FT1000_MAG_DPRAM_FEFE_INDX); + ft1000_read_dpram32 (ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, (PUCHAR)&templong, 4); + if (tempword == 0xfefe) { + break; + } + mdelay(20); + } + + if (i==50) { + DEBUG("ft1000_hw:ft1000_reset_card:No FEFE detected from DSP\n"); + return FALSE; + } + + +#endif + + DEBUG("ft1000_hw:ft1000_reset_card: call dsp_reload\n"); + dsp_reload(ft1000dev); + + DEBUG("dsp reload successful\n"); + + + mdelay(10); + + // Initialize DSP heartbeat area to ho + ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag, FT1000_MAG_HI_HO_INDX); + ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (PCHAR)&tempword, FT1000_MAG_HI_HO_INDX); + DEBUG("ft1000_hw:ft1000_reset_card:hi_ho value = 0x%x\n", tempword); + + + + info->CardReady = 1; + //ft1000_enable_interrupts(dev); + /* Schedule heartbeat process to run every 2 seconds */ + //poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + //poll_timer[info->CardNumber].data = (u_long)dev; + //add_timer(&poll_timer[info->CardNumber]); + + info->fCondResetPend = 0; + return TRUE; + +} + + +//mbelian +#ifdef HAVE_NET_DEVICE_OPS +static const struct net_device_ops ftnet_ops = +{ +.ndo_open = &ft1000_open, +.ndo_stop = &ft1000_close, +.ndo_start_xmit = &ft1000_start_xmit, +.ndo_get_stats = &ft1000_netdev_stats, +}; +#endif + + +//--------------------------------------------------------------------------- +// Function: init_ft1000_netdev +// +// Parameters: ft1000dev - device structure +// +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function initialize the network device +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 init_ft1000_netdev(struct ft1000_device *ft1000dev) +{ + struct net_device *netdev; + FT1000_INFO *pInfo = NULL; + PDPRAM_BLK pdpram_blk; + int i; + + gCardIndex=0; //mbelian + + DEBUG("Enter init_ft1000_netdev...\n"); + + + netdev = alloc_etherdev( sizeof(FT1000_INFO)); + if (!netdev ) + { + DEBUG("init_ft1000_netdev: can not allocate network device\n"); + return STATUS_FAILURE; + } + + //pInfo = (PFT1000_INFO)netdev->priv; + pInfo = (FT1000_INFO *) netdev_priv (netdev); + + //DEBUG("init_ft1000_netdev: gFt1000Info=%x, netdev=%x, ft1000dev=%x\n", gFt1000Info, netdev, ft1000dev); + + memset (pInfo, 0, sizeof(FT1000_INFO)); + + dev_alloc_name(netdev, netdev->name); + + //for the first inserted card, decide the card index beginning number, in case there are existing network interfaces + if ( gCardIndex == 0 ) + { + DEBUG("init_ft1000_netdev: network device name is %s\n", netdev->name); + + if ( strncmp(netdev->name,"eth", 3) == 0) { + //pInfo->CardNumber = atoi(&netdev->name[3]); + gCardIndex = atoi(&netdev->name[3]); + pInfo->CardNumber = gCardIndex; + DEBUG("card number = %d\n", pInfo->CardNumber); + } + else { + printk(KERN_ERR "ft1000: Invalid device name\n"); + kfree(netdev); + return STATUS_FAILURE; + } + } + else + { + //not the first inserted card, increase card number by 1 + /*gCardIndex ++;*/ + pInfo->CardNumber = gCardIndex; + /*DEBUG("card number = %d\n", pInfo->CardNumber);*/ //mbelian + } + + memset(&pInfo->stats, 0, sizeof(struct net_device_stats) ); + + spin_lock_init(&pInfo->dpram_lock); + pInfo->pFt1000Dev = ft1000dev; + pInfo->DrvErrNum = 0; + pInfo->ASICResetNum = 0; + pInfo->registered = 1; + pInfo->ft1000_reset = ft1000_reset; + pInfo->mediastate = 0; + pInfo->fifo_cnt = 0; + pInfo->DeviceCreated = FALSE; + pInfo->DeviceMajor = 0; + pInfo->CurrentInterruptEnableMask = ISR_DEFAULT_MASK; + pInfo->InterruptsEnabled = FALSE; + pInfo->CardReady = 0; + pInfo->DSP_loading = 0; + pInfo->DSP_TIME[0] = 0; + pInfo->DSP_TIME[1] = 0; + pInfo->DSP_TIME[2] = 0; + pInfo->DSP_TIME[3] = 0; + pInfo->fAppMsgPend = 0; + pInfo->fCondResetPend = 0; + pInfo->usbboot = 0; + pInfo->dspalive = 0; + for (i=0;i<32 ;i++ ) + { + pInfo->tempbuf[i] = 0; + } + + INIT_LIST_HEAD(&pInfo->prov_list); + +//mbelian +#ifdef HAVE_NET_DEVICE_OPS + netdev->netdev_ops = &ftnet_ops; +#else + netdev->hard_start_xmit = &ft1000_start_xmit; + netdev->get_stats = &ft1000_netdev_stats; + netdev->open = &ft1000_open; + netdev->stop = &ft1000_close; +#endif + + //netif_stop_queue(netdev); //mbelian + + + ft1000dev->net = netdev; + + + +//init free_buff_lock, freercvpool, numofmsgbuf, pdpram_blk +//only init once per card +//Jim + DEBUG("Initialize free_buff_lock and freercvpool\n"); + spin_lock_init(&free_buff_lock); + + // initialize a list of buffers to be use for queuing up receive command data + INIT_LIST_HEAD (&freercvpool); + + // create list of free buffers + for (i=0; ipbuffer = kmalloc ( MAX_CMD_SQSIZE, GFP_KERNEL ); + // link provisioning data + list_add_tail (&pdpram_blk->list, &freercvpool); + } + numofmsgbuf = NUM_OF_FREE_BUFFERS; + + + return STATUS_SUCCESS; + +} + + + +//--------------------------------------------------------------------------- +// Function: reg_ft1000_netdev +// +// Parameters: ft1000dev - device structure +// +// +// Returns: STATUS_SUCCESS - success +// STATUS_FAILURE - failure +// +// Description: This function register the network driver +// +// Notes: +// +//--------------------------------------------------------------------------- +u16 reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf) +{ + struct net_device *netdev; + FT1000_INFO *pInfo; + int i, rc; + + netdev = ft1000dev->net; + pInfo = netdev_priv(ft1000dev->net); + DEBUG("Enter reg_ft1000_netdev...\n"); + + + ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID); + + usb_set_intfdata(intf, pInfo); + SET_NETDEV_DEV(netdev, &intf->dev); + + rc = register_netdev(netdev); + if (rc) + { + DEBUG("reg_ft1000_netdev: could not register network device\n"); + free_netdev(netdev); + return STATUS_FAILURE; + } + + + //Create character device, implemented by Jim + ft1000_CreateDevice(ft1000dev); + + //INIT_LIST_HEAD(&pInfo->prov_list); + + for (i=0; idev_addr[0] = 0; + netdev->dev_addr[1] = 7; + netdev->dev_addr[2] = 0x35; + netdev->dev_addr[3] = 0x84; + netdev->dev_addr[4] = 0; + netdev->dev_addr[5] = 0x20 + pInfo->CardNumber; +**/ + + DEBUG ("reg_ft1000_netdev returned\n"); + + pInfo->CardReady = 1; + + + return STATUS_SUCCESS; +} + +int ft1000_reset(struct net_device *dev) +{ + ft1000_reset_card(dev); + return 0; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_usb_transmit_complete +// +// Parameters: urb - transmitted usb urb +// +// +// Returns: none +// +// Description: This is the callback function when a urb is transmitted +// +// Notes: +// +//--------------------------------------------------------------------------- +static void ft1000_usb_transmit_complete(struct urb *urb) +{ + + struct ft1000_device *ft1000dev = urb->context; + + //DEBUG("ft1000_usb_transmit_complete entered\n"); +// Jim spin_lock(&ft1000dev->device_lock); + + if (urb->status) + printk("%s: TX status %d\n", ft1000dev->net->name, urb->status); + + netif_wake_queue(ft1000dev->net); + +//Jim spin_unlock(&ft1000dev->device_lock); + //DEBUG("Return from ft1000_usb_transmit_complete\n"); +} + + +/**************************************************************** + * ft1000_control + ****************************************************************/ +static int ft1000_read_fifo_reg(struct ft1000_device *ft1000dev,unsigned int pipe, + u8 request, + u8 requesttype, + u16 value, + u16 index, + void *data, + u16 size, + int timeout) +{ + u16 ret; + + DECLARE_WAITQUEUE(wait, current); + struct urb *urb; + struct usb_ctrlrequest *dr; + int status; + + if (ft1000dev == NULL ) + { + DEBUG("NULL ft1000dev, failure\n"); + return STATUS_FAILURE; + } + else if ( ft1000dev->dev == NULL ) + { + DEBUG("NULL ft1000dev->dev, failure\n"); + return STATUS_FAILURE; + } + + spin_lock(&ft1000dev->device_lock); + + /*DECLARE_WAITQUEUE(wait, current); + struct urb *urb; + struct usb_ctrlrequest *dr; + int status;*/ + + if(in_interrupt()) + { + spin_unlock(&ft1000dev->device_lock); + return -EBUSY; + } + + urb = usb_alloc_urb(0, GFP_KERNEL); + dr = kmalloc(sizeof(struct usb_ctrlrequest), in_interrupt() ? GFP_ATOMIC : GFP_KERNEL); + + if(!urb || !dr) + { + if(urb) kfree(urb); + spin_unlock(&ft1000dev->device_lock); + return -ENOMEM; + } + + + + dr->bRequestType = requesttype; + dr->bRequest = request; + dr->wValue = value; + dr->wIndex = index; + dr->wLength = size; + + usb_fill_control_urb(urb, ft1000dev->dev, pipe, (char*)dr, (void*)data, size, (void *)ft1000_control_complete, (void*)ft1000dev); + + + init_waitqueue_head(&ft1000dev->control_wait); + + //current->state = TASK_INTERRUPTIBLE; //mbelian + set_current_state(TASK_INTERRUPTIBLE); + + add_wait_queue(&ft1000dev->control_wait, &wait); + + + + + status = usb_submit_urb(urb, GFP_KERNEL); + + if(status) + { + usb_free_urb(urb); + kfree(dr); + remove_wait_queue(&ft1000dev->control_wait, &wait); + spin_unlock(&ft1000dev->device_lock); + return status; + } + + if(urb->status == -EINPROGRESS) + { + while(timeout && urb->status == -EINPROGRESS) + { + status = timeout = schedule_timeout(timeout); + } + } + else + { + status = 1; + } + + remove_wait_queue(&ft1000dev->control_wait, &wait); + + if(!status) + { + usb_unlink_urb(urb); + printk("ft1000 timeout\n"); + status = -ETIMEDOUT; + } + else + { + status = urb->status; + + if(urb->status) + { + printk("ft1000 control message failed (urb addr: %x) with error number: %i\n", (int)urb, (int)status); + + usb_clear_halt(ft1000dev->dev, usb_rcvctrlpipe(ft1000dev->dev, 0)); + usb_clear_halt(ft1000dev->dev, usb_sndctrlpipe(ft1000dev->dev, 0)); + usb_unlink_urb(urb); + } + } + + + + usb_free_urb(urb); + kfree(dr); + spin_unlock(&ft1000dev->device_lock); + return ret; + + +} + +//--------------------------------------------------------------------------- +// Function: ft1000_read_fifo_len +// +// Parameters: ft1000dev - device structure +// +// +// Returns: none +// +// Description: read the fifo length register content +// +// Notes: +// +//--------------------------------------------------------------------------- +static inline u16 ft1000_read_fifo_len (struct net_device *dev) +{ + u16 temp; + u16 ret; + + //FT1000_INFO *info = (PFT1000_INFO)dev->priv; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev); + struct ft1000_device *ft1000dev = info->pFt1000Dev; +// DEBUG("ft1000_read_fifo_len: enter ft1000dev %x\n", ft1000dev); //aelias [-] reason: warning: format ???%x??? expects type ???unsigned int???, but argument 2 has type ???struct ft1000_device *??? + DEBUG("ft1000_read_fifo_len: enter ft1000dev %x\n", (unsigned int)ft1000dev); //aelias [+] reason: up + //ft1000_read_register(ft1000dev, &temp, FT1000_REG_MAG_UFSR); + + ret = STATUS_SUCCESS; + + ret = ft1000_read_fifo_reg(ft1000dev, + usb_rcvctrlpipe(ft1000dev->dev,0), + HARLEY_READ_REGISTER, + HARLEY_READ_OPERATION, + 0, + FT1000_REG_MAG_UFSR, + &temp, + 2, + LARGE_TIMEOUT); + + if (ret>0) + ret = STATUS_SUCCESS; + else + ret = STATUS_FAILURE; + + DEBUG("ft1000_read_fifo_len: returned %d\n", temp); + + return (temp- 16); + +} + + +//--------------------------------------------------------------------------- +// +// Function: ft1000_copy_down_pkt +// Descripton: This function will take an ethernet packet and convert it to +// a Flarion packet prior to sending it to the ASIC Downlink +// FIFO. +// Input: +// dev - device structure +// packet - address of ethernet packet +// len - length of IP packet +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_copy_down_pkt (struct net_device *netdev, u8 *packet, u16 len) +{ + FT1000_INFO *pInfo = netdev_priv(netdev); + struct ft1000_device *pFt1000Dev = pInfo->pFt1000Dev; + + + int i, count, ret; + USHORT *pTemp; + USHORT checksum; + u8 *t; + + if (!pInfo->CardReady) + { + + DEBUG("ft1000_copy_down_pkt::Card Not Ready\n"); + return STATUS_FAILURE; + + } + + + //DEBUG("ft1000_copy_down_pkt() entered, len = %d\n", len); + +#if 0 + // Check if there is room on the FIFO + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(10); + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(20); + } + + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(20); + } + + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(20); + } + + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(20); + } + + if ( len > ft1000_read_fifo_len (netdev) ) + { + udelay(20); + } + + if ( len > ft1000_read_fifo_len (netdev) ) + { + DEBUG("ft1000_hw:ft1000_copy_down_pkt:Transmit FIFO is fulli - pkt drop\n"); + pInfo->stats.tx_errors++; + return STATUS_SUCCESS; + } + } +#endif + + count = sizeof (PSEUDO_HDR) + len; + if(count > MAX_BUF_SIZE) + { + DEBUG("Error:ft1000_copy_down_pkt:Message Size Overflow!\n"); + DEBUG("size = %d\n", count); + return STATUS_FAILURE; + } + + if ( count % 4) + count = count + (4- (count %4) ); + + pTemp = (PUSHORT)&(pFt1000Dev->tx_buf[0]); + *pTemp ++ = ntohs(count); + *pTemp ++ = 0x1020; + *pTemp ++ = 0x2010; + *pTemp ++ = 0x9100; + *pTemp ++ = 0; + *pTemp ++ = 0; + *pTemp ++ = 0; + pTemp = (PUSHORT)&(pFt1000Dev->tx_buf[0]); + checksum = *pTemp ++; + for (i=1; i<7; i++) + { + checksum ^= *pTemp ++; + } + *pTemp++ = checksum; + memcpy (&(pFt1000Dev->tx_buf[sizeof(PSEUDO_HDR)]), packet, len); + + //usb_init_urb(pFt1000Dev->tx_urb); //mbelian + + netif_stop_queue(netdev); + + //DEBUG ("ft1000_copy_down_pkt: count = %d\n", count); + + usb_fill_bulk_urb(pFt1000Dev->tx_urb, + pFt1000Dev->dev, + usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr), + pFt1000Dev->tx_buf, + count, + ft1000_usb_transmit_complete, + (void*)pFt1000Dev); + + t = (u8 *)pFt1000Dev->tx_urb->transfer_buffer; + //DEBUG("transfer_length=%d\n", pFt1000Dev->tx_urb->transfer_buffer_length); + /*for (i=0; itx_urb, GFP_ATOMIC); + if(ret) + { + DEBUG("ft1000 failed tx_urb %d\n", ret); + + /* pInfo->stats.tx_errors++; + + netif_start_queue(netdev); */ //mbelian + return STATUS_FAILURE; + + } + else + { + //DEBUG("ft1000 sucess tx_urb %d\n", ret); + + pInfo->stats.tx_packets++; + pInfo->stats.tx_bytes += (len+14); + } + + //DEBUG("ft1000_copy_down_pkt() exit\n"); + + return STATUS_SUCCESS; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_start_xmit +// +// Parameters: skb - socket buffer to be sent +// dev - network device +// +// +// Returns: none +// +// Description: transmit a ethernet packet +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) +{ + FT1000_INFO *pInfo = netdev_priv(dev); + struct ft1000_device *pFt1000Dev= pInfo->pFt1000Dev; + u8 *pdata; + int maxlen, pipe; + + + //DEBUG(" ft1000_start_xmit() entered\n"); + + if ( skb == NULL ) + { + DEBUG ("ft1000_hw: ft1000_start_xmit:skb == NULL!!!\n" ); + return STATUS_FAILURE; + } + + if ( pFt1000Dev->status & FT1000_STATUS_CLOSING) + { + DEBUG("network driver is closed, return\n"); + dev_kfree_skb(skb); + //usb_kill_urb(pFt1000Dev->tx_urb); //mbelian + return STATUS_SUCCESS; + } + + //DEBUG("ft1000_start_xmit 1:length of packet = %d\n", skb->len); + pipe = usb_sndbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_out_endpointAddr); + maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe)); + //DEBUG("ft1000_start_xmit 2: pipe=%d dev->maxpacket = %d\n", pipe, maxlen); + + pdata = (u8 *)skb->data; + /*for (i=0; ilen; i++) + DEBUG("skb->data[%d]=%x ", i, *(skb->data+i)); + + DEBUG("\n");*/ + + + if (pInfo->mediastate == 0) + { + /* Drop packet is mediastate is down */ + DEBUG("ft1000_hw:ft1000_start_xmit:mediastate is down\n"); + dev_kfree_skb(skb); + return STATUS_SUCCESS; + } + + if ( (skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE) ) + { + /* Drop packet which has invalid size */ + DEBUG("ft1000_hw:ft1000_start_xmit:invalid ethernet length\n"); + dev_kfree_skb(skb); + return STATUS_SUCCESS; + } +//mbelian + if(ft1000_copy_down_pkt (dev, (pdata+ENET_HEADER_SIZE-2), skb->len - ENET_HEADER_SIZE + 2) == STATUS_FAILURE) + { + dev_kfree_skb(skb); + return STATUS_SUCCESS; + } + + dev_kfree_skb(skb); + //DEBUG(" ft1000_start_xmit() exit\n"); + + return 0; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_copy_up_pkt +// Descripton: This function will take a packet from the FIFO up link and +// convert it into an ethernet packet and deliver it to the IP stack +// Input: +// urb - the receving usb urb +// +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_copy_up_pkt (struct urb *urb) +{ + PFT1000_INFO info = urb->context; + struct ft1000_device *ft1000dev = info->pFt1000Dev; + struct net_device *net = ft1000dev->net; + + u16 tempword; + u16 len; + u16 lena; //mbelian + struct sk_buff *skb; + u16 i; + u8 *pbuffer=NULL; + u8 *ptemp=NULL; + u16 *chksum; + + + //DEBUG("ft1000_copy_up_pkt entered\n"); + + if ( ft1000dev->status & FT1000_STATUS_CLOSING) + { + DEBUG("network driver is closed, return\n"); + return STATUS_SUCCESS; + } + + // Read length + len = urb->transfer_buffer_length; + lena = urb->actual_length; //mbelian + //DEBUG("ft1000_copy_up_pkt: transfer_buffer_length=%d, actual_buffer_len=%d\n", + // urb->transfer_buffer_length, urb->actual_length); + + chksum = (PUSHORT)ft1000dev->rx_buf; + + tempword = *chksum++; + for (i=1; i<7; i++) + { + tempword ^= *chksum++; + } + + if (tempword != *chksum) + { + info->stats.rx_errors ++; + ft1000_submit_rx_urb(info); + return STATUS_FAILURE; + } + + + //DEBUG("ft1000_copy_up_pkt: checksum is correct %x\n", *chksum); + + skb = dev_alloc_skb(len+12+2); + + if (skb == NULL) + { + DEBUG("ft1000_copy_up_pkt: No Network buffers available\n"); + info->stats.rx_errors++; + ft1000_submit_rx_urb(info); + return STATUS_FAILURE; + } + + pbuffer = (u8 *)skb_put(skb, len+12); + + //subtract the number of bytes read already + ptemp = pbuffer; + + // fake MAC address + *pbuffer++ = net->dev_addr[0]; + *pbuffer++ = net->dev_addr[1]; + *pbuffer++ = net->dev_addr[2]; + *pbuffer++ = net->dev_addr[3]; + *pbuffer++ = net->dev_addr[4]; + *pbuffer++ = net->dev_addr[5]; + *pbuffer++ = 0x00; + *pbuffer++ = 0x07; + *pbuffer++ = 0x35; + *pbuffer++ = 0xff; + *pbuffer++ = 0xff; + *pbuffer++ = 0xfe; + + + + + memcpy(pbuffer, ft1000dev->rx_buf+sizeof(PSEUDO_HDR), len-sizeof(PSEUDO_HDR)); + + //DEBUG("ft1000_copy_up_pkt: Data passed to Protocol layer\n"); + /*for (i=0; idev = net; + + skb->protocol = eth_type_trans(skb, net); + skb->ip_summed = CHECKSUM_UNNECESSARY; + netif_rx(skb); + + info->stats.rx_packets++; + // Add on 12 bytes for MAC address which was removed + info->stats.rx_bytes += (lena+12); //mbelian + + ft1000_submit_rx_urb(info); + //DEBUG("ft1000_copy_up_pkt exited\n"); + return SUCCESS; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_submit_rx_urb +// Descripton: the receiving function of the network driver +// +// Input: +// info - a private structure contains the device information +// +// Output: +// status - FAILURE +// SUCCESS +// +//--------------------------------------------------------------------------- +int ft1000_submit_rx_urb(PFT1000_INFO info) +{ + int result; + struct ft1000_device *pFt1000Dev = info->pFt1000Dev; + + //netif_carrier_on(pFt1000Dev->net); + + //DEBUG ("ft1000_submit_rx_urb entered: sizeof rx_urb is %d\n", sizeof(*pFt1000Dev->rx_urb)); + if ( pFt1000Dev->status & FT1000_STATUS_CLOSING) + { + DEBUG("network driver is closed, return\n"); + //usb_kill_urb(pFt1000Dev->rx_urb); //mbelian + return STATUS_SUCCESS; + } + //memset(pFt1000Dev->rx_urb, 0, sizeof(*pFt1000Dev->rx_urb)); + //usb_init_urb(pFt1000Dev->rx_urb);//mbelian + + //spin_lock_init(&pFt1000Dev->rx_urb->lock); + + usb_fill_bulk_urb(pFt1000Dev->rx_urb, + pFt1000Dev->dev, + usb_rcvbulkpipe(pFt1000Dev->dev, pFt1000Dev->bulk_in_endpointAddr), + pFt1000Dev->rx_buf, + MAX_BUF_SIZE, + (usb_complete_t)ft1000_copy_up_pkt, + info); + + + if((result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC))) + { + printk("ft1000_submit_rx_urb: submitting rx_urb %d failed\n", result); + return STATUS_FAILURE; + } + + //DEBUG("ft1000_submit_rx_urb exit: result=%d\n", result); + + return STATUS_SUCCESS; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_open +// +// Parameters: +// dev - network device +// +// +// Returns: none +// +// Description: open the network driver +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_open (struct net_device *dev) +{ + FT1000_INFO *pInfo = (FT1000_INFO *)netdev_priv(dev); + struct timeval tv; //mbelian + + DEBUG("ft1000_open is called for card %d\n", pInfo->CardNumber); + //DEBUG("ft1000_open: dev->addr=%x, dev->addr_len=%d\n", dev->addr, dev->addr_len); + + pInfo->stats.rx_bytes = 0; //mbelian + pInfo->stats.tx_bytes = 0; //mbelian + pInfo->stats.rx_packets = 0; //mbelian + pInfo->stats.tx_packets = 0; //mbelian + do_gettimeofday(&tv); + pInfo->ConTm = tv.tv_sec; + pInfo->ProgConStat = 0; //mbelian + + + netif_start_queue(dev); + + //netif_device_attach(dev); + + netif_carrier_on(dev); //mbelian + + ft1000_submit_rx_urb(pInfo); + return 0; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_close +// +// Parameters: +// net - network device +// +// +// Returns: none +// +// Description: close the network driver +// +// Notes: +// +//--------------------------------------------------------------------------- +int ft1000_close(struct net_device *net) +{ + FT1000_INFO *pInfo = (FT1000_INFO *) netdev_priv (net); + struct ft1000_device *ft1000dev = pInfo->pFt1000Dev; + + //DEBUG ("ft1000_close: netdev->refcnt=%d\n", net->refcnt); + + ft1000dev->status |= FT1000_STATUS_CLOSING; + + //DEBUG("ft1000_close: calling usb_kill_urb \n"); + //usb_kill_urb(ft1000dev->rx_urb); + //usb_kill_urb(ft1000dev->tx_urb); + + + DEBUG("ft1000_close: pInfo=%x, ft1000dev=%x\n", (int)pInfo, (int)ft1000dev); + netif_carrier_off(net);//mbelian + netif_stop_queue(net); + //DEBUG("ft1000_close: netif_stop_queue called\n"); + ft1000dev->status &= ~FT1000_STATUS_CLOSING; + + pInfo->ProgConStat = 0xff; //mbelian + + + return 0; +} + +static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev) +{ + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev); + //struct ft1000_device *ft1000dev = info->pFt1000Dev; + + //return &(ft1000dev->stats);//mbelian + return &(info->stats); //mbelian +} + + +/********************************************************************************* +Jim +*/ + + +//--------------------------------------------------------------------------- +// +// Function: ft1000_chkcard +// Descripton: This function will check if the device is presently available on +// the system. +// Input: +// dev - device structure +// Output: +// status - FALSE (device is not present) +// TRUE (device is present) +// +//--------------------------------------------------------------------------- +static int ft1000_chkcard (struct ft1000_device *dev) { + u16 tempword; + u16 status; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net); + + if (info->fCondResetPend) + { + DEBUG("ft1000_hw:ft1000_chkcard:Card is being reset, return FALSE\n"); + return TRUE; + } + + // Mask register is used to check for device presence since it is never + // set to zero. + status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK); + //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_SUP_IMASK = %x\n", tempword); + if (tempword == 0) { + DEBUG("ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n"); + return FALSE; + } + + // The system will return the value of 0xffff for the version register + // if the device is not present. + status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID); + //DEBUG("ft1000_hw:ft1000_chkcard: read FT1000_REG_ASIC_ID = %x\n", tempword); + //pxu if (tempword == 0xffff) { + if (tempword != 0x1b01 ){ + dev->status |= FT1000_STATUS_CLOSING; //mbelian + DEBUG("ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n"); + return FALSE; + } + return TRUE; +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_hbchk +// Descripton: This function will perform the heart beat check of the DSP as +// well as the ASIC. +// Input: +// dev - device structure +// Output: +// none +// +//--------------------------------------------------------------------------- +static void ft1000_hbchk(u_long data) +{ + struct ft1000_device *dev = (struct ft1000_device *)data; + + FT1000_INFO *info; + USHORT tempword; + u16 status; + info = (FT1000_INFO *) netdev_priv (dev->net); + + DEBUG("ft1000_hbchk called for CardNumber = %d CardReady = %d\n", info->CardNumber, info->CardReady); + + if (info->fCondResetPend == 1) { + // Reset ASIC and DSP + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX); + + info->DrvErrNum = DSP_CONDRESET_INFO; + DEBUG("ft1000_hw:DSP conditional reset requested\n"); + ft1000_reset_card(dev->net); + info->fCondResetPend = 0; + /* Schedule this module to run every 2 seconds */ + + poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + poll_timer[info->CardNumber].data = (u_long)dev; + add_timer(&poll_timer[info->CardNumber]); + + + + return; + } + + if (info->CardReady == 1) { + // Perform dsp heartbeat check + status = ntohs(ft1000_read_dpram16(dev, FT1000_MAG_HI_HO, (PUCHAR)&tempword, FT1000_MAG_HI_HO_INDX)); + DEBUG("ft1000_hw:ft1000_hbchk:hi_ho value = 0x%x\n", tempword); + // Let's perform another check if ho is not detected + if (tempword != ho) { + status = ntohs(ft1000_read_dpram16(dev, FT1000_MAG_HI_HO, (PUCHAR)&tempword,FT1000_MAG_HI_HO_INDX)); + } + if (tempword != ho) { + printk(KERN_INFO "ft1000: heartbeat failed - no ho detected\n"); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX); + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev->net) == 0) { + printk(KERN_INFO "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + poll_timer[info->CardNumber].data = (u_long)dev; + add_timer(&poll_timer[info->CardNumber]); + return; + } + + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + // Let's check doorbell again if fail + if (tempword & FT1000_DB_HB) { + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + } + if (tempword & FT1000_DB_HB) { + printk(KERN_INFO "ft1000: heartbeat doorbell not clear by firmware\n"); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX); + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev->net) == 0) { + printk(KERN_INFO "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + poll_timer[info->CardNumber].data = (u_long)dev; + add_timer(&poll_timer[info->CardNumber]); + return; + } + + // Set dedicated area to hi and ring appropriate doorbell according + // to hi/ho heartbeat protocol + ft1000_write_dpram16(dev, FT1000_MAG_HI_HO, hi_mag, FT1000_MAG_HI_HO_INDX); + + status = ntohs(ft1000_read_dpram16(dev, FT1000_MAG_HI_HO, (PUCHAR)&tempword, FT1000_MAG_HI_HO_INDX)); + // Let's write hi again if fail + if (tempword != hi) { + ft1000_write_dpram16(dev, FT1000_MAG_HI_HO, hi_mag, FT1000_MAG_HI_HO_INDX); + status = ntohs(ft1000_read_dpram16(dev, FT1000_MAG_HI_HO, (PUCHAR)&tempword, FT1000_MAG_HI_HO_INDX)); + + } + if (tempword != hi) { + printk(KERN_INFO "ft1000: heartbeat failed - cannot write hi into DPRAM\n"); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX); + + info->DrvErrNum = DSP_HB_INFO; + if (ft1000_reset_card(dev->net) == 0) { + printk(KERN_INFO "ft1000: Hardware Failure Detected - PC Card disabled\n"); + info->ProgConStat = 0xff; + return; + } + /* Schedule this module to run every 2 seconds */ + poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + poll_timer[info->CardNumber].data = (u_long)dev; + add_timer(&poll_timer[info->CardNumber]); + return; + } + ft1000_write_register(dev, FT1000_DB_HB, FT1000_REG_DOORBELL); + + } + + /* Schedule this module to run every 2 seconds */ + poll_timer[info->CardNumber].expires = jiffies + (2*HZ); + poll_timer[info->CardNumber].data = (u_long)dev; + add_timer(&poll_timer[info->CardNumber]); +} + +//--------------------------------------------------------------------------- +// +// Function: ft1000_receive_cmd +// Descripton: This function will read a message from the dpram area. +// Input: +// dev - network device structure +// pbuffer - caller supply address to buffer +// pnxtph - pointer to next pseudo header +// Output: +// Status = 0 (unsuccessful) +// = 1 (successful) +// +//--------------------------------------------------------------------------- +BOOLEAN ft1000_receive_cmd (struct ft1000_device *dev, u16 *pbuffer, int maxsz, u16 *pnxtph) { + u16 size, ret; + u16 *ppseudohdr; + int i; + u16 tempword; + + ret = ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (PUCHAR)&size, FT1000_MAG_PH_LEN_INDX); + size = ntohs(size) + PSEUDOSZ; + if (size > maxsz) { + DEBUG("FT1000:ft1000_receive_cmd:Invalid command length = %d\n", size); + return FALSE; + } + else { + ppseudohdr = (u16 *)pbuffer; + //spin_lock_irqsave (&info->dpram_lock, flags); + ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE, FT1000_REG_DPRAM_ADDR); + ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH); + //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE+1, FT1000_REG_DPRAM_ADDR); + for (i=0; i<=(size>>2); i++) { + ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL); + pbuffer++; + ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH); + pbuffer++; + } + //copy odd aligned word + ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL); + //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + ret = ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH); + //DEBUG("ft1000_hw:received data = 0x%x\n", *pbuffer); + pbuffer++; + if (size & 0x0001) { + //copy odd byte from fifo + ret = ft1000_read_register(dev, &tempword, FT1000_REG_DPRAM_DATA); + *pbuffer = ntohs(tempword); + } + //spin_unlock_irqrestore(&info->dpram_lock, flags); + + // Check if pseudo header checksum is good + // Calculate pseudo header checksum + tempword = *ppseudohdr++; + for (i=1; i<7; i++) { + tempword ^= *ppseudohdr++; + } + if ( (tempword != *ppseudohdr) ) { + return FALSE; + } + + +#if 0 + DEBUG("ft1000_receive_cmd:pbuffer\n"); + for(i = 0; i < size; i+=5) + { + if( (i + 5) < size ) + DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", tempbuffer[i], tempbuffer[i+1], tempbuffer[i+2], tempbuffer[i+3], tempbuffer[i+4]); + else + { + for (j = i; j < size; j++) + DEBUG("0x%x ", tempbuffer[j]); + DEBUG("\n"); + break; + } + } + +#endif + + return TRUE; + } +} + + +int ft1000_dsp_prov(void *arg) +{ + struct ft1000_device *dev = (struct ft1000_device *)arg; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net); + u16 tempword; + u16 len; + u16 i=0; + PPROV_RECORD ptr; + PPSEUDO_HDR ppseudo_hdr; + PUSHORT pmsg; + u16 status; + USHORT TempShortBuf [256]; + + DEBUG("*** DspProv Entered\n"); + + while ( list_empty(&info->prov_list) == 0 + /*&& !kthread_should_stop() */) + { + DEBUG("DSP Provisioning List Entry\n"); + + // Check if doorbell is available + DEBUG("check if doorbell is cleared\n"); + status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL); + if (status) + { + DEBUG("ft1000_dsp_prov::ft1000_read_register error\n"); + break; + } + + while (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + i++; + if (i==10) { + DEBUG("FT1000:ft1000_dsp_prov:message drop\n"); + return STATUS_FAILURE; + } + ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + } + + if ( !(tempword & FT1000_DB_DPRAM_TX) ) { + DEBUG("*** Provision Data Sent to DSP\n"); + + // Send provisioning data + ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + len = *(u16 *)ptr->pprov_data; + len = htons(len); + len += PSEUDOSZ; + //len = htons(len); + + pmsg = (PUSHORT)ptr->pprov_data; + ppseudo_hdr = (PPSEUDO_HDR)pmsg; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum); + for (i=1; i<7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + //DEBUG("checksum = 0x%x\n", ppseudo_hdr->checksum); + } + + TempShortBuf[0] = 0; + TempShortBuf[1] = htons (len); + memcpy(&TempShortBuf[2], ppseudo_hdr, len); + + status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&TempShortBuf[0], (unsigned short)(len+2)); + status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL); + + list_del(&ptr->list); + kfree(ptr->pprov_data); + kfree(ptr); + } + msleep(10); + } + + DEBUG("DSP Provisioning List Entry finished\n"); + + msleep(100); + + info->fProvComplete = 1; + info->CardReady = 1; + info->DSP_loading= 0; + return STATUS_SUCCESS; + +} + + +int ft1000_proc_drvmsg (struct ft1000_device *dev, u16 size) { + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net); + u16 msgtype; + u16 tempword; + PMEDIAMSG pmediamsg; + PDSPINITMSG pdspinitmsg; + PDRVMSG pdrvmsg; + u16 i; + PPSEUDO_HDR ppseudo_hdr; + PUSHORT pmsg; + u16 status; + //struct timeval tv; //mbelian + union { + u8 byte[2]; + u16 wrd; + } convert; + + + char cmdbuffer[1600]; + + status = ft1000_read_dpram32(dev, 0x200, (PUCHAR)&cmdbuffer[0], size); + + + //if (ft1000_receive_cmd(dev, &cmdbuffer[0], MAX_CMD_SQSIZE, &tempword)) + { + +#ifdef JDEBUG + DEBUG("ft1000_proc_drvmsg:cmdbuffer\n"); + for(i = 0; i < size; i+=5) + { + if( (i + 5) < size ) + DEBUG("0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", cmdbuffer[i], cmdbuffer[i+1], cmdbuffer[i+2], cmdbuffer[i+3], cmdbuffer[i+4]); + else + { + for (j = i; j < size; j++) + DEBUG("0x%x ", cmdbuffer[j]); + DEBUG("\n"); + break; + } + } +#endif + pdrvmsg = (PDRVMSG)&cmdbuffer[2]; + msgtype = ntohs(pdrvmsg->type); + DEBUG("ft1000_proc_drvmsg:Command message type = 0x%x\n", msgtype); + switch (msgtype) { + case MEDIA_STATE: { + DEBUG("ft1000_proc_drvmsg:Command message type = MEDIA_STATE"); + + pmediamsg = (PMEDIAMSG)&cmdbuffer[0]; + if (info->ProgConStat != 0xFF) { + if (pmediamsg->state) { + DEBUG("Media is up\n"); + if (info->mediastate == 0) { + if ( info->NetDevRegDone ) + { + //netif_carrier_on(dev->net);//mbelian + netif_wake_queue(dev->net); + } + info->mediastate = 1; + /*do_gettimeofday(&tv); + info->ConTm = tv.tv_sec;*/ //mbelian + } + } + else { + DEBUG("Media is down\n"); + if (info->mediastate == 1) { + info->mediastate = 0; + if ( info->NetDevRegDone ) + { + //netif_carrier_off(dev->net); mbelian + //netif_stop_queue(dev->net); + } + info->ConTm = 0; + } + } + } + else { + DEBUG("Media is down\n"); + if (info->mediastate == 1) { + info->mediastate = 0; + if ( info->NetDevRegDone) + { + //netif_carrier_off(dev->net); //mbelian + //netif_stop_queue(dev->net); + } + info->ConTm = 0; + } + } + break; + } + case DSP_INIT_MSG: { + DEBUG("ft1000_proc_drvmsg:Command message type = DSP_INIT_MSG"); + + pdspinitmsg = (PDSPINITMSG)&cmdbuffer[2]; + memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); + DEBUG("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], info->DspVer[3]); + memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, HWSERNUMSZ); + memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); + memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); + DEBUG("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", info->eui64[0],info->eui64[1], info->eui64[2], info->eui64[3], info->eui64[4], info->eui64[5],info->eui64[6], info->eui64[7]); + dev->net->dev_addr[0] = info->eui64[0]; + dev->net->dev_addr[1] = info->eui64[1]; + dev->net->dev_addr[2] = info->eui64[2]; + dev->net->dev_addr[3] = info->eui64[5]; + dev->net->dev_addr[4] = info->eui64[6]; + dev->net->dev_addr[5] = info->eui64[7]; + + if (ntohs(pdspinitmsg->length) == (sizeof(DSPINITMSG) - 20) ) { + memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ); + memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ); + memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, CALDATESZ); + DEBUG("RFCalVer = 0x%2x 0x%2x\n", info->RfCalVer[0], info->RfCalVer[1]); + } + break; + } + case DSP_PROVISION: { + DEBUG("ft1000_proc_drvmsg:Command message type = DSP_PROVISION\n"); + + // kick off dspprov routine to start provisioning + // Send provisioning data to DSP + if (list_empty(&info->prov_list) == 0) + { + info->fProvComplete = 0; + status = ft1000_dsp_prov(dev); + if (status != STATUS_SUCCESS) + return status; + } + else { + info->fProvComplete = 1; + status = ft1000_write_register (dev, FT1000_DB_HB, FT1000_REG_DOORBELL); + DEBUG("FT1000:drivermsg:No more DSP provisioning data in dsp image\n"); + } + DEBUG("ft1000_proc_drvmsg:DSP PROVISION is done\n"); + break; + } + case DSP_STORE_INFO: { + DEBUG("ft1000_proc_drvmsg:Command message type = DSP_STORE_INFO"); + + DEBUG("FT1000:drivermsg:Got DSP_STORE_INFO\n"); + tempword = ntohs(pdrvmsg->length); + info->DSPInfoBlklen = tempword; + if (tempword < (MAX_DSP_SESS_REC-4) ) { + pmsg = (PUSHORT)&pdrvmsg->data[0]; + for (i=0; i<((tempword+1)/2); i++) { + DEBUG("FT1000:drivermsg:dsp info data = 0x%x\n", *pmsg); + info->DSPInfoBlk[i+10] = *pmsg++; + } + } + else { + info->DSPInfoBlklen = 0; + } + break; + } + case DSP_GET_INFO: { + DEBUG("FT1000:drivermsg:Got DSP_GET_INFO\n"); + // copy dsp info block to dsp + info->DrvMsgPend = 1; + // allow any outstanding ioctl to finish + mdelay(10); + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + break; + } + } + } + + // Put message into Slow Queue + // Form Pseudo header + pmsg = (PUSHORT)info->DSPInfoBlk; + *pmsg++ = 0; + *pmsg++ = htons(info->DSPInfoBlklen+20+info->DSPInfoBlklen); + ppseudo_hdr = (PPSEUDO_HDR)(PUSHORT)&info->DSPInfoBlk[2]; + ppseudo_hdr->length = htons(info->DSPInfoBlklen+4+info->DSPInfoBlklen); + ppseudo_hdr->source = 0x10; + ppseudo_hdr->destination = 0x20; + ppseudo_hdr->portdest = 0; + ppseudo_hdr->portsrc = 0; + ppseudo_hdr->sh_str_id = 0; + ppseudo_hdr->control = 0; + ppseudo_hdr->rsvd1 = 0; + ppseudo_hdr->rsvd2 = 0; + ppseudo_hdr->qos_class = 0; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + // Insert application id + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + for (i=1; i<7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + } + info->DSPInfoBlk[10] = 0x7200; + info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen); + status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&info->DSPInfoBlk[0], (unsigned short)(info->DSPInfoBlklen+22)); + status = ft1000_write_register (dev, FT1000_DB_DPRAM_TX, FT1000_REG_DOORBELL); + info->DrvMsgPend = 0; + + break; + } + + case GET_DRV_ERR_RPT_MSG: { + DEBUG("FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n"); + // copy driver error message to dsp + info->DrvMsgPend = 1; + // allow any outstanding ioctl to finish + mdelay(10); + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); + if (tempword & FT1000_DB_DPRAM_TX) { + mdelay(10); + } + } + + if ( (tempword & FT1000_DB_DPRAM_TX) == 0) { + // Put message into Slow Queue + // Form Pseudo header + pmsg = (PUSHORT)&tempbuffer[0]; + ppseudo_hdr = (PPSEUDO_HDR)pmsg; + ppseudo_hdr->length = htons(0x0012); + ppseudo_hdr->source = 0x10; + ppseudo_hdr->destination = 0x20; + ppseudo_hdr->portdest = 0; + ppseudo_hdr->portsrc = 0; + ppseudo_hdr->sh_str_id = 0; + ppseudo_hdr->control = 0; + ppseudo_hdr->rsvd1 = 0; + ppseudo_hdr->rsvd2 = 0; + ppseudo_hdr->qos_class = 0; + // Insert slow queue sequence number + ppseudo_hdr->seq_num = info->squeseqnum++; + // Insert application id + ppseudo_hdr->portsrc = 0; + // Calculate new checksum + ppseudo_hdr->checksum = *pmsg++; + for (i=1; i<7; i++) { + ppseudo_hdr->checksum ^= *pmsg++; + } + pmsg = (PUSHORT)&tempbuffer[16]; + *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); + *pmsg++ = htons(0x000e); + *pmsg++ = htons(info->DSP_TIME[0]); + *pmsg++ = htons(info->DSP_TIME[1]); + *pmsg++ = htons(info->DSP_TIME[2]); + *pmsg++ = htons(info->DSP_TIME[3]); + convert.byte[0] = info->DspVer[0]; + convert.byte[1] = info->DspVer[1]; + *pmsg++ = convert.wrd; + convert.byte[0] = info->DspVer[2]; + convert.byte[1] = info->DspVer[3]; + *pmsg++ = convert.wrd; + *pmsg++ = htons(info->DrvErrNum); + + CardSendCommand (dev, (unsigned char*)&tempbuffer[0], (USHORT)(0x0012 + PSEUDOSZ)); + info->DrvErrNum = 0; + } + info->DrvMsgPend = 0; + + break; + } + + default: + break; + } + + } + + DEBUG("return from ft1000_proc_drvmsg\n"); + return STATUS_SUCCESS; +} + + + +int ft1000_poll(void* dev_id) { + + //FT1000_INFO *info = (PFT1000_INFO)((struct net_device *)dev_id)->priv; + //struct ft1000_device *dev = (struct ft1000_device *)info->pFt1000Dev; + struct ft1000_device *dev = (struct ft1000_device *)dev_id; + FT1000_INFO *info = (FT1000_INFO *) netdev_priv (dev->net); + + u16 tempword; + u16 status; + u16 size; + int i; + USHORT data; + USHORT modulo; + USHORT portid; + u16 nxtph; + PDPRAM_BLK pdpram_blk; + PPSEUDO_HDR ppseudo_hdr; + unsigned long flags; + + //DEBUG("Enter ft1000_poll...\n"); + if (ft1000_chkcard(dev) == FALSE) { + DEBUG("ft1000_poll::ft1000_chkcard: failed\n"); + return STATUS_FAILURE; + } + + status = ft1000_read_register (dev, &tempword, FT1000_REG_DOORBELL); + // DEBUG("ft1000_poll: read FT1000_REG_DOORBELL message 0x%x\n", tempword); + + //while ( (tempword) && (!status) ) { + if ( !status ) + { + + if (tempword & FT1000_DB_DPRAM_RX) { + //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX\n"); + + status = ft1000_read_dpram16(dev, 0x200, (PUCHAR)&data, 0); + //DEBUG("ft1000_poll:FT1000_DB_DPRAM_RX:ft1000_read_dpram16:size = 0x%x\n", data); + size = ntohs(data) + 16 + 2; //wai + if (size % 4) { + modulo = 4 - (size % 4); + size = size + modulo; + } + status = ft1000_read_dpram16(dev, 0x201, (PUCHAR)&portid, 1); + portid &= 0xff; + //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid 0x%x\n", portid); + + if (size < MAX_CMD_SQSIZE) { + switch (portid) + { + case DRIVERID: + DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n"); + + status = ft1000_proc_drvmsg (dev, size); + if (status != STATUS_SUCCESS ) + return status; + break; + case DSPBCMSGID: + // This is a dsp broadcast message + // Check which application has registered for dsp broadcast messages + //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DSPBCMSGID\n"); + + for (i=0; iapp_info[i].DspBCMsgFlag) && (info->app_info[i].fileobject) && + (info->app_info[i].NumOfMsg < MAX_MSG_LIMIT) ) + { + //DEBUG("Dsp broadcast message detected for app id %d\n", i); + nxtph = FT1000_DPRAM_RX_BASE + 2; + pdpram_blk = ft1000_get_buffer (&freercvpool); + if (pdpram_blk != NULL) { + if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) { + ppseudo_hdr = (PPSEUDO_HDR)pdpram_blk->pbuffer; + // Put message into the appropriate application block + info->app_info[i].nRxMsg++; + spin_lock_irqsave(&free_buff_lock, flags); + list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist); + info->app_info[i].NumOfMsg++; + spin_unlock_irqrestore(&free_buff_lock, flags); + wake_up_interruptible(&info->app_info[i].wait_dpram_msg); + } + else { + info->app_info[i].nRxMsgMiss++; + // Put memory back to free pool + ft1000_free_buffer(pdpram_blk, &freercvpool); + DEBUG("pdpram_blk::ft1000_get_buffer NULL\n"); + } + } + else { + DEBUG("Out of memory in free receive command pool\n"); + info->app_info[i].nRxMsgMiss++; + }//endof if (pdpram_blk != NULL) + }//endof if + //else + // DEBUG("app_info mismatch\n"); + }// endof for + break; + default: + pdpram_blk = ft1000_get_buffer (&freercvpool); + //DEBUG("Memory allocated = 0x%8x\n", (u32)pdpram_blk); + if (pdpram_blk != NULL) { + if ( ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE, &nxtph) ) { + ppseudo_hdr = (PPSEUDO_HDR)pdpram_blk->pbuffer; + // Search for correct application block + for (i=0; iapp_info[i].app_id == ppseudo_hdr->portdest) { + break; + } + } + + if (i==(MAX_NUM_APP-1)) { // aelias [+] reason: was out of array boundary + info->app_info[i].nRxMsgMiss++; + DEBUG("FT1000:ft1000_parse_dpram_msg: No application matching id = %d\n", ppseudo_hdr->portdest); + // Put memory back to free pool + ft1000_free_buffer(pdpram_blk, &freercvpool); + } + else { + if (info->app_info[i].NumOfMsg > MAX_MSG_LIMIT) { + // Put memory back to free pool + ft1000_free_buffer(pdpram_blk, &freercvpool); + } + else { + info->app_info[i].nRxMsg++; + // Put message into the appropriate application block + //pxu spin_lock_irqsave(&free_buff_lock, flags); + list_add_tail(&pdpram_blk->list, &info->app_info[i].app_sqlist); + info->app_info[i].NumOfMsg++; + //pxu spin_unlock_irqrestore(&free_buff_lock, flags); + //pxu wake_up_interruptible(&info->app_info[i].wait_dpram_msg); + } + } + } + else { + // Put memory back to free pool + ft1000_free_buffer(pdpram_blk, &freercvpool); + } + } + else { + DEBUG("Out of memory in free receive command pool\n"); + } + break; + } //end of switch + } //endof if (size < MAX_CMD_SQSIZE) + else { + DEBUG("FT1000:dpc:Invalid total length for SlowQ = %d\n", size); + } + status = ft1000_write_register (dev, FT1000_DB_DPRAM_RX, FT1000_REG_DOORBELL); + } + else if (tempword & FT1000_DSP_ASIC_RESET) { + //DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DSP_ASIC_RESET\n"); + + // Let's reset the ASIC from the Host side as well + status = ft1000_write_register (dev, ASIC_RESET_BIT, FT1000_REG_RESET); + status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET); + i = 0; + while (tempword & ASIC_RESET_BIT) { + status = ft1000_read_register (dev, &tempword, FT1000_REG_RESET); + msleep(10); + i++; + if (i==100) + break; + } + if (i==100) { + DEBUG("Unable to reset ASIC\n"); + return STATUS_SUCCESS; + } + msleep(10); + // Program WMARK register + status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK); + // clear ASIC reset doorbell + status = ft1000_write_register (dev, FT1000_DSP_ASIC_RESET, FT1000_REG_DOORBELL); + msleep(10); + } + else if (tempword & FT1000_ASIC_RESET_REQ) { + DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_ASIC_RESET_REQ\n"); + + // clear ASIC reset request from DSP + status = ft1000_write_register (dev, FT1000_ASIC_RESET_REQ, FT1000_REG_DOORBELL); + status = ft1000_write_register (dev, HOST_INTF_BE, FT1000_REG_SUP_CTRL); + // copy dsp session record from Adapter block + status = ft1000_write_dpram32 (dev, 0, (PUCHAR)&info->DSPSess.Rec[0], 1024); + // Program WMARK register + status = ft1000_write_register (dev, 0x600, FT1000_REG_MAG_WATERMARK); + // ring doorbell to tell DSP that ASIC is out of reset + status = ft1000_write_register (dev, FT1000_ASIC_RESET_DSP, FT1000_REG_DOORBELL); + } + else if (tempword & FT1000_DB_COND_RESET) { + DEBUG("ft1000_poll: FT1000_REG_DOORBELL message type: FT1000_DB_COND_RESET\n"); +//By Jim +// Reset ASIC and DSP +//MAG + if (info->fAppMsgPend == 0) { + // Reset ASIC and DSP + + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER0, (PUCHAR)&(info->DSP_TIME[0]), FT1000_MAG_DSP_TIMER0_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER1, (PUCHAR)&(info->DSP_TIME[1]), FT1000_MAG_DSP_TIMER1_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER2, (PUCHAR)&(info->DSP_TIME[2]), FT1000_MAG_DSP_TIMER2_INDX); + status = ft1000_read_dpram16(dev, FT1000_MAG_DSP_TIMER3, (PUCHAR)&(info->DSP_TIME[3]), FT1000_MAG_DSP_TIMER3_INDX); + info->CardReady = 0; + info->DrvErrNum = DSP_CONDRESET_INFO; + DEBUG("ft1000_hw:DSP conditional reset requested\n"); + info->ft1000_reset(dev->net); + } + else { + info->fProvComplete = 0; + info->fCondResetPend = 1; + } + + ft1000_write_register(dev, FT1000_DB_COND_RESET, FT1000_REG_DOORBELL); + } + + }//endof if ( !status ) + + //DEBUG("return from ft1000_poll.\n"); + return STATUS_SUCCESS; + +} + +/*end of Jim*/ diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h new file mode 100644 index 0000000..c580741 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.h @@ -0,0 +1,10 @@ + +#ifndef _FT1000_HW_H_ +#define _FT1000_HW_H_ + +#include "ft1000_usb.h" + +extern u16 ft1000_read_register(struct usb_device *dev, PUSHORT Data, u8 nRegIndx); +extern u16 ft1000_write_register(struct usb_device *dev, USHORT value, u8 nRegIndx); + +#endif diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h b/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h new file mode 100644 index 0000000..2d674a4 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h @@ -0,0 +1,140 @@ +//--------------------------------------------------------------------------- +// FT1000 driver for Flarion Flash OFDM NIC Device +// +// Copyright (C) 2002 Flarion Technologies, All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 2 of the License, or (at your option) any +// later version. This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. You should have received a copy of the GNU General Public +// License along with this program; if not, write to the +// Free Software Foundation, Inc., 59 Temple Place - +// Suite 330, Boston, MA 02111-1307, USA. +//--------------------------------------------------------------------------- +// +// File: ft1000_ioctl.h +// +// Description: Common structures and defines relating to IOCTL +// +// History: +// 11/5/02 Whc Created. +// +//---------------------------------------------------------------------------//--------------------------------------------------------------------------- +#ifndef _FT1000IOCTLH_ +#define _FT1000IOCTLH_ + +#define DSPVERSZ 4 +#define HWSERNUMSZ 16 +#define SKUSZ 20 +#define EUISZ 8 +#define CALVERSZ 2 +#define CALDATESZ 6 + +#define MAX_DNLD_BLKSZ 1024 + +// Standard Flarion Pseudo header +typedef struct _PSEUDO_HDR +{ + unsigned short length; //length of msg body + unsigned char source; //source address (0x10=Host 0x20=DSP) + unsigned char destination; //destination address (refer to source address) + unsigned char portdest; //destination port id + // 0x00=Driver + // 0x10=Application Broadcast + // 0x20=Network Stack + // 0x80=Dsp OAM + // 0x90=Dsp Airlink + // 0xa0=Dsp Loader + // 0xb0=Dsp MIP + unsigned char portsrc; //source port id (refer to portdest) + unsigned short sh_str_id; //stream id (Not applicable on Mobile) + unsigned char control; //stream id (Not applicable on Mobile) + unsigned char rsvd1; //reserved + unsigned char seq_num; //sequence number + unsigned char rsvd2; //reserved + unsigned short qos_class; //Quality of Service class (Not applicable on Mobile) + unsigned short checksum; //Psuedo header checksum +} __attribute__ ((packed)) PSEUDO_HDR, *PPSEUDO_HDR; + +typedef struct _IOCTL_GET_VER +{ + unsigned long drv_ver; +} __attribute__ ((packed)) IOCTL_GET_VER, *PIOCTL_GET_VER; + +//Data structure for Dsp statistics +typedef struct _IOCTL_GET_DSP_STAT +{ + unsigned char DspVer[DSPVERSZ]; // DSP version number + unsigned char HwSerNum[HWSERNUMSZ]; // Hardware Serial Number + unsigned char Sku[SKUSZ]; // SKU + unsigned char eui64[EUISZ]; // EUI64 + unsigned short ConStat; // Connection Status + // Bits 0-3 = Connection Status Field + // 0000=Idle (Disconnect) + // 0001=Searching + // 0010=Active (Connected) + // 0011=Waiting for L2 down + // 0100=Sleep + unsigned short LedStat; // Led Status + // Bits 0-3 = Signal Strength Field + // 0000 = -105dBm to -92dBm + // 0001 = -92dBm to -85dBm + // 0011 = -85dBm to -75dBm + // 0111 = -75dBm to -50dBm + // 1111 = -50dBm to 0dBm + // Bits 4-7 = Reserved + // Bits 8-11 = SNR Field + // 0000 = <2dB + // 0001 = 2dB to 8dB + // 0011 = 8dB to 15dB + // 0111 = 15dB to 22dB + // 1111 = >22dB + // Bits 12-15 = Reserved + unsigned long nTxPkts; // Number of packets transmitted from host to dsp + unsigned long nRxPkts; // Number of packets received from dsp to host + unsigned long nTxBytes; // Number of bytes transmitted from host to dsp + unsigned long nRxBytes; // Number of bytes received from dsp to host + unsigned long ConTm; // Current session connection time in seconds + unsigned char CalVer[CALVERSZ]; // Proprietary Calibration Version + unsigned char CalDate[CALDATESZ]; // Proprietary Calibration Date +} __attribute__ ((packed)) IOCTL_GET_DSP_STAT, *PIOCTL_GET_DSP_STAT; + +//Data structure for Dual Ported RAM messaging between Host and Dsp +typedef struct _IOCTL_DPRAM_BLK +{ + unsigned short total_len; + PSEUDO_HDR pseudohdr; + unsigned char buffer[1780]; +} __attribute__ ((packed)) IOCTL_DPRAM_BLK, *PIOCTL_DPRAM_BLK; + +typedef struct _IOCTL_DPRAM_COMMAND +{ + unsigned short extra; + IOCTL_DPRAM_BLK dpram_blk; +} __attribute__ ((packed)) IOCTL_DPRAM_COMMAND, *PIOCTL_DPRAM_COMMAND; + +// +// Custom IOCTL command codes +// +#define FT1000_MAGIC_CODE 'F' + +#define IOCTL_REGISTER_CMD 0 +#define IOCTL_SET_DPRAM_CMD 3 +#define IOCTL_GET_DPRAM_CMD 4 +#define IOCTL_GET_DSP_STAT_CMD 6 +#define IOCTL_GET_VER_CMD 7 +#define IOCTL_CONNECT 10 +#define IOCTL_DISCONNECT 11 + +#define IOCTL_FT1000_GET_DSP_STAT _IOR (FT1000_MAGIC_CODE, IOCTL_GET_DSP_STAT_CMD, sizeof(IOCTL_GET_DSP_STAT) ) +#define IOCTL_FT1000_GET_VER _IOR (FT1000_MAGIC_CODE, IOCTL_GET_VER_CMD, sizeof(IOCTL_GET_VER) ) +#define IOCTL_FT1000_CONNECT _IOW (FT1000_MAGIC_CODE, IOCTL_CONNECT, 0 ) +#define IOCTL_FT1000_DISCONNECT _IOW (FT1000_MAGIC_CODE, IOCTL_DISCONNECT, 0 ) +#define IOCTL_FT1000_SET_DPRAM _IOW (FT1000_MAGIC_CODE, IOCTL_SET_DPRAM_CMD, sizeof(IOCTL_DPRAM_BLK) ) +#define IOCTL_FT1000_GET_DPRAM _IOR (FT1000_MAGIC_CODE, IOCTL_GET_DPRAM_CMD, sizeof(IOCTL_DPRAM_BLK) ) +#define IOCTL_FT1000_REGISTER _IOW (FT1000_MAGIC_CODE, IOCTL_REGISTER_CMD, sizeof(unsigned short *) ) +#endif // _FT1000IOCTLH_ + diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c new file mode 100644 index 0000000..fbaa3d02 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c @@ -0,0 +1,232 @@ +#include +#include +#include +#include + + +#include "ft1000_usb.h" + +#define FT1000_PROC_DIR "ft1000" + + +#define PUTM_TO_PAGE(len,page,args...) \ + len += snprintf(page+len, PAGE_SIZE - len, args) + +#define PUTX_TO_PAGE(len,page,message,size,var) \ + len += snprintf(page+len, PAGE_SIZE - len, message); \ + for(i = 0; i < (size - 1); i++) \ + { \ + len += snprintf(page+len, PAGE_SIZE - len, "%02x:", var[i]); \ + } \ + len += snprintf(page+len, PAGE_SIZE - len, "%02x\n", var[i]) + +#define PUTD_TO_PAGE(len,page,message,size,var) \ + len += snprintf(page+len, PAGE_SIZE - len, message); \ + for(i = 0; i < (size - 1); i++) \ + { \ + len += snprintf(page+len, PAGE_SIZE - len, "%d.", var[i]); \ + } \ + len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i]) + + + + +#ifdef INIT_NET_NS +#define FTNET_PROC init_net.proc_net +#else +#define FTNET_PROC proc_net +#endif + + +u16 ft1000_read_dpram16 (struct ft1000_device *ft1000dev, USHORT indx, + PUCHAR buffer, u8 highlow); + + +int +ft1000ReadProc (char *page, char **start, off_t off, int count, int *eof, + void *data) +{ + struct net_device *dev; + int len; + int i; + unsigned short ledStat; + unsigned short conStat; + + FT1000_INFO *info; + + char *status[] = { "Idle (Disconnect)", "Searching", "Active (Connected)", + "Waiting for L2", "Sleep", "No Coverage", "", "" + }; + + char *signal[] = { "", "*", "**", "***", "****" }; + int strength; + int quality; + struct timeval tv; + time_t delta; + + dev = (struct net_device *) data; + info = (FT1000_INFO *) netdev_priv (dev); + + if (off > 0) + { + *eof = 1; + return 0; + } + + + if (info->ProgConStat != 0xFF) + { + ft1000_read_dpram16 (info->pFt1000Dev, FT1000_MAG_DSP_LED, + (PUCHAR) & ledStat, FT1000_MAG_DSP_LED_INDX); + info->LedStat = ntohs (ledStat); + + ft1000_read_dpram16 (info->pFt1000Dev, FT1000_MAG_DSP_CON_STATE, + (PUCHAR) & conStat, FT1000_MAG_DSP_CON_STATE_INDX); + info->ConStat = ntohs (conStat); + do_gettimeofday (&tv); + delta = (tv.tv_sec - info->ConTm); + } + else + { + info->ConStat = 0xf; + delta = 0; + } + + + + i = (info->LedStat) & 0xf; + switch (i) + { + case 0x1: + strength = 1; + break; + case 0x3: + strength = 2; + break; + case 0x7: + strength = 3; + break; + case 0xf: + strength = 4; + break; + default: + strength = 0; + } + + i = (info->LedStat >> 8) & 0xf; + switch (i) + { + case 0x1: + quality = 1; + break; + case 0x3: + quality = 2; + break; + case 0x7: + quality = 3; + break; + case 0xf: + quality = 4; + break; + default: + quality = 0; + } + + + len = 0; + PUTM_TO_PAGE (len, page, "Connection Time: %02ld:%02ld:%02ld\n", + ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60)); + PUTM_TO_PAGE (len, page, "Connection Time[s]: %ld\n", delta); + PUTM_TO_PAGE (len, page, "Asic ID: %s\n", + (info->AsicID) == + ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC"); + PUTX_TO_PAGE (len, page, "SKU: ", SKUSZ, info->Sku); + PUTX_TO_PAGE (len, page, "EUI64: ", EUISZ, info->eui64); + PUTD_TO_PAGE (len, page, "DSP version number: ", DSPVERSZ, info->DspVer); + PUTX_TO_PAGE (len, page, "Hardware Serial Number: ", HWSERNUMSZ, + info->HwSerNum); + PUTX_TO_PAGE (len, page, "Caliberation Version: ", CALVERSZ, + info->RfCalVer); + PUTD_TO_PAGE (len, page, "Caliberation Date: ", CALDATESZ, info->RfCalDate); + PUTM_TO_PAGE (len, page, "Media State: %s\n", + (info->mediastate) ? "link" : "no link"); + PUTM_TO_PAGE (len, page, "Connection Status: %s\n", + status[((info->ConStat) & 0x7)]); + PUTM_TO_PAGE (len, page, "RX packets: %ld\n", info->stats.rx_packets); + PUTM_TO_PAGE (len, page, "TX packets: %ld\n", info->stats.tx_packets); + PUTM_TO_PAGE (len, page, "RX bytes: %ld\n", info->stats.rx_bytes); + PUTM_TO_PAGE (len, page, "TX bytes: %ld\n", info->stats.tx_bytes); + PUTM_TO_PAGE (len, page, "Signal Strength: %s\n", signal[strength]); + PUTM_TO_PAGE (len, page, "Signal Quality: %s\n", signal[quality]); + + + + + return len; +} + +static int +ft1000NotifyProc (struct notifier_block *this, unsigned long event, void *ptr) +{ + struct net_device *dev = ptr; + FT1000_INFO *info; + struct proc_dir_entry *ft1000_proc_file; + + info = (FT1000_INFO *) netdev_priv (dev); + + + switch (event) + { + case NETDEV_CHANGENAME: + remove_proc_entry (info->netdevname, info->ft1000_proc_dir); + ft1000_proc_file = create_proc_read_entry (dev->name, 0644, + info->ft1000_proc_dir, + ft1000ReadProc, dev); + snprintf (info->netdevname, IFNAMSIZ, "%s", dev->name); + break; + } + return NOTIFY_DONE; +} + +static struct notifier_block ft1000_netdev_notifier = { + .notifier_call = ft1000NotifyProc +}; + + +void +ft1000InitProc (struct net_device *dev) +{ + FT1000_INFO *info; + struct proc_dir_entry *ft1000_proc_file; + info = (FT1000_INFO *) netdev_priv (dev); + + + info->ft1000_proc_dir = proc_mkdir (FT1000_PROC_DIR, FTNET_PROC); + if (info->ft1000_proc_dir == NULL) + { + remove_proc_entry (FT1000_PROC_DIR, FTNET_PROC); + } + + + ft1000_proc_file = + create_proc_read_entry (dev->name, 0644, info->ft1000_proc_dir, + ft1000ReadProc, dev); + if (ft1000_proc_file == NULL) + { + remove_proc_entry (info->netdevname, info->ft1000_proc_dir); + } + + snprintf (info->netdevname, IFNAMSIZ, "%s", dev->name); + register_netdevice_notifier (&ft1000_netdev_notifier); + return; +} + +void +ft1000CleanupProc (FT1000_INFO * info) +{ + remove_proc_entry (info->netdevname, info->ft1000_proc_dir); + remove_proc_entry (FT1000_PROC_DIR, FTNET_PROC); + unregister_netdevice_notifier (&ft1000_netdev_notifier); + + return; +} diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c new file mode 100644 index 0000000..f8085ba --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.c @@ -0,0 +1,349 @@ +//===================================================== +// CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. +// +// +// This file is part of Express Card USB Driver +// +// $Id: +//==================================================== +// 20090926; aelias; removed all compiler warnings; ubuntu 9.04; 2.6.28-15-generic +#include +#include +#include +#include +#include +#include +#include "ft1000_usb.h" + +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +//#include +#include + +MODULE_DESCRIPTION("FT1000 EXPRESS CARD DRIVER"); +MODULE_LICENSE("Dual MPL/GPL"); +MODULE_SUPPORTED_DEVICE("QFT FT1000 Express Cards"); + + +void *pFileStart; +ULONG FileLength; + +#define VENDOR_ID 0x1291 /* Qualcomm vendor id */ +#define PRODUCT_ID 0x11 /* fake product id */ + +/* table of devices that work with this driver */ +static struct usb_device_id id_table[] = { + {USB_DEVICE(VENDOR_ID, PRODUCT_ID) }, + { }, +}; + +MODULE_DEVICE_TABLE (usb, id_table); + +extern struct ft1000_device *pdevobj[MAX_NUM_CARDS+2]; + +char *getfw (char *fn, int *pimgsz); + +int ft1000_close(struct net_device *net); +void dsp_reload (struct ft1000_device *ft1000dev); +u16 init_ft1000_netdev(struct ft1000_device *ft1000dev); +u16 reg_ft1000_netdev(struct ft1000_device *ft1000dev, struct usb_interface *intf); +int ft1000_poll(void* dev_id); +void ft1000_DestroyDevice(struct net_device *dev); +u16 ft1000_read_dpram16(struct ft1000_device *ft1000dev, USHORT indx, PUCHAR buffer, u8 highlow); +u16 ft1000_read_register(struct ft1000_device *ft1000dev, short* Data, u16 nRegIndx); +BOOLEAN gPollingfailed = FALSE; + +void ft1000InitProc(struct net_device *dev); +void ft1000CleanupProc(FT1000_INFO *info); +int ft1000_poll_thread(void *arg); + +int ft1000_poll_thread(void *arg) +{ + int ret = STATUS_SUCCESS; + + while(!kthread_should_stop() ) + { + msleep(10); + if ( ! gPollingfailed ) + { + ret = ft1000_poll(arg); + if ( ret != STATUS_SUCCESS ) + { + DEBUG("ft1000_poll_thread: polling failed\n"); + gPollingfailed = TRUE; + } + } + } + //DEBUG("returned from polling thread\n"); + return STATUS_SUCCESS; +} + + + +//--------------------------------------------------------------------------- +// Function: ft1000_probe +// +// Parameters: struct usb_interface *interface - passed by USB core +// struct usb_device_id *id - passed by USB core +// Returns: 0 - success +// +// Description: This function is invoked when the express card is plugged in +// +// Notes: +// +//--------------------------------------------------------------------------- +static int ft1000_probe(struct usb_interface *interface, const struct usb_device_id *id) +{ + struct usb_host_interface *iface_desc; + struct usb_endpoint_descriptor *endpoint; + struct usb_device *dev; + unsigned numaltsetting; + int i; + + struct ft1000_device *ft1000dev; + FT1000_INFO *pft1000info; + + if(!(ft1000dev = kmalloc(sizeof(struct ft1000_device), GFP_KERNEL))) + { + printk("out of memory allocating device structure\n"); + return 0; + } + + memset(ft1000dev, 0, sizeof(*ft1000dev)); + + //get usb device + dev = interface_to_usbdev(interface); + DEBUG("ft1000_probe: usb device descriptor info:\n"); + DEBUG("ft1000_probe: number of configuration is %d\n", dev->descriptor.bNumConfigurations); + + ft1000dev->dev = dev; + ft1000dev->status = 0; + ft1000dev->net = NULL; + //ft1000dev->device_lock = SPIN_LOCK_UNLOCKED; + spin_lock_init(&ft1000dev->device_lock); + ft1000dev->tx_urb = usb_alloc_urb(0, GFP_ATOMIC); + ft1000dev->rx_urb = usb_alloc_urb(0, GFP_ATOMIC); + + + DEBUG("ft1000_probe is called\n"); + numaltsetting = interface->num_altsetting; + DEBUG("ft1000_probe: number of alt settings is :%d\n",numaltsetting); + iface_desc = interface->cur_altsetting; + DEBUG("ft1000_probe: number of endpoints is %d\n", iface_desc->desc.bNumEndpoints); + DEBUG("ft1000_probe: descriptor type is %d\n", iface_desc->desc.bDescriptorType); + DEBUG("ft1000_probe: interface number is %d\n", iface_desc->desc.bInterfaceNumber); + DEBUG("ft1000_probe: alternatesetting is %d\n", iface_desc->desc.bAlternateSetting); + DEBUG("ft1000_probe: interface class is %d\n", iface_desc->desc.bInterfaceClass); + DEBUG("ft1000_probe: control endpoint info:\n"); + DEBUG("ft1000_probe: descriptor0 type -- %d\n", iface_desc->endpoint[0].desc.bmAttributes); + DEBUG("ft1000_probe: descriptor1 type -- %d\n", iface_desc->endpoint[1].desc.bmAttributes); + DEBUG("ft1000_probe: descriptor2 type -- %d\n", iface_desc->endpoint[2].desc.bmAttributes); + + for (i=0; i< iface_desc->desc.bNumEndpoints;i++ ) + { + endpoint = (struct usb_endpoint_descriptor *)&iface_desc->endpoint[i].desc; + DEBUG("endpoint %d\n", i); + DEBUG("bEndpointAddress=%x, bmAttributes=%x\n", endpoint->bEndpointAddress, endpoint->bmAttributes); + if ( (endpoint->bEndpointAddress & USB_DIR_IN) && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) + { + ft1000dev->bulk_in_endpointAddr = endpoint->bEndpointAddress; + DEBUG("ft1000_probe: in: %d\n", endpoint->bEndpointAddress); + } + + if (!(endpoint->bEndpointAddress & USB_DIR_IN) && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) + { + ft1000dev->bulk_out_endpointAddr = endpoint->bEndpointAddress; + DEBUG("ft1000_probe: out: %d\n", endpoint->bEndpointAddress); + } + } + + DEBUG("bulk_in=%d, bulk_out=%d\n", ft1000dev->bulk_in_endpointAddr, ft1000dev->bulk_out_endpointAddr); + + //read DSP image + pFileStart = (void*)getfw("/etc/flarion/ft3000.img", &FileLength); + + if (pFileStart == NULL ) + { + DEBUG ("ft1000_probe: Read DSP image failed\n"); + return 0; + } + + //for ( i=0; i< MAX_NUM_CARDS+2; i++) + // pdevobj[i] = NULL; + + //download dsp image + DEBUG("ft1000_probe: start downloading dsp image...\n"); + init_ft1000_netdev(ft1000dev); + pft1000info = (FT1000_INFO *) netdev_priv (ft1000dev->net); + +// DEBUG("In probe: pft1000info=%x\n", pft1000info); // aelias [-] reason: warning: format ???%x??? expects type ???unsigned int???, but argument 2 has type ???struct FT1000_INFO *??? + DEBUG("In probe: pft1000info=%x\n", (unsigned int)pft1000info); // aelias [+] reason: up + + dsp_reload(ft1000dev); + gPollingfailed = FALSE; //mbelian + pft1000info->pPollThread = kthread_run(ft1000_poll_thread, ft1000dev, "ft1000_poll"); + msleep(500); //mbelian + + + if ( pft1000info->DSP_loading ) + { + DEBUG("ERROR!!!! RETURN FROM ft1000_probe **********************\n"); + return 0; + } + + while (!pft1000info->CardReady) + { + if ( gPollingfailed ) + { + if ( pft1000info->pPollThread ) + { + kthread_stop(pft1000info->pPollThread ); + } + return 0; + } + msleep(100); + DEBUG("ft1000_probe::Waiting for Card Ready\n"); + } + + + //initialize network device + DEBUG("ft1000_probe::Card Ready!!!! Registering network device\n"); + + reg_ft1000_netdev(ft1000dev, interface); + + pft1000info->NetDevRegDone = 1; + + ft1000InitProc(ft1000dev->net);// +mbelian + + return 0; +} + +//--------------------------------------------------------------------------- +// Function: ft1000_disconnect +// +// Parameters: struct usb_interface *interface - passed by USB core +// +// Returns: 0 - success +// +// Description: This function is invoked when the express card is plugged out +// +// Notes: +// +//--------------------------------------------------------------------------- +static void ft1000_disconnect(struct usb_interface *interface) +{ + FT1000_INFO *pft1000info; + + DEBUG("ft1000_disconnect is called\n"); + + pft1000info = (PFT1000_INFO)usb_get_intfdata(interface); +// DEBUG("In disconnect pft1000info=%x\n", pft1000info); // aelias [-] reason: warning: format ???%x??? expects type ???unsigned int???, but argument 2 has type ???struct FT1000_INFO *??? + DEBUG("In disconnect pft1000info=%x\n", (unsigned int) pft1000info); // aelias [+] reason: up + + + + if (pft1000info) + { + ft1000CleanupProc(pft1000info); //+mbelian + if ( pft1000info->pPollThread ) + { + kthread_stop(pft1000info->pPollThread ); + } + + DEBUG("ft1000_disconnect: threads are terminated\n"); + + if (pft1000info->pFt1000Dev->net) + { + DEBUG("ft1000_disconnect: destroy char driver\n"); + ft1000_DestroyDevice(pft1000info->pFt1000Dev->net); + //DEBUG("ft1000_disconnect: calling ft1000_close\n"); + //ft1000_close(pft1000info->pFt1000Dev->net); + //DEBUG("ft1000_disconnect: ft1000_close is called\n"); + unregister_netdev(pft1000info->pFt1000Dev->net); + DEBUG("ft1000_disconnect: network device unregisterd\n"); + free_netdev(pft1000info->pFt1000Dev->net); + + } + + usb_free_urb(pft1000info->pFt1000Dev->rx_urb); + usb_free_urb(pft1000info->pFt1000Dev->tx_urb); + + DEBUG("ft1000_disconnect: urb freed\n"); + + kfree(pft1000info->pFt1000Dev); //+mbelian + } + + //terminate other kernel threads + //in multiple instances case, first find the device + //in the link list + /**if (pPollThread) + { + kthread_stop(pPollThread); + DEBUG("Polling thread is killed \n"); + }**/ + + return; +} + +static struct usb_driver ft1000_usb_driver = { + //.owner = THIS_MODULE, + .name = "ft1000usb", + .probe = ft1000_probe, + .disconnect = ft1000_disconnect, + .id_table = id_table, +}; + +//--------------------------------------------------------------------------- +// Function: usb_ft1000_init +// +// Parameters: none +// +// Returns: 0 - success +// +// Description: The entry point of the module, register the usb driver +// +// Notes: +// +//--------------------------------------------------------------------------- +static int __init usb_ft1000_init(void) +{ + int ret = 0; + + DEBUG("Initialize and register the driver\n"); + + ret = usb_register(&ft1000_usb_driver); + if (ret) + err("usb_register failed. Error number %d", ret); + + return ret; +} + +//--------------------------------------------------------------------------- +// Function: usb_ft1000_exit +// +// Parameters: +// +// Returns: +// +// Description: Moudle unload function, deregister usb driver +// +// Notes: +// +//--------------------------------------------------------------------------- +static void __exit usb_ft1000_exit(void) +{ + DEBUG("Deregister the driver\n"); + usb_deregister(&ft1000_usb_driver); +} + +module_init (usb_ft1000_init); +module_exit (usb_ft1000_exit); + + diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h new file mode 100644 index 0000000..417bb17 --- /dev/null +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h @@ -0,0 +1,609 @@ +#ifndef _FT1000_USB_H_ +#define _FT1000_USB_H_ + +/*Jim*/ +#include "ft1000_ioctl.h" +#define FT1000_DRV_VER 0x01010403 + +#define MODESZ 2 +#define MAX_NUM_APP 6 +#define MAX_MSG_LIMIT 200 +#define NUM_OF_FREE_BUFFERS 1500 + +// Driver message types +#define MEDIA_STATE 0x0010 +#define DSP_PROVISION 0x0030 +#define DSP_INIT_MSG 0x0050 +#define DSP_STORE_INFO 0x0070 +#define DSP_GET_INFO 0x0071 +#define GET_DRV_ERR_RPT_MSG 0x0073 +#define RSP_DRV_ERR_RPT_MSG 0x0074 + + +// Size of DPRAM Command +#define MAX_CMD_SQSIZE 1780 +#define SLOWQ_TYPE 0 +#define PSEUDOSZ 16 +#define DSP_QID_OFFSET 4 + + +// MEMORY MAP FOR ELECTRABUZZ ASIC +#define FT1000_REG_DFIFO_STAT 0x0008 // Downlink FIFO status register +#define FT1000_REG_DPRAM_DATA 0x000C // DPRAM VALUE in DPRAM ADDR + +#define FT1000_DSP_LED 0xFFA // dsp led status for PAD device + +#define FT1000_MAG_DSP_LED 0x3FE // dsp led status for PAD device +#define FT1000_MAG_DSP_LED_INDX 0x1 // dsp led status for PAD device + +#define SUCCESS 0x00 + + +#define DRIVERID 0x00 + +// Driver Error Messages for DSP +#define DSP_CONDRESET_INFO 0x7ef2 +#define DSP_HB_INFO 0x7ef0 + +// Magnemite specific defines +#define hi_mag 0x6968 // Byte swap hi to avoid additional system call +#define ho_mag 0x6f68 // Byte swap ho to avoid additional system call + + + +typedef struct _MEDIAMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u16 state; + u32 ip_addr; + u32 net_mask; + u32 gateway; + u32 dns_1; + u32 dns_2; +} __attribute__ ((packed)) MEDIAMSG, *PMEDIAMSG; + +typedef struct _DSPINITMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u8 DspVer[DSPVERSZ]; // DSP version number + u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number + u8 Sku[SKUSZ]; // SKU + u8 eui64[EUISZ]; // EUI64 + u8 ProductMode[MODESZ]; // Product Mode (Market/Production) + u8 RfCalVer[CALVERSZ]; // Rf Calibration version + u8 RfCalDate[CALDATESZ]; // Rf Calibration date +} __attribute__ ((packed)) DSPINITMSG, *PDSPINITMSG; + + +typedef struct _APP_INFO_BLOCK +{ + u32 nTxMsg; // DPRAM msg sent to DSP with app_id + u32 nRxMsg; // DPRAM msg rcv from dsp with app_id + u32 nTxMsgReject; // DPRAM msg rejected due to DSP doorbell set + u32 nRxMsgMiss; // DPRAM msg dropped due to overflow + u32 fileobject; // Application's file object + u16 app_id; // Application id + int DspBCMsgFlag; + int NumOfMsg; // number of messages queued up + wait_queue_head_t wait_dpram_msg; + struct list_head app_sqlist; // link list of msgs for applicaton on slow queue +} APP_INFO_BLOCK, *PAPP_INFO_BLOCK; + +typedef struct _PROV_RECORD { + struct list_head list; + u8 *pprov_data; +} PROV_RECORD, *PPROV_RECORD; + +/*end of Jim*/ + +#define DEBUG(args...) printk(KERN_INFO args) + +#define UCHAR u8 +#define USHORT u16 +#define ULONG u32 +#define BOOLEAN u8 +#define PULONG u32 * +#define PUSHORT u16 * +#define PUCHAR u8 * +#define PCHAR u8 * +#define UINT u32 + +#define FALSE 0 +#define TRUE 1 + +#define STATUS_SUCCESS 0 +#define STATUS_FAILURE 0x1001 + +#define FT1000_STATUS_CLOSING 0x01 + +#define LARGE_TIMEOUT 5000 + +#define MAX_DSP_SESS_REC 1024 + +#define MAX_NUM_CARDS 32 + +#define DSPVERSZ 4 +#define HWSERNUMSZ 16 +#define SKUSZ 20 +#define EUISZ 8 +#define CALVERSZ 2 +#define CALDATESZ 6 +#define MODESZ 2 + +#define DSPID 0x20 +#define HOSTID 0x10 + +#define DSPOAM 0x80 +#define DSPAIRID 0x90 + +#define DRIVERID 0x00 +#define FMM 0x10 +#define NETWORKID 0x20 +#define AUTOLNCHID 0x30 +#define DSPLPBKID 0x40 + +#define DSPBCMSGID 0x10 + +#define ENET_MAX_SIZE 1514 +#define ENET_HEADER_SIZE 14 + + +#define CIS_NET_ADDR_OFFSET 0xff0 + +#define MEM_TAG 'FLRN' +// MAGNEMITE specific + +#define FT1000_REG_MAG_UFDR 0x0000 // Uplink FIFO Data Register. + +#define FT1000_REG_MAG_UFDRL 0x0000 // Uplink FIFO Data Register low-word. + +#define FT1000_REG_MAG_UFDRH 0x0002 // Uplink FIFO Data Register high-word. + +#define FT1000_REG_MAG_UFER 0x0004 // Uplink FIFO End Register + +#define FT1000_REG_MAG_UFSR 0x0006 // Uplink FIFO Status Register + +#define FT1000_REG_MAG_DFR 0x0008 // Downlink FIFO Register + +#define FT1000_REG_MAG_DFRL 0x0008 // Downlink FIFO Register low-word + +#define FT1000_REG_MAG_DFRH 0x000a // Downlink FIFO Register high-word + +#define FT1000_REG_MAG_DFSR 0x000c // Downlink FIFO Status Register + +#define FT1000_REG_MAG_DPDATA 0x0010 // Dual Port RAM Indirect Data Register + +#define FT1000_REG_MAG_DPDATAL 0x0010 // Dual Port RAM Indirect Data Register low-word + +#define FT1000_REG_MAG_DPDATAH 0x0012 // Dual Port RAM Indirect Data Register high-word + +#define FT1000_REG_MAG_WATERMARK 0x002c // Supv. Control Reg. LLC register + +#define FT1000_REG_MAG_VERSION 0x0030 // LLC Version LLC register + + + +// Common + +#define FT1000_REG_DPRAM_ADDR 0x000E // DPRAM ADDRESS when card in IO mode + +#define FT1000_REG_SUP_CTRL 0x0020 // Supv. Control Reg. LLC register + +#define FT1000_REG_SUP_STAT 0x0022 // Supv. Status Reg LLC register + +#define FT1000_REG_RESET 0x0024 // Reset Reg LLC register + +#define FT1000_REG_SUP_ISR 0x0026 // Supv ISR LLC register + +#define FT1000_REG_SUP_IMASK 0x0028 // Supervisor Interrupt Mask LLC register + +#define FT1000_REG_DOORBELL 0x002a // Door Bell Reg LLC register + +#define FT1000_REG_ASIC_ID 0x002e // ASIC Identification Number + + // (Electrabuzz=0 Magnemite=TBD) + + + +// DSP doorbells + +#define FT1000_DB_DPRAM_RX 0x0001 // this value indicates that DSP has + + // data for host in DPRAM SlowQ + +#define FT1000_DB_DNLD_RX 0x0002 // Downloader handshake doorbell + +#define FT1000_ASIC_RESET_REQ 0x0004 + +#define FT1000_DSP_ASIC_RESET 0x0008 + + + +#define FT1000_DB_COND_RESET 0x0010 + + + +// Host doorbells + +#define FT1000_DB_DPRAM_TX 0x0100 // this value indicates that host has + + // data for DSP in DPRAM. + +#define FT1000_DB_DNLD_TX 0x0200 // Downloader handshake doorbell + +#define FT1000_ASIC_RESET_DSP 0x0400 + +#define FT1000_DB_HB 0x1000 // this value indicates that supervisor + + + +// Electrabuzz specific DPRAM mapping // has a heartbeat message for DSP. + +#define FT1000_DPRAM_BASE 0x1000 // 0x0000 to 0x07FF DPRAM 2Kx16 - R/W from PCMCIA or DSP + +#define FT1000_DPRAM_TX_BASE 0x1002 // TX AREA (SlowQ) + +#define FT1000_DPRAM_RX_BASE 0x1800 // RX AREA (SlowQ) + +#define FT1000_DPRAM_SIZE 0x1000 // 4K bytes + + + +#define FT1000_DRV_DEBUG 0x17E0 // Debug area for driver + +#define FT1000_FIFO_LEN 0x17FC // total length for DSP FIFO tracking + +#define FT1000_HI_HO 0x17FE // heartbeat with HI/HO + +#define FT1000_DSP_STATUS 0x1FFE // dsp status - non-zero is a request to reset dsp + + + +#define FT1000_DSP_CON_STATE 0x1FF8 // DSP Connection Status Info + +#define FT1000_DSP_LEDS 0x1FFA // DSP LEDS for rcv pwr strength, Rx data, Tx data + +#define DSP_TIMESTAMP 0x1FFC // dsp timestamp + +#define DSP_TIMESTAMP_DIFF 0x1FFA // difference of dsp timestamp in DPRAM and Pseudo header. + + + +#define FT1000_DPRAM_FEFE 0x1002 // Dsp Downloader handshake location + + + +#define FT1000_DSP_TIMER0 0x1FF0 + +#define FT1000_DSP_TIMER1 0x1FF2 + +#define FT1000_DSP_TIMER2 0x1FF4 + +#define FT1000_DSP_TIMER3 0x1FF6 + + + +// MEMORY MAP FOR MAGNEMITE + +#define FT1000_DPRAM_MAG_TX_BASE 0x0000 // TX AREA (SlowQ) + +#define FT1000_DPRAM_MAG_RX_BASE 0x0200 // RX AREA (SlowQ) + + + +#define FT1000_MAG_FIFO_LEN 0x1FF // total length for DSP FIFO tracking + +#define FT1000_MAG_FIFO_LEN_INDX 0x1 // low-word index + +#define FT1000_MAG_HI_HO 0x1FF // heartbeat with HI/HO + +#define FT1000_MAG_HI_HO_INDX 0x0 // high-word index + +#define FT1000_MAG_DSP_LEDS 0x3FE // dsp led status for PAD device + +#define FT1000_MAG_DSP_LEDS_INDX 0x1 // dsp led status for PAD device + + + +#define FT1000_MAG_DSP_CON_STATE 0x3FE // DSP Connection Status Info + +#define FT1000_MAG_DSP_CON_STATE_INDX 0x0 // DSP Connection Status Info + + + +#define FT1000_MAG_DPRAM_FEFE 0x000 // location for dsp ready indicator + +#define FT1000_MAG_DPRAM_FEFE_INDX 0x0 // location for dsp ready indicator + + + +#define FT1000_MAG_DSP_TIMER0 0x3FC + +#define FT1000_MAG_DSP_TIMER0_INDX 0x1 + + + +#define FT1000_MAG_DSP_TIMER1 0x3FC + +#define FT1000_MAG_DSP_TIMER1_INDX 0x0 + + + +#define FT1000_MAG_DSP_TIMER2 0x3FD + +#define FT1000_MAG_DSP_TIMER2_INDX 0x1 + + + +#define FT1000_MAG_DSP_TIMER3 0x3FD + +#define FT1000_MAG_DSP_TIMER3_INDX 0x0 + + + +#define FT1000_MAG_TOTAL_LEN 0x200 + +#define FT1000_MAG_TOTAL_LEN_INDX 0x1 + + + +#define FT1000_MAG_PH_LEN 0x200 + +#define FT1000_MAG_PH_LEN_INDX 0x0 + + + +#define FT1000_MAG_PORT_ID 0x201 + +#define FT1000_MAG_PORT_ID_INDX 0x0 + + + +// + +// Constants for the FT1000_REG_SUP_ISR + +// + +// Indicate the cause of an interrupt. + +// + +// SUPERVISOR ISR BIT MAPS + + + +#define ISR_EMPTY (UCHAR)0x00 // no bits set in ISR + +#define ISR_DOORBELL_ACK (UCHAR)0x01 // the doorbell i sent has been recieved. + +#define ISR_DOORBELL_PEND (UCHAR)0x02 // doorbell for me + +#define ISR_RCV (UCHAR)0x04 // packet received with no errors + +#define ISR_WATERMARK (UCHAR)0x08 // + + + +// Interrupt mask register defines + +// note these are different from the ISR BIT MAPS. + +#define ISR_MASK_NONE 0x0000 + +#define ISR_MASK_DOORBELL_ACK 0x0001 + +#define ISR_MASK_DOORBELL_PEND 0x0002 + +#define ISR_MASK_RCV 0x0004 + +#define ISR_MASK_WATERMARK 0x0008 // Normally we will only mask the watermark interrupt when we want to enable interrupts. + +#define ISR_MASK_ALL 0xffff + + + +#define HOST_INTF_LE 0x0000 // Host interface little endian + +#define HOST_INTF_BE 0x0001 // Host interface big endian + + + +#define ISR_DEFAULT_MASK 0x7ff9 + + + +#define hi 0x6869 + +#define ho 0x686f + + + +#define FT1000_ASIC_RESET 0x80 // COR value for soft reset to PCMCIA core + +#define FT1000_ASIC_BITS 0x51 // Bits set in COR register under normal operation + +#define FT1000_ASIC_MAG_BITS 0x55 // Bits set in COR register under normal operation + + + +#define FT1000_COR_OFFSET 0x100 + + + +#define ELECTRABUZZ_ID 0 // ASIC ID for ELECTRABUZZ + +#define MAGNEMITE_ID 0x1a01 // ASIC ID for MAGNEMITE + + + +// Maximum times trying to get ASIC out of reset + +#define MAX_ASIC_RESET_CNT 20 + + + +#define DSP_RESET_BIT 0x1 + +#define ASIC_RESET_BIT 0x2 + +#define DSP_UNENCRYPTED 0x4 + +#define DSP_ENCRYPTED 0x8 + +#define EFUSE_MEM_DISABLE 0x0040 + + +#define MAX_BUF_SIZE 4096 + + +#if 0 //Removed by Jim +typedef struct _PSEUDO_HDR + +{ + + unsigned short length; + + unsigned char source; + + unsigned char destination; + + unsigned char portdest; + + unsigned char portsrc; + + unsigned short sh_str_id; + + unsigned char control; + + unsigned char rsvd1; + + unsigned char seq_num; + + unsigned char rsvd2; + + unsigned short qos_class; + + unsigned short checksum; + + + +} PSEUDO_HDR, *PPSEUDO_HDR; +#endif //end of Jim + +typedef struct _DRVMSG { + PSEUDO_HDR pseudo; + u16 type; + u16 length; + u8 data[0]; +} __attribute__ ((packed)) DRVMSG, *PDRVMSG; + +struct ft1000_device +{ + struct usb_device *dev; + struct net_device *net; + spinlock_t device_lock; + + u32 status; + + wait_queue_head_t control_wait; + + struct urb *rx_urb; + struct urb *tx_urb; + + u8 tx_buf[MAX_BUF_SIZE]; + u8 rx_buf[MAX_BUF_SIZE]; + + u8 bulk_in_endpointAddr; + u8 bulk_out_endpointAddr; + + //struct ft1000_ethernet_configuration configuration; + +// struct net_device_stats stats; //mbelian +} __attribute__ ((packed)); + +typedef struct _FT1000_INFO { + struct ft1000_device *pFt1000Dev; + struct net_device_stats stats; + + struct task_struct *pPollThread; + + unsigned char fcodeldr; + unsigned char bootmode; + unsigned char usbboot; + unsigned short dspalive; + u16 ASIC_ID; + BOOLEAN fProvComplete; + BOOLEAN fCondResetPend; + BOOLEAN fAppMsgPend; + char *pfwimg; + int fwimgsz; + u16 DrvErrNum; + u8 *pTestImage; + u16 AsicID; + unsigned long TestImageIndx; + unsigned long TestImageSz; + u8 TestImageEnable; + u8 TestImageReady; + int ASICResetNum; + int DspAsicReset; + int PktIntfErr; + int DSPResetNum; + int NumIOCTLBufs; + int IOCTLBufLvl; + int DeviceCreated; + int CardReady; + int DSP_loading; + int NetDevRegDone; + u8 CardNumber; + u8 DeviceName[15]; + int DeviceMajor; + int registered; + int mediastate; + int dhcpflg; + u16 packetseqnum; + u8 squeseqnum; // sequence number on slow queue + spinlock_t dpram_lock; + spinlock_t fifo_lock; + u16 CurrentInterruptEnableMask; + int InterruptsEnabled; + u16 fifo_cnt; + u8 DspVer[DSPVERSZ]; // DSP version number + u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number + u8 Sku[SKUSZ]; // SKU + u8 eui64[EUISZ]; // EUI64 + time_t ConTm; // Connection Time + u8 ProductMode[MODESZ]; + u8 RfCalVer[CALVERSZ]; + u8 RfCalDate[CALDATESZ]; + u16 DSP_TIME[4]; + u16 ProgSnr; + u16 LedStat; //mbelian + u16 ConStat; //mbelian + u16 ProgConStat; + struct list_head prov_list; + int appcnt; + APP_INFO_BLOCK app_info[MAX_NUM_APP]; //Added by Jim + u16 DSPInfoBlklen; + u16 DrvMsgPend; + int (*ft1000_reset)(struct net_device *dev); + u16 DSPInfoBlk[MAX_DSP_SESS_REC]; + union { + u16 Rec[MAX_DSP_SESS_REC]; + u32 MagRec[MAX_DSP_SESS_REC/2]; + } DSPSess; + unsigned short tempbuf[32]; + char netdevname[IFNAMSIZ]; + struct proc_dir_entry *ft1000_proc_dir; //mbelian +} FT1000_INFO, *PFT1000_INFO; + + +typedef struct _DPRAM_BLK { + struct list_head list; + u16 *pbuffer; +} __attribute__ ((packed)) DPRAM_BLK, *PDPRAM_BLK; + + +#endif diff --git a/drivers/staging/ft1000/ft1000-usb/ft3000.img b/drivers/staging/ft1000/ft1000-usb/ft3000.img new file mode 100644 index 0000000000000000000000000000000000000000..7bef6bd3680a22849b5dc7e85586ebc11d99510c GIT binary patch literal 280414 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
aV00ZD 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
2epj)5PT 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≫{0_MxL%M$}xB`pLP-%rgHjPfhzntkSRg^kKMW!k9L5I|W2+1{<3+Y>tXf5#H z8Uo+bTvz+jYVU12D6ZNqgh7LepW)Liq3(b;eKgqX;$+ZbUAkP z5vB1{?`O`PY%d-_(gCXsn1EkWz=r06{f2u0YV052_%uaI`Mz`F`cD6?mF(iNvW?0} zp~9-!bXi3HymOtw;+G@``oaZpBU>&AbYnyLeKraE>aUgm&pHTj;bjBvPwrJk&Rz|0 z!^m32XLNdP=?d)Xhz2#j+|7UVPDFIH*>}z34o?GSA@QiqiO3h>FXq|bxY)t`8ydn_ zv>2QTxB=M{!Y4xf&CE2G{T=zN7@*$wF(R(6fsIA&Rb zmX@Euy?te4j!0UP^%xAY9VM#M1$Yb74LAeTks?GE;@>EvWa9o>Ark@4=usn)3JqyT zLCwqok-Wxw)z5%`=dpa_2y*ZYp>^I^PL)ie$wJzzux!AVts!bAu!C%up#H`NrhX$d zaY@Ffm|&8EL--m!g=ykG4?N-qfN@?_SRvEaq&KdN@s~qwAaaT6UtjU9ZcSyZo6Y(+ zMfud(KFoCF3!7WdW2w+XVU68oWGKx3@)DhIH8u@cH!gR%9_p# zfPV>_NhKN+m8Xaz&FM25pl!Ufx=_44InqG`J18YPJI{CgZDo?c{~i5bJ2Lgtt#WUO z`XuEvu-57&N(u@c@Id{~S@^%A8Fp+Akd`Dip%Ui z8{FMzluJO(8X`b+8-1#Xdhrn)O&0-qL}f-#WagHSuIV32@5q6v^22pdOmrj<6@O&C zfq3p0+5=!Esfd`|K#&!ccN?o?vbS*&^siN6 z-sM}qxF>arc0ZIb9V6J)z8hWt%C3`=GrVdd)*Y?!<7JMq8xogD9Sh`g@1_@N-GBuQ z?n__&D^!hY%yo6B6{+SFO>cr`JJ$gN3+U(4gKQTfRzZ4t29wPVx)FYlCp;1~>W+Ab}rk0V*+dYb_X@=E8aQ$JJQVM&ZMNT(%S6eKYWk9b)3Z%};6 zty7!i!}ONX`twIbqNvU{wva%qw_ny32X-vwY7$uI?*Mzk*g2M7HWQA{1VzNW`nL=rmR>p7 z&u39S$$d6TJA#L-@CUk7@?dVU&=Kq3tsF_4O=)971I8%E;{LZB_R9#6D{+Cekj9i#|gap%gy;z$1w)1nXB1WbIn5avKP55^v2mo2&5b#nES)I|x_F6m8%=lZvoYwG*|-Y&Okj&vhR_dT z!9h2|SN+pgVrRne5%|@F2bAU^AwL8l`v3nReNkh1)Xl(e?s*CMG+oO2F1T{mE9 zZV>~x?yIQ+m5YCnkF@qdg>P*zxi`UIECg*#IrOKAzc8u2C_dwUH_9 z+MTl`117N&nD=P)Mt%{wQT99#pLemj9}Xk}2G=1HZMFBhvhfj+z#$;}Q+gVSr z5?bMj?M2%7)j{g(66tK2RBS4m4Vo961DV(+j2{BXLX{|o`cq`)m94DrA zQ^*kwlBr!jCJ6wpRc~2nx+z0C3~obv{z1Q$?@#+}y$U~<8YAd~f7qtJ-%=wvMID*m z;zI`K)eyNXqn71eg5of&{6WBeO9NJGy?RxTf5~%*J5MJ1=~ew%f*VI+UOtL6|7MZ` z1|B-$rT;KHZ~`kWHV2@T92sM)>$Fz=YX+HT;bm)%U~Ak!Y-&+F!G|FEmMQp%VhC-s3xHYi3i^{|RcrH}Jr#QT1odOUTzIcl_;IL6Bek?AL9hJAPEcy|7 z_E#7JknSHot#iw*6FS`kmyluuAoow8wP=9Uis=T#GuGkByp|KP^5|BYv=YdB_zM3L zW%p7bamk}@ihb{hoaPZQjMIb`B^tGJAyc-{Nv(mWVt>@p2r)}cE~WYwc);f zbIIyT{3GZj$GeUSDS&LQY!k$G`#9BviNl zV0o#zo8PQl`V5_{_(q;2?jEWkp)nN2>lPaP-SL32dytTptRnp#bKQhHd{esA*}$|| z78jQuSU%_eJZW3$8v!QB42nKUI!;z#kXByZ;+uz9*3v@wwaa1@V_a)=8TPpYMIGJ* zuAE5Vg3pMO%6J4685!UtLKV7ti>t!`wCHGSkD~uuVeVAYgJ|r!FfsyvQW68f@2Iwp?64*lyGqJk%36 zmNNr}mzi|9iES||MQBvYzlS=8{(fLTudM3_!kcfG_Wq*j-qgC*7tLu15RxQi~BSFQHD7p*vyL9h6R;^ zC)=K&@RHFj=|W}|`_hLO3t>gtG1p{}8=eBbah885c;lR z`d#CGZNBN-eQD1=MH$canXiM;t`~GCVovC|8FpaNe!1k-`YDD!c`Fes1e!57;;P@0 zMO?PxpW;BzMNGPSLW10k&BV^Q1?=2QE1f=YKYK*o`=f-q0$csajOP`K@rj!@FsAYQ zd2+dd*^e^>1cWAkKvi-n7Z;M;kraDC>PpWzC7m@&jN58mXDy3XLHz{k!fG&Qce5Fo z5V23p&+-|UYbu)+-@^77v|XbV7!H9Rm#eyXl?xaIF0vFFb ziW1*v=>lOcLZ@zZ3az}vC2_zD-KZHYr~Ck!wR%d_&IFnc5(%+B>5A$gYROa9aI_8f&ddyK#k;}_W`P&`RoPK9^S|*{ zYC^`fv4xx_SegU(&BB4R@&&P4mxrFRA^9DM4` zeS|^4{*Z8hTq37f{L)zr{$RZe7Vzo1A`8@5pJr_@JOoqdRi@h>H8^jZJwHc8{>Lr-t`t`7EYo)Xfr! zxxDf(a?rXQZl-Q7>39NnA3A%eq4#O9_HXG?)xpqSHI=Ij-w&om%{be8Q|N9`Rc^^C zaLRnN8EgPCF0l5LCk8N#TKz5@;wZXKs(!++9IRd;F@55feE>!sM{rg{S_~q8aeW~$ zk9q!c!I409 zjsSUU(k;8$eQ2=9p*{?&yCU?B;Uj;8Pto65b1D32SjVQw0`bT%cBke6P_wq?;lTdR z`iWisTZKXfmO<6B??=<$-ndP0x#r!H@JN{C-vJ`&-ro9kAX!_Ez(ZsCj?2-sM!TBL zZOY~!-BBQL3NdCN2`mzl1FGvDbE1>A&R#m@g~`<<4XY2daH7n|>JX@E6%yb^3nzo} zRj-gvH|pJZt}4lLTmQwB^5J3&_HbvJff0BtN;^D&@%g#rWzIU>37NkpFFBr>ncjgn zGyf2F5hMddFPujw)cVm56+;sW0y>8Ho2!AbS{*dfDHL8L*dorlaML@JjE)}`7?NFd zLuziS-PHLcxXNrpw&U4kqPF%OTMH1=GMII-{#@io6S?ffO8scQ%lY(P>s`kN#w2)~ z-WnAw1-Dj}RCZuE;;s;GEvPKgV!}Uf?NDW|MOJg^vrezj^qhXpG>%14@PN;pTK1{e z6cn+lCBQ5p{TDcEr!Q>9g(6&~y`tPzSS*V}5iq|+k4@A_Cu3ijf(UM1f{^vAEZS6V zFT+ZZo-GJwWTgXgMV2AA{#y_3#72cnWXI6O+n|TVIoBTY3^MuHaHNgp2wZ%y=h6Rk zCndr3emk~_z-u{)WD<*M>iv*GSi#F1;Fohxc2SlAqawotu>OAA1#h?FP&|}-#R71n zq|o`k-cG&Y5?!z2;nB6mRi;MdLe=n`6xNz@sOXYGhOyHE)1wpFR0>4Uw17F??HQ=2V~b*xU*~U z=VLH47(h3^^b35E*!9g!dw!ASLVma?C)r@1+L}Nd?~LD!1CC^pOKa;4;1|M3^1wI& zAB-&K3eCi*0xrEsQCMzW{MG*7aP2sP{uvLIuP)zEE&o(gi@pimI96CFiPICRD zd74~gb^zpPZN!6F7n7p{IYtt|n%4=xKu+1tx_4e?{?_GujF*&f0C-$geA^_q5RYC5 zgA}Zdq>clF546snGR(DbDr?jgmT#lhz)Tw+9R!)Nf_Rt@GQ&dJ0|--+2}+Y_SwD(i zO-AxsnGQDGR6ASMk#)xlNRl*O&BrWL_7d!XlVr~Bj8({1@7%Dqk8$(6VtXn0^?BY< zNv=7~^SgzI{A?+=L-mUL{+gK-AJ3o~6Br@0xiHkSOME%u?Pm{Ymm`%LM}zcF-+ zat^@xTD$7!<4pIhZAB1P!gD4im?;K(>HeF_y>fVE$&DlJIsG$*Ub(}DGtl-!xJ3I6 zTkStn40W-n6Z^==fFj7O6yV}%&UERTTL?`Ro0=~p^=(;Uy>>q4z1gC5qZmE=h~BW5 zZ}kn{s)V_NQw2xVSN0nre+^N;BdkT1c*0D3Vsr`KGnlW;blb9?vL3O2!u@G9)OY#U zgOP@IPxHN%1E4G)%pTH4X~ma)p6y~^L^MrAu_C9Eh@4fHeZllJbCkZp)6Xm0@;CeQ z!ly4<@)K_qG}F&++CH4uEG&8K##K% zy>&AZ^yu{Nfbq>Mtxj|ppNci$;_tG`A6$IwMIj?mC`3}Q$2?qkKjpBLRNeu)S(67< zlBK}gstx`YE3(pxmITU`OLWO}N?T02(e;bsL&qNq*^GC#t8x3S#kr|sP2kyh^m^$} z=$pGB)qWZ=b=vZm3{oWj9@sIJCwkV4DA;1kqHSIMO>yz8&Qyp#n_uV;08ji!%b3TD ziqyMQurq5KHpaKIv$k(bF5~dYT#CDGh=~n^ab={X9dd7WVAO_G|7O8LKy)kzSmhRA zf7hSl23$%ZyxpL)WeBKc=w7y61%q}3%%HzzU@!|TR0<7J%@=VoX=Dc7C$LQAL(Umu zR_DUcUxh(Z(#*+MJ%T7u$W_EBVrgXz@ChaWm6AX^h^_?WCS?Q|jAAdLCF*+eR+~xa zEJec2U^8c%&`uN_p*OOQZ?m&MldUc4DHsS~cv$aLY9X!0@f{H!rq*9SR8pYF-Nhj9 zuO33H&1LX|aFvM*H#WkS04qcv$te?y^MHCk-%xYw2s9 zjrDXj`U84z*e!K413>@#U4Mzkrz<}inDC)Q5d1{xKY|1A!ui(zGg|3#JB6|XMS!*{O3iqB3jJJmCV2Ydp zD{*IKA;|MgFcu9h61-#085n)$ppP;|ICU6gSi@rD!64woIJ@ZioYA{^d5{PdD-j|EI3ci zpAD)q9?At_02ZSrx%LOmB;Sl=N>K*6g8qBB^Sr|Y@Xo@m{N>>doDn13wJlyAMx7gu zLKAoej=61`lgNbG*Pd(Ov-IL8el4y=krl_Q3EJzm|KJPWL(gqbNS+#Mce=ojFgwyU zasHp}eF|;u3NLp0oTQvzoGcb!P5Pl)yys)7{@Ko&qv3;RQf6dCiw(#!6F5- za&up5nmaL7o<)AZrNTZV9PeNT2^=sY;#dUX)nsaZps`_3 zb+Bm$=AIL-vCI@yRDNO3^6rm>f#n}S-ygw1I$wu=UK|F@d|&HDoC3&)jYuO4&B-_- z6CmSfd2qy4xmQz%L%D%>eMN(I!Z|2;8c}Xqn@OnnBTNWfAtW$c@^}toT3Tn`JfM+s zg}i^o{%c}Y$cFC!Hc7z|ncQ6X2f|8)jzg!jO@ z`NFJ&F(ELBMYWFVRkh8O8QOLLqYJED4Ig^CmjQ)T8l01;l%QYF~}7%A7C zf-yCLKg0~M+HHnK5QFktrSHuNK8!6cqPui7P)|GbF^0;c)l%qsj1;zQ!CQm*DWUfS z{vXn+g3je5QdiJ%SwSlE$l5O5AO-I`!z%S-jie8Q%Ql&INd%C))x+r~A&I!E-#a

59&cLHt10$+{}WsJIlq)F>nn>|KrUHTD>$>ZcL}|?Y5T&_jFcZT8sdOnm4c? zHht0-{z?(ovo-QCgS@f=?5__!^hwIrqYO$C|DTGg1F%UM!V%0ltVx-X-f-b4%8u@8J6_ z3LK+UMLAcA@RSj5;4ID${3Rch+may++Si&-6p_}zv+QB)a>C4ib&KE~$q0P=&+Z!4 z;S$MVYmy!AFCz=n_grB}@bqCSg#@q*l_C7iJHI871UR`)r4u-hUuRnhhW+FL2|_j9 zZj7Ym3YQw(h-*Ltd?Zd|KeO}A1EMQ-!reEbbJeQwn?10+U}1Gt4vNkhMp%J=;8}{> zoDUgB^?L^;X=*K=E=cog4&fbpZNTfC{h%J|PJjy12!v~~Z#qg5AK^*`xJLr-3=`$C z8)I<)5`3AMnGe8!)?H1p1wE+HvDBw(^yA@W)#K)F@J$L*4)&9`8PVRs_tw)@M(@c0 zZC*V<>qcuAUvUSv2Ba-NDZ0Us?+slYV5*WzTPsBYp1zTYmT|)+f{nHC1YjcMG(wW= z+(0uj?D@f9;B(6MEO7tXkcjK3UzTGK0M>sB_B+i>LfJtWx((^y!f5bBow=%LBRW2P zKd72#QriC%NI|6OgL&^Kp*ftcsG{Rie;vSPDm+t!{opgJ@Qx)2n7k0V=YvsTUyj(( z`n0z1m4^<2)u6_JEhVLnZ78UbRQ0z%SCZ4@y-*Pubu1F;GB9)d6v)=@35dJKFs)?a zg$)mz5Y7W8$gj`C!%Rv^h%Ha1dISz04jb^$=?$;FDY~Fnye&Zy@HRjkTW3>Zu?;%N zUp@L_B7q}8mNPbvb7Aby8?deY-3V(*(W-#O#kW-H$qN zX)I{IkzM5R#s)SiVYz9dz2;()?o^s>8hYc@P zQ(?DPItHcNdk<8yGorO%zAZu>t|SJ|EJVOcj_pe8ObnWIKj1Bj1b}(31jhkc@c$M_mDi zS7GlbQ*XBd6LYT;kGcXMwJiy>YbKk*Iqa&1xE2xxPbqE|Qo7PG4dX4{C?|cOl_&V# z{q{x4JVbLKSjf`%uoNMoIH(I)83g#Z)24GAD(OD9jkH{1{H#hbULG`Ocp% zGS}#5%>6CdL^UG#PSa6M-Z`24uPt2LGH?XJ2BtW%$oY6ue`g2O04^bB3q)EM@;R^1 ztF2zJkM~Jk9gnPJYOB1eod=lxAKZX_nySb#wV_V_?kTYtP1lB;0XpFFlM!kHg@B8Y(G__Z%iJbP>}C{lm61F#_tXx5#8aSq`9k1hh8f8 zY{756D7Z{u`tA+G1Yh=S(=X(`_Aa6DE4zz6%qs%O$JUx~CaJsDAK$agfs_ zt<8#qWk5NduyQaR?{;nO$3@g}F%q3(B5h}%5E%m+q;;mJ&GS#7qe9)Kx*YpQN z^crK=kGI($)Mdhpo_<_(ddZw_^VLxLnD2yp3DS$^#>*@Z9?jO0S_%ZNS#SCKCtW<> zC|gujACEFofmtpfD{LSTSl1Uj!^K&^j3~;Hp}$*-*EiT7Da0bG^yCNFv*v2=yw|r+ z|8cnb^vwBYLC}6j9BG3Xh(fT@+8hSGRAmE$O3ufe`1`dlE zKOL(5WG;6Ft($c7(Gm4cu&WZ2L;3`bL)nLyWm0?j$-xpAFhw+4f*2p!b4lM%D;X-_ z6IqL7kw*iGUpS5S2-=b6CpXnSI6UgBMjQ>`!Qld(=z&}qw2xSMX-QOYabKoS1WjwT z4SoW9?^@$C`HS~^I~U-QbM#JSPo{g;I!tH|>pLW?>Q8$`$)QxE)p(Z>KH#R-gOm5Q z15@}5eK3~%Nj4yl-avyfE{>_1`3{tYK-z;9du z76}5Yr9(2vS5-4q9mkI)Ka#wLcIbn>;nawId< zgBWL0$FB*;mzbM2Q@BKB)IAg0YH1h>y(Df8SA7wt`j%b#0 zq6N9M(9<4pUsku5nOpglwFK+Bwgt;-f-QdtIc<{;q)|I67%RlH4L+@+lD3>1`1R=5 zkFx53PWYmh={%0jy_he!vu}#mNf!x2K~nvCwBCG8s5+kTc~!kyq{If+r@11b4xqJ} zesE@&VEWZAKMi>I6M$Yo3(Xquf|HOI4?%*?pMPz&uGJgB9DB!t-L5xpZXNt8e9JU3 z3KEprfgDf;1SutFPiv4RH;y)oy6H{BEnX^>UkN=&Nl!uv(Q6N&NI4I(+}viPje^I8 z(HNODgP_yn0wM9cgox}NYw@H`uXvSvd~A8PcqAoJ=*jt+GpK(+{r1op^|!6x!4`KA zR(@*!8dN-N59SRS3%lhfE|^C+nA~cay43qzV2=DQLMQp3kd)psn6+09xu#G69%l(i z9b{{I>hr8Z*wVzcMT>(OuiLG~DSBH3%V6A6?lr1VDJ}K`GcU+pI>1(RbSI;k{k32yTQYin$zR+&~)oUcW4YG$%@amvcGrB<6sb#&exdEDgo4 zK~*?@xD1cZIOIuK(S2f4&ZqBaJnj=u;LGKL9=6Mwd; z!kAkmEh5dWKcZLqLSaG1bV5Qz$d1dguu^>auRmt}3KZ4i`v%V&-zFFUxvJMip&!TQ zL{(zwOjD8Aur+${}c7%IsKk8!Y!ma8cNd>I-?EPiA!q%+}ZQmZYKj zo>TKu&w$q8`};SEiV`|V(CiMAagS74-sRzL02`N!)jwXzVOoCmWiBUFm1*GO;y6#b z%y80kLp~>Il+!Ysx=0wR9RNLc^cn1aD~x;$53TiJ7ZgtVq;K_dGKLTCpGD=FeSrZ- z3SOdP`Qu~{_TyVTuICP%9I8s1DEOSo{tQBU4~Tc*8$H~yN`7I_qgE17GNJp$=I9$c z3T%6i9$7i3;Cw@9{sW`UtniY^3Qwq#VR~85`I44`BPHX_RZh$?&$V0*R<_FV+`)$w zEy*s{O}Xpxx*?=~SPhymtm<|wAbA-Zc*R1&j%g!#o^r^AMVNPKm^>mkcU3 zpd*=8&PS&R+di}jn5~U;aI~&p6#mgXlW*D=J{S|SnBU+7&(*#E$)i0u{~K{;Cgj&Y z(31;bdCr;r+N1;~QH#h@8}auiB)FdoUQ)q3Jq4IiXqR*bD~-jO-GSL>fLpfL0ebR) z5xCe`2J(eU$$ppc!C8T zHexwj#L2P8;Z4JMIbOz}Xjh!q*~`kX{lnrBYKu^}wr{ODx&QqRlg|C0=Ha4M*c1;l2)HYK1BT@s!wG}j+vr$N=N+cchc4-l)l}+} zJpQyLM*0OifUuj@j_@ov>Wzj9AwnJ{EKM!QRui`XHVy7Nb#;N6IhCs(*C8Q0;nMEr z2xN$jj}+H$@f`AN-H9YNe%ieC#kv_fc+JG}^Wz zA->{ETy*Z-w>W+2C6Y{^cH`+bY-&v_4Yp_ZQCS9(4h+z2A`d*ZDm7#$cHR{NY#cab zrOOD2Hg{j9;7K|)AwxKLp_YCWT&ak~cJRza)?vT-Ui^x?+n zjhJG|To-h}eDIjW{buDH)=2o_mq;4=9a9w!rC(;$4YKzdukAj~H2uv|Ej<=Z(171! z?>>lZ>R&ZK1ZB$WGJ8%{R6D@ncTt%@^G|upN9t~u^3Mwa0^kT#0T!{!N9&ADiVta9 zeAe0z7SN1ks+LbBjDqx`5;z%S#E1TyVHXQgVU%rVsvB8l=i$%RuNu>32I?h((ISQ$ zHWQk@D8z#Qb)Vt>>wm);e;`f&vN75;6Iv#b->WC~?pLw0#f8Co0QXLjRT9;0K=LFw z7nU5J%^?nFeoHYWL+P+I^hLkT57x%34n#vVi#e;xjukb7&6x(XG>48u_K>wjF`&kW7Kk_K8QBE!6&`9&vrzorQK z0WxFbZ+*#E6(UJJFvED9DNU7XDdOEpSZcY!p5jXa_DV)Y+Dc8pgwX=KPt1cQhf9Ia zO37UE?$J8tOV|&w%=CPx1f}(0;SKr`+5S$A9^x&EJdrmdUVwNTqG$5CI51h=(KtqO z9qb@5bsa`OeRPjUp8FHZ*si-!!(x2#O)UrdU%53@lX@OPG|18&Nz1`Y&E@~XCB)i` za3KHc2s|*jz~?zs2s&jgWFGC!?=~Ov8{|uNR*Z(Xd?Z;N0C(g^lWx9t1sZALPD+X_R?a)_?M*LL^gU%jK#Nf=Qyt6%hFyDS4isi#K3)%luA45`4Mi{ZPb`cc-T0bEm zUuIi>PoL{p6j&!l;FJGxbj%^#1vTIa(JZ%j(fbSj1dKn(`4m`l=M{jy(>=^DC3vy8 zfxUU(_j{O3`t?2Le~`gFw&s+(Z0;Pkx$`m@%8N58X07JSPA2fF)JMy)-5r5h8gVMk)?SAwHrd+iiS!1je}Jxp&}Jp3#Qm z%IjJW9WfXJ+jsMi31mATR|AO3H3`Tv&q8>b&6{J&4-jC2>*mJP~}XFa5bU>7OvXn>=7>?uU!Ty{)Ltj zx>WzS0JVm)?e3g|I}^c)oWIQ;u45Q}H+C$tOHym25?GBOFVz!@DOR0=5- zuwD7l@vE>VD{)Mh^SFQio&6%ex&1FUze=G+S7yrZ53Tc0#k=0`T!p9}jV^}!9IE%v zeh4V~AMBGSm`2vOv9qDfv2gn5K&EJ{4>yybigcoCY+`beUuQLtcIIbx-TO7wF)q+? z^9fV~yQm0FS6$+VQg&!>ZiD+S{gSbRzh*zOcb)QCjU74Pf&>b6X%2$4t+kkT>aJhP z;kXR{D&gpi>HW4>D#LyQR-Z=}*B2>QXFW1eSfplA6TWyz<~X`Ds86!MNEr%W-|K;* zil5K9P_^VoLpYoXT&t(w{U&9hibuj%cXMUxK*;uNH%rMB4E+GsyL50qFu-a^oNwEuHecYzMWFO_vFmGqS6 z*A(|fUPrVA{gLd~Z*THCop+)hjDUM41nx#Jlm-IZ*niL*7+17+2=NXcG)QJ3>b|~V zS^U6X#d@eU)Je_luu;WML^%CYlh^?H*bjyf`O{u9#~Z!FO5R@Bz27M+P7&(3yGFL3 zJJaNl5ygXqdj8$|v?1APg8ggOCS#(Rdoi!cT2EpMUm6)pUf>kOFC-k<0|JbF5+7d3 z@eC&`3C%w$%C(vAK|Wu6MsJ&Mj$^#kWg|S=yi-cP{;RvTUI(>|P%8T^q;Nh4cs`q8 zm82e~=nuDmbH&W)td{xWJ!x+dLqkUyVOt|XP<|IWT!-+_=lp!JfYC7xnu(hgk{xX3 zVQtlKq=btd7w~;;7Q!^Z%saJ*hUMH_F3!RANzxmbH^+gC`d!w+1zv3vW*hOuTC$?jk2L-mc)of)(FotNM9R`LFlv0{Ug)D|CX&`+&J^ z3iM^Sfwk{}OWRf;1IK zbY`}_KW4T!f1pe-Q%LUWVXzq4!E!A4RdBFRWNWN=8x^>|>{YryevYxcDrYUj=*I1U z^_-b192X<>tsnp8qO*)*4IAbiD{6%;h}mmK-DuZNuszQ%B2!Q?7PDqQn(y_`FAuOM zE5pwu#1jQ1^`I(rV+R(lpHhbWXP>@`@m1wTH$h+BqIXxTa46RAIs&HRsYKY!q0hBz z4ICG=S@6{7vB?;uL)k<_HINne1o_%W3ZG&9ccK20$&<*)l_uzE-B5_|kz^mj=Qt<& zwknio&+JgY#UGGi)rwkTfKC>>F&CcJ+cV@7RyK*v>CL^@j%WDJBf zO;qEGl~H$BELS?>uReY(a||21PDuWZ$1r@$@V8fm^1%V+Yc3@}${%abz&zyy*G&B_hc*+ztESvvAZxBt5HCMyv|K8b=-g~zHs`-=Lp4bUv{egsNm5cylC z<{UQr0N!hT-8O)o!*D;bvkMht0!+?&HbRty_ncW#yd`r;TLtn#OL58n6 zeKy^2gXD@|O1p~i6t!VLx{0J(Pg~7ezW&s?ENACNM{?X4CpFc_zhvcam5-k()QOiV zFk#r^H3r~@P}Fy#{_wdM#f8Rdm7OIwr)QPdIZeqP7DraE8Y(PSuFfDb@ty7>z&>Xy z9CX)Jr=s;2 zAg`J!iC9U`Dg_)iw^&t!J3ti?Pb-wJhR|1I08UWO<4Xb(@W8^b`GtLo zWFd?E18I_Ws23@QrMuH4Ee`zyu%$(IKL(tv>|}@obJK$&d;Sm7`FIHD^AGoPJcF*_ zS%()m=9vnf4UyFd!tlN={;}CQlibCUzM{(%8FbahQtc5?~G*@RJ zdWEU}>a~2BpevWewFNwWb~;#^Y_Ku?4){x0KHNm5oDYTHu`v6vOX;{}UIITMFwo_( z)tt23J>6o5@DUmwYY4aH+|8^!eEOI$8L6yeE5aU>H>Z# z9R`DNEsNSR{kSwS`sPH@G=MrL1L4%=Zp3RMqmmJw;zw%@An-t#1WjEu!S6h&Ihe7>iJY}b{9buC zWEH3W*Ba@~QlP@)=?WJ|zV38kSw)zY&Fgk9H8VTJ@xHR%fG17B`noH+xj)z$GQ88B zWRO(xelyO${6JiX(F&TdsRC>foRJVL(Hj9qJRoK-N2+%KImI75Z`R+rJnS)II{(P)8ArIc)hBWDcE=UN;3*-T%I+ z@YBqCSsxGJB%Xir{=r@CO9P8)4<^BN82mSSEEw7gV zHh=eW*rH~2ZNdY9$Pz#vCVmiuN_T>xV~h6@i#$kqqUSqLkM6XMSNLoA;v}c z>fp^}kpk`oXUBCH#XdHipC7DLDMzt+9sBErCGZHRIyb;ow8LAJgFIHz1n}74lpk84 z#abtG(7@RfBzyy?YznLaks*P0(VLLj zrTP%@I=KHOK8?@T_(E>xwJP!@kE$Q+3?8=>DXM1G-6Vipq*I=&(&-bQ%%@5!$ml>;jLDatfA%D)DK_9||CgxOlQELh=Tf+}1}E9|Fx8%wt)OCWwg9$GT@i0VpEBZSQi`x8{ztsf}XrFw&Kr~hW(W_g7Wy zKy3~Yz(?c*cMgW%ziAnfym0pz*%-$jVwhGF1ct3hZTpIrLz$(JwseSd1`gX_%E{!z zX8NaPIoTV&?Bzq_RQT?n=5Oi%c5u(n+pO?jNQ`A9ZjRlAi0B;ES&$TS90(sIWb^@< z&vUcHBUB2%5rQ^CgO%8d?EH za>;nvNTxjALum>7Trpz?GdYkEjkuxS$Ds-5xWO(ER)Gz2u;9`cuIuRyL-%i}JH^X0 z;y7qq#`Jf(V*rCr!s<0*Ohwsg{UU*7G;qVPfxQBa>7s)(U}^dqMU4%aHcD_0o~WY% zjtH$WD>kC7zkhJ304Gl`K9LjXyf_{#+Y2-h&Mh|!++sa6@g_zPHy1w z|NMTQ3>;BBz$Z^+jT1QO;N}>Xlss+eeFIC9DmzHdA^~{Fi9Dnhg`Ut(^$e=XPw#<~ z08Z;u?_^Z7#ms?D}{2+KhGcLA=^`qs4>I+-0CQ!=QagI`Z4+qfjHegn70npQ)aL9*+HE!)?~) z)e7KW`QW}&DvK|LhgtusVZYlps;?K$ueRbk<=#YgaSZ+{NAYq11Hp?Ru%7?;d9KKB zeuots-gMGg)`jqFUge8%0LAl7zZ#UX^Q&Xe+da;4)p`|0RY}BY?v56Dl1S6?%{z+= zg$n+Hpruh?t6FgzJtQU}Kh^hL?x2Yz^{>0cv*o=Zn^mX-j`c;)b=UdDd=YCCy9l!H zE0_%}bL!m+D&F_R8<^BixFi)fdKyanue9@yYHIoRcp!ixNR{3@h=TN9q=%~XYB2OF zC_##Jr1#LPKx z7_#kyUMLzMk3i)QLv;mcnhJ1McH1zo{3Gr^OlyysdrKR|)%fy&Rz>DE4M54;M@v=P z0xbEG?~kKPkM>xvb2*+e-RgsD1Hbv995+ZS&$Bt)rRPK50luj+aG$+ks;S~;K=4tf z#oBJm?x9$lj!ifX!)3DU799Jwiq`k`-?0;zvkP^?S}j~CBJuc&k(Nvn_Db7-zr zPbt$tl6`GDvLirU?wK(!aU^gDd7S&5CBH$Idma;k&mD=He83uQ{s}a+#`~o_{j=z6 zKqJS5J99zdg`Y=M1P$d+tiP$7zq@(fgZYYI4u|#>$u7Tmfa)v*AQyfSbyq6$E_Jc3 z!fV+b5Ev&#Pa})ft2AU0#mr70PEI>TWSGcN;?2FWQMP0`s9xA^JgZ>*MA9|*!1?z| z>vS(B7M7bXWC`=@?WvZjd4Xpx1cyg31&tDLnD9GN!>l(B28%AQ`VqNNFK8vbvN8nT z={E=Nm3{RSF?8JnYU7_PCMlMiYH1&6F6muQr2ax?#_%|@%{vfNKeP8NgiBZkxInP8 zoa=F-Hb3sm1uFe|u`L>$eLxF#>h>8+sI?iekC-;uTl_4y3yB0MCwbNrEA#e0TWpo; zAwP?sWe4d1O2EFJLGVppKLlu;TY#l|G+)uoZLPU_Vwu`qGc7GOj}alRdqsO*Axu8z znEW1TQ2!Cxf1M^Zahnd%cWs!Oy^A~&Q;Jlqgr0;O3boTmv3vLBNmWaxRK1|3cHtA+ zkUvRGy?F5b4YpIJOLjGtOGg#hZ@(#Cm1vP$&#GKS0pyB1vtv(8{F&U|nc03`MCkAC zt^OoVhQl0{qej$krm+o4gATlGQObBDFLeMtB3o7KDkH+q!+t>~g>|x*o)oIFt7b;+ zG1;yu=X6dX?&7uG=#D+kHyp{X*a`)1m}qvr@Mc2_sd6g5DfA)sP~7DEo1{@cy4^g2 z3zZd)%RtptEZFtyc$01Yz_Pt@FMQCsz9d`j)y3=n6H#3girPC1qKpgW1n+#0XmSus zb!_Z6!Xn=t?8RZ2G$S1DfoFdR$|!03f#ne^H5~Uydbu|-FX=7k=p5J9(>OiGUiH7Bx8%LQ!lPBZZWqfI4Pdr#GU*UB7|eTw8&Mgwp!5niYG( zt)#=nNCTc7DSO3diHCOfNWQ2KkFsR|e+dDiE6Y2}eqJlE`Bz^J1@Xmu;-D0qh71O+ zX(Ju0IN*2$=9XqJyaSZ+aP4dT?#CVLbRZHQ%4?ng`gaKj|yF5b2 znL6ifO#mpco^19z;NN*egk9~qr;^9BuOM(Zd9BrpDQ6gZ4XtlUnHHFy?auC#<8nt_ z=8C3g(R^hA2M-EmM&C<46+Cv3CIglB+d})&>rsUPD-`o=!_MzM)LmFDSozPAtQemOv~O>I8@O)bJ1`!T zPXb7r!J_z!^}@lSWT2o2&cEZc&QeUD1rRC5QvhVoXQz$LKgy%_ZghR8Bp>QjuAI54 z{sSkAI zyv!DT6;m`|2IZ%p2ac&S8gnutLIix9aaE05txn=78W}zYkGh+uI@`8>Kpqv)rt=Ai ze33x0yS8BjNn}`T8jNv)s|y`6y2}V;v8OdJ_5C6po#8eZD?$vm0czeW3A5&xOo0R8 zihA7107Zsc%R22C8Me~ZrL0};y0UO6P`O1(nHFuAX{2T$nw-*1i=|3S+LE2l>F(?0 zd+l=Yge5SpTkwYpX+Uht)w2O}g`(8<-s%PJx63&uz)@H-vGSFB5250A1w^r^=u@9-Rkk zHCSa>BO+F+1H;06F5}A)C<6Qw#PBN-2;!sACnKsvXX~0q-vBZ|!@wa{wRqc8>e6C!^X!b-CJG^4INmG$4?fSn3^C^tp{CNsyuG*ln)rtMPq^Ld%4_)?6%2ad?xKMns1O6)U9XN@E+! zayTbYv{`0k@cV63@f|irL-x4-caBdYZ29Y+R~9taHMlP>|D*~)Q3z6rmxL{%?n~TP zlB0Hl&29{Ae8H5{5q^Jj5Cv2QL%=e*R|Kq}CJUW`ZJ(Cb-I4|G@h0iVGo|3<=F}_B ziOVpF!3X!&=jbF(^!%=JCmH=!pyKhlKS({|SEso@Cv-45f9juczTb*B!fwF`_)#6P_CI#M2^pr-LjM6AxD9R6K(Kay2_&S zP&R~eKs%6CBJxex44|cw5)zk7H}i}cCUiXOaIsihJhHY+d*tS?rg-kHbBtuqjQ~ z*hUF`G0DzX7ewnT<7ol=b!tAiadjPS6dnV$e}C!j9UZpQqwNje`;{50$!$|~e(Z}1 zwH>*BWWIE}6y-%T+m6cqO&41=q}HIpCyKk4(n4-nLp1(QIQZD7vjxR(NopTy)+6q) z?fQQC>dvG>m{1vANxSsrx7*CkCI^dkGJH;SBq#&Cbc55bJl^8-dwvlWoIss|QJVYEXLY?T`X-JiO;KNu-VuF~-(U2i#lG*Fz|Ki}tGS z`jSG8?56>u8R?aHo6hR5Npr~d^F75)2xlbBRn#X>*iG& z`#zUI#TF5r&%EVvV{GAZz`i!6#AlO*5GvV$9S^5VDM!fb<+Dcs18wmd956-Rn0_j- z)&H2S`q3h1P%SiXBW70f+ET?pZe{MZM{%){(go*6_d3}3lnkU@4{KY(+vWoHd|53% zh7kszcvxfJ3e<0OEM250Qm@LX8B`-?s5Wb@JN{CHXD;1p3@f}`w5+9 zk7LzEaa+a8)ax)_p6aBZ6#>CqQ9An{r$#dD)k+f0J#?*c4HW48(tF!V3q~IkIE%;| z;^|<=>)|vO9W`}!WZ-X?#gdnKg!>wFuH&M2SC_ZwaL(zU+VV2jK?oG3j2`hAfM%D9 z$Gs~P&(}&z*6f{XyvQgZj4e?V_?n|na2DSP*XDf!_Bj?mYcBG7O*WgH?PRJ$zJOH7 zScAy`Er|cNBrgyM_kRaCKN+G?Eh&43LL==z}`Qb?EhFG`|m^~@jop5Iof}I`0xH- LbAPpeow5G_%)B!= literal 0 HcmV?d00001 -- 2.7.4