/*
 * QLogic iSCSI HBA Driver
 * Copyright (c)  2003-2006 QLogic Corporation
 *
 * See LICENSE.qla4xxx for copyright and licensing details.
 */

#ifndef _QL4XNVRM_H_
#define _QL4XNVRM_H_

/*
 * AM29LV Flash definitions
 */
#define FM93C56A_SIZE_8	 0x100
#define FM93C56A_SIZE_16 0x80
#define FM93C66A_SIZE_8	 0x200
#define FM93C66A_SIZE_16 0x100/* 4010 */
#define FM93C86A_SIZE_16 0x400/* 4022 */

#define	 FM93C56A_START	      0x1

// Commands
#define	 FM93C56A_READ	      0x2
#define	 FM93C56A_WEN	      0x0
#define	 FM93C56A_WRITE	      0x1
#define	 FM93C56A_WRITE_ALL   0x0
#define	 FM93C56A_WDS	      0x0
#define	 FM93C56A_ERASE	      0x3
#define	 FM93C56A_ERASE_ALL   0x0

/* Command Extentions */
#define	 FM93C56A_WEN_EXT	 0x3
#define	 FM93C56A_WRITE_ALL_EXT	 0x1
#define	 FM93C56A_WDS_EXT	 0x0
#define	 FM93C56A_ERASE_ALL_EXT	 0x2

/* Address Bits */
#define	 FM93C56A_NO_ADDR_BITS_16   8	/* 4010 */
#define	 FM93C56A_NO_ADDR_BITS_8    9	/* 4010 */
#define	 FM93C86A_NO_ADDR_BITS_16   10	/* 4022 */

/* Data Bits */
#define	 FM93C56A_DATA_BITS_16	 16
#define	 FM93C56A_DATA_BITS_8	 8

/* Special Bits */
#define	 FM93C56A_READ_DUMMY_BITS   1
#define	 FM93C56A_READY		    0
#define	 FM93C56A_BUSY		    1
#define	 FM93C56A_CMD_BITS	    2

/* Auburn Bits */
#define	 AUBURN_EEPROM_DI	    0x8
#define	 AUBURN_EEPROM_DI_0	    0x0
#define	 AUBURN_EEPROM_DI_1	    0x8
#define	 AUBURN_EEPROM_DO	    0x4
#define	 AUBURN_EEPROM_DO_0	    0x0
#define	 AUBURN_EEPROM_DO_1	    0x4
#define	 AUBURN_EEPROM_CS	    0x2
#define	 AUBURN_EEPROM_CS_0	    0x0
#define	 AUBURN_EEPROM_CS_1	    0x2
#define	 AUBURN_EEPROM_CLK_RISE	    0x1
#define	 AUBURN_EEPROM_CLK_FALL	    0x0

/* */
/* EEPROM format */
/* */
struct bios_params {
	uint16_t SpinUpDelay:1;
	uint16_t BIOSDisable:1;
	uint16_t MMAPEnable:1;
	uint16_t BootEnable:1;
	uint16_t Reserved0:12;
	uint8_t bootID0:7;
	uint8_t bootID0Valid:1;
	uint8_t bootLUN0[8];
	uint8_t bootID1:7;
	uint8_t bootID1Valid:1;
	uint8_t bootLUN1[8];
	uint16_t MaxLunsPerTarget;
	uint8_t Reserved1[10];
};

struct eeprom_port_cfg {

	/* MTU MAC 0 */
	u16 etherMtu_mac;

	/* Flow Control MAC 0 */
	u16 pauseThreshold_mac;
	u16 resumeThreshold_mac;
	u16 reserved[13];
};

struct eeprom_function_cfg {
	u8 reserved[30];

	/* MAC ADDR */
	u8 macAddress[6];
	u8 macAddressSecondary[6];
	u16 subsysVendorId;
	u16 subsysDeviceId;
};

struct eeprom_data {
	union {
		struct {	/* isp4010 */
			u8 asic_id[4]; /* x00 */
			u8 version;	/* x04 */
			u8 reserved;	/* x05 */
			u16 board_id;	/* x06 */
#define	  EEPROM_BOARDID_ELDORADO    1
#define	  EEPROM_BOARDID_PLACER	     2

#define EEPROM_SERIAL_NUM_SIZE	     16
			u8 serial_number[EEPROM_SERIAL_NUM_SIZE]; /* x08 */

			/* ExtHwConfig: */
			/* Offset = 24bytes
			 *
			 * | SSRAM Size|     |ST|PD|SDRAM SZ| W| B| SP	|  |
			 * |15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
			 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
			 */
			u16 ext_hw_conf; /* x18 */
			u8 mac0[6];	/* x1A */
			u8 mac1[6];	/* x20 */
			u8 mac2[6];	/* x26 */
			u8 mac3[6];	/* x2C */
			u16 etherMtu;	/* x32 */
			u16 macConfig;	/* x34 */
#define	 MAC_CONFIG_ENABLE_ANEG	    0x0001
#define	 MAC_CONFIG_ENABLE_PAUSE    0x0002
			u16 phyConfig;	/* x36 */
#define	 PHY_CONFIG_PHY_ADDR_MASK	      0x1f
#define	 PHY_CONFIG_ENABLE_FW_MANAGEMENT_MASK 0x20
			u16 reserved_56;	/* x38 */

#define EEPROM_UNUSED_1_SIZE   2
			u8 unused_1[EEPROM_UNUSED_1_SIZE]; /* x3A */
			u16 bufletSize;	/* x3C */
			u16 bufletCount;	/* x3E */
			u16 bufletPauseThreshold; /* x40 */
			u16 tcpWindowThreshold50; /* x42 */
			u16 tcpWindowThreshold25; /* x44 */
			u16 tcpWindowThreshold0; /* x46 */
			u16 ipHashTableBaseHi;	/* x48 */
			u16 ipHashTableBaseLo;	/* x4A */
			u16 ipHashTableSize;	/* x4C */
			u16 tcpHashTableBaseHi;	/* x4E */
			u16 tcpHashTableBaseLo;	/* x50 */
			u16 tcpHashTableSize;	/* x52 */
			u16 ncbTableBaseHi;	/* x54 */
			u16 ncbTableBaseLo;	/* x56 */
			u16 ncbTableSize;	/* x58 */
			u16 drbTableBaseHi;	/* x5A */
			u16 drbTableBaseLo;	/* x5C */
			u16 drbTableSize;	/* x5E */

#define EEPROM_UNUSED_2_SIZE   4
			u8 unused_2[EEPROM_UNUSED_2_SIZE]; /* x60 */
			u16 ipReassemblyTimeout; /* x64 */
			u16 tcpMaxWindowSizeHi;	/* x66 */
			u16 tcpMaxWindowSizeLo;	/* x68 */
			u32 net_ip_addr0;	/* x6A Added for TOE
						 * functionality. */
			u32 net_ip_addr1;	/* x6E */
			u32 scsi_ip_addr0;	/* x72 */
			u32 scsi_ip_addr1;	/* x76 */
#define EEPROM_UNUSED_3_SIZE   128	/* changed from 144 to account
					 * for ip addresses */
			u8 unused_3[EEPROM_UNUSED_3_SIZE]; /* x7A */
			u16 subsysVendorId_f0;	/* xFA */
			u16 subsysDeviceId_f0;	/* xFC */

			/* Address = 0x7F */
#define FM93C56A_SIGNATURE  0x9356
#define FM93C66A_SIGNATURE  0x9366
			u16 signature;	/* xFE */

#define EEPROM_UNUSED_4_SIZE   250
			u8 unused_4[EEPROM_UNUSED_4_SIZE]; /* x100 */
			u16 subsysVendorId_f1;	/* x1FA */
			u16 subsysDeviceId_f1;	/* x1FC */
			u16 checksum;	/* x1FE */
		} __attribute__ ((packed)) isp4010;
		struct {	/* isp4022 */
			u8 asicId[4];	/* x00 */
			u8 version;	/* x04 */
			u8 reserved_5;	/* x05 */
			u16 boardId;	/* x06 */
			u8 boardIdStr[16];	/* x08 */
			u8 serialNumber[16];	/* x18 */

			/* External Hardware Configuration */
			u16 ext_hw_conf;	/* x28 */

			/* MAC 0 CONFIGURATION */
			struct eeprom_port_cfg macCfg_port0; /* x2A */

			/* MAC 1 CONFIGURATION */
			struct eeprom_port_cfg macCfg_port1; /* x4A */

			/* DDR SDRAM Configuration */
			u16 bufletSize;	/* x6A */
			u16 bufletCount;	/* x6C */
			u16 tcpWindowThreshold50; /* x6E */
			u16 tcpWindowThreshold25; /* x70 */
			u16 tcpWindowThreshold0; /* x72 */
			u16 ipHashTableBaseHi;	/* x74 */
			u16 ipHashTableBaseLo;	/* x76 */
			u16 ipHashTableSize;	/* x78 */
			u16 tcpHashTableBaseHi;	/* x7A */
			u16 tcpHashTableBaseLo;	/* x7C */
			u16 tcpHashTableSize;	/* x7E */
			u16 ncbTableBaseHi;	/* x80 */
			u16 ncbTableBaseLo;	/* x82 */
			u16 ncbTableSize;	/* x84 */
			u16 drbTableBaseHi;	/* x86 */
			u16 drbTableBaseLo;	/* x88 */
			u16 drbTableSize;	/* x8A */
			u16 reserved_142[4];	/* x8C */

			/* TCP/IP Parameters */
			u16 ipReassemblyTimeout; /* x94 */
			u16 tcpMaxWindowSize;	/* x96 */
			u16 ipSecurity;	/* x98 */
			u8 reserved_156[294]; /* x9A */
			u16 qDebug[8];	/* QLOGIC USE ONLY   x1C0 */
			struct eeprom_function_cfg funcCfg_fn0;	/* x1D0 */
			u16 reserved_510; /* x1FE */

			/* Address = 512 */
			u8 oemSpace[432]; /* x200 */
			struct bios_params sBIOSParams_fn1; /* x3B0 */
			struct eeprom_function_cfg funcCfg_fn1;	/* x3D0 */
			u16 reserved_1022; /* x3FE */

			/* Address = 1024 */
			u8 reserved_1024[464];	/* x400 */
			struct eeprom_function_cfg funcCfg_fn2;	/* x5D0 */
			u16 reserved_1534; /* x5FE */

			/* Address = 1536 */
			u8 reserved_1536[432];	/* x600 */
			struct bios_params sBIOSParams_fn3; /* x7B0 */
			struct eeprom_function_cfg funcCfg_fn3;	/* x7D0 */
			u16 checksum;	/* x7FE */
		} __attribute__ ((packed)) isp4022;
	};
};


#endif	/* _QL4XNVRM_H_ */
