1/*=======================================================/
2  Header file for nsp_cs.c
3      By: YOKOTA Hiroshi <yokota@netlab.is.tsukuba.ac.jp>
4
5    Ver.1.0 : Cut unused lines.
6    Ver 0.1 : Initial version.
7
8    This software may be used and distributed according to the terms of
9    the GNU General Public License.
10
11=========================================================*/
12
13/* $Id: nsp_cs.h,v 1.1.1.1 2008/10/15 03:26:55 james26_jang Exp $ */
14
15#ifndef  __nsp_cs__
16#define  __nsp_cs__
17
18/* for debugging */
19/*#define PCMCIA_DEBUG 9*/
20
21/*
22#define static
23#define inline
24*/
25
26/************************************
27 * Some useful macros...
28 */
29#define Number(arr) ((int) (sizeof(arr) / sizeof(arr[0])))
30#define BIT(x)      (1<<(x))
31#define MIN(a,b)    ((a) > (b) ? (b) : (a))
32
33/* SCSI initiator must be 7 */
34#define SCSI_INITIATOR_ID  7
35
36#define NSP_SELTIMEOUT 200
37
38/* base register */
39#define	IRQCONTROL	0x00
40#  define IRQCONTROL_RESELECT_CLEAR     BIT(0)
41#  define IRQCONTROL_PHASE_CHANGE_CLEAR BIT(1)
42#  define IRQCONTROL_TIMER_CLEAR        BIT(2)
43#  define IRQCONTROL_FIFO_CLEAR         BIT(3)
44#  define IRQCONTROL_ALLMASK            0xff
45#  define IRQCONTROL_ALLCLEAR           0x0f
46#  define IRQCONTROL_IRQDISABLE         0xf0
47
48#define	IRQSTATUS	0x00
49#  define IRQSTATUS_SCSI  BIT(0)
50#  define IRQSTATUS_TIMER BIT(2)
51#  define IRQSTATUS_FIFO  BIT(3)
52#  define IRQSTATUS_MASK  0x0f
53
54#define	IFSELECT	0x01
55#  define IF_IFSEL    BIT(0)
56#  define IF_REGSEL   BIT(2)
57
58#define	FIFOSTATUS	0x01
59#  define FIFOSTATUS_CHIP_REVISION 0x0f
60#  define FIFOSTATUS_CHIP_ID       0x70
61#  define FIFOSTATUS_FULL_EMPTY    0x80
62
63#define	INDEXREG	0x02
64#define	DATAREG		0x03
65#define	FIFODATA	0x04
66#define	FIFODATA1	0x05
67#define	FIFODATA2	0x06
68#define	FIFODATA3	0x07
69
70/* indexed register */
71#define EXTBUSCTRL	0x10
72
73#define CLOCKDIV	0x11
74#  define CLOCK_40M 0x02
75#  define CLOCK_20M 0x01
76
77#define TERMPWRCTRL	0x13
78#  define POWER_ON BIT(0)
79
80#define SCSIIRQMODE	0x15
81#  define SCSI_PHASE_CHANGE_EI BIT(0)
82#  define RESELECT_EI          BIT(4)
83#  define FIFO_IRQ_EI          BIT(5)
84#  define SCSI_RESET_IRQ_EI    BIT(6)
85
86#define IRQPHASESENCE	0x16
87#  define LATCHED_MSG      BIT(0)
88#  define LATCHED_IO       BIT(1)
89#  define LATCHED_CD       BIT(2)
90#  define LATCHED_BUS_FREE BIT(3)
91#  define PHASE_CHANGE_IRQ BIT(4)
92#  define RESELECT_IRQ     BIT(5)
93#  define FIFO_IRQ         BIT(6)
94#  define SCSI_RESET_IRQ   BIT(7)
95
96#define TIMERCOUNT	0x17
97
98#define SCSIBUSCTRL	0x18
99#  define SCSI_SEL         BIT(0)
100#  define SCSI_RST         BIT(1)
101#  define SCSI_DATAOUT_ENB BIT(2)
102#  define SCSI_ATN         BIT(3)
103#  define SCSI_ACK         BIT(4)
104#  define SCSI_BSY         BIT(5)
105#  define AUTODIRECTION    BIT(6)
106#  define ACKENB           BIT(7)
107
108#define SCSIBUSMON	0x19
109
110#define SETARBIT	0x1A
111#  define ARBIT_GO         BIT(0)
112#  define ARBIT_FLAG_CLEAR BIT(1)
113
114#define ARBITSTATUS	0x1A
115/*#  define ARBIT_GO        BIT(0)*/
116#  define ARBIT_WIN        BIT(1)
117#  define ARBIT_FAIL       BIT(2)
118#  define RESELECT_FLAG    BIT(3)
119
120#define PARITYCTRL	0x1B  /* W */
121#define PARITYSTATUS	0x1B  /* R */
122
123#define COMMANDCTRL	0x1C  /* W */
124#  define CLEAR_COMMAND_POINTER BIT(0)
125#  define AUTO_COMMAND_GO       BIT(1)
126
127#define RESELECTID	0x1C  /* R */
128#define COMMANDDATA	0x1D
129
130#define POINTERCLR	0x1E  /* W */
131#  define POINTER_CLEAR      BIT(0)
132#  define ACK_COUNTER_CLEAR  BIT(1)
133#  define REQ_COUNTER_CLEAR  BIT(2)
134#  define HOST_COUNTER_CLEAR BIT(3)
135#  define READ_SOURCE        0x30
136
137#define TRANSFERCOUNT	0x1E  /* R */
138
139#define TRANSFERMODE	0x20
140#   define MODE_MEM8   BIT(0)
141#   define MODE_MEM32  BIT(1)
142#   define MODE_ADR24  BIT(2)
143#   define MODE_ADR32  BIT(3)
144#   define MODE_IO8    BIT(4)
145#   define MODE_IO32   BIT(5)
146#   define TRANSFER_GO BIT(6)
147#   define BRAIND      BIT(7)
148
149#define SYNCREG		0x21
150#  define SYNCREG_OFFSET_MASK  0x0f
151#  define SYNCREG_PERIOD_MASK  0xf0
152#  define SYNCREG_PERIOD_SHIFT 4
153
154#define SCSIDATALATCH	0x22
155#define SCSIDATAIN	0x22
156#define SCSIDATAWITHACK	0x23
157#define SCAMCONTROL	0x24
158#define SCAMSTATUS	0x24
159#define SCAMDATA	0x25
160
161#define OTHERCONTROL	0x26
162#  define TPL_ROM_WRITE_EN BIT(0)
163#  define TPWR_OUT         BIT(1)
164#  define TPWR_SENSE       BIT(2)
165#  define RA8_CONTROL      BIT(3)
166
167#define ACKWIDTH	0x27
168#define CLRTESTPNT	0x28
169#define ACKCNTLD	0x29
170#define REQCNTLD	0x2A
171#define HSTCNTLD	0x2B
172#define CHECKSUM	0x2C
173
174/*
175 * Input status bit definitions.
176 */
177#define S_ATN		0x80	/**/
178#define S_SELECT	0x40	/**/
179#define S_REQUEST	0x20    /* Request line from SCSI bus*/
180#define S_ACK		0x10    /* Acknowlege line from SCSI bus*/
181#define S_BUSY		0x08    /* Busy line from SCSI bus*/
182#define S_CD		0x04    /* Command/Data line from SCSI bus*/
183#define S_IO		0x02    /* Input/Output line from SCSI bus*/
184#define S_MESSAGE	0x01    /* Message line from SCSI bus*/
185
186/*
187 * Useful Bus Monitor status combinations.
188 */
189#define BUSMON_SEL         S_SELECT
190#define BUSMON_BSY         S_BUSY
191#define BUSMON_REQ         S_REQUEST
192#define BUSMON_IO          S_IO
193#define BUSMON_ACK         S_ACK
194#define BUSMON_BUS_FREE    0
195#define BUSMON_COMMAND     ( S_BUSY | S_CD | S_REQUEST )
196#define BUSMON_MESSAGE_IN  ( S_BUSY | S_MESSAGE | S_IO | S_CD | S_REQUEST )
197#define BUSMON_MESSAGE_OUT ( S_BUSY | S_MESSAGE | S_CD | S_REQUEST )
198#define BUSMON_DATA_IN     ( S_BUSY | S_IO | S_REQUEST )
199#define BUSMON_DATA_OUT    ( S_BUSY | S_REQUEST )
200#define BUSMON_STATUS      ( S_BUSY | S_IO | S_CD | S_REQUEST )
201#define BUSMON_RESELECT    ( S_SELECT | S_IO )
202#define BUSMON_PHASE_MASK  ( S_SELECT | S_CD | S_MESSAGE | S_IO )
203
204#define BUSPHASE_COMMAND     ( BUSMON_COMMAND     & BUSMON_PHASE_MASK )
205#define BUSPHASE_MESSAGE_IN  ( BUSMON_MESSAGE_IN  & BUSMON_PHASE_MASK )
206#define BUSPHASE_MESSAGE_OUT ( BUSMON_MESSAGE_OUT & BUSMON_PHASE_MASK )
207#define BUSPHASE_DATA_IN     ( BUSMON_DATA_IN     & BUSMON_PHASE_MASK )
208#define BUSPHASE_DATA_OUT    ( BUSMON_DATA_OUT    & BUSMON_PHASE_MASK )
209#define BUSPHASE_STATUS      ( BUSMON_STATUS      & BUSMON_PHASE_MASK )
210#define BUSPHASE_SELECT      ( S_SELECT | S_IO )
211
212/* synchronous transfer negotiation data */
213typedef struct _sync_data {
214	unsigned int SyncNegotiation;
215#define SYNC_NOT_YET 0
216#define SYNC_OK      1
217#define SYNC_NG      2
218
219	unsigned int  SyncPeriod;
220	unsigned int  SyncOffset;
221	unsigned char SyncRegister;
222	unsigned char AckWidth;
223} sync_data;
224
225typedef struct _nsp_data {
226	unsigned int  BaseAddress;
227	unsigned int  NumAddress;
228	unsigned int  IrqNumber;
229
230	unsigned char ScsiClockDiv;
231
232	unsigned char TransferMode;
233
234	int           TimerCount;
235	int           SelectionTimeOut;
236	Scsi_Cmnd    *CurrentSC;
237
238	int           FifoCount;
239#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
240	int           Residual;
241#define RESID data->Residual
242#else
243#define RESID SCpnt->resid
244#endif
245
246#define MSGBUF_SIZE 20
247	unsigned char MsgBuffer[MSGBUF_SIZE];
248	int MsgLen;
249
250#define N_TARGET 8
251#define N_LUN    8
252	sync_data     Sync[N_TARGET][N_LUN];
253} nsp_hw_data;
254
255
256static void nsp_cs_release(u_long arg);
257static int nsp_cs_event(event_t event, int priority, event_callback_args_t *args);
258static dev_link_t *nsp_cs_attach(void);
259static void nsp_cs_detach(dev_link_t *);
260
261static unsigned int nsphw_start_selection(Scsi_Cmnd *SCpnt, nsp_hw_data *data);
262static void nsp_start_timer(Scsi_Cmnd *SCpnt, nsp_hw_data *data, int time);
263
264static int nsp_detect(Scsi_Host_Template * );
265static int nsp_release(struct Scsi_Host *shpnt);
266static const char * nsp_info(struct Scsi_Host *shpnt);
267static int nsp_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
268
269static int nsp_abort(Scsi_Cmnd *);
270static int nsp_reset(Scsi_Cmnd *, unsigned int);
271
272static int nsp_eh_abort(Scsi_Cmnd * SCpnt);
273static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt);
274static int nsp_eh_bus_reset(Scsi_Cmnd *SCpnt);
275static int nsp_eh_host_reset(Scsi_Cmnd *SCpnt);
276
277static int  nsp_fifo_count(Scsi_Cmnd *SCpnt);
278static void nsp_pio_read(Scsi_Cmnd *SCpnt, nsp_hw_data *data);
279static int  nsp_nexus(Scsi_Cmnd *SCpnt, nsp_hw_data *data);
280
281#ifdef PCMCIA_DEBUG
282static void show_command(Scsi_Cmnd *ptr);
283static void show_phase(Scsi_Cmnd *SCpnt);
284static void show_busphase(unsigned char stat);
285static void show_message(nsp_hw_data *data);
286#else
287# define show_command(ptr)   /* */
288# define show_phase(SCpnt)   /* */
289# define show_busphase(stat) /* */
290# define show_message(data)  /* */
291#endif
292
293/*
294 * SCSI phase
295 */
296enum _scsi_phase {
297	PH_UNDETERMINED,
298	PH_ARBSTART,
299	PH_SELSTART,
300	PH_SELECTED,
301	PH_COMMAND,
302	PH_DATA,
303	PH_STATUS,
304	PH_MSG_IN,
305	PH_MSG_OUT,
306	PH_DISCONNECT,
307	PH_RESELECT
308};
309
310enum _data_in_out {
311	IO_UNKNOWN,
312	IO_IN,
313	IO_OUT
314};
315
316
317/* SCSI messaage */
318#define MSG_COMMAND_COMPLETE 0x00
319#define MSG_EXTENDED         0x01
320#define MSG_NO_OPERATION     0x08
321
322#define MSG_EXT_SDTR         0x01
323
324#endif  /*__nsp_cs__*/
325