summaryrefslogtreecommitdiffstats
path: root/drivers/staging/keucr/transport.h
blob: ae9b5ee8a0cc8740bb4dcc121127fc15f3b2b58c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#ifndef _TRANSPORT_H_
#define _TRANSPORT_H_

#include <linux/blkdev.h>

/* Bulk only data structures */

/* command block wrapper */
struct bulk_cb_wrap {
	__le32	Signature;			/* contains 'USBC' */
	__u32	Tag;					/* unique per command id */
	__le32	DataTransferLength;	/* size of data */
	__u8	Flags;				/* direction in bit 0 */
	__u8	Lun;					/* LUN normally 0 */
	__u8	Length;				/* of of the CDB */
	__u8	CDB[16];				/* max command */
};

#define US_BULK_CB_WRAP_LEN	31
#define US_BULK_CB_SIGN		0x43425355	/*spells out USBC */
#define US_BULK_FLAG_IN		1
#define US_BULK_FLAG_OUT	0

/* command status wrapper */
struct bulk_cs_wrap {
	__le32	Signature;		/* should = 'USBS' */
	__u32		Tag;			/* same as original command */
	__le32	Residue;		/* amount not transferred */
	__u8		Status;		/* see below */
	__u8		Filler[18];
};

#define US_BULK_CS_WRAP_LEN	13
#define US_BULK_CS_SIGN		0x53425355	/* spells out 'USBS' */
#define US_BULK_STAT_OK		0
#define US_BULK_STAT_FAIL	1
#define US_BULK_STAT_PHASE	2

/* bulk-only class specific requests */
#define US_BULK_RESET_REQUEST	0xff
#define US_BULK_GET_MAX_LUN	0xfe

/* usb_stor_bulk_transfer_xxx() return codes, in order of severity */
#define USB_STOR_XFER_GOOD	0	/* good transfer                 */
#define USB_STOR_XFER_SHORT	1	/* transferred less than expected */
#define USB_STOR_XFER_STALLED	2	/* endpoint stalled              */
#define USB_STOR_XFER_LONG	3	/* device tried to send too much */
#define USB_STOR_XFER_ERROR	4	/* transfer died in the middle   */

/* Transport return codes */
#define USB_STOR_TRANSPORT_GOOD	0	/* Transport good, command good	*/
#define USB_STOR_TRANSPORT_FAILED	1	/* Transport good, command failed   */
#define USB_STOR_TRANSPORT_NO_SENSE	2	/* Command failed, no auto-sense    */
#define USB_STOR_TRANSPORT_ERROR	3	/* Transport bad (i.e. device dead) */

/*
 * We used to have USB_STOR_XFER_ABORTED and USB_STOR_TRANSPORT_ABORTED
 * return codes.  But now the transport and low-level transfer routines
 * treat an abort as just another error (-ENOENT for a cancelled URB).
 * It is up to the invoke_transport() function to test for aborts and
 * distinguish them from genuine communication errors.
 */

/* CBI accept device specific command */
#define US_CBI_ADSC		0
extern int usb_stor_Bulk_transport(struct scsi_cmnd *, struct us_data*);
extern int usb_stor_Bulk_max_lun(struct us_data*);
extern int usb_stor_Bulk_reset(struct us_data*);
extern void usb_stor_print_cmd(struct scsi_cmnd *);
extern void usb_stor_invoke_transport(struct scsi_cmnd *, struct us_data*);
extern void usb_stor_stop_transport(struct us_data*);
extern int usb_stor_control_msg(struct us_data *us, unsigned int pipe,
		u8 request, u8 requesttype, u16 value, u16 index,
		void *data, u16 size, int timeout);
extern int usb_stor_clear_halt(struct us_data *us, unsigned int pipe);
extern int usb_stor_bulk_transfer_buf(struct us_data *us, unsigned int pipe,
		void *buf, unsigned int length, unsigned int *act_len);
extern int usb_stor_bulk_transfer_sg(struct us_data *us, unsigned int pipe,
		void *buf, unsigned int length, int use_sg, int *residual);
extern int usb_stor_bulk_srb(struct us_data* us, unsigned int pipe,
		struct scsi_cmnd* srb);
extern int usb_stor_port_reset(struct us_data *us);

/* Protocol handling routines */
enum xfer_buf_dir	{TO_XFER_BUF, FROM_XFER_BUF};
extern unsigned int usb_stor_access_xfer_buf(struct us_data*, unsigned char *buffer,
	unsigned int buflen, struct scsi_cmnd *srb, struct scatterlist **,
	unsigned int *offset, enum xfer_buf_dir dir);
extern void usb_stor_set_xfer_buf(struct us_data*, unsigned char *buffer, unsigned int buflen, struct scsi_cmnd *srb,
	unsigned int dir);

// ENE scsi function
extern void ENE_stor_invoke_transport(struct scsi_cmnd *, struct us_data*);
extern int ENE_InitMedia(struct us_data*);
extern int ENE_SDInit(struct us_data*);
extern int ENE_MSInit(struct us_data*);
extern int ENE_SMInit(struct us_data*);
extern int ENE_ReadSDReg(struct us_data*, u8*);
extern int ENE_SendScsiCmd(struct us_data*, BYTE, void*, int);
extern int ENE_LoadBinCode(struct us_data*, BYTE);
extern int ENE_Read_BYTE(struct us_data*, WORD index, void *buf);
extern int ENE_Read_Data(struct us_data*, void *buf, unsigned int length);
extern int ENE_Write_Data(struct us_data*, void *buf, unsigned int length);
extern void BuildSenseBuffer(struct scsi_cmnd *, int);

// ENE scsi function
extern int SD_SCSIIrp(struct us_data *us, struct scsi_cmnd *srb);
extern int MS_SCSIIrp(struct us_data *us, struct scsi_cmnd *srb);
extern int SM_SCSIIrp(struct us_data *us, struct scsi_cmnd *srb);

// ENE MS function
extern int 	MS_CardInit(struct us_data *us);
extern void	MS_LibFreeAllocatedArea(struct us_data *us);
extern void	MS_LibFreeWriteBuf(struct us_data *us);
extern int	MS_LibFreeLogicalMap(struct us_data *us);
extern int	MS_LibForceSetLogicalPair(struct us_data *us, WORD logblk, WORD phyblk);
extern int	MS_ReaderReadPage(struct us_data *us, DWORD PhyBlockAddr, BYTE PageNum, DWORD *PageBuf, MS_LibTypeExtdat *ExtraDat);
extern int	MS_ReaderCopyBlock(struct us_data *us, WORD oldphy, WORD newphy, WORD PhyBlockAddr, BYTE PageNum, PBYTE buf, WORD len);
extern int	MS_ReaderEraseBlock(struct us_data *us, DWORD PhyBlockAddr);
extern int	MS_LibProcessBootBlock(struct us_data *us, WORD PhyBlock, BYTE *PageData);
extern int	MS_LibAllocLogicalMap(struct us_data *us);
extern int	MS_LibSetBootBlockMark(struct us_data *us, WORD phyblk);
extern int	MS_LibSetLogicalBlockMark(struct us_data *us, WORD phyblk, WORD mark);
extern int	MS_LibSetInitialErrorBlock(struct us_data *us, WORD phyblk);
extern int	MS_LibScanLogicalBlockNumber(struct us_data *us, WORD phyblk);
extern int	MS_LibAllocWriteBuf(struct us_data *us);
void		MS_LibClearWriteBuf(struct us_data *us);
void		MS_LibPhy2LogRange(WORD PhyBlock, WORD *LogStart, WORD *LogEnde);
extern int	MS_LibReadExtra(struct us_data *us, DWORD PhyBlock, BYTE PageNum, MS_LibTypeExtdat *ExtraDat);
extern int	MS_LibReadExtraBlock(struct us_data *us, DWORD PhyBlock, BYTE PageNum, BYTE blen, void *buf);
extern int	MS_LibSetAcquiredErrorBlock(struct us_data *us, WORD phyblk);
extern int	MS_LibErasePhyBlock(struct us_data *us, WORD phyblk);
extern int	MS_LibErrorPhyBlock(struct us_data *us, WORD phyblk);
extern int	MS_LibOverwriteExtra(struct us_data *us, DWORD PhyBlockAddr, BYTE PageNum, BYTE OverwriteFlag);
extern int	MS_LibSetLogicalPair(struct us_data *us, WORD logblk, WORD phyblk);
extern int	MS_LibCheckDisableBlock(struct us_data *us, WORD PhyBlock);
extern int	MS_CountFreeBlock(struct us_data *us, WORD PhyBlock);
extern int	MS_LibSearchBlockFromLogical(struct us_data *us, WORD logblk);
extern int	MS_LibSearchBlockFromPhysical(struct us_data *us, WORD phyblk);

// ENE SM function
extern int	SM_FreeMem(void);

#endif
OpenPOWER on IntegriCloud