Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: ft1000: remove obsolete driver

Remove support for Qleadtek Flash-OFDM modems. Telecom carrier is
discontinuing service for the radio technology.
See http://www.gtigroup.org/news/ind/2015-08-18/6996.html.

Suggested-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Deepa Dinamani and committed by
Greg Kroah-Hartman
6512edec eb96c7fc

-7578
-2
drivers/staging/Kconfig
··· 62 62 63 63 source "drivers/staging/emxx_udc/Kconfig" 64 64 65 - source "drivers/staging/ft1000/Kconfig" 66 - 67 65 source "drivers/staging/speakup/Kconfig" 68 66 69 67 source "drivers/staging/ste_rmi4/Kconfig"
-1
drivers/staging/Makefile
··· 25 25 obj-$(CONFIG_FB_SM750) += sm750fb/ 26 26 obj-$(CONFIG_FB_XGI) += xgifb/ 27 27 obj-$(CONFIG_USB_EMXX) += emxx_udc/ 28 - obj-$(CONFIG_FT1000) += ft1000/ 29 28 obj-$(CONFIG_SPEAKUP) += speakup/ 30 29 obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += ste_rmi4/ 31 30 obj-$(CONFIG_MFD_NVEC) += nvec/
-22
drivers/staging/ft1000/Kconfig
··· 1 - config FT1000 2 - tristate "Drivers for Flarion ft1000 devices" 3 - 4 - if FT1000 5 - 6 - config FT1000_USB 7 - tristate "Driver for ft1000 usb devices." 8 - depends on USB 9 - depends on NET 10 - help 11 - Say Y if you want to have support for Qleadtek FLASH-OFDM USB Modem [LR7F04], 12 - Qleadtek Express Card or Leadtek Multi-band modem HSDPA. 13 - 14 - config FT1000_PCMCIA 15 - tristate "Driver for ft1000 pcmcia device." 16 - depends on PCMCIA 17 - depends on NET 18 - help 19 - Say Y if you want to have support for Flarion card also called 20 - Multimedia Net Card. 21 - 22 - endif
-3
drivers/staging/ft1000/Makefile
··· 1 - obj-$(CONFIG_FT1000_USB) += ft1000-usb/ 2 - obj-$(CONFIG_FT1000_PCMCIA) += ft1000-pcmcia/ 3 -
-9
drivers/staging/ft1000/TODO
··· 1 - TODO: 2 - - checkpatch.pl cleanups 3 - - coding style 4 - - sparse fixes 5 - - adapt to latest usb and pcmcia api changes 6 - - change firmware loading for usb driver to proper kernel method (request_firmware) 7 - 8 - Please send patches to Greg Kroah-Hartman <greg@kroah.com> and 9 - Cc: Marek Belisko <marek.belisko@gmail.com>
-2
drivers/staging/ft1000/ft1000-pcmcia/Makefile
··· 1 - obj-$(CONFIG_FT1000_PCMCIA) = ft1000_pcmcia.o 2 - ft1000_pcmcia-y := ft1000_hw.o ft1000_dnld.o ft1000_cs.o
-158
drivers/staging/ft1000/ft1000-pcmcia/boot.h
··· 1 - /*--------------------------------------------------------------------------- 2 - FT1000 driver for Flarion Flash OFDM NIC Device 3 - 4 - Copyright (C) 2002 Flarion Technologies, All rights reserved. 5 - 6 - This program is free software; you can redistribute it and/or modify it 7 - under the terms of the GNU General Public License as published by the Free 8 - Software Foundation; either version 2 of the License, or (at your option) any 9 - later version. This program is distributed in the hope that it will be useful, 10 - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - more details. You should have received a copy of the GNU General Public 13 - License along with this program; if not, write to the 14 - Free Software Foundation, Inc., 59 Temple Place - 15 - Suite 330, Boston, MA 02111-1307, USA. 16 - --------------------------------------------------------------------------- 17 - 18 - File: boot.h 19 - 20 - Description: boatloader 21 - 22 - History: 23 - 1/11/05 Whc Ported to Linux. 24 - 25 - ---------------------------------------------------------------------------*/ 26 - #ifndef _BOOTH_ 27 - #define _BOOTH_ 28 - 29 - /* Official bootloader */ 30 - static unsigned char bootimage[] = { 31 - 0x00, 0x00, 0x01, 0x5E, 0x00, 0x00, 32 - 0x00, 0x00, 0x00, 0x00, 0x02, 0xD7, 33 - 0x00, 0x00, 0x01, 0x5E, 0x46, 0xB3, 34 - 0xE6, 0x02, 0x00, 0x98, 0xE6, 0x8C, 35 - 0x00, 0x98, 0xFB, 0x92, 0xFF, 0xFF, 36 - 0x98, 0xFB, 0x94, 0xFF, 0xFF, 0x98, 37 - 0xFB, 0x06, 0x08, 0x00, 0x98, 0xFB, 38 - 0x96, 0x84, 0x00, 0x98, 0xFB, 0x08, 39 - 0x1C, 0x00, 0x98, 0xFB, 0x51, 0x25, 40 - 0x10, 0x1C, 0x00, 0xE6, 0x51, 0x01, 41 - 0x07, 0xFD, 0x4C, 0xFF, 0x20, 0xF5, 42 - 0x51, 0x02, 0x20, 0x08, 0x00, 0x4C, 43 - 0xFF, 0x20, 0x3C, 0x00, 0xC0, 0x64, 44 - 0x98, 0xC0, 0x66, 0x98, 0xC0, 0x68, 45 - 0x98, 0xC0, 0x6A, 0x98, 0xC0, 0x6C, 46 - 0x98, 0x90, 0x08, 0x90, 0x09, 0x90, 47 - 0x0A, 0x90, 0x0B, 0x90, 0x0C, 0x90, 48 - 0x0D, 0x90, 0x0E, 0x90, 0x0F, 0x90, 49 - 0x04, 0x90, 0x06, 0xFB, 0x51, 0x22, 50 - 0x16, 0x08, 0x03, 0xFB, 0x51, 0x52, 51 - 0x16, 0x08, 0x04, 0xFB, 0x51, 0x24, 52 - 0x2B, 0x08, 0x06, 0xFB, 0x51, 0x54, 53 - 0x2B, 0x08, 0x07, 0xFB, 0x51, 0x24, 54 - 0x2B, 0x08, 0x09, 0xFB, 0x51, 0x54, 55 - 0x2B, 0x08, 0x0A, 0xFB, 0x51, 0x12, 56 - 0x16, 0x08, 0x0C, 0xFB, 0x51, 0x52, 57 - 0x16, 0x08, 0x0D, 0x78, 0x00, 0x00, 58 - 0x00, 0x16, 0x00, 0x00, 0xEC, 0x31, 59 - 0xAE, 0x00, 0x00, 0x81, 0x4C, 0x0F, 60 - 0xE6, 0x43, 0xFF, 0xEC, 0x31, 0x4E, 61 - 0x00, 0x00, 0x91, 0xEC, 0x31, 0xAE, 62 - 0x00, 0x00, 0x91, 0x4C, 0x0F, 0xE6, 63 - 0x43, 0xFF, 0xEC, 0x31, 0x5E, 0x00, 64 - 0x00, 0xA1, 0xEB, 0x31, 0x08, 0x00, 65 - 0x00, 0xA6, 0xEB, 0x31, 0x08, 0x00, 66 - 0x00, 0xAC, 0x3C, 0x00, 0xEB, 0x31, 67 - 0x08, 0x00, 0x00, 0xA8, 0x76, 0xFE, 68 - 0xFE, 0x08, 0xEB, 0x31, 0x08, 0x20, 69 - 0x00, 0x00, 0x76, 0xFF, 0xFF, 0x18, 70 - 0xED, 0x31, 0x08, 0x20, 0x00, 0x00, 71 - 0x26, 0x10, 0x04, 0x10, 0xF5, 0x3C, 72 - 0x01, 0x3C, 0x00, 0x08, 0x01, 0x12, 73 - 0x3C, 0x11, 0x3C, 0x00, 0x08, 0x01, 74 - 0x0B, 0x08, 0x00, 0x6D, 0xEC, 0x31, 75 - 0xAE, 0x20, 0x00, 0x06, 0xED, 0x4D, 76 - 0x08, 0x00, 0x00, 0x67, 0x80, 0x6F, 77 - 0x00, 0x01, 0x0B, 0x6F, 0x00, 0x02, 78 - 0x2E, 0x76, 0xEE, 0x01, 0x48, 0x06, 79 - 0x01, 0x39, 0xED, 0x4D, 0x18, 0x00, 80 - 0x02, 0xED, 0x4D, 0x08, 0x00, 0x04, 81 - 0x14, 0x06, 0xA4, 0xED, 0x31, 0x22, 82 - 0x00, 0x00, 0xAC, 0x76, 0xEE, 0x07, 83 - 0x48, 0x6D, 0x22, 0x01, 0x1E, 0x08, 84 - 0x01, 0x58, 0xEB, 0x31, 0x08, 0x00, 85 - 0x00, 0xAC, 0x06, 0xFF, 0xBA, 0x3C, 86 - 0x00, 0xEB, 0x31, 0x08, 0x20, 0x00, 87 - 0x04, 0x3C, 0x30, 0xEB, 0x31, 0x08, 88 - 0x20, 0x00, 0x02, 0x3C, 0x10, 0xEB, 89 - 0x31, 0x08, 0x20, 0x00, 0x00, 0xED, 90 - 0x31, 0x08, 0x20, 0x00, 0x00, 0x04, 91 - 0x10, 0xF7, 0xED, 0x31, 0x08, 0x00, 92 - 0x00, 0xA2, 0x91, 0x00, 0x9C, 0x3C, 93 - 0x80, 0xEB, 0x31, 0x08, 0x20, 0x00, 94 - 0x04, 0x3C, 0x20, 0xEB, 0x31, 0x08, 95 - 0x20, 0x00, 0x02, 0x3C, 0x10, 0xEB, 96 - 0x31, 0x08, 0x20, 0x00, 0x00, 0xED, 97 - 0x31, 0x08, 0x20, 0x00, 0x00, 0x04, 98 - 0x10, 0xF7, 0xED, 0x31, 0x08, 0x20, 99 - 0x00, 0x04, 0x42, 0x10, 0x90, 0x08, 100 - 0xEC, 0x31, 0xAE, 0x20, 0x00, 0x06, 101 - 0xA4, 0x41, 0x08, 0x00, 0xB6, 0xED, 102 - 0x41, 0x28, 0x7D, 0xFF, 0xFF, 0x22, 103 - 0xB3, 0x40, 0x98, 0x2A, 0x32, 0xEB, 104 - 0x41, 0x28, 0xB4, 0x43, 0xFC, 0x05, 105 - 0xFF, 0xE6, 0xA0, 0x31, 0x20, 0x00, 106 - 0x06, 0xEB, 0x31, 0x08, 0x20, 0x00, 107 - 0x04, 0x3C, 0x20, 0xEB, 0x31, 0x08, 108 - 0x20, 0x00, 0x02, 0x3C, 0x10, 0xEB, 109 - 0x31, 0x08, 0x20, 0x00, 0x00, 0xED, 110 - 0x31, 0x08, 0x20, 0x00, 0x00, 0x04, 111 - 0x10, 0xF7, 0xED, 0x31, 0x08, 0x20, 112 - 0x00, 0x04, 0x42, 0x10, 0x90, 0x08, 113 - 0xEC, 0x31, 0xAE, 0x20, 0x00, 0x06, 114 - 0xA4, 0x41, 0x08, 0x00, 0x68, 0xED, 115 - 0x41, 0x28, 0x7D, 0xFF, 0xFF, 0x22, 116 - 0xB3, 0x40, 0x98, 0x2A, 0x32, 0xEB, 117 - 0x41, 0x28, 0xB4, 0x43, 0xFC, 0x05, 118 - 0xFF, 0xE6, 0x48, 0x04, 0xEB, 0x31, 119 - 0x08, 0x20, 0x00, 0x04, 0xEB, 0x31, 120 - 0x18, 0x20, 0x00, 0x02, 0x3C, 0x11, 121 - 0xEB, 0x31, 0x18, 0x20, 0x00, 0x00, 122 - 0xED, 0x31, 0x08, 0x20, 0x00, 0x00, 123 - 0x04, 0x10, 0xF7, 0xED, 0x31, 0x08, 124 - 0x20, 0x00, 0x02, 0x66, 0x00, 0x6F, 125 - 0x00, 0x01, 0x16, 0x76, 0xEE, 0x06, 126 - 0x48, 0x4A, 0x1E, 0x48, 0x04, 0xED, 127 - 0x31, 0x08, 0x20, 0x00, 0x04, 0xEB, 128 - 0x31, 0x08, 0x00, 0x00, 0xA4, 0x48, 129 - 0x04, 0xED, 0x31, 0x08, 0x20, 0x00, 130 - 0x04, 0xEB, 0x31, 0x08, 0x00, 0x00, 131 - 0xA2, 0x48, 0x04, 0x20, 0x20, 0x4A, 132 - 0x7C, 0x46, 0x82, 0x50, 0x05, 0x50, 133 - 0x15, 0xB5, 0x1E, 0x98, 0xED, 0x31, 134 - 0x08, 0x00, 0x00, 0xA8, 0x10, 0x47, 135 - 0x3B, 0x2C, 0x01, 0xDB, 0x40, 0x11, 136 - 0x98, 0xC1, 0x1E, 0x98, 0x10, 0x07, 137 - 0x30, 0xF9, 0x40, 0x07, 0x18, 0x98, 138 - 0x2A, 0x10, 0xEB, 0x31, 0x08, 0x00, 139 - 0x00, 0xA8, 0xA4, 0x1E, 0x98, 0xBB, 140 - 0x1E, 0x98, 0x50, 0x14, 0x50, 0x04, 141 - 0x46, 0x83, 0x48, 0x04, 0x02, 0x01, 142 - 0x00, 0x50, 0x05, 0x50, 0x15, 0x10, 143 - 0x87, 0x3F, 0x90, 0x2B, 0x18, 0x01, 144 - 0x00, 0xC0, 0x31, 0x00, 0x00, 0xAE, 145 - 0xDF, 0x41, 0x00, 0x08, 0x00, 0x1A, 146 - 0x42, 0x11, 0x67, 0x01, 0xDF, 0x41, 147 - 0x02, 0x08, 0x00, 0x10, 0x42, 0x11, 148 - 0x62, 0x01, 0xB4, 0x43, 0x4A, 0x68, 149 - 0x50, 0x14, 0x50, 0x04, 0x24, 0x10, 150 - 0x48, 0x04, 0xF2, 0x31, 0x00, 0x01, 151 - 0x00, 0x00, 0xAE, 0xF6, 0x31, 0x00, 152 - 0x01, 0x00, 0x00, 0xAE, 0x62, 0xE4, 153 - 0xE5, 0x61, 0x04, 0x48, 0x04, 0xE5, 154 - 0x63, 0x05, 0x48, 0x04, 0x20, 0x20, 155 - 0x00, 0x00, 0x00, 0x00 156 - }; 157 - 158 - #endif
-70
drivers/staging/ft1000/ft1000-pcmcia/ft1000.h
··· 1 - /*--------------------------------------------------------------------------- 2 - FT1000 driver for Flarion Flash OFDM NIC Device 3 - 4 - Copyright (C) 2002 Flarion Technologies, All rights reserved. 5 - 6 - This program is free software; you can redistribute it and/or modify it 7 - under the terms of the GNU General Public License as published by the Free 8 - Software Foundation; either version 2 of the License, or (at your option) any 9 - later version. This program is distributed in the hope that it will be useful, 10 - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - more details. You should have received a copy of the GNU General Public 13 - License along with this program; if not, write to the 14 - Free Software Foundation, Inc., 59 Temple Place - 15 - Suite 330, Boston, MA 02111-1307, USA. 16 - --------------------------------------------------------------------------- 17 - Description: Common structures and defines 18 - ---------------------------------------------------------------------------*/ 19 - #ifndef _FT1000H_ 20 - #define _FT1000H_ 21 - 22 - #include "../ft1000.h" 23 - 24 - #define FT1000_DRV_VER 0x01010300 25 - 26 - #define FT1000_DPRAM_BASE 0x0000 /* Dual Port RAM starting offset */ 27 - 28 - /* 29 - * Maximum number of occurrence of pseudo header errors before resetting PC 30 - * Card. 31 - */ 32 - #define MAX_PH_ERR 300 33 - 34 - #define SUCCESS 0x00 35 - #define FAILURE 0x01 36 - 37 - struct ft1000_pcmcia { 38 - int PktIntfErr; 39 - u16 packetseqnum; 40 - void *link; 41 - }; 42 - 43 - struct pcmcia_device; 44 - struct net_device; 45 - struct net_device *init_ft1000_card(struct pcmcia_device *link, 46 - void *ft1000_reset); 47 - void stop_ft1000_card(struct net_device *dev); 48 - int card_download(struct net_device *dev, const u8 *pFileStart, 49 - size_t FileLength); 50 - 51 - u16 ft1000_read_dpram(struct net_device *dev, int offset); 52 - void card_bootload(struct net_device *dev); 53 - u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index); 54 - u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset); 55 - void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value); 56 - 57 - /* Read the value of a given ASIC register. */ 58 - static inline u16 ft1000_read_reg(struct net_device *dev, u16 offset) 59 - { 60 - return inw(dev->base_addr + offset); 61 - } 62 - 63 - /* Set the value of a given ASIC register. */ 64 - static inline void ft1000_write_reg(struct net_device *dev, u16 offset, 65 - u16 value) 66 - { 67 - outw(value, dev->base_addr + offset); 68 - } 69 - 70 - #endif
drivers/staging/ft1000/ft1000-pcmcia/ft1000.img

This is a binary file and will not be displayed.

-158
drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c
··· 1 - /*--------------------------------------------------------------------------- 2 - FT1000 driver for Flarion Flash OFDM NIC Device 3 - 4 - Copyright (C) 1999 David A. Hinds. All Rights Reserved. 5 - Copyright (C) 2002 Flarion Technologies, All rights reserved. 6 - Copyright (C) 2006 Patrik Ostrihon, All rights reserved. 7 - Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved. 8 - 9 - The initial developer of the original code is David A. Hinds 10 - <dahinds@users.sourceforge.net>. Portions created by David A. Hinds. 11 - 12 - This file was modified to support the Flarion Flash OFDM NIC Device 13 - by Wai Chan (w.chan@flarion.com). 14 - 15 - Port for kernel 2.6 created by Patrik Ostrihon (patrik.ostrihon@pwc.sk) 16 - 17 - This program is free software; you can redistribute it and/or modify it 18 - under the terms of the GNU General Public License as published by the Free 19 - Software Foundation; either version 2 of the License, or (at your option) any 20 - later version. This program is distributed in the hope that it will be useful, 21 - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 22 - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 23 - more details. You should have received a copy of the GNU General Public 24 - License along with this program; if not, write to the 25 - Free Software Foundation, Inc., 59 Temple Place - 26 - Suite 330, Boston, MA 02111-1307, USA. 27 - -----------------------------------------------------------------------------*/ 28 - 29 - #include <linux/kernel.h> 30 - #include <linux/module.h> 31 - #include <linux/init.h> 32 - #include <linux/netdevice.h> 33 - #include <pcmcia/cistpl.h> 34 - #include <pcmcia/ds.h> 35 - 36 - /*====================================================================*/ 37 - 38 - MODULE_AUTHOR("Wai Chan"); 39 - MODULE_DESCRIPTION("FT1000 PCMCIA driver"); 40 - MODULE_LICENSE("GPL"); 41 - 42 - /*====================================================================*/ 43 - 44 - static int ft1000_config(struct pcmcia_device *link); 45 - static void ft1000_detach(struct pcmcia_device *link); 46 - static int ft1000_attach(struct pcmcia_device *link); 47 - 48 - #include "ft1000.h" 49 - 50 - /*====================================================================*/ 51 - 52 - static void ft1000_reset(struct pcmcia_device *link) 53 - { 54 - pcmcia_reset_card(link->socket); 55 - } 56 - 57 - static int ft1000_attach(struct pcmcia_device *link) 58 - { 59 - link->priv = NULL; 60 - link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; 61 - 62 - return ft1000_config(link); 63 - } 64 - 65 - static void ft1000_detach(struct pcmcia_device *link) 66 - { 67 - struct net_device *dev = link->priv; 68 - 69 - if (dev) 70 - stop_ft1000_card(dev); 71 - 72 - pcmcia_disable_device(link); 73 - free_netdev(dev); 74 - } 75 - 76 - static int ft1000_confcheck(struct pcmcia_device *link, void *priv_data) 77 - { 78 - return pcmcia_request_io(link); 79 - } 80 - 81 - /*====================================================================== 82 - 83 - ft1000_config() is scheduled to run after a CARD_INSERTION event 84 - is received, to configure the PCMCIA socket, and to make the 85 - device available to the system. 86 - 87 - ======================================================================*/ 88 - 89 - static int ft1000_config(struct pcmcia_device *link) 90 - { 91 - int ret; 92 - 93 - dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link); 94 - 95 - /* setup IO window */ 96 - ret = pcmcia_loop_config(link, ft1000_confcheck, NULL); 97 - if (ret) { 98 - dev_err(&link->dev, "Could not configure pcmcia\n"); 99 - return -ENODEV; 100 - } 101 - 102 - /* configure device */ 103 - ret = pcmcia_enable_device(link); 104 - if (ret) { 105 - dev_err(&link->dev, "Could not enable pcmcia\n"); 106 - goto failed; 107 - } 108 - 109 - link->priv = init_ft1000_card(link, &ft1000_reset); 110 - if (!link->priv) { 111 - dev_err(&link->dev, "Could not register as network device\n"); 112 - goto failed; 113 - } 114 - 115 - /* Finally, report what we've done */ 116 - 117 - return 0; 118 - failed: 119 - pcmcia_disable_device(link); 120 - return -ENODEV; 121 - } 122 - 123 - static int ft1000_suspend(struct pcmcia_device *link) 124 - { 125 - struct net_device *dev = link->priv; 126 - 127 - if (link->open) 128 - netif_device_detach(dev); 129 - return 0; 130 - } 131 - 132 - static int ft1000_resume(struct pcmcia_device *link) 133 - { 134 - return 0; 135 - } 136 - 137 - /*====================================================================*/ 138 - 139 - static const struct pcmcia_device_id ft1000_ids[] = { 140 - PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x0100), 141 - PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1000), 142 - PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1300), 143 - PCMCIA_DEVICE_NULL, 144 - }; 145 - 146 - MODULE_DEVICE_TABLE(pcmcia, ft1000_ids); 147 - 148 - static struct pcmcia_driver ft1000_cs_driver = { 149 - .owner = THIS_MODULE, 150 - .name = "ft1000_cs", 151 - .probe = ft1000_attach, 152 - .remove = ft1000_detach, 153 - .id_table = ft1000_ids, 154 - .suspend = ft1000_suspend, 155 - .resume = ft1000_resume, 156 - }; 157 - 158 - module_pcmcia_driver(ft1000_cs_driver);
-762
drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c
··· 1 - /*--------------------------------------------------------------------------- 2 - FT1000 driver for Flarion Flash OFDM NIC Device 3 - 4 - Copyright (C) 2002 Flarion Technologies, All rights reserved. 5 - 6 - This program is free software; you can redistribute it and/or modify it 7 - under the terms of the GNU General Public License as published by the Free 8 - Software Foundation; either version 2 of the License, or (at your option) any 9 - later version. This program is distributed in the hope that it will be useful, 10 - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 11 - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 - more details. You should have received a copy of the GNU General Public 13 - License along with this program; if not, write to the 14 - Free Software Foundation, Inc., 59 Temple Place - 15 - Suite 330, Boston, MA 02111-1307, USA. 16 - -------------------------------------------------------------------------- 17 - 18 - Description: This module will handshake with the DSP bootloader to 19 - download the DSP runtime image. 20 - 21 - ---------------------------------------------------------------------------*/ 22 - 23 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 24 - 25 - #define __KERNEL_SYSCALLS__ 26 - 27 - #include <linux/module.h> 28 - #include <linux/fs.h> 29 - #include <linux/mm.h> 30 - #include <linux/slab.h> 31 - #include <linux/unistd.h> 32 - #include <linux/netdevice.h> 33 - #include <linux/timer.h> 34 - #include <linux/delay.h> 35 - #include <linux/io.h> 36 - #include <linux/uaccess.h> 37 - #include <linux/vmalloc.h> 38 - 39 - #include "ft1000.h" 40 - #include "boot.h" 41 - 42 - #define MAX_DSP_WAIT_LOOPS 100 43 - #define DSP_WAIT_SLEEP_TIME 1 /* 1 millisecond */ 44 - 45 - #define MAX_LENGTH 0x7f0 46 - 47 - #define DWNLD_MAG_HANDSHAKE_LOC 0x00 48 - #define DWNLD_MAG_TYPE_LOC 0x01 49 - #define DWNLD_MAG_SIZE_LOC 0x02 50 - #define DWNLD_MAG_PS_HDR_LOC 0x03 51 - 52 - #define DWNLD_HANDSHAKE_LOC 0x02 53 - #define DWNLD_TYPE_LOC 0x04 54 - #define DWNLD_SIZE_MSW_LOC 0x06 55 - #define DWNLD_SIZE_LSW_LOC 0x08 56 - #define DWNLD_PS_HDR_LOC 0x0A 57 - 58 - #define HANDSHAKE_TIMEOUT_VALUE 0xF1F1 59 - #define HANDSHAKE_RESET_VALUE 0xFEFE /* When DSP requests startover */ 60 - #define HANDSHAKE_DSP_BL_READY 0xFEFE /* At start DSP writes this when bootloader ready */ 61 - #define HANDSHAKE_DRIVER_READY 0xFFFF /* Driver writes after receiving 0xFEFE */ 62 - #define HANDSHAKE_SEND_DATA 0x0000 /* DSP writes this when ready for more data */ 63 - 64 - #define HANDSHAKE_REQUEST 0x0001 /* Request from DSP */ 65 - #define HANDSHAKE_RESPONSE 0x0000 /* Satisfied DSP request */ 66 - 67 - #define REQUEST_CODE_LENGTH 0x0000 68 - #define REQUEST_RUN_ADDRESS 0x0001 69 - #define REQUEST_CODE_SEGMENT 0x0002 /* In WORD count */ 70 - #define REQUEST_DONE_BL 0x0003 71 - #define REQUEST_DONE_CL 0x0004 72 - #define REQUEST_VERSION_INFO 0x0005 73 - #define REQUEST_CODE_BY_VERSION 0x0006 74 - #define REQUEST_MAILBOX_DATA 0x0007 75 - #define REQUEST_FILE_CHECKSUM 0x0008 76 - 77 - #define STATE_START_DWNLD 0x01 78 - #define STATE_BOOT_DWNLD 0x02 79 - #define STATE_CODE_DWNLD 0x03 80 - #define STATE_DONE_DWNLD 0x04 81 - #define STATE_SECTION_PROV 0x05 82 - #define STATE_DONE_PROV 0x06 83 - #define STATE_DONE_FILE 0x07 84 - 85 - struct dsp_file_hdr { 86 - u32 version_id; /* Version ID of this image format. */ 87 - u32 package_id; /* Package ID of code release. */ 88 - u32 build_date; /* Date/time stamp when file was built. */ 89 - u32 commands_offset; /* Offset to attached commands in Pseudo Hdr format. */ 90 - u32 loader_offset; /* Offset to bootloader code. */ 91 - u32 loader_code_address; /* Start address of bootloader. */ 92 - u32 loader_code_end; /* Where bootloader code ends. */ 93 - u32 loader_code_size; 94 - u32 version_data_offset; /* Offset were scrambled version data begins. */ 95 - u32 version_data_size; /* Size, in words, of scrambled version data. */ 96 - u32 nDspImages; /* Number of DSP images in file. */ 97 - } __packed; 98 - 99 - struct dsp_image_info { 100 - u32 coff_date; /* Date/time when DSP Coff image was built. */ 101 - u32 begin_offset; /* Offset in file where image begins. */ 102 - u32 end_offset; /* Offset in file where image begins. */ 103 - u32 run_address; /* On chip Start address of DSP code. */ 104 - u32 image_size; /* Size of image. */ 105 - u32 version; /* Embedded version # of DSP code. */ 106 - unsigned short checksum; /* Dsp File checksum */ 107 - unsigned short pad1; 108 - } __packed; 109 - 110 - void card_bootload(struct net_device *dev) 111 - { 112 - struct ft1000_info *info = netdev_priv(dev); 113 - unsigned long flags; 114 - u32 *pdata; 115 - u32 size; 116 - u32 i; 117 - u32 templong; 118 - 119 - netdev_dbg(dev, "card_bootload is called\n"); 120 - 121 - pdata = (u32 *)bootimage; 122 - size = sizeof(bootimage); 123 - 124 - /* check for odd word */ 125 - if (size & 0x0003) 126 - size += 4; 127 - 128 - /* Provide mutual exclusive access while reading ASIC registers. */ 129 - spin_lock_irqsave(&info->dpram_lock, flags); 130 - 131 - /* need to set i/o base address initially and hardware will autoincrement */ 132 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, FT1000_DPRAM_BASE); 133 - /* write bytes */ 134 - for (i = 0; i < (size >> 2); i++) { 135 - templong = *pdata++; 136 - outl(templong, dev->base_addr + FT1000_REG_MAG_DPDATA); 137 - } 138 - 139 - spin_unlock_irqrestore(&info->dpram_lock, flags); 140 - } 141 - 142 - static u16 get_handshake(struct net_device *dev, u16 expected_value) 143 - { 144 - struct ft1000_info *info = netdev_priv(dev); 145 - u16 handshake; 146 - u32 tempx; 147 - int loopcnt; 148 - 149 - loopcnt = 0; 150 - while (loopcnt < MAX_DSP_WAIT_LOOPS) { 151 - if (info->AsicID == ELECTRABUZZ_ID) { 152 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 153 - DWNLD_HANDSHAKE_LOC); 154 - 155 - handshake = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 156 - } else { 157 - tempx = 158 - ntohl(ft1000_read_dpram_mag_32 159 - (dev, DWNLD_MAG_HANDSHAKE_LOC)); 160 - handshake = (u16)tempx; 161 - } 162 - 163 - if ((handshake == expected_value) 164 - || (handshake == HANDSHAKE_RESET_VALUE)) { 165 - return handshake; 166 - } 167 - loopcnt++; 168 - mdelay(DSP_WAIT_SLEEP_TIME); 169 - 170 - } 171 - 172 - return HANDSHAKE_TIMEOUT_VALUE; 173 - 174 - } 175 - 176 - static void put_handshake(struct net_device *dev, u16 handshake_value) 177 - { 178 - struct ft1000_info *info = netdev_priv(dev); 179 - u32 tempx; 180 - 181 - if (info->AsicID == ELECTRABUZZ_ID) { 182 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 183 - DWNLD_HANDSHAKE_LOC); 184 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, handshake_value); /* Handshake */ 185 - } else { 186 - tempx = (u32)handshake_value; 187 - tempx = ntohl(tempx); 188 - ft1000_write_dpram_mag_32(dev, DWNLD_MAG_HANDSHAKE_LOC, tempx); /* Handshake */ 189 - } 190 - } 191 - 192 - static u16 get_request_type(struct net_device *dev) 193 - { 194 - struct ft1000_info *info = netdev_priv(dev); 195 - u16 request_type; 196 - u32 tempx; 197 - 198 - if (info->AsicID == ELECTRABUZZ_ID) { 199 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_TYPE_LOC); 200 - request_type = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 201 - } else { 202 - tempx = ft1000_read_dpram_mag_32(dev, DWNLD_MAG_TYPE_LOC); 203 - tempx = ntohl(tempx); 204 - request_type = (u16)tempx; 205 - } 206 - 207 - return request_type; 208 - 209 - } 210 - 211 - static long get_request_value(struct net_device *dev) 212 - { 213 - struct ft1000_info *info = netdev_priv(dev); 214 - long value; 215 - u16 w_val; 216 - 217 - if (info->AsicID == ELECTRABUZZ_ID) { 218 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 219 - DWNLD_SIZE_MSW_LOC); 220 - 221 - w_val = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 222 - 223 - value = (long)(w_val << 16); 224 - 225 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 226 - DWNLD_SIZE_LSW_LOC); 227 - 228 - w_val = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 229 - 230 - value = (long)(value | w_val); 231 - } else { 232 - value = ft1000_read_dpram_mag_32(dev, DWNLD_MAG_SIZE_LOC); 233 - value = ntohl(value); 234 - } 235 - 236 - return value; 237 - 238 - } 239 - 240 - static void put_request_value(struct net_device *dev, long lvalue) 241 - { 242 - struct ft1000_info *info = netdev_priv(dev); 243 - u16 size; 244 - u32 tempx; 245 - 246 - if (info->AsicID == ELECTRABUZZ_ID) { 247 - size = (u16) (lvalue >> 16); 248 - 249 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 250 - DWNLD_SIZE_MSW_LOC); 251 - 252 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); 253 - 254 - size = (u16) (lvalue); 255 - 256 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 257 - DWNLD_SIZE_LSW_LOC); 258 - 259 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); 260 - } else { 261 - tempx = ntohl(lvalue); 262 - ft1000_write_dpram_mag_32(dev, DWNLD_MAG_SIZE_LOC, tempx); /* Handshake */ 263 - } 264 - 265 - } 266 - 267 - static u16 hdr_checksum(struct pseudo_hdr *pHdr) 268 - { 269 - u16 *usPtr = (u16 *)pHdr; 270 - u16 chksum; 271 - 272 - chksum = (((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^ 273 - usPtr[4]) ^ usPtr[5]) ^ usPtr[6]; 274 - 275 - return chksum; 276 - } 277 - 278 - int card_download(struct net_device *dev, const u8 *pFileStart, 279 - size_t FileLength) 280 - { 281 - struct ft1000_info *info = netdev_priv(dev); 282 - int Status = SUCCESS; 283 - u32 uiState; 284 - u16 handshake; 285 - struct pseudo_hdr *pHdr; 286 - u16 usHdrLength; 287 - long word_length; 288 - u16 request; 289 - u16 temp; 290 - struct prov_record *pprov_record; 291 - u8 *pbuffer; 292 - struct dsp_file_hdr *pFileHdr5; 293 - struct dsp_image_info *pDspImageInfoV6 = NULL; 294 - long requested_version; 295 - bool bGoodVersion = false; 296 - struct drv_msg *pMailBoxData; 297 - u16 *pUsData = NULL; 298 - u16 *pUsFile = NULL; 299 - u8 *pUcFile = NULL; 300 - u8 *pBootEnd = NULL; 301 - u8 *pCodeEnd = NULL; 302 - int imageN; 303 - long file_version; 304 - long loader_code_address = 0; 305 - long loader_code_size = 0; 306 - long run_address = 0; 307 - long run_size = 0; 308 - unsigned long flags; 309 - unsigned long templong; 310 - unsigned long image_chksum = 0; 311 - 312 - file_version = *(long *)pFileStart; 313 - if (file_version != 6) { 314 - pr_err("unsupported firmware version %ld\n", file_version); 315 - Status = FAILURE; 316 - } 317 - 318 - uiState = STATE_START_DWNLD; 319 - 320 - pFileHdr5 = (struct dsp_file_hdr *)pFileStart; 321 - 322 - pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->loader_offset); 323 - pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->loader_offset); 324 - pBootEnd = (u8 *) ((long)pFileStart + pFileHdr5->loader_code_end); 325 - loader_code_address = pFileHdr5->loader_code_address; 326 - loader_code_size = pFileHdr5->loader_code_size; 327 - bGoodVersion = false; 328 - 329 - while ((Status == SUCCESS) && (uiState != STATE_DONE_FILE)) { 330 - 331 - switch (uiState) { 332 - case STATE_START_DWNLD: 333 - 334 - handshake = get_handshake(dev, HANDSHAKE_DSP_BL_READY); 335 - 336 - if (handshake == HANDSHAKE_DSP_BL_READY) 337 - put_handshake(dev, HANDSHAKE_DRIVER_READY); 338 - else 339 - Status = FAILURE; 340 - 341 - uiState = STATE_BOOT_DWNLD; 342 - 343 - break; 344 - 345 - case STATE_BOOT_DWNLD: 346 - handshake = get_handshake(dev, HANDSHAKE_REQUEST); 347 - if (handshake == HANDSHAKE_REQUEST) { 348 - /* 349 - * Get type associated with the request. 350 - */ 351 - request = get_request_type(dev); 352 - switch (request) { 353 - case REQUEST_RUN_ADDRESS: 354 - put_request_value(dev, 355 - loader_code_address); 356 - break; 357 - case REQUEST_CODE_LENGTH: 358 - put_request_value(dev, 359 - loader_code_size); 360 - break; 361 - case REQUEST_DONE_BL: 362 - /* Reposition ptrs to beginning of code section */ 363 - pUsFile = (u16 *) ((long)pBootEnd); 364 - pUcFile = (u8 *) ((long)pBootEnd); 365 - uiState = STATE_CODE_DWNLD; 366 - break; 367 - case REQUEST_CODE_SEGMENT: 368 - word_length = get_request_value(dev); 369 - if (word_length > MAX_LENGTH) { 370 - Status = FAILURE; 371 - break; 372 - } 373 - if ((word_length * 2 + (long)pUcFile) > 374 - (long)pBootEnd) { 375 - /* 376 - * Error, beyond boot code range. 377 - */ 378 - Status = FAILURE; 379 - break; 380 - } 381 - /* Provide mutual exclusive access while reading ASIC registers. */ 382 - spin_lock_irqsave(&info->dpram_lock, 383 - flags); 384 - /* 385 - * Position ASIC DPRAM auto-increment pointer. 386 - */ 387 - outw(DWNLD_MAG_PS_HDR_LOC, 388 - dev->base_addr + 389 - FT1000_REG_DPRAM_ADDR); 390 - if (word_length & 0x01) 391 - word_length++; 392 - word_length = word_length / 2; 393 - 394 - for (; word_length > 0; word_length--) { /* In words */ 395 - templong = *pUsFile++; 396 - templong |= 397 - (*pUsFile++ << 16); 398 - pUcFile += 4; 399 - outl(templong, 400 - dev->base_addr + 401 - FT1000_REG_MAG_DPDATAL); 402 - } 403 - spin_unlock_irqrestore(&info-> 404 - dpram_lock, 405 - flags); 406 - break; 407 - default: 408 - Status = FAILURE; 409 - break; 410 - } 411 - put_handshake(dev, HANDSHAKE_RESPONSE); 412 - } else { 413 - Status = FAILURE; 414 - } 415 - 416 - break; 417 - 418 - case STATE_CODE_DWNLD: 419 - handshake = get_handshake(dev, HANDSHAKE_REQUEST); 420 - if (handshake == HANDSHAKE_REQUEST) { 421 - /* 422 - * Get type associated with the request. 423 - */ 424 - request = get_request_type(dev); 425 - switch (request) { 426 - case REQUEST_FILE_CHECKSUM: 427 - netdev_dbg(dev, 428 - "ft1000_dnld: REQUEST_FOR_CHECKSUM\n"); 429 - put_request_value(dev, image_chksum); 430 - break; 431 - case REQUEST_RUN_ADDRESS: 432 - if (bGoodVersion) { 433 - put_request_value(dev, 434 - run_address); 435 - } else { 436 - Status = FAILURE; 437 - break; 438 - } 439 - break; 440 - case REQUEST_CODE_LENGTH: 441 - if (bGoodVersion) { 442 - put_request_value(dev, 443 - run_size); 444 - } else { 445 - Status = FAILURE; 446 - break; 447 - } 448 - break; 449 - case REQUEST_DONE_CL: 450 - /* Reposition ptrs to beginning of provisioning section */ 451 - pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->commands_offset); 452 - pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->commands_offset); 453 - uiState = STATE_DONE_DWNLD; 454 - break; 455 - case REQUEST_CODE_SEGMENT: 456 - if (!bGoodVersion) { 457 - Status = FAILURE; 458 - break; 459 - } 460 - word_length = get_request_value(dev); 461 - if (word_length > MAX_LENGTH) { 462 - Status = FAILURE; 463 - break; 464 - } 465 - if ((word_length * 2 + (long)pUcFile) > 466 - (long)pCodeEnd) { 467 - /* 468 - * Error, beyond boot code range. 469 - */ 470 - Status = FAILURE; 471 - break; 472 - } 473 - /* 474 - * Position ASIC DPRAM auto-increment pointer. 475 - */ 476 - outw(DWNLD_MAG_PS_HDR_LOC, 477 - dev->base_addr + 478 - FT1000_REG_DPRAM_ADDR); 479 - if (word_length & 0x01) 480 - word_length++; 481 - word_length = word_length / 2; 482 - 483 - for (; word_length > 0; word_length--) { /* In words */ 484 - templong = *pUsFile++; 485 - templong |= 486 - (*pUsFile++ << 16); 487 - pUcFile += 4; 488 - outl(templong, 489 - dev->base_addr + 490 - FT1000_REG_MAG_DPDATAL); 491 - } 492 - break; 493 - 494 - case REQUEST_MAILBOX_DATA: 495 - /* Convert length from byte count to word count. Make sure we round up. */ 496 - word_length = 497 - (long)(info->DSPInfoBlklen + 1) / 2; 498 - put_request_value(dev, word_length); 499 - pMailBoxData = 500 - (struct drv_msg *)&info->DSPInfoBlk[0]; 501 - pUsData = 502 - (u16 *)&pMailBoxData->data[0]; 503 - /* Provide mutual exclusive access while reading ASIC registers. */ 504 - spin_lock_irqsave(&info->dpram_lock, 505 - flags); 506 - if (file_version == 5) { 507 - /* 508 - * Position ASIC DPRAM auto-increment pointer. 509 - */ 510 - ft1000_write_reg(dev, 511 - FT1000_REG_DPRAM_ADDR, 512 - DWNLD_PS_HDR_LOC); 513 - 514 - for (; word_length > 0; word_length--) { /* In words */ 515 - temp = ntohs(*pUsData); 516 - ft1000_write_reg(dev, 517 - FT1000_REG_DPRAM_DATA, 518 - temp); 519 - pUsData++; 520 - } 521 - } else { 522 - /* 523 - * Position ASIC DPRAM auto-increment pointer. 524 - */ 525 - outw(DWNLD_MAG_PS_HDR_LOC, 526 - dev->base_addr + 527 - FT1000_REG_DPRAM_ADDR); 528 - if (word_length & 0x01) 529 - word_length++; 530 - 531 - word_length = word_length / 2; 532 - 533 - for (; word_length > 0; word_length--) { /* In words */ 534 - templong = *pUsData++; 535 - templong |= 536 - (*pUsData++ << 16); 537 - outl(templong, 538 - dev->base_addr + 539 - FT1000_REG_MAG_DPDATAL); 540 - } 541 - } 542 - spin_unlock_irqrestore(&info-> 543 - dpram_lock, 544 - flags); 545 - break; 546 - 547 - case REQUEST_VERSION_INFO: 548 - word_length = 549 - pFileHdr5->version_data_size; 550 - put_request_value(dev, word_length); 551 - pUsFile = 552 - (u16 *) ((long)pFileStart + 553 - pFileHdr5-> 554 - version_data_offset); 555 - /* Provide mutual exclusive access while reading ASIC registers. */ 556 - spin_lock_irqsave(&info->dpram_lock, 557 - flags); 558 - /* 559 - * Position ASIC DPRAM auto-increment pointer. 560 - */ 561 - outw(DWNLD_MAG_PS_HDR_LOC, 562 - dev->base_addr + 563 - FT1000_REG_DPRAM_ADDR); 564 - if (word_length & 0x01) 565 - word_length++; 566 - word_length = word_length / 2; 567 - 568 - for (; word_length > 0; word_length--) { /* In words */ 569 - templong = 570 - ntohs(*pUsFile++); 571 - temp = 572 - ntohs(*pUsFile++); 573 - templong |= 574 - (temp << 16); 575 - outl(templong, 576 - dev->base_addr + 577 - FT1000_REG_MAG_DPDATAL); 578 - } 579 - spin_unlock_irqrestore(&info-> 580 - dpram_lock, 581 - flags); 582 - break; 583 - 584 - case REQUEST_CODE_BY_VERSION: 585 - bGoodVersion = false; 586 - requested_version = 587 - get_request_value(dev); 588 - pDspImageInfoV6 = 589 - (struct dsp_image_info *) ((long) 590 - pFileStart 591 - + 592 - sizeof 593 - (struct dsp_file_hdr)); 594 - for (imageN = 0; 595 - imageN < 596 - pFileHdr5->nDspImages; 597 - imageN++) { 598 - temp = (u16) 599 - (pDspImageInfoV6-> 600 - version); 601 - templong = temp; 602 - temp = (u16) 603 - (pDspImageInfoV6-> 604 - version >> 16); 605 - templong |= 606 - (temp << 16); 607 - if (templong == 608 - requested_version) { 609 - bGoodVersion = 610 - true; 611 - pUsFile = 612 - (u16 613 - *) ((long) 614 - pFileStart 615 - + 616 - pDspImageInfoV6-> 617 - begin_offset); 618 - pUcFile = 619 - (u8 620 - *) ((long) 621 - pFileStart 622 - + 623 - pDspImageInfoV6-> 624 - begin_offset); 625 - pCodeEnd = 626 - (u8 627 - *) ((long) 628 - pFileStart 629 - + 630 - pDspImageInfoV6-> 631 - end_offset); 632 - run_address = 633 - pDspImageInfoV6-> 634 - run_address; 635 - run_size = 636 - pDspImageInfoV6-> 637 - image_size; 638 - image_chksum = 639 - (u32) 640 - pDspImageInfoV6-> 641 - checksum; 642 - netdev_dbg(dev, 643 - "ft1000_dnld: image_chksum = 0x%8x\n", 644 - (unsigned 645 - int) 646 - image_chksum); 647 - break; 648 - } 649 - pDspImageInfoV6++; 650 - } 651 - if (!bGoodVersion) { 652 - /* 653 - * Error, beyond boot code range. 654 - */ 655 - Status = FAILURE; 656 - break; 657 - } 658 - break; 659 - 660 - default: 661 - Status = FAILURE; 662 - break; 663 - } 664 - put_handshake(dev, HANDSHAKE_RESPONSE); 665 - } else { 666 - Status = FAILURE; 667 - } 668 - 669 - break; 670 - 671 - case STATE_DONE_DWNLD: 672 - if (((unsigned long)(pUcFile) - (unsigned long) pFileStart) >= 673 - (unsigned long)FileLength) { 674 - uiState = STATE_DONE_FILE; 675 - break; 676 - } 677 - 678 - pHdr = (struct pseudo_hdr *)pUsFile; 679 - 680 - if (pHdr->portdest == 0x80 /* DspOAM */ 681 - && (pHdr->portsrc == 0x00 /* Driver */ 682 - || pHdr->portsrc == 0x10 /* FMM */)) { 683 - uiState = STATE_SECTION_PROV; 684 - } else { 685 - netdev_dbg(dev, 686 - "Download error: Bad Port IDs in Pseudo Record\n"); 687 - netdev_dbg(dev, "\t Port Source = 0x%2.2x\n", 688 - pHdr->portsrc); 689 - netdev_dbg(dev, "\t Port Destination = 0x%2.2x\n", 690 - pHdr->portdest); 691 - Status = FAILURE; 692 - } 693 - 694 - break; 695 - 696 - case STATE_SECTION_PROV: 697 - 698 - pHdr = (struct pseudo_hdr *)pUcFile; 699 - 700 - if (pHdr->checksum == hdr_checksum(pHdr)) { 701 - if (pHdr->portdest != 0x80 /* Dsp OAM */) { 702 - uiState = STATE_DONE_PROV; 703 - break; 704 - } 705 - usHdrLength = ntohs(pHdr->length); /* Byte length for PROV records */ 706 - 707 - /* Get buffer for provisioning data */ 708 - pbuffer = 709 - kmalloc(usHdrLength + sizeof(struct pseudo_hdr), 710 - GFP_ATOMIC); 711 - if (pbuffer) { 712 - memcpy(pbuffer, pUcFile, 713 - (u32) (usHdrLength + 714 - sizeof(struct pseudo_hdr))); 715 - /* link provisioning data */ 716 - pprov_record = 717 - kmalloc(sizeof(struct prov_record), 718 - GFP_ATOMIC); 719 - if (pprov_record) { 720 - pprov_record->pprov_data = 721 - pbuffer; 722 - list_add_tail(&pprov_record-> 723 - list, 724 - &info->prov_list); 725 - /* Move to next entry if available */ 726 - pUcFile = 727 - (u8 *)((unsigned long) pUcFile + 728 - (unsigned long) ((usHdrLength + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr)); 729 - if ((unsigned long) (pUcFile) - 730 - (unsigned long) (pFileStart) >= 731 - (unsigned long)FileLength) { 732 - uiState = 733 - STATE_DONE_FILE; 734 - } 735 - } else { 736 - kfree(pbuffer); 737 - Status = FAILURE; 738 - } 739 - } else { 740 - Status = FAILURE; 741 - } 742 - } else { 743 - /* Checksum did not compute */ 744 - Status = FAILURE; 745 - } 746 - 747 - break; 748 - 749 - case STATE_DONE_PROV: 750 - uiState = STATE_DONE_FILE; 751 - break; 752 - 753 - default: 754 - Status = FAILURE; 755 - break; 756 - } /* End Switch */ 757 - 758 - } /* End while */ 759 - 760 - return Status; 761 - 762 - }
-2068
drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c
··· 1 - /*--------------------------------------------------------------------------- 2 - FT1000 driver for Flarion Flash OFDM NIC Device 3 - 4 - Copyright (C) 2002 Flarion Technologies, All rights reserved. 5 - Copyright (C) 2006 Patrik Ostrihon, All rights reserved. 6 - Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved. 7 - 8 - This program is free software; you can redistribute it and/or modify it 9 - under the terms of the GNU General Public License as published by the Free 10 - Software Foundation; either version 2 of the License, or (at your option) any 11 - later version. This program is distributed in the hope that it will be useful, 12 - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13 - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 - more details. You should have received a copy of the GNU General Public 15 - License along with this program; if not, write to the 16 - Free Software Foundation, Inc., 59 Temple Place - 17 - Suite 330, Boston, MA 02111-1307, USA. 18 - -------------------------------------------------------------------------*/ 19 - 20 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 21 - 22 - #include <linux/kernel.h> 23 - #include <linux/module.h> 24 - #include <linux/sched.h> 25 - #include <linux/ptrace.h> 26 - #include <linux/slab.h> 27 - #include <linux/string.h> 28 - #include <linux/timer.h> 29 - #include <linux/interrupt.h> 30 - #include <linux/in.h> 31 - #include <linux/io.h> 32 - #include <linux/bitops.h> 33 - 34 - #include <linux/netdevice.h> 35 - #include <linux/etherdevice.h> 36 - #include <linux/skbuff.h> 37 - #include <linux/if_arp.h> 38 - #include <linux/ioport.h> 39 - #include <linux/wait.h> 40 - #include <linux/vmalloc.h> 41 - 42 - #include <linux/firmware.h> 43 - #include <linux/ethtool.h> 44 - 45 - #include <pcmcia/cistpl.h> 46 - #include <pcmcia/cisreg.h> 47 - #include <pcmcia/ds.h> 48 - 49 - #include <linux/delay.h> 50 - #include "ft1000.h" 51 - 52 - static const struct firmware *fw_entry; 53 - 54 - static void ft1000_hbchk(u_long data); 55 - static struct timer_list poll_timer = { 56 - .function = ft1000_hbchk 57 - }; 58 - 59 - static u16 cmdbuffer[1024]; 60 - static u8 tempbuffer[1600]; 61 - static u8 ft1000_card_present; 62 - static u8 flarion_ft1000_cnt; 63 - 64 - static irqreturn_t ft1000_interrupt(int irq, void *dev_id); 65 - static void ft1000_enable_interrupts(struct net_device *dev); 66 - static void ft1000_disable_interrupts(struct net_device *dev); 67 - 68 - /* new kernel */ 69 - MODULE_AUTHOR(""); 70 - MODULE_DESCRIPTION("Support for Flarion Flash OFDM NIC Device. Support for PCMCIA when used with ft1000_cs."); 71 - MODULE_LICENSE("GPL"); 72 - MODULE_SUPPORTED_DEVICE("FT1000"); 73 - 74 - #define MAX_RCV_LOOP 100 75 - 76 - /*--------------------------------------------------------------------------- 77 - 78 - Function: ft1000_read_fifo_len 79 - Description: This function will read the ASIC Uplink FIFO status register 80 - which will return the number of bytes remaining in the Uplink FIFO. 81 - Sixteen bytes are subtracted to make sure that the ASIC does not 82 - reach its threshold. 83 - Input: 84 - dev - network device structure 85 - Output: 86 - value - number of bytes available in the ASIC Uplink FIFO. 87 - 88 - -------------------------------------------------------------------------*/ 89 - static inline u16 ft1000_read_fifo_len(struct net_device *dev) 90 - { 91 - struct ft1000_info *info = netdev_priv(dev); 92 - 93 - if (info->AsicID == ELECTRABUZZ_ID) 94 - return (ft1000_read_reg(dev, FT1000_REG_UFIFO_STAT) - 16); 95 - else 96 - return (ft1000_read_reg(dev, FT1000_REG_MAG_UFSR) - 16); 97 - } 98 - 99 - /*--------------------------------------------------------------------------- 100 - 101 - Function: ft1000_read_dpram 102 - Description: This function will read the specific area of dpram 103 - (Electrabuzz ASIC only) 104 - Input: 105 - dev - device structure 106 - offset - index of dpram 107 - Output: 108 - value - value of dpram 109 - 110 - -------------------------------------------------------------------------*/ 111 - u16 ft1000_read_dpram(struct net_device *dev, int offset) 112 - { 113 - struct ft1000_info *info = netdev_priv(dev); 114 - unsigned long flags; 115 - u16 data; 116 - 117 - /* Provide mutual exclusive access while reading ASIC registers. */ 118 - spin_lock_irqsave(&info->dpram_lock, flags); 119 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 120 - data = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 121 - spin_unlock_irqrestore(&info->dpram_lock, flags); 122 - 123 - return data; 124 - } 125 - 126 - /*--------------------------------------------------------------------------- 127 - 128 - Function: ft1000_write_dpram 129 - Description: This function will write to a specific area of dpram 130 - (Electrabuzz ASIC only) 131 - Input: 132 - dev - device structure 133 - offset - index of dpram 134 - value - value to write 135 - Output: 136 - none. 137 - 138 - -------------------------------------------------------------------------*/ 139 - static inline void ft1000_write_dpram(struct net_device *dev, 140 - int offset, u16 value) 141 - { 142 - struct ft1000_info *info = netdev_priv(dev); 143 - unsigned long flags; 144 - 145 - /* Provide mutual exclusive access while reading ASIC registers. */ 146 - spin_lock_irqsave(&info->dpram_lock, flags); 147 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 148 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, value); 149 - spin_unlock_irqrestore(&info->dpram_lock, flags); 150 - } 151 - 152 - /*--------------------------------------------------------------------------- 153 - 154 - Function: ft1000_read_dpram_mag_16 155 - Description: This function will read the specific area of dpram 156 - (Magnemite ASIC only) 157 - Input: 158 - dev - device structure 159 - offset - index of dpram 160 - Output: 161 - value - value of dpram 162 - 163 - -------------------------------------------------------------------------*/ 164 - u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index) 165 - { 166 - struct ft1000_info *info = netdev_priv(dev); 167 - unsigned long flags; 168 - u16 data; 169 - 170 - /* Provide mutual exclusive access while reading ASIC registers. */ 171 - spin_lock_irqsave(&info->dpram_lock, flags); 172 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 173 - /* check if we want to read upper or lower 32-bit word */ 174 - if (Index) 175 - data = ft1000_read_reg(dev, FT1000_REG_MAG_DPDATAL); 176 - else 177 - data = ft1000_read_reg(dev, FT1000_REG_MAG_DPDATAH); 178 - 179 - spin_unlock_irqrestore(&info->dpram_lock, flags); 180 - 181 - return data; 182 - } 183 - 184 - /*--------------------------------------------------------------------------- 185 - 186 - Function: ft1000_write_dpram_mag_16 187 - Description: This function will write to a specific area of dpram 188 - (Magnemite ASIC only) 189 - Input: 190 - dev - device structure 191 - offset - index of dpram 192 - value - value to write 193 - Output: 194 - none. 195 - 196 - -------------------------------------------------------------------------*/ 197 - static inline void ft1000_write_dpram_mag_16(struct net_device *dev, 198 - int offset, u16 value, int Index) 199 - { 200 - struct ft1000_info *info = netdev_priv(dev); 201 - unsigned long flags; 202 - 203 - /* Provide mutual exclusive access while reading ASIC registers. */ 204 - spin_lock_irqsave(&info->dpram_lock, flags); 205 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 206 - if (Index) 207 - ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAL, value); 208 - else 209 - ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAH, value); 210 - 211 - spin_unlock_irqrestore(&info->dpram_lock, flags); 212 - } 213 - 214 - /*--------------------------------------------------------------------------- 215 - 216 - Function: ft1000_read_dpram_mag_32 217 - Description: This function will read the specific area of dpram 218 - (Magnemite ASIC only) 219 - Input: 220 - dev - device structure 221 - offset - index of dpram 222 - Output: 223 - value - value of dpram 224 - 225 - -------------------------------------------------------------------------*/ 226 - u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset) 227 - { 228 - struct ft1000_info *info = netdev_priv(dev); 229 - unsigned long flags; 230 - u32 data; 231 - 232 - /* Provide mutual exclusive access while reading ASIC registers. */ 233 - spin_lock_irqsave(&info->dpram_lock, flags); 234 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 235 - data = inl(dev->base_addr + FT1000_REG_MAG_DPDATAL); 236 - spin_unlock_irqrestore(&info->dpram_lock, flags); 237 - 238 - return data; 239 - } 240 - 241 - /*--------------------------------------------------------------------------- 242 - 243 - Function: ft1000_write_dpram_mag_32 244 - Description: This function will write to a specific area of dpram 245 - (Magnemite ASIC only) 246 - Input: 247 - dev - device structure 248 - offset - index of dpram 249 - value - value to write 250 - Output: 251 - none. 252 - 253 - -------------------------------------------------------------------------*/ 254 - void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value) 255 - { 256 - struct ft1000_info *info = netdev_priv(dev); 257 - unsigned long flags; 258 - 259 - /* Provide mutual exclusive access while reading ASIC registers. */ 260 - spin_lock_irqsave(&info->dpram_lock, flags); 261 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, offset); 262 - outl(value, dev->base_addr + FT1000_REG_MAG_DPDATAL); 263 - spin_unlock_irqrestore(&info->dpram_lock, flags); 264 - } 265 - 266 - /*--------------------------------------------------------------------------- 267 - 268 - Function: ft1000_enable_interrupts 269 - Description: This function will enable interrupts base on the current 270 - interrupt mask. 271 - Input: 272 - dev - device structure 273 - Output: 274 - None. 275 - 276 - -------------------------------------------------------------------------*/ 277 - static void ft1000_enable_interrupts(struct net_device *dev) 278 - { 279 - u16 tempword; 280 - 281 - ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, ISR_DEFAULT_MASK); 282 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); 283 - pr_debug("current interrupt enable mask = 0x%x\n", tempword); 284 - } 285 - 286 - /*--------------------------------------------------------------------------- 287 - 288 - Function: ft1000_disable_interrupts 289 - Description: This function will disable all interrupts. 290 - Input: 291 - dev - device structure 292 - Output: 293 - None. 294 - 295 - -------------------------------------------------------------------------*/ 296 - static void ft1000_disable_interrupts(struct net_device *dev) 297 - { 298 - u16 tempword; 299 - 300 - ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, ISR_MASK_ALL); 301 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); 302 - pr_debug("current interrupt enable mask = 0x%x\n", tempword); 303 - } 304 - 305 - /*--------------------------------------------------------------------------- 306 - Function: ft1000_read_dsp_timer 307 - Description: This function reads the DSP timer and stores its value in the 308 - DSP_TIME field of the ft1000_info struct passed as argument 309 - Input: 310 - dev - device structure 311 - info - ft1000_info structure 312 - Output: 313 - None. 314 - 315 - -------------------------------------------------------------------------*/ 316 - static void ft1000_read_dsp_timer(struct net_device *dev, 317 - struct ft1000_info *info) 318 - { 319 - if (info->AsicID == ELECTRABUZZ_ID) { 320 - info->DSP_TIME[0] = ft1000_read_dpram(dev, FT1000_DSP_TIMER0); 321 - info->DSP_TIME[1] = ft1000_read_dpram(dev, FT1000_DSP_TIMER1); 322 - info->DSP_TIME[2] = ft1000_read_dpram(dev, FT1000_DSP_TIMER2); 323 - info->DSP_TIME[3] = ft1000_read_dpram(dev, FT1000_DSP_TIMER3); 324 - } else { 325 - info->DSP_TIME[0] = 326 - ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER0, 327 - FT1000_MAG_DSP_TIMER0_INDX); 328 - info->DSP_TIME[1] = 329 - ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER1, 330 - FT1000_MAG_DSP_TIMER1_INDX); 331 - info->DSP_TIME[2] = 332 - ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER2, 333 - FT1000_MAG_DSP_TIMER2_INDX); 334 - info->DSP_TIME[3] = 335 - ft1000_read_dpram_mag_16(dev, FT1000_MAG_DSP_TIMER3, 336 - FT1000_MAG_DSP_TIMER3_INDX); 337 - } 338 - } 339 - 340 - /*--------------------------------------------------------------------------- 341 - 342 - Function: ft1000_reset_asic 343 - Description: This function will call the Card Service function to reset the 344 - ASIC. 345 - Input: 346 - dev - device structure 347 - Output: 348 - none 349 - 350 - -------------------------------------------------------------------------*/ 351 - static void ft1000_reset_asic(struct net_device *dev) 352 - { 353 - struct ft1000_info *info = netdev_priv(dev); 354 - struct ft1000_pcmcia *pcmcia = info->priv; 355 - u16 tempword; 356 - 357 - (*info->ft1000_reset) (pcmcia->link); 358 - 359 - /* 360 - * Let's use the register provided by the Magnemite ASIC to reset the 361 - * ASIC and DSP. 362 - */ 363 - if (info->AsicID == MAGNEMITE_ID) { 364 - ft1000_write_reg(dev, FT1000_REG_RESET, 365 - DSP_RESET_BIT | ASIC_RESET_BIT); 366 - } 367 - mdelay(1); 368 - if (info->AsicID == ELECTRABUZZ_ID) { 369 - /* set watermark to -1 in order to not generate an interrupt */ 370 - ft1000_write_reg(dev, FT1000_REG_WATERMARK, 0xffff); 371 - } else { 372 - /* set watermark to -1 in order to not generate an interrupt */ 373 - ft1000_write_reg(dev, FT1000_REG_MAG_WATERMARK, 0xffff); 374 - } 375 - /* clear interrupts */ 376 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); 377 - pr_debug("interrupt status register = 0x%x\n", tempword); 378 - ft1000_write_reg(dev, FT1000_REG_SUP_ISR, tempword); 379 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); 380 - pr_debug("interrupt status register = 0x%x\n", tempword); 381 - 382 - } 383 - 384 - /*--------------------------------------------------------------------------- 385 - 386 - Function: ft1000_reset_card 387 - Description: This function will reset the card 388 - Input: 389 - dev - device structure 390 - Output: 391 - status - false (card reset fail) 392 - true (card reset successful) 393 - 394 - -------------------------------------------------------------------------*/ 395 - static int ft1000_reset_card(struct net_device *dev) 396 - { 397 - struct ft1000_info *info = netdev_priv(dev); 398 - u16 tempword; 399 - int i; 400 - unsigned long flags; 401 - struct prov_record *ptr; 402 - struct prov_record *tmp; 403 - 404 - info->CardReady = 0; 405 - info->ProgConStat = 0; 406 - info->squeseqnum = 0; 407 - ft1000_disable_interrupts(dev); 408 - 409 - /* del_timer(&poll_timer); */ 410 - 411 - /* Make sure we free any memory reserve for provisioning */ 412 - list_for_each_entry_safe(ptr, tmp, &info->prov_list, list) { 413 - pr_debug("deleting provisioning record\n"); 414 - list_del(&ptr->list); 415 - kfree(ptr->pprov_data); 416 - kfree(ptr); 417 - } 418 - 419 - if (info->AsicID == ELECTRABUZZ_ID) { 420 - pr_debug("resetting DSP\n"); 421 - ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); 422 - } else { 423 - pr_debug("resetting ASIC and DSP\n"); 424 - ft1000_write_reg(dev, FT1000_REG_RESET, 425 - DSP_RESET_BIT | ASIC_RESET_BIT); 426 - } 427 - 428 - /* Copy DSP session record into info block if this is not a coldstart */ 429 - if (ft1000_card_present == 1) { 430 - spin_lock_irqsave(&info->dpram_lock, flags); 431 - if (info->AsicID == ELECTRABUZZ_ID) { 432 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 433 - FT1000_DPRAM_RX_BASE); 434 - for (i = 0; i < MAX_DSP_SESS_REC; i++) { 435 - info->DSPSess.Rec[i] = 436 - ft1000_read_reg(dev, 437 - FT1000_REG_DPRAM_DATA); 438 - } 439 - } else { 440 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 441 - FT1000_DPRAM_MAG_RX_BASE); 442 - for (i = 0; i < MAX_DSP_SESS_REC / 2; i++) { 443 - info->DSPSess.MagRec[i] = 444 - inl(dev->base_addr 445 - + FT1000_REG_MAG_DPDATA); 446 - } 447 - } 448 - spin_unlock_irqrestore(&info->dpram_lock, flags); 449 - } 450 - 451 - pr_debug("resetting ASIC\n"); 452 - mdelay(10); 453 - /* reset ASIC */ 454 - ft1000_reset_asic(dev); 455 - 456 - pr_debug("downloading dsp image\n"); 457 - 458 - if (info->AsicID == MAGNEMITE_ID) { 459 - /* Put dsp in reset and take ASIC out of reset */ 460 - pr_debug("Put DSP in reset and take ASIC out of reset\n"); 461 - ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); 462 - 463 - /* Setting MAGNEMITE ASIC to big endian mode */ 464 - ft1000_write_reg(dev, FT1000_REG_SUP_CTRL, HOST_INTF_BE); 465 - /* Download bootloader */ 466 - card_bootload(dev); 467 - 468 - /* Take DSP out of reset */ 469 - ft1000_write_reg(dev, FT1000_REG_RESET, 0); 470 - /* FLARION_DSP_ACTIVE; */ 471 - mdelay(10); 472 - pr_debug("Take DSP out of reset\n"); 473 - 474 - /* 475 - * Wait for 0xfefe indicating dsp ready before starting 476 - * download 477 - */ 478 - for (i = 0; i < 50; i++) { 479 - tempword = ft1000_read_dpram_mag_16(dev, 480 - FT1000_MAG_DPRAM_FEFE, 481 - FT1000_MAG_DPRAM_FEFE_INDX); 482 - if (tempword == 0xfefe) 483 - break; 484 - mdelay(20); 485 - } 486 - 487 - if (i == 50) { 488 - pr_debug("No FEFE detected from DSP\n"); 489 - return false; 490 - } 491 - 492 - } else { 493 - /* Take DSP out of reset */ 494 - ft1000_write_reg(dev, FT1000_REG_RESET, ~DSP_RESET_BIT); 495 - mdelay(10); 496 - } 497 - 498 - if (card_download(dev, fw_entry->data, fw_entry->size)) { 499 - pr_debug("card download unsuccessful\n"); 500 - return false; 501 - } 502 - pr_debug("card download successful\n"); 503 - 504 - mdelay(10); 505 - 506 - if (info->AsicID == ELECTRABUZZ_ID) { 507 - /* 508 - * Need to initialize the FIFO length counter to zero in order 509 - * to sync up with the DSP 510 - */ 511 - info->fifo_cnt = 0; 512 - ft1000_write_dpram(dev, FT1000_FIFO_LEN, info->fifo_cnt); 513 - /* Initialize DSP heartbeat area to ho */ 514 - ft1000_write_dpram(dev, FT1000_HI_HO, ho); 515 - tempword = ft1000_read_dpram(dev, FT1000_HI_HO); 516 - pr_debug("hi_ho value = 0x%x\n", tempword); 517 - } else { 518 - /* Initialize DSP heartbeat area to ho */ 519 - ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, ho_mag, 520 - FT1000_MAG_HI_HO_INDX); 521 - tempword = 522 - ft1000_read_dpram_mag_16(dev, FT1000_MAG_HI_HO, 523 - FT1000_MAG_HI_HO_INDX); 524 - pr_debug("hi_ho value = 0x%x\n", tempword); 525 - } 526 - 527 - info->CardReady = 1; 528 - ft1000_enable_interrupts(dev); 529 - 530 - /* Schedule heartbeat process to run every 2 seconds */ 531 - /* poll_timer.expires = jiffies + (2*HZ); */ 532 - /* poll_timer.data = (u_long)dev; */ 533 - /* add_timer(&poll_timer); */ 534 - 535 - return true; 536 - 537 - } 538 - 539 - /*--------------------------------------------------------------------------- 540 - 541 - Function: ft1000_chkcard 542 - Description: This function will check if the device is presently available on 543 - the system. 544 - Input: 545 - dev - device structure 546 - Output: 547 - status - false (device is not present) 548 - true (device is present) 549 - 550 - -------------------------------------------------------------------------*/ 551 - static int ft1000_chkcard(struct net_device *dev) 552 - { 553 - u16 tempword; 554 - 555 - /* 556 - * Mask register is used to check for device presence since it is never 557 - * set to zero. 558 - */ 559 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); 560 - if (tempword == 0) { 561 - pr_debug("IMASK = 0 Card not detected\n"); 562 - return false; 563 - } 564 - /* 565 - * The system will return the value of 0xffff for the version register 566 - * if the device is not present. 567 - */ 568 - tempword = ft1000_read_reg(dev, FT1000_REG_ASIC_ID); 569 - if (tempword == 0xffff) { 570 - pr_debug("Version = 0xffff Card not detected\n"); 571 - return false; 572 - } 573 - return true; 574 - } 575 - 576 - 577 - /*--------------------------------------------------------------------------- 578 - 579 - Function: ft1000_hbchk 580 - Description: This function will perform the heart beat check of the DSP as 581 - well as the ASIC. 582 - Input: 583 - dev - device structure 584 - Output: 585 - none 586 - 587 - -------------------------------------------------------------------------*/ 588 - static void ft1000_hbchk(u_long data) 589 - { 590 - struct net_device *dev = (struct net_device *)data; 591 - 592 - struct ft1000_info *info; 593 - u16 tempword; 594 - 595 - info = netdev_priv(dev); 596 - 597 - if (info->CardReady == 1) { 598 - /* Perform dsp heartbeat check */ 599 - if (info->AsicID == ELECTRABUZZ_ID) { 600 - tempword = ft1000_read_dpram(dev, FT1000_HI_HO); 601 - } else { 602 - tempword = 603 - ntohs(ft1000_read_dpram_mag_16 604 - (dev, FT1000_MAG_HI_HO, 605 - FT1000_MAG_HI_HO_INDX)); 606 - } 607 - pr_debug("hi_ho value = 0x%x\n", tempword); 608 - /* Let's perform another check if ho is not detected */ 609 - if (tempword != ho) { 610 - if (info->AsicID == ELECTRABUZZ_ID) 611 - tempword = ft1000_read_dpram(dev, FT1000_HI_HO); 612 - else 613 - tempword = ntohs(ft1000_read_dpram_mag_16(dev, 614 - FT1000_MAG_HI_HO, 615 - FT1000_MAG_HI_HO_INDX)); 616 - } 617 - if (tempword != ho) { 618 - pr_info("heartbeat failed - no ho detected\n"); 619 - ft1000_read_dsp_timer(dev, info); 620 - info->DrvErrNum = DSP_HB_INFO; 621 - if (ft1000_reset_card(dev) == 0) { 622 - pr_info("Hardware Failure Detected - PC Card disabled\n"); 623 - info->ProgConStat = 0xff; 624 - return; 625 - } 626 - /* Schedule this module to run every 2 seconds */ 627 - poll_timer.expires = jiffies + (2*HZ); 628 - poll_timer.data = (u_long)dev; 629 - add_timer(&poll_timer); 630 - return; 631 - } 632 - 633 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 634 - /* Let's check doorbell again if fail */ 635 - if (tempword & FT1000_DB_HB) 636 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 637 - 638 - if (tempword & FT1000_DB_HB) { 639 - pr_info("heartbeat doorbell not clear by firmware\n"); 640 - ft1000_read_dsp_timer(dev, info); 641 - info->DrvErrNum = DSP_HB_INFO; 642 - if (ft1000_reset_card(dev) == 0) { 643 - pr_info("Hardware Failure Detected - PC Card disabled\n"); 644 - info->ProgConStat = 0xff; 645 - return; 646 - } 647 - /* Schedule this module to run every 2 seconds */ 648 - poll_timer.expires = jiffies + (2*HZ); 649 - poll_timer.data = (u_long)dev; 650 - add_timer(&poll_timer); 651 - return; 652 - } 653 - /* 654 - * Set dedicated area to hi and ring appropriate doorbell 655 - * according to hi/ho heartbeat protocol 656 - */ 657 - if (info->AsicID == ELECTRABUZZ_ID) { 658 - ft1000_write_dpram(dev, FT1000_HI_HO, hi); 659 - } else { 660 - ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, hi_mag, 661 - FT1000_MAG_HI_HO_INDX); 662 - } 663 - 664 - if (info->AsicID == ELECTRABUZZ_ID) { 665 - tempword = ft1000_read_dpram(dev, FT1000_HI_HO); 666 - } else { 667 - tempword = 668 - ntohs(ft1000_read_dpram_mag_16 669 - (dev, FT1000_MAG_HI_HO, 670 - FT1000_MAG_HI_HO_INDX)); 671 - } 672 - /* Let's write hi again if fail */ 673 - if (tempword != hi) { 674 - if (info->AsicID == ELECTRABUZZ_ID) 675 - ft1000_write_dpram(dev, FT1000_HI_HO, hi); 676 - else 677 - ft1000_write_dpram_mag_16(dev, FT1000_MAG_HI_HO, 678 - hi_mag, FT1000_MAG_HI_HO_INDX); 679 - 680 - if (info->AsicID == ELECTRABUZZ_ID) 681 - tempword = ft1000_read_dpram(dev, FT1000_HI_HO); 682 - else 683 - tempword = ntohs(ft1000_read_dpram_mag_16(dev, 684 - FT1000_MAG_HI_HO, 685 - FT1000_MAG_HI_HO_INDX)); 686 - } 687 - 688 - if (tempword != hi) { 689 - pr_info("heartbeat failed - cannot write hi into DPRAM\n"); 690 - ft1000_read_dsp_timer(dev, info); 691 - info->DrvErrNum = DSP_HB_INFO; 692 - if (ft1000_reset_card(dev) == 0) { 693 - pr_info("Hardware Failure Detected - PC Card disabled\n"); 694 - info->ProgConStat = 0xff; 695 - return; 696 - } 697 - /* Schedule this module to run every 2 seconds */ 698 - poll_timer.expires = jiffies + (2*HZ); 699 - poll_timer.data = (u_long)dev; 700 - add_timer(&poll_timer); 701 - return; 702 - } 703 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_HB); 704 - 705 - } 706 - 707 - /* Schedule this module to run every 2 seconds */ 708 - poll_timer.expires = jiffies + (2 * HZ); 709 - poll_timer.data = (u_long)dev; 710 - add_timer(&poll_timer); 711 - } 712 - 713 - /*--------------------------------------------------------------------------- 714 - 715 - Function: ft1000_send_cmd 716 - Description: 717 - Input: 718 - Output: 719 - 720 - -------------------------------------------------------------------------*/ 721 - static void ft1000_send_cmd(struct net_device *dev, u16 *ptempbuffer, int size, 722 - u16 qtype) 723 - { 724 - struct ft1000_info *info = netdev_priv(dev); 725 - int i; 726 - u16 tempword; 727 - unsigned long flags; 728 - 729 - size += sizeof(struct pseudo_hdr); 730 - /* check for odd byte and increment to 16-bit word align value */ 731 - if ((size & 0x0001)) 732 - size++; 733 - pr_debug("total length = %d\n", size); 734 - pr_debug("length = %d\n", ntohs(*ptempbuffer)); 735 - /* 736 - * put message into slow queue area 737 - * All messages are in the form total_len + pseudo header + message body 738 - */ 739 - spin_lock_irqsave(&info->dpram_lock, flags); 740 - 741 - /* Make sure SLOWQ doorbell is clear */ 742 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 743 - i = 0; 744 - while (tempword & FT1000_DB_DPRAM_TX) { 745 - mdelay(10); 746 - i++; 747 - if (i == 10) { 748 - spin_unlock_irqrestore(&info->dpram_lock, flags); 749 - return; 750 - } 751 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 752 - } 753 - 754 - if (info->AsicID == ELECTRABUZZ_ID) { 755 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 756 - FT1000_DPRAM_TX_BASE); 757 - /* Write total length to dpram */ 758 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); 759 - /* Write pseudo header and messgae body */ 760 - for (i = 0; i < (size >> 1); i++) { 761 - pr_debug("data %d = 0x%x\n", i, *ptempbuffer); 762 - tempword = htons(*ptempbuffer++); 763 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, tempword); 764 - } 765 - } else { 766 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 767 - FT1000_DPRAM_MAG_TX_BASE); 768 - /* Write total length to dpram */ 769 - ft1000_write_reg(dev, FT1000_REG_MAG_DPDATAH, htons(size)); 770 - /* Write pseudo header and messgae body */ 771 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 772 - FT1000_DPRAM_MAG_TX_BASE + 1); 773 - for (i = 0; i < (size >> 2); i++) { 774 - pr_debug("data = 0x%x\n", *ptempbuffer); 775 - outw(*ptempbuffer++, 776 - dev->base_addr + FT1000_REG_MAG_DPDATAL); 777 - pr_debug("data = 0x%x\n", *ptempbuffer); 778 - outw(*ptempbuffer++, 779 - dev->base_addr + FT1000_REG_MAG_DPDATAH); 780 - } 781 - pr_debug("data = 0x%x\n", *ptempbuffer); 782 - outw(*ptempbuffer++, dev->base_addr + FT1000_REG_MAG_DPDATAL); 783 - pr_debug("data = 0x%x\n", *ptempbuffer); 784 - outw(*ptempbuffer++, dev->base_addr + FT1000_REG_MAG_DPDATAH); 785 - } 786 - spin_unlock_irqrestore(&info->dpram_lock, flags); 787 - 788 - /* ring doorbell to notify DSP that we have a message ready */ 789 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_DPRAM_TX); 790 - } 791 - 792 - /*--------------------------------------------------------------------------- 793 - 794 - Function: ft1000_receive_cmd 795 - Description: This function will read a message from the dpram area. 796 - Input: 797 - dev - network device structure 798 - pbuffer - caller supply address to buffer 799 - pnxtph - pointer to next pseudo header 800 - Output: 801 - Status = 0 (unsuccessful) 802 - = 1 (successful) 803 - 804 - -------------------------------------------------------------------------*/ 805 - static bool ft1000_receive_cmd(struct net_device *dev, u16 *pbuffer, 806 - int maxsz, u16 *pnxtph) 807 - { 808 - struct ft1000_info *info = netdev_priv(dev); 809 - u16 size; 810 - u16 *ppseudohdr; 811 - int i; 812 - u16 tempword; 813 - unsigned long flags; 814 - 815 - if (info->AsicID == ELECTRABUZZ_ID) { 816 - size = ft1000_read_dpram(dev, *pnxtph) 817 - + sizeof(struct pseudo_hdr); 818 - } else { 819 - size = ntohs(ft1000_read_dpram_mag_16(dev, FT1000_MAG_PH_LEN, 820 - FT1000_MAG_PH_LEN_INDX)) 821 - + sizeof(struct pseudo_hdr); 822 - } 823 - if (size > maxsz) { 824 - pr_debug("Invalid command length = %d\n", size); 825 - return false; 826 - } 827 - ppseudohdr = (u16 *)pbuffer; 828 - spin_lock_irqsave(&info->dpram_lock, flags); 829 - if (info->AsicID == ELECTRABUZZ_ID) { 830 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 831 - FT1000_DPRAM_RX_BASE + 2); 832 - for (i = 0; i <= (size >> 1); i++) { 833 - tempword = 834 - ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 835 - *pbuffer++ = ntohs(tempword); 836 - } 837 - } else { 838 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 839 - FT1000_DPRAM_MAG_RX_BASE); 840 - *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAH); 841 - pr_debug("received data = 0x%x\n", *pbuffer); 842 - pbuffer++; 843 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 844 - FT1000_DPRAM_MAG_RX_BASE + 1); 845 - for (i = 0; i <= (size >> 2); i++) { 846 - *pbuffer = 847 - inw(dev->base_addr + 848 - FT1000_REG_MAG_DPDATAL); 849 - pbuffer++; 850 - *pbuffer = 851 - inw(dev->base_addr + 852 - FT1000_REG_MAG_DPDATAH); 853 - pbuffer++; 854 - } 855 - /* copy odd aligned word */ 856 - *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAL); 857 - pr_debug("received data = 0x%x\n", *pbuffer); 858 - pbuffer++; 859 - *pbuffer = inw(dev->base_addr + FT1000_REG_MAG_DPDATAH); 860 - pr_debug("received data = 0x%x\n", *pbuffer); 861 - pbuffer++; 862 - } 863 - if (size & 0x0001) { 864 - /* copy odd byte from fifo */ 865 - tempword = ft1000_read_reg(dev, FT1000_REG_DPRAM_DATA); 866 - *pbuffer = ntohs(tempword); 867 - } 868 - spin_unlock_irqrestore(&info->dpram_lock, flags); 869 - 870 - /* 871 - * Check if pseudo header checksum is good 872 - * Calculate pseudo header checksum 873 - */ 874 - tempword = *ppseudohdr++; 875 - for (i = 1; i < 7; i++) 876 - tempword ^= *ppseudohdr++; 877 - if (tempword != *ppseudohdr) { 878 - pr_debug("Pseudo header checksum mismatch\n"); 879 - /* Drop this message */ 880 - return false; 881 - } 882 - return true; 883 - } 884 - 885 - /*--------------------------------------------------------------------------- 886 - 887 - Function: ft1000_proc_drvmsg 888 - Description: This function will process the various driver messages. 889 - Input: 890 - dev - device structure 891 - pnxtph - pointer to next pseudo header 892 - Output: 893 - none 894 - 895 - -------------------------------------------------------------------------*/ 896 - static void ft1000_proc_drvmsg(struct net_device *dev) 897 - { 898 - struct ft1000_info *info = netdev_priv(dev); 899 - u16 msgtype; 900 - u16 tempword; 901 - struct media_msg *pmediamsg; 902 - struct dsp_init_msg *pdspinitmsg; 903 - struct drv_msg *pdrvmsg; 904 - u16 len; 905 - u16 i; 906 - struct prov_record *ptr; 907 - struct pseudo_hdr *ppseudo_hdr; 908 - u16 *pmsg; 909 - struct timeval tv; 910 - union { 911 - u8 byte[2]; 912 - u16 wrd; 913 - } convert; 914 - 915 - if (info->AsicID == ELECTRABUZZ_ID) 916 - tempword = FT1000_DPRAM_RX_BASE+2; 917 - else 918 - tempword = FT1000_DPRAM_MAG_RX_BASE; 919 - 920 - if (ft1000_receive_cmd(dev, &cmdbuffer[0], MAX_CMD_SQSIZE, &tempword)) { 921 - 922 - /* 923 - * Get the message type which is total_len + PSEUDO header 924 - * + msgtype + message body 925 - */ 926 - pdrvmsg = (struct drv_msg *)&cmdbuffer[0]; 927 - msgtype = ntohs(pdrvmsg->type); 928 - pr_debug("Command message type = 0x%x\n", msgtype); 929 - switch (msgtype) { 930 - case DSP_PROVISION: 931 - pr_debug("Got a provisioning request message from DSP\n"); 932 - mdelay(25); 933 - while (list_empty(&info->prov_list) == 0) { 934 - pr_debug("Sending a provisioning message\n"); 935 - /* Make sure SLOWQ doorbell is clear */ 936 - tempword = ft1000_read_reg(dev, 937 - FT1000_REG_DOORBELL); 938 - i = 0; 939 - while (tempword & FT1000_DB_DPRAM_TX) { 940 - mdelay(5); 941 - i++; 942 - if (i == 10) 943 - break; 944 - } 945 - ptr = list_entry(info->prov_list.next, 946 - struct prov_record, list); 947 - len = *(u16 *)ptr->pprov_data; 948 - len = htons(len); 949 - 950 - pmsg = (u16 *)ptr->pprov_data; 951 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 952 - /* Insert slow queue sequence number */ 953 - ppseudo_hdr->seq_num = info->squeseqnum++; 954 - ppseudo_hdr->portsrc = 0; 955 - /* Calculate new checksum */ 956 - ppseudo_hdr->checksum = *pmsg++; 957 - pr_debug("checksum = 0x%x\n", 958 - ppseudo_hdr->checksum); 959 - for (i = 1; i < 7; i++) { 960 - ppseudo_hdr->checksum ^= *pmsg++; 961 - pr_debug("checksum = 0x%x\n", 962 - ppseudo_hdr->checksum); 963 - } 964 - 965 - ft1000_send_cmd(dev, (u16 *)ptr->pprov_data, 966 - len, SLOWQ_TYPE); 967 - list_del(&ptr->list); 968 - kfree(ptr->pprov_data); 969 - kfree(ptr); 970 - } 971 - /* 972 - * Indicate adapter is ready to take application 973 - * messages after all provisioning messages are sent 974 - */ 975 - info->CardReady = 1; 976 - break; 977 - case MEDIA_STATE: 978 - pmediamsg = (struct media_msg *)&cmdbuffer[0]; 979 - if (info->ProgConStat != 0xFF) { 980 - if (pmediamsg->state) { 981 - pr_debug("Media is up\n"); 982 - if (info->mediastate == 0) { 983 - netif_carrier_on(dev); 984 - netif_wake_queue(dev); 985 - info->mediastate = 1; 986 - do_gettimeofday(&tv); 987 - info->ConTm = tv.tv_sec; 988 - } 989 - } else { 990 - pr_debug("Media is down\n"); 991 - if (info->mediastate == 1) { 992 - info->mediastate = 0; 993 - netif_carrier_off(dev); 994 - netif_stop_queue(dev); 995 - info->ConTm = 0; 996 - } 997 - } 998 - } else { 999 - pr_debug("Media is down\n"); 1000 - if (info->mediastate == 1) { 1001 - info->mediastate = 0; 1002 - netif_carrier_off(dev); 1003 - netif_stop_queue(dev); 1004 - info->ConTm = 0; 1005 - } 1006 - } 1007 - break; 1008 - case DSP_INIT_MSG: 1009 - pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[0]; 1010 - memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); 1011 - pr_debug("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", 1012 - info->DspVer[0], info->DspVer[1], 1013 - info->DspVer[2], info->DspVer[3]); 1014 - memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, 1015 - HWSERNUMSZ); 1016 - memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); 1017 - memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); 1018 - dev->dev_addr[0] = info->eui64[0]; 1019 - dev->dev_addr[1] = info->eui64[1]; 1020 - dev->dev_addr[2] = info->eui64[2]; 1021 - dev->dev_addr[3] = info->eui64[5]; 1022 - dev->dev_addr[4] = info->eui64[6]; 1023 - dev->dev_addr[5] = info->eui64[7]; 1024 - 1025 - if (ntohs(pdspinitmsg->length) == 1026 - (sizeof(struct dsp_init_msg) - 20)) { 1027 - memcpy(info->ProductMode, 1028 - pdspinitmsg->ProductMode, MODESZ); 1029 - memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, 1030 - CALVERSZ); 1031 - memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, 1032 - CALDATESZ); 1033 - pr_debug("RFCalVer = 0x%2x 0x%2x\n", 1034 - info->RfCalVer[0], info->RfCalVer[1]); 1035 - } 1036 - 1037 - break; 1038 - case DSP_STORE_INFO: 1039 - pr_debug("Got DSP_STORE_INFO\n"); 1040 - tempword = ntohs(pdrvmsg->length); 1041 - info->DSPInfoBlklen = tempword; 1042 - if (tempword < (MAX_DSP_SESS_REC - 4)) { 1043 - pmsg = (u16 *)&pdrvmsg->data[0]; 1044 - for (i = 0; i < ((tempword + 1) / 2); i++) { 1045 - pr_debug("dsp info data = 0x%x\n", 1046 - *pmsg); 1047 - info->DSPInfoBlk[i + 10] = *pmsg++; 1048 - } 1049 - } 1050 - break; 1051 - case DSP_GET_INFO: 1052 - pr_debug("Got DSP_GET_INFO\n"); 1053 - /* 1054 - * copy dsp info block to dsp 1055 - * allow any outstanding ioctl to finish 1056 - */ 1057 - mdelay(10); 1058 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 1059 - if (tempword & FT1000_DB_DPRAM_TX) { 1060 - mdelay(10); 1061 - tempword = ft1000_read_reg(dev, 1062 - FT1000_REG_DOORBELL); 1063 - if (tempword & FT1000_DB_DPRAM_TX) 1064 - mdelay(10); 1065 - } 1066 - 1067 - if ((tempword & FT1000_DB_DPRAM_TX) == 0) { 1068 - /* 1069 - * Put message into Slow Queue 1070 - * Form Pseudo header 1071 - */ 1072 - pmsg = (u16 *)info->DSPInfoBlk; 1073 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 1074 - ppseudo_hdr->length = 1075 - htons(info->DSPInfoBlklen + 4); 1076 - ppseudo_hdr->source = 0x10; 1077 - ppseudo_hdr->destination = 0x20; 1078 - ppseudo_hdr->portdest = 0; 1079 - ppseudo_hdr->portsrc = 0; 1080 - ppseudo_hdr->sh_str_id = 0; 1081 - ppseudo_hdr->control = 0; 1082 - ppseudo_hdr->rsvd1 = 0; 1083 - ppseudo_hdr->rsvd2 = 0; 1084 - ppseudo_hdr->qos_class = 0; 1085 - /* Insert slow queue sequence number */ 1086 - ppseudo_hdr->seq_num = info->squeseqnum++; 1087 - /* Insert application id */ 1088 - ppseudo_hdr->portsrc = 0; 1089 - /* Calculate new checksum */ 1090 - ppseudo_hdr->checksum = *pmsg++; 1091 - for (i = 1; i < 7; i++) 1092 - ppseudo_hdr->checksum ^= *pmsg++; 1093 - 1094 - info->DSPInfoBlk[8] = 0x7200; 1095 - info->DSPInfoBlk[9] = 1096 - htons(info->DSPInfoBlklen); 1097 - ft1000_send_cmd(dev, info->DSPInfoBlk, 1098 - (u16)(info->DSPInfoBlklen+4), 1099 - 0); 1100 - } 1101 - 1102 - break; 1103 - case GET_DRV_ERR_RPT_MSG: 1104 - pr_debug("Got GET_DRV_ERR_RPT_MSG\n"); 1105 - /* 1106 - * copy driver error message to dsp 1107 - * allow any outstanding ioctl to finish 1108 - */ 1109 - mdelay(10); 1110 - tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 1111 - if (tempword & FT1000_DB_DPRAM_TX) { 1112 - mdelay(10); 1113 - tempword = ft1000_read_reg(dev, 1114 - FT1000_REG_DOORBELL); 1115 - if (tempword & FT1000_DB_DPRAM_TX) 1116 - mdelay(10); 1117 - } 1118 - 1119 - if ((tempword & FT1000_DB_DPRAM_TX) == 0) { 1120 - /* 1121 - * Put message into Slow Queue 1122 - * Form Pseudo header 1123 - */ 1124 - pmsg = (u16 *)&tempbuffer[0]; 1125 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 1126 - ppseudo_hdr->length = htons(0x0012); 1127 - ppseudo_hdr->source = 0x10; 1128 - ppseudo_hdr->destination = 0x20; 1129 - ppseudo_hdr->portdest = 0; 1130 - ppseudo_hdr->portsrc = 0; 1131 - ppseudo_hdr->sh_str_id = 0; 1132 - ppseudo_hdr->control = 0; 1133 - ppseudo_hdr->rsvd1 = 0; 1134 - ppseudo_hdr->rsvd2 = 0; 1135 - ppseudo_hdr->qos_class = 0; 1136 - /* Insert slow queue sequence number */ 1137 - ppseudo_hdr->seq_num = info->squeseqnum++; 1138 - /* Insert application id */ 1139 - ppseudo_hdr->portsrc = 0; 1140 - /* Calculate new checksum */ 1141 - ppseudo_hdr->checksum = *pmsg++; 1142 - for (i = 1; i < 7; i++) 1143 - ppseudo_hdr->checksum ^= *pmsg++; 1144 - 1145 - pmsg = (u16 *)&tempbuffer[16]; 1146 - *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); 1147 - *pmsg++ = htons(0x000e); 1148 - *pmsg++ = htons(info->DSP_TIME[0]); 1149 - *pmsg++ = htons(info->DSP_TIME[1]); 1150 - *pmsg++ = htons(info->DSP_TIME[2]); 1151 - *pmsg++ = htons(info->DSP_TIME[3]); 1152 - convert.byte[0] = info->DspVer[0]; 1153 - convert.byte[1] = info->DspVer[1]; 1154 - *pmsg++ = convert.wrd; 1155 - convert.byte[0] = info->DspVer[2]; 1156 - convert.byte[1] = info->DspVer[3]; 1157 - *pmsg++ = convert.wrd; 1158 - *pmsg++ = htons(info->DrvErrNum); 1159 - 1160 - ft1000_send_cmd(dev, (u16 *)&tempbuffer[0], 1161 - (u16)(0x0012), 0); 1162 - info->DrvErrNum = 0; 1163 - } 1164 - 1165 - break; 1166 - default: 1167 - break; 1168 - } 1169 - } 1170 - } 1171 - 1172 - /*--------------------------------------------------------------------------- 1173 - 1174 - Function: ft1000_parse_dpram_msg 1175 - Description: This function will parse the message received from the DSP 1176 - via the DPRAM interface. 1177 - Input: 1178 - dev - device structure 1179 - Output: 1180 - status - FAILURE 1181 - SUCCESS 1182 - 1183 - -------------------------------------------------------------------------*/ 1184 - static int ft1000_parse_dpram_msg(struct net_device *dev) 1185 - { 1186 - struct ft1000_info *info = netdev_priv(dev); 1187 - u16 doorbell; 1188 - u16 portid; 1189 - u16 nxtph; 1190 - u16 total_len; 1191 - int i = 0; 1192 - unsigned long flags; 1193 - 1194 - doorbell = ft1000_read_reg(dev, FT1000_REG_DOORBELL); 1195 - pr_debug("Doorbell = 0x%x\n", doorbell); 1196 - 1197 - if (doorbell & FT1000_ASIC_RESET_REQ) { 1198 - /* Copy DSP session record from info block */ 1199 - spin_lock_irqsave(&info->dpram_lock, flags); 1200 - if (info->AsicID == ELECTRABUZZ_ID) { 1201 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 1202 - FT1000_DPRAM_RX_BASE); 1203 - for (i = 0; i < MAX_DSP_SESS_REC; i++) { 1204 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, 1205 - info->DSPSess.Rec[i]); 1206 - } 1207 - } else { 1208 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, 1209 - FT1000_DPRAM_MAG_RX_BASE); 1210 - for (i = 0; i < MAX_DSP_SESS_REC / 2; i++) { 1211 - outl(info->DSPSess.MagRec[i], 1212 - dev->base_addr + FT1000_REG_MAG_DPDATA); 1213 - } 1214 - } 1215 - spin_unlock_irqrestore(&info->dpram_lock, flags); 1216 - 1217 - /* clear ASIC RESET request */ 1218 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, 1219 - FT1000_ASIC_RESET_REQ); 1220 - pr_debug("Got an ASIC RESET Request\n"); 1221 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, 1222 - FT1000_ASIC_RESET_DSP); 1223 - 1224 - if (info->AsicID == MAGNEMITE_ID) { 1225 - /* Setting MAGNEMITE ASIC to big endian mode */ 1226 - ft1000_write_reg(dev, FT1000_REG_SUP_CTRL, 1227 - HOST_INTF_BE); 1228 - } 1229 - } 1230 - 1231 - if (doorbell & FT1000_DSP_ASIC_RESET) { 1232 - pr_debug("Got a dsp ASIC reset message\n"); 1233 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, 1234 - FT1000_DSP_ASIC_RESET); 1235 - udelay(200); 1236 - return SUCCESS; 1237 - } 1238 - 1239 - if (doorbell & FT1000_DB_DPRAM_RX) { 1240 - pr_debug("Got a slow queue message\n"); 1241 - nxtph = FT1000_DPRAM_RX_BASE + 2; 1242 - if (info->AsicID == ELECTRABUZZ_ID) { 1243 - total_len = 1244 - ft1000_read_dpram(dev, FT1000_DPRAM_RX_BASE); 1245 - } else { 1246 - total_len = 1247 - ntohs(ft1000_read_dpram_mag_16 1248 - (dev, FT1000_MAG_TOTAL_LEN, 1249 - FT1000_MAG_TOTAL_LEN_INDX)); 1250 - } 1251 - pr_debug("total length = %d\n", total_len); 1252 - if ((total_len < MAX_CMD_SQSIZE) 1253 - && (total_len > sizeof(struct pseudo_hdr))) { 1254 - total_len += nxtph; 1255 - /* 1256 - * ft1000_read_reg will return a value that needs to be 1257 - * byteswap in order to get DSP_QID_OFFSET. 1258 - */ 1259 - if (info->AsicID == ELECTRABUZZ_ID) { 1260 - portid = (ft1000_read_dpram(dev, DSP_QID_OFFSET 1261 - + FT1000_DPRAM_RX_BASE + 2) 1262 - >> 8) & 0xff; 1263 - } else { 1264 - portid = 1265 - ft1000_read_dpram_mag_16 1266 - (dev, FT1000_MAG_PORT_ID, 1267 - FT1000_MAG_PORT_ID_INDX) & 0xff; 1268 - } 1269 - pr_debug("DSP_QID = 0x%x\n", portid); 1270 - 1271 - if (portid == DRIVERID) { 1272 - /* 1273 - * We are assumming one driver message from the 1274 - * DSP at a time. 1275 - */ 1276 - ft1000_proc_drvmsg(dev); 1277 - } 1278 - } 1279 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DB_DPRAM_RX); 1280 - } 1281 - 1282 - if (doorbell & FT1000_DB_COND_RESET) { 1283 - /* Reset ASIC and DSP */ 1284 - ft1000_read_dsp_timer(dev, info); 1285 - info->DrvErrNum = DSP_CONDRESET_INFO; 1286 - pr_debug("DSP conditional reset requested\n"); 1287 - ft1000_reset_card(dev); 1288 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, 1289 - FT1000_DB_COND_RESET); 1290 - } 1291 - /* let's clear any unexpected doorbells from DSP */ 1292 - doorbell = 1293 - doorbell & ~(FT1000_DB_DPRAM_RX | FT1000_ASIC_RESET_REQ | 1294 - FT1000_DB_COND_RESET | 0xff00); 1295 - if (doorbell) { 1296 - pr_debug("Clearing unexpected doorbell = 0x%x\n", doorbell); 1297 - ft1000_write_reg(dev, FT1000_REG_DOORBELL, doorbell); 1298 - } 1299 - 1300 - return SUCCESS; 1301 - 1302 - } 1303 - 1304 - /*--------------------------------------------------------------------------- 1305 - 1306 - Function: ft1000_flush_fifo 1307 - Description: This function will flush one packet from the downlink 1308 - FIFO. 1309 - Input: 1310 - dev - device structure 1311 - drv_err - driver error causing the flush fifo 1312 - Output: 1313 - None. 1314 - 1315 - -------------------------------------------------------------------------*/ 1316 - static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum) 1317 - { 1318 - struct ft1000_info *info = netdev_priv(dev); 1319 - struct ft1000_pcmcia *pcmcia = info->priv; 1320 - u16 i; 1321 - u32 templong; 1322 - u16 tempword; 1323 - 1324 - if (pcmcia->PktIntfErr > MAX_PH_ERR) { 1325 - ft1000_read_dsp_timer(dev, info); 1326 - info->DrvErrNum = DrvErrNum; 1327 - ft1000_reset_card(dev); 1328 - return; 1329 - } 1330 - /* Flush corrupted pkt from FIFO */ 1331 - i = 0; 1332 - do { 1333 - if (info->AsicID == ELECTRABUZZ_ID) { 1334 - tempword = 1335 - ft1000_read_reg(dev, FT1000_REG_DFIFO); 1336 - tempword = 1337 - ft1000_read_reg(dev, FT1000_REG_DFIFO_STAT); 1338 - } else { 1339 - templong = 1340 - inl(dev->base_addr + FT1000_REG_MAG_DFR); 1341 - tempword = 1342 - inw(dev->base_addr + FT1000_REG_MAG_DFSR); 1343 - } 1344 - i++; 1345 - /* 1346 - * This should never happen unless the ASIC is broken. 1347 - * We must reset to recover. 1348 - */ 1349 - if ((i > 2048) || (tempword == 0)) { 1350 - ft1000_read_dsp_timer(dev, info); 1351 - if (tempword == 0) { 1352 - /* 1353 - * Let's check if ASIC reads are still ok by 1354 - * reading the Mask register which is never zero 1355 - * at this point of the code. 1356 - */ 1357 - tempword = 1358 - inw(dev->base_addr + 1359 - FT1000_REG_SUP_IMASK); 1360 - if (tempword == 0) { 1361 - /* 1362 - * This indicates that we can not 1363 - * communicate with the ASIC 1364 - */ 1365 - info->DrvErrNum = FIFO_FLUSH_BADCNT; 1366 - } else { 1367 - /* 1368 - * Let's assume that we really flush 1369 - * the FIFO 1370 - */ 1371 - pcmcia->PktIntfErr++; 1372 - return; 1373 - } 1374 - } else { 1375 - info->DrvErrNum = FIFO_FLUSH_MAXLIMIT; 1376 - } 1377 - return; 1378 - } 1379 - tempword = inw(dev->base_addr + FT1000_REG_SUP_STAT); 1380 - } while ((tempword & 0x03) != 0x03); 1381 - if (info->AsicID == ELECTRABUZZ_ID) { 1382 - i++; 1383 - pr_debug("Flushing FIFO complete = %x\n", tempword); 1384 - /* Flush last word in FIFO. */ 1385 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1386 - /* Update FIFO counter for DSP */ 1387 - i = i * 2; 1388 - pr_debug("Flush Data byte count to dsp = %d\n", i); 1389 - info->fifo_cnt += i; 1390 - ft1000_write_dpram(dev, FT1000_FIFO_LEN, 1391 - info->fifo_cnt); 1392 - } else { 1393 - pr_debug("Flushing FIFO complete = %x\n", tempword); 1394 - /* Flush last word in FIFO */ 1395 - templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); 1396 - tempword = inw(dev->base_addr + FT1000_REG_SUP_STAT); 1397 - pr_debug("FT1000_REG_SUP_STAT = 0x%x\n", tempword); 1398 - tempword = inw(dev->base_addr + FT1000_REG_MAG_DFSR); 1399 - pr_debug("FT1000_REG_MAG_DFSR = 0x%x\n", tempword); 1400 - } 1401 - if (DrvErrNum) 1402 - pcmcia->PktIntfErr++; 1403 - } 1404 - 1405 - /*--------------------------------------------------------------------------- 1406 - 1407 - Function: ft1000_copy_up_pkt 1408 - Description: This function will pull Flarion packets out of the Downlink 1409 - FIFO and convert it to an ethernet packet. The ethernet packet will 1410 - then be deliver to the TCP/IP stack. 1411 - Input: 1412 - dev - device structure 1413 - Output: 1414 - status - FAILURE 1415 - SUCCESS 1416 - 1417 - -------------------------------------------------------------------------*/ 1418 - static int ft1000_copy_up_pkt(struct net_device *dev) 1419 - { 1420 - u16 tempword; 1421 - struct ft1000_info *info = netdev_priv(dev); 1422 - u16 len; 1423 - struct sk_buff *skb; 1424 - u16 i; 1425 - u8 *pbuffer = NULL; 1426 - u8 *ptemp = NULL; 1427 - u16 chksum; 1428 - u32 *ptemplong; 1429 - u32 templong; 1430 - 1431 - /* Read length */ 1432 - if (info->AsicID == ELECTRABUZZ_ID) { 1433 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1434 - len = tempword; 1435 - } else { 1436 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); 1437 - len = ntohs(tempword); 1438 - } 1439 - chksum = tempword; 1440 - pr_debug("Number of Bytes in FIFO = %d\n", len); 1441 - 1442 - if (len > ENET_MAX_SIZE) { 1443 - pr_debug("size of ethernet packet invalid\n"); 1444 - if (info->AsicID == MAGNEMITE_ID) { 1445 - /* Read High word to complete 32 bit access */ 1446 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1447 - } 1448 - ft1000_flush_fifo(dev, DSP_PKTLEN_INFO); 1449 - info->stats.rx_errors++; 1450 - return FAILURE; 1451 - } 1452 - 1453 - skb = dev_alloc_skb(len + 12 + 2); 1454 - 1455 - if (skb == NULL) { 1456 - /* Read High word to complete 32 bit access */ 1457 - if (info->AsicID == MAGNEMITE_ID) 1458 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1459 - 1460 - ft1000_flush_fifo(dev, 0); 1461 - info->stats.rx_errors++; 1462 - return FAILURE; 1463 - } 1464 - pbuffer = (u8 *)skb_put(skb, len + 12); 1465 - 1466 - /* Pseudo header */ 1467 - if (info->AsicID == ELECTRABUZZ_ID) { 1468 - for (i = 1; i < 7; i++) { 1469 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1470 - chksum ^= tempword; 1471 - } 1472 - /* read checksum value */ 1473 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1474 - } else { 1475 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1476 - pr_debug("Pseudo = 0x%x\n", tempword); 1477 - chksum ^= tempword; 1478 - 1479 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); 1480 - pr_debug("Pseudo = 0x%x\n", tempword); 1481 - chksum ^= tempword; 1482 - 1483 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1484 - pr_debug("Pseudo = 0x%x\n", tempword); 1485 - chksum ^= tempword; 1486 - 1487 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); 1488 - pr_debug("Pseudo = 0x%x\n", tempword); 1489 - chksum ^= tempword; 1490 - 1491 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1492 - pr_debug("Pseudo = 0x%x\n", tempword); 1493 - chksum ^= tempword; 1494 - 1495 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRL); 1496 - pr_debug("Pseudo = 0x%x\n", tempword); 1497 - chksum ^= tempword; 1498 - 1499 - /* read checksum value */ 1500 - tempword = ft1000_read_reg(dev, FT1000_REG_MAG_DFRH); 1501 - pr_debug("Pseudo = 0x%x\n", tempword); 1502 - } 1503 - 1504 - if (chksum != tempword) { 1505 - pr_debug("Packet checksum mismatch 0x%x 0x%x\n", 1506 - chksum, tempword); 1507 - ft1000_flush_fifo(dev, DSP_PKTPHCKSUM_INFO); 1508 - info->stats.rx_errors++; 1509 - kfree_skb(skb); 1510 - return FAILURE; 1511 - } 1512 - /* subtract the number of bytes read already */ 1513 - ptemp = pbuffer; 1514 - 1515 - /* fake MAC address */ 1516 - *pbuffer++ = dev->dev_addr[0]; 1517 - *pbuffer++ = dev->dev_addr[1]; 1518 - *pbuffer++ = dev->dev_addr[2]; 1519 - *pbuffer++ = dev->dev_addr[3]; 1520 - *pbuffer++ = dev->dev_addr[4]; 1521 - *pbuffer++ = dev->dev_addr[5]; 1522 - *pbuffer++ = 0x00; 1523 - *pbuffer++ = 0x07; 1524 - *pbuffer++ = 0x35; 1525 - *pbuffer++ = 0xff; 1526 - *pbuffer++ = 0xff; 1527 - *pbuffer++ = 0xfe; 1528 - 1529 - if (info->AsicID == ELECTRABUZZ_ID) { 1530 - for (i = 0; i < len / 2; i++) { 1531 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1532 - *pbuffer++ = (u8) (tempword >> 8); 1533 - *pbuffer++ = (u8)tempword; 1534 - if (ft1000_chkcard(dev) == false) { 1535 - kfree_skb(skb); 1536 - return FAILURE; 1537 - } 1538 - } 1539 - 1540 - /* Need to read one more word if odd byte */ 1541 - if (len & 0x0001) { 1542 - tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); 1543 - *pbuffer++ = (u8) (tempword >> 8); 1544 - } 1545 - } else { 1546 - ptemplong = (u32 *)pbuffer; 1547 - for (i = 0; i < len / 4; i++) { 1548 - templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); 1549 - pr_debug("Data = 0x%8x\n", templong); 1550 - *ptemplong++ = templong; 1551 - } 1552 - 1553 - /* Need to read one more word if odd align. */ 1554 - if (len & 0x0003) { 1555 - templong = inl(dev->base_addr + FT1000_REG_MAG_DFR); 1556 - pr_debug("Data = 0x%8x\n", templong); 1557 - *ptemplong++ = templong; 1558 - } 1559 - 1560 - } 1561 - 1562 - pr_debug("Data passed to Protocol layer:\n"); 1563 - for (i = 0; i < len + 12; i++) 1564 - pr_debug("Protocol Data: 0x%x\n", *ptemp++); 1565 - 1566 - skb->dev = dev; 1567 - skb->protocol = eth_type_trans(skb, dev); 1568 - skb->ip_summed = CHECKSUM_UNNECESSARY; 1569 - netif_rx(skb); 1570 - 1571 - info->stats.rx_packets++; 1572 - /* Add on 12 bytes for MAC address which was removed */ 1573 - info->stats.rx_bytes += (len + 12); 1574 - 1575 - if (info->AsicID == ELECTRABUZZ_ID) { 1576 - /* track how many bytes have been read from FIFO - round up to 1577 - * 16 bit word */ 1578 - tempword = len + 16; 1579 - if (tempword & 0x01) 1580 - tempword++; 1581 - info->fifo_cnt += tempword; 1582 - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, FT1000_FIFO_LEN); 1583 - ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, info->fifo_cnt); 1584 - } 1585 - 1586 - return SUCCESS; 1587 - } 1588 - 1589 - /*--------------------------------------------------------------------------- 1590 - 1591 - Function: ft1000_copy_down_pkt 1592 - Description: This function will take an ethernet packet and convert it to 1593 - a Flarion packet prior to sending it to the ASIC Downlink 1594 - FIFO. 1595 - Input: 1596 - dev - device structure 1597 - packet - address of ethernet packet 1598 - len - length of IP packet 1599 - Output: 1600 - status - FAILURE 1601 - SUCCESS 1602 - 1603 - -------------------------------------------------------------------------*/ 1604 - static int ft1000_copy_down_pkt(struct net_device *dev, u16 *packet, u16 len) 1605 - { 1606 - struct ft1000_info *info = netdev_priv(dev); 1607 - struct ft1000_pcmcia *pcmcia = info->priv; 1608 - union { 1609 - struct pseudo_hdr blk; 1610 - u16 buff[sizeof(struct pseudo_hdr) >> 1]; 1611 - u8 buffc[sizeof(struct pseudo_hdr)]; 1612 - } pseudo; 1613 - int i; 1614 - u32 *plong; 1615 - 1616 - /* Check if there is room on the FIFO */ 1617 - if (len > ft1000_read_fifo_len(dev)) { 1618 - udelay(10); 1619 - if (len > ft1000_read_fifo_len(dev)) 1620 - udelay(20); 1621 - if (len > ft1000_read_fifo_len(dev)) 1622 - udelay(20); 1623 - if (len > ft1000_read_fifo_len(dev)) 1624 - udelay(20); 1625 - if (len > ft1000_read_fifo_len(dev)) 1626 - udelay(20); 1627 - if (len > ft1000_read_fifo_len(dev)) 1628 - udelay(20); 1629 - if (len > ft1000_read_fifo_len(dev)) { 1630 - pr_debug("Transmit FIFO is full - pkt drop\n"); 1631 - info->stats.tx_errors++; 1632 - return SUCCESS; 1633 - } 1634 - } 1635 - /* Create pseudo header and send pseudo/ip to hardware */ 1636 - if (info->AsicID == ELECTRABUZZ_ID) 1637 - pseudo.blk.length = len; 1638 - else 1639 - pseudo.blk.length = ntohs(len); 1640 - 1641 - pseudo.blk.source = DSPID; /* Need to swap to get in correct 1642 - order */ 1643 - pseudo.blk.destination = HOSTID; 1644 - pseudo.blk.portdest = NETWORKID; /* Need to swap to get in 1645 - correct order */ 1646 - pseudo.blk.portsrc = DSPAIRID; 1647 - pseudo.blk.sh_str_id = 0; 1648 - pseudo.blk.control = 0; 1649 - pseudo.blk.rsvd1 = 0; 1650 - pseudo.blk.seq_num = 0; 1651 - pseudo.blk.rsvd2 = pcmcia->packetseqnum++; 1652 - pseudo.blk.qos_class = 0; 1653 - /* Calculate pseudo header checksum */ 1654 - pseudo.blk.checksum = pseudo.buff[0]; 1655 - for (i = 1; i < 7; i++) 1656 - pseudo.blk.checksum ^= pseudo.buff[i]; 1657 - 1658 - /* Production Mode */ 1659 - if (info->AsicID == ELECTRABUZZ_ID) { 1660 - /* copy first word to UFIFO_BEG reg */ 1661 - ft1000_write_reg(dev, FT1000_REG_UFIFO_BEG, pseudo.buff[0]); 1662 - pr_debug("data 0 BEG = 0x%04x\n", pseudo.buff[0]); 1663 - 1664 - /* copy subsequent words to UFIFO_MID reg */ 1665 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[1]); 1666 - pr_debug("data 1 MID = 0x%04x\n", pseudo.buff[1]); 1667 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[2]); 1668 - pr_debug("data 2 MID = 0x%04x\n", pseudo.buff[2]); 1669 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[3]); 1670 - pr_debug("data 3 MID = 0x%04x\n", pseudo.buff[3]); 1671 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[4]); 1672 - pr_debug("data 4 MID = 0x%04x\n", pseudo.buff[4]); 1673 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[5]); 1674 - pr_debug("data 5 MID = 0x%04x\n", pseudo.buff[5]); 1675 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[6]); 1676 - pr_debug("data 6 MID = 0x%04x\n", pseudo.buff[6]); 1677 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, pseudo.buff[7]); 1678 - pr_debug("data 7 MID = 0x%04x\n", pseudo.buff[7]); 1679 - 1680 - /* Write PPP type + IP Packet into Downlink FIFO */ 1681 - for (i = 0; i < (len >> 1) - 1; i++) { 1682 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, 1683 - htons(*packet)); 1684 - pr_debug("data %d MID = 0x%04x\n", 1685 - i + 8, htons(*packet)); 1686 - packet++; 1687 - } 1688 - 1689 - /* Check for odd byte */ 1690 - if (len & 0x0001) { 1691 - ft1000_write_reg(dev, FT1000_REG_UFIFO_MID, 1692 - htons(*packet)); 1693 - pr_debug("data MID = 0x%04x\n", htons(*packet)); 1694 - packet++; 1695 - ft1000_write_reg(dev, FT1000_REG_UFIFO_END, 1696 - htons(*packet)); 1697 - pr_debug("data %d MID = 0x%04x\n", 1698 - i + 8, htons(*packet)); 1699 - } else { 1700 - ft1000_write_reg(dev, FT1000_REG_UFIFO_END, 1701 - htons(*packet)); 1702 - pr_debug("data %d MID = 0x%04x\n", 1703 - i + 8, htons(*packet)); 1704 - } 1705 - } else { 1706 - outl(*(u32 *)&pseudo.buff[0], 1707 - dev->base_addr + FT1000_REG_MAG_UFDR); 1708 - pr_debug("Pseudo = 0x%8x\n", *(u32 *)&pseudo.buff[0]); 1709 - outl(*(u32 *)&pseudo.buff[2], 1710 - dev->base_addr + FT1000_REG_MAG_UFDR); 1711 - pr_debug("Pseudo = 0x%8x\n", *(u32 *)&pseudo.buff[2]); 1712 - outl(*(u32 *)&pseudo.buff[4], 1713 - dev->base_addr + FT1000_REG_MAG_UFDR); 1714 - pr_debug("Pseudo = 0x%8x\n", *(u32 *)&pseudo.buff[4]); 1715 - outl(*(u32 *)&pseudo.buff[6], 1716 - dev->base_addr + FT1000_REG_MAG_UFDR); 1717 - pr_debug("Pseudo = 0x%8x\n", *(u32 *)&pseudo.buff[6]); 1718 - 1719 - plong = (u32 *)packet; 1720 - /* Write PPP type + IP Packet into Downlink FIFO */ 1721 - for (i = 0; i < (len >> 2); i++) 1722 - outl(*plong++, dev->base_addr + FT1000_REG_MAG_UFDR); 1723 - 1724 - /* Check for odd alignment */ 1725 - if (len & 0x0003) { 1726 - pr_debug("data = 0x%8x\n", *plong); 1727 - outl(*plong++, dev->base_addr + FT1000_REG_MAG_UFDR); 1728 - } 1729 - outl(1, dev->base_addr + FT1000_REG_MAG_UFER); 1730 - } 1731 - 1732 - info->stats.tx_packets++; 1733 - /* Add 14 bytes for MAC address plus ethernet type */ 1734 - info->stats.tx_bytes += (len + 14); 1735 - return SUCCESS; 1736 - } 1737 - 1738 - static struct net_device_stats *ft1000_stats(struct net_device *dev) 1739 - { 1740 - struct ft1000_info *info = netdev_priv(dev); 1741 - 1742 - return &info->stats; 1743 - } 1744 - 1745 - static int ft1000_open(struct net_device *dev) 1746 - { 1747 - ft1000_reset_card(dev); 1748 - 1749 - /* schedule ft1000_hbchk to perform periodic heartbeat checks on DSP 1750 - * and ASIC */ 1751 - init_timer(&poll_timer); 1752 - poll_timer.expires = jiffies + (2 * HZ); 1753 - poll_timer.data = (u_long)dev; 1754 - add_timer(&poll_timer); 1755 - 1756 - return 0; 1757 - } 1758 - 1759 - static int ft1000_close(struct net_device *dev) 1760 - { 1761 - struct ft1000_info *info = netdev_priv(dev); 1762 - 1763 - info->CardReady = 0; 1764 - del_timer(&poll_timer); 1765 - 1766 - if (ft1000_card_present == 1) { 1767 - pr_debug("Media is down\n"); 1768 - netif_stop_queue(dev); 1769 - 1770 - ft1000_disable_interrupts(dev); 1771 - ft1000_write_reg(dev, FT1000_REG_RESET, DSP_RESET_BIT); 1772 - 1773 - /* reset ASIC */ 1774 - ft1000_reset_asic(dev); 1775 - } 1776 - return 0; 1777 - } 1778 - 1779 - static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) 1780 - { 1781 - struct ft1000_info *info = netdev_priv(dev); 1782 - u8 *pdata; 1783 - 1784 - if (skb == NULL) { 1785 - pr_debug("skb == NULL!!!\n"); 1786 - return 0; 1787 - } 1788 - 1789 - pr_debug("length of packet = %d\n", skb->len); 1790 - 1791 - pdata = (u8 *)skb->data; 1792 - 1793 - if (info->mediastate == 0) { 1794 - /* Drop packet is mediastate is down */ 1795 - pr_debug("mediastate is down\n"); 1796 - return SUCCESS; 1797 - } 1798 - 1799 - if ((skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE)) { 1800 - /* Drop packet which has invalid size */ 1801 - pr_debug("invalid ethernet length\n"); 1802 - return SUCCESS; 1803 - } 1804 - ft1000_copy_down_pkt(dev, (u16 *) (pdata + ENET_HEADER_SIZE - 2), 1805 - skb->len - ENET_HEADER_SIZE + 2); 1806 - 1807 - dev_kfree_skb(skb); 1808 - 1809 - return 0; 1810 - } 1811 - 1812 - static irqreturn_t ft1000_interrupt(int irq, void *dev_id) 1813 - { 1814 - struct net_device *dev = dev_id; 1815 - struct ft1000_info *info = netdev_priv(dev); 1816 - u16 tempword; 1817 - u16 inttype; 1818 - int cnt; 1819 - 1820 - if (info->CardReady == 0) { 1821 - ft1000_disable_interrupts(dev); 1822 - return IRQ_HANDLED; 1823 - } 1824 - 1825 - if (ft1000_chkcard(dev) == false) { 1826 - ft1000_disable_interrupts(dev); 1827 - return IRQ_HANDLED; 1828 - } 1829 - 1830 - ft1000_disable_interrupts(dev); 1831 - 1832 - /* Read interrupt type */ 1833 - inttype = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); 1834 - 1835 - /* Make sure we process all interrupt before leaving the ISR due to the 1836 - * edge trigger interrupt type */ 1837 - while (inttype) { 1838 - if (inttype & ISR_DOORBELL_PEND) 1839 - ft1000_parse_dpram_msg(dev); 1840 - 1841 - if (inttype & ISR_RCV) { 1842 - pr_debug("Data in FIFO\n"); 1843 - 1844 - cnt = 0; 1845 - do { 1846 - /* Check if we have packets in the Downlink 1847 - * FIFO */ 1848 - if (info->AsicID == ELECTRABUZZ_ID) { 1849 - tempword = ft1000_read_reg(dev, 1850 - FT1000_REG_DFIFO_STAT); 1851 - } else { 1852 - tempword = ft1000_read_reg(dev, 1853 - FT1000_REG_MAG_DFSR); 1854 - } 1855 - if (!(tempword & 0x1f)) 1856 - break; 1857 - ft1000_copy_up_pkt(dev); 1858 - cnt++; 1859 - } while (cnt < MAX_RCV_LOOP); 1860 - 1861 - } 1862 - /* clear interrupts */ 1863 - tempword = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); 1864 - pr_debug("interrupt status register = 0x%x\n", tempword); 1865 - ft1000_write_reg(dev, FT1000_REG_SUP_ISR, tempword); 1866 - 1867 - /* Read interrupt type */ 1868 - inttype = ft1000_read_reg(dev, FT1000_REG_SUP_ISR); 1869 - pr_debug("interrupt status register after clear = 0x%x\n", 1870 - inttype); 1871 - } 1872 - ft1000_enable_interrupts(dev); 1873 - return IRQ_HANDLED; 1874 - } 1875 - 1876 - void stop_ft1000_card(struct net_device *dev) 1877 - { 1878 - struct ft1000_info *info = netdev_priv(dev); 1879 - struct prov_record *ptr; 1880 - struct prov_record *tmp; 1881 - /* int cnt; */ 1882 - 1883 - info->CardReady = 0; 1884 - ft1000_card_present = 0; 1885 - netif_stop_queue(dev); 1886 - ft1000_disable_interrupts(dev); 1887 - 1888 - /* Make sure we free any memory reserve for provisioning */ 1889 - list_for_each_entry_safe(ptr, tmp, &info->prov_list, list) { 1890 - list_del(&ptr->list); 1891 - kfree(ptr->pprov_data); 1892 - kfree(ptr); 1893 - } 1894 - 1895 - kfree(info->priv); 1896 - 1897 - if (info->registered) { 1898 - unregister_netdev(dev); 1899 - info->registered = 0; 1900 - } 1901 - 1902 - free_irq(dev->irq, dev); 1903 - release_region(dev->base_addr, 256); 1904 - release_firmware(fw_entry); 1905 - flarion_ft1000_cnt--; 1906 - 1907 - } 1908 - 1909 - static void ft1000_get_drvinfo(struct net_device *dev, 1910 - struct ethtool_drvinfo *info) 1911 - { 1912 - struct ft1000_info *ft_info; 1913 - 1914 - ft_info = netdev_priv(dev); 1915 - 1916 - strlcpy(info->driver, "ft1000", sizeof(info->driver)); 1917 - snprintf(info->bus_info, sizeof(info->bus_info), "PCMCIA 0x%lx", 1918 - dev->base_addr); 1919 - snprintf(info->fw_version, sizeof(info->fw_version), "%d.%d.%d.%d", 1920 - ft_info->DspVer[0], ft_info->DspVer[1], ft_info->DspVer[2], 1921 - ft_info->DspVer[3]); 1922 - } 1923 - 1924 - static u32 ft1000_get_link(struct net_device *dev) 1925 - { 1926 - struct ft1000_info *info; 1927 - 1928 - info = netdev_priv(dev); 1929 - return info->mediastate; 1930 - } 1931 - 1932 - static const struct ethtool_ops ops = { 1933 - .get_drvinfo = ft1000_get_drvinfo, 1934 - .get_link = ft1000_get_link 1935 - }; 1936 - 1937 - struct net_device *init_ft1000_card(struct pcmcia_device *link, 1938 - void *ft1000_reset) 1939 - { 1940 - struct ft1000_info *info; 1941 - struct ft1000_pcmcia *pcmcia; 1942 - struct net_device *dev; 1943 - 1944 - static const struct net_device_ops ft1000ops = { 1945 - .ndo_open = &ft1000_open, 1946 - .ndo_stop = &ft1000_close, 1947 - .ndo_start_xmit = &ft1000_start_xmit, 1948 - .ndo_get_stats = &ft1000_stats, 1949 - }; 1950 - 1951 - pr_debug("irq = %d, port = 0x%04llx\n", 1952 - link->irq, (unsigned long long)link->resource[0]->start); 1953 - 1954 - flarion_ft1000_cnt++; 1955 - 1956 - if (flarion_ft1000_cnt > 1) { 1957 - flarion_ft1000_cnt--; 1958 - 1959 - dev_info(&link->dev, 1960 - "This driver can not support more than one instance\n"); 1961 - return NULL; 1962 - } 1963 - 1964 - dev = alloc_etherdev(sizeof(struct ft1000_info)); 1965 - if (!dev) { 1966 - dev_err(&link->dev, "Failed to allocate etherdev\n"); 1967 - return NULL; 1968 - } 1969 - 1970 - SET_NETDEV_DEV(dev, &link->dev); 1971 - info = netdev_priv(dev); 1972 - 1973 - memset(info, 0, sizeof(struct ft1000_info)); 1974 - 1975 - pr_debug("address of dev = 0x%p\n", dev); 1976 - pr_debug("address of dev info = 0x%p\n", info); 1977 - pr_debug("device name = %s\n", dev->name); 1978 - 1979 - memset(&info->stats, 0, sizeof(struct net_device_stats)); 1980 - 1981 - info->priv = kzalloc(sizeof(struct ft1000_pcmcia), GFP_KERNEL); 1982 - pcmcia = info->priv; 1983 - pcmcia->link = link; 1984 - 1985 - spin_lock_init(&info->dpram_lock); 1986 - info->DrvErrNum = 0; 1987 - info->registered = 1; 1988 - info->ft1000_reset = ft1000_reset; 1989 - info->mediastate = 0; 1990 - info->fifo_cnt = 0; 1991 - info->CardReady = 0; 1992 - info->DSP_TIME[0] = 0; 1993 - info->DSP_TIME[1] = 0; 1994 - info->DSP_TIME[2] = 0; 1995 - info->DSP_TIME[3] = 0; 1996 - flarion_ft1000_cnt = 0; 1997 - 1998 - INIT_LIST_HEAD(&info->prov_list); 1999 - 2000 - info->squeseqnum = 0; 2001 - 2002 - /* dev->hard_start_xmit = &ft1000_start_xmit; */ 2003 - /* dev->get_stats = &ft1000_stats; */ 2004 - /* dev->open = &ft1000_open; */ 2005 - /* dev->stop = &ft1000_close; */ 2006 - 2007 - dev->netdev_ops = &ft1000ops; 2008 - 2009 - pr_debug("device name = %s\n", dev->name); 2010 - 2011 - dev->irq = link->irq; 2012 - dev->base_addr = link->resource[0]->start; 2013 - if (pcmcia_get_mac_from_cis(link, dev)) { 2014 - netdev_err(dev, "Could not read mac address\n"); 2015 - goto err_dev; 2016 - } 2017 - 2018 - if (request_irq(dev->irq, ft1000_interrupt, IRQF_SHARED, dev->name, 2019 - dev)) { 2020 - netdev_err(dev, "Could not request_irq\n"); 2021 - goto err_dev; 2022 - } 2023 - 2024 - if (request_region(dev->base_addr, 256, dev->name) == NULL) { 2025 - netdev_err(dev, "Could not request_region\n"); 2026 - goto err_irq; 2027 - } 2028 - 2029 - if (register_netdev(dev)) { 2030 - pr_debug("Could not register netdev\n"); 2031 - goto err_reg; 2032 - } 2033 - 2034 - info->AsicID = ft1000_read_reg(dev, FT1000_REG_ASIC_ID); 2035 - if (info->AsicID == ELECTRABUZZ_ID) { 2036 - pr_debug("ELECTRABUZZ ASIC\n"); 2037 - if (request_firmware(&fw_entry, "ft1000.img", 2038 - &link->dev) != 0) { 2039 - pr_info("Could not open ft1000.img\n"); 2040 - goto err_unreg; 2041 - } 2042 - } else { 2043 - pr_debug("MAGNEMITE ASIC\n"); 2044 - if (request_firmware(&fw_entry, "ft2000.img", 2045 - &link->dev) != 0) { 2046 - pr_info("Could not open ft2000.img\n"); 2047 - goto err_unreg; 2048 - } 2049 - } 2050 - 2051 - ft1000_enable_interrupts(dev); 2052 - 2053 - ft1000_card_present = 1; 2054 - dev->ethtool_ops = &ops; 2055 - pr_info("%s: addr 0x%04lx irq %d, MAC addr %pM\n", 2056 - dev->name, dev->base_addr, dev->irq, dev->dev_addr); 2057 - return dev; 2058 - 2059 - err_unreg: 2060 - unregister_netdev(dev); 2061 - err_reg: 2062 - release_region(dev->base_addr, 256); 2063 - err_irq: 2064 - free_irq(dev->irq, dev); 2065 - err_dev: 2066 - free_netdev(dev); 2067 - return NULL; 2068 - }
-3
drivers/staging/ft1000/ft1000-usb/Makefile
··· 1 - obj-$(CONFIG_FT1000_USB) += ft1000.o 2 - 3 - ft1000-y := ft1000_debug.o ft1000_download.o ft1000_hw.o ft1000_usb.o
-789
drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
··· 1 - /* 2 - *--------------------------------------------------------------------------- 3 - * FT1000 driver for Flarion Flash OFDM NIC Device 4 - * 5 - * Copyright (C) 2006 Flarion Technologies, All rights reserved. 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms of the GNU General Public License as published by the Free 9 - * Software Foundation; either version 2 of the License, or (at your option) any 10 - * later version. This program is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 12 - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 - * more details. You should have received a copy of the GNU General Public 14 - * License along with this program; if not, write to the 15 - * Free Software Foundation, Inc., 59 Temple Place - 16 - * Suite 330, Boston, MA 02111-1307, USA. 17 - *--------------------------------------------------------------------------- 18 - * 19 - * File: ft1000_chdev.c 20 - * 21 - * Description: Custom character device dispatch routines. 22 - * 23 - * History: 24 - * 8/29/02 Whc Ported to Linux. 25 - * 6/05/06 Whc Porting to Linux 2.6.9 26 - * 27 - *--------------------------------------------------------------------------- 28 - */ 29 - 30 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 31 - 32 - #include <linux/module.h> 33 - #include <linux/kernel.h> 34 - #include <linux/sched.h> 35 - #include <linux/errno.h> 36 - #include <linux/poll.h> 37 - #include <linux/netdevice.h> 38 - #include <linux/delay.h> 39 - 40 - #include <linux/ioctl.h> 41 - #include <linux/debugfs.h> 42 - #include "ft1000_usb.h" 43 - 44 - static int ft1000_flarion_cnt; 45 - 46 - static int ft1000_open(struct inode *inode, struct file *file); 47 - static unsigned int ft1000_poll_dev(struct file *file, poll_table *wait); 48 - static long ft1000_ioctl(struct file *file, unsigned int command, 49 - unsigned long argument); 50 - static int ft1000_release(struct inode *inode, struct file *file); 51 - 52 - /* List to free receive command buffer pool */ 53 - struct list_head freercvpool; 54 - 55 - /* lock to arbitrate free buffer list for receive command data */ 56 - spinlock_t free_buff_lock; 57 - 58 - int numofmsgbuf; 59 - 60 - /* 61 - * Table of entry-point routines for char device 62 - */ 63 - static const struct file_operations ft1000fops = { 64 - .unlocked_ioctl = ft1000_ioctl, 65 - .poll = ft1000_poll_dev, 66 - .open = ft1000_open, 67 - .release = ft1000_release, 68 - .llseek = no_llseek, 69 - }; 70 - 71 - /* 72 - --------------------------------------------------------------------------- 73 - * Function: ft1000_get_buffer 74 - * 75 - * Parameters: 76 - * 77 - * Returns: 78 - * 79 - * Description: 80 - * 81 - * Notes: 82 - * 83 - *--------------------------------------------------------------------------- 84 - */ 85 - struct dpram_blk *ft1000_get_buffer(struct list_head *bufflist) 86 - { 87 - unsigned long flags; 88 - struct dpram_blk *ptr; 89 - 90 - spin_lock_irqsave(&free_buff_lock, flags); 91 - /* Check if buffer is available */ 92 - if (list_empty(bufflist)) { 93 - pr_debug("No more buffer - %d\n", numofmsgbuf); 94 - ptr = NULL; 95 - } else { 96 - numofmsgbuf--; 97 - ptr = list_entry(bufflist->next, struct dpram_blk, list); 98 - list_del(&ptr->list); 99 - /* pr_debug("number of free msg buffers = %d\n", numofmsgbuf); */ 100 - } 101 - spin_unlock_irqrestore(&free_buff_lock, flags); 102 - 103 - return ptr; 104 - } 105 - 106 - 107 - 108 - 109 - /* 110 - *--------------------------------------------------------------------------- 111 - * Function: ft1000_free_buffer 112 - * 113 - * Parameters: 114 - * 115 - * Returns: 116 - * 117 - * Description: 118 - * 119 - * Notes: 120 - * 121 - *--------------------------------------------------------------------------- 122 - */ 123 - void ft1000_free_buffer(struct dpram_blk *pdpram_blk, struct list_head *plist) 124 - { 125 - unsigned long flags; 126 - 127 - spin_lock_irqsave(&free_buff_lock, flags); 128 - /* Put memory back to list */ 129 - list_add_tail(&pdpram_blk->list, plist); 130 - numofmsgbuf++; 131 - /*pr_debug("number of free msg buffers = %d\n", numofmsgbuf); */ 132 - spin_unlock_irqrestore(&free_buff_lock, flags); 133 - } 134 - 135 - /* 136 - *--------------------------------------------------------------------------- 137 - * Function: ft1000_CreateDevice 138 - * 139 - * Parameters: dev - pointer to adapter object 140 - * 141 - * Returns: 0 if successful 142 - * 143 - * Description: Creates a private char device. 144 - * 145 - * Notes: Only called by init_module(). 146 - * 147 - *--------------------------------------------------------------------------- 148 - */ 149 - int ft1000_create_dev(struct ft1000_usb *dev) 150 - { 151 - int result; 152 - int i; 153 - struct dentry *dir, *file; 154 - struct ft1000_debug_dirs *tmp; 155 - 156 - /* make a new device name */ 157 - sprintf(dev->DeviceName, "%s%d", "FT1000_", dev->CardNumber); 158 - 159 - pr_debug("number of instance = %d\n", ft1000_flarion_cnt); 160 - pr_debug("DeviceCreated = %x\n", dev->DeviceCreated); 161 - 162 - if (dev->DeviceCreated) { 163 - pr_debug("\"%s\" already registered\n", dev->DeviceName); 164 - return -EIO; 165 - } 166 - 167 - 168 - /* register the device */ 169 - pr_debug("\"%s\" debugfs device registration\n", dev->DeviceName); 170 - 171 - tmp = kmalloc(sizeof(struct ft1000_debug_dirs), GFP_KERNEL); 172 - if (tmp == NULL) { 173 - result = -1; 174 - goto fail; 175 - } 176 - 177 - dir = debugfs_create_dir(dev->DeviceName, NULL); 178 - if (IS_ERR(dir)) { 179 - result = PTR_ERR(dir); 180 - goto debug_dir_fail; 181 - } 182 - 183 - file = debugfs_create_file("device", S_IRUGO | S_IWUSR, dir, 184 - dev, &ft1000fops); 185 - if (IS_ERR(file)) { 186 - result = PTR_ERR(file); 187 - goto debug_file_fail; 188 - } 189 - 190 - tmp->dent = dir; 191 - tmp->file = file; 192 - tmp->int_number = dev->CardNumber; 193 - list_add(&tmp->list, &dev->nodes.list); 194 - 195 - pr_debug("registered debugfs directory \"%s\"\n", dev->DeviceName); 196 - 197 - /* initialize application information */ 198 - dev->appcnt = 0; 199 - for (i = 0; i < MAX_NUM_APP; i++) { 200 - dev->app_info[i].nTxMsg = 0; 201 - dev->app_info[i].nRxMsg = 0; 202 - dev->app_info[i].nTxMsgReject = 0; 203 - dev->app_info[i].nRxMsgMiss = 0; 204 - dev->app_info[i].fileobject = NULL; 205 - dev->app_info[i].app_id = i+1; 206 - dev->app_info[i].DspBCMsgFlag = 0; 207 - dev->app_info[i].NumOfMsg = 0; 208 - init_waitqueue_head(&dev->app_info[i].wait_dpram_msg); 209 - INIT_LIST_HEAD(&dev->app_info[i].app_sqlist); 210 - } 211 - 212 - dev->DeviceCreated = TRUE; 213 - ft1000_flarion_cnt++; 214 - 215 - return 0; 216 - 217 - debug_file_fail: 218 - debugfs_remove(dir); 219 - debug_dir_fail: 220 - kfree(tmp); 221 - fail: 222 - return result; 223 - } 224 - 225 - /* 226 - *--------------------------------------------------------------------------- 227 - * Function: ft1000_DestroyDeviceDEBUG 228 - * 229 - * Parameters: dev - pointer to adapter object 230 - * 231 - * Description: Destroys a private char device. 232 - * 233 - * Notes: Only called by cleanup_module(). 234 - * 235 - *--------------------------------------------------------------------------- 236 - */ 237 - void ft1000_destroy_dev(struct net_device *netdev) 238 - { 239 - struct ft1000_info *info = netdev_priv(netdev); 240 - struct ft1000_usb *dev = info->priv; 241 - int i; 242 - struct dpram_blk *pdpram_blk; 243 - struct dpram_blk *ptr; 244 - struct list_head *pos, *q; 245 - struct ft1000_debug_dirs *dir; 246 - 247 - if (dev->DeviceCreated) { 248 - ft1000_flarion_cnt--; 249 - list_for_each_safe(pos, q, &dev->nodes.list) { 250 - dir = list_entry(pos, struct ft1000_debug_dirs, list); 251 - if (dir->int_number == dev->CardNumber) { 252 - debugfs_remove(dir->file); 253 - debugfs_remove(dir->dent); 254 - list_del(pos); 255 - kfree(dir); 256 - } 257 - } 258 - pr_debug("unregistered device \"%s\"\n", dev->DeviceName); 259 - 260 - /* Make sure we free any memory reserve for slow Queue */ 261 - for (i = 0; i < MAX_NUM_APP; i++) { 262 - while (list_empty(&dev->app_info[i].app_sqlist) == 0) { 263 - pdpram_blk = list_entry(dev->app_info[i].app_sqlist.next, 264 - struct dpram_blk, list); 265 - list_del(&pdpram_blk->list); 266 - ft1000_free_buffer(pdpram_blk, &freercvpool); 267 - 268 - } 269 - wake_up_interruptible(&dev->app_info[i].wait_dpram_msg); 270 - } 271 - 272 - /* Remove buffer allocated for receive command data */ 273 - if (ft1000_flarion_cnt == 0) { 274 - while (list_empty(&freercvpool) == 0) { 275 - ptr = list_entry(freercvpool.next, struct dpram_blk, list); 276 - list_del(&ptr->list); 277 - kfree(ptr->pbuffer); 278 - kfree(ptr); 279 - } 280 - } 281 - dev->DeviceCreated = FALSE; 282 - } 283 - 284 - 285 - } 286 - 287 - /* 288 - *--------------------------------------------------------------------------- 289 - * Function: ft1000_open 290 - * 291 - * Parameters: 292 - * 293 - * Description: 294 - * 295 - * Notes: 296 - * 297 - *--------------------------------------------------------------------------- 298 - */ 299 - static int ft1000_open(struct inode *inode, struct file *file) 300 - { 301 - struct ft1000_info *info; 302 - struct ft1000_usb *dev = (struct ft1000_usb *)inode->i_private; 303 - int i, num; 304 - 305 - num = MINOR(inode->i_rdev) & 0xf; 306 - pr_debug("minor number=%d\n", num); 307 - 308 - info = file->private_data = netdev_priv(dev->net); 309 - 310 - pr_debug("f_owner = %p number of application = %d\n", 311 - &file->f_owner, dev->appcnt); 312 - 313 - /* Check if maximum number of application exceeded */ 314 - if (dev->appcnt > MAX_NUM_APP) { 315 - pr_debug("Maximum number of application exceeded\n"); 316 - return -EACCES; 317 - } 318 - 319 - /* Search for available application info block */ 320 - for (i = 0; i < MAX_NUM_APP; i++) { 321 - if (dev->app_info[i].fileobject == NULL) 322 - break; 323 - } 324 - 325 - /* Fail due to lack of application info block */ 326 - if (i == MAX_NUM_APP) { 327 - pr_debug("Could not find an application info block\n"); 328 - return -EACCES; 329 - } 330 - 331 - dev->appcnt++; 332 - dev->app_info[i].fileobject = &file->f_owner; 333 - dev->app_info[i].nTxMsg = 0; 334 - dev->app_info[i].nRxMsg = 0; 335 - dev->app_info[i].nTxMsgReject = 0; 336 - dev->app_info[i].nRxMsgMiss = 0; 337 - 338 - nonseekable_open(inode, file); 339 - return 0; 340 - } 341 - 342 - 343 - /* 344 - *--------------------------------------------------------------------------- 345 - * Function: ft1000_poll_dev 346 - * 347 - * Parameters: 348 - * 349 - * Description: 350 - * 351 - * Notes: 352 - * 353 - *--------------------------------------------------------------------------- 354 - */ 355 - 356 - static unsigned int ft1000_poll_dev(struct file *file, poll_table *wait) 357 - { 358 - struct net_device *netdev = file->private_data; 359 - struct ft1000_info *info = netdev_priv(netdev); 360 - struct ft1000_usb *dev = info->priv; 361 - int i; 362 - 363 - if (ft1000_flarion_cnt == 0) { 364 - pr_debug("called with ft1000_flarion_cnt value zero\n"); 365 - return -EBADF; 366 - } 367 - 368 - /* Search for matching file object */ 369 - for (i = 0; i < MAX_NUM_APP; i++) { 370 - if (dev->app_info[i].fileobject == &file->f_owner) { 371 - /* pr_debug("Message is for AppId = %d\n", dev->app_info[i].app_id); */ 372 - break; 373 - } 374 - } 375 - 376 - /* Could not find application info block */ 377 - if (i == MAX_NUM_APP) { 378 - pr_debug("Could not find application info block\n"); 379 - return -EACCES; 380 - } 381 - 382 - if (list_empty(&dev->app_info[i].app_sqlist) == 0) { 383 - pr_debug("Message detected in slow queue\n"); 384 - return(POLLIN | POLLRDNORM | POLLPRI); 385 - } 386 - 387 - poll_wait(file, &dev->app_info[i].wait_dpram_msg, wait); 388 - /* pr_debug("Polling for data from DSP\n"); */ 389 - 390 - return 0; 391 - } 392 - 393 - /* 394 - *--------------------------------------------------------------------------- 395 - * Function: ft1000_ioctl 396 - * 397 - * Parameters: 398 - * 399 - * Description: 400 - * 401 - * Notes: 402 - * 403 - *--------------------------------------------------------------------------- 404 - */ 405 - static long ft1000_ioctl(struct file *file, unsigned int command, 406 - unsigned long argument) 407 - { 408 - void __user *argp = (void __user *)argument; 409 - struct ft1000_info *info; 410 - struct ft1000_usb *ft1000dev; 411 - int result = 0; 412 - int cmd; 413 - int i; 414 - u16 tempword; 415 - unsigned long flags; 416 - struct timeval tv; 417 - struct IOCTL_GET_VER get_ver_data; 418 - struct IOCTL_GET_DSP_STAT get_stat_data; 419 - u8 ConnectionMsg[] = { 420 - 0x00, 0x44, 0x10, 0x20, 0x80, 0x00, 0x00, 0x00, 421 - 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x93, 0x64, 422 - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 423 - 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x0a, 424 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 425 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 426 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 427 - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 428 - 0x00, 0x00, 0x02, 0x37, 0x00, 0x00, 0x00, 0x08, 429 - 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7f, 0x00, 430 - 0x00, 0x01, 0x00, 0x00 431 - }; 432 - 433 - unsigned short ledStat = 0; 434 - unsigned short conStat = 0; 435 - 436 - if (ft1000_flarion_cnt == 0) { 437 - pr_debug("called with ft1000_flarion_cnt of zero\n"); 438 - return -EBADF; 439 - } 440 - 441 - /* pr_debug("command = 0x%x argument = 0x%8x\n", command, (u32)argument); */ 442 - 443 - info = file->private_data; 444 - ft1000dev = info->priv; 445 - cmd = _IOC_NR(command); 446 - /* pr_debug("cmd = 0x%x\n", cmd); */ 447 - 448 - /* process the command */ 449 - switch (cmd) { 450 - case IOCTL_REGISTER_CMD: 451 - pr_debug("IOCTL_FT1000_REGISTER called\n"); 452 - result = get_user(tempword, (__u16 __user *)argp); 453 - if (result) { 454 - pr_debug("result = %d failed to get_user\n", result); 455 - break; 456 - } 457 - if (tempword == DSPBCMSGID) { 458 - /* Search for matching file object */ 459 - for (i = 0; i < MAX_NUM_APP; i++) { 460 - if (ft1000dev->app_info[i].fileobject == &file->f_owner) { 461 - ft1000dev->app_info[i].DspBCMsgFlag = 1; 462 - pr_debug("Registered for broadcast messages\n"); 463 - break; 464 - } 465 - } 466 - } 467 - break; 468 - 469 - case IOCTL_GET_VER_CMD: 470 - pr_debug("IOCTL_FT1000_GET_VER called\n"); 471 - 472 - get_ver_data.drv_ver = FT1000_DRV_VER; 473 - 474 - if (copy_to_user(argp, &get_ver_data, sizeof(get_ver_data))) { 475 - pr_debug("copy fault occurred\n"); 476 - result = -EFAULT; 477 - break; 478 - } 479 - 480 - pr_debug("driver version = 0x%x\n", 481 - (unsigned int)get_ver_data.drv_ver); 482 - 483 - break; 484 - case IOCTL_CONNECT: 485 - /* Connect Message */ 486 - pr_debug("IOCTL_FT1000_CONNECT\n"); 487 - ConnectionMsg[79] = 0xfc; 488 - result = card_send_command(ft1000dev, ConnectionMsg, 0x4c); 489 - 490 - break; 491 - case IOCTL_DISCONNECT: 492 - /* Disconnect Message */ 493 - pr_debug("IOCTL_FT1000_DISCONNECT\n"); 494 - ConnectionMsg[79] = 0xfd; 495 - result = card_send_command(ft1000dev, ConnectionMsg, 0x4c); 496 - break; 497 - case IOCTL_GET_DSP_STAT_CMD: 498 - /* pr_debug("IOCTL_FT1000_GET_DSP_STAT\n"); */ 499 - memset(&get_stat_data, 0, sizeof(get_stat_data)); 500 - memcpy(get_stat_data.DspVer, info->DspVer, DSPVERSZ); 501 - memcpy(get_stat_data.HwSerNum, info->HwSerNum, HWSERNUMSZ); 502 - memcpy(get_stat_data.Sku, info->Sku, SKUSZ); 503 - memcpy(get_stat_data.eui64, info->eui64, EUISZ); 504 - 505 - if (info->ProgConStat != 0xFF) { 506 - ft1000_read_dpram16(ft1000dev, FT1000_MAG_DSP_LED, 507 - (u8 *)&ledStat, FT1000_MAG_DSP_LED_INDX); 508 - get_stat_data.LedStat = ntohs(ledStat); 509 - pr_debug("LedStat = 0x%x\n", get_stat_data.LedStat); 510 - ft1000_read_dpram16(ft1000dev, FT1000_MAG_DSP_CON_STATE, 511 - (u8 *)&conStat, FT1000_MAG_DSP_CON_STATE_INDX); 512 - get_stat_data.ConStat = ntohs(conStat); 513 - pr_debug("ConStat = 0x%x\n", get_stat_data.ConStat); 514 - } else { 515 - get_stat_data.ConStat = 0x0f; 516 - } 517 - 518 - 519 - get_stat_data.nTxPkts = info->stats.tx_packets; 520 - get_stat_data.nRxPkts = info->stats.rx_packets; 521 - get_stat_data.nTxBytes = info->stats.tx_bytes; 522 - get_stat_data.nRxBytes = info->stats.rx_bytes; 523 - do_gettimeofday(&tv); 524 - get_stat_data.ConTm = (u32)(tv.tv_sec - info->ConTm); 525 - pr_debug("Connection Time = %d\n", (int)get_stat_data.ConTm); 526 - if (copy_to_user(argp, &get_stat_data, sizeof(get_stat_data))) { 527 - pr_debug("copy fault occurred\n"); 528 - result = -EFAULT; 529 - break; 530 - } 531 - pr_debug("GET_DSP_STAT succeed\n"); 532 - break; 533 - case IOCTL_SET_DPRAM_CMD: 534 - { 535 - struct IOCTL_DPRAM_BLK *dpram_data = NULL; 536 - /* struct IOCTL_DPRAM_COMMAND dpram_command; */ 537 - u16 qtype; 538 - u16 msgsz; 539 - struct pseudo_hdr *ppseudo_hdr; 540 - u16 *pmsg; 541 - u16 total_len; 542 - u16 app_index; 543 - u16 status; 544 - 545 - /* pr_debug("IOCTL_FT1000_SET_DPRAM called\n");*/ 546 - 547 - 548 - if (ft1000_flarion_cnt == 0) 549 - return -EBADF; 550 - 551 - if (ft1000dev->DrvMsgPend) 552 - return -ENOTTY; 553 - 554 - if (ft1000dev->fProvComplete == 0) 555 - return -EACCES; 556 - 557 - ft1000dev->fAppMsgPend = true; 558 - 559 - if (info->CardReady) { 560 - 561 - /* pr_debug("try to SET_DPRAM\n"); */ 562 - 563 - /* Get the length field to see how many bytes to copy */ 564 - result = get_user(msgsz, (__u16 __user *)argp); 565 - if (result) 566 - break; 567 - msgsz = ntohs(msgsz); 568 - /* pr_debug("length of message = %d\n", msgsz); */ 569 - 570 - if (msgsz > MAX_CMD_SQSIZE) { 571 - pr_debug("bad message length = %d\n", msgsz); 572 - result = -EINVAL; 573 - break; 574 - } 575 - 576 - result = -ENOMEM; 577 - dpram_data = kmalloc(msgsz + 2, GFP_KERNEL); 578 - if (!dpram_data) 579 - break; 580 - 581 - if (copy_from_user(dpram_data, argp, msgsz+2)) { 582 - pr_debug("copy fault occurred\n"); 583 - result = -EFAULT; 584 - } else { 585 - /* Check if this message came from a registered application */ 586 - for (i = 0; i < MAX_NUM_APP; i++) { 587 - if (ft1000dev->app_info[i].fileobject == &file->f_owner) 588 - break; 589 - } 590 - if (i == MAX_NUM_APP) { 591 - pr_debug("No matching application fileobject\n"); 592 - result = -EINVAL; 593 - kfree(dpram_data); 594 - break; 595 - } 596 - app_index = i; 597 - 598 - /* Check message qtype type which is the lower byte within qos_class */ 599 - qtype = ntohs(dpram_data->pseudohdr.qos_class) & 0xff; 600 - /* pr_debug("qtype = %d\n", qtype); */ 601 - if (!qtype) { 602 - /* Put message into Slow Queue */ 603 - /* Only put a message into the DPRAM if msg doorbell is available */ 604 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); 605 - /* pr_debug("READ REGISTER tempword=%x\n", tempword); */ 606 - if (tempword & FT1000_DB_DPRAM_TX) { 607 - /* Suspend for 2ms and try again due to DSP doorbell busy */ 608 - mdelay(2); 609 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); 610 - if (tempword & FT1000_DB_DPRAM_TX) { 611 - /* Suspend for 1ms and try again due to DSP doorbell busy */ 612 - mdelay(1); 613 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); 614 - if (tempword & FT1000_DB_DPRAM_TX) { 615 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); 616 - if (tempword & FT1000_DB_DPRAM_TX) { 617 - /* Suspend for 3ms and try again due to DSP doorbell busy */ 618 - mdelay(3); 619 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_DOORBELL); 620 - if (tempword & FT1000_DB_DPRAM_TX) { 621 - pr_debug("Doorbell not available\n"); 622 - result = -ENOTTY; 623 - kfree(dpram_data); 624 - break; 625 - } 626 - } 627 - } 628 - } 629 - } 630 - 631 - /*pr_debug("finished reading register\n"); */ 632 - 633 - /* Make sure we are within the limits of the slow queue memory limitation */ 634 - if ((msgsz < MAX_CMD_SQSIZE) && (msgsz > PSEUDOSZ)) { 635 - /* Need to put sequence number plus new checksum for message */ 636 - pmsg = (u16 *)&dpram_data->pseudohdr; 637 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 638 - total_len = msgsz+2; 639 - if (total_len & 0x1) 640 - total_len++; 641 - 642 - /* Insert slow queue sequence number */ 643 - ppseudo_hdr->seq_num = info->squeseqnum++; 644 - ppseudo_hdr->portsrc = ft1000dev->app_info[app_index].app_id; 645 - /* Calculate new checksum */ 646 - ppseudo_hdr->checksum = *pmsg++; 647 - /* pr_debug("checksum = 0x%x\n", ppseudo_hdr->checksum); */ 648 - for (i = 1; i < 7; i++) { 649 - ppseudo_hdr->checksum ^= *pmsg++; 650 - /* pr_debug("checksum = 0x%x\n", ppseudo_hdr->checksum); */ 651 - } 652 - pmsg++; 653 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 654 - result = card_send_command(ft1000dev, dpram_data, total_len+2); 655 - 656 - 657 - ft1000dev->app_info[app_index].nTxMsg++; 658 - } else { 659 - result = -EINVAL; 660 - } 661 - } 662 - } 663 - } else { 664 - pr_debug("Card not ready take messages\n"); 665 - result = -EACCES; 666 - } 667 - kfree(dpram_data); 668 - 669 - } 670 - break; 671 - case IOCTL_GET_DPRAM_CMD: 672 - { 673 - struct dpram_blk *pdpram_blk; 674 - struct IOCTL_DPRAM_BLK __user *pioctl_dpram; 675 - int msglen; 676 - 677 - /* pr_debug("IOCTL_FT1000_GET_DPRAM called\n"); */ 678 - 679 - if (ft1000_flarion_cnt == 0) 680 - return -EBADF; 681 - 682 - /* Search for matching file object */ 683 - for (i = 0; i < MAX_NUM_APP; i++) { 684 - if (ft1000dev->app_info[i].fileobject == &file->f_owner) { 685 - /*pr_debug("Message is for AppId = %d\n", ft1000dev->app_info[i].app_id); */ 686 - break; 687 - } 688 - } 689 - 690 - /* Could not find application info block */ 691 - if (i == MAX_NUM_APP) { 692 - pr_debug("Could not find application info block\n"); 693 - result = -EBADF; 694 - break; 695 - } 696 - 697 - result = 0; 698 - pioctl_dpram = argp; 699 - if (list_empty(&ft1000dev->app_info[i].app_sqlist) == 0) { 700 - /* pr_debug("Message detected in slow queue\n"); */ 701 - spin_lock_irqsave(&free_buff_lock, flags); 702 - pdpram_blk = list_entry(ft1000dev->app_info[i].app_sqlist.next, 703 - struct dpram_blk, list); 704 - list_del(&pdpram_blk->list); 705 - ft1000dev->app_info[i].NumOfMsg--; 706 - /* pr_debug("NumOfMsg for app %d = %d\n", i, ft1000dev->app_info[i].NumOfMsg); */ 707 - spin_unlock_irqrestore(&free_buff_lock, flags); 708 - msglen = ntohs(*(u16 *)pdpram_blk->pbuffer) + PSEUDOSZ; 709 - result = get_user(msglen, &pioctl_dpram->total_len); 710 - if (result) 711 - break; 712 - msglen = htons(msglen); 713 - /* pr_debug("msg length = %x\n", msglen); */ 714 - if (copy_to_user(&pioctl_dpram->pseudohdr, pdpram_blk->pbuffer, msglen)) { 715 - pr_debug("copy fault occurred\n"); 716 - result = -EFAULT; 717 - break; 718 - } 719 - 720 - ft1000_free_buffer(pdpram_blk, &freercvpool); 721 - result = msglen; 722 - } 723 - /* pr_debug("IOCTL_FT1000_GET_DPRAM no message\n"); */ 724 - } 725 - break; 726 - 727 - default: 728 - pr_debug("unknown command: 0x%x\n", command); 729 - result = -ENOTTY; 730 - break; 731 - } 732 - ft1000dev->fAppMsgPend = false; 733 - return result; 734 - } 735 - 736 - /* 737 - *--------------------------------------------------------------------------- 738 - * Function: ft1000_release 739 - * 740 - * Parameters: 741 - * 742 - * Description: 743 - * 744 - * Notes: 745 - * 746 - *--------------------------------------------------------------------------- 747 - */ 748 - static int ft1000_release(struct inode *inode, struct file *file) 749 - { 750 - struct ft1000_info *info; 751 - struct net_device *dev; 752 - struct ft1000_usb *ft1000dev; 753 - int i; 754 - struct dpram_blk *pdpram_blk; 755 - struct dpram_blk *tmp; 756 - 757 - dev = file->private_data; 758 - info = netdev_priv(dev); 759 - ft1000dev = info->priv; 760 - 761 - if (ft1000_flarion_cnt == 0) { 762 - ft1000dev->appcnt--; 763 - return -EBADF; 764 - } 765 - 766 - /* Search for matching file object */ 767 - for (i = 0; i < MAX_NUM_APP; i++) { 768 - if (ft1000dev->app_info[i].fileobject == &file->f_owner) { 769 - /* pr_debug("Message is for AppId = %d\n", ft1000dev->app_info[i].app_id); */ 770 - break; 771 - } 772 - } 773 - 774 - if (i == MAX_NUM_APP) 775 - return 0; 776 - 777 - list_for_each_entry_safe(pdpram_blk, tmp, &ft1000dev->app_info[i].app_sqlist, list) { 778 - pr_debug("Remove and free memory queue up on slow queue\n"); 779 - list_del(&pdpram_blk->list); 780 - ft1000_free_buffer(pdpram_blk, &freercvpool); 781 - } 782 - 783 - /* initialize application information */ 784 - ft1000dev->appcnt--; 785 - pr_debug("appcnt = %d\n", ft1000dev->appcnt); 786 - ft1000dev->app_info[i].fileobject = NULL; 787 - 788 - return 0; 789 - }
-1058
drivers/staging/ft1000/ft1000-usb/ft1000_download.c
··· 1 - /* 2 - * CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. 3 - * 4 - * This file is part of Express Card USB Driver 5 - */ 6 - 7 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 8 - 9 - #include <linux/kernel.h> 10 - #include <linux/module.h> 11 - #include <linux/netdevice.h> 12 - #include <linux/etherdevice.h> 13 - #include <linux/usb.h> 14 - #include <linux/vmalloc.h> 15 - #include "ft1000_usb.h" 16 - 17 - 18 - #define DWNLD_HANDSHAKE_LOC 0x02 19 - #define DWNLD_TYPE_LOC 0x04 20 - #define DWNLD_SIZE_MSW_LOC 0x06 21 - #define DWNLD_SIZE_LSW_LOC 0x08 22 - #define DWNLD_PS_HDR_LOC 0x0A 23 - 24 - #define MAX_DSP_WAIT_LOOPS 40 25 - #define DSP_WAIT_SLEEP_TIME 1000 /* 1 millisecond */ 26 - #define DSP_WAIT_DISPATCH_LVL 50 /* 50 usec */ 27 - 28 - #define HANDSHAKE_TIMEOUT_VALUE 0xF1F1 29 - #define HANDSHAKE_RESET_VALUE 0xFEFE /* When DSP requests startover */ 30 - #define HANDSHAKE_RESET_VALUE_USB 0xFE7E /* When DSP requests startover */ 31 - #define HANDSHAKE_DSP_BL_READY 0xFEFE /* At start DSP writes this when bootloader ready */ 32 - #define HANDSHAKE_DSP_BL_READY_USB 0xFE7E /* At start DSP writes this when bootloader ready */ 33 - #define HANDSHAKE_DRIVER_READY 0xFFFF /* Driver writes after receiving 0xFEFE */ 34 - #define HANDSHAKE_SEND_DATA 0x0000 /* DSP writes this when ready for more data */ 35 - 36 - #define HANDSHAKE_REQUEST 0x0001 /* Request from DSP */ 37 - #define HANDSHAKE_RESPONSE 0x0000 /* Satisfied DSP request */ 38 - 39 - #define REQUEST_CODE_LENGTH 0x0000 40 - #define REQUEST_RUN_ADDRESS 0x0001 41 - #define REQUEST_CODE_SEGMENT 0x0002 /* In WORD count */ 42 - #define REQUEST_DONE_BL 0x0003 43 - #define REQUEST_DONE_CL 0x0004 44 - #define REQUEST_VERSION_INFO 0x0005 45 - #define REQUEST_CODE_BY_VERSION 0x0006 46 - #define REQUEST_MAILBOX_DATA 0x0007 47 - #define REQUEST_FILE_CHECKSUM 0x0008 48 - 49 - #define STATE_START_DWNLD 0x01 50 - #define STATE_BOOT_DWNLD 0x02 51 - #define STATE_CODE_DWNLD 0x03 52 - #define STATE_DONE_DWNLD 0x04 53 - #define STATE_SECTION_PROV 0x05 54 - #define STATE_DONE_PROV 0x06 55 - #define STATE_DONE_FILE 0x07 56 - 57 - #define MAX_LENGTH 0x7f0 58 - 59 - /* Temporary download mechanism for Magnemite */ 60 - #define DWNLD_MAG_TYPE_LOC 0x00 61 - #define DWNLD_MAG_LEN_LOC 0x01 62 - #define DWNLD_MAG_ADDR_LOC 0x02 63 - #define DWNLD_MAG_CHKSUM_LOC 0x03 64 - #define DWNLD_MAG_VAL_LOC 0x04 65 - 66 - #define HANDSHAKE_MAG_DSP_BL_READY 0xFEFE0000 /* At start DSP writes this when bootloader ready */ 67 - #define HANDSHAKE_MAG_DSP_ENTRY 0x01000000 /* Dsp writes this to request for entry address */ 68 - #define HANDSHAKE_MAG_DSP_DATA 0x02000000 /* Dsp writes this to request for data block */ 69 - #define HANDSHAKE_MAG_DSP_DONE 0x03000000 /* Dsp writes this to indicate download done */ 70 - 71 - #define HANDSHAKE_MAG_DRV_READY 0xFFFF0000 /* Driver writes this to indicate ready to download */ 72 - #define HANDSHAKE_MAG_DRV_DATA 0x02FECDAB /* Driver writes this to indicate data available to DSP */ 73 - #define HANDSHAKE_MAG_DRV_ENTRY 0x01FECDAB /* Driver writes this to indicate entry point to DSP */ 74 - 75 - #define HANDSHAKE_MAG_TIMEOUT_VALUE 0xF1F1 76 - 77 - 78 - /* New Magnemite downloader */ 79 - #define DWNLD_MAG1_HANDSHAKE_LOC 0x00 80 - #define DWNLD_MAG1_TYPE_LOC 0x01 81 - #define DWNLD_MAG1_SIZE_LOC 0x02 82 - #define DWNLD_MAG1_PS_HDR_LOC 0x03 83 - 84 - struct dsp_file_hdr { 85 - long version_id; /* Version ID of this image format. */ 86 - long package_id; /* Package ID of code release. */ 87 - long build_date; /* Date/time stamp when file was built. */ 88 - long commands_offset; /* Offset to attached commands in Pseudo Hdr format. */ 89 - long loader_offset; /* Offset to bootloader code. */ 90 - long loader_code_address; /* Start address of bootloader. */ 91 - long loader_code_end; /* Where bootloader code ends. */ 92 - long loader_code_size; 93 - long version_data_offset; /* Offset were scrambled version data begins. */ 94 - long version_data_size; /* Size, in words, of scrambled version data. */ 95 - long nDspImages; /* Number of DSP images in file. */ 96 - }; 97 - 98 - struct dsp_image_info { 99 - long coff_date; /* Date/time when DSP Coff image was built. */ 100 - long begin_offset; /* Offset in file where image begins. */ 101 - long end_offset; /* Offset in file where image begins. */ 102 - long run_address; /* On chip Start address of DSP code. */ 103 - long image_size; /* Size of image. */ 104 - long version; /* Embedded version # of DSP code. */ 105 - unsigned short checksum; /* DSP File checksum */ 106 - unsigned short pad1; 107 - } __packed; 108 - 109 - 110 - /* checks if the doorbell register is cleared */ 111 - static int check_usb_db(struct ft1000_usb *ft1000dev) 112 - { 113 - int loopcnt; 114 - u16 temp; 115 - int status; 116 - 117 - loopcnt = 0; 118 - 119 - while (loopcnt < 10) { 120 - status = ft1000_read_register(ft1000dev, &temp, 121 - FT1000_REG_DOORBELL); 122 - pr_debug("read FT1000_REG_DOORBELL value is %x\n", temp); 123 - if (temp & 0x0080) { 124 - pr_debug("Got checkusb doorbell\n"); 125 - status = ft1000_write_register(ft1000dev, 0x0080, 126 - FT1000_REG_DOORBELL); 127 - status = ft1000_write_register(ft1000dev, 0x0100, 128 - FT1000_REG_DOORBELL); 129 - status = ft1000_write_register(ft1000dev, 0x8000, 130 - FT1000_REG_DOORBELL); 131 - break; 132 - } 133 - loopcnt++; 134 - usleep_range(10000, 11000); 135 - 136 - } 137 - 138 - loopcnt = 0; 139 - while (loopcnt < 20) { 140 - status = ft1000_read_register(ft1000dev, &temp, 141 - FT1000_REG_DOORBELL); 142 - pr_debug("Doorbell = 0x%x\n", temp); 143 - if (temp & 0x8000) { 144 - loopcnt++; 145 - usleep_range(10000, 11000); 146 - } else { 147 - pr_debug("door bell is cleared, return 0\n"); 148 - return 0; 149 - } 150 - } 151 - 152 - return -1; 153 - } 154 - 155 - /* gets the handshake and compares it with the expected value */ 156 - static u16 get_handshake(struct ft1000_usb *ft1000dev, u16 expected_value) 157 - { 158 - u16 handshake; 159 - int loopcnt; 160 - int status = 0; 161 - 162 - loopcnt = 0; 163 - 164 - while (loopcnt < 100) { 165 - /* Need to clear downloader doorbell if Hartley ASIC */ 166 - status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_RX, 167 - FT1000_REG_DOORBELL); 168 - if (ft1000dev->fcodeldr) { 169 - pr_debug("fcodeldr is %d\n", ft1000dev->fcodeldr); 170 - ft1000dev->fcodeldr = 0; 171 - status = check_usb_db(ft1000dev); 172 - if (status != 0) { 173 - pr_debug("check_usb_db failed\n"); 174 - break; 175 - } 176 - status = ft1000_write_register(ft1000dev, 177 - FT1000_DB_DNLD_RX, 178 - FT1000_REG_DOORBELL); 179 - } 180 - 181 - status = ft1000_read_dpram16(ft1000dev, 182 - DWNLD_MAG1_HANDSHAKE_LOC, 183 - (u8 *)&handshake, 1); 184 - handshake = ntohs(handshake); 185 - 186 - if (status) 187 - return HANDSHAKE_TIMEOUT_VALUE; 188 - 189 - if ((handshake == expected_value) || 190 - (handshake == HANDSHAKE_RESET_VALUE_USB)) { 191 - return handshake; 192 - } 193 - loopcnt++; 194 - usleep_range(10000, 11000); 195 - } 196 - 197 - return HANDSHAKE_TIMEOUT_VALUE; 198 - } 199 - 200 - /* write the handshake value to the handshake location */ 201 - static void put_handshake(struct ft1000_usb *ft1000dev, u16 handshake_value) 202 - { 203 - u32 tempx; 204 - u16 tempword; 205 - int status; 206 - 207 - tempx = (u32)handshake_value; 208 - tempx = ntohl(tempx); 209 - 210 - tempword = (u16)(tempx & 0xffff); 211 - status = ft1000_write_dpram16(ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, 212 - tempword, 0); 213 - tempword = (u16)(tempx >> 16); 214 - status = ft1000_write_dpram16(ft1000dev, DWNLD_MAG1_HANDSHAKE_LOC, 215 - tempword, 1); 216 - status = ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, 217 - FT1000_REG_DOORBELL); 218 - } 219 - 220 - static u16 get_handshake_usb(struct ft1000_usb *ft1000dev, u16 expected_value) 221 - { 222 - u16 handshake; 223 - int loopcnt; 224 - u16 temp; 225 - int status = 0; 226 - 227 - loopcnt = 0; 228 - handshake = 0; 229 - 230 - while (loopcnt < 100) { 231 - if (ft1000dev->usbboot == 2) { 232 - status = ft1000_read_dpram32(ft1000dev, 0, 233 - (u8 *)&ft1000dev->tempbuf[0], 64); 234 - for (temp = 0; temp < 16; temp++) { 235 - pr_debug("tempbuf %d = 0x%x\n", 236 - temp, ft1000dev->tempbuf[temp]); 237 - } 238 - status = ft1000_read_dpram16(ft1000dev, 239 - DWNLD_MAG1_HANDSHAKE_LOC, 240 - (u8 *)&handshake, 1); 241 - pr_debug("handshake from read_dpram16 = 0x%x\n", 242 - handshake); 243 - if (ft1000dev->dspalive == ft1000dev->tempbuf[6]) { 244 - handshake = 0; 245 - } else { 246 - handshake = ft1000dev->tempbuf[1]; 247 - ft1000dev->dspalive = 248 - ft1000dev->tempbuf[6]; 249 - } 250 - } else { 251 - status = ft1000_read_dpram16(ft1000dev, 252 - DWNLD_MAG1_HANDSHAKE_LOC, 253 - (u8 *)&handshake, 1); 254 - } 255 - 256 - loopcnt++; 257 - usleep_range(10000, 11000); 258 - handshake = ntohs(handshake); 259 - if ((handshake == expected_value) || 260 - (handshake == HANDSHAKE_RESET_VALUE_USB)) 261 - return handshake; 262 - } 263 - 264 - return HANDSHAKE_TIMEOUT_VALUE; 265 - } 266 - 267 - static void put_handshake_usb(struct ft1000_usb *ft1000dev, u16 handshake_value) 268 - { 269 - int i; 270 - 271 - for (i = 0; i < 1000; i++) 272 - ; 273 - } 274 - 275 - static u16 get_request_type(struct ft1000_usb *ft1000dev) 276 - { 277 - u16 request_type; 278 - int status; 279 - u16 tempword; 280 - u32 tempx; 281 - 282 - if (ft1000dev->bootmode == 1) { 283 - status = fix_ft1000_read_dpram32(ft1000dev, 284 - DWNLD_MAG1_TYPE_LOC, 285 - (u8 *)&tempx); 286 - tempx = ntohl(tempx); 287 - } else { 288 - tempx = 0; 289 - status = ft1000_read_dpram16(ft1000dev, 290 - DWNLD_MAG1_TYPE_LOC, 291 - (u8 *)&tempword, 1); 292 - tempx |= (tempword << 16); 293 - tempx = ntohl(tempx); 294 - } 295 - request_type = (u16)tempx; 296 - 297 - return request_type; 298 - } 299 - 300 - static u16 get_request_type_usb(struct ft1000_usb *ft1000dev) 301 - { 302 - u16 request_type; 303 - int status; 304 - u16 tempword; 305 - u32 tempx; 306 - 307 - if (ft1000dev->bootmode == 1) { 308 - status = fix_ft1000_read_dpram32(ft1000dev, 309 - DWNLD_MAG1_TYPE_LOC, 310 - (u8 *)&tempx); 311 - tempx = ntohl(tempx); 312 - } else { 313 - if (ft1000dev->usbboot == 2) { 314 - tempx = ft1000dev->tempbuf[2]; 315 - tempword = ft1000dev->tempbuf[3]; 316 - } else { 317 - tempx = 0; 318 - status = ft1000_read_dpram16(ft1000dev, 319 - DWNLD_MAG1_TYPE_LOC, 320 - (u8 *)&tempword, 1); 321 - } 322 - tempx |= (tempword << 16); 323 - tempx = ntohl(tempx); 324 - } 325 - request_type = (u16)tempx; 326 - 327 - return request_type; 328 - } 329 - 330 - static long get_request_value(struct ft1000_usb *ft1000dev) 331 - { 332 - u32 value; 333 - u16 tempword; 334 - int status; 335 - 336 - if (ft1000dev->bootmode == 1) { 337 - status = fix_ft1000_read_dpram32(ft1000dev, 338 - DWNLD_MAG1_SIZE_LOC, 339 - (u8 *)&value); 340 - value = ntohl(value); 341 - } else { 342 - status = ft1000_read_dpram16(ft1000dev, 343 - DWNLD_MAG1_SIZE_LOC, 344 - (u8 *)&tempword, 0); 345 - value = tempword; 346 - status = ft1000_read_dpram16(ft1000dev, 347 - DWNLD_MAG1_SIZE_LOC, 348 - (u8 *)&tempword, 1); 349 - value |= (tempword << 16); 350 - value = ntohl(value); 351 - } 352 - 353 - return value; 354 - } 355 - 356 - 357 - /* writes a value to DWNLD_MAG1_SIZE_LOC */ 358 - static void put_request_value(struct ft1000_usb *ft1000dev, long lvalue) 359 - { 360 - u32 tempx; 361 - int status; 362 - 363 - tempx = ntohl(lvalue); 364 - status = fix_ft1000_write_dpram32(ft1000dev, DWNLD_MAG1_SIZE_LOC, 365 - (u8 *)&tempx); 366 - } 367 - 368 - 369 - 370 - /* returns the checksum of the pseudo header */ 371 - static u16 hdr_checksum(struct pseudo_hdr *pHdr) 372 - { 373 - u16 *usPtr = (u16 *)pHdr; 374 - u16 chksum; 375 - 376 - 377 - chksum = (((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^ 378 - usPtr[4]) ^ usPtr[5]) ^ usPtr[6]; 379 - 380 - return chksum; 381 - } 382 - 383 - static int check_buffers(u16 *buff_w, u16 *buff_r, int len, int offset) 384 - { 385 - int i; 386 - 387 - for (i = 0; i < len; i++) { 388 - if (buff_w[i] != buff_r[i + offset]) 389 - return -EREMOTEIO; 390 - } 391 - 392 - return 0; 393 - } 394 - 395 - static int write_dpram32_and_check(struct ft1000_usb *ft1000dev, 396 - u16 tempbuffer[], u16 dpram) 397 - { 398 - int status; 399 - u16 resultbuffer[64]; 400 - int i; 401 - 402 - for (i = 0; i < 10; i++) { 403 - status = ft1000_write_dpram32(ft1000dev, dpram, 404 - (u8 *)&tempbuffer[0], 64); 405 - if (status == 0) { 406 - /* Work around for ASIC bit stuffing problem. */ 407 - if ((tempbuffer[31] & 0xfe00) == 0xfe00) { 408 - status = ft1000_write_dpram32(ft1000dev, 409 - dpram+12, (u8 *)&tempbuffer[24], 410 - 64); 411 - } 412 - /* Let's check the data written */ 413 - status = ft1000_read_dpram32(ft1000dev, dpram, 414 - (u8 *)&resultbuffer[0], 64); 415 - if ((tempbuffer[31] & 0xfe00) == 0xfe00) { 416 - if (check_buffers(tempbuffer, resultbuffer, 28, 417 - 0)) { 418 - pr_debug("DPRAM write failed 1 during bootloading\n"); 419 - usleep_range(9000, 11000); 420 - break; 421 - } 422 - status = ft1000_read_dpram32(ft1000dev, 423 - dpram+12, 424 - (u8 *)&resultbuffer[0], 64); 425 - 426 - if (check_buffers(tempbuffer, resultbuffer, 16, 427 - 24)) { 428 - pr_debug("DPRAM write failed 2 during bootloading\n"); 429 - usleep_range(9000, 11000); 430 - break; 431 - } 432 - } else { 433 - if (check_buffers(tempbuffer, resultbuffer, 32, 434 - 0)) { 435 - pr_debug("DPRAM write failed 3 during bootloading\n"); 436 - usleep_range(9000, 11000); 437 - break; 438 - } 439 - } 440 - if (status == 0) 441 - break; 442 - } 443 - } 444 - return status; 445 - } 446 - 447 - /* writes a block of DSP image to DPRAM 448 - * Parameters: struct ft1000_usb - device structure 449 - * u16 **pUsFile - DSP image file pointer in u16 450 - * u8 **pUcFile - DSP image file pointer in u8 451 - * long word_length - length of the buffer to be written to DPRAM 452 - */ 453 - static int write_blk(struct ft1000_usb *ft1000dev, u16 **pUsFile, u8 **pUcFile, 454 - long word_length) 455 - { 456 - int status = 0; 457 - u16 dpram; 458 - int loopcnt, i; 459 - u16 tempword; 460 - u16 tempbuffer[64]; 461 - 462 - /*pr_debug("start word_length = %d\n",(int)word_length); */ 463 - dpram = (u16)DWNLD_MAG1_PS_HDR_LOC; 464 - tempword = *(*pUsFile); 465 - (*pUsFile)++; 466 - status = ft1000_write_dpram16(ft1000dev, dpram, tempword, 0); 467 - tempword = *(*pUsFile); 468 - (*pUsFile)++; 469 - status = ft1000_write_dpram16(ft1000dev, dpram++, tempword, 1); 470 - 471 - *pUcFile = *pUcFile + 4; 472 - word_length--; 473 - tempword = (u16)word_length; 474 - word_length = (word_length / 16) + 1; 475 - for (; word_length > 0; word_length--) { /* In words */ 476 - loopcnt = 0; 477 - for (i = 0; i < 32; i++) { 478 - if (tempword != 0) { 479 - tempbuffer[i++] = *(*pUsFile); 480 - (*pUsFile)++; 481 - tempbuffer[i] = *(*pUsFile); 482 - (*pUsFile)++; 483 - *pUcFile = *pUcFile + 4; 484 - loopcnt++; 485 - tempword--; 486 - } else { 487 - tempbuffer[i++] = 0; 488 - tempbuffer[i] = 0; 489 - } 490 - } 491 - 492 - /*pr_debug("loopcnt is %d\n", loopcnt); */ 493 - /*pr_debug("write_blk: bootmode = %d\n", bootmode); */ 494 - /*pr_debug("write_blk: dpram = %x\n", dpram); */ 495 - if (ft1000dev->bootmode == 0) { 496 - if (dpram >= 0x3F4) 497 - status = ft1000_write_dpram32(ft1000dev, dpram, 498 - (u8 *)&tempbuffer[0], 8); 499 - else 500 - status = ft1000_write_dpram32(ft1000dev, dpram, 501 - (u8 *)&tempbuffer[0], 64); 502 - } else { 503 - status = write_dpram32_and_check(ft1000dev, tempbuffer, 504 - dpram); 505 - if (status != 0) { 506 - pr_debug("Write failed tempbuffer[31] = 0x%x\n", 507 - tempbuffer[31]); 508 - break; 509 - } 510 - } 511 - dpram = dpram + loopcnt; 512 - } 513 - return status; 514 - } 515 - 516 - static void usb_dnld_complete(struct urb *urb) 517 - { 518 - /* pr_debug("****** usb_dnld_complete\n"); */ 519 - } 520 - 521 - /* writes a block of DSP image to DPRAM 522 - * Parameters: struct ft1000_usb - device structure 523 - * u16 **pUsFile - DSP image file pointer in u16 524 - * u8 **pUcFile - DSP image file pointer in u8 525 - * long word_length - length of the buffer to be written to DPRAM 526 - */ 527 - static int write_blk_fifo(struct ft1000_usb *ft1000dev, u16 **pUsFile, 528 - u8 **pUcFile, long word_length) 529 - { 530 - int byte_length; 531 - 532 - byte_length = word_length * 4; 533 - 534 - if (byte_length && ((byte_length % 64) == 0)) 535 - byte_length += 4; 536 - 537 - if (byte_length < 64) 538 - byte_length = 68; 539 - 540 - usb_init_urb(ft1000dev->tx_urb); 541 - memcpy(ft1000dev->tx_buf, *pUcFile, byte_length); 542 - usb_fill_bulk_urb(ft1000dev->tx_urb, 543 - ft1000dev->dev, 544 - usb_sndbulkpipe(ft1000dev->dev, 545 - ft1000dev->bulk_out_endpointAddr), 546 - ft1000dev->tx_buf, byte_length, usb_dnld_complete, 547 - ft1000dev); 548 - 549 - usb_submit_urb(ft1000dev->tx_urb, GFP_ATOMIC); 550 - 551 - *pUsFile = *pUsFile + (word_length << 1); 552 - *pUcFile = *pUcFile + (word_length << 2); 553 - 554 - return 0; 555 - } 556 - 557 - static int scram_start_dwnld(struct ft1000_usb *ft1000dev, u16 *hshake, 558 - u32 *state) 559 - { 560 - int status = 0; 561 - 562 - if (ft1000dev->usbboot) 563 - *hshake = get_handshake_usb(ft1000dev, HANDSHAKE_DSP_BL_READY); 564 - else 565 - *hshake = get_handshake(ft1000dev, HANDSHAKE_DSP_BL_READY); 566 - if (*hshake == HANDSHAKE_DSP_BL_READY) { 567 - pr_debug("handshake is HANDSHAKE_DSP_BL_READY, call put_handshake(HANDSHAKE_DRIVER_READY)\n"); 568 - put_handshake(ft1000dev, HANDSHAKE_DRIVER_READY); 569 - } else if (*hshake == HANDSHAKE_TIMEOUT_VALUE) { 570 - status = -ETIMEDOUT; 571 - } else { 572 - pr_debug("Download error: Handshake failed\n"); 573 - status = -ENETRESET; 574 - } 575 - *state = STATE_BOOT_DWNLD; 576 - return status; 577 - } 578 - 579 - static int request_code_segment(struct ft1000_usb *ft1000dev, u16 **s_file, 580 - u8 **c_file, const u8 *endpoint, bool boot_case) 581 - { 582 - long word_length; 583 - int status = 0; 584 - 585 - word_length = get_request_value(ft1000dev); 586 - /*pr_debug("word_length = 0x%x\n", (int)word_length); */ 587 - /*NdisMSleep (100); */ 588 - if (word_length > MAX_LENGTH) { 589 - pr_debug("Download error: Max length exceeded\n"); 590 - return -1; 591 - } 592 - if ((word_length * 2 + (long)c_file) > (long)endpoint) { 593 - /* Error, beyond boot code range.*/ 594 - pr_debug("Download error: Requested len=%d exceeds BOOT code boundary\n", 595 - (int)word_length); 596 - return -1; 597 - } 598 - if (word_length & 0x1) 599 - word_length++; 600 - word_length = word_length / 2; 601 - 602 - if (boot_case) { 603 - status = write_blk(ft1000dev, s_file, c_file, word_length); 604 - /*pr_debug("write_blk returned %d\n", status); */ 605 - } else { 606 - status = write_blk_fifo(ft1000dev, s_file, c_file, word_length); 607 - if (ft1000dev->usbboot == 0) 608 - ft1000dev->usbboot++; 609 - if (ft1000dev->usbboot == 1) 610 - status |= ft1000_write_dpram16(ft1000dev, 611 - DWNLD_MAG1_PS_HDR_LOC, 0, 0); 612 - } 613 - return status; 614 - } 615 - 616 - /* Scramble downloader for Harley based ASIC via USB interface */ 617 - int scram_dnldr(struct ft1000_usb *ft1000dev, void *pFileStart, 618 - u32 FileLength) 619 - { 620 - int status = 0; 621 - u32 state; 622 - u16 handshake; 623 - struct pseudo_hdr *pseudo_header; 624 - u16 pseudo_header_len; 625 - long word_length; 626 - u16 request; 627 - u16 temp; 628 - 629 - struct dsp_file_hdr *file_hdr; 630 - struct dsp_image_info *dsp_img_info = NULL; 631 - long requested_version; 632 - bool correct_version; 633 - struct drv_msg *mailbox_data; 634 - u16 *data = NULL; 635 - u16 *s_file = NULL; 636 - u8 *c_file = NULL; 637 - u8 *boot_end = NULL, *code_end = NULL; 638 - int image; 639 - long loader_code_address, loader_code_size = 0; 640 - long run_address = 0, run_size = 0; 641 - 642 - u32 templong; 643 - u32 image_chksum = 0; 644 - 645 - u16 dpram = 0; 646 - u8 *pbuffer; 647 - struct prov_record *pprov_record; 648 - struct ft1000_info *pft1000info = netdev_priv(ft1000dev->net); 649 - 650 - ft1000dev->fcodeldr = 0; 651 - ft1000dev->usbboot = 0; 652 - ft1000dev->dspalive = 0xffff; 653 - 654 - /* 655 - * Get version id of file, at first 4 bytes of file, for newer files. 656 - */ 657 - 658 - state = STATE_START_DWNLD; 659 - 660 - file_hdr = pFileStart; 661 - 662 - ft1000_write_register(ft1000dev, 0x800, FT1000_REG_MAG_WATERMARK); 663 - 664 - s_file = (u16 *) (pFileStart + file_hdr->loader_offset); 665 - c_file = (u8 *) (pFileStart + file_hdr->loader_offset); 666 - 667 - boot_end = (u8 *) (pFileStart + file_hdr->loader_code_end); 668 - 669 - loader_code_address = file_hdr->loader_code_address; 670 - loader_code_size = file_hdr->loader_code_size; 671 - correct_version = false; 672 - 673 - while ((status == 0) && (state != STATE_DONE_FILE)) { 674 - switch (state) { 675 - case STATE_START_DWNLD: 676 - status = scram_start_dwnld(ft1000dev, &handshake, 677 - &state); 678 - break; 679 - 680 - case STATE_BOOT_DWNLD: 681 - pr_debug("STATE_BOOT_DWNLD\n"); 682 - ft1000dev->bootmode = 1; 683 - handshake = get_handshake(ft1000dev, HANDSHAKE_REQUEST); 684 - if (handshake == HANDSHAKE_REQUEST) { 685 - /* 686 - * Get type associated with the request. 687 - */ 688 - request = get_request_type(ft1000dev); 689 - switch (request) { 690 - case REQUEST_RUN_ADDRESS: 691 - pr_debug("REQUEST_RUN_ADDRESS\n"); 692 - put_request_value(ft1000dev, 693 - loader_code_address); 694 - break; 695 - case REQUEST_CODE_LENGTH: 696 - pr_debug("REQUEST_CODE_LENGTH\n"); 697 - put_request_value(ft1000dev, 698 - loader_code_size); 699 - break; 700 - case REQUEST_DONE_BL: 701 - pr_debug("REQUEST_DONE_BL\n"); 702 - /* Reposition ptrs to beginning of code section */ 703 - s_file = (u16 *) (boot_end); 704 - c_file = (u8 *) (boot_end); 705 - /* pr_debug("download:s_file = 0x%8x\n", (int)s_file); */ 706 - /* pr_debug("FT1000:download:c_file = 0x%8x\n", (int)c_file); */ 707 - state = STATE_CODE_DWNLD; 708 - ft1000dev->fcodeldr = 1; 709 - break; 710 - case REQUEST_CODE_SEGMENT: 711 - status = request_code_segment(ft1000dev, 712 - &s_file, &c_file, 713 - boot_end, 714 - true); 715 - break; 716 - default: 717 - pr_debug("Download error: Bad request type=%d in BOOT download state\n", 718 - request); 719 - status = -1; 720 - break; 721 - } 722 - if (ft1000dev->usbboot) 723 - put_handshake_usb(ft1000dev, 724 - HANDSHAKE_RESPONSE); 725 - else 726 - put_handshake(ft1000dev, 727 - HANDSHAKE_RESPONSE); 728 - } else { 729 - pr_debug("Download error: Handshake failed\n"); 730 - status = -1; 731 - } 732 - 733 - break; 734 - 735 - case STATE_CODE_DWNLD: 736 - /* pr_debug("STATE_CODE_DWNLD\n"); */ 737 - ft1000dev->bootmode = 0; 738 - if (ft1000dev->usbboot) 739 - handshake = 740 - get_handshake_usb(ft1000dev, 741 - HANDSHAKE_REQUEST); 742 - else 743 - handshake = 744 - get_handshake(ft1000dev, HANDSHAKE_REQUEST); 745 - if (handshake == HANDSHAKE_REQUEST) { 746 - /* 747 - * Get type associated with the request. 748 - */ 749 - if (ft1000dev->usbboot) 750 - request = 751 - get_request_type_usb(ft1000dev); 752 - else 753 - request = get_request_type(ft1000dev); 754 - switch (request) { 755 - case REQUEST_FILE_CHECKSUM: 756 - pr_debug("image_chksum = 0x%8x\n", 757 - image_chksum); 758 - put_request_value(ft1000dev, 759 - image_chksum); 760 - break; 761 - case REQUEST_RUN_ADDRESS: 762 - pr_debug("REQUEST_RUN_ADDRESS\n"); 763 - if (correct_version) { 764 - pr_debug("run_address = 0x%8x\n", 765 - (int)run_address); 766 - put_request_value(ft1000dev, 767 - run_address); 768 - } else { 769 - pr_debug("Download error: Got Run address request before image offset request\n"); 770 - status = -1; 771 - break; 772 - } 773 - break; 774 - case REQUEST_CODE_LENGTH: 775 - pr_debug("REQUEST_CODE_LENGTH\n"); 776 - if (correct_version) { 777 - pr_debug("run_size = 0x%8x\n", 778 - (int)run_size); 779 - put_request_value(ft1000dev, 780 - run_size); 781 - } else { 782 - pr_debug("Download error: Got Size request before image offset request\n"); 783 - status = -1; 784 - break; 785 - } 786 - break; 787 - case REQUEST_DONE_CL: 788 - ft1000dev->usbboot = 3; 789 - /* Reposition ptrs to beginning of provisioning section */ 790 - s_file = 791 - (u16 *) (pFileStart + 792 - file_hdr->commands_offset); 793 - c_file = 794 - (u8 *) (pFileStart + 795 - file_hdr->commands_offset); 796 - state = STATE_DONE_DWNLD; 797 - break; 798 - case REQUEST_CODE_SEGMENT: 799 - /* pr_debug("REQUEST_CODE_SEGMENT - CODELOADER\n"); */ 800 - if (!correct_version) { 801 - pr_debug("Download error: Got Code Segment request before image offset request\n"); 802 - status = -1; 803 - break; 804 - } 805 - 806 - status = request_code_segment(ft1000dev, 807 - &s_file, &c_file, 808 - code_end, 809 - false); 810 - 811 - break; 812 - 813 - case REQUEST_MAILBOX_DATA: 814 - pr_debug("REQUEST_MAILBOX_DATA\n"); 815 - /* Convert length from byte count to word count. Make sure we round up. */ 816 - word_length = 817 - (long)(pft1000info->DSPInfoBlklen + 818 - 1) / 2; 819 - put_request_value(ft1000dev, 820 - word_length); 821 - mailbox_data = 822 - (struct drv_msg *)&(pft1000info-> 823 - DSPInfoBlk[0]); 824 - /* 825 - * Position ASIC DPRAM auto-increment pointer. 826 - */ 827 - 828 - data = (u16 *)&mailbox_data->data[0]; 829 - dpram = (u16)DWNLD_MAG1_PS_HDR_LOC; 830 - if (word_length & 0x1) 831 - word_length++; 832 - 833 - word_length = word_length / 2; 834 - 835 - for (; word_length > 0; word_length--) { /* In words */ 836 - 837 - templong = *data++; 838 - templong |= (*data++ << 16); 839 - status = 840 - fix_ft1000_write_dpram32 841 - (ft1000dev, dpram++, 842 - (u8 *)&templong); 843 - 844 - } 845 - break; 846 - 847 - case REQUEST_VERSION_INFO: 848 - pr_debug("REQUEST_VERSION_INFO\n"); 849 - word_length = 850 - file_hdr->version_data_size; 851 - put_request_value(ft1000dev, 852 - word_length); 853 - /* 854 - * Position ASIC DPRAM auto-increment pointer. 855 - */ 856 - 857 - s_file = 858 - (u16 *) (pFileStart + 859 - file_hdr-> 860 - version_data_offset); 861 - 862 - dpram = (u16)DWNLD_MAG1_PS_HDR_LOC; 863 - if (word_length & 0x1) 864 - word_length++; 865 - 866 - word_length = word_length / 2; 867 - 868 - for (; word_length > 0; word_length--) { /* In words */ 869 - 870 - templong = ntohs(*s_file++); 871 - temp = ntohs(*s_file++); 872 - templong |= (temp << 16); 873 - status = 874 - fix_ft1000_write_dpram32 875 - (ft1000dev, dpram++, 876 - (u8 *)&templong); 877 - 878 - } 879 - break; 880 - 881 - case REQUEST_CODE_BY_VERSION: 882 - pr_debug("REQUEST_CODE_BY_VERSION\n"); 883 - correct_version = false; 884 - requested_version = 885 - get_request_value(ft1000dev); 886 - 887 - dsp_img_info = 888 - (struct dsp_image_info *)(pFileStart 889 - + 890 - sizeof 891 - (struct 892 - dsp_file_hdr)); 893 - 894 - for (image = 0; 895 - image < file_hdr->nDspImages; 896 - image++) { 897 - 898 - if (dsp_img_info->version == 899 - requested_version) { 900 - correct_version = true; 901 - pr_debug("correct_version is TRUE\n"); 902 - s_file = 903 - (u16 *) (pFileStart 904 - + 905 - dsp_img_info-> 906 - begin_offset); 907 - c_file = 908 - (u8 *) (pFileStart + 909 - dsp_img_info-> 910 - begin_offset); 911 - code_end = 912 - (u8 *) (pFileStart + 913 - dsp_img_info-> 914 - end_offset); 915 - run_address = 916 - dsp_img_info-> 917 - run_address; 918 - run_size = 919 - dsp_img_info-> 920 - image_size; 921 - image_chksum = 922 - (u32)dsp_img_info-> 923 - checksum; 924 - break; 925 - } 926 - dsp_img_info++; 927 - 928 - } /* end of for */ 929 - 930 - if (!correct_version) { 931 - /* 932 - * Error, beyond boot code range. 933 - */ 934 - pr_debug("Download error: Bad Version Request = 0x%x.\n", 935 - (int)requested_version); 936 - status = -1; 937 - break; 938 - } 939 - break; 940 - 941 - default: 942 - pr_debug("Download error: Bad request type=%d in CODE download state.\n", 943 - request); 944 - status = -1; 945 - break; 946 - } 947 - if (ft1000dev->usbboot) 948 - put_handshake_usb(ft1000dev, 949 - HANDSHAKE_RESPONSE); 950 - else 951 - put_handshake(ft1000dev, 952 - HANDSHAKE_RESPONSE); 953 - } else { 954 - pr_debug("Download error: Handshake failed\n"); 955 - status = -1; 956 - } 957 - 958 - break; 959 - 960 - case STATE_DONE_DWNLD: 961 - pr_debug("Code loader is done...\n"); 962 - state = STATE_SECTION_PROV; 963 - break; 964 - 965 - case STATE_SECTION_PROV: 966 - pr_debug("STATE_SECTION_PROV\n"); 967 - pseudo_header = (struct pseudo_hdr *)c_file; 968 - 969 - if (pseudo_header->checksum == 970 - hdr_checksum(pseudo_header)) { 971 - if (pseudo_header->portdest != 972 - 0x80 /* Dsp OAM */) { 973 - state = STATE_DONE_PROV; 974 - break; 975 - } 976 - pseudo_header_len = ntohs(pseudo_header->length); /* Byte length for PROV records */ 977 - 978 - /* Get buffer for provisioning data */ 979 - pbuffer = 980 - kmalloc(pseudo_header_len + 981 - sizeof(struct pseudo_hdr), 982 - GFP_ATOMIC); 983 - if (pbuffer) { 984 - memcpy(pbuffer, c_file, 985 - (u32) (pseudo_header_len + 986 - sizeof(struct 987 - pseudo_hdr))); 988 - /* link provisioning data */ 989 - pprov_record = 990 - kmalloc(sizeof(struct prov_record), 991 - GFP_ATOMIC); 992 - if (pprov_record) { 993 - pprov_record->pprov_data = 994 - pbuffer; 995 - list_add_tail(&pprov_record-> 996 - list, 997 - &pft1000info-> 998 - prov_list); 999 - /* Move to next entry if available */ 1000 - c_file = 1001 - (u8 *) ((unsigned long) 1002 - c_file + 1003 - (u32) ((pseudo_header_len + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr)); 1004 - if ((unsigned long)(c_file) - 1005 - (unsigned long)(pFileStart) 1006 - >= 1007 - (unsigned long)FileLength) { 1008 - state = STATE_DONE_FILE; 1009 - } 1010 - } else { 1011 - kfree(pbuffer); 1012 - status = -1; 1013 - } 1014 - } else { 1015 - status = -1; 1016 - } 1017 - } else { 1018 - /* Checksum did not compute */ 1019 - status = -1; 1020 - } 1021 - pr_debug("after STATE_SECTION_PROV, state = %d, status= %d\n", 1022 - state, status); 1023 - break; 1024 - 1025 - case STATE_DONE_PROV: 1026 - pr_debug("STATE_DONE_PROV\n"); 1027 - state = STATE_DONE_FILE; 1028 - break; 1029 - 1030 - default: 1031 - status = -1; 1032 - break; 1033 - } /* End Switch */ 1034 - 1035 - if (status != 0) 1036 - break; 1037 - 1038 - /**** 1039 - // Check if Card is present 1040 - status = Harley_Read_Register(&temp, FT1000_REG_SUP_IMASK); 1041 - if ( (status != NDIS_STATUS_SUCCESS) || (temp == 0x0000) ) { 1042 - break; 1043 - } 1044 - 1045 - status = Harley_Read_Register(&temp, FT1000_REG_ASIC_ID); 1046 - if ( (status != NDIS_STATUS_SUCCESS) || (temp == 0xffff) ) { 1047 - break; 1048 - } 1049 - ****/ 1050 - 1051 - } /* End while */ 1052 - 1053 - pr_debug("Download exiting with status = 0x%8x\n", status); 1054 - ft1000_write_register(ft1000dev, FT1000_DB_DNLD_TX, 1055 - FT1000_REG_DOORBELL); 1056 - 1057 - return status; 1058 - }
-1586
drivers/staging/ft1000/ft1000-usb/ft1000_hw.c
··· 1 - /* CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. 2 - * 3 - * 4 - * This file is part of Express Card USB Driver 5 - */ 6 - 7 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 8 - 9 - #include <linux/kernel.h> 10 - #include <linux/module.h> 11 - #include <linux/netdevice.h> 12 - #include <linux/etherdevice.h> 13 - #include <linux/usb.h> 14 - #include "ft1000_usb.h" 15 - #include <linux/types.h> 16 - 17 - #define HARLEY_READ_REGISTER 0x0 18 - #define HARLEY_WRITE_REGISTER 0x01 19 - #define HARLEY_READ_DPRAM_32 0x02 20 - #define HARLEY_READ_DPRAM_LOW 0x03 21 - #define HARLEY_READ_DPRAM_HIGH 0x04 22 - #define HARLEY_WRITE_DPRAM_32 0x05 23 - #define HARLEY_WRITE_DPRAM_LOW 0x06 24 - #define HARLEY_WRITE_DPRAM_HIGH 0x07 25 - 26 - #define HARLEY_READ_OPERATION 0xc1 27 - #define HARLEY_WRITE_OPERATION 0x41 28 - 29 - #if 0 30 - #define JDEBUG 31 - #endif 32 - 33 - static int ft1000_submit_rx_urb(struct ft1000_info *info); 34 - 35 - static u8 tempbuffer[1600]; 36 - 37 - #define MAX_RCV_LOOP 100 38 - 39 - /* send a control message via USB interface synchronously 40 - * Parameters: ft1000_usb - device structure 41 - * pipe - usb control message pipe 42 - * request - control request 43 - * requesttype - control message request type 44 - * value - value to be written or 0 45 - * index - register index 46 - * data - data buffer to hold the read/write values 47 - * size - data size 48 - * timeout - control message time out value 49 - */ 50 - static int ft1000_control(struct ft1000_usb *ft1000dev, unsigned int pipe, 51 - u8 request, u8 requesttype, u16 value, u16 index, 52 - void *data, u16 size, int timeout) 53 - { 54 - int ret; 55 - 56 - if ((ft1000dev == NULL) || (ft1000dev->dev == NULL)) { 57 - pr_debug("ft1000dev or ft1000dev->dev == NULL, failure\n"); 58 - return -ENODEV; 59 - } 60 - 61 - ret = usb_control_msg(ft1000dev->dev, pipe, request, requesttype, 62 - value, index, data, size, timeout); 63 - 64 - if (ret > 0) 65 - ret = 0; 66 - 67 - return ret; 68 - } 69 - 70 - /* returns the value in a register */ 71 - int ft1000_read_register(struct ft1000_usb *ft1000dev, u16 *Data, 72 - u16 nRegIndx) 73 - { 74 - int ret = 0; 75 - 76 - ret = ft1000_control(ft1000dev, 77 - usb_rcvctrlpipe(ft1000dev->dev, 0), 78 - HARLEY_READ_REGISTER, 79 - HARLEY_READ_OPERATION, 80 - 0, 81 - nRegIndx, 82 - Data, 83 - 2, 84 - USB_CTRL_GET_TIMEOUT); 85 - 86 - return ret; 87 - } 88 - 89 - /* writes the value in a register */ 90 - int ft1000_write_register(struct ft1000_usb *ft1000dev, u16 value, 91 - u16 nRegIndx) 92 - { 93 - int ret = 0; 94 - 95 - ret = ft1000_control(ft1000dev, 96 - usb_sndctrlpipe(ft1000dev->dev, 0), 97 - HARLEY_WRITE_REGISTER, 98 - HARLEY_WRITE_OPERATION, 99 - value, 100 - nRegIndx, 101 - NULL, 102 - 0, 103 - USB_CTRL_SET_TIMEOUT); 104 - 105 - return ret; 106 - } 107 - 108 - /* read a number of bytes from DPRAM */ 109 - int ft1000_read_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer, 110 - u16 cnt) 111 - { 112 - int ret = 0; 113 - 114 - ret = ft1000_control(ft1000dev, 115 - usb_rcvctrlpipe(ft1000dev->dev, 0), 116 - HARLEY_READ_DPRAM_32, 117 - HARLEY_READ_OPERATION, 118 - 0, 119 - indx, 120 - buffer, 121 - cnt, 122 - USB_CTRL_GET_TIMEOUT); 123 - 124 - return ret; 125 - } 126 - 127 - /* writes into DPRAM a number of bytes */ 128 - int ft1000_write_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer, 129 - u16 cnt) 130 - { 131 - int ret = 0; 132 - 133 - if (cnt % 4) 134 - cnt += cnt - (cnt % 4); 135 - 136 - ret = ft1000_control(ft1000dev, 137 - usb_sndctrlpipe(ft1000dev->dev, 0), 138 - HARLEY_WRITE_DPRAM_32, 139 - HARLEY_WRITE_OPERATION, 140 - 0, 141 - indx, 142 - buffer, 143 - cnt, 144 - USB_CTRL_SET_TIMEOUT); 145 - 146 - return ret; 147 - } 148 - 149 - /* read 16 bits from DPRAM */ 150 - int ft1000_read_dpram16(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer, 151 - u8 highlow) 152 - { 153 - int ret = 0; 154 - u8 request; 155 - 156 - if (highlow == 0) 157 - request = HARLEY_READ_DPRAM_LOW; 158 - else 159 - request = HARLEY_READ_DPRAM_HIGH; 160 - 161 - ret = ft1000_control(ft1000dev, 162 - usb_rcvctrlpipe(ft1000dev->dev, 0), 163 - request, 164 - HARLEY_READ_OPERATION, 165 - 0, 166 - indx, 167 - buffer, 168 - 2, 169 - USB_CTRL_GET_TIMEOUT); 170 - 171 - return ret; 172 - } 173 - 174 - /* write into DPRAM a number of bytes */ 175 - int ft1000_write_dpram16(struct ft1000_usb *ft1000dev, u16 indx, u16 value, 176 - u8 highlow) 177 - { 178 - int ret = 0; 179 - u8 request; 180 - 181 - if (highlow == 0) 182 - request = HARLEY_WRITE_DPRAM_LOW; 183 - else 184 - request = HARLEY_WRITE_DPRAM_HIGH; 185 - 186 - ret = ft1000_control(ft1000dev, 187 - usb_sndctrlpipe(ft1000dev->dev, 0), 188 - request, 189 - HARLEY_WRITE_OPERATION, 190 - value, 191 - indx, 192 - NULL, 193 - 0, 194 - USB_CTRL_SET_TIMEOUT); 195 - 196 - return ret; 197 - } 198 - 199 - /* read DPRAM 4 words at a time */ 200 - int fix_ft1000_read_dpram32(struct ft1000_usb *ft1000dev, u16 indx, 201 - u8 *buffer) 202 - { 203 - u8 buf[16]; 204 - u16 pos; 205 - int ret = 0; 206 - 207 - pos = (indx / 4) * 4; 208 - ret = ft1000_read_dpram32(ft1000dev, pos, buf, 16); 209 - 210 - if (ret == 0) { 211 - pos = (indx % 4) * 4; 212 - *buffer++ = buf[pos++]; 213 - *buffer++ = buf[pos++]; 214 - *buffer++ = buf[pos++]; 215 - *buffer++ = buf[pos++]; 216 - } else { 217 - pr_debug("DPRAM32 Read failed\n"); 218 - *buffer++ = 0; 219 - *buffer++ = 0; 220 - *buffer++ = 0; 221 - *buffer++ = 0; 222 - } 223 - 224 - return ret; 225 - } 226 - 227 - 228 - /* Description: This function write to DPRAM 4 words at a time */ 229 - int fix_ft1000_write_dpram32(struct ft1000_usb *ft1000dev, u16 indx, u8 *buffer) 230 - { 231 - u16 pos1; 232 - u16 pos2; 233 - u16 i; 234 - u8 buf[32]; 235 - u8 resultbuffer[32]; 236 - u8 *pdata; 237 - int ret = 0; 238 - 239 - pos1 = (indx / 4) * 4; 240 - pdata = buffer; 241 - ret = ft1000_read_dpram32(ft1000dev, pos1, buf, 16); 242 - 243 - if (ret == 0) { 244 - pos2 = (indx % 4)*4; 245 - buf[pos2++] = *buffer++; 246 - buf[pos2++] = *buffer++; 247 - buf[pos2++] = *buffer++; 248 - buf[pos2++] = *buffer++; 249 - ret = ft1000_write_dpram32(ft1000dev, pos1, buf, 16); 250 - } else { 251 - pr_debug("DPRAM32 Read failed\n"); 252 - return ret; 253 - } 254 - 255 - ret = ft1000_read_dpram32(ft1000dev, pos1, (u8 *)&resultbuffer[0], 16); 256 - 257 - if (ret == 0) { 258 - buffer = pdata; 259 - for (i = 0; i < 16; i++) { 260 - if (buf[i] != resultbuffer[i]) 261 - ret = -1; 262 - } 263 - } 264 - 265 - if (ret == -1) { 266 - ret = ft1000_write_dpram32(ft1000dev, pos1, 267 - (u8 *)&tempbuffer[0], 16); 268 - ret = ft1000_read_dpram32(ft1000dev, pos1, 269 - (u8 *)&resultbuffer[0], 16); 270 - if (ret == 0) { 271 - buffer = pdata; 272 - for (i = 0; i < 16; i++) { 273 - if (tempbuffer[i] != resultbuffer[i]) { 274 - ret = -1; 275 - pr_debug("Failed to write\n"); 276 - } 277 - } 278 - } 279 - } 280 - 281 - return ret; 282 - } 283 - 284 - /* reset or activate the DSP */ 285 - static void card_reset_dsp(struct ft1000_usb *ft1000dev, bool value) 286 - { 287 - int status = 0; 288 - u16 tempword; 289 - 290 - status = ft1000_write_register(ft1000dev, HOST_INTF_BE, 291 - FT1000_REG_SUP_CTRL); 292 - status = ft1000_read_register(ft1000dev, &tempword, 293 - FT1000_REG_SUP_CTRL); 294 - 295 - if (value) { 296 - pr_debug("Reset DSP\n"); 297 - status = ft1000_read_register(ft1000dev, &tempword, 298 - FT1000_REG_RESET); 299 - tempword |= DSP_RESET_BIT; 300 - status = ft1000_write_register(ft1000dev, tempword, 301 - FT1000_REG_RESET); 302 - } else { 303 - pr_debug("Activate DSP\n"); 304 - status = ft1000_read_register(ft1000dev, &tempword, 305 - FT1000_REG_RESET); 306 - tempword |= DSP_ENCRYPTED; 307 - tempword &= ~DSP_UNENCRYPTED; 308 - status = ft1000_write_register(ft1000dev, tempword, 309 - FT1000_REG_RESET); 310 - status = ft1000_read_register(ft1000dev, &tempword, 311 - FT1000_REG_RESET); 312 - tempword &= ~EFUSE_MEM_DISABLE; 313 - tempword &= ~DSP_RESET_BIT; 314 - status = ft1000_write_register(ft1000dev, tempword, 315 - FT1000_REG_RESET); 316 - status = ft1000_read_register(ft1000dev, &tempword, 317 - FT1000_REG_RESET); 318 - } 319 - } 320 - 321 - /* send a command to ASIC 322 - * Parameters: ft1000_usb - device structure 323 - * ptempbuffer - command buffer 324 - * size - command buffer size 325 - */ 326 - int card_send_command(struct ft1000_usb *ft1000dev, void *ptempbuffer, 327 - int size) 328 - { 329 - int ret; 330 - unsigned short temp; 331 - unsigned char *commandbuf; 332 - 333 - pr_debug("enter card_send_command... size=%d\n", size); 334 - 335 - ret = ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL); 336 - if (ret) 337 - return ret; 338 - 339 - commandbuf = kmalloc(size + 2, GFP_KERNEL); 340 - if (!commandbuf) 341 - return -ENOMEM; 342 - memcpy((void *)commandbuf + 2, ptempbuffer, size); 343 - 344 - if (temp & 0x0100) 345 - usleep_range(900, 1100); 346 - 347 - /* check for odd word */ 348 - size = size + 2; 349 - 350 - /* Must force to be 32 bit aligned */ 351 - if (size % 4) 352 - size += 4 - (size % 4); 353 - 354 - ret = ft1000_write_dpram32(ft1000dev, 0, commandbuf, size); 355 - if (ret) 356 - return ret; 357 - usleep_range(900, 1100); 358 - ret = ft1000_write_register(ft1000dev, FT1000_DB_DPRAM_TX, 359 - FT1000_REG_DOORBELL); 360 - if (ret) 361 - return ret; 362 - usleep_range(900, 1100); 363 - 364 - ret = ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL); 365 - 366 - #if 0 367 - if ((temp & 0x0100) == 0) 368 - pr_debug("Message sent\n"); 369 - #endif 370 - return ret; 371 - } 372 - 373 - /* load or reload the DSP */ 374 - int dsp_reload(struct ft1000_usb *ft1000dev) 375 - { 376 - int status; 377 - u16 tempword; 378 - u32 templong; 379 - 380 - struct ft1000_info *pft1000info; 381 - 382 - pft1000info = netdev_priv(ft1000dev->net); 383 - 384 - pft1000info->CardReady = 0; 385 - 386 - /* Program Interrupt Mask register */ 387 - status = ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_SUP_IMASK); 388 - 389 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); 390 - tempword |= ASIC_RESET_BIT; 391 - status = ft1000_write_register(ft1000dev, tempword, FT1000_REG_RESET); 392 - msleep(1000); 393 - status = ft1000_read_register(ft1000dev, &tempword, FT1000_REG_RESET); 394 - pr_debug("Reset Register = 0x%x\n", tempword); 395 - 396 - /* Toggle DSP reset */ 397 - card_reset_dsp(ft1000dev, 1); 398 - msleep(1000); 399 - card_reset_dsp(ft1000dev, 0); 400 - msleep(1000); 401 - 402 - status = ft1000_write_register(ft1000dev, HOST_INTF_BE, 403 - FT1000_REG_SUP_CTRL); 404 - 405 - /* Let's check for FEFE */ 406 - status = 407 - ft1000_read_dpram32(ft1000dev, FT1000_MAG_DPRAM_FEFE_INDX, 408 - (u8 *)&templong, 4); 409 - pr_debug("templong (fefe) = 0x%8x\n", templong); 410 - 411 - /* call codeloader */ 412 - status = scram_dnldr(ft1000dev, pFileStart, FileLength); 413 - 414 - if (status != 0) 415 - return -EIO; 416 - 417 - msleep(1000); 418 - 419 - return 0; 420 - } 421 - 422 - /* call the Card Service function to reset the ASIC. */ 423 - static void ft1000_reset_asic(struct net_device *dev) 424 - { 425 - struct ft1000_info *info = netdev_priv(dev); 426 - struct ft1000_usb *ft1000dev = info->priv; 427 - u16 tempword; 428 - 429 - /* Let's use the register provided by the Magnemite ASIC to reset the 430 - * ASIC and DSP. 431 - */ 432 - ft1000_write_register(ft1000dev, DSP_RESET_BIT | ASIC_RESET_BIT, 433 - FT1000_REG_RESET); 434 - 435 - mdelay(1); 436 - 437 - /* set watermark to -1 in order to not generate an interrupt */ 438 - ft1000_write_register(ft1000dev, 0xffff, FT1000_REG_MAG_WATERMARK); 439 - 440 - /* clear interrupts */ 441 - ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR); 442 - pr_debug("interrupt status register = 0x%x\n", tempword); 443 - ft1000_write_register(ft1000dev, tempword, FT1000_REG_SUP_ISR); 444 - ft1000_read_register(ft1000dev, &tempword, FT1000_REG_SUP_ISR); 445 - pr_debug("interrupt status register = 0x%x\n", tempword); 446 - } 447 - 448 - static int ft1000_reset_card(struct net_device *dev) 449 - { 450 - struct ft1000_info *info = netdev_priv(dev); 451 - struct ft1000_usb *ft1000dev = info->priv; 452 - u16 tempword; 453 - struct prov_record *ptr; 454 - struct prov_record *tmp; 455 - 456 - ft1000dev->fCondResetPend = true; 457 - info->CardReady = 0; 458 - ft1000dev->fProvComplete = false; 459 - 460 - /* Make sure we free any memory reserve for provisioning */ 461 - list_for_each_entry_safe(ptr, tmp, &info->prov_list, list) { 462 - pr_debug("deleting provisioning record\n"); 463 - list_del(&ptr->list); 464 - kfree(ptr->pprov_data); 465 - kfree(ptr); 466 - } 467 - 468 - pr_debug("reset asic\n"); 469 - ft1000_reset_asic(dev); 470 - 471 - pr_debug("call dsp_reload\n"); 472 - dsp_reload(ft1000dev); 473 - 474 - pr_debug("dsp reload successful\n"); 475 - 476 - mdelay(10); 477 - 478 - /* Initialize DSP heartbeat area */ 479 - ft1000_write_dpram16(ft1000dev, FT1000_MAG_HI_HO, ho_mag, 480 - FT1000_MAG_HI_HO_INDX); 481 - ft1000_read_dpram16(ft1000dev, FT1000_MAG_HI_HO, (u8 *)&tempword, 482 - FT1000_MAG_HI_HO_INDX); 483 - pr_debug("hi_ho value = 0x%x\n", tempword); 484 - 485 - info->CardReady = 1; 486 - 487 - ft1000dev->fCondResetPend = false; 488 - 489 - return TRUE; 490 - } 491 - 492 - /* callback function when a urb is transmitted */ 493 - static void ft1000_usb_transmit_complete(struct urb *urb) 494 - { 495 - 496 - struct ft1000_usb *ft1000dev = urb->context; 497 - 498 - if (urb->status) 499 - pr_err("%s: TX status %d\n", ft1000dev->net->name, urb->status); 500 - 501 - netif_wake_queue(ft1000dev->net); 502 - } 503 - 504 - /* take an ethernet packet and convert it to a Flarion 505 - * packet prior to sending it to the ASIC Downlink FIFO. 506 - */ 507 - static int ft1000_copy_down_pkt(struct net_device *netdev, u8 *packet, u16 len) 508 - { 509 - struct ft1000_info *pInfo = netdev_priv(netdev); 510 - struct ft1000_usb *pFt1000Dev = pInfo->priv; 511 - 512 - int count, ret; 513 - u8 *t; 514 - struct pseudo_hdr hdr; 515 - 516 - if (!pInfo->CardReady) { 517 - pr_debug("Card Not Ready\n"); 518 - return -ENODEV; 519 - } 520 - 521 - count = sizeof(struct pseudo_hdr) + len; 522 - if (count > MAX_BUF_SIZE) { 523 - pr_debug("Message Size Overflow! size = %d\n", count); 524 - return -EINVAL; 525 - } 526 - 527 - if (count % 4) 528 - count = count + (4 - (count % 4)); 529 - 530 - memset(&hdr, 0, sizeof(struct pseudo_hdr)); 531 - 532 - hdr.length = ntohs(count); 533 - hdr.source = 0x10; 534 - hdr.destination = 0x20; 535 - hdr.portdest = 0x20; 536 - hdr.portsrc = 0x10; 537 - hdr.sh_str_id = 0x91; 538 - hdr.control = 0x00; 539 - 540 - hdr.checksum = hdr.length ^ hdr.source ^ hdr.destination ^ 541 - hdr.portdest ^ hdr.portsrc ^ hdr.sh_str_id ^ hdr.control; 542 - 543 - memcpy(&pFt1000Dev->tx_buf[0], &hdr, sizeof(hdr)); 544 - memcpy(&pFt1000Dev->tx_buf[sizeof(struct pseudo_hdr)], packet, len); 545 - 546 - netif_stop_queue(netdev); 547 - 548 - usb_fill_bulk_urb(pFt1000Dev->tx_urb, 549 - pFt1000Dev->dev, 550 - usb_sndbulkpipe(pFt1000Dev->dev, 551 - pFt1000Dev->bulk_out_endpointAddr), 552 - pFt1000Dev->tx_buf, count, 553 - ft1000_usb_transmit_complete, pFt1000Dev); 554 - 555 - t = (u8 *)pFt1000Dev->tx_urb->transfer_buffer; 556 - 557 - ret = usb_submit_urb(pFt1000Dev->tx_urb, GFP_ATOMIC); 558 - 559 - if (ret) { 560 - pr_debug("failed tx_urb %d\n", ret); 561 - return ret; 562 - } 563 - pInfo->stats.tx_packets++; 564 - pInfo->stats.tx_bytes += (len + 14); 565 - 566 - return 0; 567 - } 568 - 569 - /* transmit an ethernet packet 570 - * Parameters: skb - socket buffer to be sent 571 - * dev - network device 572 - */ 573 - static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) 574 - { 575 - struct ft1000_info *pInfo = netdev_priv(dev); 576 - struct ft1000_usb *pFt1000Dev = pInfo->priv; 577 - u8 *pdata; 578 - int maxlen, pipe; 579 - 580 - if (skb == NULL) { 581 - pr_debug("skb == NULL!!!\n"); 582 - return NETDEV_TX_OK; 583 - } 584 - 585 - if (pFt1000Dev->status & FT1000_STATUS_CLOSING) { 586 - pr_debug("network driver is closed, return\n"); 587 - goto err; 588 - } 589 - 590 - pipe = usb_sndbulkpipe(pFt1000Dev->dev, 591 - pFt1000Dev->bulk_out_endpointAddr); 592 - maxlen = usb_maxpacket(pFt1000Dev->dev, pipe, usb_pipeout(pipe)); 593 - 594 - pdata = (u8 *)skb->data; 595 - 596 - if (pInfo->mediastate == 0) { 597 - /* Drop packet is mediastate is down */ 598 - pr_debug("mediastate is down\n"); 599 - goto err; 600 - } 601 - 602 - if ((skb->len < ENET_HEADER_SIZE) || (skb->len > ENET_MAX_SIZE)) { 603 - /* Drop packet which has invalid size */ 604 - pr_debug("invalid ethernet length\n"); 605 - goto err; 606 - } 607 - 608 - ft1000_copy_down_pkt(dev, pdata + ENET_HEADER_SIZE - 2, 609 - skb->len - ENET_HEADER_SIZE + 2); 610 - 611 - err: 612 - dev_kfree_skb(skb); 613 - 614 - return NETDEV_TX_OK; 615 - } 616 - 617 - /* open the network driver */ 618 - static int ft1000_open(struct net_device *dev) 619 - { 620 - struct ft1000_info *pInfo = netdev_priv(dev); 621 - struct ft1000_usb *pFt1000Dev = pInfo->priv; 622 - struct timeval tv; 623 - 624 - pr_debug("ft1000_open is called for card %d\n", pFt1000Dev->CardNumber); 625 - 626 - pInfo->stats.rx_bytes = 0; 627 - pInfo->stats.tx_bytes = 0; 628 - pInfo->stats.rx_packets = 0; 629 - pInfo->stats.tx_packets = 0; 630 - do_gettimeofday(&tv); 631 - pInfo->ConTm = tv.tv_sec; 632 - pInfo->ProgConStat = 0; 633 - 634 - netif_start_queue(dev); 635 - 636 - netif_carrier_on(dev); 637 - 638 - return ft1000_submit_rx_urb(pInfo); 639 - } 640 - 641 - static struct net_device_stats *ft1000_netdev_stats(struct net_device *dev) 642 - { 643 - struct ft1000_info *info = netdev_priv(dev); 644 - 645 - return &(info->stats); 646 - } 647 - 648 - static const struct net_device_ops ftnet_ops = { 649 - .ndo_open = &ft1000_open, 650 - .ndo_stop = &ft1000_close, 651 - .ndo_start_xmit = &ft1000_start_xmit, 652 - .ndo_get_stats = &ft1000_netdev_stats, 653 - }; 654 - 655 - /* initialize the network device */ 656 - static int ft1000_reset(void *dev) 657 - { 658 - ft1000_reset_card(dev); 659 - return 0; 660 - } 661 - 662 - int init_ft1000_netdev(struct ft1000_usb *ft1000dev) 663 - { 664 - struct net_device *netdev; 665 - struct ft1000_info *pInfo = NULL; 666 - struct dpram_blk *pdpram_blk; 667 - int i, ret_val; 668 - struct list_head *cur, *tmp; 669 - char card_nr[2]; 670 - u8 gCardIndex = 0; 671 - 672 - netdev = alloc_etherdev(sizeof(struct ft1000_info)); 673 - if (!netdev) { 674 - pr_debug("can not allocate network device\n"); 675 - return -ENOMEM; 676 - } 677 - 678 - pInfo = netdev_priv(netdev); 679 - 680 - memset(pInfo, 0, sizeof(struct ft1000_info)); 681 - 682 - dev_alloc_name(netdev, netdev->name); 683 - 684 - pr_debug("network device name is %s\n", netdev->name); 685 - 686 - if (strncmp(netdev->name, "eth", 3) == 0) { 687 - card_nr[0] = netdev->name[3]; 688 - card_nr[1] = '\0'; 689 - ret_val = kstrtou8(card_nr, 10, &gCardIndex); 690 - if (ret_val) { 691 - netdev_err(ft1000dev->net, "Can't parse netdev\n"); 692 - goto err_net; 693 - } 694 - 695 - ft1000dev->CardNumber = gCardIndex; 696 - pr_debug("card number = %d\n", ft1000dev->CardNumber); 697 - } else { 698 - netdev_err(ft1000dev->net, "ft1000: Invalid device name\n"); 699 - ret_val = -ENXIO; 700 - goto err_net; 701 - } 702 - 703 - memset(&pInfo->stats, 0, sizeof(struct net_device_stats)); 704 - 705 - spin_lock_init(&pInfo->dpram_lock); 706 - pInfo->priv = ft1000dev; 707 - pInfo->DrvErrNum = 0; 708 - pInfo->registered = 1; 709 - pInfo->ft1000_reset = ft1000_reset; 710 - pInfo->mediastate = 0; 711 - pInfo->fifo_cnt = 0; 712 - ft1000dev->DeviceCreated = FALSE; 713 - pInfo->CardReady = 0; 714 - pInfo->DSP_TIME[0] = 0; 715 - pInfo->DSP_TIME[1] = 0; 716 - pInfo->DSP_TIME[2] = 0; 717 - pInfo->DSP_TIME[3] = 0; 718 - ft1000dev->fAppMsgPend = false; 719 - ft1000dev->fCondResetPend = false; 720 - ft1000dev->usbboot = 0; 721 - ft1000dev->dspalive = 0; 722 - memset(&ft1000dev->tempbuf[0], 0, sizeof(ft1000dev->tempbuf)); 723 - 724 - INIT_LIST_HEAD(&pInfo->prov_list); 725 - 726 - INIT_LIST_HEAD(&ft1000dev->nodes.list); 727 - 728 - netdev->netdev_ops = &ftnet_ops; 729 - 730 - ft1000dev->net = netdev; 731 - 732 - pr_debug("Initialize free_buff_lock and freercvpool\n"); 733 - spin_lock_init(&free_buff_lock); 734 - 735 - /* initialize a list of buffers to be use for queuing 736 - * up receive command data 737 - */ 738 - INIT_LIST_HEAD(&freercvpool); 739 - 740 - /* create list of free buffers */ 741 - for (i = 0; i < NUM_OF_FREE_BUFFERS; i++) { 742 - /* Get memory for DPRAM_DATA link list */ 743 - pdpram_blk = kmalloc(sizeof(struct dpram_blk), GFP_KERNEL); 744 - if (pdpram_blk == NULL) { 745 - ret_val = -ENOMEM; 746 - goto err_free; 747 - } 748 - /* Get a block of memory to store command data */ 749 - pdpram_blk->pbuffer = kmalloc(MAX_CMD_SQSIZE, GFP_KERNEL); 750 - if (pdpram_blk->pbuffer == NULL) { 751 - ret_val = -ENOMEM; 752 - kfree(pdpram_blk); 753 - goto err_free; 754 - } 755 - /* link provisioning data */ 756 - list_add_tail(&pdpram_blk->list, &freercvpool); 757 - } 758 - numofmsgbuf = NUM_OF_FREE_BUFFERS; 759 - 760 - return 0; 761 - 762 - err_free: 763 - list_for_each_safe(cur, tmp, &freercvpool) { 764 - pdpram_blk = list_entry(cur, struct dpram_blk, list); 765 - list_del(&pdpram_blk->list); 766 - kfree(pdpram_blk->pbuffer); 767 - kfree(pdpram_blk); 768 - } 769 - err_net: 770 - free_netdev(netdev); 771 - return ret_val; 772 - } 773 - 774 - /* register the network driver */ 775 - int reg_ft1000_netdev(struct ft1000_usb *ft1000dev, 776 - struct usb_interface *intf) 777 - { 778 - struct net_device *netdev; 779 - struct ft1000_info *pInfo; 780 - int rc; 781 - 782 - netdev = ft1000dev->net; 783 - pInfo = netdev_priv(ft1000dev->net); 784 - 785 - ft1000_read_register(ft1000dev, &pInfo->AsicID, FT1000_REG_ASIC_ID); 786 - 787 - usb_set_intfdata(intf, pInfo); 788 - SET_NETDEV_DEV(netdev, &intf->dev); 789 - 790 - rc = register_netdev(netdev); 791 - if (rc) { 792 - pr_debug("could not register network device\n"); 793 - free_netdev(netdev); 794 - return rc; 795 - } 796 - 797 - ft1000_create_dev(ft1000dev); 798 - 799 - pInfo->CardReady = 1; 800 - 801 - return 0; 802 - } 803 - 804 - /* take a packet from the FIFO up link and 805 - * convert it into an ethernet packet and deliver it to the IP stack 806 - */ 807 - static int ft1000_copy_up_pkt(struct urb *urb) 808 - { 809 - struct ft1000_info *info = urb->context; 810 - struct ft1000_usb *ft1000dev = info->priv; 811 - struct net_device *net = ft1000dev->net; 812 - 813 - u16 tempword; 814 - u16 len; 815 - u16 lena; 816 - struct sk_buff *skb; 817 - u16 i; 818 - u8 *pbuffer = NULL; 819 - u8 *ptemp = NULL; 820 - u16 *chksum; 821 - 822 - if (ft1000dev->status & FT1000_STATUS_CLOSING) { 823 - pr_debug("network driver is closed, return\n"); 824 - return 0; 825 - } 826 - /* Read length */ 827 - len = urb->transfer_buffer_length; 828 - lena = urb->actual_length; 829 - 830 - chksum = (u16 *)ft1000dev->rx_buf; 831 - 832 - tempword = *chksum++; 833 - for (i = 1; i < 7; i++) 834 - tempword ^= *chksum++; 835 - 836 - if (tempword != *chksum) { 837 - info->stats.rx_errors++; 838 - ft1000_submit_rx_urb(info); 839 - return -1; 840 - } 841 - 842 - skb = dev_alloc_skb(len + 12 + 2); 843 - 844 - if (skb == NULL) { 845 - info->stats.rx_errors++; 846 - ft1000_submit_rx_urb(info); 847 - return -1; 848 - } 849 - 850 - pbuffer = (u8 *)skb_put(skb, len + 12); 851 - 852 - /* subtract the number of bytes read already */ 853 - ptemp = pbuffer; 854 - 855 - /* fake MAC address */ 856 - *pbuffer++ = net->dev_addr[0]; 857 - *pbuffer++ = net->dev_addr[1]; 858 - *pbuffer++ = net->dev_addr[2]; 859 - *pbuffer++ = net->dev_addr[3]; 860 - *pbuffer++ = net->dev_addr[4]; 861 - *pbuffer++ = net->dev_addr[5]; 862 - *pbuffer++ = 0x00; 863 - *pbuffer++ = 0x07; 864 - *pbuffer++ = 0x35; 865 - *pbuffer++ = 0xff; 866 - *pbuffer++ = 0xff; 867 - *pbuffer++ = 0xfe; 868 - 869 - memcpy(pbuffer, ft1000dev->rx_buf + sizeof(struct pseudo_hdr), 870 - len - sizeof(struct pseudo_hdr)); 871 - 872 - skb->dev = net; 873 - 874 - skb->protocol = eth_type_trans(skb, net); 875 - skb->ip_summed = CHECKSUM_UNNECESSARY; 876 - netif_rx(skb); 877 - 878 - info->stats.rx_packets++; 879 - /* Add on 12 bytes for MAC address which was removed */ 880 - info->stats.rx_bytes += (lena + 12); 881 - 882 - ft1000_submit_rx_urb(info); 883 - 884 - return 0; 885 - } 886 - 887 - 888 - /* the receiving function of the network driver */ 889 - static int ft1000_submit_rx_urb(struct ft1000_info *info) 890 - { 891 - int result; 892 - struct ft1000_usb *pFt1000Dev = info->priv; 893 - 894 - if (pFt1000Dev->status & FT1000_STATUS_CLOSING) { 895 - pr_debug("network driver is closed, return\n"); 896 - return -ENODEV; 897 - } 898 - 899 - usb_fill_bulk_urb(pFt1000Dev->rx_urb, 900 - pFt1000Dev->dev, 901 - usb_rcvbulkpipe(pFt1000Dev->dev, 902 - pFt1000Dev->bulk_in_endpointAddr), 903 - pFt1000Dev->rx_buf, MAX_BUF_SIZE, 904 - (usb_complete_t)ft1000_copy_up_pkt, info); 905 - 906 - result = usb_submit_urb(pFt1000Dev->rx_urb, GFP_ATOMIC); 907 - 908 - if (result) { 909 - pr_err("submitting rx_urb %d failed\n", result); 910 - return result; 911 - } 912 - 913 - return 0; 914 - } 915 - 916 - /* close the network driver */ 917 - int ft1000_close(struct net_device *net) 918 - { 919 - struct ft1000_info *pInfo = netdev_priv(net); 920 - struct ft1000_usb *ft1000dev = pInfo->priv; 921 - 922 - ft1000dev->status |= FT1000_STATUS_CLOSING; 923 - 924 - pr_debug("pInfo=%p, ft1000dev=%p\n", pInfo, ft1000dev); 925 - netif_carrier_off(net); 926 - netif_stop_queue(net); 927 - ft1000dev->status &= ~FT1000_STATUS_CLOSING; 928 - 929 - pInfo->ProgConStat = 0xff; 930 - 931 - return 0; 932 - } 933 - 934 - /* check if the device is presently available on the system. */ 935 - static int ft1000_chkcard(struct ft1000_usb *dev) 936 - { 937 - u16 tempword; 938 - int status; 939 - 940 - if (dev->fCondResetPend) { 941 - pr_debug("Card is being reset, return FALSE\n"); 942 - return TRUE; 943 - } 944 - /* Mask register is used to check for device presence since it is never 945 - * set to zero. 946 - */ 947 - status = ft1000_read_register(dev, &tempword, FT1000_REG_SUP_IMASK); 948 - if (tempword == 0) { 949 - pr_debug("IMASK = 0 Card not detected\n"); 950 - return FALSE; 951 - } 952 - /* The system will return the value of 0xffff for the version register 953 - * if the device is not present. 954 - */ 955 - status = ft1000_read_register(dev, &tempword, FT1000_REG_ASIC_ID); 956 - if (tempword != 0x1b01) { 957 - dev->status |= FT1000_STATUS_CLOSING; 958 - pr_debug("Version = 0xffff Card not detected\n"); 959 - return FALSE; 960 - } 961 - return TRUE; 962 - } 963 - 964 - /* read a message from the dpram area. 965 - * Input: 966 - * dev - network device structure 967 - * pbuffer - caller supply address to buffer 968 - */ 969 - static bool ft1000_receive_cmd(struct ft1000_usb *dev, u16 *pbuffer, 970 - int maxsz) 971 - { 972 - u16 size; 973 - int ret; 974 - u16 *ppseudohdr; 975 - int i; 976 - u16 tempword; 977 - 978 - ret = 979 - ft1000_read_dpram16(dev, FT1000_MAG_PH_LEN, (u8 *)&size, 980 - FT1000_MAG_PH_LEN_INDX); 981 - size = ntohs(size) + PSEUDOSZ; 982 - if (size > maxsz) { 983 - pr_debug("Invalid command length = %d\n", size); 984 - return FALSE; 985 - } 986 - ppseudohdr = (u16 *)pbuffer; 987 - ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE, 988 - FT1000_REG_DPRAM_ADDR); 989 - ret = 990 - ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH); 991 - pbuffer++; 992 - ft1000_write_register(dev, FT1000_DPRAM_MAG_RX_BASE + 1, 993 - FT1000_REG_DPRAM_ADDR); 994 - for (i = 0; i <= (size >> 2); i++) { 995 - ret = 996 - ft1000_read_register(dev, pbuffer, 997 - FT1000_REG_MAG_DPDATAL); 998 - pbuffer++; 999 - ret = 1000 - ft1000_read_register(dev, pbuffer, 1001 - FT1000_REG_MAG_DPDATAH); 1002 - pbuffer++; 1003 - } 1004 - /* copy odd aligned word */ 1005 - ret = 1006 - ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAL); 1007 - 1008 - pbuffer++; 1009 - ret = 1010 - ft1000_read_register(dev, pbuffer, FT1000_REG_MAG_DPDATAH); 1011 - 1012 - pbuffer++; 1013 - if (size & 0x0001) { 1014 - /* copy odd byte from fifo */ 1015 - ret = 1016 - ft1000_read_register(dev, &tempword, 1017 - FT1000_REG_DPRAM_DATA); 1018 - *pbuffer = ntohs(tempword); 1019 - } 1020 - /* Check if pseudo header checksum is good 1021 - * Calculate pseudo header checksum 1022 - */ 1023 - tempword = *ppseudohdr++; 1024 - for (i = 1; i < 7; i++) 1025 - tempword ^= *ppseudohdr++; 1026 - 1027 - if (tempword != *ppseudohdr) 1028 - return FALSE; 1029 - 1030 - return TRUE; 1031 - } 1032 - 1033 - static int ft1000_dsp_prov(void *arg) 1034 - { 1035 - struct ft1000_usb *dev = (struct ft1000_usb *)arg; 1036 - struct ft1000_info *info = netdev_priv(dev->net); 1037 - u16 tempword; 1038 - u16 len; 1039 - u16 i = 0; 1040 - struct prov_record *ptr; 1041 - struct pseudo_hdr *ppseudo_hdr; 1042 - u16 *pmsg; 1043 - int status; 1044 - u16 TempShortBuf[256]; 1045 - 1046 - while (list_empty(&info->prov_list) == 0) { 1047 - pr_debug("DSP Provisioning List Entry\n"); 1048 - 1049 - /* Check if doorbell is available */ 1050 - pr_debug("check if doorbell is cleared\n"); 1051 - status = ft1000_read_register(dev, &tempword, 1052 - FT1000_REG_DOORBELL); 1053 - if (status) { 1054 - pr_debug("ft1000_read_register error\n"); 1055 - break; 1056 - } 1057 - 1058 - while (tempword & FT1000_DB_DPRAM_TX) { 1059 - mdelay(10); 1060 - i++; 1061 - if (i == 10) { 1062 - pr_debug("message drop\n"); 1063 - return -1; 1064 - } 1065 - ft1000_read_register(dev, &tempword, 1066 - FT1000_REG_DOORBELL); 1067 - } 1068 - 1069 - if (!(tempword & FT1000_DB_DPRAM_TX)) { 1070 - pr_debug("*** Provision Data Sent to DSP\n"); 1071 - 1072 - /* Send provisioning data */ 1073 - ptr = list_entry(info->prov_list.next, 1074 - struct prov_record, list); 1075 - len = *(u16 *)ptr->pprov_data; 1076 - len = htons(len); 1077 - len += PSEUDOSZ; 1078 - 1079 - pmsg = (u16 *)ptr->pprov_data; 1080 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 1081 - /* Insert slow queue sequence number */ 1082 - ppseudo_hdr->seq_num = info->squeseqnum++; 1083 - ppseudo_hdr->portsrc = 0; 1084 - /* Calculate new checksum */ 1085 - ppseudo_hdr->checksum = *pmsg++; 1086 - for (i = 1; i < 7; i++) 1087 - ppseudo_hdr->checksum ^= *pmsg++; 1088 - 1089 - TempShortBuf[0] = 0; 1090 - TempShortBuf[1] = htons(len); 1091 - memcpy(&TempShortBuf[2], ppseudo_hdr, len); 1092 - 1093 - status = 1094 - ft1000_write_dpram32(dev, 0, 1095 - (u8 *)&TempShortBuf[0], 1096 - (unsigned short)(len + 2)); 1097 - status = 1098 - ft1000_write_register(dev, FT1000_DB_DPRAM_TX, 1099 - FT1000_REG_DOORBELL); 1100 - 1101 - list_del(&ptr->list); 1102 - kfree(ptr->pprov_data); 1103 - kfree(ptr); 1104 - } 1105 - usleep_range(9000, 11000); 1106 - } 1107 - 1108 - pr_debug("DSP Provisioning List Entry finished\n"); 1109 - 1110 - msleep(100); 1111 - 1112 - dev->fProvComplete = true; 1113 - info->CardReady = 1; 1114 - 1115 - return 0; 1116 - } 1117 - 1118 - static int ft1000_proc_drvmsg(struct ft1000_usb *dev, u16 size) 1119 - { 1120 - struct ft1000_info *info = netdev_priv(dev->net); 1121 - u16 msgtype; 1122 - u16 tempword; 1123 - struct media_msg *pmediamsg; 1124 - struct dsp_init_msg *pdspinitmsg; 1125 - struct drv_msg *pdrvmsg; 1126 - u16 i; 1127 - struct pseudo_hdr *ppseudo_hdr; 1128 - u16 *pmsg; 1129 - int status; 1130 - union { 1131 - u8 byte[2]; 1132 - u16 wrd; 1133 - } convert; 1134 - 1135 - char *cmdbuffer = kmalloc(1600, GFP_KERNEL); 1136 - 1137 - if (!cmdbuffer) 1138 - return -ENOMEM; 1139 - 1140 - status = ft1000_read_dpram32(dev, 0x200, cmdbuffer, size); 1141 - 1142 - #ifdef JDEBUG 1143 - print_hex_dump_debug("cmdbuffer: ", HEX_DUMP_OFFSET, 16, 1, 1144 - cmdbuffer, size, true); 1145 - #endif 1146 - pdrvmsg = (struct drv_msg *)&cmdbuffer[2]; 1147 - msgtype = ntohs(pdrvmsg->type); 1148 - pr_debug("Command message type = 0x%x\n", msgtype); 1149 - switch (msgtype) { 1150 - case MEDIA_STATE:{ 1151 - pr_debug("Command message type = MEDIA_STATE\n"); 1152 - pmediamsg = (struct media_msg *)&cmdbuffer[0]; 1153 - if (info->ProgConStat != 0xFF) { 1154 - if (pmediamsg->state) { 1155 - pr_debug("Media is up\n"); 1156 - if (info->mediastate == 0) { 1157 - if (dev->NetDevRegDone) 1158 - netif_wake_queue(dev->net); 1159 - info->mediastate = 1; 1160 - } 1161 - } else { 1162 - pr_debug("Media is down\n"); 1163 - if (info->mediastate == 1) { 1164 - info->mediastate = 0; 1165 - if (dev->NetDevRegDone) 1166 - info->ConTm = 0; 1167 - } 1168 - } 1169 - } else { 1170 - pr_debug("Media is down\n"); 1171 - if (info->mediastate == 1) { 1172 - info->mediastate = 0; 1173 - info->ConTm = 0; 1174 - } 1175 - } 1176 - break; 1177 - } 1178 - case DSP_INIT_MSG:{ 1179 - pr_debug("Command message type = DSP_INIT_MSG\n"); 1180 - pdspinitmsg = (struct dsp_init_msg *)&cmdbuffer[2]; 1181 - memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); 1182 - pr_debug("DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", 1183 - info->DspVer[0], info->DspVer[1], info->DspVer[2], 1184 - info->DspVer[3]); 1185 - memcpy(info->HwSerNum, pdspinitmsg->HwSerNum, 1186 - HWSERNUMSZ); 1187 - memcpy(info->Sku, pdspinitmsg->Sku, SKUSZ); 1188 - memcpy(info->eui64, pdspinitmsg->eui64, EUISZ); 1189 - pr_debug("EUI64=%2x.%2x.%2x.%2x.%2x.%2x.%2x.%2x\n", 1190 - info->eui64[0], info->eui64[1], info->eui64[2], 1191 - info->eui64[3], info->eui64[4], info->eui64[5], 1192 - info->eui64[6], info->eui64[7]); 1193 - dev->net->dev_addr[0] = info->eui64[0]; 1194 - dev->net->dev_addr[1] = info->eui64[1]; 1195 - dev->net->dev_addr[2] = info->eui64[2]; 1196 - dev->net->dev_addr[3] = info->eui64[5]; 1197 - dev->net->dev_addr[4] = info->eui64[6]; 1198 - dev->net->dev_addr[5] = info->eui64[7]; 1199 - 1200 - if (ntohs(pdspinitmsg->length) == 1201 - (sizeof(struct dsp_init_msg) - 20)) { 1202 - memcpy(info->ProductMode, pdspinitmsg->ProductMode, 1203 - MODESZ); 1204 - memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, CALVERSZ); 1205 - memcpy(info->RfCalDate, pdspinitmsg->RfCalDate, 1206 - CALDATESZ); 1207 - pr_debug("RFCalVer = 0x%2x 0x%2x\n", 1208 - info->RfCalVer[0], info->RfCalVer[1]); 1209 - } 1210 - break; 1211 - } 1212 - case DSP_PROVISION:{ 1213 - pr_debug("Command message type = DSP_PROVISION\n"); 1214 - 1215 - /* kick off dspprov routine to start provisioning 1216 - * Send provisioning data to DSP 1217 - */ 1218 - if (list_empty(&info->prov_list) == 0) { 1219 - dev->fProvComplete = false; 1220 - status = ft1000_dsp_prov(dev); 1221 - if (status != 0) 1222 - goto out; 1223 - } else { 1224 - dev->fProvComplete = true; 1225 - status = ft1000_write_register(dev, FT1000_DB_HB, 1226 - FT1000_REG_DOORBELL); 1227 - pr_debug("No more DSP provisioning data in dsp image\n"); 1228 - } 1229 - pr_debug("DSP PROVISION is done\n"); 1230 - break; 1231 - } 1232 - case DSP_STORE_INFO:{ 1233 - pr_debug("Command message type = DSP_STORE_INFO"); 1234 - tempword = ntohs(pdrvmsg->length); 1235 - info->DSPInfoBlklen = tempword; 1236 - if (tempword < (MAX_DSP_SESS_REC - 4)) { 1237 - pmsg = (u16 *)&pdrvmsg->data[0]; 1238 - for (i = 0; i < ((tempword + 1) / 2); i++) { 1239 - pr_debug("dsp info data = 0x%x\n", *pmsg); 1240 - info->DSPInfoBlk[i + 10] = *pmsg++; 1241 - } 1242 - } else { 1243 - info->DSPInfoBlklen = 0; 1244 - } 1245 - break; 1246 - } 1247 - case DSP_GET_INFO:{ 1248 - pr_debug("Got DSP_GET_INFO\n"); 1249 - /* copy dsp info block to dsp */ 1250 - dev->DrvMsgPend = 1; 1251 - /* allow any outstanding ioctl to finish */ 1252 - mdelay(10); 1253 - status = ft1000_read_register(dev, &tempword, 1254 - FT1000_REG_DOORBELL); 1255 - if (tempword & FT1000_DB_DPRAM_TX) { 1256 - mdelay(10); 1257 - status = ft1000_read_register(dev, &tempword, 1258 - FT1000_REG_DOORBELL); 1259 - if (tempword & FT1000_DB_DPRAM_TX) { 1260 - mdelay(10); 1261 - status = ft1000_read_register(dev, &tempword, 1262 - FT1000_REG_DOORBELL); 1263 - if (tempword & FT1000_DB_DPRAM_TX) 1264 - break; 1265 - } 1266 - } 1267 - /* Put message into Slow Queue Form Pseudo header */ 1268 - pmsg = (u16 *)info->DSPInfoBlk; 1269 - *pmsg++ = 0; 1270 - *pmsg++ = htons(info->DSPInfoBlklen + 20 + info->DSPInfoBlklen); 1271 - ppseudo_hdr = 1272 - (struct pseudo_hdr *)(u16 *)&info->DSPInfoBlk[2]; 1273 - ppseudo_hdr->length = htons(info->DSPInfoBlklen + 4 1274 - + info->DSPInfoBlklen); 1275 - ppseudo_hdr->source = 0x10; 1276 - ppseudo_hdr->destination = 0x20; 1277 - ppseudo_hdr->portdest = 0; 1278 - ppseudo_hdr->portsrc = 0; 1279 - ppseudo_hdr->sh_str_id = 0; 1280 - ppseudo_hdr->control = 0; 1281 - ppseudo_hdr->rsvd1 = 0; 1282 - ppseudo_hdr->rsvd2 = 0; 1283 - ppseudo_hdr->qos_class = 0; 1284 - /* Insert slow queue sequence number */ 1285 - ppseudo_hdr->seq_num = info->squeseqnum++; 1286 - /* Insert application id */ 1287 - ppseudo_hdr->portsrc = 0; 1288 - /* Calculate new checksum */ 1289 - ppseudo_hdr->checksum = *pmsg++; 1290 - for (i = 1; i < 7; i++) 1291 - ppseudo_hdr->checksum ^= *pmsg++; 1292 - 1293 - info->DSPInfoBlk[10] = 0x7200; 1294 - info->DSPInfoBlk[11] = htons(info->DSPInfoBlklen); 1295 - status = ft1000_write_dpram32(dev, 0, 1296 - (u8 *)&info->DSPInfoBlk[0], 1297 - (unsigned short)(info->DSPInfoBlklen + 22)); 1298 - status = ft1000_write_register(dev, FT1000_DB_DPRAM_TX, 1299 - FT1000_REG_DOORBELL); 1300 - dev->DrvMsgPend = 0; 1301 - break; 1302 - } 1303 - case GET_DRV_ERR_RPT_MSG:{ 1304 - pr_debug("Got GET_DRV_ERR_RPT_MSG\n"); 1305 - /* copy driver error message to dsp */ 1306 - dev->DrvMsgPend = 1; 1307 - /* allow any outstanding ioctl to finish */ 1308 - mdelay(10); 1309 - status = ft1000_read_register(dev, &tempword, 1310 - FT1000_REG_DOORBELL); 1311 - if (tempword & FT1000_DB_DPRAM_TX) { 1312 - mdelay(10); 1313 - status = ft1000_read_register(dev, &tempword, 1314 - FT1000_REG_DOORBELL); 1315 - if (tempword & FT1000_DB_DPRAM_TX) 1316 - mdelay(10); 1317 - } 1318 - if ((tempword & FT1000_DB_DPRAM_TX) == 0) { 1319 - /* Put message into Slow Queue Form Pseudo header */ 1320 - pmsg = (u16 *)&tempbuffer[0]; 1321 - ppseudo_hdr = (struct pseudo_hdr *)pmsg; 1322 - ppseudo_hdr->length = htons(0x0012); 1323 - ppseudo_hdr->source = 0x10; 1324 - ppseudo_hdr->destination = 0x20; 1325 - ppseudo_hdr->portdest = 0; 1326 - ppseudo_hdr->portsrc = 0; 1327 - ppseudo_hdr->sh_str_id = 0; 1328 - ppseudo_hdr->control = 0; 1329 - ppseudo_hdr->rsvd1 = 0; 1330 - ppseudo_hdr->rsvd2 = 0; 1331 - ppseudo_hdr->qos_class = 0; 1332 - /* Insert slow queue sequence number */ 1333 - ppseudo_hdr->seq_num = info->squeseqnum++; 1334 - /* Insert application id */ 1335 - ppseudo_hdr->portsrc = 0; 1336 - /* Calculate new checksum */ 1337 - ppseudo_hdr->checksum = *pmsg++; 1338 - for (i = 1; i < 7; i++) 1339 - ppseudo_hdr->checksum ^= *pmsg++; 1340 - 1341 - pmsg = (u16 *)&tempbuffer[16]; 1342 - *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); 1343 - *pmsg++ = htons(0x000e); 1344 - *pmsg++ = htons(info->DSP_TIME[0]); 1345 - *pmsg++ = htons(info->DSP_TIME[1]); 1346 - *pmsg++ = htons(info->DSP_TIME[2]); 1347 - *pmsg++ = htons(info->DSP_TIME[3]); 1348 - convert.byte[0] = info->DspVer[0]; 1349 - convert.byte[1] = info->DspVer[1]; 1350 - *pmsg++ = convert.wrd; 1351 - convert.byte[0] = info->DspVer[2]; 1352 - convert.byte[1] = info->DspVer[3]; 1353 - *pmsg++ = convert.wrd; 1354 - *pmsg++ = htons(info->DrvErrNum); 1355 - 1356 - status = card_send_command(dev, 1357 - (unsigned char *)&tempbuffer[0], 1358 - (u16)(0x0012 + PSEUDOSZ)); 1359 - if (status) 1360 - goto out; 1361 - info->DrvErrNum = 0; 1362 - } 1363 - dev->DrvMsgPend = 0; 1364 - break; 1365 - } 1366 - default: 1367 - break; 1368 - } 1369 - 1370 - status = 0; 1371 - out: 1372 - kfree(cmdbuffer); 1373 - return status; 1374 - } 1375 - 1376 - /* Check which application has registered for dsp broadcast messages */ 1377 - static int dsp_broadcast_msg_id(struct ft1000_usb *dev) 1378 - { 1379 - struct dpram_blk *pdpram_blk; 1380 - unsigned long flags; 1381 - int i; 1382 - 1383 - for (i = 0; i < MAX_NUM_APP; i++) { 1384 - if ((dev->app_info[i].DspBCMsgFlag) 1385 - && (dev->app_info[i].fileobject) 1386 - && (dev->app_info[i].NumOfMsg 1387 - < MAX_MSG_LIMIT)) { 1388 - pdpram_blk = ft1000_get_buffer(&freercvpool); 1389 - if (pdpram_blk == NULL) { 1390 - pr_debug("Out of memory in free receive command pool\n"); 1391 - dev->app_info[i].nRxMsgMiss++; 1392 - return -1; 1393 - } 1394 - if (ft1000_receive_cmd(dev, pdpram_blk->pbuffer, 1395 - MAX_CMD_SQSIZE)) { 1396 - /* Put message into the 1397 - * appropriate application block 1398 - */ 1399 - dev->app_info[i].nRxMsg++; 1400 - spin_lock_irqsave(&free_buff_lock, flags); 1401 - list_add_tail(&pdpram_blk->list, 1402 - &dev->app_info[i] .app_sqlist); 1403 - dev->app_info[i].NumOfMsg++; 1404 - spin_unlock_irqrestore(&free_buff_lock, flags); 1405 - wake_up_interruptible(&dev->app_info[i] 1406 - .wait_dpram_msg); 1407 - } else { 1408 - dev->app_info[i].nRxMsgMiss++; 1409 - ft1000_free_buffer(pdpram_blk, &freercvpool); 1410 - pr_debug("ft1000_get_buffer NULL\n"); 1411 - return -1; 1412 - } 1413 - } 1414 - } 1415 - return 0; 1416 - } 1417 - 1418 - static int handle_misc_portid(struct ft1000_usb *dev) 1419 - { 1420 - struct dpram_blk *pdpram_blk; 1421 - int i; 1422 - 1423 - pdpram_blk = ft1000_get_buffer(&freercvpool); 1424 - if (pdpram_blk == NULL) { 1425 - pr_debug("Out of memory in free receive command pool\n"); 1426 - return -1; 1427 - } 1428 - if (!ft1000_receive_cmd(dev, pdpram_blk->pbuffer, MAX_CMD_SQSIZE)) 1429 - goto exit_failure; 1430 - 1431 - /* Search for correct application block */ 1432 - for (i = 0; i < MAX_NUM_APP; i++) { 1433 - if (dev->app_info[i].app_id == ((struct pseudo_hdr *) 1434 - pdpram_blk->pbuffer)->portdest) 1435 - break; 1436 - } 1437 - if (i == MAX_NUM_APP) { 1438 - pr_debug("No application matching id = %d\n", 1439 - ((struct pseudo_hdr *)pdpram_blk->pbuffer)->portdest); 1440 - goto exit_failure; 1441 - } else if (dev->app_info[i].NumOfMsg > MAX_MSG_LIMIT) { 1442 - goto exit_failure; 1443 - } else { 1444 - dev->app_info[i].nRxMsg++; 1445 - /* Put message into the appropriate application block */ 1446 - list_add_tail(&pdpram_blk->list, &dev->app_info[i].app_sqlist); 1447 - dev->app_info[i].NumOfMsg++; 1448 - } 1449 - return 0; 1450 - 1451 - exit_failure: 1452 - ft1000_free_buffer(pdpram_blk, &freercvpool); 1453 - return -1; 1454 - } 1455 - 1456 - int ft1000_poll(void *dev_id) 1457 - { 1458 - struct ft1000_usb *dev = (struct ft1000_usb *)dev_id; 1459 - struct ft1000_info *info = netdev_priv(dev->net); 1460 - u16 tempword; 1461 - int status; 1462 - u16 size; 1463 - int i; 1464 - u16 data; 1465 - u16 modulo; 1466 - u16 portid; 1467 - 1468 - if (ft1000_chkcard(dev) == FALSE) { 1469 - pr_debug("failed\n"); 1470 - return -1; 1471 - } 1472 - status = ft1000_read_register(dev, &tempword, FT1000_REG_DOORBELL); 1473 - if (!status) { 1474 - if (tempword & FT1000_DB_DPRAM_RX) { 1475 - status = ft1000_read_dpram16(dev, 1476 - 0x200, (u8 *)&data, 0); 1477 - size = ntohs(data) + 16 + 2; 1478 - if (size % 4) { 1479 - modulo = 4 - (size % 4); 1480 - size = size + modulo; 1481 - } 1482 - status = ft1000_read_dpram16(dev, 0x201, 1483 - (u8 *)&portid, 1); 1484 - portid &= 0xff; 1485 - if (size < MAX_CMD_SQSIZE) { 1486 - switch (portid) { 1487 - case DRIVERID: 1488 - pr_debug("FT1000_REG_DOORBELL message type: FT1000_DB_DPRAM_RX : portid DRIVERID\n"); 1489 - status = ft1000_proc_drvmsg(dev, size); 1490 - if (status != 0) 1491 - return status; 1492 - break; 1493 - case DSPBCMSGID: 1494 - status = dsp_broadcast_msg_id(dev); 1495 - break; 1496 - default: 1497 - status = handle_misc_portid(dev); 1498 - break; 1499 - } 1500 - } else 1501 - pr_debug("Invalid total length for SlowQ = %d\n", 1502 - size); 1503 - status = ft1000_write_register(dev, 1504 - FT1000_DB_DPRAM_RX, 1505 - FT1000_REG_DOORBELL); 1506 - } else if (tempword & FT1000_DSP_ASIC_RESET) { 1507 - /* Let's reset the ASIC from the Host side as well */ 1508 - status = ft1000_write_register(dev, ASIC_RESET_BIT, 1509 - FT1000_REG_RESET); 1510 - status = ft1000_read_register(dev, &tempword, 1511 - FT1000_REG_RESET); 1512 - i = 0; 1513 - while (tempword & ASIC_RESET_BIT) { 1514 - status = ft1000_read_register(dev, &tempword, 1515 - FT1000_REG_RESET); 1516 - usleep_range(9000, 11000); 1517 - i++; 1518 - if (i == 100) 1519 - break; 1520 - } 1521 - if (i == 100) { 1522 - pr_debug("Unable to reset ASIC\n"); 1523 - return 0; 1524 - } 1525 - usleep_range(9000, 11000); 1526 - /* Program WMARK register */ 1527 - status = ft1000_write_register(dev, 0x600, 1528 - FT1000_REG_MAG_WATERMARK); 1529 - /* clear ASIC reset doorbell */ 1530 - status = ft1000_write_register(dev, 1531 - FT1000_DSP_ASIC_RESET, 1532 - FT1000_REG_DOORBELL); 1533 - usleep_range(9000, 11000); 1534 - } else if (tempword & FT1000_ASIC_RESET_REQ) { 1535 - pr_debug("FT1000_REG_DOORBELL message type: FT1000_ASIC_RESET_REQ\n"); 1536 - /* clear ASIC reset request from DSP */ 1537 - status = ft1000_write_register(dev, 1538 - FT1000_ASIC_RESET_REQ, 1539 - FT1000_REG_DOORBELL); 1540 - status = ft1000_write_register(dev, HOST_INTF_BE, 1541 - FT1000_REG_SUP_CTRL); 1542 - /* copy dsp session record from Adapter block */ 1543 - status = ft1000_write_dpram32(dev, 0, 1544 - (u8 *)&info->DSPSess.Rec[0], 1024); 1545 - status = ft1000_write_register(dev, 0x600, 1546 - FT1000_REG_MAG_WATERMARK); 1547 - /* ring doorbell to tell DSP that 1548 - * ASIC is out of reset 1549 - */ 1550 - status = ft1000_write_register(dev, 1551 - FT1000_ASIC_RESET_DSP, 1552 - FT1000_REG_DOORBELL); 1553 - } else if (tempword & FT1000_DB_COND_RESET) { 1554 - pr_debug("FT1000_REG_DOORBELL message type: FT1000_DB_COND_RESET\n"); 1555 - if (!dev->fAppMsgPend) { 1556 - /* Reset ASIC and DSP */ 1557 - status = ft1000_read_dpram16(dev, 1558 - FT1000_MAG_DSP_TIMER0, 1559 - (u8 *)&info->DSP_TIME[0], 1560 - FT1000_MAG_DSP_TIMER0_INDX); 1561 - status = ft1000_read_dpram16(dev, 1562 - FT1000_MAG_DSP_TIMER1, 1563 - (u8 *)&info->DSP_TIME[1], 1564 - FT1000_MAG_DSP_TIMER1_INDX); 1565 - status = ft1000_read_dpram16(dev, 1566 - FT1000_MAG_DSP_TIMER2, 1567 - (u8 *)&info->DSP_TIME[2], 1568 - FT1000_MAG_DSP_TIMER2_INDX); 1569 - status = ft1000_read_dpram16(dev, 1570 - FT1000_MAG_DSP_TIMER3, 1571 - (u8 *)&info->DSP_TIME[3], 1572 - FT1000_MAG_DSP_TIMER3_INDX); 1573 - info->CardReady = 0; 1574 - info->DrvErrNum = DSP_CONDRESET_INFO; 1575 - pr_debug("DSP conditional reset requested\n"); 1576 - info->ft1000_reset(dev->net); 1577 - } else { 1578 - dev->fProvComplete = false; 1579 - dev->fCondResetPend = true; 1580 - } 1581 - ft1000_write_register(dev, FT1000_DB_COND_RESET, 1582 - FT1000_REG_DOORBELL); 1583 - } 1584 - } 1585 - return 0; 1586 - }
-123
drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h
··· 1 - /* 2 - *--------------------------------------------------------------------------- 3 - * FT1000 driver for Flarion Flash OFDM NIC Device 4 - * 5 - * Copyright (C) 2002 Flarion Technologies, All rights reserved. 6 - * 7 - * This program is free software; you can redistribute it and/or modify it 8 - * under the terms of the GNU General Public License as published by the Free 9 - * Software Foundation; either version 2 of the License, or (at your option) any 10 - * later version. This program is distributed in the hope that it will be useful, 11 - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 12 - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13 - * more details. You should have received a copy of the GNU General Public 14 - * License along with this program; if not, write to the 15 - * Free Software Foundation, Inc., 59 Temple Place - 16 - * Suite 330, Boston, MA 02111-1307, USA. 17 - *--------------------------------------------------------------------------- 18 - * 19 - * File: ft1000_ioctl.h 20 - * 21 - * Description: Common structures and defines relating to IOCTL 22 - * 23 - * History: 24 - * 11/5/02 Whc Created. 25 - * 26 - *--------------------------------------------------------------------------- 27 - */ 28 - #ifndef _FT1000IOCTLH_ 29 - #define _FT1000IOCTLH_ 30 - 31 - struct IOCTL_GET_VER { 32 - unsigned long drv_ver; 33 - } __packed; 34 - 35 - /* Data structure for Dsp statistics */ 36 - struct IOCTL_GET_DSP_STAT { 37 - unsigned char DspVer[DSPVERSZ]; /* DSP version number */ 38 - unsigned char HwSerNum[HWSERNUMSZ]; /* Hardware Serial Number */ 39 - unsigned char Sku[SKUSZ]; /* SKU */ 40 - unsigned char eui64[EUISZ]; /* EUI64 */ 41 - unsigned short ConStat; /* Connection Status */ 42 - /* Bits 0-3 = Connection Status Field */ 43 - /* 0000=Idle (Disconnect) */ 44 - /* 0001=Searching */ 45 - /* 0010=Active (Connected) */ 46 - /* 0011=Waiting for L2 down */ 47 - /* 0100=Sleep */ 48 - unsigned short LedStat; /* Led Status */ 49 - /* Bits 0-3 = Signal Strength Field */ 50 - /* 0000 = -105dBm to -92dBm */ 51 - /* 0001 = -92dBm to -85dBm */ 52 - /* 0011 = -85dBm to -75dBm */ 53 - /* 0111 = -75dBm to -50dBm */ 54 - /* 1111 = -50dBm to 0dBm */ 55 - /* Bits 4-7 = Reserved */ 56 - /* Bits 8-11 = SNR Field */ 57 - /* 0000 = <2dB */ 58 - /* 0001 = 2dB to 8dB */ 59 - /* 0011 = 8dB to 15dB */ 60 - /* 0111 = 15dB to 22dB */ 61 - /* 1111 = >22dB */ 62 - /* Bits 12-15 = Reserved */ 63 - unsigned long nTxPkts; /* Number of packets transmitted 64 - * from host to dsp 65 - */ 66 - unsigned long nRxPkts; /* Number of packets received from 67 - * dsp to host 68 - */ 69 - unsigned long nTxBytes; /* Number of bytes transmitted 70 - * from host to dsp 71 - */ 72 - unsigned long nRxBytes; /* Number of bytes received from 73 - * dsp to host 74 - */ 75 - unsigned long ConTm; /* Current session connection time 76 - * in seconds 77 - */ 78 - unsigned char CalVer[CALVERSZ]; /* Proprietary Calibration 79 - * Version 80 - */ 81 - unsigned char CalDate[CALDATESZ]; /* Proprietary Calibration Date */ 82 - } __packed; 83 - 84 - /* Data structure for Dual Ported RAM messaging between Host and Dsp */ 85 - struct IOCTL_DPRAM_BLK { 86 - unsigned short total_len; 87 - struct pseudo_hdr pseudohdr; 88 - unsigned char buffer[1780]; 89 - } __packed; 90 - 91 - struct IOCTL_DPRAM_COMMAND { 92 - unsigned short extra; 93 - struct IOCTL_DPRAM_BLK dpram_blk; 94 - } __packed; 95 - 96 - /* 97 - * Custom IOCTL command codes 98 - */ 99 - #define FT1000_MAGIC_CODE 'F' 100 - 101 - #define IOCTL_REGISTER_CMD 0 102 - #define IOCTL_SET_DPRAM_CMD 3 103 - #define IOCTL_GET_DPRAM_CMD 4 104 - #define IOCTL_GET_DSP_STAT_CMD 6 105 - #define IOCTL_GET_VER_CMD 7 106 - #define IOCTL_CONNECT 10 107 - #define IOCTL_DISCONNECT 11 108 - 109 - #define IOCTL_FT1000_GET_DSP_STAT _IOR(FT1000_MAGIC_CODE, \ 110 - IOCTL_GET_DSP_STAT_CMD, \ 111 - struct IOCTL_GET_DSP_STAT) 112 - #define IOCTL_FT1000_GET_VER _IOR(FT1000_MAGIC_CODE, IOCTL_GET_VER_CMD, \ 113 - struct IOCTL_GET_VER) 114 - #define IOCTL_FT1000_CONNECT _IO(FT1000_MAGIC_CODE, IOCTL_CONNECT) 115 - #define IOCTL_FT1000_DISCONNECT _IO(FT1000_MAGIC_CODE, IOCTL_DISCONNECT) 116 - #define IOCTL_FT1000_SET_DPRAM _IOW(FT1000_MAGIC_CODE, IOCTL_SET_DPRAM_CMD, \ 117 - struct IOCTL_DPRAM_BLK) 118 - #define IOCTL_FT1000_GET_DPRAM _IOR(FT1000_MAGIC_CODE, IOCTL_GET_DPRAM_CMD, \ 119 - struct IOCTL_DPRAM_BLK) 120 - #define IOCTL_FT1000_REGISTER _IOW(FT1000_MAGIC_CODE, IOCTL_REGISTER_CMD, \ 121 - unsigned short *) 122 - 123 - #endif /* _FT1000IOCTLH_ */
-248
drivers/staging/ft1000/ft1000-usb/ft1000_usb.c
··· 1 - /*===================================================== 2 - * CopyRight (C) 2007 Qualcomm Inc. All Rights Reserved. 3 - * 4 - * 5 - * This file is part of Express Card USB Driver 6 - *==================================================== 7 - */ 8 - 9 - #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 10 - 11 - #include <linux/kernel.h> 12 - #include <linux/module.h> 13 - #include <linux/usb.h> 14 - #include <linux/netdevice.h> 15 - #include <linux/etherdevice.h> 16 - #include <linux/firmware.h> 17 - #include "ft1000_usb.h" 18 - 19 - #include <linux/kthread.h> 20 - 21 - MODULE_DESCRIPTION("FT1000 EXPRESS CARD DRIVER"); 22 - MODULE_LICENSE("Dual MPL/GPL"); 23 - MODULE_SUPPORTED_DEVICE("QFT FT1000 Express Cards"); 24 - 25 - void *pFileStart; 26 - size_t FileLength; 27 - 28 - #define VENDOR_ID 0x1291 /* Qualcomm vendor id */ 29 - #define PRODUCT_ID 0x11 /* fake product id */ 30 - 31 - /* table of devices that work with this driver */ 32 - static struct usb_device_id id_table[] = { 33 - {USB_DEVICE(VENDOR_ID, PRODUCT_ID)}, 34 - {}, 35 - }; 36 - 37 - MODULE_DEVICE_TABLE(usb, id_table); 38 - 39 - static bool gPollingfailed; 40 - static int ft1000_poll_thread(void *arg) 41 - { 42 - int ret; 43 - 44 - while (!kthread_should_stop()) { 45 - usleep_range(10000, 11000); 46 - if (!gPollingfailed) { 47 - ret = ft1000_poll(arg); 48 - if (ret != 0) { 49 - pr_debug("polling failed\n"); 50 - gPollingfailed = true; 51 - } 52 - } 53 - } 54 - return 0; 55 - } 56 - 57 - static int ft1000_probe(struct usb_interface *interface, 58 - const struct usb_device_id *id) 59 - { 60 - struct usb_host_interface *iface_desc; 61 - struct usb_endpoint_descriptor *endpoint; 62 - struct usb_device *dev; 63 - unsigned numaltsetting; 64 - int i, ret = 0, size; 65 - 66 - struct ft1000_usb *ft1000dev; 67 - struct ft1000_info *pft1000info = NULL; 68 - const struct firmware *dsp_fw; 69 - 70 - ft1000dev = kzalloc(sizeof(struct ft1000_usb), GFP_KERNEL); 71 - if (!ft1000dev) 72 - return -ENOMEM; 73 - 74 - dev = interface_to_usbdev(interface); 75 - pr_debug("usb device descriptor info - number of configuration is %d\n", 76 - dev->descriptor.bNumConfigurations); 77 - 78 - ft1000dev->dev = dev; 79 - ft1000dev->status = 0; 80 - ft1000dev->net = NULL; 81 - ft1000dev->tx_urb = usb_alloc_urb(0, GFP_KERNEL); 82 - ft1000dev->rx_urb = usb_alloc_urb(0, GFP_KERNEL); 83 - if (!ft1000dev->tx_urb || !ft1000dev->rx_urb) { 84 - ret = -ENOMEM; 85 - goto err_fw; 86 - } 87 - 88 - numaltsetting = interface->num_altsetting; 89 - pr_debug("number of alt settings is: %d\n", numaltsetting); 90 - iface_desc = interface->cur_altsetting; 91 - pr_debug("number of endpoints is: %d\n", 92 - iface_desc->desc.bNumEndpoints); 93 - pr_debug("descriptor type is: %d\n", iface_desc->desc.bDescriptorType); 94 - pr_debug("interface number is: %d\n", 95 - iface_desc->desc.bInterfaceNumber); 96 - pr_debug("alternatesetting is: %d\n", 97 - iface_desc->desc.bAlternateSetting); 98 - pr_debug("interface class is: %d\n", iface_desc->desc.bInterfaceClass); 99 - pr_debug("control endpoint info:\n"); 100 - pr_debug("descriptor0 type -- %d\n", 101 - iface_desc->endpoint[0].desc.bmAttributes); 102 - pr_debug("descriptor1 type -- %d\n", 103 - iface_desc->endpoint[1].desc.bmAttributes); 104 - pr_debug("descriptor2 type -- %d\n", 105 - iface_desc->endpoint[2].desc.bmAttributes); 106 - 107 - for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { 108 - endpoint = 109 - (struct usb_endpoint_descriptor *)&iface_desc-> 110 - endpoint[i].desc; 111 - pr_debug("endpoint %d\n", i); 112 - pr_debug("bEndpointAddress=%x, bmAttributes=%x\n", 113 - endpoint->bEndpointAddress, endpoint->bmAttributes); 114 - if (usb_endpoint_is_bulk_in(endpoint)) { 115 - ft1000dev->bulk_in_endpointAddr = 116 - endpoint->bEndpointAddress; 117 - pr_debug("in: %d\n", endpoint->bEndpointAddress); 118 - } 119 - 120 - if (usb_endpoint_is_bulk_in(endpoint)) { 121 - ft1000dev->bulk_out_endpointAddr = 122 - endpoint->bEndpointAddress; 123 - pr_debug("out: %d\n", endpoint->bEndpointAddress); 124 - } 125 - } 126 - 127 - pr_debug("bulk_in=%d, bulk_out=%d\n", 128 - ft1000dev->bulk_in_endpointAddr, 129 - ft1000dev->bulk_out_endpointAddr); 130 - 131 - ret = request_firmware(&dsp_fw, "ft3000.img", &dev->dev); 132 - if (ret < 0) { 133 - dev_err(interface->usb_dev, "Error request_firmware()\n"); 134 - goto err_fw; 135 - } 136 - 137 - size = max_t(uint, dsp_fw->size, 4096); 138 - pFileStart = kmalloc(size, GFP_KERNEL); 139 - 140 - if (!pFileStart) { 141 - release_firmware(dsp_fw); 142 - ret = -ENOMEM; 143 - goto err_fw; 144 - } 145 - 146 - memcpy(pFileStart, dsp_fw->data, dsp_fw->size); 147 - FileLength = dsp_fw->size; 148 - release_firmware(dsp_fw); 149 - 150 - pr_debug("start downloading dsp image...\n"); 151 - 152 - ret = init_ft1000_netdev(ft1000dev); 153 - if (ret) 154 - goto err_load; 155 - 156 - pft1000info = netdev_priv(ft1000dev->net); 157 - 158 - pr_debug("pft1000info=%p\n", pft1000info); 159 - ret = dsp_reload(ft1000dev); 160 - if (ret) { 161 - dev_err(interface->usb_dev, 162 - "Problem with DSP image loading\n"); 163 - goto err_load; 164 - } 165 - 166 - gPollingfailed = false; 167 - ft1000dev->pPollThread = 168 - kthread_run(ft1000_poll_thread, ft1000dev, "ft1000_poll"); 169 - 170 - if (IS_ERR(ft1000dev->pPollThread)) { 171 - ret = PTR_ERR(ft1000dev->pPollThread); 172 - goto err_load; 173 - } 174 - 175 - msleep(500); 176 - 177 - while (!pft1000info->CardReady) { 178 - if (gPollingfailed) { 179 - ret = -EIO; 180 - goto err_thread; 181 - } 182 - msleep(100); 183 - pr_debug("Waiting for Card Ready\n"); 184 - } 185 - 186 - pr_debug("Card Ready!!!! Registering network device\n"); 187 - 188 - ret = reg_ft1000_netdev(ft1000dev, interface); 189 - if (ret) 190 - goto err_thread; 191 - 192 - ft1000dev->NetDevRegDone = 1; 193 - 194 - return 0; 195 - 196 - err_thread: 197 - kthread_stop(ft1000dev->pPollThread); 198 - err_load: 199 - kfree(pFileStart); 200 - err_fw: 201 - usb_free_urb(ft1000dev->rx_urb); 202 - usb_free_urb(ft1000dev->tx_urb); 203 - kfree(ft1000dev); 204 - return ret; 205 - } 206 - 207 - static void ft1000_disconnect(struct usb_interface *interface) 208 - { 209 - struct ft1000_info *pft1000info; 210 - struct ft1000_usb *ft1000dev; 211 - 212 - pft1000info = (struct ft1000_info *)usb_get_intfdata(interface); 213 - pr_debug("In disconnect pft1000info=%p\n", pft1000info); 214 - 215 - if (pft1000info) { 216 - ft1000dev = pft1000info->priv; 217 - if (ft1000dev->pPollThread) 218 - kthread_stop(ft1000dev->pPollThread); 219 - 220 - pr_debug("threads are terminated\n"); 221 - 222 - if (ft1000dev->net) { 223 - pr_debug("destroy char driver\n"); 224 - ft1000_destroy_dev(ft1000dev->net); 225 - unregister_netdev(ft1000dev->net); 226 - pr_debug("network device unregistered\n"); 227 - free_netdev(ft1000dev->net); 228 - 229 - } 230 - 231 - usb_free_urb(ft1000dev->rx_urb); 232 - usb_free_urb(ft1000dev->tx_urb); 233 - 234 - pr_debug("urb freed\n"); 235 - 236 - kfree(ft1000dev); 237 - } 238 - kfree(pFileStart); 239 - } 240 - 241 - static struct usb_driver ft1000_usb_driver = { 242 - .name = "ft1000usb", 243 - .probe = ft1000_probe, 244 - .disconnect = ft1000_disconnect, 245 - .id_table = id_table, 246 - }; 247 - 248 - module_usb_driver(ft1000_usb_driver);
-150
drivers/staging/ft1000/ft1000-usb/ft1000_usb.h
··· 1 - #ifndef _FT1000_USB_H_ 2 - #define _FT1000_USB_H_ 3 - 4 - #include "../ft1000.h" 5 - #include "ft1000_ioctl.h" 6 - #define FT1000_DRV_VER 0x01010403 7 - 8 - #define MAX_NUM_APP 6 9 - #define MAX_MSG_LIMIT 200 10 - #define NUM_OF_FREE_BUFFERS 1500 11 - 12 - #define PSEUDOSZ 16 13 - 14 - struct app_info_block { 15 - u32 nTxMsg; /* DPRAM msg sent to DSP with app_id */ 16 - u32 nRxMsg; /* DPRAM msg rcv from dsp with app_id */ 17 - u32 nTxMsgReject; /* DPRAM msg rejected due to DSP doorbell 18 - * set 19 - */ 20 - u32 nRxMsgMiss; /* DPRAM msg dropped due to overflow */ 21 - struct fown_struct *fileobject;/* Application's file object */ 22 - u16 app_id; /* Application id */ 23 - int DspBCMsgFlag; 24 - int NumOfMsg; /* number of messages queued up */ 25 - wait_queue_head_t wait_dpram_msg; 26 - struct list_head app_sqlist; /* link list of msgs for applicaton on 27 - * slow queue 28 - */ 29 - } __packed; 30 - 31 - #define FALSE 0 32 - #define TRUE 1 33 - 34 - #define FT1000_STATUS_CLOSING 0x01 35 - 36 - #define DSPBCMSGID 0x10 37 - 38 - /* Electrabuzz specific DPRAM mapping */ 39 - /* this is used by ft1000_usb driver - isn't that a bug? */ 40 - #undef FT1000_DPRAM_RX_BASE 41 - #define FT1000_DPRAM_RX_BASE 0x1800 /* RX AREA (SlowQ) */ 42 - 43 - /* MEMORY MAP FOR MAGNEMITE */ 44 - /* the indexes are swapped comparing to PCMCIA - is it OK or a bug? */ 45 - #undef FT1000_MAG_DSP_LED_INDX 46 - #define FT1000_MAG_DSP_LED_INDX 0x1 /* dsp led status for PAD 47 - * device 48 - */ 49 - #undef FT1000_MAG_DSP_CON_STATE_INDX 50 - #define FT1000_MAG_DSP_CON_STATE_INDX 0x0 /* DSP Connection Status Info */ 51 - 52 - /* Maximum times trying to get ASIC out of reset */ 53 - #define MAX_ASIC_RESET_CNT 20 54 - 55 - #define MAX_BUF_SIZE 4096 56 - 57 - struct ft1000_debug_dirs { 58 - struct list_head list; 59 - struct dentry *dent; 60 - struct dentry *file; 61 - int int_number; 62 - }; 63 - 64 - struct ft1000_usb { 65 - struct usb_device *dev; 66 - struct net_device *net; 67 - 68 - u32 status; 69 - 70 - struct urb *rx_urb; 71 - struct urb *tx_urb; 72 - 73 - u8 tx_buf[MAX_BUF_SIZE]; 74 - u8 rx_buf[MAX_BUF_SIZE]; 75 - 76 - u8 bulk_in_endpointAddr; 77 - u8 bulk_out_endpointAddr; 78 - 79 - struct task_struct *pPollThread; 80 - unsigned char fcodeldr; 81 - unsigned char bootmode; 82 - unsigned char usbboot; 83 - unsigned short dspalive; 84 - bool fProvComplete; 85 - bool fCondResetPend; 86 - bool fAppMsgPend; 87 - int DeviceCreated; 88 - int NetDevRegDone; 89 - u8 CardNumber; 90 - u8 DeviceName[15]; 91 - struct ft1000_debug_dirs nodes; 92 - spinlock_t fifo_lock; 93 - int appcnt; 94 - struct app_info_block app_info[MAX_NUM_APP]; 95 - u16 DrvMsgPend; 96 - unsigned short tempbuf[32]; 97 - } __packed; 98 - 99 - 100 - struct dpram_blk { 101 - struct list_head list; 102 - u16 *pbuffer; 103 - } __packed; 104 - 105 - int ft1000_read_register(struct ft1000_usb *ft1000dev, 106 - u16 *Data, u16 nRegIndx); 107 - int ft1000_write_register(struct ft1000_usb *ft1000dev, 108 - u16 value, u16 nRegIndx); 109 - int ft1000_read_dpram32(struct ft1000_usb *ft1000dev, 110 - u16 indx, u8 *buffer, u16 cnt); 111 - int ft1000_write_dpram32(struct ft1000_usb *ft1000dev, 112 - u16 indx, u8 *buffer, u16 cnt); 113 - int ft1000_read_dpram16(struct ft1000_usb *ft1000dev, 114 - u16 indx, u8 *buffer, u8 highlow); 115 - int ft1000_write_dpram16(struct ft1000_usb *ft1000dev, 116 - u16 indx, u16 value, u8 highlow); 117 - int fix_ft1000_read_dpram32(struct ft1000_usb *ft1000dev, 118 - u16 indx, u8 *buffer); 119 - int fix_ft1000_write_dpram32(struct ft1000_usb *ft1000dev, 120 - u16 indx, u8 *buffer); 121 - 122 - extern void *pFileStart; 123 - extern size_t FileLength; 124 - extern int numofmsgbuf; 125 - 126 - int ft1000_close(struct net_device *dev); 127 - int scram_dnldr(struct ft1000_usb *ft1000dev, void *pFileStart, 128 - u32 FileLength); 129 - 130 - extern struct list_head freercvpool; 131 - 132 - /* lock to arbitrate free buffer list for receive command data */ 133 - extern spinlock_t free_buff_lock; 134 - 135 - int ft1000_create_dev(struct ft1000_usb *dev); 136 - void ft1000_destroy_dev(struct net_device *dev); 137 - int card_send_command(struct ft1000_usb *ft1000dev, 138 - void *ptempbuffer, int size); 139 - 140 - struct dpram_blk *ft1000_get_buffer(struct list_head *bufflist); 141 - void ft1000_free_buffer(struct dpram_blk *pdpram_blk, struct list_head *plist); 142 - 143 - int dsp_reload(struct ft1000_usb *ft1000dev); 144 - int init_ft1000_netdev(struct ft1000_usb *ft1000dev); 145 - struct usb_interface; 146 - int reg_ft1000_netdev(struct ft1000_usb *ft1000dev, 147 - struct usb_interface *intf); 148 - int ft1000_poll(void *dev_id); 149 - 150 - #endif /* _FT1000_USB_H_ */
drivers/staging/ft1000/ft1000-usb/ft3000.img

This is a binary file and will not be displayed.

-366
drivers/staging/ft1000/ft1000.h
··· 1 - /* 2 - * Common structures and definitions for FT1000 Flarion Flash OFDM PCMCIA and 3 - * USB devices. 4 - * 5 - * Originally copyright (c) 2002 Flarion Technologies 6 - * 7 - */ 8 - 9 - #define DSPVERSZ 4 10 - #define HWSERNUMSZ 16 11 - #define SKUSZ 20 12 - #define EUISZ 8 13 - #define MODESZ 2 14 - #define CALVERSZ 2 15 - #define CALDATESZ 6 16 - 17 - #define ELECTRABUZZ_ID 0 /* ASIC ID for Electrabuzz */ 18 - #define MAGNEMITE_ID 0x1a01 /* ASIC ID for Magnemite */ 19 - 20 - /* MEMORY MAP common to both ELECTRABUZZ and MAGNEMITE */ 21 - #define FT1000_REG_DPRAM_ADDR 0x000E /* DPADR - Dual Port Ram Indirect 22 - * Address Register 23 - */ 24 - #define FT1000_REG_SUP_CTRL 0x0020 /* HCTR - Host Control Register */ 25 - #define FT1000_REG_SUP_STAT 0x0022 /* HSTAT - Host Status Register */ 26 - #define FT1000_REG_RESET 0x0024 /* HCTR - Host Control Register */ 27 - #define FT1000_REG_SUP_ISR 0x0026 /* HISR - Host Interrupt Status 28 - * Register 29 - */ 30 - #define FT1000_REG_SUP_IMASK 0x0028 /* HIMASK - Host Interrupt Mask */ 31 - #define FT1000_REG_DOORBELL 0x002a /* DBELL - Door Bell Register */ 32 - #define FT1000_REG_ASIC_ID 0x002e /* ASICID - ASIC Identification 33 - * Number 34 - */ 35 - 36 - /* MEMORY MAP FOR ELECTRABUZZ ASIC */ 37 - #define FT1000_REG_UFIFO_STAT 0x0000 /* UFSR - Uplink FIFO status register */ 38 - #define FT1000_REG_UFIFO_BEG 0x0002 /* UFBR - Uplink FIFO beginning 39 - * register 40 - */ 41 - #define FT1000_REG_UFIFO_MID 0x0004 /* UFMR - Uplink FIFO middle register */ 42 - #define FT1000_REG_UFIFO_END 0x0006 /* UFER - Uplink FIFO end register */ 43 - #define FT1000_REG_DFIFO_STAT 0x0008 /* DFSR - Downlink FIFO status 44 - * register 45 - */ 46 - #define FT1000_REG_DFIFO 0x000A /* DFR - Downlink FIFO Register */ 47 - #define FT1000_REG_DPRAM_DATA 0x000C /* DPRAM - Dual Port Indirect 48 - * Data Register 49 - */ 50 - #define FT1000_REG_WATERMARK 0x0010 /* WMARK - Watermark Register */ 51 - 52 - /* MEMORY MAP FOR MAGNEMITE */ 53 - #define FT1000_REG_MAG_UFDR 0x0000 /* UFDR - Uplink FIFO Data 54 - * Register (32-bits) 55 - */ 56 - #define FT1000_REG_MAG_UFDRL 0x0000 /* UFDRL - Uplink FIFO Data 57 - * Register low-word (16-bits) 58 - */ 59 - #define FT1000_REG_MAG_UFDRH 0x0002 /* UFDRH - Uplink FIFO Data Register 60 - * high-word (16-bits) 61 - */ 62 - #define FT1000_REG_MAG_UFER 0x0004 /* UFER - Uplink FIFO End Register */ 63 - #define FT1000_REG_MAG_UFSR 0x0006 /* UFSR - Uplink FIFO Status Register */ 64 - #define FT1000_REG_MAG_DFR 0x0008 /* DFR - Downlink FIFO Register 65 - * (32-bits) 66 - */ 67 - #define FT1000_REG_MAG_DFRL 0x0008 /* DFRL - Downlink FIFO Register 68 - * low-word (16-bits) 69 - */ 70 - #define FT1000_REG_MAG_DFRH 0x000a /* DFRH - Downlink FIFO Register 71 - * high-word (16-bits) 72 - */ 73 - #define FT1000_REG_MAG_DFSR 0x000c /* DFSR - Downlink FIFO Status 74 - * Register 75 - */ 76 - #define FT1000_REG_MAG_DPDATA 0x0010 /* DPDATA - Dual Port RAM Indirect 77 - * Data Register (32-bits) 78 - */ 79 - #define FT1000_REG_MAG_DPDATAL 0x0010 /* DPDATAL - Dual Port RAM Indirect 80 - * Data Register low-word (16-bits) 81 - */ 82 - #define FT1000_REG_MAG_DPDATAH 0x0012 /* DPDATAH - Dual Port RAM Indirect Data 83 - * Register high-word (16-bits) 84 - */ 85 - #define FT1000_REG_MAG_WATERMARK 0x002c /* WMARK - Watermark Register */ 86 - #define FT1000_REG_MAG_VERSION 0x0030 /* LLC Version */ 87 - 88 - /* Reserved Dual Port RAM offsets for Electrabuzz */ 89 - #define FT1000_DPRAM_TX_BASE 0x0002 /* Host to PC Card Messaging Area */ 90 - #define FT1000_DPRAM_RX_BASE 0x0800 /* PC Card to Host Messaging Area */ 91 - #define FT1000_FIFO_LEN 0x07FC /* total length for DSP FIFO tracking */ 92 - #define FT1000_HI_HO 0x07FE /* heartbeat with HI/HO */ 93 - #define FT1000_DSP_STATUS 0x0FFE /* dsp status - non-zero is a request 94 - * to reset dsp 95 - */ 96 - #define FT1000_DSP_LED 0x0FFA /* dsp led status for PAD device */ 97 - #define FT1000_DSP_CON_STATE 0x0FF8 /* DSP Connection Status Info */ 98 - #define FT1000_DPRAM_FEFE 0x0002 /* location for dsp ready indicator */ 99 - #define FT1000_DSP_TIMER0 0x1FF0 /* Timer Field from Basestation */ 100 - #define FT1000_DSP_TIMER1 0x1FF2 /* Timer Field from Basestation */ 101 - #define FT1000_DSP_TIMER2 0x1FF4 /* Timer Field from Basestation */ 102 - #define FT1000_DSP_TIMER3 0x1FF6 /* Timer Field from Basestation */ 103 - 104 - /* Reserved Dual Port RAM offsets for Magnemite */ 105 - #define FT1000_DPRAM_MAG_TX_BASE 0x0000 /* Host to PC Card 106 - * Messaging Area 107 - */ 108 - #define FT1000_DPRAM_MAG_RX_BASE 0x0200 /* PC Card to Host 109 - * Messaging Area 110 - */ 111 - 112 - #define FT1000_MAG_FIFO_LEN 0x1FF /* total length for DSP 113 - * FIFO tracking 114 - */ 115 - #define FT1000_MAG_FIFO_LEN_INDX 0x1 /* low-word index */ 116 - #define FT1000_MAG_HI_HO 0x1FF /* heartbeat with HI/HO */ 117 - #define FT1000_MAG_HI_HO_INDX 0x0 /* high-word index */ 118 - #define FT1000_MAG_DSP_LED 0x3FE /* dsp led status for 119 - * PAD device 120 - */ 121 - #define FT1000_MAG_DSP_LED_INDX 0x0 /* dsp led status for 122 - * PAD device 123 - */ 124 - #define FT1000_MAG_DSP_CON_STATE 0x3FE /* DSP Connection Status Info */ 125 - #define FT1000_MAG_DSP_CON_STATE_INDX 0x1 /* DSP Connection Status Info */ 126 - #define FT1000_MAG_DPRAM_FEFE 0x000 /* location for dsp ready 127 - * indicator 128 - */ 129 - #define FT1000_MAG_DPRAM_FEFE_INDX 0x0 /* location for dsp ready 130 - * indicator 131 - */ 132 - #define FT1000_MAG_DSP_TIMER0 0x3FC /* Timer Field from 133 - * Basestation 134 - */ 135 - #define FT1000_MAG_DSP_TIMER0_INDX 0x1 136 - #define FT1000_MAG_DSP_TIMER1 0x3FC /* Timer Field from 137 - * Basestation 138 - */ 139 - #define FT1000_MAG_DSP_TIMER1_INDX 0x0 140 - #define FT1000_MAG_DSP_TIMER2 0x3FD /* Timer Field from 141 - * Basestation 142 - */ 143 - #define FT1000_MAG_DSP_TIMER2_INDX 0x1 144 - #define FT1000_MAG_DSP_TIMER3 0x3FD /* Timer Field from 145 - * Basestation 146 - */ 147 - #define FT1000_MAG_DSP_TIMER3_INDX 0x0 148 - #define FT1000_MAG_TOTAL_LEN 0x200 149 - #define FT1000_MAG_TOTAL_LEN_INDX 0x1 150 - #define FT1000_MAG_PH_LEN 0x200 151 - #define FT1000_MAG_PH_LEN_INDX 0x0 152 - #define FT1000_MAG_PORT_ID 0x201 153 - #define FT1000_MAG_PORT_ID_INDX 0x0 154 - 155 - #define HOST_INTF_LE 0x0 /* Host interface little endian mode */ 156 - #define HOST_INTF_BE 0x1 /* Host interface big endian mode */ 157 - 158 - /* FT1000 to Host Doorbell assignments */ 159 - #define FT1000_DB_DPRAM_RX 0x0001 /* this value indicates that DSP 160 - * has data for host in DPRAM 161 - */ 162 - #define FT1000_DB_DNLD_RX 0x0002 /* Downloader handshake doorbell */ 163 - #define FT1000_ASIC_RESET_REQ 0x0004 /* DSP requesting host to 164 - * reset the ASIC 165 - */ 166 - #define FT1000_DSP_ASIC_RESET 0x0008 /* DSP indicating host that 167 - * it will reset the ASIC 168 - */ 169 - #define FT1000_DB_COND_RESET 0x0010 /* DSP request for a card reset. */ 170 - 171 - /* Host to FT1000 Doorbell assignments */ 172 - #define FT1000_DB_DPRAM_TX 0x0100 /* this value indicates that host 173 - * has data for DSP in DPRAM. 174 - */ 175 - #define FT1000_DB_DNLD_TX 0x0200 /* Downloader handshake doorbell */ 176 - #define FT1000_ASIC_RESET_DSP 0x0400 /* Responds to FT1000_ASIC_RESET_REQ */ 177 - #define FT1000_DB_HB 0x1000 /* Indicates that supervisor has a 178 - * heartbeat message for DSP. 179 - */ 180 - 181 - #define hi 0x6869 /* PC Card heartbeat values */ 182 - #define ho 0x686f /* PC Card heartbeat values */ 183 - 184 - /* Magnemite specific defines */ 185 - #define hi_mag 0x6968 /* Byte swap hi to avoid 186 - * additional system call 187 - */ 188 - #define ho_mag 0x6f68 /* Byte swap ho to avoid 189 - * additional system call 190 - */ 191 - 192 - /* Bit field definitions for Host Interrupt Status Register */ 193 - /* Indicate the cause of an interrupt. */ 194 - #define ISR_EMPTY 0x00 /* no bits set */ 195 - #define ISR_DOORBELL_ACK 0x01 /* Doorbell acknowledge from DSP */ 196 - #define ISR_DOORBELL_PEND 0x02 /* Doorbell pending from DSP */ 197 - #define ISR_RCV 0x04 /* Packet available in Downlink FIFO */ 198 - #define ISR_WATERMARK 0x08 /* Watermark requirements satisfied */ 199 - 200 - /* Bit field definition for Host Interrupt Mask */ 201 - #define ISR_MASK_NONE 0x0000 /* no bits set */ 202 - #define ISR_MASK_DOORBELL_ACK 0x0001 /* Doorbell acknowledge mask */ 203 - #define ISR_MASK_DOORBELL_PEND 0x0002 /* Doorbell pending mask */ 204 - #define ISR_MASK_RCV 0x0004 /* Downlink Packet available mask */ 205 - #define ISR_MASK_WATERMARK 0x0008 /* Watermark interrupt mask */ 206 - #define ISR_MASK_ALL 0xffff /* Mask all interrupts */ 207 - /* Default interrupt mask 208 - * (Enable Doorbell pending and Packet available interrupts) 209 - */ 210 - #define ISR_DEFAULT_MASK 0x7ff9 211 - 212 - /* Bit field definition for Host Control Register */ 213 - #define DSP_RESET_BIT 0x0001 /* Bit field to control 214 - * dsp reset state 215 - */ 216 - /* (0 = out of reset 1 = reset) */ 217 - #define ASIC_RESET_BIT 0x0002 /* Bit field to control 218 - * ASIC reset state 219 - */ 220 - /* (0 = out of reset 1 = reset) */ 221 - #define DSP_UNENCRYPTED 0x0004 222 - #define DSP_ENCRYPTED 0x0008 223 - #define EFUSE_MEM_DISABLE 0x0040 224 - 225 - /* Application specific IDs */ 226 - #define DSPID 0x20 227 - #define HOSTID 0x10 228 - #define DSPAIRID 0x90 229 - #define DRIVERID 0x00 230 - #define NETWORKID 0x20 231 - 232 - /* Size of DPRAM Message */ 233 - #define MAX_CMD_SQSIZE 1780 234 - 235 - #define ENET_MAX_SIZE 1514 236 - #define ENET_HEADER_SIZE 14 237 - 238 - #define SLOWQ_TYPE 0 239 - #define FASTQ_TYPE 1 240 - 241 - #define MAX_DSP_SESS_REC 1024 242 - 243 - #define DSP_QID_OFFSET 4 244 - 245 - /* Driver message types */ 246 - #define MEDIA_STATE 0x0010 247 - #define TIME_UPDATE 0x0020 248 - #define DSP_PROVISION 0x0030 249 - #define DSP_INIT_MSG 0x0050 250 - #define DSP_HIBERNATE 0x0060 251 - #define DSP_STORE_INFO 0x0070 252 - #define DSP_GET_INFO 0x0071 253 - #define GET_DRV_ERR_RPT_MSG 0x0073 254 - #define RSP_DRV_ERR_RPT_MSG 0x0074 255 - 256 - /* Driver Error Messages for DSP */ 257 - #define DSP_HB_INFO 0x7ef0 258 - #define DSP_FIFO_INFO 0x7ef1 259 - #define DSP_CONDRESET_INFO 0x7ef2 260 - #define DSP_CMDLEN_INFO 0x7ef3 261 - #define DSP_CMDPHCKSUM_INFO 0x7ef4 262 - #define DSP_PKTPHCKSUM_INFO 0x7ef5 263 - #define DSP_PKTLEN_INFO 0x7ef6 264 - #define DSP_USER_RESET 0x7ef7 265 - #define FIFO_FLUSH_MAXLIMIT 0x7ef8 266 - #define FIFO_FLUSH_BADCNT 0x7ef9 267 - #define FIFO_ZERO_LEN 0x7efa 268 - 269 - /* Pseudo Header structure */ 270 - struct pseudo_hdr { 271 - unsigned short length; /* length of msg body */ 272 - unsigned char source; /* hardware source id */ 273 - /* Host = 0x10 */ 274 - /* Dsp = 0x20 */ 275 - unsigned char destination; /* hardware destination id 276 - * (refer to source) 277 - */ 278 - unsigned char portdest; /* software destination port id */ 279 - /* Host = 0x00 */ 280 - /* Applicaton Broadcast = 0x10 */ 281 - /* Network Stack = 0x20 */ 282 - /* Dsp OAM = 0x80 */ 283 - /* Dsp Airlink = 0x90 */ 284 - /* Dsp Loader = 0xa0 */ 285 - /* Dsp MIP = 0xb0 */ 286 - unsigned char portsrc; /* software source port id 287 - * (refer to portdest) 288 - */ 289 - unsigned short sh_str_id; /* not used */ 290 - unsigned char control; /* not used */ 291 - unsigned char rsvd1; 292 - unsigned char seq_num; /* message sequence number */ 293 - unsigned char rsvd2; 294 - unsigned short qos_class; /* not used */ 295 - unsigned short checksum; /* pseudo header checksum */ 296 - } __packed; 297 - 298 - struct drv_msg { 299 - struct pseudo_hdr pseudo; 300 - u16 type; 301 - u16 length; 302 - u8 data[0]; 303 - } __packed; 304 - 305 - struct media_msg { 306 - struct pseudo_hdr pseudo; 307 - u16 type; 308 - u16 length; 309 - u16 state; 310 - u32 ip_addr; 311 - u32 net_mask; 312 - u32 gateway; 313 - u32 dns_1; 314 - u32 dns_2; 315 - } __packed; 316 - 317 - struct dsp_init_msg { 318 - struct pseudo_hdr pseudo; 319 - u16 type; 320 - u16 length; 321 - u8 DspVer[DSPVERSZ]; /* DSP version number */ 322 - u8 HwSerNum[HWSERNUMSZ]; /* Hardware Serial Number */ 323 - u8 Sku[SKUSZ]; /* SKU */ 324 - u8 eui64[EUISZ]; /* EUI64 */ 325 - u8 ProductMode[MODESZ]; /* Product Mode (Market/Production) */ 326 - u8 RfCalVer[CALVERSZ]; /* Rf Calibration version */ 327 - u8 RfCalDate[CALDATESZ]; /* Rf Calibration date */ 328 - } __packed; 329 - 330 - struct prov_record { 331 - struct list_head list; 332 - u8 *pprov_data; 333 - }; 334 - 335 - struct ft1000_info { 336 - void *priv; 337 - struct net_device_stats stats; 338 - u16 DrvErrNum; 339 - u16 AsicID; 340 - int CardReady; 341 - int registered; 342 - int mediastate; 343 - u8 squeseqnum; /* sequence number on slow queue */ 344 - spinlock_t dpram_lock; 345 - u16 fifo_cnt; 346 - u8 DspVer[DSPVERSZ]; /* DSP version number */ 347 - u8 HwSerNum[HWSERNUMSZ]; /* Hardware Serial Number */ 348 - u8 Sku[SKUSZ]; /* SKU */ 349 - u8 eui64[EUISZ]; /* EUI64 */ 350 - time_t ConTm; /* Connection Time */ 351 - u8 ProductMode[MODESZ]; 352 - u8 RfCalVer[CALVERSZ]; 353 - u8 RfCalDate[CALDATESZ]; 354 - u16 DSP_TIME[4]; 355 - u16 LedStat; 356 - u16 ConStat; 357 - u16 ProgConStat; 358 - struct list_head prov_list; 359 - u16 DSPInfoBlklen; 360 - int (*ft1000_reset)(void *); 361 - u16 DSPInfoBlk[MAX_DSP_SESS_REC]; 362 - union { 363 - u16 Rec[MAX_DSP_SESS_REC]; 364 - u32 MagRec[MAX_DSP_SESS_REC/2]; 365 - } DSPSess; 366 - };