diff options
Diffstat (limited to 'drivers/staging/ft1000')
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf | 14 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000.h | 490 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c | 196 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h | 66 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c | 562 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c | 244 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c | 31 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-usb/ft1000_hw.c | 11 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h | 32 | ||||
-rw-r--r-- | drivers/staging/ft1000/ft1000-usb/ft1000_usb.h | 413 |
10 files changed, 429 insertions, 1630 deletions
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf deleted file mode 100644 index e2321a4..0000000 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.conf +++ /dev/null @@ -1,14 +0,0 @@ -device "ft1000_cs" - class "network" module "ft1000","ft1000_cs" - -card "flarion FT1000" - manfid 0x02cc, 0x0100 - bind "ft1000_cs" - -card "flarion FT1000" - manfid 0x02cc, 0x1000 - bind "ft1000_cs" - -card "flarion FT1000" - manfid 0x02cc, 0x1300 - bind "ft1000_cs" diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h index 61e1cfc..adb436e 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000.h @@ -1,409 +1,99 @@ -//--------------------------------------------------------------------------- -// FT1000 driver for Flarion Flash OFDM NIC Device -// -// Copyright (C) 2002 Flarion Technologies, All rights reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) any -// later version. This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. You should have received a copy of the GNU General Public -// License along with this program; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - -// Suite 330, Boston, MA 02111-1307, USA. -//--------------------------------------------------------------------------- -// -// File: ft1000.h -// -// Description: Common structures and defines -// -// History: -// 8/29/02 Whc Ported to Linux. -// 7/19/04 Whc Drop packet and cmd msg with pseudo header -// checksum -// 10/27/04 Whc Added dynamic downloading of test image. -// 01/11/04 Whc Added support for Magnemite ASIC -// -//--------------------------------------------------------------------------- +/*--------------------------------------------------------------------------- + FT1000 driver for Flarion Flash OFDM NIC Device + + Copyright (C) 2002 Flarion Technologies, All rights reserved. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) any + later version. This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 59 Temple Place - + Suite 330, Boston, MA 02111-1307, USA. +--------------------------------------------------------------------------- + Description: Common structures and defines +---------------------------------------------------------------------------*/ #ifndef _FT1000H_ #define _FT1000H_ - -#define FT1000_DRV_VER 0x01010300 - -#define DSPVERSZ 4 -#define HWSERNUMSZ 16 -#define SKUSZ 20 -#define EUISZ 8 -#define MODESZ 2 -#define CALVERSZ 2 -#define CALDATESZ 6 - -// Pseudo Header structure -typedef struct _PSEUDO_HDR -{ - unsigned short length; // length of msg body - unsigned char source; // hardware source id - // Host = 0x10 - // Dsp = 0x20 - unsigned char destination; // hardware destination id (refer to source) - unsigned char portdest; // software destination port id - // Host = 0x00 - // Applicaton Broadcast = 0x10 - // Network Stack = 0x20 - // Dsp OAM = 0x80 - // Dsp Airlink = 0x90 - // Dsp Loader = 0xa0 - // Dsp MIP = 0xb0 - unsigned char portsrc; // software source port id (refer to portdest) - unsigned short sh_str_id; // not used - unsigned char control; // not used - unsigned char rsvd1; - unsigned char seq_num; // message sequence number - unsigned char rsvd2; - unsigned short qos_class; // not used - unsigned short checksum; // pseudo header checksum -} __attribute__ ((packed)) PSEUDO_HDR, *PPSEUDO_HDR; - -// Definitions to maintain compatibility between other platforms -#define UCHAR u8 -#define USHORT u16 -#define ULONG u32 -#define BOOLEAN u8 -#define PULONG u32 * -#define PUSHORT u16 * -#define PUCHAR u8 * -#define PCHAR u8 * -#define UINT u32 - -#define ELECTRABUZZ_ID 0 // ASIC ID for Electrabuzz -#define MAGNEMITE_ID 0x1a01 // ASIC ID for Magnemite - -// MEMORY MAP common to both ELECTRABUZZ and MAGNEMITE -#define FT1000_REG_DPRAM_ADDR 0x000E // DPADR - Dual Port Ram Indirect Address Register -#define FT1000_REG_SUP_CTRL 0x0020 // HCTR - Host Control Register -#define FT1000_REG_SUP_STAT 0x0022 // HSTAT - Host Status Register -#define FT1000_REG_RESET 0x0024 // HCTR - Host Control Register -#define FT1000_REG_SUP_ISR 0x0026 // HISR - Host Interrupt Status Register -#define FT1000_REG_SUP_IMASK 0x0028 // HIMASK - Host Interrupt Mask -#define FT1000_REG_DOORBELL 0x002a // DBELL - Door Bell Register -#define FT1000_REG_ASIC_ID 0x002e // ASICID - ASIC Identification Number - // (Electrabuzz=0 Magnemite=0x1A01) - -// MEMORY MAP FOR ELECTRABUZZ ASIC - -#define FT1000_REG_UFIFO_STAT 0x0000 // UFSR - Uplink FIFO status register -#define FT1000_REG_UFIFO_BEG 0x0002 // UFBR - Uplink FIFO beginning register -#define FT1000_REG_UFIFO_MID 0x0004 // UFMR - Uplink FIFO middle register -#define FT1000_REG_UFIFO_END 0x0006 // UFER - Uplink FIFO end register -#define FT1000_REG_DFIFO_STAT 0x0008 // DFSR - Downlink FIFO status register -#define FT1000_REG_DFIFO 0x000A // DFR - Downlink FIFO Register -#define FT1000_REG_DPRAM_DATA 0x000C // DPRAM - Dual Port Indirect Data Register -#define FT1000_REG_WATERMARK 0x0010 // WMARK - Watermark Register - -// MEMORY MAP FOR MAGNEMITE -#define FT1000_REG_MAG_UFDR 0x0000 // UFDR - Uplink FIFO Data Register (32-bits) -#define FT1000_REG_MAG_UFDRL 0x0000 // UFDRL - Uplink FIFO Data Register low-word (16-bits) -#define FT1000_REG_MAG_UFDRH 0x0002 // UFDRH - Uplink FIFO Data Register high-word (16-bits) -#define FT1000_REG_MAG_UFER 0x0004 // UFER - Uplink FIFO End Register -#define FT1000_REG_MAG_UFSR 0x0006 // UFSR - Uplink FIFO Status Register -#define FT1000_REG_MAG_DFR 0x0008 // DFR - Downlink FIFO Register (32-bits) -#define FT1000_REG_MAG_DFRL 0x0008 // DFRL - Downlink FIFO Register low-word (16-bits) -#define FT1000_REG_MAG_DFRH 0x000a // DFRH - Downlink FIFO Register high-word (16-bits) -#define FT1000_REG_MAG_DFSR 0x000c // DFSR - Downlink FIFO Status Register -#define FT1000_REG_MAG_DPDATA 0x0010 // DPDATA - Dual Port RAM Indirect Data Register (32-bits) -#define FT1000_REG_MAG_DPDATAL 0x0010 // DPDATAL - Dual Port RAM Indirect Data Register low-word (16-bits) -#define FT1000_REG_MAG_DPDATAH 0x0012 // DPDATAH - Dual Port RAM Indirect Data Register high-word (16-bits) -#define FT1000_REG_MAG_WATERMARK 0x002c // WMARK - Watermark Register - -// Reserved Dual Port RAM offsets for Electrabuzz -#define FT1000_DPRAM_TX_BASE 0x0002 // Host to PC Card Messaging Area -#define FT1000_DPRAM_RX_BASE 0x0800 // PC Card to Host Messaging Area -#define FT1000_FIFO_LEN 0x7FC // total length for DSP FIFO tracking -#define FT1000_HI_HO 0x7FE // heartbeat with HI/HO -#define FT1000_DSP_STATUS 0xFFE // dsp status - non-zero is a request to reset dsp -#define FT1000_DSP_LED 0xFFA // dsp led status for PAD device -#define FT1000_DSP_CON_STATE 0xFF8 // DSP Connection Status Info -#define FT1000_DPRAM_FEFE 0x002 // location for dsp ready indicator -#define FT1000_DSP_TIMER0 0x1FF0 // Timer Field from Basestation -#define FT1000_DSP_TIMER1 0x1FF2 // Timer Field from Basestation -#define FT1000_DSP_TIMER2 0x1FF4 // Timer Field from Basestation -#define FT1000_DSP_TIMER3 0x1FF6 // Timer Field from Basestation - -// Reserved Dual Port RAM offsets for Magnemite -#define FT1000_DPRAM_MAG_TX_BASE 0x0000 // Host to PC Card Messaging Area -#define FT1000_DPRAM_MAG_RX_BASE 0x0200 // PC Card to Host Messaging Area -#define FT1000_MAG_FIFO_LEN 0x1FF // total length for DSP FIFO tracking -#define FT1000_MAG_FIFO_LEN_INDX 0x1 // low-word index -#define FT1000_MAG_HI_HO 0x1FF // heartbeat with HI/HO -#define FT1000_MAG_HI_HO_INDX 0x0 // high-word index -#define FT1000_MAG_DSP_LED 0x3FE // dsp led status for PAD device -#define FT1000_MAG_DSP_LED_INDX 0x0 // dsp led status for PAD device - -#define FT1000_MAG_DSP_CON_STATE 0x3FE // DSP Connection Status Info -#define FT1000_MAG_DSP_CON_STATE_INDX 0x1 // DSP Connection Status Info - -#define FT1000_MAG_DPRAM_FEFE 0x000 // location for dsp ready indicator -#define FT1000_MAG_DPRAM_FEFE_INDX 0x0 // location for dsp ready indicator - -#define FT1000_MAG_DSP_TIMER0 0x3FC // Timer Field from Basestation -#define FT1000_MAG_DSP_TIMER0_INDX 0x1 - -#define FT1000_MAG_DSP_TIMER1 0x3FC // Timer Field from Basestation -#define FT1000_MAG_DSP_TIMER1_INDX 0x0 - -#define FT1000_MAG_DSP_TIMER2 0x3FD // Timer Field from Basestation -#define FT1000_MAG_DSP_TIMER2_INDX 0x1 - -#define FT1000_MAG_DSP_TIMER3 0x3FD // Timer Field from Basestation -#define FT1000_MAG_DSP_TIMER3_INDX 0x0 - -#define FT1000_MAG_TOTAL_LEN 0x200 -#define FT1000_MAG_TOTAL_LEN_INDX 0x1 - -#define FT1000_MAG_PH_LEN 0x200 -#define FT1000_MAG_PH_LEN_INDX 0x0 - -#define FT1000_MAG_PORT_ID 0x201 -#define FT1000_MAG_PORT_ID_INDX 0x0 - -#define HOST_INTF_LE 0x0 // Host interface little endian mode -#define HOST_INTF_BE 0x1 // Host interface big endian mode - -// PC Card to Host Doorbell assignments -#define FT1000_DB_DPRAM_RX 0x0001 // this value indicates that DSP has - // data for host in DPRAM -#define FT1000_ASIC_RESET_REQ 0x0004 // DSP requesting host to reset the ASIC -#define FT1000_DSP_ASIC_RESET 0x0008 // DSP indicating host that it will reset the ASIC -#define FT1000_DB_COND_RESET 0x0010 // DSP request for a card reset. - -// Host to PC Card Doorbell assignments -#define FT1000_DB_DPRAM_TX 0x0100 // this value indicates that host has - // data for DSP in DPRAM. -#define FT1000_ASIC_RESET_DSP 0x0400 // Responds to FT1000_ASIC_RESET_REQ -#define FT1000_DB_HB 0x1000 // Indicates that supervisor - // has a heartbeat message for DSP. - -#define FT1000_DPRAM_BASE 0x0000 // Dual Port RAM starting offset - -#define hi 0x6869 // PC Card heartbeat values -#define ho 0x686f // PC Card heartbeat values - -// Magnemite specific defines -#define hi_mag 0x6968 // Byte swap hi to avoid additional system call -#define ho_mag 0x6f68 // Byte swap ho to avoid additional system call - -// -// Bit field definitions for Host Interrupt Status Register -// -// Indicate the cause of an interrupt. -// -#define ISR_EMPTY 0x00 // no bits set -#define ISR_DOORBELL_ACK 0x01 // Doorbell acknowledge from DSP -#define ISR_DOORBELL_PEND 0x02 // Doorbell pending from DSP -#define ISR_RCV 0x04 // Packet available in Downlink FIFO -#define ISR_WATERMARK 0x08 // Watermark requirements satisfied - -// Bit field definition for Host Interrupt Mask -#define ISR_MASK_NONE 0x0000 // no bits set -#define ISR_MASK_DOORBELL_ACK 0x0001 // Doorbell acknowledge mask -#define ISR_MASK_DOORBELL_PEND 0x0002 // Doorbell pending mask -#define ISR_MASK_RCV 0x0004 // Downlink Packet available mask -#define ISR_MASK_WATERMARK 0x0008 // Watermark interrupt mask -#define ISR_MASK_ALL 0xffff // Mask all interrupts - -// Bit field definition for Host Control Register -#define DSP_RESET_BIT 0x0001 // Bit field to control dsp reset state - // (0 = out of reset 1 = reset) -#define ASIC_RESET_BIT 0x0002 // Bit field to control ASIC reset state - // (0 = out of reset 1 = reset) - -// Default interrupt mask (Enable Doorbell pending and Packet available interrupts) -#define ISR_DEFAULT_MASK 0x7ff9 - -// Application specific IDs -#define DSPID 0x20 -#define HOSTID 0x10 -#define DSPAIRID 0x90 -#define DRIVERID 0x00 -#define NETWORKID 0x20 - -// Size of DPRAM Message -#define MAX_CMD_SQSIZE 1780 - -#define ENET_MAX_SIZE 1514 -#define ENET_HEADER_SIZE 14 - -#define SLOWQ_TYPE 0 -#define FASTQ_TYPE 1 - -#define MAX_DSP_SESS_REC 1024 - -#define DSP_QID_OFFSET 4 -#define PSEUDOSZ 16 -#define PSEUDOSZWRD 8 - -// Maximum number of occurrence of pseudo header errors before resetting PC Card. -#define MAX_PH_ERR 300 - -// Driver message types -#define MEDIA_STATE 0x0010 -#define TIME_UPDATE 0x0020 -#define DSP_PROVISION 0x0030 -#define DSP_INIT_MSG 0x0050 -#define DSP_HIBERNATE 0x0060 - -#define DSP_STORE_INFO 0x0070 -#define DSP_GET_INFO 0x0071 -#define GET_DRV_ERR_RPT_MSG 0x0073 -#define RSP_DRV_ERR_RPT_MSG 0x0074 - -// Driver Error Messages for DSP -#define DSP_HB_INFO 0x7ef0 -#define DSP_FIFO_INFO 0x7ef1 -#define DSP_CONDRESET_INFO 0x7ef2 -#define DSP_CMDLEN_INFO 0x7ef3 -#define DSP_CMDPHCKSUM_INFO 0x7ef4 -#define DSP_PKTPHCKSUM_INFO 0x7ef5 -#define DSP_PKTLEN_INFO 0x7ef6 -#define DSP_USER_RESET 0x7ef7 -#define FIFO_FLUSH_MAXLIMIT 0x7ef8 -#define FIFO_FLUSH_BADCNT 0x7ef9 -#define FIFO_ZERO_LEN 0x7efa - -#define HOST_QID_OFFSET 5 -#define QTYPE_OFFSET 13 - -#define SUCCESS 0x00 -#define FAILURE 0x01 -#define TRUE 0x1 -#define FALSE 0x0 - -#define MAX_NUM_APP 6 - -#define MAXIMUM_ASIC_HB_CNT 15 - -typedef struct _DRVMSG { - PSEUDO_HDR pseudo; - u16 type; - u16 length; - u8 data[0]; -} __attribute__ ((packed)) DRVMSG, *PDRVMSG; - -typedef struct _MEDIAMSG { - PSEUDO_HDR pseudo; - u16 type; - u16 length; - u16 state; - u32 ip_addr; - u32 net_mask; - u32 gateway; - u32 dns_1; - u32 dns_2; -} __attribute__ ((packed)) MEDIAMSG, *PMEDIAMSG; - -typedef struct _TIMEMSG { - PSEUDO_HDR pseudo; - u16 type; - u16 length; - u8 timeval[8]; -} __attribute__ ((packed)) TIMEMSG, *PTIMEMSG; - -typedef struct _DSPINITMSG { - PSEUDO_HDR pseudo; - u16 type; - u16 length; - u8 DspVer[DSPVERSZ]; // DSP version number - u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number - u8 Sku[SKUSZ]; // SKU - u8 eui64[EUISZ]; // EUI64 - u8 ProductMode[MODESZ]; // Product Mode (Market/Production) - u8 RfCalVer[CALVERSZ]; // Rf Calibration version - u8 RfCalDate[CALDATESZ]; // Rf Calibration date -} __attribute__ ((packed)) DSPINITMSG, *PDSPINITMSG; - -typedef struct _DSPHIBERNATE { - PSEUDO_HDR pseudo; - u16 type; - u16 length; - u32 timeout; - u16 sess_info[0]; -} DSPHIBERNATE, *PDSPHIBERNATE; - -typedef struct _APP_INFO_BLOCK -{ - u32 fileobject; // Application's file object - u16 app_id; // Application id -} APP_INFO_BLOCK, *PAPP_INFO_BLOCK; - -typedef struct _PROV_RECORD { - struct list_head list; - u8 *pprov_data; -} PROV_RECORD, *PPROV_RECORD; - -typedef struct _FT1000_INFO { - struct net_device_stats stats; - u16 DrvErrNum; - u16 AsicID; - int ASICResetNum; - int DspAsicReset; - int PktIntfErr; - int DSPResetNum; - int NumIOCTLBufs; - int IOCTLBufLvl; - int DeviceCreated; - int CardReady; - int DspHibernateFlag; - int DSPReady; - u8 DeviceName[15]; - int DeviceMajor; - int registered; - int mediastate; - u16 packetseqnum; - u8 squeseqnum; // sequence number on slow queue - spinlock_t dpram_lock; - u16 CurrentInterruptEnableMask; - int InterruptsEnabled; - u16 fifo_cnt; - u8 DspVer[DSPVERSZ]; // DSP version number - u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number - u8 Sku[SKUSZ]; // SKU - u8 eui64[EUISZ]; // EUI64 - time_t ConTm; // Connection Time - u16 LedStat; - u16 ConStat; - u16 ProgConStat; - u8 ProductMode[MODESZ]; - u8 RfCalVer[CALVERSZ]; - u8 RfCalDate[CALDATESZ]; - u16 DSP_TIME[4]; - struct list_head prov_list; - int appcnt; - APP_INFO_BLOCK app_info[MAX_NUM_APP]; - u16 DSPInfoBlklen; - u16 DrvMsgPend; +#include "../ft1000.h" + +#define FT1000_DRV_VER 0x01010300 + +#define FT1000_DPRAM_BASE 0x0000 /* Dual Port RAM starting offset */ + +/* Maximum number of occurrence of pseudo header errors before resetting PC Card. */ +#define MAX_PH_ERR 300 + +#define SUCCESS 0x00 +#define FAILURE 0x01 + +struct ft1000_info { + struct net_device_stats stats; + u16 DrvErrNum; + u16 AsicID; + int PktIntfErr; + int CardReady; + int registered; + int mediastate; + u16 packetseqnum; + u8 squeseqnum; /* sequence number on slow queue */ + spinlock_t dpram_lock; + u16 fifo_cnt; + u8 DspVer[DSPVERSZ]; /* DSP version number */ + u8 HwSerNum[HWSERNUMSZ]; /* Hardware Serial Number */ + u8 Sku[SKUSZ]; /* SKU */ + u8 eui64[EUISZ]; /* EUI64 */ + time_t ConTm; /* Connection Time */ + u16 LedStat; + u16 ConStat; + u16 ProgConStat; + u8 ProductMode[MODESZ]; + u8 RfCalVer[CALVERSZ]; + u8 RfCalDate[CALDATESZ]; + u16 DSP_TIME[4]; + struct list_head prov_list; + u16 DSPInfoBlklen; int (*ft1000_reset)(void *); - void *link; - u16 DSPInfoBlk[MAX_DSP_SESS_REC]; - union { - u16 Rec[MAX_DSP_SESS_REC]; - u32 MagRec[MAX_DSP_SESS_REC/2]; - } DSPSess; + void *link; + u16 DSPInfoBlk[MAX_DSP_SESS_REC]; + union { + u16 Rec[MAX_DSP_SESS_REC]; + u32 MagRec[MAX_DSP_SESS_REC/2]; + } DSPSess; struct proc_dir_entry *proc_ft1000; char netdevname[IFNAMSIZ]; -} FT1000_INFO, *PFT1000_INFO; +}; + +struct pcmcia_device; +struct net_device; +extern struct net_device *init_ft1000_card(struct pcmcia_device *link, + void *ft1000_reset); +extern void stop_ft1000_card(struct net_device *dev); +extern int card_download(struct net_device *dev, const u8 *pFileStart, + size_t FileLength); +extern void ft1000InitProc(struct net_device *dev); +extern void ft1000CleanupProc(struct net_device *dev); + +extern u16 ft1000_read_dpram(struct net_device *dev, int offset); +extern void card_bootload(struct net_device *dev); +extern u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index); +extern u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset); +void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value); -typedef struct _DPRAM_BLK { - struct list_head list; - u16 *pbuffer; -} __attribute__ ((packed)) DPRAM_BLK, *PDPRAM_BLK; +/* Read the value of a given ASIC register. */ +static inline u16 ft1000_read_reg(struct net_device *dev, u16 offset) +{ + return inw(dev->base_addr + offset); +} -extern u16 ft1000_read_dpram (struct net_device *dev, int offset); -extern void card_bootload(struct net_device *dev); -extern u16 ft1000_read_dpram_mag_16 (struct net_device *dev, int offset, int Index); -extern u32 ft1000_read_dpram_mag_32 (struct net_device *dev, int offset); -void ft1000_write_dpram_mag_32 (struct net_device *dev, int offset, u32 value); +/* Set the value of a given ASIC register. */ +static inline void ft1000_write_reg(struct net_device *dev, u16 offset, u16 value) +{ + outw(value, dev->base_addr + offset); +} -#endif // _FT1000H_ +#endif diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c index 68ea035..f376ca4 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_cs.c @@ -29,153 +29,54 @@ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> -#include <linux/ptrace.h> -#include <linux/slab.h> -#include <linux/string.h> -#include <linux/timer.h> -#include <linux/ioport.h> -#include <linux/delay.h> - #include <linux/netdevice.h> -#include <linux/etherdevice.h> - #include <pcmcia/cistpl.h> -#include <pcmcia/cisreg.h> #include <pcmcia/ds.h> -#include <asm/io.h> -#include <asm/system.h> -#include <asm/byteorder.h> -#include <asm/uaccess.h> - /*====================================================================*/ -/* Module parameters */ - -#define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i") - MODULE_AUTHOR("Wai Chan"); MODULE_DESCRIPTION("FT1000 PCMCIA driver"); MODULE_LICENSE("GPL"); -/* Newer, simpler way of listing specific interrupts */ - -/* The old way: bit map of interrupts to choose from */ -/* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */ - -/* - All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If - you do not define PCMCIA_DEBUG at all, all the debug code will be - left out. If you compile with PCMCIA_DEBUG=0, the debug code will - be present but disabled. -*/ -#ifdef FT_DEBUG -#define DEBUG(n, args...) printk(KERN_DEBUG args) -#else -#define DEBUG(n, args...) -#endif - /*====================================================================*/ -struct net_device *init_ft1000_card(struct pcmcia_device *link, - void *ft1000_reset); -void stop_ft1000_card(struct net_device *); - static int ft1000_config(struct pcmcia_device *link); -static void ft1000_release(struct pcmcia_device *link); - -/* - The attach() and detach() entry points are used to create and destroy - "instances" of the driver, where each instance represents everything - needed to manage one actual PCMCIA card. -*/ - static void ft1000_detach(struct pcmcia_device *link); -static int ft1000_attach(struct pcmcia_device *link); +static int ft1000_attach(struct pcmcia_device *link); -typedef struct local_info_t { - struct pcmcia_device *link; - struct net_device *dev; -} local_info_t; - -#define MAX_ASIC_RESET_CNT 10 -#define COR_DEFAULT 0x55 +#include "ft1000.h" /*====================================================================*/ -static void ft1000_reset(struct pcmcia_device * link) +static void ft1000_reset(struct pcmcia_device *link) { pcmcia_reset_card(link->socket); } -/*====================================================================== - - -======================================================================*/ - static int ft1000_attach(struct pcmcia_device *link) { - - local_info_t *local; - - DEBUG(0, "ft1000_cs: ft1000_attach()\n"); - - local = kzalloc(sizeof(local_info_t), GFP_KERNEL); - if (!local) { - return -ENOMEM; - } - local->link = link; - - link->priv = local; - local->dev = NULL; - + link->priv = NULL; link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; return ft1000_config(link); - -} /* ft1000_attach */ - -/*====================================================================== - - This deletes a driver "instance". The device is de-registered - with Card Services. If it has been released, all local data - structures are freed. Otherwise, the structures will be freed - when the device is released. - -======================================================================*/ +} static void ft1000_detach(struct pcmcia_device *link) { - struct net_device *dev = ((local_info_t *) link->priv)->dev; - - DEBUG(0, "ft1000_cs: ft1000_detach(0x%p)\n", link); - - if (link == NULL) { - DEBUG(0,"ft1000_cs:ft1000_detach: Got a NULL pointer\n"); - return; - } + struct net_device *dev = link->priv; - if (dev) { + if (dev) stop_ft1000_card(dev); - } pcmcia_disable_device(link); - - /* This points to the parent local_info_t struct */ free_netdev(dev); +} -} /* ft1000_detach */ - -/*====================================================================== - - Check if the io window is configured - -======================================================================*/ -int ft1000_confcheck(struct pcmcia_device *link, void *priv_data) +static int ft1000_confcheck(struct pcmcia_device *link, void *priv_data) { - return pcmcia_request_io(link); -} /* ft1000_confcheck */ +} /*====================================================================== @@ -187,7 +88,7 @@ int ft1000_confcheck(struct pcmcia_device *link, void *priv_data) static int ft1000_config(struct pcmcia_device *link) { - int ret; + int ret; dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link); @@ -205,9 +106,8 @@ static int ft1000_config(struct pcmcia_device *link) goto failed; } - ((local_info_t *) link->priv)->dev = init_ft1000_card(link, - &ft1000_reset); - if (((local_info_t *) link->priv)->dev == NULL) { + link->priv = init_ft1000_card(link, &ft1000_reset); + if (!link->priv) { printk(KERN_INFO "ft1000: Could not register as network device\n"); goto failed; } @@ -216,57 +116,13 @@ static int ft1000_config(struct pcmcia_device *link) return 0; failed: - ft1000_release(link); + pcmcia_disable_device(link); return -ENODEV; - -} /* ft1000_config */ - -/*====================================================================== - - After a card is removed, ft1000_release() will unregister the - device, and release the PCMCIA configuration. If the device is - still open, this will be postponed until it is closed. - -======================================================================*/ - -static void ft1000_release(struct pcmcia_device * link) -{ - - DEBUG(0, "ft1000_cs: ft1000_release(0x%p)\n", link); - - /* - If the device is currently in use, we won't release until it - is actually closed, because until then, we can't be sure that - no one will try to access the device or its data structures. - */ - - /* - In a normal driver, additional code may be needed to release - other kernel data structures associated with this device. - */ - kfree((local_info_t *) link->priv); - /* Don't bother checking to see if these succeed or not */ - - pcmcia_disable_device(link); -} /* ft1000_release */ - -/*====================================================================== - - The card status event handler. Mostly, this schedules other - stuff to run after an event is received. - - When a CARD_REMOVAL event is received, we immediately set a - private flag to block future accesses to this device. All the - functions that actually access the device should check this flag - to make sure the card is still present. - -======================================================================*/ +} static int ft1000_suspend(struct pcmcia_device *link) { - struct net_device *dev = ((local_info_t *) link->priv)->dev; - - DEBUG(1, "ft1000_cs: ft1000_event(0x%06x)\n", event); + struct net_device *dev = link->priv; if (link->open) netif_device_detach(dev); @@ -275,13 +131,9 @@ static int ft1000_suspend(struct pcmcia_device *link) static int ft1000_resume(struct pcmcia_device *link) { -/* struct net_device *dev = link->priv; - */ return 0; } - - /*====================================================================*/ static const struct pcmcia_device_id ft1000_ids[] = { @@ -294,26 +146,22 @@ static const struct pcmcia_device_id ft1000_ids[] = { MODULE_DEVICE_TABLE(pcmcia, ft1000_ids); static struct pcmcia_driver ft1000_cs_driver = { - .owner = THIS_MODULE, - .drv = { - .name = "ft1000_cs", - }, - .probe = ft1000_attach, - .remove = ft1000_detach, + .owner = THIS_MODULE, + .name = "ft1000_cs", + .probe = ft1000_attach, + .remove = ft1000_detach, .id_table = ft1000_ids, - .suspend = ft1000_suspend, - .resume = ft1000_resume, + .suspend = ft1000_suspend, + .resume = ft1000_resume, }; static int __init init_ft1000_cs(void) { - DEBUG(0, "ft1000_cs: loading\n"); return pcmcia_register_driver(&ft1000_cs_driver); } static void __exit exit_ft1000_cs(void) { - DEBUG(0, "ft1000_cs: unloading\n"); pcmcia_unregister_driver(&ft1000_cs_driver); } diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h deleted file mode 100644 index 0b63f05..0000000 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dev.h +++ /dev/null @@ -1,66 +0,0 @@ -//--------------------------------------------------------------------------- -// FT1000 driver for Flarion Flash OFDM NIC Device -// -// Copyright (C) 2002 Flarion Technologies, All rights reserved. -// -// This program is free software; you can redistribute it and/or modify it -// under the terms of the GNU General Public License as published by the Free -// Software Foundation; either version 2 of the License, or (at your option) any -// later version. This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for -// more details. You should have received a copy of the GNU General Public -// License along with this program; if not, write to the -// Free Software Foundation, Inc., 59 Temple Place - -// Suite 330, Boston, MA 02111-1307, USA. -//--------------------------------------------------------------------------- -// -// File: ft1000_dev.h -// -// Description: Register definitions and bit masks for the FT1000 NIC -// -// History: -// 2/5/02 Ivan Bohannon Written. -// 8/29/02 Whc Ported to Linux. -// -//--------------------------------------------------------------------------- -#ifndef _FT1000_DEVH_ -#define _FT1000_DEVH_ - -//--------------------------------------------------------------------------- -// -// Function: ft1000_read_reg -// Description: This function will read the value of a given ASIC register. -// Input: -// dev - device structure -// offset - ASIC register offset -// Output: -// data - ASIC register value -// -//--------------------------------------------------------------------------- -static inline u16 ft1000_read_reg (struct net_device *dev, u16 offset) { - u16 data = 0; - - data = inw(dev->base_addr + offset); - - return (data); -} - -//--------------------------------------------------------------------------- -// -// Function: ft1000_write_reg -// Description: This function will set the value for a given ASIC register. -// Input: -// dev - device structure -// offset - ASIC register offset -// value - value to write -// Output: -// None. -// -//--------------------------------------------------------------------------- -static inline void ft1000_write_reg (struct net_device *dev, u16 offset, u16 value) { - outw (value, dev->base_addr + offset); -} - -#endif // _FT1000_DEVH_ - diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c index fb375ea..f8b8e71 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_dnld.c @@ -34,7 +34,6 @@ #include <asm/uaccess.h> #include <linux/vmalloc.h> -#include "ft1000_dev.h" #include "ft1000.h" #include "boot.h" @@ -87,26 +86,14 @@ #define STATE_DONE_PROV 0x06 #define STATE_DONE_FILE 0x07 -USHORT get_handshake(struct net_device *dev, USHORT expected_value); -void put_handshake(struct net_device *dev, USHORT handshake_value); -USHORT get_request_type(struct net_device *dev); +u16 get_handshake(struct net_device *dev, u16 expected_value); +void put_handshake(struct net_device *dev, u16 handshake_value); +u16 get_request_type(struct net_device *dev); long get_request_value(struct net_device *dev); void put_request_value(struct net_device *dev, long lvalue); -USHORT hdr_checksum(PPSEUDO_HDR pHdr); +u16 hdr_checksum(struct pseudo_hdr *pHdr); -typedef struct _DSP_FILE_HDR { - u32 build_date; - u32 dsp_coff_date; - u32 loader_code_address; - u32 loader_code_size; - u32 loader_code_end; - u32 dsp_code_address; - u32 dsp_code_size; - u32 dsp_code_end; - u32 reserved[8]; -} __attribute__ ((packed)) DSP_FILE_HDR, *PDSP_FILE_HDR; - -typedef struct _DSP_FILE_HDR_5 { +struct dsp_file_hdr { u32 version_id; // Version ID of this image format. u32 package_id; // Package ID of code release. u32 build_date; // Date/time stamp when file was built. @@ -118,18 +105,9 @@ typedef struct _DSP_FILE_HDR_5 { u32 version_data_offset; // Offset were scrambled version data begins. u32 version_data_size; // Size, in words, of scrambled version data. u32 nDspImages; // Number of DSP images in file. -} __attribute__ ((packed)) DSP_FILE_HDR_5, *PDSP_FILE_HDR_5; - -typedef struct _DSP_IMAGE_INFO { - u32 coff_date; // Date/time when DSP Coff image was built. - u32 begin_offset; // Offset in file where image begins. - u32 end_offset; // Offset in file where image begins. - u32 run_address; // On chip Start address of DSP code. - u32 image_size; // Size of image. - u32 version; // Embedded version # of DSP code. -} __attribute__ ((packed)) DSP_IMAGE_INFO, *PDSP_IMAGE_INFO; +} __attribute__ ((packed)); -typedef struct _DSP_IMAGE_INFO_V6 { +struct dsp_image_info { u32 coff_date; // Date/time when DSP Coff image was built. u32 begin_offset; // Offset in file where image begins. u32 end_offset; // Offset in file where image begins. @@ -138,20 +116,20 @@ typedef struct _DSP_IMAGE_INFO_V6 { u32 version; // Embedded version # of DSP code. unsigned short checksum; // Dsp File checksum unsigned short pad1; -} __attribute__ ((packed)) DSP_IMAGE_INFO_V6, *PDSP_IMAGE_INFO_V6; +} __attribute__ ((packed)); void card_bootload(struct net_device *dev) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); unsigned long flags; - PULONG pdata; - UINT size; - UINT i; - ULONG templong; + u32 *pdata; + u32 size; + u32 i; + u32 templong; DEBUG(0, "card_bootload is called\n"); - pdata = (PULONG) bootimage; + pdata = (u32 *) bootimage; size = sizeof(bootimage); // check for odd word @@ -172,11 +150,11 @@ void card_bootload(struct net_device *dev) spin_unlock_irqrestore(&info->dpram_lock, flags); } -USHORT get_handshake(struct net_device *dev, USHORT expected_value) +u16 get_handshake(struct net_device *dev, u16 expected_value) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); - USHORT handshake; - ULONG tempx; + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); + u16 handshake; + u32 tempx; int loopcnt; loopcnt = 0; @@ -190,7 +168,7 @@ USHORT get_handshake(struct net_device *dev, USHORT expected_value) tempx = ntohl(ft1000_read_dpram_mag_32 (dev, DWNLD_MAG_HANDSHAKE_LOC)); - handshake = (USHORT) tempx; + handshake = (u16) tempx; } if ((handshake == expected_value) @@ -207,27 +185,27 @@ USHORT get_handshake(struct net_device *dev, USHORT expected_value) } -void put_handshake(struct net_device *dev, USHORT handshake_value) +void put_handshake(struct net_device *dev, u16 handshake_value) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); - ULONG tempx; + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); + u32 tempx; if (info->AsicID == ELECTRABUZZ_ID) { ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_HANDSHAKE_LOC); ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, handshake_value); /* Handshake */ } else { - tempx = (ULONG) handshake_value; + tempx = (u32) handshake_value; tempx = ntohl(tempx); ft1000_write_dpram_mag_32(dev, DWNLD_MAG_HANDSHAKE_LOC, tempx); /* Handshake */ } } -USHORT get_request_type(struct net_device *dev) +u16 get_request_type(struct net_device *dev) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); - USHORT request_type; - ULONG tempx; + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); + u16 request_type; + u32 tempx; if (info->AsicID == ELECTRABUZZ_ID) { ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_TYPE_LOC); @@ -235,7 +213,7 @@ USHORT get_request_type(struct net_device *dev) } else { tempx = ft1000_read_dpram_mag_32(dev, DWNLD_MAG_TYPE_LOC); tempx = ntohl(tempx); - request_type = (USHORT) tempx; + request_type = (u16) tempx; } return request_type; @@ -244,9 +222,9 @@ USHORT get_request_type(struct net_device *dev) long get_request_value(struct net_device *dev) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); long value; - USHORT w_val; + u16 w_val; if (info->AsicID == ELECTRABUZZ_ID) { ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, @@ -273,19 +251,19 @@ long get_request_value(struct net_device *dev) void put_request_value(struct net_device *dev, long lvalue) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); - USHORT size; - ULONG tempx; + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); + u16 size; + u32 tempx; if (info->AsicID == ELECTRABUZZ_ID) { - size = (USHORT) (lvalue >> 16); + size = (u16) (lvalue >> 16); ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_SIZE_MSW_LOC); ft1000_write_reg(dev, FT1000_REG_DPRAM_DATA, size); - size = (USHORT) (lvalue); + size = (u16) (lvalue); ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, DWNLD_SIZE_LSW_LOC); @@ -298,10 +276,10 @@ void put_request_value(struct net_device *dev, long lvalue) } -USHORT hdr_checksum(PPSEUDO_HDR pHdr) +u16 hdr_checksum(struct pseudo_hdr *pHdr) { - USHORT *usPtr = (USHORT *) pHdr; - USHORT chksum; + u16 *usPtr = (u16 *) pHdr; + u16 chksum; chksum = ((((((usPtr[0] ^ usPtr[1]) ^ usPtr[2]) ^ usPtr[3]) ^ usPtr[4]) ^ usPtr[5]) ^ usPtr[6]); @@ -309,32 +287,30 @@ USHORT hdr_checksum(PPSEUDO_HDR pHdr) return chksum; } -int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) +int card_download(struct net_device *dev, const u8 *pFileStart, + size_t FileLength) { - FT1000_INFO *info = (PFT1000_INFO) netdev_priv(dev); + struct ft1000_info *info = (struct ft1000_info *) netdev_priv(dev); int Status = SUCCESS; - USHORT DspWordCnt = 0; - UINT uiState; - USHORT handshake; - PPSEUDO_HDR pHdr; - USHORT usHdrLength; - PDSP_FILE_HDR pFileHdr; + u32 uiState; + u16 handshake; + struct pseudo_hdr *pHdr; + u16 usHdrLength; long word_length; - USHORT request; - USHORT temp; - PPROV_RECORD pprov_record; - PUCHAR pbuffer; - PDSP_FILE_HDR_5 pFileHdr5; - PDSP_IMAGE_INFO pDspImageInfo = NULL; - PDSP_IMAGE_INFO_V6 pDspImageInfoV6 = NULL; + u16 request; + u16 temp; + struct prov_record *pprov_record; + u8 *pbuffer; + struct dsp_file_hdr *pFileHdr5; + struct dsp_image_info *pDspImageInfoV6 = NULL; long requested_version; - BOOLEAN bGoodVersion = 0; - PDRVMSG pMailBoxData; - USHORT *pUsData = NULL; - USHORT *pUsFile = NULL; - UCHAR *pUcFile = NULL; - UCHAR *pBootEnd = NULL; - UCHAR *pCodeEnd = NULL; + bool bGoodVersion = 0; + struct drv_msg *pMailBoxData; + u16 *pUsData = NULL; + u16 *pUsFile = NULL; + u8 *pUcFile = NULL; + u8 *pBootEnd = NULL; + u8 *pCodeEnd = NULL; int imageN; long file_version; long loader_code_address = 0; @@ -345,36 +321,22 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) unsigned long templong; unsigned long image_chksum = 0; - // - // Get version id of file, at first 4 bytes of file, for newer files. - // file_version = *(long *)pFileStart; + if (file_version != 6) { + printk(KERN_ERR "ft1000: unsupported firmware version %ld\n", file_version); + Status = FAILURE; + } uiState = STATE_START_DWNLD; - pFileHdr = (PDSP_FILE_HDR) pFileStart; - pFileHdr5 = (PDSP_FILE_HDR_5) pFileStart; - - switch (file_version) { - case 5: - case 6: - pUsFile = - (USHORT *) ((long)pFileStart + pFileHdr5->loader_offset); - pUcFile = - (UCHAR *) ((long)pFileStart + pFileHdr5->loader_offset); + pFileHdr5 = (struct dsp_file_hdr *) pFileStart; - pBootEnd = - (UCHAR *) ((long)pFileStart + pFileHdr5->loader_code_end); - - loader_code_address = pFileHdr5->loader_code_address; - loader_code_size = pFileHdr5->loader_code_size; - bGoodVersion = FALSE; - break; - - default: - Status = FAILURE; - break; - } + pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->loader_offset); + pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->loader_offset); + pBootEnd = (u8 *) ((long)pFileStart + pFileHdr5->loader_code_end); + loader_code_address = pFileHdr5->loader_code_address; + loader_code_size = pFileHdr5->loader_code_size; + bGoodVersion = false; while ((Status == SUCCESS) && (uiState != STATE_DONE_FILE)) { @@ -411,8 +373,8 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) break; case REQUEST_DONE_BL: /* Reposition ptrs to beginning of code section */ - pUsFile = (USHORT *) ((long)pBootEnd); - pUcFile = (UCHAR *) ((long)pBootEnd); + pUsFile = (u16 *) ((long)pBootEnd); + pUcFile = (u8 *) ((long)pBootEnd); uiState = STATE_CODE_DWNLD; break; case REQUEST_CODE_SEGMENT: @@ -432,45 +394,24 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) // Provide mutual exclusive access while reading ASIC registers. spin_lock_irqsave(&info->dpram_lock, flags); - if (file_version == 5) { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - ft1000_write_reg(dev, - FT1000_REG_DPRAM_ADDR, - DWNLD_PS_HDR_LOC); - - for (; word_length > 0; word_length--) { /* In words */ - //temp = *pUsFile; - //temp = RtlUshortByteSwap(temp); - ft1000_write_reg(dev, - FT1000_REG_DPRAM_DATA, - *pUsFile); - pUsFile++; - pUcFile += 2; - DspWordCnt++; - } - } else { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - outw(DWNLD_MAG_PS_HDR_LOC, + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) + word_length++; + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = *pUsFile++; + templong |= + (*pUsFile++ << 16); + pUcFile += 4; + outl(templong, dev->base_addr + - FT1000_REG_DPRAM_ADDR); - if (word_length & 0x01) { - word_length++; - } - word_length = word_length / 2; - - for (; word_length > 0; word_length--) { /* In words */ - templong = *pUsFile++; - templong |= - (*pUsFile++ << 16); - pUcFile += 4; - outl(templong, - dev->base_addr + - FT1000_REG_MAG_DPDATAL); - } + FT1000_REG_MAG_DPDATAL); } spin_unlock_irqrestore(&info-> dpram_lock, @@ -520,24 +461,8 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) break; case REQUEST_DONE_CL: /* Reposition ptrs to beginning of provisioning section */ - switch (file_version) { - case 5: - case 6: - pUsFile = - (USHORT *) ((long)pFileStart - + - pFileHdr5-> - commands_offset); - pUcFile = - (UCHAR *) ((long)pFileStart - + - pFileHdr5-> - commands_offset); - break; - default: - Status = FAILURE; - break; - } + pUsFile = (u16 *) ((long)pFileStart + pFileHdr5->commands_offset); + pUcFile = (u8 *) ((long)pFileStart + pFileHdr5->commands_offset); uiState = STATE_DONE_DWNLD; break; case REQUEST_CODE_SEGMENT: @@ -558,45 +483,24 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) Status = FAILURE; break; } - if (file_version == 5) { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - ft1000_write_reg(dev, - FT1000_REG_DPRAM_ADDR, - DWNLD_PS_HDR_LOC); - - for (; word_length > 0; word_length--) { /* In words */ - //temp = *pUsFile; - //temp = RtlUshortByteSwap(temp); - ft1000_write_reg(dev, - FT1000_REG_DPRAM_DATA, - *pUsFile); - pUsFile++; - pUcFile += 2; - DspWordCnt++; - } - } else { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - outw(DWNLD_MAG_PS_HDR_LOC, + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) + word_length++; + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = *pUsFile++; + templong |= + (*pUsFile++ << 16); + pUcFile += 4; + outl(templong, dev->base_addr + - FT1000_REG_DPRAM_ADDR); - if (word_length & 0x01) { - word_length++; - } - word_length = word_length / 2; - - for (; word_length > 0; word_length--) { /* In words */ - templong = *pUsFile++; - templong |= - (*pUsFile++ << 16); - pUcFile += 4; - outl(templong, - dev->base_addr + - FT1000_REG_MAG_DPDATAL); - } + FT1000_REG_MAG_DPDATAL); } break; @@ -606,9 +510,9 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) (long)(info->DSPInfoBlklen + 1) / 2; put_request_value(dev, word_length); pMailBoxData = - (PDRVMSG) & info->DSPInfoBlk[0]; + (struct drv_msg *) & info->DSPInfoBlk[0]; pUsData = - (USHORT *) & pMailBoxData->data[0]; + (u16 *) & pMailBoxData->data[0]; // Provide mutual exclusive access while reading ASIC registers. spin_lock_irqsave(&info->dpram_lock, flags); @@ -658,51 +562,32 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) pFileHdr5->version_data_size; put_request_value(dev, word_length); pUsFile = - (USHORT *) ((long)pFileStart + + (u16 *) ((long)pFileStart + pFileHdr5-> version_data_offset); // Provide mutual exclusive access while reading ASIC registers. spin_lock_irqsave(&info->dpram_lock, flags); - if (file_version == 5) { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - ft1000_write_reg(dev, - FT1000_REG_DPRAM_ADDR, - DWNLD_PS_HDR_LOC); - - for (; word_length > 0; word_length--) { /* In words */ - ft1000_write_reg(dev, - FT1000_REG_DPRAM_DATA, - *pUsFile - /*temp */ - ); - pUsFile++; - } - } else { - /* - * Position ASIC DPRAM auto-increment pointer. - */ - outw(DWNLD_MAG_PS_HDR_LOC, + /* + * Position ASIC DPRAM auto-increment pointer. + */ + outw(DWNLD_MAG_PS_HDR_LOC, + dev->base_addr + + FT1000_REG_DPRAM_ADDR); + if (word_length & 0x01) + word_length++; + word_length = word_length / 2; + + for (; word_length > 0; word_length--) { /* In words */ + templong = + ntohs(*pUsFile++); + temp = + ntohs(*pUsFile++); + templong |= + (temp << 16); + outl(templong, dev->base_addr + - FT1000_REG_DPRAM_ADDR); - if (word_length & 0x01) { - word_length++; - } - word_length = word_length / 2; - - for (; word_length > 0; word_length--) { /* In words */ - templong = - ntohs(*pUsFile++); - temp = - ntohs(*pUsFile++); - templong |= - (temp << 16); - outl(templong, - dev->base_addr + - FT1000_REG_MAG_DPDATAL); - } + FT1000_REG_MAG_DPDATAL); } spin_unlock_irqrestore(&info-> dpram_lock, @@ -710,120 +595,71 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) break; case REQUEST_CODE_BY_VERSION: - bGoodVersion = FALSE; + bGoodVersion = false; requested_version = get_request_value(dev); - if (file_version == 5) { - pDspImageInfo = - (PDSP_IMAGE_INFO) ((long) - pFileStart - + - sizeof - (DSP_FILE_HDR_5)); - for (imageN = 0; - imageN < - pFileHdr5->nDspImages; - imageN++) { - if (pDspImageInfo-> - version == - requested_version) { - bGoodVersion = - TRUE; - pUsFile = - (USHORT - *) ((long) - pFileStart - + - pDspImageInfo-> - begin_offset); - pUcFile = - (UCHAR - *) ((long) - pFileStart - + - pDspImageInfo-> - begin_offset); - pCodeEnd = - (UCHAR - *) ((long) - pFileStart - + - pDspImageInfo-> - end_offset); - run_address = - pDspImageInfo-> - run_address; - run_size = - pDspImageInfo-> - image_size; - break; - } - pDspImageInfo++; - } - } else { - pDspImageInfoV6 = - (PDSP_IMAGE_INFO_V6) ((long) - pFileStart - + - sizeof - (DSP_FILE_HDR_5)); - for (imageN = 0; - imageN < - pFileHdr5->nDspImages; - imageN++) { - temp = (USHORT) - (pDspImageInfoV6-> - version); - templong = temp; - temp = (USHORT) - (pDspImageInfoV6-> - version >> 16); - templong |= - (temp << 16); - if (templong == - requested_version) { - bGoodVersion = - TRUE; - pUsFile = - (USHORT - *) ((long) - pFileStart - + - pDspImageInfoV6-> - begin_offset); - pUcFile = - (UCHAR - *) ((long) - pFileStart - + - pDspImageInfoV6-> - begin_offset); - pCodeEnd = - (UCHAR - *) ((long) - pFileStart - + - pDspImageInfoV6-> - end_offset); - run_address = - pDspImageInfoV6-> - run_address; - run_size = - pDspImageInfoV6-> - image_size; - image_chksum = - (ULONG) - pDspImageInfoV6-> - checksum; - DEBUG(0, - "ft1000_dnld: image_chksum = 0x%8x\n", - (unsigned - int) - image_chksum); - break; - } - pDspImageInfoV6++; + pDspImageInfoV6 = + (struct dsp_image_info *) ((long) + pFileStart + + + sizeof + (struct dsp_file_hdr)); + for (imageN = 0; + imageN < + pFileHdr5->nDspImages; + imageN++) { + temp = (u16) + (pDspImageInfoV6-> + version); + templong = temp; + temp = (u16) + (pDspImageInfoV6-> + version >> 16); + templong |= + (temp << 16); + if (templong == + requested_version) { + bGoodVersion = + true; + pUsFile = + (u16 + *) ((long) + pFileStart + + + pDspImageInfoV6-> + begin_offset); + pUcFile = + (u8 + *) ((long) + pFileStart + + + pDspImageInfoV6-> + begin_offset); + pCodeEnd = + (u8 + *) ((long) + pFileStart + + + pDspImageInfoV6-> + end_offset); + run_address = + pDspImageInfoV6-> + run_address; + run_size = + pDspImageInfoV6-> + image_size; + image_chksum = + (u32) + pDspImageInfoV6-> + checksum; + DEBUG(0, + "ft1000_dnld: image_chksum = 0x%8x\n", + (unsigned + int) + image_chksum); + break; } + pDspImageInfoV6++; } if (!bGoodVersion) { /* @@ -852,7 +688,7 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) break; } - pHdr = (PPSEUDO_HDR) pUsFile; + pHdr = (struct pseudo_hdr *) pUsFile; if (pHdr->portdest == 0x80 /* DspOAM */ && (pHdr->portsrc == 0x00 /* Driver */ @@ -872,7 +708,7 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) case STATE_SECTION_PROV: - pHdr = (PPSEUDO_HDR) pUcFile; + pHdr = (struct pseudo_hdr *) pUcFile; if (pHdr->checksum == hdr_checksum(pHdr)) { if (pHdr->portdest != 0x80 /* Dsp OAM */ ) { @@ -883,15 +719,15 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) // Get buffer for provisioning data pbuffer = - kmalloc((usHdrLength + sizeof(PSEUDO_HDR)), + kmalloc((usHdrLength + sizeof(struct pseudo_hdr)), GFP_ATOMIC); if (pbuffer) { memcpy(pbuffer, (void *)pUcFile, - (UINT) (usHdrLength + - sizeof(PSEUDO_HDR))); + (u32) (usHdrLength + + sizeof(struct pseudo_hdr))); // link provisioning data pprov_record = - kmalloc(sizeof(PROV_RECORD), + kmalloc(sizeof(struct prov_record), GFP_ATOMIC); if (pprov_record) { pprov_record->pprov_data = @@ -901,8 +737,8 @@ int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength) &info->prov_list); // Move to next entry if available pUcFile = - (UCHAR *) ((unsigned long) pUcFile + - (unsigned long) ((usHdrLength + 1) & 0xFFFFFFFE) + sizeof(PSEUDO_HDR)); + (u8 *) ((unsigned long) pUcFile + + (unsigned long) ((usHdrLength + 1) & 0xFFFFFFFE) + sizeof(struct pseudo_hdr)); if ((unsigned long) (pUcFile) - (unsigned long) (pFileStart) >= (unsigned long) FileLength) { diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c index 830822f..b3d743a 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_hw.c @@ -54,19 +54,13 @@ #endif #include <linux/delay.h> -#include "ft1000_dev.h" #include "ft1000.h" -int card_download(struct net_device *dev, const u8 *pFileStart, UINT FileLength); - -void ft1000InitProc(struct net_device *dev); -void ft1000CleanupProc(struct net_device *dev); - -const struct firmware *fw_entry; +static const struct firmware *fw_entry; static void ft1000_hbchk(u_long data); static struct timer_list poll_timer = { - function:ft1000_hbchk + .function = ft1000_hbchk }; static u16 cmdbuffer[1024]; @@ -89,40 +83,6 @@ MODULE_SUPPORTED_DEVICE("FT1000"); //--------------------------------------------------------------------------- // -// Function: ft1000_asic_read -// Description: This function will retrieve the value of a specific ASIC -// register. -// Input: -// dev - network device structure -// offset - ASIC register to read -// Output: -// value - value of ASIC register -// -//--------------------------------------------------------------------------- -inline u16 ft1000_asic_read(struct net_device *dev, u16 offset) -{ - return (ft1000_read_reg(dev, offset)); -} - -//--------------------------------------------------------------------------- -// -// Function: ft1000_asic_write -// Description: This function will set the value of a specific ASIC -// register. -// Input: -// dev - network device structure -// value - value to set ASIC register -// Output: -// none -// -//--------------------------------------------------------------------------- -inline void ft1000_asic_write(struct net_device *dev, u16 offset, u16 value) -{ - ft1000_write_reg(dev, offset, value); -} - -//--------------------------------------------------------------------------- -// // Function: ft1000_read_fifo_len // Description: This function will read the ASIC Uplink FIFO status register // which will return the number of bytes remaining in the Uplink FIFO. @@ -136,7 +96,7 @@ inline void ft1000_asic_write(struct net_device *dev, u16 offset, u16 value) //--------------------------------------------------------------------------- static inline u16 ft1000_read_fifo_len(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); if (info->AsicID == ELECTRABUZZ_ID) { return (ft1000_read_reg(dev, FT1000_REG_UFIFO_STAT) - 16); @@ -159,7 +119,7 @@ static inline u16 ft1000_read_fifo_len(struct net_device *dev) //--------------------------------------------------------------------------- u16 ft1000_read_dpram(struct net_device * dev, int offset) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; u16 data; @@ -188,7 +148,7 @@ u16 ft1000_read_dpram(struct net_device * dev, int offset) static inline void ft1000_write_dpram(struct net_device *dev, int offset, u16 value) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; // Provide mutual exclusive access while reading ASIC registers. @@ -212,7 +172,7 @@ static inline void ft1000_write_dpram(struct net_device *dev, //--------------------------------------------------------------------------- u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; u16 data; @@ -246,7 +206,7 @@ u16 ft1000_read_dpram_mag_16(struct net_device *dev, int offset, int Index) static inline void ft1000_write_dpram_mag_16(struct net_device *dev, int offset, u16 value, int Index) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; // Provide mutual exclusive access while reading ASIC registers. @@ -274,7 +234,7 @@ static inline void ft1000_write_dpram_mag_16(struct net_device *dev, //--------------------------------------------------------------------------- u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; u32 data; @@ -302,7 +262,7 @@ u32 ft1000_read_dpram_mag_32(struct net_device *dev, int offset) //--------------------------------------------------------------------------- void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); unsigned long flags; // Provide mutual exclusive access while reading ASIC registers. @@ -324,17 +284,14 @@ void ft1000_write_dpram_mag_32(struct net_device *dev, int offset, u32 value) //--------------------------------------------------------------------------- static void ft1000_enable_interrupts(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); u16 tempword; DEBUG(1, "ft1000_hw:ft1000_enable_interrupts()\n"); - ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, - info->CurrentInterruptEnableMask); + ft1000_write_reg(dev, FT1000_REG_SUP_IMASK, ISR_DEFAULT_MASK); tempword = ft1000_read_reg(dev, FT1000_REG_SUP_IMASK); DEBUG(1, "ft1000_hw:ft1000_enable_interrupts:current interrupt enable mask = 0x%x\n", tempword); - info->InterruptsEnabled = TRUE; } //--------------------------------------------------------------------------- @@ -349,7 +306,6 @@ static void ft1000_enable_interrupts(struct net_device *dev) //--------------------------------------------------------------------------- static void ft1000_disable_interrupts(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); u16 tempword; DEBUG(1, "ft1000_hw: ft1000_disable_interrupts()\n"); @@ -358,7 +314,6 @@ static void ft1000_disable_interrupts(struct net_device *dev) DEBUG(1, "ft1000_hw:ft1000_disable_interrupts:current interrupt enable mask = 0x%x\n", tempword); - info->InterruptsEnabled = FALSE; } //--------------------------------------------------------------------------- @@ -374,13 +329,12 @@ static void ft1000_disable_interrupts(struct net_device *dev) //--------------------------------------------------------------------------- static void ft1000_reset_asic(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 tempword; DEBUG(1, "ft1000_hw:ft1000_reset_asic called\n"); (*info->ft1000_reset) (info->link); - info->ASICResetNum++; // Let's use the register provided by the Magnemite ASIC to reset the // ASIC and DSP. @@ -412,17 +366,17 @@ static void ft1000_reset_asic(struct net_device *dev) // Input: // dev - device structure // Output: -// status - FALSE (card reset fail) -// TRUE (card reset successful) +// status - false (card reset fail) +// true (card reset successful) // //--------------------------------------------------------------------------- static int ft1000_reset_card(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 tempword; int i; unsigned long flags; - PPROV_RECORD ptr; + struct prov_record *ptr; DEBUG(1, "ft1000_hw:ft1000_reset_card called.....\n"); @@ -437,7 +391,7 @@ static int ft1000_reset_card(struct net_device *dev) while (list_empty(&info->prov_list) == 0) { DEBUG(0, "ft1000_hw:ft1000_reset_card:deleting provisioning record\n"); - ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + ptr = list_entry(info->prov_list.next, struct prov_record, list); list_del(&ptr->list); kfree(ptr->pprov_data); kfree(ptr); @@ -457,14 +411,12 @@ static int ft1000_reset_card(struct net_device *dev) if (ft1000_card_present == 1) { spin_lock_irqsave(&info->dpram_lock, flags); if (info->AsicID == ELECTRABUZZ_ID) { - if (info->DspHibernateFlag == 0) { - ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, - FT1000_DPRAM_RX_BASE); - for (i = 0; i < MAX_DSP_SESS_REC; i++) { - info->DSPSess.Rec[i] = - ft1000_read_reg(dev, - FT1000_REG_DPRAM_DATA); - } + ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, + FT1000_DPRAM_RX_BASE); + for (i = 0; i < MAX_DSP_SESS_REC; i++) { + info->DSPSess.Rec[i] = + ft1000_read_reg(dev, + FT1000_REG_DPRAM_DATA); } } else { ft1000_write_reg(dev, FT1000_REG_DPRAM_ADDR, @@ -482,8 +434,6 @@ static int ft1000_reset_card(struct net_device *dev) //reset ASIC ft1000_reset_asic(dev); - info->DSPResetNum++; - DEBUG(1, "ft1000_hw:ft1000_reset_card:downloading dsp image\n"); if (info->AsicID == MAGNEMITE_ID) { @@ -517,7 +467,7 @@ static int ft1000_reset_card(struct net_device *dev) if (i == 50) { DEBUG(0, "ft1000_hw:ft1000_reset_card:No FEFE detected from DSP\n"); - return FALSE; + return false; } } else { @@ -528,7 +478,7 @@ static int ft1000_reset_card(struct net_device *dev) if (card_download(dev, fw_entry->data, fw_entry->size)) { DEBUG(1, "card download unsuccessful\n"); - return FALSE; + return false; } else { DEBUG(1, "card download successful\n"); } @@ -564,7 +514,7 @@ static int ft1000_reset_card(struct net_device *dev) // poll_timer.data = (u_long)dev; // add_timer(&poll_timer); - return TRUE; + return true; } @@ -576,8 +526,8 @@ static int ft1000_reset_card(struct net_device *dev) // Input: // dev - device structure // Output: -// status - FALSE (device is not present) -// TRUE (device is present) +// status - false (device is not present) +// true (device is present) // //--------------------------------------------------------------------------- static int ft1000_chkcard(struct net_device *dev) @@ -590,7 +540,7 @@ static int ft1000_chkcard(struct net_device *dev) if (tempword == 0) { DEBUG(1, "ft1000_hw:ft1000_chkcard: IMASK = 0 Card not detected\n"); - return FALSE; + return false; } // The system will return the value of 0xffff for the version register // if the device is not present. @@ -598,9 +548,9 @@ static int ft1000_chkcard(struct net_device *dev) if (tempword == 0xffff) { DEBUG(1, "ft1000_hw:ft1000_chkcard: Version = 0xffff Card not detected\n"); - return FALSE; + return false; } - return TRUE; + return true; } @@ -619,8 +569,8 @@ static void ft1000_hbchk(u_long data) { struct net_device *dev = (struct net_device *)data; - FT1000_INFO *info; - USHORT tempword; + struct ft1000_info *info; + u16 tempword; info = netdev_priv(dev); @@ -833,14 +783,14 @@ static void ft1000_hbchk(u_long data) // Output: // //--------------------------------------------------------------------------- -void ft1000_send_cmd (struct net_device *dev, u16 *ptempbuffer, int size, u16 qtype) +static void ft1000_send_cmd (struct net_device *dev, u16 *ptempbuffer, int size, u16 qtype) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); int i; u16 tempword; unsigned long flags; - size += PSEUDOSZ; + size += sizeof(struct pseudo_hdr); // check for odd byte and increment to 16-bit word align value if ((size & 0x0001)) { size++; @@ -918,9 +868,10 @@ void ft1000_send_cmd (struct net_device *dev, u16 *ptempbuffer, int size, u16 qt // = 1 (successful) // //--------------------------------------------------------------------------- -BOOLEAN ft1000_receive_cmd(struct net_device *dev, u16 * pbuffer, int maxsz, u16 *pnxtph) +static bool ft1000_receive_cmd(struct net_device *dev, u16 *pbuffer, + int maxsz, u16 *pnxtph) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 size; u16 *ppseudohdr; int i; @@ -928,18 +879,18 @@ BOOLEAN ft1000_receive_cmd(struct net_device *dev, u16 * pbuffer, int maxsz, u16 unsigned long flags; if (info->AsicID == ELECTRABUZZ_ID) { - size = ( ft1000_read_dpram(dev, *pnxtph) ) + PSEUDOSZ; + size = ( ft1000_read_dpram(dev, *pnxtph) ) + sizeof(struct pseudo_hdr); } else { size = ntohs(ft1000_read_dpram_mag_16 (dev, FT1000_MAG_PH_LEN, - FT1000_MAG_PH_LEN_INDX)) + PSEUDOSZ; + FT1000_MAG_PH_LEN_INDX)) + sizeof(struct pseudo_hdr); } if (size > maxsz) { DEBUG(1, "FT1000:ft1000_receive_cmd:Invalid command length = %d\n", size); - return FALSE; + return false; } else { ppseudohdr = (u16 *) pbuffer; spin_lock_irqsave(&info->dpram_lock, flags); @@ -994,9 +945,9 @@ BOOLEAN ft1000_receive_cmd(struct net_device *dev, u16 * pbuffer, int maxsz, u16 DEBUG(1, "FT1000:ft1000_receive_cmd:Pseudo header checksum mismatch\n"); // Drop this message - return FALSE; + return false; } - return TRUE; + return true; } } @@ -1011,19 +962,19 @@ BOOLEAN ft1000_receive_cmd(struct net_device *dev, u16 * pbuffer, int maxsz, u16 // none // //--------------------------------------------------------------------------- -void ft1000_proc_drvmsg(struct net_device *dev) +static void ft1000_proc_drvmsg(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 msgtype; u16 tempword; - PMEDIAMSG pmediamsg; - PDSPINITMSG pdspinitmsg; - PDRVMSG pdrvmsg; + struct media_msg *pmediamsg; + struct dsp_init_msg *pdspinitmsg; + struct drv_msg *pdrvmsg; u16 len; u16 i; - PPROV_RECORD ptr; - PPSEUDO_HDR ppseudo_hdr; - PUSHORT pmsg; + struct prov_record *ptr; + struct pseudo_hdr *ppseudo_hdr; + u16 *pmsg; struct timeval tv; union { u8 byte[2]; @@ -1039,7 +990,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) if ( ft1000_receive_cmd(dev, &cmdbuffer[0], MAX_CMD_SQSIZE, &tempword) ) { // Get the message type which is total_len + PSEUDO header + msgtype + message body - pdrvmsg = (PDRVMSG) & cmdbuffer[0]; + pdrvmsg = (struct drv_msg *) & cmdbuffer[0]; msgtype = ntohs(pdrvmsg->type); DEBUG(1, "Command message type = 0x%x\n", msgtype); switch (msgtype) { @@ -1062,12 +1013,12 @@ void ft1000_proc_drvmsg(struct net_device *dev) } ptr = list_entry(info->prov_list.next, - PROV_RECORD, list); + struct prov_record, list); len = *(u16 *) ptr->pprov_data; len = htons(len); - pmsg = (PUSHORT) ptr->pprov_data; - ppseudo_hdr = (PPSEUDO_HDR) pmsg; + pmsg = (u16 *) ptr->pprov_data; + ppseudo_hdr = (struct pseudo_hdr *) pmsg; // Insert slow queue sequence number ppseudo_hdr->seq_num = info->squeseqnum++; ppseudo_hdr->portsrc = 0; @@ -1091,7 +1042,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) info->CardReady = 1; break; case MEDIA_STATE: - pmediamsg = (PMEDIAMSG) & cmdbuffer[0]; + pmediamsg = (struct media_msg *) & cmdbuffer[0]; if (info->ProgConStat != 0xFF) { if (pmediamsg->state) { DEBUG(1, "Media is up\n"); @@ -1123,7 +1074,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) } break; case DSP_INIT_MSG: - pdspinitmsg = (PDSPINITMSG) & cmdbuffer[0]; + pdspinitmsg = (struct dsp_init_msg *) & cmdbuffer[0]; memcpy(info->DspVer, pdspinitmsg->DspVer, DSPVERSZ); DEBUG(1, "DSPVER = 0x%2x 0x%2x 0x%2x 0x%2x\n", info->DspVer[0], info->DspVer[1], info->DspVer[2], @@ -1140,7 +1091,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) dev->dev_addr[5] = info->eui64[7]; if (ntohs(pdspinitmsg->length) == - (sizeof(DSPINITMSG) - 20)) { + (sizeof(struct dsp_init_msg) - 20)) { memcpy(info->ProductMode, pdspinitmsg->ProductMode, MODESZ); memcpy(info->RfCalVer, pdspinitmsg->RfCalVer, @@ -1157,7 +1108,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) tempword = ntohs(pdrvmsg->length); info->DSPInfoBlklen = tempword; if (tempword < (MAX_DSP_SESS_REC - 4)) { - pmsg = (PUSHORT) & pdrvmsg->data[0]; + pmsg = (u16 *) & pdrvmsg->data[0]; for (i = 0; i < ((tempword + 1) / 2); i++) { DEBUG(1, "FT1000:drivermsg:dsp info data = 0x%x\n", @@ -1169,7 +1120,6 @@ void ft1000_proc_drvmsg(struct net_device *dev) case DSP_GET_INFO: DEBUG(1, "FT1000:drivermsg:Got DSP_GET_INFO\n"); // copy dsp info block to dsp - info->DrvMsgPend = 1; // allow any outstanding ioctl to finish mdelay(10); tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); @@ -1185,8 +1135,8 @@ void ft1000_proc_drvmsg(struct net_device *dev) if ((tempword & FT1000_DB_DPRAM_TX) == 0) { // Put message into Slow Queue // Form Pseudo header - pmsg = (PUSHORT) info->DSPInfoBlk; - ppseudo_hdr = (PPSEUDO_HDR) pmsg; + pmsg = (u16 *) info->DSPInfoBlk; + ppseudo_hdr = (struct pseudo_hdr *) pmsg; ppseudo_hdr->length = htons(info->DSPInfoBlklen + 4); ppseudo_hdr->source = 0x10; @@ -1210,15 +1160,13 @@ void ft1000_proc_drvmsg(struct net_device *dev) info->DSPInfoBlk[8] = 0x7200; info->DSPInfoBlk[9] = htons(info->DSPInfoBlklen); - ft1000_send_cmd (dev, (PUSHORT)info->DSPInfoBlk, (USHORT)(info->DSPInfoBlklen+4), 0); + ft1000_send_cmd (dev, (u16 *)info->DSPInfoBlk, (u16)(info->DSPInfoBlklen+4), 0); } - info->DrvMsgPend = 0; break; case GET_DRV_ERR_RPT_MSG: DEBUG(1, "FT1000:drivermsg:Got GET_DRV_ERR_RPT_MSG\n"); // copy driver error message to dsp - info->DrvMsgPend = 1; // allow any outstanding ioctl to finish mdelay(10); tempword = ft1000_read_reg(dev, FT1000_REG_DOORBELL); @@ -1234,8 +1182,8 @@ void ft1000_proc_drvmsg(struct net_device *dev) if ((tempword & FT1000_DB_DPRAM_TX) == 0) { // Put message into Slow Queue // Form Pseudo header - pmsg = (PUSHORT) & tempbuffer[0]; - ppseudo_hdr = (PPSEUDO_HDR) pmsg; + pmsg = (u16 *) & tempbuffer[0]; + ppseudo_hdr = (struct pseudo_hdr *) pmsg; ppseudo_hdr->length = htons(0x0012); ppseudo_hdr->source = 0x10; ppseudo_hdr->destination = 0x20; @@ -1255,7 +1203,7 @@ void ft1000_proc_drvmsg(struct net_device *dev) for (i=1; i<7; i++) { ppseudo_hdr->checksum ^= *pmsg++; } - pmsg = (PUSHORT) & tempbuffer[16]; + pmsg = (u16 *) & tempbuffer[16]; *pmsg++ = htons(RSP_DRV_ERR_RPT_MSG); *pmsg++ = htons(0x000e); *pmsg++ = htons(info->DSP_TIME[0]); @@ -1270,10 +1218,9 @@ void ft1000_proc_drvmsg(struct net_device *dev) *pmsg++ = convert.wrd; *pmsg++ = htons(info->DrvErrNum); - ft1000_send_cmd (dev, (PUSHORT)&tempbuffer[0], (USHORT)(0x0012), 0); + ft1000_send_cmd (dev, (u16 *)&tempbuffer[0], (u16)(0x0012), 0); info->DrvErrNum = 0; } - info->DrvMsgPend = 0; break; default: @@ -1294,9 +1241,9 @@ void ft1000_proc_drvmsg(struct net_device *dev) // SUCCESS // //--------------------------------------------------------------------------- -int ft1000_parse_dpram_msg(struct net_device *dev) +static int ft1000_parse_dpram_msg(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 doorbell; u16 portid; u16 nxtph; @@ -1340,13 +1287,11 @@ int ft1000_parse_dpram_msg(struct net_device *dev) ft1000_write_reg(dev, FT1000_REG_SUP_CTRL, HOST_INTF_BE); } - info->DspAsicReset = 0; } if (doorbell & FT1000_DSP_ASIC_RESET) { DEBUG(0, "FT1000:ft1000_parse_dpram_msg: Got a dsp ASIC reset message\n"); - info->DspAsicReset = 1; ft1000_write_reg(dev, FT1000_REG_DOORBELL, FT1000_DSP_ASIC_RESET); udelay(200); @@ -1368,7 +1313,7 @@ int ft1000_parse_dpram_msg(struct net_device *dev) } DEBUG(1, "FT1000:ft1000_parse_dpram_msg:total length = %d\n", total_len); - if ((total_len < MAX_CMD_SQSIZE) && (total_len > PSEUDOSZ)) { + if ((total_len < MAX_CMD_SQSIZE) && (total_len > sizeof(struct pseudo_hdr))) { total_len += nxtph; cnt = 0; // ft1000_read_reg will return a value that needs to be byteswap @@ -1453,7 +1398,7 @@ int ft1000_parse_dpram_msg(struct net_device *dev) //--------------------------------------------------------------------------- static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 i; u32 templong; u16 tempword; @@ -1597,10 +1542,10 @@ static void ft1000_flush_fifo(struct net_device *dev, u16 DrvErrNum) // SUCCESS // //--------------------------------------------------------------------------- -int ft1000_copy_up_pkt(struct net_device *dev) +static int ft1000_copy_up_pkt(struct net_device *dev) { u16 tempword; - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 len; struct sk_buff *skb; u16 i; @@ -1715,7 +1660,7 @@ int ft1000_copy_up_pkt(struct net_device *dev) tempword = ft1000_read_reg(dev, FT1000_REG_DFIFO); *pbuffer++ = (u8) (tempword >> 8); *pbuffer++ = (u8) tempword; - if (ft1000_chkcard(dev) == FALSE) { + if (ft1000_chkcard(dev) == false) { kfree_skb(skb); return FAILURE; } @@ -1785,13 +1730,13 @@ int ft1000_copy_up_pkt(struct net_device *dev) // SUCCESS // //--------------------------------------------------------------------------- -int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len) +static int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); union { - PSEUDO_HDR blk; - u16 buff[sizeof(PSEUDO_HDR) >> 1]; - u8 buffc[sizeof(PSEUDO_HDR)]; + struct pseudo_hdr blk; + u16 buff[sizeof(struct pseudo_hdr) >> 1]; + u8 buffc[sizeof(struct pseudo_hdr)]; } pseudo; int i; u32 *plong; @@ -1947,7 +1892,7 @@ int ft1000_copy_down_pkt(struct net_device *dev, u16 * packet, u16 len) static struct net_device_stats *ft1000_stats(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); return (&info->stats); } @@ -1971,7 +1916,7 @@ static int ft1000_open(struct net_device *dev) static int ft1000_close(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); DEBUG(0, "ft1000_hw: ft1000_close()\n"); @@ -1993,7 +1938,7 @@ static int ft1000_close(struct net_device *dev) static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u8 *pdata; DEBUG(1, "ft1000_hw: ft1000_start_xmit()\n"); @@ -2030,7 +1975,7 @@ static int ft1000_start_xmit(struct sk_buff *skb, struct net_device *dev) static irqreturn_t ft1000_interrupt(int irq, void *dev_id) { struct net_device *dev = (struct net_device *)dev_id; - FT1000_INFO *info = netdev_priv(dev); + struct ft1000_info *info = netdev_priv(dev); u16 tempword; u16 inttype; int cnt; @@ -2042,7 +1987,7 @@ static irqreturn_t ft1000_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } - if (ft1000_chkcard(dev) == FALSE) { + if (ft1000_chkcard(dev) == false) { ft1000_disable_interrupts(dev); return IRQ_HANDLED; } @@ -2095,8 +2040,8 @@ static irqreturn_t ft1000_interrupt(int irq, void *dev_id) void stop_ft1000_card(struct net_device *dev) { - FT1000_INFO *info = netdev_priv(dev); - PPROV_RECORD ptr; + struct ft1000_info *info = netdev_priv(dev); + struct prov_record *ptr; // int cnt; DEBUG(0, "ft1000_hw: stop_ft1000_card()\n"); @@ -2108,7 +2053,7 @@ void stop_ft1000_card(struct net_device *dev) // Make sure we free any memory reserve for provisioning while (list_empty(&info->prov_list) == 0) { - ptr = list_entry(info->prov_list.next, PROV_RECORD, list); + ptr = list_entry(info->prov_list.next, struct prov_record, list); list_del(&ptr->list); kfree(ptr->pprov_data); kfree(ptr); @@ -2130,7 +2075,7 @@ void stop_ft1000_card(struct net_device *dev) static void ft1000_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) { - FT1000_INFO *ft_info; + struct ft1000_info *ft_info; ft_info = netdev_priv(dev); snprintf(info->driver, 32, "ft1000"); @@ -2142,7 +2087,7 @@ static void ft1000_get_drvinfo(struct net_device *dev, static u32 ft1000_get_link(struct net_device *dev) { - FT1000_INFO *info; + struct ft1000_info *info; info = netdev_priv(dev); return info->mediastate; } @@ -2153,9 +2098,9 @@ static const struct ethtool_ops ops = { }; struct net_device *init_ft1000_card(struct pcmcia_device *link, - void *ft1000_reset) + void *ft1000_reset) { - FT1000_INFO *info; + struct ft1000_info *info; struct net_device *dev; static const struct net_device_ops ft1000ops = // Slavius 21.10.2009 due to kernel changes @@ -2180,7 +2125,7 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link, return NULL; } - dev = alloc_etherdev(sizeof(FT1000_INFO)); + dev = alloc_etherdev(sizeof(struct ft1000_info)); if (!dev) { printk(KERN_ERR "ft1000: failed to allocate etherdev\n"); return NULL; @@ -2189,7 +2134,7 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link, SET_NETDEV_DEV(dev, &link->dev); info = netdev_priv(dev); - memset(info, 0, sizeof(FT1000_INFO)); + memset(info, 0, sizeof(struct ft1000_info)); DEBUG(1, "address of dev = 0x%8x\n", (u32) dev); DEBUG(1, "address of dev info = 0x%8x\n", (u32) info); @@ -2199,16 +2144,11 @@ struct net_device *init_ft1000_card(struct pcmcia_device *link, spin_lock_init(&info->dpram_lock); info->DrvErrNum = 0; - info->ASICResetNum = 0; info->registered = 1; info->link = link; info->ft1000_reset = ft1000_reset; info->mediastate = 0; info->fifo_cnt = 0; - info->DeviceCreated = FALSE; - info->DeviceMajor = 0; - info->CurrentInterruptEnableMask = ISR_DEFAULT_MASK; - info->InterruptsEnabled = FALSE; info->CardReady = 0; info->DSP_TIME[0] = 0; info->DSP_TIME[1] = 0; diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c index bdfb1ae..7faeada 100644 --- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c +++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c @@ -22,6 +22,7 @@ #include <linux/string.h> #include <linux/vmalloc.h> #include <linux/netdevice.h> +#include <asm/io.h> #include <asm/uaccess.h> #include "ft1000.h" @@ -47,13 +48,13 @@ } \ len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i]) -int ft1000ReadProc(char *page, char **start, off_t off, - int count, int *eof, void *data) +static int ft1000ReadProc(char *page, char **start, off_t off, + int count, int *eof, void *data) { struct net_device *dev; int len; int i; - FT1000_INFO *info; + struct ft1000_info *info; char *status[] = { "Idle (Disconnect)", "Searching", "Active (Connected)", "Waiting for L2", "Sleep", "No Coverage", "", "" @@ -75,16 +76,14 @@ int ft1000ReadProc(char *page, char **start, off_t off, /* Wrap-around */ if (info->AsicID == ELECTRABUZZ_ID) { - if (info->DspHibernateFlag == 0) { - if (info->ProgConStat != 0xFF) { - info->LedStat = - ft1000_read_dpram(dev, FT1000_DSP_LED); - info->ConStat = - ft1000_read_dpram(dev, - FT1000_DSP_CON_STATE); - } else { - info->ConStat = 0xf; - } + if (info->ProgConStat != 0xFF) { + info->LedStat = + ft1000_read_dpram(dev, FT1000_DSP_LED); + info->ConStat = + ft1000_read_dpram(dev, + FT1000_DSP_CON_STATE); + } else { + info->ConStat = 0xf; } } else { if (info->ProgConStat != 0xFF) { @@ -172,7 +171,7 @@ static int ft1000NotifyProc(struct notifier_block *this, unsigned long event, void *ptr) { struct net_device *dev = ptr; - FT1000_INFO *info; + struct ft1000_info *info; info = netdev_priv(dev); @@ -193,7 +192,7 @@ static struct notifier_block ft1000_netdev_notifier = { void ft1000InitProc(struct net_device *dev) { - FT1000_INFO *info; + struct ft1000_info *info; info = netdev_priv(dev); @@ -206,7 +205,7 @@ void ft1000InitProc(struct net_device *dev) void ft1000CleanupProc(struct net_device *dev) { - FT1000_INFO *info; + struct ft1000_info *info; info = netdev_priv(dev); diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c index b0a4211..aaf44c3 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_hw.c @@ -485,7 +485,7 @@ void card_send_command(struct ft1000_device *ft1000dev, void *ptempbuffer, DEBUG("card_send_command: enter card_send_command... size=%d\n", size); - commandbuf = (unsigned char *)kmalloc(size + 2, GFP_KERNEL); + commandbuf = kmalloc(size + 2, GFP_KERNEL); memcpy((void *)commandbuf + 2, (void *)ptempbuffer, size); ft1000_read_register(ft1000dev, &temp, FT1000_REG_DOORBELL); @@ -671,7 +671,6 @@ static int ft1000_reset_card(struct net_device *dev) return TRUE; } -#ifdef HAVE_NET_DEVICE_OPS static const struct net_device_ops ftnet_ops = { .ndo_open = &ft1000_open, @@ -679,7 +678,6 @@ static const struct net_device_ops ftnet_ops = .ndo_start_xmit = &ft1000_start_xmit, .ndo_get_stats = &ft1000_netdev_stats, }; -#endif //--------------------------------------------------------------------------- @@ -764,14 +762,7 @@ int init_ft1000_netdev(struct ft1000_device *ft1000dev) INIT_LIST_HEAD(&pInfo->nodes.list); -#ifdef HAVE_NET_DEVICE_OPS netdev->netdev_ops = &ftnet_ops; -#else - netdev->hard_start_xmit = &ft1000_start_xmit; - netdev->get_stats = &ft1000_netdev_stats; - netdev->open = &ft1000_open; - netdev->stop = &ft1000_close; -#endif ft1000dev->net = netdev; diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h b/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h index 6a8a196..3f4207f 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_ioctl.h @@ -26,38 +26,6 @@ #ifndef _FT1000IOCTLH_ #define _FT1000IOCTLH_ -#define DSPVERSZ 4 -#define HWSERNUMSZ 16 -#define SKUSZ 20 -#define EUISZ 8 -#define CALVERSZ 2 -#define CALDATESZ 6 - -#define MAX_DNLD_BLKSZ 1024 - -// Standard Flarion Pseudo header -struct pseudo_hdr { - unsigned short length; //length of msg body - unsigned char source; //source address (0x10=Host 0x20=DSP) - unsigned char destination; //destination address (refer to source address) - unsigned char portdest; //destination port id - // 0x00=Driver - // 0x10=Application Broadcast - // 0x20=Network Stack - // 0x80=Dsp OAM - // 0x90=Dsp Airlink - // 0xa0=Dsp Loader - // 0xb0=Dsp MIP - unsigned char portsrc; //source port id (refer to portdest) - unsigned short sh_str_id; //stream id (Not applicable on Mobile) - unsigned char control; //stream id (Not applicable on Mobile) - unsigned char rsvd1; //reserved - unsigned char seq_num; //sequence number - unsigned char rsvd2; //reserved - unsigned short qos_class; //Quality of Service class (Not applicable on Mobile) - unsigned short checksum; //Pseudo header checksum -} __attribute__ ((packed)); - typedef struct _IOCTL_GET_VER { unsigned long drv_ver; diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h index 0b30020..51c0847 100644 --- a/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h +++ b/drivers/staging/ft1000/ft1000-usb/ft1000_usb.h @@ -2,81 +2,18 @@ #define _FT1000_USB_H_ /*Jim*/ +#include "../ft1000.h" #include "ft1000_ioctl.h" #define FT1000_DRV_VER 0x01010403 -#define MODESZ 2 #define MAX_NUM_APP 6 #define MAX_MSG_LIMIT 200 #define NUM_OF_FREE_BUFFERS 1500 -// Driver message types -#define MEDIA_STATE 0x0010 -#define DSP_PROVISION 0x0030 -#define DSP_INIT_MSG 0x0050 -#define DSP_STORE_INFO 0x0070 -#define DSP_GET_INFO 0x0071 -#define GET_DRV_ERR_RPT_MSG 0x0073 -#define RSP_DRV_ERR_RPT_MSG 0x0074 - - -// Size of DPRAM Command -#define MAX_CMD_SQSIZE 1780 -#define SLOWQ_TYPE 0 #define PSEUDOSZ 16 -#define DSP_QID_OFFSET 4 - - -// MEMORY MAP FOR ELECTRABUZZ ASIC -#define FT1000_REG_DFIFO_STAT 0x0008 // Downlink FIFO status register -#define FT1000_REG_DPRAM_DATA 0x000C // DPRAM VALUE in DPRAM ADDR - -#define FT1000_DSP_LED 0xFFA // dsp led status for PAD device - -#define FT1000_MAG_DSP_LED 0x3FE // dsp led status for PAD device -#define FT1000_MAG_DSP_LED_INDX 0x1 // dsp led status for PAD device #define SUCCESS 0x00 - -#define DRIVERID 0x00 - -// Driver Error Messages for DSP -#define DSP_CONDRESET_INFO 0x7ef2 -#define DSP_HB_INFO 0x7ef0 - -// Magnemite specific defines -#define hi_mag 0x6968 // Byte swap hi to avoid additional system call -#define ho_mag 0x6f68 // Byte swap ho to avoid additional system call - - - -struct media_msg { - struct pseudo_hdr pseudo; - u16 type; - u16 length; - u16 state; - u32 ip_addr; - u32 net_mask; - u32 gateway; - u32 dns_1; - u32 dns_2; -} __attribute__ ((packed)); - -struct dsp_init_msg { - struct pseudo_hdr pseudo; - u16 type; - u16 length; - u8 DspVer[DSPVERSZ]; // DSP version number - u8 HwSerNum[HWSERNUMSZ]; // Hardware Serial Number - u8 Sku[SKUSZ]; // SKU - u8 eui64[EUISZ]; // EUI64 - u8 ProductMode[MODESZ]; // Product Mode (Market/Production) - u8 RfCalVer[CALVERSZ]; // Rf Calibration version - u8 RfCalDate[CALDATESZ]; // Rf Calibration date -} __attribute__ ((packed)); - - struct app_info_block { u32 nTxMsg; // DPRAM msg sent to DSP with app_id u32 nRxMsg; // DPRAM msg rcv from dsp with app_id @@ -90,11 +27,6 @@ struct app_info_block { struct list_head app_sqlist; // link list of msgs for applicaton on slow queue } __attribute__((packed)); -struct prov_record { - struct list_head list; - u8 *pprov_data; -}; - /*end of Jim*/ #define DEBUG(args...) printk(KERN_INFO args) @@ -108,350 +40,25 @@ struct prov_record { #define LARGE_TIMEOUT 5000 -#define MAX_DSP_SESS_REC 1024 - -#define MAX_NUM_CARDS 32 - -#define DSPVERSZ 4 -#define HWSERNUMSZ 16 -#define SKUSZ 20 -#define EUISZ 8 -#define CALVERSZ 2 -#define CALDATESZ 6 -#define MODESZ 2 - -#define DSPID 0x20 -#define HOSTID 0x10 - -#define DSPOAM 0x80 -#define DSPAIRID 0x90 - -#define DRIVERID 0x00 -#define FMM 0x10 -#define NETWORKID 0x20 -#define AUTOLNCHID 0x30 -#define DSPLPBKID 0x40 - #define DSPBCMSGID 0x10 -#define ENET_MAX_SIZE 1514 -#define ENET_HEADER_SIZE 14 - - -#define CIS_NET_ADDR_OFFSET 0xff0 - -// MAGNEMITE specific - -#define FT1000_REG_MAG_UFDR 0x0000 // Uplink FIFO Data Register. - -#define FT1000_REG_MAG_UFDRL 0x0000 // Uplink FIFO Data Register low-word. - -#define FT1000_REG_MAG_UFDRH 0x0002 // Uplink FIFO Data Register high-word. - -#define FT1000_REG_MAG_UFER 0x0004 // Uplink FIFO End Register - -#define FT1000_REG_MAG_UFSR 0x0006 // Uplink FIFO Status Register - -#define FT1000_REG_MAG_DFR 0x0008 // Downlink FIFO Register - -#define FT1000_REG_MAG_DFRL 0x0008 // Downlink FIFO Register low-word - -#define FT1000_REG_MAG_DFRH 0x000a // Downlink FIFO Register high-word - -#define FT1000_REG_MAG_DFSR 0x000c // Downlink FIFO Status Register - -#define FT1000_REG_MAG_DPDATA 0x0010 // Dual Port RAM Indirect Data Register - -#define FT1000_REG_MAG_DPDATAL 0x0010 // Dual Port RAM Indirect Data Register low-word - -#define FT1000_REG_MAG_DPDATAH 0x0012 // Dual Port RAM Indirect Data Register high-word - -#define FT1000_REG_MAG_WATERMARK 0x002c // Supv. Control Reg. LLC register - -#define FT1000_REG_MAG_VERSION 0x0030 // LLC Version LLC register - - - -// Common - -#define FT1000_REG_DPRAM_ADDR 0x000E // DPRAM ADDRESS when card in IO mode - -#define FT1000_REG_SUP_CTRL 0x0020 // Supv. Control Reg. LLC register - -#define FT1000_REG_SUP_STAT 0x0022 // Supv. Status Reg LLC register - -#define FT1000_REG_RESET 0x0024 // Reset Reg LLC register - -#define FT1000_REG_SUP_ISR 0x0026 // Supv ISR LLC register - -#define FT1000_REG_SUP_IMASK 0x0028 // Supervisor Interrupt Mask LLC register - -#define FT1000_REG_DOORBELL 0x002a // Door Bell Reg LLC register - -#define FT1000_REG_ASIC_ID 0x002e // ASIC Identification Number - - // (Electrabuzz=0 Magnemite=TBD) - - - -// DSP doorbells - -#define FT1000_DB_DPRAM_RX 0x0001 // this value indicates that DSP has - - // data for host in DPRAM SlowQ - -#define FT1000_DB_DNLD_RX 0x0002 // Downloader handshake doorbell - -#define FT1000_ASIC_RESET_REQ 0x0004 - -#define FT1000_DSP_ASIC_RESET 0x0008 - - - -#define FT1000_DB_COND_RESET 0x0010 - - - -// Host doorbells - -#define FT1000_DB_DPRAM_TX 0x0100 // this value indicates that host has - - // data for DSP in DPRAM. - -#define FT1000_DB_DNLD_TX 0x0200 // Downloader handshake doorbell - -#define FT1000_ASIC_RESET_DSP 0x0400 - -#define FT1000_DB_HB 0x1000 // this value indicates that supervisor - - - -// Electrabuzz specific DPRAM mapping // has a heartbeat message for DSP. - -#define FT1000_DPRAM_BASE 0x1000 // 0x0000 to 0x07FF DPRAM 2Kx16 - R/W from PCMCIA or DSP - -#define FT1000_DPRAM_TX_BASE 0x1002 // TX AREA (SlowQ) - -#define FT1000_DPRAM_RX_BASE 0x1800 // RX AREA (SlowQ) - -#define FT1000_DPRAM_SIZE 0x1000 // 4K bytes - - - -#define FT1000_DRV_DEBUG 0x17E0 // Debug area for driver - -#define FT1000_FIFO_LEN 0x17FC // total length for DSP FIFO tracking - -#define FT1000_HI_HO 0x17FE // heartbeat with HI/HO - -#define FT1000_DSP_STATUS 0x1FFE // dsp status - non-zero is a request to reset dsp - - - -#define FT1000_DSP_CON_STATE 0x1FF8 // DSP Connection Status Info - -#define FT1000_DSP_LEDS 0x1FFA // DSP LEDS for rcv pwr strength, Rx data, Tx data - -#define DSP_TIMESTAMP 0x1FFC // dsp timestamp - -#define DSP_TIMESTAMP_DIFF 0x1FFA // difference of dsp timestamp in DPRAM and Pseudo header. - - - -#define FT1000_DPRAM_FEFE 0x1002 // Dsp Downloader handshake location - - - -#define FT1000_DSP_TIMER0 0x1FF0 - -#define FT1000_DSP_TIMER1 0x1FF2 - -#define FT1000_DSP_TIMER2 0x1FF4 - -#define FT1000_DSP_TIMER3 0x1FF6 - - +/* Electrabuzz specific DPRAM mapping */ +/* this is used by ft1000_usb driver - isn't that a bug? */ +#undef FT1000_DPRAM_RX_BASE +#define FT1000_DPRAM_RX_BASE 0x1800 /* RX AREA (SlowQ) */ // MEMORY MAP FOR MAGNEMITE - -#define FT1000_DPRAM_MAG_TX_BASE 0x0000 // TX AREA (SlowQ) - -#define FT1000_DPRAM_MAG_RX_BASE 0x0200 // RX AREA (SlowQ) - - - -#define FT1000_MAG_FIFO_LEN 0x1FF // total length for DSP FIFO tracking - -#define FT1000_MAG_FIFO_LEN_INDX 0x1 // low-word index - -#define FT1000_MAG_HI_HO 0x1FF // heartbeat with HI/HO - -#define FT1000_MAG_HI_HO_INDX 0x0 // high-word index - -#define FT1000_MAG_DSP_LEDS 0x3FE // dsp led status for PAD device - -#define FT1000_MAG_DSP_LEDS_INDX 0x1 // dsp led status for PAD device - - - -#define FT1000_MAG_DSP_CON_STATE 0x3FE // DSP Connection Status Info - -#define FT1000_MAG_DSP_CON_STATE_INDX 0x0 // DSP Connection Status Info - - - -#define FT1000_MAG_DPRAM_FEFE 0x000 // location for dsp ready indicator - -#define FT1000_MAG_DPRAM_FEFE_INDX 0x0 // location for dsp ready indicator - - - -#define FT1000_MAG_DSP_TIMER0 0x3FC - -#define FT1000_MAG_DSP_TIMER0_INDX 0x1 - - - -#define FT1000_MAG_DSP_TIMER1 0x3FC - -#define FT1000_MAG_DSP_TIMER1_INDX 0x0 - - - -#define FT1000_MAG_DSP_TIMER2 0x3FD - -#define FT1000_MAG_DSP_TIMER2_INDX 0x1 - - - -#define FT1000_MAG_DSP_TIMER3 0x3FD - -#define FT1000_MAG_DSP_TIMER3_INDX 0x0 - - - -#define FT1000_MAG_TOTAL_LEN 0x200 - -#define FT1000_MAG_TOTAL_LEN_INDX 0x1 - - - -#define FT1000_MAG_PH_LEN 0x200 - -#define FT1000_MAG_PH_LEN_INDX 0x0 - - - -#define FT1000_MAG_PORT_ID 0x201 - -#define FT1000_MAG_PORT_ID_INDX 0x0 - - - -// - -// Constants for the FT1000_REG_SUP_ISR - -// - -// Indicate the cause of an interrupt. - -// - -// SUPERVISOR ISR BIT MAPS - - - -#define ISR_EMPTY (u8)0x00 // no bits set in ISR - -#define ISR_DOORBELL_ACK (u8)0x01 // the doorbell i sent has been received. - -#define ISR_DOORBELL_PEND (u8)0x02 // doorbell for me - -#define ISR_RCV (u8)0x04 // packet received with no errors - -#define ISR_WATERMARK (u8)0x08 // - - - -// Interrupt mask register defines - -// note these are different from the ISR BIT MAPS. - -#define ISR_MASK_NONE 0x0000 - -#define ISR_MASK_DOORBELL_ACK 0x0001 - -#define ISR_MASK_DOORBELL_PEND 0x0002 - -#define ISR_MASK_RCV 0x0004 - -#define ISR_MASK_WATERMARK 0x0008 // Normally we will only mask the watermark interrupt when we want to enable interrupts. - -#define ISR_MASK_ALL 0xffff - - - -#define HOST_INTF_LE 0x0000 // Host interface little endian - -#define HOST_INTF_BE 0x0001 // Host interface big endian - - - -#define ISR_DEFAULT_MASK 0x7ff9 - - - -#define hi 0x6869 - -#define ho 0x686f - - - -#define FT1000_ASIC_RESET 0x80 // COR value for soft reset to PCMCIA core - -#define FT1000_ASIC_BITS 0x51 // Bits set in COR register under normal operation - -#define FT1000_ASIC_MAG_BITS 0x55 // Bits set in COR register under normal operation - - - -#define FT1000_COR_OFFSET 0x100 - - - -#define ELECTRABUZZ_ID 0 // ASIC ID for ELECTRABUZZ - -#define MAGNEMITE_ID 0x1a01 // ASIC ID for MAGNEMITE - - +/* the indexes are swapped comparing to PCMCIA - is it OK or a bug? */ +#undef FT1000_MAG_DSP_LED_INDX +#define FT1000_MAG_DSP_LED_INDX 0x1 /* dsp led status for PAD device */ +#undef FT1000_MAG_DSP_CON_STATE_INDX +#define FT1000_MAG_DSP_CON_STATE_INDX 0x0 /* DSP Connection Status Info */ // Maximum times trying to get ASIC out of reset - #define MAX_ASIC_RESET_CNT 20 - - -#define DSP_RESET_BIT 0x1 - -#define ASIC_RESET_BIT 0x2 - -#define DSP_UNENCRYPTED 0x4 - -#define DSP_ENCRYPTED 0x8 - -#define EFUSE_MEM_DISABLE 0x0040 - - #define MAX_BUF_SIZE 4096 -struct drv_msg { - struct pseudo_hdr pseudo; - u16 type; - u16 length; - u8 data[0]; -} __attribute__ ((packed)); - struct ft1000_device { struct usb_device *dev; |