// Driver for USB Mass Storage compliant devices

#ifndef _USB_H_
#define _USB_H_

#include <linux/usb.h>
#include <linux/usb_usual.h>
#include <linux/blkdev.h>
#include <linux/completion.h>
#include <linux/mutex.h>
#include <scsi/scsi_host.h>
#include "common.h"
#include "ms.h"

struct us_data;
struct scsi_cmnd;

/*
 * Unusual device list definitions
 */

struct us_unusual_dev {
	const char* vendorName;
	const char* productName;
	__u8  useProtocol;
	__u8  useTransport;
	int (*initFunction)(struct us_data *);
};

//EnE HW Register
#define REG_CARD_STATUS     0xFF83
#define REG_HW_TRAP1        0xFF89

// SRB Status. Refers /usr/include/wine/wine/wnaspi32.h & SCSI sense key
#define SS_SUCCESS                  0x00      // No Sense
#define SS_NOT_READY                0x02
#define SS_MEDIUM_ERR               0x03
#define SS_HW_ERR                   0x04
#define SS_ILLEGAL_REQUEST          0x05
#define SS_UNIT_ATTENTION           0x06

//ENE Load FW Pattern
#define SD_INIT1_PATTERN   1
#define SD_INIT2_PATTERN   2
#define SD_RW_PATTERN      3
#define MS_INIT_PATTERN    4
#define MSP_RW_PATTERN     5
#define MS_RW_PATTERN      6
#define SM_INIT_PATTERN    7
#define SM_RW_PATTERN      8

#define FDIR_WRITE        0
#define FDIR_READ         1

typedef struct _SD_STATUS {
    BYTE    Insert:1;
    BYTE    Ready:1;
    BYTE    MediaChange:1;
    BYTE    IsMMC:1;
    BYTE    HiCapacity:1;
    BYTE    HiSpeed:1;
    BYTE    WtP:1;
    BYTE    Reserved:1;
} SD_STATUS, *PSD_STATUS;

typedef struct _MS_STATUS {
    BYTE    Insert:1;
    BYTE    Ready:1;
    BYTE    MediaChange:1;
    BYTE    IsMSPro:1;
    BYTE    IsMSPHG:1;
    BYTE    Reserved1:1;
    BYTE    WtP:1;
    BYTE    Reserved2:1;
} MS_STATUS, *PMS_STATUS;

typedef struct _SM_STATUS {
    BYTE    Insert:1;
    BYTE    Ready:1;
    BYTE    MediaChange:1;
    BYTE    Reserved:3;
    BYTE    WtP:1;
    BYTE    IsMS:1;
} SM_STATUS, *PSM_STATUS;

// SD Block Length
#define SD_BLOCK_LEN                            9       // 2^9 = 512 Bytes, The HW maximum read/write data length

/* Dynamic bitflag definitions (us->dflags): used in set_bit() etc. */
#define US_FLIDX_URB_ACTIVE	0	/* current_urb is in use    */
#define US_FLIDX_SG_ACTIVE	1	/* current_sg is in use     */
#define US_FLIDX_ABORTING	2	/* abort is in progress     */
#define US_FLIDX_DISCONNECTING	3	/* disconnect in progress   */
#define US_FLIDX_RESETTING	4	/* device reset in progress */
#define US_FLIDX_TIMED_OUT	5	/* SCSI midlayer timed out  */
#define US_FLIDX_DONT_SCAN	6	/* don't scan (disconnect)  */


#define USB_STOR_STRING_LEN 32

/*
 * We provide a DMA-mapped I/O buffer for use with small USB transfers.
 * It turns out that CB[I] needs a 12-byte buffer and Bulk-only needs a
 * 31-byte buffer.  But Freecom needs a 64-byte buffer, so that's the
 * size we'll allocate.
 */

#define US_IOBUF_SIZE		64	/* Size of the DMA-mapped I/O buffer */
#define US_SENSE_SIZE		18	/* Size of the autosense data buffer */

typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*);
typedef int (*trans_reset)(struct us_data*);
typedef void (*proto_cmnd)(struct scsi_cmnd*, struct us_data*);
typedef void (*extra_data_destructor)(void *);	/* extra data destructor */
typedef void (*pm_hook)(struct us_data *, int);	/* power management hook */

#define US_SUSPEND	0
#define US_RESUME	1

/* we allocate one of these for every device that we remember */
struct us_data {
	/* The device we're working with
	 * It's important to note:
	 *    (o) you must hold dev_mutex to change pusb_dev
	 */
	struct mutex		dev_mutex;	 /* protect pusb_dev */
	struct usb_device	*pusb_dev;	 /* this usb_device */
	struct usb_interface	*pusb_intf;	 /* this interface */
	struct us_unusual_dev   *unusual_dev;	 /* device-filter entry     */
	unsigned long		fflags;		 /* fixed flags from filter */
	unsigned long		dflags;		 /* dynamic atomic bitflags */
	unsigned int		send_bulk_pipe;	 /* cached pipe values */
	unsigned int		recv_bulk_pipe;
	unsigned int		send_ctrl_pipe;
	unsigned int		recv_ctrl_pipe;
	unsigned int		recv_intr_pipe;

	/* information about the device */
	char			*transport_name;
	char			*protocol_name;
	__le32			bcs_signature;
	u8			subclass;
	u8			protocol;
	u8			max_lun;

	u8			ifnum;		 /* interface number   */
	u8			ep_bInterval;	 /* interrupt interval */

	/* function pointers for this device */
	trans_cmnd		transport;	 /* transport function	   */
	trans_reset		transport_reset; /* transport device reset */
	proto_cmnd		proto_handler;	 /* protocol handler	   */

	/* SCSI interfaces */
	struct scsi_cmnd	*srb;		 /* current srb		*/
	unsigned int		tag;		 /* current dCBWTag	*/

	/* control and bulk communications data */
	struct urb		*current_urb;	 /* USB requests	 */
	struct usb_ctrlrequest	*cr;		 /* control requests	 */
	struct usb_sg_request	current_sg;	 /* scatter-gather req.  */
	unsigned char		*iobuf;		 /* I/O buffer		 */
	unsigned char		*sensebuf;	 /* sense data buffer	 */
	dma_addr_t		cr_dma;		 /* buffer DMA addresses */
	dma_addr_t		iobuf_dma;
	struct task_struct	*ctl_thread;	 /* the control thread   */

	/* mutual exclusion and synchronization structures */
	struct completion	cmnd_ready;	 /* to sleep thread on	    */
	struct completion	notify;		 /* thread begin/end	    */
	wait_queue_head_t	delay_wait;	 /* wait during scan, reset */
	struct completion	scanning_done;	 /* wait for scan thread    */

	/* subdriver information */
	void			*extra;		 /* Any extra data          */
	extra_data_destructor	extra_destructor;/* extra data destructor   */
#ifdef CONFIG_PM
	pm_hook			suspend_resume_hook;
#endif
	// for 6250 code
	SD_STATUS   SD_Status;
	MS_STATUS   MS_Status;
	SM_STATUS   SM_Status;

	//----- SD Control Data ----------------
	//SD_REGISTER SD_Regs;
	WORD        SD_Block_Mult;
	BYTE        SD_READ_BL_LEN;
	WORD        SD_C_SIZE;
	BYTE        SD_C_SIZE_MULT;

	// SD/MMC New spec.
	BYTE        SD_SPEC_VER;
	BYTE        SD_CSD_VER;
	BYTE        SD20_HIGH_CAPACITY;
	DWORD       HC_C_SIZE;
	BYTE        MMC_SPEC_VER;
	BYTE        MMC_BusWidth;
	BYTE        MMC_HIGH_CAPACITY;
	
	//----- MS Control Data ----------------
	BOOLEAN             MS_SWWP;
	DWORD               MSP_TotalBlock;
	MS_LibControl       MS_Lib;
	BOOLEAN             MS_IsRWPage;
	WORD                MS_Model;

	//----- SM Control Data ----------------
	BYTE		SM_DeviceID;
	BYTE		SM_CardID;

	PBYTE		testbuf;
	BYTE		BIN_FLAG;
	DWORD		bl_num;
	int		SrbStatus;
	
	//------Power Managerment ---------------
	BOOLEAN         Power_IsResum;	
};

/* Convert between us_data and the corresponding Scsi_Host */
static inline struct Scsi_Host *us_to_host(struct us_data *us) {
	return container_of((void *) us, struct Scsi_Host, hostdata);
}
static inline struct us_data *host_to_us(struct Scsi_Host *host) {
	return (struct us_data *) host->hostdata;
}

/* Function to fill an inquiry response. See usb.c for details */
extern void fill_inquiry_response(struct us_data *us,
	unsigned char *data, unsigned int data_len);

/* The scsi_lock() and scsi_unlock() macros protect the sm_state and the
 * single queue element srb for write access */
#define scsi_unlock(host)	spin_unlock_irq(host->host_lock)
#define scsi_lock(host)		spin_lock_irq(host->host_lock)

#endif
