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 + .../staging/ft1000/ft1000-pcmcia/ft1000.conf | 14 + drivers/staging/ft1000/ft1000-pcmcia/ft1000.h | 409 +++ .../staging/ft1000/ft1000-pcmcia/ft1000.img | Bin 0 -> 305770 bytes .../staging/ft1000/ft1000-pcmcia/ft1000_cs.c | 513 +++ .../staging/ft1000/ft1000-pcmcia/ft1000_cs.h | 1 + .../staging/ft1000/ft1000-pcmcia/ft1000_dev.h | 66 + .../ft1000/ft1000-pcmcia/ft1000_dnld.c | 940 ++++++ .../staging/ft1000/ft1000-pcmcia/ft1000_hw.c | 2286 ++++++++++++++ .../ft1000/ft1000-pcmcia/ft1000_proc.c | 219 ++ drivers/staging/ft1000/ft1000-usb/Makefile | 3 + .../staging/ft1000/ft1000-usb/ft1000_chdev.c | 934 ++++++ .../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 + .../staging/ft1000/ft1000-usb/ft1000_ioctl.h | 140 + .../staging/ft1000/ft1000-usb/ft1000_proc.c | 232 ++ .../staging/ft1000/ft1000-usb/ft1000_usb.c | 349 +++ .../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 e6c3ee69c3bc9..35a3ed1e1a158 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 88a934e907fb5..6221ffd3407fc 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 0000000000000..7c8af886dd5dc --- /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 0000000000000..3e987770a1421 --- /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 0000000000000..1d346bc4f443a --- /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 0000000000000..30ad20878b671 --- /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 0000000000000..c376daeec0cd8 --- /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 0000000000000..e2321a42e3129 --- /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 0000000000000..93b0ad35102d5 --- /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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%0DNMfj0^pM8mqaIoIfe4 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 &YPld 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

b{3ZZH9eN6gg=PCfyAc>|BzfeytyI^0Kjt5Ny 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

I+cY$;}o{fri)35 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%0D4}p<}q{k`j8_QJRT~xTOQjzt5 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 z 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 BK$8Ff literal 0 Hc-jL100001 diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c new file mode 100644 index 0000000000000..20a663ddc90eb --- /dev/null +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c @@ -0,0 +1,513 @@ +/*--------------------------------------------------------------------------- + FT1000 driver for Flarion Flash OFDM NIC Device + + Copyright (C) 1999 David A. Hinds. All Rights Reserved. + 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. + + The initial developer of the original code is David A. Hinds + . 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 0000000000000..2b5e383631fcd --- /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 0000000000000..1c9d163ad3e89 --- /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 0000000000000..be9c749d5edbb --- /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 0000000000000..d168a73e4e470 --- /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 0000000000000..94b2755a33573 --- /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 0000000000000..7845c47ac64fd --- /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 0000000000000..c135c9da63b1f --- /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 0000000000000..4751a1d11d7a1 --- /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 0000000000000..3dea39ca3efd8 --- /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 0000000000000..c580741310140 --- /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 0000000000000..2d674a43d65b2 --- /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 0000000000000..fbaa3d02bb3a5 --- /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 0000000000000..f8085ba09000a --- /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 0000000000000..417bb1734f1b2 --- /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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 SdVrtB^Xn|%Q?K>600QX0N2YNz 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 z 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