Blame view

drivers/scsi/FlashPoint.c 196 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  /*
  
    FlashPoint.c -- FlashPoint SCCB Manager for Linux
  
    This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
    Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
    Linux compatibility.  It was provided by BusLogic in the form of 16 separate
    source files, which would have unnecessarily cluttered the scsi directory, so
    the individual files have been combined into this single file.
  
    Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  
    This file is available under both the GNU General Public License
    and a BSD-style copyright; see LICENSE.FlashPoint for details.
  
  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17

78b4b05db   Matthew Wilcox   [SCSI] BusLogic: ...
18
  #ifdef CONFIG_SCSI_FLASHPOINT
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
21
  #define MAX_CARDS	8
  #undef BUSTYPE_PCI
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  #define CRCMASK	0xA001
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  #define FAILURE         0xFFFFFFFFL
69eb2ea47   Alexey Dobriyan   [SCSI] drivers/sc...
24
  struct sccb;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
25
  typedef void (*CALL_BK_FN) (struct sccb *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26

7f101662d   Alexey Dobriyan   [SCSI] drivers/sc...
27
  struct sccb_mgr_info {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
  	unsigned long si_baseaddr;
  	unsigned char si_present;
  	unsigned char si_intvect;
  	unsigned char si_id;
  	unsigned char si_lun;
  	unsigned short si_fw_revision;
  	unsigned short si_per_targ_init_sync;
  	unsigned short si_per_targ_fast_nego;
  	unsigned short si_per_targ_ultra_nego;
  	unsigned short si_per_targ_no_disc;
  	unsigned short si_per_targ_wide_nego;
  	unsigned short si_flags;
  	unsigned char si_card_family;
  	unsigned char si_bustype;
  	unsigned char si_card_model[3];
  	unsigned char si_relative_cardnum;
  	unsigned char si_reserved[4];
  	unsigned long si_OS_reserved;
  	unsigned char si_XlatInfo[4];
  	unsigned long si_reserved2[5];
  	unsigned long si_secondary_range;
7f101662d   Alexey Dobriyan   [SCSI] drivers/sc...
49
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
51
52
53
54
  #define SCSI_PARITY_ENA		  0x0001
  #define LOW_BYTE_TERM		  0x0010
  #define HIGH_BYTE_TERM		  0x0020
  #define BUSTYPE_PCI	  0x3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
58
59
60
61
  
  #define SUPPORT_16TAR_32LUN	  0x0002
  #define SOFT_RESET		  0x0004
  #define EXTENDED_TRANSLATION	  0x0008
  #define POST_ALL_UNDERRRUNS	  0x0040
  #define FLAG_SCAM_ENABLED	  0x0080
  #define FLAG_SCAM_LEVEL2	  0x0100
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
  #define HARPOON_FAMILY        0x02
323579880   Alexey Dobriyan   Fix "stuct", "str...
63
  /* SCCB struct used for both SCCB and UCB manager compiles! 
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
65
   * The UCB Manager treats the SCCB as it's 'native hardware structure' 
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  #pragma pack(1)
69eb2ea47   Alexey Dobriyan   [SCSI] drivers/sc...
67
  struct sccb {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
  	unsigned char OperationCode;
  	unsigned char ControlByte;
  	unsigned char CdbLength;
  	unsigned char RequestSenseLength;
  	unsigned long DataLength;
  	unsigned long DataPointer;
  	unsigned char CcbRes[2];
  	unsigned char HostStatus;
  	unsigned char TargetStatus;
  	unsigned char TargID;
  	unsigned char Lun;
  	unsigned char Cdb[12];
  	unsigned char CcbRes1;
  	unsigned char Reserved1;
  	unsigned long Reserved2;
  	unsigned long SensePointer;
  
  	CALL_BK_FN SccbCallback;	/* VOID (*SccbCallback)(); */
  	unsigned long SccbIOPort;	/* Identifies board base port */
  	unsigned char SccbStatus;
  	unsigned char SCCBRes2;
  	unsigned short SccbOSFlags;
  
  	unsigned long Sccb_XferCnt;	/* actual transfer count */
  	unsigned long Sccb_ATC;
  	unsigned long SccbVirtDataPtr;	/* virtual addr for OS/2 */
  	unsigned long Sccb_res1;
  	unsigned short Sccb_MGRFlags;
  	unsigned short Sccb_sgseg;
  	unsigned char Sccb_scsimsg;	/* identify msg for selection */
  	unsigned char Sccb_tag;
  	unsigned char Sccb_scsistat;
  	unsigned char Sccb_idmsg;	/* image of last msg in */
  	struct sccb *Sccb_forwardlink;
  	struct sccb *Sccb_backlink;
  	unsigned long Sccb_savedATC;
  	unsigned char Save_Cdb[6];
  	unsigned char Save_CdbLen;
  	unsigned char Sccb_XferState;
  	unsigned long Sccb_SGoffset;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
109
110
  
  #pragma pack()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
  #define SCATTER_GATHER_COMMAND    0x02
  #define RESIDUAL_COMMAND          0x03
  #define RESIDUAL_SG_COMMAND       0x04
  #define RESET_COMMAND             0x81
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
115
116
117
118
  #define F_USE_CMD_Q              0x20	/*Inidcates TAGGED command. */
  #define TAG_TYPE_MASK            0xC0	/*Type of tag msg to send. */
  #define SCCB_DATA_XFER_OUT       0x10	/* Write */
  #define SCCB_DATA_XFER_IN        0x08	/* Read */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
120
  #define NO_AUTO_REQUEST_SENSE    0x01	/* No Request Sense Buffer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
122
  #define BUS_FREE_ST     0
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
  #define SELECT_ST       1
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
124
125
126
127
  #define SELECT_BDR_ST   2	/* Select w\ Bus Device Reset */
  #define SELECT_SN_ST    3	/* Select w\ Sync Nego */
  #define SELECT_WN_ST    4	/* Select w\ Wide Data Nego */
  #define SELECT_Q_ST     5	/* Select w\ Tagged Q'ing */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
128
129
130
131
  #define COMMAND_ST      6
  #define DATA_OUT_ST     7
  #define DATA_IN_ST      8
  #define DISCONNECT_ST   9
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
  #define ABORT_ST        11
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
138
139
  #define F_HOST_XFER_DIR                0x01
  #define F_ALL_XFERRED                  0x02
  #define F_SG_XFER                      0x04
  #define F_AUTO_SENSE                   0x08
  #define F_ODD_BALL_CNT                 0x10
  #define F_NO_DATA_YET                  0x80
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
  #define F_STATUSLOADED                 0x01
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  #define F_DEV_SELECTED                 0x04
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
142
  #define SCCB_COMPLETE               0x00	/* SCCB completed without error */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  #define SCCB_DATA_UNDER_RUN         0x0C
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
144
  #define SCCB_SELECTION_TIMEOUT      0x11	/* Set SCSI selection timed out */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
  #define SCCB_DATA_OVER_RUN          0x12
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
146
  #define SCCB_PHASE_SEQUENCE_FAIL    0x14	/* Target bus phase sequence failure */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
148
149
150
  #define SCCB_GROSS_FW_ERR           0x27	/* Major problem! */
  #define SCCB_BM_ERR                 0x30	/* BusMaster error. */
  #define SCCB_PARITY_ERR             0x34	/* SCSI parity error */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
153
154
  
  #define SCCB_IN_PROCESS            0x00
  #define SCCB_SUCCESS               0x01
  #define SCCB_ABORT                 0x02
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
  #define SCCB_ERROR                 0x04
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
157
  #define  ORION_FW_REV      3110
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
158
  #define QUEUE_DEPTH     254+1	/*1 for Normal disconnect 32 for Q'ing. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
160
  #define	MAX_MB_CARDS	4	/* Max. no of cards suppoerted on Mother Board */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
162
163
164
  #define MAX_SCSI_TAR    16
  #define MAX_LUN         32
  #define LUN_MASK			0x1f
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
166
  #define SG_BUF_CNT      16	/*Number of prefetched elements. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
168
  #define SG_ELEMENT_SIZE 8	/*Eight byte per element. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169

ad0e1d9f0   Alexey Dobriyan   [SCSI] drivers/sc...
170
171
172
173
174
175
  #define RD_HARPOON(ioport)          inb((u32)ioport)
  #define RDW_HARPOON(ioport)         inw((u32)ioport)
  #define RD_HARP32(ioport,offset,data) (data = inl((u32)(ioport + offset)))
  #define WR_HARPOON(ioport,val)      outb((u8) val, (u32)ioport)
  #define WRW_HARPOON(ioport,val)       outw((u16)val, (u32)ioport)
  #define WR_HARP32(ioport,offset,data)  outl(data, (u32)(ioport + offset))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
176

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
  #define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
178
179
180
181
  #define  SYNC_TRYING               BIT(6)
  #define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
  
  #define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
182
183
184
185
  #define  WIDE_ENABLED              BIT(4)
  #define  WIDE_NEGOCIATED   BIT(5)
  
  #define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
  #define  TAG_Q_TRYING              BIT(2)
  #define  TAG_Q_REJECT      BIT(3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
189
  
  #define  TAR_ALLOW_DISC    BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
190
  #define  EE_SYNC_MASK      (BIT(0)+BIT(1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
  #define  EE_SYNC_5MB       BIT(0)
  #define  EE_SYNC_10MB      BIT(1)
  #define  EE_SYNC_20MB      (BIT(0)+BIT(1))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  #define  EE_WIDE_SCSI      BIT(7)
f31dc0cde   Alexey Dobriyan   [SCSI] drivers/sc...
195
  struct sccb_mgr_tar_info {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
197
198
199
200
201
202
203
204
205
206
207
  	struct sccb *TarSelQ_Head;
  	struct sccb *TarSelQ_Tail;
  	unsigned char TarLUN_CA;	/*Contingent Allgiance */
  	unsigned char TarTagQ_Cnt;
  	unsigned char TarSelQ_Cnt;
  	unsigned char TarStatus;
  	unsigned char TarEEValue;
  	unsigned char TarSyncCtrl;
  	unsigned char TarReserved[2];	/* for alignment */
  	unsigned char LunDiscQ_Idx[MAX_LUN];
  	unsigned char TarLUNBusy[MAX_LUN];
f31dc0cde   Alexey Dobriyan   [SCSI] drivers/sc...
208
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209

68d0c1ae6   Alexey Dobriyan   [SCSI] drivers/sc...
210
  struct nvram_info {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
211
212
213
214
215
216
217
218
219
  	unsigned char niModel;	/* Model No. of card */
  	unsigned char niCardNo;	/* Card no. */
  	unsigned long niBaseAddr;	/* Port Address of card */
  	unsigned char niSysConf;	/* Adapter Configuration byte - Byte 16 of eeprom map */
  	unsigned char niScsiConf;	/* SCSI Configuration byte - Byte 17 of eeprom map */
  	unsigned char niScamConf;	/* SCAM Configuration byte - Byte 20 of eeprom map */
  	unsigned char niAdapId;	/* Host Adapter ID - Byte 24 of eerpom map */
  	unsigned char niSyncTbl[MAX_SCSI_TAR / 2];	/* Sync/Wide byte of targets */
  	unsigned char niScamTbl[MAX_SCSI_TAR][4];	/* Compressed Scam name string of Targets */
68d0c1ae6   Alexey Dobriyan   [SCSI] drivers/sc...
220
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
222
223
224
225
  #define	MODEL_LT		1
  #define	MODEL_DL		2
  #define	MODEL_LW		3
  #define	MODEL_DW		4
13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
226
  struct sccb_card {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
227
228
229
230
  	struct sccb *currentSCCB;
  	struct sccb_mgr_info *cardInfo;
  
  	unsigned long ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
231

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
232
233
234
235
236
237
238
239
240
  	unsigned short cmdCounter;
  	unsigned char discQCount;
  	unsigned char tagQ_Lst;
  	unsigned char cardIndex;
  	unsigned char scanIndex;
  	unsigned char globalFlags;
  	unsigned char ourId;
  	struct nvram_info *pNvRamInfo;
  	struct sccb *discQ_Tbl[QUEUE_DEPTH];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
242
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
244
245
246
247
248
249
250
251
  
  #define F_TAG_STARTED		0x01
  #define F_CONLUN_IO			0x02
  #define F_DO_RENEGO			0x04
  #define F_NO_FILTER			0x08
  #define F_GREEN_PC			0x10
  #define F_HOST_XFER_ACT		0x20
  #define F_NEW_SCCB_CMD		0x40
  #define F_UPDATE_EEPROM		0x80
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
252
  #define  ID_STRING_LENGTH  32
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
253
  #define  TYPE_CODE0        0x63	/*Level2 Mstr (bits 7-6),  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
254

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
255
  #define  SLV_TYPE_CODE0    0xA3	/*Priority Bit set (bits 7-6),  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
256
257
258
259
260
261
262
263
264
  
  #define  ASSIGN_ID   0x00
  #define  SET_P_FLAG  0x01
  #define  CFG_CMPLT   0x03
  #define  DOM_MSTR    0x0F
  #define  SYNC_PTRN   0x1F
  
  #define  ID_0_7      0x18
  #define  ID_8_F      0x11
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
265
266
  #define  MISC_CODE   0x14
  #define  CLR_P_FLAG  0x18
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
267

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
269
  #define  INIT_SELTD  0x01
  #define  LEVEL2_TAR  0x02
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
270
271
272
273
274
  enum scam_id_st { ID0, ID1, ID2, ID3, ID4, ID5, ID6, ID7, ID8, ID9, ID10, ID11,
  	    ID12,
  	ID13, ID14, ID15, ID_UNUSED, ID_UNASSIGNED, ID_ASSIGNED, LEGACY,
  	CLR_PRIORITY, NO_ID_AVAIL
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
  
  typedef struct SCCBscam_info {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
277
278
  	unsigned char id_string[ID_STRING_LENGTH];
  	enum scam_id_st state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
280
  } SCCBSCAM_INFO;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
281

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
  #define  SCSI_REQUEST_SENSE      0x03
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
  #define  SCSI_READ               0x08
  #define  SCSI_WRITE              0x0A
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
  #define  SCSI_START_STOP_UNIT    0x1B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
  #define  SCSI_READ_EXTENDED      0x28
  #define  SCSI_WRITE_EXTENDED     0x2A
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
  #define  SCSI_WRITE_AND_VERIFY   0x2E
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
  #define  SSGOOD                  0x00
  #define  SSCHECK                 0x02
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
292
  #define  SSQ_FULL                0x28
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
295
296
297
  #define  SMCMD_COMP              0x00
  #define  SMEXT                   0x01
  #define  SMSAVE_DATA_PTR         0x02
  #define  SMREST_DATA_PTR         0x03
  #define  SMDISC                  0x04
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
300
301
302
303
304
305
306
307
308
  #define  SMABORT                 0x06
  #define  SMREJECT                0x07
  #define  SMNO_OP                 0x08
  #define  SMPARITY                0x09
  #define  SMDEV_RESET             0x0C
  #define	SMABORT_TAG					0x0D
  #define	SMINIT_RECOVERY			0x0F
  #define	SMREL_RECOVERY				0x10
  
  #define  SMIDENT                 0x80
  #define  DISC_PRIV               0x40
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
  #define  SMSYNC                  0x01
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
310
311
312
  #define  SMWDTR                  0x03
  #define  SM8BIT                  0x00
  #define  SM16BIT                 0x01
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
313
  #define  SMIGNORWR               0x23	/* Ignore Wide Residue */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
315
  
  #define  SIX_BYTE_CMD            0x06
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
  #define  TWELVE_BYTE_CMD         0x0C
  
  #define  ASYNC                   0x00
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
319
  #define  MAX_OFFSET              0x0F	/* Maxbyteoffset for Sync Xfers */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
321
322
323
324
325
  
  #define  EEPROM_WD_CNT     256
  
  #define  EEPROM_CHECK_SUM  0
  #define  FW_SIGNATURE      2
  #define  MODEL_NUMB_0      4
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
  #define  MODEL_NUMB_2      6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  #define  MODEL_NUMB_4      8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
328
329
330
  #define  SYSTEM_CONFIG     16
  #define  SCSI_CONFIG       17
  #define  BIOS_CONFIG       18
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
332
  #define  SCAM_CONFIG       20
  #define  ADAPTER_SCSI_ID   24
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
334
335
336
337
338
339
340
341
342
343
344
345
  #define  IGNORE_B_SCAN     32
  #define  SEND_START_ENA    34
  #define  DEVICE_ENABLE     36
  
  #define  SYNC_RATE_TBL     38
  #define  SYNC_RATE_TBL01   38
  #define  SYNC_RATE_TBL23   40
  #define  SYNC_RATE_TBL45   42
  #define  SYNC_RATE_TBL67   44
  #define  SYNC_RATE_TBL89   46
  #define  SYNC_RATE_TBLab   48
  #define  SYNC_RATE_TBLcd   50
  #define  SYNC_RATE_TBLef   52
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
346
  #define  EE_SCAMBASE      256
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
348
349
  #define  SCAM_ENABLED   BIT(2)
  #define  SCAM_LEVEL2    BIT(3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
350

1cafc30f4   Jiri Slaby   FlashPoint, use B...
351
352
353
  #define	RENEGO_ENA		BIT(10)
  #define	CONNIO_ENA		BIT(11)
  #define  GREEN_PC_ENA   BIT(12)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
354

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
355
356
357
358
  #define  AUTO_RATE_00   00
  #define  AUTO_RATE_05   01
  #define  AUTO_RATE_10   02
  #define  AUTO_RATE_20   03
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
360
361
  #define  WIDE_NEGO_BIT     BIT(7)
  #define  DISC_ENABLE_BIT   BIT(6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
363
364
  #define  hp_vendor_id_0       0x00	/* LSB */
  #define  ORION_VEND_0   0x4B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
366
367
  #define  hp_vendor_id_1       0x01	/* MSB */
  #define  ORION_VEND_1   0x10
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
369
370
  #define  hp_device_id_0       0x02	/* LSB */
  #define  ORION_DEV_0    0x30
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
372
373
  #define  hp_device_id_1       0x03	/* MSB */
  #define  ORION_DEV_1    0x81
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
375
  
  	/* Sub Vendor ID and Sub Device ID only available in
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
376
  	   Harpoon Version 2 and higher */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
378
  #define  hp_sub_device_id_0   0x06	/* LSB */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
380
381
382
383
384
  #define  hp_semaphore         0x0C
  #define SCCB_MGR_ACTIVE    BIT(0)
  #define TICKLE_ME          BIT(1)
  #define SCCB_MGR_PRESENT   BIT(3)
  #define BIOS_IN_USE        BIT(4)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
385

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
386
  #define  hp_sys_ctrl          0x0F
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
387

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
388
389
390
391
  #define  STOP_CLK          BIT(0)	/*Turn off BusMaster Clock */
  #define  DRVR_RST          BIT(1)	/*Firmware Reset to 80C15 chip */
  #define  HALT_MACH         BIT(3)	/*Halt State Machine      */
  #define  HARD_ABORT        BIT(4)	/*Hard Abort              */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
393
  #define  hp_host_blk_cnt      0x13
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
395
  #define  XFER_BLK64        0x06	/*     1 1 0 64 byte per block */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
396

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
397
  #define  BM_THRESHOLD      0x40	/* PCI mode can only xfer 16 bytes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
398

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
399
  #define  hp_int_mask          0x17
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
401
402
  #define  INT_CMD_COMPL     BIT(0)	/* DMA command complete   */
  #define  INT_EXT_STATUS    BIT(1)	/* Extended Status Set    */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
403

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
404
405
406
  #define  hp_xfer_cnt_lo       0x18
  #define  hp_xfer_cnt_hi       0x1A
  #define  hp_xfer_cmd          0x1B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
407

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
408
409
  #define  XFER_HOST_DMA     0x00	/*     0 0 0 Transfer Host -> DMA */
  #define  XFER_DMA_HOST     0x01	/*     0 0 1 Transfer DMA  -> Host */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
410

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
411
  #define  XFER_HOST_AUTO    0x00	/*     0 0 Auto Transfer Size   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
412

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
413
  #define  XFER_DMA_8BIT     0x20	/*     0 1 8 BIT  Transfer Size */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
415
  #define  DISABLE_INT       BIT(7)	/*Do not interrupt at end of cmd. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
416

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
417
418
  #define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
  #define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
419

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
420
421
  #define  hp_host_addr_lo      0x1C
  #define  hp_host_addr_hmi     0x1E
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
423
  #define  hp_ee_ctrl           0x22
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
424

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
425
426
427
428
429
430
431
  #define  EXT_ARB_ACK       BIT(7)
  #define  SCSI_TERM_ENA_H   BIT(6)	/* SCSI high byte terminator */
  #define  SEE_MS            BIT(5)
  #define  SEE_CS            BIT(3)
  #define  SEE_CLK           BIT(2)
  #define  SEE_DO            BIT(1)
  #define  SEE_DI            BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
433
434
435
436
437
438
  #define  EE_READ           0x06
  #define  EE_WRITE          0x05
  #define  EWEN              0x04
  #define  EWEN_ADDR         0x03C0
  #define  EWDS              0x04
  #define  EWDS_ADDR         0x0000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
440
  #define  hp_bm_ctrl           0x26
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
442
443
444
445
  #define  SCSI_TERM_ENA_L   BIT(0)	/*Enable/Disable external terminators */
  #define  FLUSH_XFER_CNTR   BIT(1)	/*Flush transfer counter */
  #define  FORCE1_XFER       BIT(5)	/*Always xfer one byte in byte mode */
  #define  FAST_SINGLE       BIT(6)	/*?? */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
447
  #define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
448

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
449
450
  #define  hp_sg_addr           0x28
  #define  hp_page_ctrl         0x29
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
451

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
452
453
454
455
  #define  SCATTER_EN        BIT(0)
  #define  SGRAM_ARAM        BIT(1)
  #define  G_INT_DISABLE     BIT(3)	/* Enable/Disable all Interrupts */
  #define  NARROW_SCSI_CARD  BIT(4)	/* NARROW/WIDE SCSI config pin */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
456

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
457
  #define  hp_pci_stat_cfg      0x2D
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
458

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
459
  #define  REC_MASTER_ABORT  BIT(5)	/*received Master abort */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
461
  #define  hp_rev_num           0x33
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
462

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
463
464
  #define  hp_stack_data        0x34
  #define  hp_stack_addr        0x35
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
466
  #define  hp_ext_status        0x36
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
467

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
468
469
470
471
472
473
474
475
  #define  BM_FORCE_OFF      BIT(0)	/*Bus Master is forced to get off */
  #define  PCI_TGT_ABORT     BIT(0)	/*PCI bus master transaction aborted */
  #define  PCI_DEV_TMOUT     BIT(1)	/*PCI Device Time out */
  #define  CMD_ABORTED       BIT(4)	/*Command aborted */
  #define  BM_PARITY_ERR     BIT(5)	/*parity error on data received   */
  #define  PIO_OVERRUN       BIT(6)	/*Slave data overrun */
  #define  BM_CMD_BUSY       BIT(7)	/*Bus master transfer command busy */
  #define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
476
                                    BM_PARITY_ERR | PIO_OVERRUN)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
477
478
479
480
481
482
483
484
485
  #define  hp_int_status        0x37
  
  #define  EXT_STATUS_ON     BIT(1)	/*Extended status is valid */
  #define  SCSI_INTERRUPT    BIT(2)	/*Global indication of a SCSI int. */
  #define  INT_ASSERTED      BIT(5)	/* */
  
  #define  hp_fifo_cnt          0x38
  
  #define  hp_intena		 0x40
1cafc30f4   Jiri Slaby   FlashPoint, use B...
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
  #define  RESET		 BIT(7)
  #define  PROG_HLT		 BIT(6)
  #define  PARITY		 BIT(5)
  #define  FIFO		 BIT(4)
  #define  SEL		 BIT(3)
  #define  SCAM_SEL		 BIT(2)
  #define  RSEL		 BIT(1)
  #define  TIMEOUT		 BIT(0)
  #define  BUS_FREE		 BIT(15)
  #define  XFER_CNT_0	 BIT(14)
  #define  PHASE		 BIT(13)
  #define  IUNKWN		 BIT(12)
  #define  ICMD_COMP	 BIT(11)
  #define  ITICKLE		 BIT(10)
  #define  IDO_STRT		 BIT(9)
  #define  ITAR_DISC	 BIT(8)
  #define  AUTO_INT		 (BIT(12)+BIT(11)+BIT(10)+BIT(9)+BIT(8))
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
  #define  CLR_ALL_INT	 0xFFFF
  #define  CLR_ALL_INT_1	 0xFF00
  
  #define  hp_intstat		 0x42
  
  #define  hp_scsisig           0x44
  
  #define  SCSI_SEL          BIT(7)
  #define  SCSI_BSY          BIT(6)
  #define  SCSI_REQ          BIT(5)
  #define  SCSI_ACK          BIT(4)
  #define  SCSI_ATN          BIT(3)
  #define  SCSI_CD           BIT(2)
  #define  SCSI_MSG          BIT(1)
  #define  SCSI_IOBIT        BIT(0)
  
  #define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
  #define  S_MSGO_PH         (BIT(2)+BIT(1)       )
  #define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
  #define  S_DATAI_PH        (              BIT(0))
  #define  S_DATAO_PH        0x00
  #define  S_ILL_PH          (       BIT(1)       )
  
  #define  hp_scsictrl_0        0x45
  
  #define  SEL_TAR           BIT(6)
  #define  ENA_ATN           BIT(4)
  #define  ENA_RESEL         BIT(2)
  #define  SCSI_RST          BIT(1)
  #define  ENA_SCAM_SEL      BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
533

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
534
  #define  hp_portctrl_0        0x46
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
535

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
536
537
538
539
540
541
542
543
  #define  SCSI_PORT         BIT(7)
  #define  SCSI_INBIT        BIT(6)
  #define  DMA_PORT          BIT(5)
  #define  DMA_RD            BIT(4)
  #define  HOST_PORT         BIT(3)
  #define  HOST_WRT          BIT(2)
  #define  SCSI_BUS_EN       BIT(1)
  #define  START_TO          BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
544

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
545
  #define  hp_scsireset         0x47
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
546

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
547
548
549
550
551
552
  #define  SCSI_INI          BIT(6)
  #define  SCAM_EN           BIT(5)
  #define  DMA_RESET         BIT(3)
  #define  HPSCSI_RESET      BIT(2)
  #define  PROG_RESET        BIT(1)
  #define  FIFO_CLR          BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
554
555
  #define  hp_xfercnt_0         0x48
  #define  hp_xfercnt_2         0x4A
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
556

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
557
558
  #define  hp_fifodata_0        0x4C
  #define  hp_addstat           0x4E
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
559

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
560
561
562
  #define  SCAM_TIMER        BIT(7)
  #define  SCSI_MODE8        BIT(3)
  #define  SCSI_PAR_ERR      BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
563

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
564
  #define  hp_prgmcnt_0         0x4F
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
565

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
566
567
568
  #define  hp_selfid_0          0x50
  #define  hp_selfid_1          0x51
  #define  hp_arb_id            0x52
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
569

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
570
  #define  hp_select_id         0x53
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
571

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
572
573
574
575
576
  #define  hp_synctarg_base     0x54
  #define  hp_synctarg_12       0x54
  #define  hp_synctarg_13       0x55
  #define  hp_synctarg_14       0x56
  #define  hp_synctarg_15       0x57
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
577

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
578
579
580
581
  #define  hp_synctarg_8        0x58
  #define  hp_synctarg_9        0x59
  #define  hp_synctarg_10       0x5A
  #define  hp_synctarg_11       0x5B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
582

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
583
584
585
586
  #define  hp_synctarg_4        0x5C
  #define  hp_synctarg_5        0x5D
  #define  hp_synctarg_6        0x5E
  #define  hp_synctarg_7        0x5F
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
587

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
588
589
590
591
  #define  hp_synctarg_0        0x60
  #define  hp_synctarg_1        0x61
  #define  hp_synctarg_2        0x62
  #define  hp_synctarg_3        0x63
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
592

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
593
594
  #define  NARROW_SCSI       BIT(4)
  #define  DEFAULT_OFFSET    0x0F
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
595

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
596
597
598
  #define  hp_autostart_0       0x64
  #define  hp_autostart_1       0x65
  #define  hp_autostart_3       0x67
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
599

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
600
601
602
  #define  AUTO_IMMED    BIT(5)
  #define  SELECT   BIT(6)
  #define  END_DATA (BIT(7)+BIT(6))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
603

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
604
605
606
  #define  hp_gp_reg_0          0x68
  #define  hp_gp_reg_1          0x69
  #define  hp_gp_reg_3          0x6B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
607

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
608
  #define  hp_seltimeout        0x6C
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
609

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
610
  #define  TO_4ms            0x67	/* 3.9959ms */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
611

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
612
613
614
615
  #define  TO_5ms            0x03	/* 4.9152ms */
  #define  TO_10ms           0x07	/* 11.xxxms */
  #define  TO_250ms          0x99	/* 250.68ms */
  #define  TO_290ms          0xB1	/* 289.99ms */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
616

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
617
  #define  hp_clkctrl_0         0x6D
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
618

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
619
620
621
  #define  PWR_DWN           BIT(6)
  #define  ACTdeassert       BIT(4)
  #define  CLK_40MHZ         (BIT(1) + BIT(0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
622

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
623
  #define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
624

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
625
626
  #define  hp_fiforead          0x6E
  #define  hp_fifowrite         0x6F
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
628
629
  #define  hp_offsetctr         0x70
  #define  hp_xferstat          0x71
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
630

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
631
  #define  FIFO_EMPTY        BIT(6)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
632

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
633
  #define  hp_portctrl_1        0x72
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
634

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
635
636
  #define  CHK_SCSI_P        BIT(3)
  #define  HOST_MODE8        BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
637

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
638
  #define  hp_xfer_pad          0x73
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
639

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
640
  #define  ID_UNLOCK         BIT(3)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
641

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
642
643
  #define  hp_scsidata_0        0x74
  #define  hp_scsidata_1        0x75
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
644

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
645
646
647
  #define  hp_aramBase          0x80
  #define  BIOS_DATA_OFFSET     0x60
  #define  BIOS_RELATIVE_CARD   0x64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
648

1cafc30f4   Jiri Slaby   FlashPoint, use B...
649
650
  #define  AR3      (BIT(9) + BIT(8))
  #define  SDATA    BIT(10)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
651

1cafc30f4   Jiri Slaby   FlashPoint, use B...
652
  #define  CRD_OP   BIT(11)	/* Cmp Reg. w/ Data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653

1cafc30f4   Jiri Slaby   FlashPoint, use B...
654
  #define  CRR_OP   BIT(12)	/* Cmp Reg. w. Reg. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
655

1cafc30f4   Jiri Slaby   FlashPoint, use B...
656
  #define  CPE_OP   (BIT(14)+BIT(11))	/* Cmp SCSI phs & Branch EQ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
657

1cafc30f4   Jiri Slaby   FlashPoint, use B...
658
  #define  CPN_OP   (BIT(14)+BIT(12))	/* Cmp SCSI phs & Branch NOT EQ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
659

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
660
  #define  ADATA_OUT   0x00
1cafc30f4   Jiri Slaby   FlashPoint, use B...
661
662
663
664
665
  #define  ADATA_IN    BIT(8)
  #define  ACOMMAND    BIT(10)
  #define  ASTATUS     (BIT(10)+BIT(8))
  #define  AMSG_OUT    (BIT(10)+BIT(9))
  #define  AMSG_IN     (BIT(10)+BIT(9)+BIT(8))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
666

1cafc30f4   Jiri Slaby   FlashPoint, use B...
667
  #define  BRH_OP   BIT(13)	/* Branch */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
668

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
669
  #define  ALWAYS   0x00
1cafc30f4   Jiri Slaby   FlashPoint, use B...
670
671
  #define  EQUAL    BIT(8)
  #define  NOT_EQ   BIT(9)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
672

1cafc30f4   Jiri Slaby   FlashPoint, use B...
673
  #define  TCB_OP   (BIT(13)+BIT(11))	/* Test condition & branch */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
674

1cafc30f4   Jiri Slaby   FlashPoint, use B...
675
  #define  FIFO_0      BIT(10)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
676

1cafc30f4   Jiri Slaby   FlashPoint, use B...
677
  #define  MPM_OP   BIT(15)	/* Match phase and move data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
678

1cafc30f4   Jiri Slaby   FlashPoint, use B...
679
  #define  MRR_OP   BIT(14)	/* Move DReg. to Reg. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
680

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
681
  #define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
682

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
683
684
685
  #define  D_AR0    0x00
  #define  D_AR1    BIT(0)
  #define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
686

1cafc30f4   Jiri Slaby   FlashPoint, use B...
687
  #define  RAT_OP      (BIT(14)+BIT(13)+BIT(11))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
688

1cafc30f4   Jiri Slaby   FlashPoint, use B...
689
  #define  SSI_OP      (BIT(15)+BIT(11))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
690

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
691
692
  #define  SSI_ITAR_DISC	(ITAR_DISC >> 8)
  #define  SSI_IDO_STRT	(IDO_STRT >> 8)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
693

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
694
695
  #define  SSI_ICMD_COMP	(ICMD_COMP >> 8)
  #define  SSI_ITICKLE	(ITICKLE >> 8)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
696

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
697
698
699
  #define  SSI_IUNKWN	(IUNKWN >> 8)
  #define  SSI_INO_CC	(IUNKWN >> 8)
  #define  SSI_IRFAIL	(IUNKWN >> 8)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
700

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
701
702
703
704
705
706
707
708
709
710
711
  #define  NP    0x10		/*Next Phase */
  #define  NTCMD 0x02		/*Non- Tagged Command start */
  #define  CMDPZ 0x04		/*Command phase */
  #define  DINT  0x12		/*Data Out/In interrupt */
  #define  DI    0x13		/*Data Out */
  #define  DC    0x19		/*Disconnect Message */
  #define  ST    0x1D		/*Status Phase */
  #define  UNKNWN 0x24		/*Unknown bus action */
  #define  CC    0x25		/*Command Completion failure */
  #define  TICK  0x26		/*New target reselected us. */
  #define  SELCHK 0x28		/*Select & Check SCSI ID latch reg */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
712

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
713
714
715
716
  #define  ID_MSG_STRT    hp_aramBase + 0x00
  #define  NON_TAG_ID_MSG hp_aramBase + 0x06
  #define  CMD_STRT       hp_aramBase + 0x08
  #define  SYNC_MSGS      hp_aramBase + 0x08
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
717

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
718
719
720
721
722
  #define  TAG_STRT          0x00
  #define  DISCONNECT_START  0x10/2
  #define  END_DATA_START    0x14/2
  #define  CMD_ONLY_STRT     CMDPZ/2
  #define  SELCHK_STRT     SELCHK/2
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
723
724
725
726
  
  #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
  /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
                                   xfercnt <<= 16,\
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
727
                                   xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
728
   */
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
729
  #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (unsigned short)(addr & 0x0000FFFFL)),\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
730
           addr >>= 16,\
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
731
           WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
732
           WR_HARP32(port,hp_xfercnt_0,count),\
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
733
           WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
734
735
           count >>= 16,\
           WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
736
737
738
  
  #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
                            WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
  #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
                            WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
743
744
745
746
747
748
749
750
751
752
753
754
  #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
                          WR_HARPOON(port+hp_scsireset, 0x00))
  
  #define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
                               (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
  
  #define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
                               (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
  
  #define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
                               (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
  
  #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
                               (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
  static unsigned char FPT_sisyncn(unsigned long port, unsigned char p_card,
  				 unsigned char syncFlag);
  static void FPT_ssel(unsigned long port, unsigned char p_card);
  static void FPT_sres(unsigned long port, unsigned char p_card,
  		     struct sccb_card *pCurrCard);
  static void FPT_shandem(unsigned long port, unsigned char p_card,
  			struct sccb *pCurrSCCB);
  static void FPT_stsyncn(unsigned long port, unsigned char p_card);
  static void FPT_sisyncr(unsigned long port, unsigned char sync_pulse,
  			unsigned char offset);
  static void FPT_sssyncv(unsigned long p_port, unsigned char p_id,
  			unsigned char p_sync_value,
  			struct sccb_mgr_tar_info *currTar_Info);
  static void FPT_sresb(unsigned long port, unsigned char p_card);
  static void FPT_sxfrp(unsigned long p_port, unsigned char p_card);
  static void FPT_schkdd(unsigned long port, unsigned char p_card);
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
771
  static unsigned char FPT_RdStack(unsigned long port, unsigned char index);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
772
773
  static void FPT_WrStack(unsigned long portBase, unsigned char index,
  			unsigned char data);
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
774
775
776
  static unsigned char FPT_ChkIfChipInitialized(unsigned long ioPort);
  
  static void FPT_SendMsg(unsigned long port, unsigned char message);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
777
778
  static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
  				   unsigned char error_code);
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
779

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
780
781
  static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card);
  static void FPT_RNVRamData(struct nvram_info *pNvRamInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
782

d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
783
  static unsigned char FPT_siwidn(unsigned long port, unsigned char p_card);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
784
785
786
787
788
789
790
791
792
  static void FPT_stwidn(unsigned long port, unsigned char p_card);
  static void FPT_siwidr(unsigned long port, unsigned char width);
  
  static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
  				unsigned char p_card);
  static void FPT_queueDisconnect(struct sccb *p_SCCB, unsigned char p_card);
  static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
  				 struct sccb *p_SCCB, unsigned char p_card);
  static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
793
  				  unsigned char p_card);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
794
795
796
797
798
  static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code);
  static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char card);
  static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
  				       unsigned char p_card);
  static void FPT_utilUpdateResidual(struct sccb *p_SCCB);
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
799
  static unsigned short FPT_CalcCrc16(unsigned char buffer[]);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
  static unsigned char FPT_CalcLrc(unsigned char buffer[]);
  
  static void FPT_Wait1Second(unsigned long p_port);
  static void FPT_Wait(unsigned long p_port, unsigned char p_delay);
  static void FPT_utilEEWriteOnOff(unsigned long p_port, unsigned char p_mode);
  static void FPT_utilEEWrite(unsigned long p_port, unsigned short ee_data,
  			    unsigned short ee_addr);
  static unsigned short FPT_utilEERead(unsigned long p_port,
  				     unsigned short ee_addr);
  static unsigned short FPT_utilEEReadOrg(unsigned long p_port,
  					unsigned short ee_addr);
  static void FPT_utilEESendCmdAddr(unsigned long p_port, unsigned char ee_cmd,
  				  unsigned short ee_addr);
  
  static void FPT_phaseDataOut(unsigned long port, unsigned char p_card);
  static void FPT_phaseDataIn(unsigned long port, unsigned char p_card);
  static void FPT_phaseCommand(unsigned long port, unsigned char p_card);
  static void FPT_phaseStatus(unsigned long port, unsigned char p_card);
  static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card);
  static void FPT_phaseMsgIn(unsigned long port, unsigned char p_card);
  static void FPT_phaseIllegal(unsigned long port, unsigned char p_card);
  
  static void FPT_phaseDecode(unsigned long port, unsigned char p_card);
  static void FPT_phaseChkFifo(unsigned long port, unsigned char p_card);
  static void FPT_phaseBusFree(unsigned long p_port, unsigned char p_card);
  
  static void FPT_XbowInit(unsigned long port, unsigned char scamFlg);
  static void FPT_BusMasterInit(unsigned long p_port);
  static void FPT_DiagEEPROM(unsigned long p_port);
  
  static void FPT_dataXferProcessor(unsigned long port,
  				  struct sccb_card *pCurrCard);
  static void FPT_busMstrSGDataXferStart(unsigned long port,
  				       struct sccb *pCurrSCCB);
  static void FPT_busMstrDataXferStart(unsigned long port,
  				     struct sccb *pCurrSCCB);
  static void FPT_hostDataXferAbort(unsigned long port, unsigned char p_card,
  				  struct sccb *pCurrSCCB);
  static void FPT_hostDataXferRestart(struct sccb *currSCCB);
  
  static unsigned char FPT_SccbMgr_bad_isr(unsigned long p_port,
  					 unsigned char p_card,
  					 struct sccb_card *pCurrCard,
  					 unsigned short p_int);
  
  static void FPT_SccbMgrTableInitAll(void);
  static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
  				     unsigned char p_card);
  static void FPT_SccbMgrTableInitTarget(unsigned char p_card,
  				       unsigned char target);
  
  static void FPT_scini(unsigned char p_card, unsigned char p_our_id,
  		      unsigned char p_power_up);
  
  static int FPT_scarb(unsigned long p_port, unsigned char p_sel_type);
  static void FPT_scbusf(unsigned long p_port);
  static void FPT_scsel(unsigned long p_port);
  static void FPT_scasid(unsigned char p_card, unsigned long p_port);
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
858
  static unsigned char FPT_scxferc(unsigned long p_port, unsigned char p_data);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
859
860
861
862
863
864
  static unsigned char FPT_scsendi(unsigned long p_port,
  				 unsigned char p_id_string[]);
  static unsigned char FPT_sciso(unsigned long p_port,
  			       unsigned char p_id_string[]);
  static void FPT_scwirod(unsigned long p_port, unsigned char p_data_bit);
  static void FPT_scwiros(unsigned long p_port, unsigned char p_data_bit);
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
865
  static unsigned char FPT_scvalq(unsigned char p_quintet);
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
866
  static unsigned char FPT_scsell(unsigned long p_port, unsigned char targ_id);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
  static void FPT_scwtsel(unsigned long p_port);
  static void FPT_inisci(unsigned char p_card, unsigned long p_port,
  		       unsigned char p_our_id);
  static void FPT_scsavdi(unsigned char p_card, unsigned long p_port);
  static unsigned char FPT_scmachid(unsigned char p_card,
  				  unsigned char p_id_string[]);
  
  static void FPT_autoCmdCmplt(unsigned long p_port, unsigned char p_card);
  static void FPT_autoLoadDefaultMap(unsigned long p_port);
  
  static struct sccb_mgr_tar_info FPT_sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] =
      { {{0}} };
  static struct sccb_card FPT_BL_Card[MAX_CARDS] = { {0} };
  static SCCBSCAM_INFO FPT_scamInfo[MAX_SCSI_TAR] = { {{0}} };
  static struct nvram_info FPT_nvRamInfo[MAX_MB_CARDS] = { {0} };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
882

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
883
  static unsigned char FPT_mbCards = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
884
885
886
887
888
889
  static unsigned char FPT_scamHAString[] =
      { 0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C',
  	' ', 'B', 'T', '-', '9', '3', '0',
  	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  	0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890

c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
891
  static unsigned short FPT_default_intena = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
893
894
  static void (*FPT_s_PhaseTbl[8]) (unsigned long, unsigned char) = {
  0};
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
895
896
897
  
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
898
   * Function: FlashPoint_ProbeHostAdapter
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
899
900
901
902
   *
   * Description: Setup and/or Search for cards and return info to caller.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
903
  static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
904
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
905
  	static unsigned char first_time = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
906

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
907
908
909
910
  	unsigned char i, j, id, ScamFlg;
  	unsigned short temp, temp2, temp3, temp4, temp5, temp6;
  	unsigned long ioport;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
911

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
912
  	ioport = pCardInfo->si_baseaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
913

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
914
  	if (RD_HARPOON(ioport + hp_vendor_id_0) != ORION_VEND_0)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
915
  		return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
917
  	if ((RD_HARPOON(ioport + hp_vendor_id_1) != ORION_VEND_1))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
918
  		return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
919

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
920
  	if ((RD_HARPOON(ioport + hp_device_id_0) != ORION_DEV_0))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
921
  		return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
922

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
923
  	if ((RD_HARPOON(ioport + hp_device_id_1) != ORION_DEV_1))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
924
  		return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
926
  	if (RD_HARPOON(ioport + hp_rev_num) != 0x0f) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
927
928
929
930
931
  
  /* For new Harpoon then check for sub_device ID LSB
     the bits(0-3) must be all ZERO for compatible with
     current version of SCCBMgr, else skip this Harpoon
  	device. */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
932
  		if (RD_HARPOON(ioport + hp_sub_device_id_0) & 0x0f)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
933
  			return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
934
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
935
936
937
  	if (first_time) {
  		FPT_SccbMgrTableInitAll();
  		first_time = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
938
  		FPT_mbCards = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
939
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
940

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
941
942
  	if (FPT_RdStack(ioport, 0) != 0x00) {
  		if (FPT_ChkIfChipInitialized(ioport) == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
943
  			pCurrNvRam = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
944
945
  			WR_HARPOON(ioport + hp_semaphore, 0x00);
  			FPT_XbowInit(ioport, 0);	/*Must Init the SCSI before attempting */
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
946
  			FPT_DiagEEPROM(ioport);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
947
948
  		} else {
  			if (FPT_mbCards < MAX_MB_CARDS) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
949
950
  				pCurrNvRam = &FPT_nvRamInfo[FPT_mbCards];
  				FPT_mbCards++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
951
  				pCurrNvRam->niBaseAddr = ioport;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
952
  				FPT_RNVRamData(pCurrNvRam);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
953
  			} else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
954
  				return (int)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
955
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
956
  	} else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
957
  		pCurrNvRam = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
959
960
  	WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
  	WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
961

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
962
  	if (pCurrNvRam)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
963
964
  		pCardInfo->si_id = pCurrNvRam->niAdapId;
  	else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
  		pCardInfo->si_id =
  		    (unsigned
  		     char)(FPT_utilEERead(ioport,
  					  (ADAPTER_SCSI_ID /
  					   2)) & (unsigned char)0x0FF);
  
  	pCardInfo->si_lun = 0x00;
  	pCardInfo->si_fw_revision = ORION_FW_REV;
  	temp2 = 0x0000;
  	temp3 = 0x0000;
  	temp4 = 0x0000;
  	temp5 = 0x0000;
  	temp6 = 0x0000;
  
  	for (id = 0; id < (16 / 2); id++) {
  
  		if (pCurrNvRam) {
  			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
  			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  		} else
  			temp =
  			    FPT_utilEERead(ioport,
  					   (unsigned short)((SYNC_RATE_TBL / 2)
  							    + id));
  
  		for (i = 0; i < 2; temp >>= 8, i++) {
  
  			temp2 >>= 1;
  			temp3 >>= 1;
  			temp4 >>= 1;
  			temp5 >>= 1;
  			temp6 >>= 1;
  			switch (temp & 0x3) {
  			case AUTO_RATE_20:	/* Synchronous, 20 mega-transfers/second */
  				temp6 |= 0x8000;	/* Fall through */
  			case AUTO_RATE_10:	/* Synchronous, 10 mega-transfers/second */
  				temp5 |= 0x8000;	/* Fall through */
  			case AUTO_RATE_05:	/* Synchronous, 5 mega-transfers/second */
  				temp2 |= 0x8000;	/* Fall through */
  			case AUTO_RATE_00:	/* Asynchronous */
  				break;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1008

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1009
1010
  			if (temp & DISC_ENABLE_BIT)
  				temp3 |= 0x8000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1012
1013
  			if (temp & WIDE_NEGO_BIT)
  				temp4 |= 0x8000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1014

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1015
1016
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1017

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1018
1019
1020
1021
1022
  	pCardInfo->si_per_targ_init_sync = temp2;
  	pCardInfo->si_per_targ_no_disc = temp3;
  	pCardInfo->si_per_targ_wide_nego = temp4;
  	pCardInfo->si_per_targ_fast_nego = temp5;
  	pCardInfo->si_per_targ_ultra_nego = temp6;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1023

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1024
  	if (pCurrNvRam)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1025
1026
  		i = pCurrNvRam->niSysConf;
  	else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1027
1028
  		i = (unsigned
  		     char)(FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1029

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1030
  	if (pCurrNvRam)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1031
1032
  		ScamFlg = pCurrNvRam->niScamConf;
  	else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1033
1034
  		ScamFlg =
  		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1035

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1036
  	pCardInfo->si_flags = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1037

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1038
1039
  	if (i & 0x01)
  		pCardInfo->si_flags |= SCSI_PARITY_ENA;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1040

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1041
1042
  	if (!(i & 0x02))
  		pCardInfo->si_flags |= SOFT_RESET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1043

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1044
1045
  	if (i & 0x10)
  		pCardInfo->si_flags |= EXTENDED_TRANSLATION;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1047
1048
  	if (ScamFlg & SCAM_ENABLED)
  		pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1050
1051
  	if (ScamFlg & SCAM_LEVEL2)
  		pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1053
1054
1055
1056
1057
  	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  	if (i & 0x04) {
  		j |= SCSI_TERM_ENA_L;
  	}
  	WR_HARPOON(ioport + hp_bm_ctrl, j);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1058

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
  	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  	if (i & 0x08) {
  		j |= SCSI_TERM_ENA_H;
  	}
  	WR_HARPOON(ioport + hp_ee_ctrl, j);
  
  	if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
  
  		pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
  
  	pCardInfo->si_card_family = HARPOON_FAMILY;
  	pCardInfo->si_bustype = BUSTYPE_PCI;
  
  	if (pCurrNvRam) {
  		pCardInfo->si_card_model[0] = '9';
  		switch (pCurrNvRam->niModel & 0x0f) {
  		case MODEL_LT:
  			pCardInfo->si_card_model[1] = '3';
  			pCardInfo->si_card_model[2] = '0';
  			break;
  		case MODEL_LW:
  			pCardInfo->si_card_model[1] = '5';
  			pCardInfo->si_card_model[2] = '0';
  			break;
  		case MODEL_DL:
  			pCardInfo->si_card_model[1] = '3';
  			pCardInfo->si_card_model[2] = '2';
  			break;
  		case MODEL_DW:
  			pCardInfo->si_card_model[1] = '5';
  			pCardInfo->si_card_model[2] = '2';
  			break;
  		}
  	} else {
  		temp = FPT_utilEERead(ioport, (MODEL_NUMB_0 / 2));
  		pCardInfo->si_card_model[0] = (unsigned char)(temp >> 8);
  		temp = FPT_utilEERead(ioport, (MODEL_NUMB_2 / 2));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1096

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1097
1098
1099
  		pCardInfo->si_card_model[1] = (unsigned char)(temp & 0x00FF);
  		pCardInfo->si_card_model[2] = (unsigned char)(temp >> 8);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1100

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
  	if (pCardInfo->si_card_model[1] == '3') {
  		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
  			pCardInfo->si_flags |= LOW_BYTE_TERM;
  	} else if (pCardInfo->si_card_model[2] == '0') {
  		temp = RD_HARPOON(ioport + hp_xfer_pad);
  		WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
  		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
  			pCardInfo->si_flags |= LOW_BYTE_TERM;
  		WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
  		if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
  			pCardInfo->si_flags |= HIGH_BYTE_TERM;
  		WR_HARPOON(ioport + hp_xfer_pad, temp);
  	} else {
  		temp = RD_HARPOON(ioport + hp_ee_ctrl);
  		temp2 = RD_HARPOON(ioport + hp_xfer_pad);
  		WR_HARPOON(ioport + hp_ee_ctrl, (temp | SEE_CS));
  		WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
  		temp3 = 0;
  		for (i = 0; i < 8; i++) {
  			temp3 <<= 1;
  			if (!(RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7)))
  				temp3 |= 1;
  			WR_HARPOON(ioport + hp_xfer_pad, (temp2 & ~BIT(4)));
  			WR_HARPOON(ioport + hp_xfer_pad, (temp2 | BIT(4)));
  		}
  		WR_HARPOON(ioport + hp_ee_ctrl, temp);
  		WR_HARPOON(ioport + hp_xfer_pad, temp2);
  		if (!(temp3 & BIT(7)))
  			pCardInfo->si_flags |= LOW_BYTE_TERM;
  		if (!(temp3 & BIT(6)))
  			pCardInfo->si_flags |= HIGH_BYTE_TERM;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1134
  	ARAM_ACCESS(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1135

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1136
1137
1138
1139
1140
  	for (i = 0; i < 4; i++) {
  
  		pCardInfo->si_XlatInfo[i] =
  		    RD_HARPOON(ioport + hp_aramBase + BIOS_DATA_OFFSET + i);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1141
1142
1143
1144
1145
  
  	/* return with -1 if no sort, else return with
  	   logical card number sorted by BIOS (zero-based) */
  
  	pCardInfo->si_relative_cardnum =
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1146
1147
  	    (unsigned
  	     char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1148

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1149
  	SGRAM_ACCESS(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1151
1152
1153
1154
1155
1156
1157
1158
  	FPT_s_PhaseTbl[0] = FPT_phaseDataOut;
  	FPT_s_PhaseTbl[1] = FPT_phaseDataIn;
  	FPT_s_PhaseTbl[2] = FPT_phaseIllegal;
  	FPT_s_PhaseTbl[3] = FPT_phaseIllegal;
  	FPT_s_PhaseTbl[4] = FPT_phaseCommand;
  	FPT_s_PhaseTbl[5] = FPT_phaseStatus;
  	FPT_s_PhaseTbl[6] = FPT_phaseMsgOut;
  	FPT_s_PhaseTbl[7] = FPT_phaseMsgIn;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1160
  	pCardInfo->si_present = 0x01;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1161

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1162
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1164
1165
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1166
   * Function: FlashPoint_HardwareResetHostAdapter
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1167
1168
1169
1170
   *
   * Description: Setup adapter for normal operation (hard reset).
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1171
1172
  static unsigned long FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
  							 *pCardInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1174
1175
1176
1177
1178
  	struct sccb_card *CurrCard = NULL;
  	struct nvram_info *pCurrNvRam;
  	unsigned char i, j, thisCard, ScamFlg;
  	unsigned short temp, sync_bit_map, id;
  	unsigned long ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1179

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1180
  	ioport = pCardInfo->si_baseaddr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1181

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1182
  	for (thisCard = 0; thisCard <= MAX_CARDS; thisCard++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1183

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1184
  		if (thisCard == MAX_CARDS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1185

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1186
  			return FAILURE;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1187
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1188

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1189
  		if (FPT_BL_Card[thisCard].ioPort == ioport) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1190

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1191
1192
1193
1194
  			CurrCard = &FPT_BL_Card[thisCard];
  			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
  			break;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1195

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1196
  		else if (FPT_BL_Card[thisCard].ioPort == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1198
1199
  			FPT_BL_Card[thisCard].ioPort = ioport;
  			CurrCard = &FPT_BL_Card[thisCard];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1200

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1201
1202
1203
1204
1205
1206
  			if (FPT_mbCards)
  				for (i = 0; i < FPT_mbCards; i++) {
  					if (CurrCard->ioPort ==
  					    FPT_nvRamInfo[i].niBaseAddr)
  						CurrCard->pNvRamInfo =
  						    &FPT_nvRamInfo[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1207
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1208
1209
1210
  			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
  			CurrCard->cardIndex = thisCard;
  			CurrCard->cardInfo = pCardInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1211

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1212
1213
1214
  			break;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
1216
  
  	pCurrNvRam = CurrCard->pNvRamInfo;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1217
  	if (pCurrNvRam) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1218
  		ScamFlg = pCurrNvRam->niScamConf;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1219
1220
1221
  	} else {
  		ScamFlg =
  		    (unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1222
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1223

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1224
1225
  	FPT_BusMasterInit(ioport);
  	FPT_XbowInit(ioport, ScamFlg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1226

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1227
  	FPT_autoLoadDefaultMap(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1228

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1229
1230
  	for (i = 0, id = 0x01; i != pCardInfo->si_id; i++, id <<= 1) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1231

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1232
1233
1234
1235
  	WR_HARPOON(ioport + hp_selfid_0, id);
  	WR_HARPOON(ioport + hp_selfid_1, 0x00);
  	WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
  	CurrCard->ourId = pCardInfo->si_id;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1236

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1237
1238
1239
  	i = (unsigned char)pCardInfo->si_flags;
  	if (i & SCSI_PARITY_ENA)
  		WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1240

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1241
1242
1243
1244
  	j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  	if (i & LOW_BYTE_TERM)
  		j |= SCSI_TERM_ENA_L;
  	WR_HARPOON(ioport + hp_bm_ctrl, j);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1245

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1246
1247
1248
1249
  	j = (RD_HARPOON(ioport + hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  	if (i & HIGH_BYTE_TERM)
  		j |= SCSI_TERM_ENA_H;
  	WR_HARPOON(ioport + hp_ee_ctrl, j);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1251
  	if (!(pCardInfo->si_flags & SOFT_RESET)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1252

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1253
  		FPT_sresb(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1254

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1255
1256
  		FPT_scini(thisCard, pCardInfo->si_id, 0);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1257

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1258
1259
  	if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
  		CurrCard->globalFlags |= F_NO_FILTER;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1260

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1261
1262
1263
1264
1265
  	if (pCurrNvRam) {
  		if (pCurrNvRam->niSysConf & 0x10)
  			CurrCard->globalFlags |= F_GREEN_PC;
  	} else {
  		if (FPT_utilEERead(ioport, (SYSTEM_CONFIG / 2)) & GREEN_PC_ENA)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1266
  			CurrCard->globalFlags |= F_GREEN_PC;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1267
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1268

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1269
  	/* Set global flag to indicate Re-Negotiation to be done on all
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1270
1271
1272
1273
1274
1275
  	   ckeck condition */
  	if (pCurrNvRam) {
  		if (pCurrNvRam->niScsiConf & 0x04)
  			CurrCard->globalFlags |= F_DO_RENEGO;
  	} else {
  		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & RENEGO_ENA)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1276
  			CurrCard->globalFlags |= F_DO_RENEGO;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1277
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1278

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1279
1280
1281
1282
1283
  	if (pCurrNvRam) {
  		if (pCurrNvRam->niScsiConf & 0x08)
  			CurrCard->globalFlags |= F_CONLUN_IO;
  	} else {
  		if (FPT_utilEERead(ioport, (SCSI_CONFIG / 2)) & CONNIO_ENA)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1284
1285
  			CurrCard->globalFlags |= F_CONLUN_IO;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1286

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1287
  	temp = pCardInfo->si_per_targ_no_disc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1288

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1289
  	for (i = 0, id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1290

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1291
1292
1293
  		if (temp & id)
  			FPT_sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1294

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1295
  	sync_bit_map = 0x0001;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1296

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1297
  	for (id = 0; id < (MAX_SCSI_TAR / 2); id++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1299
1300
  		if (pCurrNvRam) {
  			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1301
  			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1302
1303
1304
1305
1306
1307
  			    (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  		} else
  			temp =
  			    FPT_utilEERead(ioport,
  					   (unsigned short)((SYNC_RATE_TBL / 2)
  							    + id));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1308

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1309
  		for (i = 0; i < 2; temp >>= 8, i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1310

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1311
  			if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1312

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1313
1314
1315
1316
  				FPT_sccbMgrTbl[thisCard][id * 2 +
  							 i].TarEEValue =
  				    (unsigned char)temp;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1317

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1318
1319
1320
1321
1322
1323
1324
1325
  			else {
  				FPT_sccbMgrTbl[thisCard][id * 2 +
  							 i].TarStatus |=
  				    SYNC_SUPPORTED;
  				FPT_sccbMgrTbl[thisCard][id * 2 +
  							 i].TarEEValue =
  				    (unsigned char)(temp & ~EE_SYNC_MASK);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1326

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1327
1328
1329
  /*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
              (id*2+i >= 8)){
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1330
  			if (pCardInfo->si_per_targ_wide_nego & sync_bit_map) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1331

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1332
1333
1334
  				FPT_sccbMgrTbl[thisCard][id * 2 +
  							 i].TarEEValue |=
  				    EE_WIDE_SCSI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1335

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1336
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1337

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1338
1339
1340
1341
1342
  			else {	/* NARROW SCSI */
  				FPT_sccbMgrTbl[thisCard][id * 2 +
  							 i].TarStatus |=
  				    WIDE_NEGOCIATED;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1343

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1344
  			sync_bit_map <<= 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1345

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1346
1347
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1348

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1349
1350
1351
  	WR_HARPOON((ioport + hp_semaphore),
  		   (unsigned char)(RD_HARPOON((ioport + hp_semaphore)) |
  				   SCCB_MGR_PRESENT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1352

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1353
  	return (unsigned long)CurrCard;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1354
  }
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1355
  static void FlashPoint_ReleaseHostAdapter(unsigned long pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1356
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1357
  	unsigned char i;
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1358
1359
1360
1361
  	unsigned long portBase;
  	unsigned long regOffset;
  	unsigned long scamData;
  	unsigned long *pScamTbl;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1362
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1363

13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1364
  	pCurrNvRam = ((struct sccb_card *)pCurrCard)->pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1365

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1366
  	if (pCurrNvRam) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1367
1368
1369
1370
1371
  		FPT_WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
  		FPT_WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
  		FPT_WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
  		FPT_WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
  		FPT_WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1372

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1373
1374
1375
1376
  		for (i = 0; i < MAX_SCSI_TAR / 2; i++)
  			FPT_WrStack(pCurrNvRam->niBaseAddr,
  				    (unsigned char)(i + 5),
  				    pCurrNvRam->niSyncTbl[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1377
1378
  
  		portBase = pCurrNvRam->niBaseAddr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1379
1380
1381
  		for (i = 0; i < MAX_SCSI_TAR; i++) {
  			regOffset = hp_aramBase + 64 + i * 4;
  			pScamTbl = (unsigned long *)&pCurrNvRam->niScamTbl[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1382
1383
1384
  			scamData = *pScamTbl;
  			WR_HARP32(portBase, regOffset, scamData);
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1385
  	} else {
13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1386
  		FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1387
1388
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1389

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1390
  static void FPT_RNVRamData(struct nvram_info *pNvRamInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1391
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1392
  	unsigned char i;
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1393
1394
1395
1396
  	unsigned long portBase;
  	unsigned long regOffset;
  	unsigned long scamData;
  	unsigned long *pScamTbl;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1397

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1398
1399
  	pNvRamInfo->niModel = FPT_RdStack(pNvRamInfo->niBaseAddr, 0);
  	pNvRamInfo->niSysConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 1);
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1400
1401
  	pNvRamInfo->niScsiConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 2);
  	pNvRamInfo->niScamConf = FPT_RdStack(pNvRamInfo->niBaseAddr, 3);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1402
  	pNvRamInfo->niAdapId = FPT_RdStack(pNvRamInfo->niBaseAddr, 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1403

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1404
1405
1406
  	for (i = 0; i < MAX_SCSI_TAR / 2; i++)
  		pNvRamInfo->niSyncTbl[i] =
  		    FPT_RdStack(pNvRamInfo->niBaseAddr, (unsigned char)(i + 5));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1407
1408
  
  	portBase = pNvRamInfo->niBaseAddr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1409
1410
  	for (i = 0; i < MAX_SCSI_TAR; i++) {
  		regOffset = hp_aramBase + 64 + i * 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1411
  		RD_HARP32(portBase, regOffset, scamData);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1412
  		pScamTbl = (unsigned long *)&pNvRamInfo->niScamTbl[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1413
1414
1415
1416
  		*pScamTbl = scamData;
  	}
  
  }
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1417
  static unsigned char FPT_RdStack(unsigned long portBase, unsigned char index)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1418
1419
  {
  	WR_HARPOON(portBase + hp_stack_addr, index);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1420
  	return RD_HARPOON(portBase + hp_stack_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1421
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1422
1423
  static void FPT_WrStack(unsigned long portBase, unsigned char index,
  			unsigned char data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1424
1425
1426
1427
  {
  	WR_HARPOON(portBase + hp_stack_addr, index);
  	WR_HARPOON(portBase + hp_stack_data, data);
  }
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1428
  static unsigned char FPT_ChkIfChipInitialized(unsigned long ioPort)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1429
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1430
  	if ((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != FPT_RdStack(ioPort, 4))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1431
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1432
1433
  	if ((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
  	    != CLKCTRL_DEFAULT)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1434
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1435
1436
  	if ((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
  	    (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1437
1438
  		return 1;
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1439
1440
  
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1441

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1442
1443
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1444
   * Function: FlashPoint_StartCCB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1445
1446
1447
1448
1449
1450
   *
   * Description: Start a command pointed to by p_Sccb. When the
   *              command is completed it will be returned via the
   *              callback function.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1451
  static void FlashPoint_StartCCB(unsigned long pCurrCard, struct sccb *p_Sccb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1452
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1453
1454
1455
1456
  	unsigned long ioport;
  	unsigned char thisCard, lun;
  	struct sccb *pSaveSccb;
  	CALL_BK_FN callback;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1457

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1458
1459
  	thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
  	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1460

1377d8dd7   Adrian Bunk   [SCSI] FlashPoint...
1461
  	if ((p_Sccb->TargID >= MAX_SCSI_TAR) || (p_Sccb->Lun >= MAX_LUN)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1462

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1463
1464
  		p_Sccb->HostStatus = SCCB_COMPLETE;
  		p_Sccb->SccbStatus = SCCB_ERROR;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1465
  		callback = (CALL_BK_FN) p_Sccb->SccbCallback;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1466
1467
  		if (callback)
  			callback(p_Sccb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1468

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1469
1470
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1471
  	FPT_sinits(p_Sccb, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1472

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1473
1474
1475
1476
  	if (!((struct sccb_card *)pCurrCard)->cmdCounter) {
  		WR_HARPOON(ioport + hp_semaphore,
  			   (RD_HARPOON(ioport + hp_semaphore)
  			    | SCCB_MGR_ACTIVE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1477

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1478
1479
1480
1481
1482
  		if (((struct sccb_card *)pCurrCard)->globalFlags & F_GREEN_PC) {
  			WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
  			WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1483

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
  	((struct sccb_card *)pCurrCard)->cmdCounter++;
  
  	if (RD_HARPOON(ioport + hp_semaphore) & BIOS_IN_USE) {
  
  		WR_HARPOON(ioport + hp_semaphore,
  			   (RD_HARPOON(ioport + hp_semaphore)
  			    | TICKLE_ME));
  		if (p_Sccb->OperationCode == RESET_COMMAND) {
  			pSaveSccb =
  			    ((struct sccb_card *)pCurrCard)->currentSCCB;
  			((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb;
  			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
  			((struct sccb_card *)pCurrCard)->currentSCCB =
  			    pSaveSccb;
  		} else {
  			FPT_queueAddSccb(p_Sccb, thisCard);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1502

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
  	else if ((RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
  
  		if (p_Sccb->OperationCode == RESET_COMMAND) {
  			pSaveSccb =
  			    ((struct sccb_card *)pCurrCard)->currentSCCB;
  			((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb;
  			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
  			((struct sccb_card *)pCurrCard)->currentSCCB =
  			    pSaveSccb;
  		} else {
  			FPT_queueAddSccb(p_Sccb, thisCard);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1516

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1517
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1518

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1519
  		MDISABLE_INT(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1520

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1521
1522
1523
1524
  		if ((((struct sccb_card *)pCurrCard)->globalFlags & F_CONLUN_IO)
  		    &&
  		    ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].
  		      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1525
1526
1527
  			lun = p_Sccb->Lun;
  		else
  			lun = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1528
1529
1530
1531
  		if ((((struct sccb_card *)pCurrCard)->currentSCCB == NULL) &&
  		    (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0)
  		    && (FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
  			== 0)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1532

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1533
1534
1535
  			((struct sccb_card *)pCurrCard)->currentSCCB = p_Sccb;
  			FPT_ssel(p_Sccb->SccbIOPort, thisCard);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1536

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
  		else {
  
  			if (p_Sccb->OperationCode == RESET_COMMAND) {
  				pSaveSccb =
  				    ((struct sccb_card *)pCurrCard)->
  				    currentSCCB;
  				((struct sccb_card *)pCurrCard)->currentSCCB =
  				    p_Sccb;
  				FPT_queueSelectFail(&FPT_BL_Card[thisCard],
  						    thisCard);
  				((struct sccb_card *)pCurrCard)->currentSCCB =
  				    pSaveSccb;
  			} else {
  				FPT_queueAddSccb(p_Sccb, thisCard);
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1554
1555
  		MENABLE_INT(ioport);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1556

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1557
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1558
1559
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1560
   * Function: FlashPoint_AbortCCB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561
1562
1563
1564
1565
1566
   *
   * Description: Abort the command pointed to by p_Sccb.  When the
   *              command is completed it will be returned via the
   *              callback function.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1567
  static int FlashPoint_AbortCCB(unsigned long pCurrCard, struct sccb *p_Sccb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1568
  {
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1569
  	unsigned long ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1570

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1571
  	unsigned char thisCard;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1572
  	CALL_BK_FN callback;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1573
  	unsigned char TID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1574
1575
  	struct sccb *pSaveSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1576

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1577
  	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1578

13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1579
  	thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1580

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1581
  	if (!(RD_HARPOON(ioport + hp_page_ctrl) & G_INT_DISABLE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1582

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1583
  		if (FPT_queueFindSccb(p_Sccb, thisCard)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1584

13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1585
  			((struct sccb_card *)pCurrCard)->cmdCounter--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1586

13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1587
  			if (!((struct sccb_card *)pCurrCard)->cmdCounter)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1588
1589
1590
1591
1592
  				WR_HARPOON(ioport + hp_semaphore,
  					   (RD_HARPOON(ioport + hp_semaphore)
  					    & (unsigned
  					       char)(~(SCCB_MGR_ACTIVE |
  						       TICKLE_ME))));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1594
1595
1596
  			p_Sccb->SccbStatus = SCCB_ABORT;
  			callback = p_Sccb->SccbCallback;
  			callback(p_Sccb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1597

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1598
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1599
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1600
1601
1602
  		else {
  			if (((struct sccb_card *)pCurrCard)->currentSCCB ==
  			    p_Sccb) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1603
  				p_Sccb->SccbStatus = SCCB_ABORT;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1604
  				return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1605
1606
  
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1607
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
1609
  
  				TID = p_Sccb->TargID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1610
  				if (p_Sccb->Sccb_tag) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1611
  					MDISABLE_INT(ioport);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1612
1613
1614
  					if (((struct sccb_card *)pCurrCard)->
  					    discQ_Tbl[p_Sccb->Sccb_tag] ==
  					    p_Sccb) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1615
  						p_Sccb->SccbStatus = SCCB_ABORT;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
  						p_Sccb->Sccb_scsistat =
  						    ABORT_ST;
  						p_Sccb->Sccb_scsimsg =
  						    SMABORT_TAG;
  
  						if (((struct sccb_card *)
  						     pCurrCard)->currentSCCB ==
  						    NULL) {
  							((struct sccb_card *)
  							 pCurrCard)->
  					currentSCCB = p_Sccb;
  							FPT_ssel(ioport,
  								 thisCard);
  						} else {
  							pSaveSCCB =
  							    ((struct sccb_card
  							      *)pCurrCard)->
  							    currentSCCB;
  							((struct sccb_card *)
  							 pCurrCard)->
  					currentSCCB = p_Sccb;
  							FPT_queueSelectFail((struct sccb_card *)pCurrCard, thisCard);
  							((struct sccb_card *)
  							 pCurrCard)->
  					currentSCCB = pSaveSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1641
1642
1643
  						}
  					}
  					MENABLE_INT(ioport);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1644
  					return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1645
1646
1647
1648
1649
1650
1651
1652
1653
  				} else {
  					currTar_Info =
  					    &FPT_sccbMgrTbl[thisCard][p_Sccb->
  								      TargID];
  
  					if (FPT_BL_Card[thisCard].
  					    discQ_Tbl[currTar_Info->
  						      LunDiscQ_Idx[p_Sccb->Lun]]
  					    == p_Sccb) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1654
  						p_Sccb->SccbStatus = SCCB_ABORT;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1655
  						return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1656
1657
1658
1659
1660
  					}
  				}
  			}
  		}
  	}
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1661
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1662
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1663
1664
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1665
   * Function: FlashPoint_InterruptPending
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1666
1667
1668
1669
1670
   *
   * Description: Do a quick check to determine if there is a pending
   *              interrupt for this card and disable the IRQ Pin if so.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1671
  static unsigned char FlashPoint_InterruptPending(unsigned long pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1672
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1673
  	unsigned long ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1674

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1675
  	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1676

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1677
  	if (RD_HARPOON(ioport + hp_int_status) & INT_ASSERTED) {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1678
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1679
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1681
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1682

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1683
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1684
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1685
1686
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1687
   * Function: FlashPoint_HandleInterrupt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1688
1689
1690
1691
1692
1693
   *
   * Description: This is our entry point when an interrupt is generated
   *              by the card and the upper level driver passes it on to
   *              us.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
1694
  static int FlashPoint_HandleInterrupt(unsigned long pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1695
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1696
1697
1698
1699
1700
  	struct sccb *currSCCB;
  	unsigned char thisCard, result, bm_status, bm_int_st;
  	unsigned short hp_int;
  	unsigned char i, target;
  	unsigned long ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1701

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1702
1703
  	thisCard = ((struct sccb_card *)pCurrCard)->cardIndex;
  	ioport = ((struct sccb_card *)pCurrCard)->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1704

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1705
  	MDISABLE_INT(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1706

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1707
1708
1709
1710
1711
1712
  	if ((bm_int_st = RD_HARPOON(ioport + hp_int_status)) & EXT_STATUS_ON)
  		bm_status =
  		    RD_HARPOON(ioport +
  			       hp_ext_status) & (unsigned char)BAD_EXT_STATUS;
  	else
  		bm_status = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1713

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1714
  	WR_HARPOON(ioport + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1715

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1716
1717
1718
  	while ((hp_int =
  		RDW_HARPOON((ioport +
  			     hp_intstat)) & FPT_default_intena) | bm_status) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1719

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1720
  		currSCCB = ((struct sccb_card *)pCurrCard)->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1721

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1722
1723
1724
1725
1726
1727
1728
1729
  		if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
  			result =
  			    FPT_SccbMgr_bad_isr(ioport, thisCard,
  						((struct sccb_card *)pCurrCard),
  						hp_int);
  			WRW_HARPOON((ioport + hp_intstat),
  				    (FIFO | TIMEOUT | RESET | SCAM_SEL));
  			bm_status = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1730

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1731
  			if (result) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1732

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1733
  				MENABLE_INT(ioport);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1734
  				return result;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1735
1736
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1737

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
  		else if (hp_int & ICMD_COMP) {
  
  			if (!(hp_int & BUS_FREE)) {
  				/* Wait for the BusFree before starting a new command.  We
  				   must also check for being reselected since the BusFree
  				   may not show up if another device reselects us in 1.5us or
  				   less.  SRR Wednesday, 3/8/1995.
  				 */
  				while (!
  				       (RDW_HARPOON((ioport + hp_intstat)) &
  					(BUS_FREE | RSEL))) ;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1750

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1751
1752
  			if (((struct sccb_card *)pCurrCard)->
  			    globalFlags & F_HOST_XFER_ACT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1753

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1754
  				FPT_phaseChkFifo(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1755
1756
1757
1758
  
  /*         WRW_HARPOON((ioport+hp_intstat),
              (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
           */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1759
  			WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1760

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1761
  			FPT_autoCmdCmplt(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1762

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1763
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1764

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1765
  		else if (hp_int & ITAR_DISC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1766

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1767
1768
  			if (((struct sccb_card *)pCurrCard)->
  			    globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1769

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1770
  				FPT_phaseChkFifo(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1771

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1772
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1773

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1774
  			if (RD_HARPOON(ioport + hp_gp_reg_1) == SMSAVE_DATA_PTR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1775

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1776
1777
  				WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
  				currSCCB->Sccb_XferState |= F_NO_DATA_YET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1778

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1779
1780
  				currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1781

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
  			currSCCB->Sccb_scsistat = DISCONNECT_ST;
  			FPT_queueDisconnect(currSCCB, thisCard);
  
  			/* Wait for the BusFree before starting a new command.  We
  			   must also check for being reselected since the BusFree
  			   may not show up if another device reselects us in 1.5us or
  			   less.  SRR Wednesday, 3/8/1995.
  			 */
  			while (!
  			       (RDW_HARPOON((ioport + hp_intstat)) &
  				(BUS_FREE | RSEL))
  			       && !((RDW_HARPOON((ioport + hp_intstat)) & PHASE)
  				    && RD_HARPOON((ioport + hp_scsisig)) ==
  				    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG |
  				     SCSI_IOBIT))) ;
  
  			/*
  			   The additional loop exit condition above detects a timing problem
  			   with the revision D/E harpoon chips.  The caller should reset the
  			   host adapter to recover when 0xFE is returned.
  			 */
  			if (!
  			    (RDW_HARPOON((ioport + hp_intstat)) &
  			     (BUS_FREE | RSEL))) {
  				MENABLE_INT(ioport);
  				return 0xFE;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1809

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1810
1811
  			WRW_HARPOON((ioport + hp_intstat),
  				    (BUS_FREE | ITAR_DISC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1812

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1813
1814
  			((struct sccb_card *)pCurrCard)->globalFlags |=
  			    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1816
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1817

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1818
  		else if (hp_int & RSEL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1819

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1820
1821
  			WRW_HARPOON((ioport + hp_intstat),
  				    (PROG_HLT | RSEL | PHASE | BUS_FREE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1822

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1823
1824
1825
1826
1827
  			if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) {
  				if (((struct sccb_card *)pCurrCard)->
  				    globalFlags & F_HOST_XFER_ACT) {
  					FPT_phaseChkFifo(ioport, thisCard);
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1828

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1829
1830
1831
1832
1833
1834
1835
1836
  				if (RD_HARPOON(ioport + hp_gp_reg_1) ==
  				    SMSAVE_DATA_PTR) {
  					WR_HARPOON(ioport + hp_gp_reg_1, 0x00);
  					currSCCB->Sccb_XferState |=
  					    F_NO_DATA_YET;
  					currSCCB->Sccb_savedATC =
  					    currSCCB->Sccb_ATC;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1837

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1838
1839
1840
1841
1842
  				WRW_HARPOON((ioport + hp_intstat),
  					    (BUS_FREE | ITAR_DISC));
  				currSCCB->Sccb_scsistat = DISCONNECT_ST;
  				FPT_queueDisconnect(currSCCB, thisCard);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1844
1845
1846
  			FPT_sres(ioport, thisCard,
  				 ((struct sccb_card *)pCurrCard));
  			FPT_phaseDecode(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1847

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1848
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1849

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1850
  		else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1851

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1852
1853
1854
  			WRW_HARPOON((ioport + hp_intstat),
  				    (IDO_STRT | XFER_CNT_0));
  			FPT_phaseDecode(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1855

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1856
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1857

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
  		else if ((hp_int & IUNKWN) || (hp_int & PROG_HLT)) {
  			WRW_HARPOON((ioport + hp_intstat),
  				    (PHASE | IUNKWN | PROG_HLT));
  			if ((RD_HARPOON(ioport + hp_prgmcnt_0) & (unsigned char)
  			     0x3f) < (unsigned char)SELCHK) {
  				FPT_phaseDecode(ioport, thisCard);
  			} else {
  				/* Harpoon problem some SCSI target device respond to selection
  				   with short BUSY pulse (<400ns) this will make the Harpoon is not able
  				   to latch the correct Target ID into reg. x53.
  				   The work around require to correct this reg. But when write to this
  				   reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
  				   need to read this reg first then restore it later. After update to 0x53 */
  
  				i = (unsigned
  				     char)(RD_HARPOON(ioport + hp_fifowrite));
  				target =
  				    (unsigned
  				     char)(RD_HARPOON(ioport + hp_gp_reg_3));
  				WR_HARPOON(ioport + hp_xfer_pad,
  					   (unsigned char)ID_UNLOCK);
  				WR_HARPOON(ioport + hp_select_id,
  					   (unsigned char)(target | target <<
  							   4));
  				WR_HARPOON(ioport + hp_xfer_pad,
  					   (unsigned char)0x00);
  				WR_HARPOON(ioport + hp_fifowrite, i);
  				WR_HARPOON(ioport + hp_autostart_3,
  					   (AUTO_IMMED + TAG_STRT));
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1889

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1890
  		else if (hp_int & XFER_CNT_0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1891

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1892
  			WRW_HARPOON((ioport + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1893

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1894
  			FPT_schkdd(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1895

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1896
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1897

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1898
  		else if (hp_int & BUS_FREE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1899

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1900
  			WRW_HARPOON((ioport + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1901

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1902
1903
  			if (((struct sccb_card *)pCurrCard)->
  			    globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1904

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1905
1906
  				FPT_hostDataXferAbort(ioport, thisCard,
  						      currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1907
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1908
1909
  			FPT_phaseBusFree(ioport, thisCard);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1910

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1911
  		else if (hp_int & ITICKLE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1912

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1913
1914
1915
1916
  			WRW_HARPOON((ioport + hp_intstat), ITICKLE);
  			((struct sccb_card *)pCurrCard)->globalFlags |=
  			    F_NEW_SCCB_CMD;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1917

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1918
1919
  		if (((struct sccb_card *)pCurrCard)->
  		    globalFlags & F_NEW_SCCB_CMD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1920

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1921
1922
  			((struct sccb_card *)pCurrCard)->globalFlags &=
  			    ~F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1923

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1924
1925
  			if (((struct sccb_card *)pCurrCard)->currentSCCB ==
  			    NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1926

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1927
1928
1929
  				FPT_queueSearchSelect(((struct sccb_card *)
  						       pCurrCard), thisCard);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1930

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1931
1932
1933
1934
1935
1936
  			if (((struct sccb_card *)pCurrCard)->currentSCCB !=
  			    NULL) {
  				((struct sccb_card *)pCurrCard)->globalFlags &=
  				    ~F_NEW_SCCB_CMD;
  				FPT_ssel(ioport, thisCard);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1937

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1938
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1939

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1940
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1941

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1942
  	}			/*end while */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1943

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1944
  	MENABLE_INT(ioport);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1945

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1946
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Sccb_bad_isr
   *
   * Description: Some type of interrupt has occurred which is slightly
   *              out of the ordinary.  We will now decode it fully, in
   *              this routine.  This is broken up in an attempt to save
   *              processing time.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1959
1960
1961
1962
  static unsigned char FPT_SccbMgr_bad_isr(unsigned long p_port,
  					 unsigned char p_card,
  					 struct sccb_card *pCurrCard,
  					 unsigned short p_int)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1963
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1964
1965
1966
  	unsigned char temp, ScamFlg;
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1967

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1968
1969
  	if (RD_HARPOON(p_port + hp_ext_status) &
  	    (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1970

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1971
  		if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1972

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1973
1974
1975
  			FPT_hostDataXferAbort(p_port, p_card,
  					      pCurrCard->currentSCCB);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1976

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1977
1978
1979
1980
1981
  		if (RD_HARPOON(p_port + hp_pci_stat_cfg) & REC_MASTER_ABORT)
  		{
  			WR_HARPOON(p_port + hp_pci_stat_cfg,
  				   (RD_HARPOON(p_port + hp_pci_stat_cfg) &
  				    ~REC_MASTER_ABORT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1982

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1983
  			WR_HARPOON(p_port + hp_host_blk_cnt, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1984

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1985
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1986

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1987
  		if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1988

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1989
1990
1991
  			if (!pCurrCard->currentSCCB->HostStatus)
  				pCurrCard->currentSCCB->HostStatus =
  				    SCCB_BM_ERR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1992

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1993
  			FPT_sxfrp(p_port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1994

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1995
1996
1997
1998
1999
  			temp = (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
  					       (EXT_ARB_ACK | SCSI_TERM_ENA_H));
  			WR_HARPOON(p_port + hp_ee_ctrl,
  				   ((unsigned char)temp | SEE_MS | SEE_CS));
  			WR_HARPOON(p_port + hp_ee_ctrl, temp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2000

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2001
2002
2003
2004
2005
2006
2007
  			if (!
  			    (RDW_HARPOON((p_port + hp_intstat)) &
  			     (BUS_FREE | RESET))) {
  				FPT_phaseDecode(p_port, p_card);
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2008

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2009
  	else if (p_int & RESET) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2010

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2011
2012
2013
  		WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
  		WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
  		if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2014

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2015
  			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2016

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2017
2018
2019
  				FPT_hostDataXferAbort(p_port, p_card,
  						      pCurrCard->currentSCCB);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2020

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2021
  		DISABLE_AUTO(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2022

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2023
  		FPT_sresb(p_port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2024

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2025
2026
  		while (RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2027

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2028
2029
2030
2031
2032
2033
2034
2035
  		pCurrNvRam = pCurrCard->pNvRamInfo;
  		if (pCurrNvRam) {
  			ScamFlg = pCurrNvRam->niScamConf;
  		} else {
  			ScamFlg =
  			    (unsigned char)FPT_utilEERead(p_port,
  							  SCAM_CONFIG / 2);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2036

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2037
  		FPT_XbowInit(p_port, ScamFlg);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2038

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2039
  		FPT_scini(p_card, pCurrCard->ourId, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2040

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2041
  		return 0xFF;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2042
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2043

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2044
  	else if (p_int & FIFO) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2045

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2046
  		WRW_HARPOON((p_port + hp_intstat), FIFO);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2047

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2048
2049
2050
  		if (pCurrCard->currentSCCB != NULL)
  			FPT_sxfrp(p_port, p_card);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2051

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2052
  	else if (p_int & TIMEOUT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2053

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2054
  		DISABLE_AUTO(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2055

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2056
2057
2058
  		WRW_HARPOON((p_port + hp_intstat),
  			    (PROG_HLT | TIMEOUT | SEL | BUS_FREE | PHASE |
  			     IUNKWN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2059

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2060
  		pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2061

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2062
2063
2064
2065
2066
2067
2068
  		currTar_Info =
  		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
  		if ((pCurrCard->globalFlags & F_CONLUN_IO)
  		    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
  			TAG_Q_TRYING))
  			currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] =
  			    0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2069
  		else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2070
  			currTar_Info->TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2071

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2072
2073
2074
2075
  		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
  			currTar_Info->TarSyncCtrl = 0;
  			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2076

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2077
2078
2079
  		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
  			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2080

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2081
2082
  		FPT_sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,
  			    currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2083

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2084
  		FPT_queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2085

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2086
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2087

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2088
  	else if (p_int & SCAM_SEL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2089

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2090
2091
2092
  		FPT_scarb(p_port, LEVEL2_TAR);
  		FPT_scsel(p_port);
  		FPT_scasid(p_card, p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2093

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2094
  		FPT_scbusf(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2096
2097
  		WRW_HARPOON((p_port + hp_intstat), SCAM_SEL);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2098

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2099
  	return 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2100
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2101
2102
2103
2104
2105
2106
2107
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2108
  static void FPT_SccbMgrTableInitAll()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2110
  	unsigned char thisCard;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2111

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2112
2113
  	for (thisCard = 0; thisCard < MAX_CARDS; thisCard++) {
  		FPT_SccbMgrTableInitCard(&FPT_BL_Card[thisCard], thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2114

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2115
2116
2117
2118
2119
2120
  		FPT_BL_Card[thisCard].ioPort = 0x00;
  		FPT_BL_Card[thisCard].cardInfo = NULL;
  		FPT_BL_Card[thisCard].cardIndex = 0xFF;
  		FPT_BL_Card[thisCard].ourId = 0x00;
  		FPT_BL_Card[thisCard].pNvRamInfo = NULL;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2121
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2122
2123
2124
2125
2126
2127
2128
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2129
2130
  static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
  				     unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2131
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2132
  	unsigned char scsiID, qtag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2134
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2135
  		FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2136
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2137
2138
2139
2140
2141
  	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
  		FPT_sccbMgrTbl[p_card][scsiID].TarStatus = 0;
  		FPT_sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
  		FPT_SccbMgrTableInitTarget(p_card, scsiID);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2142

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2143
2144
2145
2146
  	pCurrCard->scanIndex = 0x00;
  	pCurrCard->currentSCCB = NULL;
  	pCurrCard->globalFlags = 0x00;
  	pCurrCard->cmdCounter = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2147
  	pCurrCard->tagQ_Lst = 0x01;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2148
  	pCurrCard->discQCount = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2149
2150
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2151
2152
2153
2154
2155
2156
2157
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2158
2159
  static void FPT_SccbMgrTableInitTarget(unsigned char p_card,
  				       unsigned char target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2160
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2161
  	unsigned char lun, qtag;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2162
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2163

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2164
  	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2165
2166
2167
2168
2169
2170
2171
  
  	currTar_Info->TarSelQ_Cnt = 0;
  	currTar_Info->TarSyncCtrl = 0;
  
  	currTar_Info->TarSelQ_Head = NULL;
  	currTar_Info->TarSelQ_Tail = NULL;
  	currTar_Info->TarTagQ_Cnt = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2172
  	currTar_Info->TarLUN_CA = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2173

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2174
  	for (lun = 0; lun < MAX_LUN; lun++) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2175
  		currTar_Info->TarLUNBusy[lun] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2176
2177
  		currTar_Info->LunDiscQ_Idx[lun] = 0;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2178
2179
2180
2181
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
  		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] != NULL) {
  			if (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
  			    target) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2182
2183
  				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  				FPT_BL_Card[p_card].discQCount--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2184
2185
2186
2187
  			}
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2188
2189
2190
2191
2192
2193
2194
2195
  /*---------------------------------------------------------------------
   *
   * Function: sfetm
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2196
  static unsigned char FPT_sfm(unsigned long port, struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2197
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2198
  	unsigned char message;
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
2199
  	unsigned short TimeOutLoop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2200
2201
  
  	TimeOutLoop = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2202
2203
2204
  	while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  	       (TimeOutLoop++ < 20000)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2205

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2206
  	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2207

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2208
  	message = RD_HARPOON(port + hp_scsidata_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2209

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2210
  	WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2211
2212
  
  	if (TimeOutLoop > 20000)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2213
2214
2215
2216
2217
2218
2219
2220
2221
  		message = 0x00;	/* force message byte = 0 if Time Out on Req */
  
  	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
  	    (RD_HARPOON(port + hp_addstat) & SCSI_PAR_ERR)) {
  		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
  		WR_HARPOON(port + hp_xferstat, 0);
  		WR_HARPOON(port + hp_fiforead, 0);
  		WR_HARPOON(port + hp_fifowrite, 0);
  		if (pCurrSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2222
2223
2224
  			pCurrSCCB->Sccb_scsimsg = SMPARITY;
  		}
  		message = 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2225
  		do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2226
2227
  			ACCEPT_MSG_ATN(port);
  			TimeOutLoop = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2228
2229
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (TimeOutLoop++ < 20000)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2230
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2231
2232
  			if (TimeOutLoop > 20000) {
  				WRW_HARPOON((port + hp_intstat), PARITY);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2233
  				return message;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2234
2235
2236
2237
  			}
  			if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) !=
  			    S_MSGI_PH) {
  				WRW_HARPOON((port + hp_intstat), PARITY);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2238
  				return message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2239
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2240
  			WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2241

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2242
  			RD_HARPOON(port + hp_scsidata_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2243

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2244
  			WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2245

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2246
  		} while (1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2247
2248
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2249
2250
2251
2252
  	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
  	WR_HARPOON(port + hp_xferstat, 0);
  	WR_HARPOON(port + hp_fiforead, 0);
  	WR_HARPOON(port + hp_fifowrite, 0);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2253
  	return message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2254
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2255
2256
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2257
   * Function: FPT_ssel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2258
2259
2260
2261
   *
   * Description: Load up automation and select target device.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
2262
  static void FPT_ssel(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2263
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2264
  	unsigned char auto_loaded, i, target, *theCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2265

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2266
2267
2268
2269
2270
  	unsigned long cdb_reg;
  	struct sccb_card *CurrCard;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
  	unsigned char lastTag, lun;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2271

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2272
2273
2274
2275
2276
  	CurrCard = &FPT_BL_Card[p_card];
  	currSCCB = CurrCard->currentSCCB;
  	target = currSCCB->TargID;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
  	lastTag = CurrCard->tagQ_Lst;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2277

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2278
  	ARAM_ACCESS(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2279
2280
2281
  
  	if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
  		currSCCB->ControlByte &= ~F_USE_CMD_Q;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2282
2283
  	if (((CurrCard->globalFlags & F_CONLUN_IO) &&
  	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2284

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2285
  		lun = currSCCB->Lun;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2286
2287
  	else
  		lun = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
  	if (CurrCard->globalFlags & F_TAG_STARTED) {
  		if (!(currSCCB->ControlByte & F_USE_CMD_Q)) {
  			if ((currTar_Info->TarLUN_CA == 0)
  			    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
  				== TAG_Q_TRYING)) {
  
  				if (currTar_Info->TarTagQ_Cnt != 0) {
  					currTar_Info->TarLUNBusy[lun] = 1;
  					FPT_queueSelectFail(CurrCard, p_card);
  					SGRAM_ACCESS(port);
  					return;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2300

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2301
2302
2303
  				else {
  					currTar_Info->TarLUNBusy[lun] = 1;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2304

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2305
2306
2307
2308
2309
  			}
  			/*End non-tagged */
  			else {
  				currTar_Info->TarLUNBusy[lun] = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2310

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2311
2312
2313
2314
2315
2316
2317
2318
  		}
  		/*!Use cmd Q Tagged */
  		else {
  			if (currTar_Info->TarLUN_CA == 1) {
  				FPT_queueSelectFail(CurrCard, p_card);
  				SGRAM_ACCESS(port);
  				return;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2319

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2320
  			currTar_Info->TarLUNBusy[lun] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2321

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2322
  		}		/*else use cmd Q tagged */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2323

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2324
2325
2326
2327
2328
  	}
  	/*if glob tagged started */
  	else {
  		currTar_Info->TarLUNBusy[lun] = 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2329

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2330
2331
2332
2333
  	if ((((CurrCard->globalFlags & F_CONLUN_IO) &&
  	      ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  	     || (!(currSCCB->ControlByte & F_USE_CMD_Q)))) {
  		if (CurrCard->discQCount >= QUEUE_DEPTH) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2334
  			currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2335
  			FPT_queueSelectFail(CurrCard, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2336
2337
2338
  			SGRAM_ACCESS(port);
  			return;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2339
2340
2341
2342
  		for (i = 1; i < QUEUE_DEPTH; i++) {
  			if (++lastTag >= QUEUE_DEPTH)
  				lastTag = 1;
  			if (CurrCard->discQ_Tbl[lastTag] == NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2343
2344
2345
2346
2347
2348
2349
  				CurrCard->tagQ_Lst = lastTag;
  				currTar_Info->LunDiscQ_Idx[lun] = lastTag;
  				CurrCard->discQ_Tbl[lastTag] = currSCCB;
  				CurrCard->discQCount++;
  				break;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2350
  		if (i == QUEUE_DEPTH) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2351
  			currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2352
  			FPT_queueSelectFail(CurrCard, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2353
2354
2355
2356
  			SGRAM_ACCESS(port);
  			return;
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2357
  	auto_loaded = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2358

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2359
2360
  	WR_HARPOON(port + hp_select_id, target);
  	WR_HARPOON(port + hp_gp_reg_3, target);	/* Use by new automation logic */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2361

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2362
2363
2364
2365
  	if (currSCCB->OperationCode == RESET_COMMAND) {
  		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
  						   (currSCCB->
  						    Sccb_idmsg & ~DISC_PRIV)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2366

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2367
  		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + NP);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2368

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2369
  		currSCCB->Sccb_scsimsg = SMDEV_RESET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2370

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2371
2372
2373
  		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
  		auto_loaded = 1;
  		currSCCB->Sccb_scsistat = SELECT_BDR_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2374

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2375
2376
2377
2378
  		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
  			currTar_Info->TarSyncCtrl = 0;
  			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2379

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2380
2381
2382
  		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
  			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2383

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2384
2385
  		FPT_sssyncv(port, target, NARROW_SCSI, currTar_Info);
  		FPT_SccbMgrTableInitTarget(p_card, target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2386

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2387
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2388

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2389
2390
2391
2392
  	else if (currSCCB->Sccb_scsistat == ABORT_ST) {
  		WRW_HARPOON((port + ID_MSG_STRT), (MPM_OP + AMSG_OUT +
  						   (currSCCB->
  						    Sccb_idmsg & ~DISC_PRIV)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2393

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2394
  		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2395

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
  		WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT +
  						     (((unsigned
  							char)(currSCCB->
  							      ControlByte &
  							      TAG_TYPE_MASK)
  						       >> 6) | (unsigned char)
  						      0x20)));
  		WRW_HARPOON((port + SYNC_MSGS + 2),
  			    (MPM_OP + AMSG_OUT + currSCCB->Sccb_tag));
  		WRW_HARPOON((port + SYNC_MSGS + 4), (BRH_OP + ALWAYS + NP));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2406

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2407
2408
  		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
  		auto_loaded = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2409

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2410
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2411

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2412
2413
2414
2415
  	else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED)) {
  		auto_loaded = FPT_siwidn(port, p_card);
  		currSCCB->Sccb_scsistat = SELECT_WN_ST;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2416

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2417
2418
2419
2420
2421
  	else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
  		   == SYNC_SUPPORTED)) {
  		auto_loaded = FPT_sisyncn(port, p_card, 0);
  		currSCCB->Sccb_scsistat = SELECT_SN_ST;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2422

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2423
  	if (!auto_loaded) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2424

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2425
  		if (currSCCB->ControlByte & F_USE_CMD_Q) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2426

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2427
  			CurrCard->globalFlags |= F_TAG_STARTED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2428

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2429
2430
2431
  			if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
  			    == TAG_Q_REJECT) {
  				currSCCB->ControlByte &= ~F_USE_CMD_Q;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2432

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2433
2434
2435
2436
  				/* Fix up the start instruction with a jump to
  				   Non-Tag-CMD handling */
  				WRW_HARPOON((port + ID_MSG_STRT),
  					    BRH_OP + ALWAYS + NTCMD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2437

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2438
2439
2440
  				WRW_HARPOON((port + NON_TAG_ID_MSG),
  					    (MPM_OP + AMSG_OUT +
  					     currSCCB->Sccb_idmsg));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2441

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2442
2443
  				WR_HARPOON(port + hp_autostart_3,
  					   (SELECT + SELCHK_STRT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2444

25985edce   Lucas De Marchi   Fix common misspe...
2445
  				/* Setup our STATE so we know what happened when
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2446
2447
  				   the wheels fall off. */
  				currSCCB->Sccb_scsistat = SELECT_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2448

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2449
2450
  				currTar_Info->TarLUNBusy[lun] = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2451

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
  			else {
  				WRW_HARPOON((port + ID_MSG_STRT),
  					    (MPM_OP + AMSG_OUT +
  					     currSCCB->Sccb_idmsg));
  
  				WRW_HARPOON((port + ID_MSG_STRT + 2),
  					    (MPM_OP + AMSG_OUT +
  					     (((unsigned char)(currSCCB->
  							       ControlByte &
  							       TAG_TYPE_MASK)
  					       >> 6) | (unsigned char)0x20)));
  
  				for (i = 1; i < QUEUE_DEPTH; i++) {
  					if (++lastTag >= QUEUE_DEPTH)
  						lastTag = 1;
  					if (CurrCard->discQ_Tbl[lastTag] ==
  					    NULL) {
  						WRW_HARPOON((port +
  							     ID_MSG_STRT + 6),
  							    (MPM_OP + AMSG_OUT +
  							     lastTag));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2473
2474
  						CurrCard->tagQ_Lst = lastTag;
  						currSCCB->Sccb_tag = lastTag;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2475
2476
  						CurrCard->discQ_Tbl[lastTag] =
  						    currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2477
2478
2479
2480
  						CurrCard->discQCount++;
  						break;
  					}
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2481
2482
2483
2484
2485
2486
  				if (i == QUEUE_DEPTH) {
  					currTar_Info->TarLUNBusy[lun] = 1;
  					FPT_queueSelectFail(CurrCard, p_card);
  					SGRAM_ACCESS(port);
  					return;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2487

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2488
  				currSCCB->Sccb_scsistat = SELECT_Q_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2489

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2490
2491
2492
2493
  				WR_HARPOON(port + hp_autostart_3,
  					   (SELECT + SELCHK_STRT));
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2494

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2495
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2496

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2497
2498
  			WRW_HARPOON((port + ID_MSG_STRT),
  				    BRH_OP + ALWAYS + NTCMD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2499

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2500
2501
  			WRW_HARPOON((port + NON_TAG_ID_MSG),
  				    (MPM_OP + AMSG_OUT + currSCCB->Sccb_idmsg));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2502

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2503
  			currSCCB->Sccb_scsistat = SELECT_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2504

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2505
2506
2507
  			WR_HARPOON(port + hp_autostart_3,
  				   (SELECT + SELCHK_STRT));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2508

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2509
  		theCCB = (unsigned char *)&currSCCB->Cdb[0];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2510

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2511
  		cdb_reg = port + CMD_STRT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2512

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2513
2514
2515
2516
2517
  		for (i = 0; i < currSCCB->CdbLength; i++) {
  			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
  			cdb_reg += 2;
  			theCCB++;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2518

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2519
2520
  		if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
  			WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2521

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2522
2523
2524
2525
  	}
  	/* auto_loaded */
  	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
  	WR_HARPOON(port + hp_xferstat, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2526

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2527
  	WRW_HARPOON((port + hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2528

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2529
  	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2530

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2531
2532
2533
2534
  	if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED)) {
  		WR_HARPOON(port + hp_scsictrl_0,
  			   (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2535

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2536
  /*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (unsigned char)0x1F);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2537
        auto_loaded |= AUTO_IMMED; */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2538
  		auto_loaded = AUTO_IMMED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2539

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2540
  		DISABLE_AUTO(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2541

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2542
2543
  		WR_HARPOON(port + hp_autostart_3, auto_loaded);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2544

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2545
  	SGRAM_ACCESS(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2546
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2547
2548
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2549
   * Function: FPT_sres
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2550
2551
2552
2553
   *
   * Description: Hookup the correct CCB and handle the incoming messages.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2554
2555
  static void FPT_sres(unsigned long port, unsigned char p_card,
  		     struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2556
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2557
  	unsigned char our_target, message, lun = 0, tag, msgRetryCount;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2558

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2559
2560
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2561

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2562
2563
2564
  	if (pCurrCard->currentSCCB != NULL) {
  		currTar_Info =
  		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2565
  		DISABLE_AUTO(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2566
  		WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2567
2568
  
  		currSCCB = pCurrCard->currentSCCB;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2569
  		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2570
2571
2572
  			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  			currSCCB->Sccb_scsistat = BUS_FREE_ST;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2573
  		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2574
2575
2576
  			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  			currSCCB->Sccb_scsistat = BUS_FREE_ST;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2577
2578
2579
2580
2581
  		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
  		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
  		      TAG_Q_TRYING))) {
  			currTar_Info->TarLUNBusy[currSCCB->Lun] = 0;
  			if (currSCCB->Sccb_scsistat != ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2582
  				pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2583
2584
2585
2586
  				pCurrCard->discQ_Tbl[currTar_Info->
  						     LunDiscQ_Idx[currSCCB->
  								  Lun]]
  				    = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2587
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2588
2589
2590
2591
  		} else {
  			currTar_Info->TarLUNBusy[0] = 0;
  			if (currSCCB->Sccb_tag) {
  				if (currSCCB->Sccb_scsistat != ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2592
  					pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2593
2594
  					pCurrCard->discQ_Tbl[currSCCB->
  							     Sccb_tag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2595
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2596
2597
  			} else {
  				if (currSCCB->Sccb_scsistat != ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2598
  					pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2599
2600
2601
  					pCurrCard->discQ_Tbl[currTar_Info->
  							     LunDiscQ_Idx[0]] =
  					    NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2602
2603
2604
  				}
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2605
  		FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2606
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2607
  	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2608

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2609
  	our_target = (unsigned char)(RD_HARPOON(port + hp_select_id) >> 4);
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2610
  	currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2611

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2612
  	msgRetryCount = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2613
  	do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2614

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2615
  		currTar_Info = &FPT_sccbMgrTbl[p_card][our_target];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2616
  		tag = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2617
2618
  		while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
  			if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2619

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2620
  				WRW_HARPOON((port + hp_intstat), PHASE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2621
2622
2623
  				return;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2624
2625
  		WRW_HARPOON((port + hp_intstat), PHASE);
  		if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2626

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2627
2628
  			message = FPT_sfm(port, pCurrCard->currentSCCB);
  			if (message) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2629

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2630
  				if (message <= (0x80 | LUN_MASK)) {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2631
  					lun = message & (unsigned char)LUN_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2632

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
  					if ((currTar_Info->
  					     TarStatus & TAR_TAG_Q_MASK) ==
  					    TAG_Q_TRYING) {
  						if (currTar_Info->TarTagQ_Cnt !=
  						    0) {
  
  							if (!
  							    (currTar_Info->
  							     TarLUN_CA)) {
  								ACCEPT_MSG(port);	/*Release the ACK for ID msg. */
  
  								message =
  								    FPT_sfm
  								    (port,
  								     pCurrCard->
  								     currentSCCB);
  								if (message) {
  									ACCEPT_MSG
  									    (port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2652
2653
2654
  								}
  
  								else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
  									message
  									    = 0;
  
  								if (message !=
  								    0) {
  									tag =
  									    FPT_sfm
  									    (port,
  									     pCurrCard->
  									     currentSCCB);
  
  									if (!
  									    (tag))
  										message
  										    =
  										    0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2671
  								}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2672
2673
2674
2675
2676
2677
2678
2679
2680
  							}
  							/*C.A. exists! */
  						}
  						/*End Q cnt != 0 */
  					}
  					/*End Tag cmds supported! */
  				}
  				/*End valid ID message.  */
  				else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2681
2682
2683
  
  					ACCEPT_MSG_ATN(port);
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2684
2685
2686
  			}
  			/* End good id message. */
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2687

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2688
  				message = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2689
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2690
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2691
  			ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2692
2693
2694
2695
2696
  			while (!
  			       (RDW_HARPOON((port + hp_intstat)) &
  				(PHASE | RESET))
  			       && !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
  			       && (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2697
2698
2699
  
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2700

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2701
  		if (message == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2702
  			msgRetryCount++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2703
  			if (msgRetryCount == 1) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2704
  				FPT_SendMsg(port, SMPARITY);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2705
  			} else {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2706
  				FPT_SendMsg(port, SMDEV_RESET);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2707

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2708
2709
  				FPT_sssyncv(port, our_target, NARROW_SCSI,
  					    currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2710

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2711
2712
2713
2714
2715
  				if (FPT_sccbMgrTbl[p_card][our_target].
  				    TarEEValue & EE_SYNC_MASK) {
  
  					FPT_sccbMgrTbl[p_card][our_target].
  					    TarStatus &= ~TAR_SYNC_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2716
2717
  
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2718
2719
  				if (FPT_sccbMgrTbl[p_card][our_target].
  				    TarEEValue & EE_WIDE_SCSI) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2720

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2721
2722
  					FPT_sccbMgrTbl[p_card][our_target].
  					    TarStatus &= ~TAR_WIDE_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2723
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2724
2725
2726
  				FPT_queueFlushTargSccb(p_card, our_target,
  						       SCCB_COMPLETE);
  				FPT_SccbMgrTableInitTarget(p_card, our_target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2727
2728
2729
  				return;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2730
  	} while (message == 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2731

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2732
2733
  	if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
  	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2734
  		currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2735
2736
2737
  		pCurrCard->currentSCCB =
  		    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
  		if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2738
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2739
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2740
2741
  			ACCEPT_MSG_ATN(port);
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2742
  	} else {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2743
  		currTar_Info->TarLUNBusy[0] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2744

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2745
2746
2747
2748
2749
  		if (tag) {
  			if (pCurrCard->discQ_Tbl[tag] != NULL) {
  				pCurrCard->currentSCCB =
  				    pCurrCard->discQ_Tbl[tag];
  				currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2750
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2751
2752
  			} else {
  				ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2753
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2754
2755
2756
2757
  		} else {
  			pCurrCard->currentSCCB =
  			    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
  			if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2758
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2759
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2760
2761
2762
2763
  				ACCEPT_MSG_ATN(port);
  			}
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2764
2765
2766
2767
2768
  	if (pCurrCard->currentSCCB != NULL) {
  		if (pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST) {
  			/* During Abort Tag command, the target could have got re-selected
  			   and completed the command. Check the select Q and remove the CCB
  			   if it is in the Select Q */
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2769
  			FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2770
2771
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2772
2773
2774
  	while (!(RDW_HARPOON((port + hp_intstat)) & (PHASE | RESET)) &&
  	       !(RD_HARPOON(port + hp_scsisig) & SCSI_REQ) &&
  	       (RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2775
  }
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
2776
  static void FPT_SendMsg(unsigned long port, unsigned char message)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2777
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2778
2779
  	while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
  		if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2780

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2781
  			WRW_HARPOON((port + hp_intstat), PHASE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2782
2783
2784
  			return;
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2785
2786
2787
2788
  	WRW_HARPOON((port + hp_intstat), PHASE);
  	if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH) {
  		WRW_HARPOON((port + hp_intstat),
  			    (BUS_FREE | PHASE | XFER_CNT_0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2789

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2790
  		WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2791

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2792
  		WR_HARPOON(port + hp_scsidata_0, message);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2793

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2794
  		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2795
2796
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2797
  		WR_HARPOON(port + hp_portctrl_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2798
2799
  
  		if ((message == SMABORT) || (message == SMDEV_RESET) ||
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2800
2801
2802
2803
2804
  		    (message == SMABORT_TAG)) {
  			while (!
  			       (RDW_HARPOON((port + hp_intstat)) &
  				(BUS_FREE | PHASE))) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2805

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2806
2807
  			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
  				WRW_HARPOON((port + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808
2809
2810
2811
2812
2813
2814
  			}
  		}
  	}
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2815
   * Function: FPT_sdecm
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2816
   *
25985edce   Lucas De Marchi   Fix common misspe...
2817
   * Description: Determine the proper response to the message from the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2818
2819
2820
   *              target device.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2821
2822
  static void FPT_sdecm(unsigned char message, unsigned long port,
  		      unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2823
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2824
2825
2826
  	struct sccb *currSCCB;
  	struct sccb_card *CurrCard;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2827

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2828
  	CurrCard = &FPT_BL_Card[p_card];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2829
  	currSCCB = CurrCard->currentSCCB;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2830
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2831

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2832
2833
  	if (message == SMREST_DATA_PTR) {
  		if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2834
  			currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2835
  			FPT_hostDataXferRestart(currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2836
2837
2838
  		}
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2839
2840
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2841
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2842
  	else if (message == SMCMD_COMP) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2844
2845
2846
  		if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
  			currTar_Info->TarStatus &=
  			    ~(unsigned char)TAR_TAG_Q_MASK;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2847
  			currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2848
2849
2850
2851
2852
  		}
  
  		ACCEPT_MSG(port);
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2853
2854
  	else if ((message == SMNO_OP) || (message >= SMIDENT)
  		 || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2855
2856
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2857
2858
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2859
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2860
  	else if (message == SMREJECT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2861
2862
  
  		if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2863
2864
2865
2866
  		    (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
  		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)
  		    || ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) ==
  			TAG_Q_TRYING))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2867
  		{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2868
  			WRW_HARPOON((port + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2869
2870
  
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2871
2872
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2873
  			{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2874
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2875

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2876
2877
  			if (currSCCB->Lun == 0x00) {
  				if ((currSCCB->Sccb_scsistat == SELECT_SN_ST)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2878

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2879
2880
  					currTar_Info->TarStatus |=
  					    (unsigned char)SYNC_SUPPORTED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2881

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2882
2883
2884
  					currTar_Info->TarEEValue &=
  					    ~EE_SYNC_MASK;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2885

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2886
2887
  				else if ((currSCCB->Sccb_scsistat ==
  					  SELECT_WN_ST)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2888

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2889
2890
2891
2892
  					currTar_Info->TarStatus =
  					    (currTar_Info->
  					     TarStatus & ~WIDE_ENABLED) |
  					    WIDE_NEGOCIATED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2893

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2894
2895
  					currTar_Info->TarEEValue &=
  					    ~EE_WIDE_SCSI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2896
2897
  
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2898

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2899
2900
2901
2902
2903
2904
2905
  				else if ((currTar_Info->
  					  TarStatus & TAR_TAG_Q_MASK) ==
  					 TAG_Q_TRYING) {
  					currTar_Info->TarStatus =
  					    (currTar_Info->
  					     TarStatus & ~(unsigned char)
  					     TAR_TAG_Q_MASK) | TAG_Q_REJECT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2906
2907
2908
  
  					currSCCB->ControlByte &= ~F_USE_CMD_Q;
  					CurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2909
2910
  					CurrCard->discQ_Tbl[currSCCB->
  							    Sccb_tag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2911
2912
2913
2914
  					currSCCB->Sccb_tag = 0x00;
  
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2915
  			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2916

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2917
2918
2919
  				if (currSCCB->Lun == 0x00) {
  					WRW_HARPOON((port + hp_intstat),
  						    BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2920
2921
2922
  					CurrCard->globalFlags |= F_NEW_SCCB_CMD;
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2923
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2924

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2925
2926
2927
2928
2929
2930
  				if ((CurrCard->globalFlags & F_CONLUN_IO) &&
  				    ((currTar_Info->
  				      TarStatus & TAR_TAG_Q_MASK) !=
  				     TAG_Q_TRYING))
  					currTar_Info->TarLUNBusy[currSCCB->
  								 Lun] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2931
  				else
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2932
  					currTar_Info->TarLUNBusy[0] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2933

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2934
2935
  				currSCCB->ControlByte &=
  				    ~(unsigned char)F_USE_CMD_Q;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2936

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2937
2938
  				WR_HARPOON(port + hp_autostart_1,
  					   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2939
2940
2941
  
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2942
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2943
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2944
2945
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2946
  			{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2947
2948
2949
2950
2951
  			}
  
  			if (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)) {
  				WR_HARPOON(port + hp_autostart_1,
  					   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2952
2953
2954
  			}
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2955
  	else if (message == SMEXT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2956
2957
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2958
  		FPT_shandem(port, p_card, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2959
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2960
  	else if (message == SMIGNORWR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2961

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2962
  		ACCEPT_MSG(port);	/* ACK the RESIDUE MSG */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2963

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2964
  		message = FPT_sfm(port, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2965

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2966
  		if (currSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2967
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2968
2969
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2970
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2971
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2972
2973
2974
2975
2976
  
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->Sccb_scsimsg = SMREJECT;
  
  		ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2977
2978
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2979
2980
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2981
2982
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2983
   * Function: FPT_shandem
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2984
2985
2986
2987
   *
   * Description: Decide what to do with the extended message.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2988
2989
  static void FPT_shandem(unsigned long port, unsigned char p_card,
  			struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2990
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2991
  	unsigned char length, message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2992

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2993
2994
  	length = FPT_sfm(port, pCurrSCCB);
  	if (length) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2995
2996
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2997
2998
  		message = FPT_sfm(port, pCurrSCCB);
  		if (message) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2999

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3000
  			if (message == SMSYNC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3001

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3002
  				if (length == 0x03) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3003
3004
  
  					ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3005
3006
  					FPT_stsyncn(port, p_card);
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3007
3008
3009
3010
  
  					pCurrSCCB->Sccb_scsimsg = SMREJECT;
  					ACCEPT_MSG_ATN(port);
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3011
  			} else if (message == SMWDTR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3013
  				if (length == 0x02) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3014
3015
  
  					ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3016
3017
  					FPT_stwidn(port, p_card);
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3018
3019
3020
  
  					pCurrSCCB->Sccb_scsimsg = SMREJECT;
  					ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3021
3022
3023
  					WR_HARPOON(port + hp_autostart_1,
  						   (AUTO_IMMED +
  						    DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3024
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3025
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3026
3027
3028
  
  				pCurrSCCB->Sccb_scsimsg = SMREJECT;
  				ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3029
3030
  				WR_HARPOON(port + hp_autostart_1,
  					   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3031
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3032
3033
  		} else {
  			if (pCurrSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3034
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3035
3036
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3037
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3038
3039
3040
3041
  	} else {
  		if (pCurrSCCB->Sccb_scsimsg == SMPARITY)
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3042
3043
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3044
3045
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3046
   * Function: FPT_sisyncn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3047
3048
3049
3050
3051
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3052
3053
  static unsigned char FPT_sisyncn(unsigned long port, unsigned char p_card,
  				 unsigned char syncFlag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3054
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3055
3056
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3057

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3058
3059
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3060

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3061
  	if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3062

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3063
3064
3065
3066
  		WRW_HARPOON((port + ID_MSG_STRT),
  			    (MPM_OP + AMSG_OUT +
  			     (currSCCB->
  			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3067

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3068
  		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3069

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3070
3071
3072
3073
3074
  		WRW_HARPOON((port + SYNC_MSGS + 0),
  			    (MPM_OP + AMSG_OUT + SMEXT));
  		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
  		WRW_HARPOON((port + SYNC_MSGS + 4),
  			    (MPM_OP + AMSG_OUT + SMSYNC));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3075

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3076
  		if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3077

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3078
3079
  			WRW_HARPOON((port + SYNC_MSGS + 6),
  				    (MPM_OP + AMSG_OUT + 12));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3080

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3081
3082
  		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
  			 EE_SYNC_10MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3083

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3084
3085
  			WRW_HARPOON((port + SYNC_MSGS + 6),
  				    (MPM_OP + AMSG_OUT + 25));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3086

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3087
3088
  		else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) ==
  			 EE_SYNC_5MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3089

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3090
3091
  			WRW_HARPOON((port + SYNC_MSGS + 6),
  				    (MPM_OP + AMSG_OUT + 50));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3092

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3093
  		else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
  			WRW_HARPOON((port + SYNC_MSGS + 6),
  				    (MPM_OP + AMSG_OUT + 00));
  
  		WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
  		WRW_HARPOON((port + SYNC_MSGS + 10),
  			    (MPM_OP + AMSG_OUT + DEFAULT_OFFSET));
  		WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
  
  		if (syncFlag == 0) {
  			WR_HARPOON(port + hp_autostart_3,
  				   (SELECT + SELCHK_STRT));
  			currTar_Info->TarStatus =
  			    ((currTar_Info->
  			      TarStatus & ~(unsigned char)TAR_SYNC_MASK) |
  			     (unsigned char)SYNC_TRYING);
  		} else {
  			WR_HARPOON(port + hp_autostart_3,
  				   (AUTO_IMMED + CMD_ONLY_STRT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3112
  		}
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3113
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3114
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3115

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3116
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3117

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3118
3119
  		currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED;
  		currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3120
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3121
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3122
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3123
3124
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3125
   * Function: FPT_stsyncn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3126
3127
3128
3129
3130
   *
   * Description: The has sent us a Sync Nego message so handle it as
   *              necessary.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3131
  static void FPT_stsyncn(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3132
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3133
3134
3135
  	unsigned char sync_msg, offset, sync_reg, our_sync_msg;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3136

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3137
3138
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3139

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3140
  	sync_msg = FPT_sfm(port, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3141

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3142
3143
3144
  	if ((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3145
3146
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3147
  	ACCEPT_MSG(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3148

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3149
  	offset = FPT_sfm(port, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3151
3152
3153
  	if ((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3154
3155
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3156
  	if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3157

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3158
  		our_sync_msg = 12;	/* Setup our Message to 20mb/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3159

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3160
  	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3161

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3162
  		our_sync_msg = 25;	/* Setup our Message to 10mb/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3163

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3164
  	else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3165

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3166
3167
  		our_sync_msg = 50;	/* Setup our Message to 5mb/s */
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3168

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3169
  		our_sync_msg = 0;	/* Message = Async */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3170

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3171
3172
3173
  	if (sync_msg < our_sync_msg) {
  		sync_msg = our_sync_msg;	/*if faster, then set to max. */
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3174

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3175
3176
  	if (offset == ASYNC)
  		sync_msg = ASYNC;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3177

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3178
3179
  	if (offset > MAX_OFFSET)
  		offset = MAX_OFFSET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3180

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3181
  	sync_reg = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3182

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3183
  	if (sync_msg > 12)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3184

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3185
  		sync_reg = 0x20;	/* Use 10MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3186

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3187
  	if (sync_msg > 25)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3188

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3189
  		sync_reg = 0x40;	/* Use 6.6MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3190

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3191
  	if (sync_msg > 38)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3192

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3193
  		sync_reg = 0x60;	/* Use 5MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3194

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3195
  	if (sync_msg > 50)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3196

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3197
  		sync_reg = 0x80;	/* Use 4MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3198

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3199
  	if (sync_msg > 62)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3200

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3201
  		sync_reg = 0xA0;	/* Use 3.33MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3202

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3203
  	if (sync_msg > 75)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3204

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3205
  		sync_reg = 0xC0;	/* Use 2.85MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3206

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3207
  	if (sync_msg > 87)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3208

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3209
  		sync_reg = 0xE0;	/* Use 2.5MB/s */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3210

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3211
  	if (sync_msg > 100) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3212

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3213
3214
3215
  		sync_reg = 0x00;	/* Use ASYNC */
  		offset = 0x00;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3216

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3217
  	if (currTar_Info->TarStatus & WIDE_ENABLED)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3218

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3219
  		sync_reg |= offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3220

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3221
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3222

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3223
  		sync_reg |= (offset | NARROW_SCSI);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3224

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3225
  	FPT_sssyncv(port, currSCCB->TargID, sync_reg, currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3226

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3227
  	if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3228

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3229
  		ACCEPT_MSG(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3230

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3231
3232
3233
  		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  					    ~(unsigned char)TAR_SYNC_MASK) |
  					   (unsigned char)SYNC_SUPPORTED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3234

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3235
3236
3237
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3238

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3239
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3240

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3241
  		ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3242

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3243
  		FPT_sisyncr(port, sync_msg, offset);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3245
3246
3247
3248
  		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  					    ~(unsigned char)TAR_SYNC_MASK) |
  					   (unsigned char)SYNC_SUPPORTED);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3249
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3250
3251
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3252
   * Function: FPT_sisyncr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3253
3254
3255
3256
   *
   * Description: Answer the targets sync message.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3257
3258
  static void FPT_sisyncr(unsigned long port, unsigned char sync_pulse,
  			unsigned char offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3259
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
  	ARAM_ACCESS(port);
  	WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
  	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x03));
  	WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMSYNC));
  	WRW_HARPOON((port + SYNC_MSGS + 6), (MPM_OP + AMSG_OUT + sync_pulse));
  	WRW_HARPOON((port + SYNC_MSGS + 8), (RAT_OP));
  	WRW_HARPOON((port + SYNC_MSGS + 10), (MPM_OP + AMSG_OUT + offset));
  	WRW_HARPOON((port + SYNC_MSGS + 12), (BRH_OP + ALWAYS + NP));
  	SGRAM_ACCESS(port);
  
  	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
  	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
  
  	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
  
  	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3277
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3278
3279
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3280
   * Function: FPT_siwidn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3281
3282
3283
3284
3285
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3286
  static unsigned char FPT_siwidn(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3287
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3288
3289
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3290

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3291
3292
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3293

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3294
  	if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3295

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3296
3297
3298
3299
  		WRW_HARPOON((port + ID_MSG_STRT),
  			    (MPM_OP + AMSG_OUT +
  			     (currSCCB->
  			      Sccb_idmsg & ~(unsigned char)DISC_PRIV)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3300

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3301
  		WRW_HARPOON((port + ID_MSG_STRT + 2), BRH_OP + ALWAYS + CMDPZ);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3302

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3303
3304
3305
3306
3307
3308
3309
3310
3311
  		WRW_HARPOON((port + SYNC_MSGS + 0),
  			    (MPM_OP + AMSG_OUT + SMEXT));
  		WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
  		WRW_HARPOON((port + SYNC_MSGS + 4),
  			    (MPM_OP + AMSG_OUT + SMWDTR));
  		WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
  		WRW_HARPOON((port + SYNC_MSGS + 8),
  			    (MPM_OP + AMSG_OUT + SM16BIT));
  		WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3312

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3313
  		WR_HARPOON(port + hp_autostart_3, (SELECT + SELCHK_STRT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3314

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3315
3316
3317
  		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  					    ~(unsigned char)TAR_WIDE_MASK) |
  					   (unsigned char)WIDE_ENABLED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3318

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3319
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3320
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3321

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3322
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3323

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3324
3325
3326
  		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  					    ~(unsigned char)TAR_WIDE_MASK) |
  					   WIDE_NEGOCIATED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3327

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3328
  		currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3329
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3330
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3331
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3332
3333
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3334
   * Function: FPT_stwidn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3335
3336
3337
3338
3339
   *
   * Description: The has sent us a Wide Nego message so handle it as
   *              necessary.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3340
  static void FPT_stwidn(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3341
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3342
3343
3344
  	unsigned char width;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3345

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3346
3347
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3348

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3349
  	width = FPT_sfm(port, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3350

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3351
3352
3353
  	if ((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY)) {
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3354
3355
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3356
3357
  	if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
  		width = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3358

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3359
3360
3361
3362
3363
3364
3365
  	if (width) {
  		currTar_Info->TarStatus |= WIDE_ENABLED;
  		width = 0;
  	} else {
  		width = NARROW_SCSI;
  		currTar_Info->TarStatus &= ~WIDE_ENABLED;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3366

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3367
  	FPT_sssyncv(port, currSCCB->TargID, width, currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3368

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3369
  	if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3370

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3371
  		currTar_Info->TarStatus |= WIDE_NEGOCIATED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3372

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
  		if (!
  		    ((currTar_Info->TarStatus & TAR_SYNC_MASK) ==
  		     SYNC_SUPPORTED)) {
  			ACCEPT_MSG_ATN(port);
  			ARAM_ACCESS(port);
  			FPT_sisyncn(port, p_card, 1);
  			currSCCB->Sccb_scsistat = SELECT_SN_ST;
  			SGRAM_ACCESS(port);
  		} else {
  			ACCEPT_MSG(port);
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3385
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3386
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3387

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3388
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3389

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3390
  		ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3391

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3392
3393
3394
3395
  		if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  			width = SM16BIT;
  		else
  			width = SM8BIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3396

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3397
  		FPT_siwidr(port, width);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3398

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3399
3400
  		currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3401
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3402
3403
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3404
   * Function: FPT_siwidr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3405
3406
3407
3408
   *
   * Description: Answer the targets Wide nego message.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3409
  static void FPT_siwidr(unsigned long port, unsigned char width)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3410
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3411
3412
3413
3414
3415
3416
3417
3418
  	ARAM_ACCESS(port);
  	WRW_HARPOON((port + SYNC_MSGS + 0), (MPM_OP + AMSG_OUT + SMEXT));
  	WRW_HARPOON((port + SYNC_MSGS + 2), (MPM_OP + AMSG_OUT + 0x02));
  	WRW_HARPOON((port + SYNC_MSGS + 4), (MPM_OP + AMSG_OUT + SMWDTR));
  	WRW_HARPOON((port + SYNC_MSGS + 6), (RAT_OP));
  	WRW_HARPOON((port + SYNC_MSGS + 8), (MPM_OP + AMSG_OUT + width));
  	WRW_HARPOON((port + SYNC_MSGS + 10), (BRH_OP + ALWAYS + NP));
  	SGRAM_ACCESS(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3419

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3420
3421
  	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
  	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3422

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3423
  	WR_HARPOON(port + hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3424

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3425
3426
  	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3427
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3428
3429
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3430
   * Function: FPT_sssyncv
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3431
3432
3433
3434
3435
   *
   * Description: Write the desired value to the Sync Register for the
   *              ID specified.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3436
3437
3438
  static void FPT_sssyncv(unsigned long p_port, unsigned char p_id,
  			unsigned char p_sync_value,
  			struct sccb_mgr_tar_info *currTar_Info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3439
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
  	unsigned char index;
  
  	index = p_id;
  
  	switch (index) {
  
  	case 0:
  		index = 12;	/* hp_synctarg_0 */
  		break;
  	case 1:
  		index = 13;	/* hp_synctarg_1 */
  		break;
  	case 2:
  		index = 14;	/* hp_synctarg_2 */
  		break;
  	case 3:
  		index = 15;	/* hp_synctarg_3 */
  		break;
  	case 4:
  		index = 8;	/* hp_synctarg_4 */
  		break;
  	case 5:
  		index = 9;	/* hp_synctarg_5 */
  		break;
  	case 6:
  		index = 10;	/* hp_synctarg_6 */
  		break;
  	case 7:
  		index = 11;	/* hp_synctarg_7 */
  		break;
  	case 8:
  		index = 4;	/* hp_synctarg_8 */
  		break;
  	case 9:
  		index = 5;	/* hp_synctarg_9 */
  		break;
  	case 10:
  		index = 6;	/* hp_synctarg_10 */
  		break;
  	case 11:
  		index = 7;	/* hp_synctarg_11 */
  		break;
  	case 12:
  		index = 0;	/* hp_synctarg_12 */
  		break;
  	case 13:
  		index = 1;	/* hp_synctarg_13 */
  		break;
  	case 14:
  		index = 2;	/* hp_synctarg_14 */
  		break;
  	case 15:
  		index = 3;	/* hp_synctarg_15 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3493

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3494
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3495

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3496
  	WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3497
3498
3499
  
  	currTar_Info->TarSyncCtrl = p_sync_value;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3500
3501
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3502
   * Function: FPT_sresb
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3503
3504
3505
3506
   *
   * Description: Reset the desired card's SCSI bus.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3507
  static void FPT_sresb(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3508
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3509
  	unsigned char scsiID, i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3510

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3511
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3512

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3513
3514
3515
  	WR_HARPOON(port + hp_page_ctrl,
  		   (RD_HARPOON(port + hp_page_ctrl) | G_INT_DISABLE));
  	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3516

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3517
  	WR_HARPOON(port + hp_scsictrl_0, SCSI_RST);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3518

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3519
3520
3521
  	scsiID = RD_HARPOON(port + hp_seltimeout);
  	WR_HARPOON(port + hp_seltimeout, TO_5ms);
  	WRW_HARPOON((port + hp_intstat), TIMEOUT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3522

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3523
  	WR_HARPOON(port + hp_portctrl_0, (SCSI_PORT | START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3524

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3525
3526
  	while (!(RDW_HARPOON((port + hp_intstat)) & TIMEOUT)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3527

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3528
  	WR_HARPOON(port + hp_seltimeout, scsiID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3529

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3530
  	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3531

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3532
  	FPT_Wait(port, TO_5ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3533

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3534
  	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3535

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3536
  	WR_HARPOON(port + hp_int_mask, (RD_HARPOON(port + hp_int_mask) | 0x00));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3537

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3538
3539
  	for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++) {
  		currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3540

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3541
3542
3543
3544
  		if (currTar_Info->TarEEValue & EE_SYNC_MASK) {
  			currTar_Info->TarSyncCtrl = 0;
  			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3545

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3546
3547
3548
  		if (currTar_Info->TarEEValue & EE_WIDE_SCSI) {
  			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3549

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3550
  		FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3551

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3552
3553
  		FPT_SccbMgrTableInitTarget(p_card, scsiID);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3554

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3555
3556
3557
3558
3559
  	FPT_BL_Card[p_card].scanIndex = 0x00;
  	FPT_BL_Card[p_card].currentSCCB = NULL;
  	FPT_BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
  					     | F_NEW_SCCB_CMD);
  	FPT_BL_Card[p_card].cmdCounter = 0x00;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3560
  	FPT_BL_Card[p_card].discQCount = 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3561
  	FPT_BL_Card[p_card].tagQ_Lst = 0x01;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3562

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3563
  	for (i = 0; i < QUEUE_DEPTH; i++)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3564
  		FPT_BL_Card[p_card].discQ_Tbl[i] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3565

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3566
3567
  	WR_HARPOON(port + hp_page_ctrl,
  		   (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3568
3569
3570
3571
3572
  
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3573
   * Function: FPT_ssenss
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3574
3575
3576
3577
   *
   * Description: Setup for the Auto Sense command.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3578
  static void FPT_ssenss(struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3579
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3580
3581
  	unsigned char i;
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3582

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3583
  	currSCCB = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3584

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3585
  	currSCCB->Save_CdbLen = currSCCB->CdbLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3586

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3587
  	for (i = 0; i < 6; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3588

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3589
3590
  		currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3591

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3592
3593
3594
3595
3596
3597
3598
  	currSCCB->CdbLength = SIX_BYTE_CMD;
  	currSCCB->Cdb[0] = SCSI_REQUEST_SENSE;
  	currSCCB->Cdb[1] = currSCCB->Cdb[1] & (unsigned char)0xE0;	/*Keep LUN. */
  	currSCCB->Cdb[2] = 0x00;
  	currSCCB->Cdb[3] = 0x00;
  	currSCCB->Cdb[4] = currSCCB->RequestSenseLength;
  	currSCCB->Cdb[5] = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3599

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3600
  	currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3601

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3602
  	currSCCB->Sccb_ATC = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3603

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3604
  	currSCCB->Sccb_XferState |= F_AUTO_SENSE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3605

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3606
  	currSCCB->Sccb_XferState &= ~F_SG_XFER;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3607

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3608
  	currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(unsigned char)DISC_PRIV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3609

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3610
  	currSCCB->ControlByte = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3611

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3612
  	currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3613
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3614
3615
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3616
   * Function: FPT_sxfrp
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3617
3618
3619
3620
3621
   *
   * Description: Transfer data into the bit bucket until the device
   *              decides to switch phase.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3622
  static void FPT_sxfrp(unsigned long p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3623
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3624
  	unsigned char curr_phz;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3625

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3626
  	DISABLE_AUTO(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3627

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3628
  	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3629

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3630
3631
  		FPT_hostDataXferAbort(p_port, p_card,
  				      FPT_BL_Card[p_card].currentSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3632

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3633
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3634

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
  	/* If the Automation handled the end of the transfer then do not
  	   match the phase or we will get out of sync with the ISR.       */
  
  	if (RDW_HARPOON((p_port + hp_intstat)) &
  	    (BUS_FREE | XFER_CNT_0 | AUTO_INT))
  		return;
  
  	WR_HARPOON(p_port + hp_xfercnt_0, 0x00);
  
  	curr_phz = RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3645

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3646
  	WRW_HARPOON((p_port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3647

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3648
  	WR_HARPOON(p_port + hp_scsisig, curr_phz);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3649

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3650
3651
3652
3653
3654
3655
3656
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET)) &&
  	       (curr_phz ==
  		(RD_HARPOON(p_port + hp_scsisig) & (unsigned char)S_SCSI_PHZ)))
  	{
  		if (curr_phz & (unsigned char)SCSI_IOBIT) {
  			WR_HARPOON(p_port + hp_portctrl_0,
  				   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3657

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
  			if (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
  				RD_HARPOON(p_port + hp_fifodata_0);
  			}
  		} else {
  			WR_HARPOON(p_port + hp_portctrl_0,
  				   (SCSI_PORT | HOST_PORT | HOST_WRT));
  			if (RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY) {
  				WR_HARPOON(p_port + hp_fifodata_0, 0xFA);
  			}
  		}
  	}			/* End of While loop for padding data I/O phase */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3669

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3670
3671
3672
3673
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ)
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3674

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3675
3676
3677
3678
3679
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (SCSI_PORT | HOST_PORT | SCSI_INBIT));
  	while (!(RD_HARPOON(p_port + hp_xferstat) & FIFO_EMPTY)) {
  		RD_HARPOON(p_port + hp_fifodata_0);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3680

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3681
3682
3683
3684
3685
  	if (!(RDW_HARPOON((p_port + hp_intstat)) & (BUS_FREE | RESET))) {
  		WR_HARPOON(p_port + hp_autostart_0,
  			   (AUTO_IMMED + DISCONNECT_START));
  		while (!(RDW_HARPOON((p_port + hp_intstat)) & AUTO_INT)) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3686

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3687
3688
3689
3690
3691
3692
  		if (RDW_HARPOON((p_port + hp_intstat)) &
  		    (ICMD_COMP | ITAR_DISC))
  			while (!
  			       (RDW_HARPOON((p_port + hp_intstat)) &
  				(BUS_FREE | RSEL))) ;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3693
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3694
3695
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3696
   * Function: FPT_schkdd
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3697
3698
3699
3700
3701
   *
   * Description: Make sure data has been flushed from both FIFOs and abort
   *              the operations if necessary.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3702
  static void FPT_schkdd(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3703
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3704
  	unsigned short TimeOutLoop;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
3705
  	unsigned char sPhase;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3706

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3707
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3708

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3709
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3710

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3711
3712
3713
3714
  	if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
  	    (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
  		return;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3715

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3716
  	if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3717

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3718
  		currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3719

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3720
  		currSCCB->Sccb_XferCnt = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3721

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3722
3723
3724
3725
  		currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
  		WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
  		WR_HARPOON(port + hp_xferstat, 0x00);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3726

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3727
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3728

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3729
  		currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3730

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3731
3732
  		currSCCB->Sccb_XferCnt = 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3733

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3734
3735
  	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
  	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3736

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3737
3738
3739
  		currSCCB->HostStatus = SCCB_PARITY_ERR;
  		WRW_HARPOON((port + hp_intstat), PARITY);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3740

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3741
  	FPT_hostDataXferAbort(port, p_card, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3742

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3743
3744
  	while (RD_HARPOON(port + hp_scsisig) & SCSI_ACK) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3745

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3746
  	TimeOutLoop = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3747

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
  	while (RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY) {
  		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
  			return;
  		}
  		if (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) {
  			break;
  		}
  		if (RDW_HARPOON((port + hp_intstat)) & RESET) {
  			return;
  		}
  		if ((RD_HARPOON(port + hp_scsisig) & SCSI_REQ)
  		    || (TimeOutLoop++ > 0x3000))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3762

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3763
3764
3765
3766
3767
  	sPhase = RD_HARPOON(port + hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
  	if ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) ||
  	    (RD_HARPOON(port + hp_offsetctr) & (unsigned char)0x1F) ||
  	    (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
  	    (sPhase == (SCSI_BSY | S_DATAI_PH))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3768

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3769
  		WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3770

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3771
3772
3773
3774
  		if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED)) {
  			if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
  				FPT_phaseDataIn(port, p_card);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3775

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
  			else {
  				FPT_phaseDataOut(port, p_card);
  			}
  		} else {
  			FPT_sxfrp(port, p_card);
  			if (!(RDW_HARPOON((port + hp_intstat)) &
  			      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET))) {
  				WRW_HARPOON((port + hp_intstat), AUTO_INT);
  				FPT_phaseDecode(port, p_card);
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3787

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3788
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3789

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3790
3791
3792
  	else {
  		WR_HARPOON(port + hp_portctrl_0, 0x00);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3793
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3794
3795
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3796
   * Function: FPT_sinits
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3797
3798
3799
3800
   *
   * Description: Setup SCCB manager fields in this SCCB.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3801
  static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3802
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3803
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3804

5d7ebb9c7   Dan Carpenter   [SCSI] FlashPoint...
3805
  	if ((p_sccb->TargID >= MAX_SCSI_TAR) || (p_sccb->Lun >= MAX_LUN)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3806
3807
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3808
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3809

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3810
3811
  	p_sccb->Sccb_XferState = 0x00;
  	p_sccb->Sccb_XferCnt = p_sccb->DataLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3812

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3813
3814
  	if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
  	    (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3816
3817
3818
3819
  		p_sccb->Sccb_SGoffset = 0;
  		p_sccb->Sccb_XferState = F_SG_XFER;
  		p_sccb->Sccb_XferCnt = 0x00;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3820

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3821
  	if (p_sccb->DataLength == 0x00)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3822

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3823
  		p_sccb->Sccb_XferState |= F_ALL_XFERRED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3824

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3825
3826
3827
  	if (p_sccb->ControlByte & F_USE_CMD_Q) {
  		if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
  			p_sccb->ControlByte &= ~F_USE_CMD_Q;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3828

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3829
3830
3831
  		else
  			currTar_Info->TarStatus |= TAG_Q_TRYING;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3832
3833
3834
3835
3836
3837
  
  /*      For !single SCSI device in system  & device allow Disconnect
  	or command is tag_q type then send Cmd with Disconnect Enable
  	else send Cmd with Disconnect Disable */
  
  /*
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3838
     if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3839
3840
3841
        (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
        (currTar_Info->TarStatus & TAG_Q_TRYING)) {
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3842
3843
3844
3845
3846
  	if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
  	    (currTar_Info->TarStatus & TAG_Q_TRYING)) {
  		p_sccb->Sccb_idmsg =
  		    (unsigned char)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3847

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3848
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3849

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3850
3851
  		p_sccb->Sccb_idmsg = (unsigned char)SMIDENT | p_sccb->Lun;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3852

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3853
3854
3855
3856
3857
3858
3859
  	p_sccb->HostStatus = 0x00;
  	p_sccb->TargetStatus = 0x00;
  	p_sccb->Sccb_tag = 0x00;
  	p_sccb->Sccb_MGRFlags = 0x00;
  	p_sccb->Sccb_sgseg = 0x00;
  	p_sccb->Sccb_ATC = 0x00;
  	p_sccb->Sccb_savedATC = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3860
3861
3862
3863
3864
  /*
     p_sccb->SccbVirtDataPtr    = 0x00;
     p_sccb->Sccb_forwardlink   = NULL;
     p_sccb->Sccb_backlink      = NULL;
   */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3865
3866
3867
  	p_sccb->Sccb_scsistat = BUS_FREE_ST;
  	p_sccb->SccbStatus = SCCB_IN_PROCESS;
  	p_sccb->Sccb_scsimsg = SMNO_OP;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3868
3869
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3870
3871
3872
3873
3874
3875
3876
  /*---------------------------------------------------------------------
   *
   * Function: Phase Decode
   *
   * Description: Determine the phase and call the appropriate function.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3877
  static void FPT_phaseDecode(unsigned long p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3878
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3879
3880
  	unsigned char phase_ref;
  	void (*phase) (unsigned long, unsigned char);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3881

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3882
  	DISABLE_AUTO(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3883

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3884
3885
  	phase_ref =
  	    (unsigned char)(RD_HARPOON(p_port + hp_scsisig) & S_SCSI_PHZ);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3886

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3887
  	phase = FPT_s_PhaseTbl[phase_ref];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3888

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3889
  	(*phase) (p_port, p_card);	/* Call the correct phase func */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3890
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3891
3892
3893
3894
3895
3896
3897
  /*---------------------------------------------------------------------
   *
   * Function: Data Out Phase
   *
   * Description: Start up both the BusMaster and Xbow.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3898
  static void FPT_phaseDataOut(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3899
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3900
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3901

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3902
3903
3904
3905
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	if (currSCCB == NULL) {
  		return;		/* Exit if No SCCB record */
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3906

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3907
3908
  	currSCCB->Sccb_scsistat = DATA_OUT_ST;
  	currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3909

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3910
  	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3911

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3912
  	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3913

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3914
  	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3915

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3916
  	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3917

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3918
  	if (currSCCB->Sccb_XferCnt == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3919

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3920
3921
3922
  		if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
  		    (currSCCB->HostStatus == SCCB_COMPLETE))
  			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3923

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3924
3925
3926
3927
  		FPT_sxfrp(port, p_card);
  		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
  			FPT_phaseDecode(port, p_card);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3928
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3929
3930
3931
3932
3933
3934
3935
  /*---------------------------------------------------------------------
   *
   * Function: Data In Phase
   *
   * Description: Startup the BusMaster and the XBOW.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3936
  static void FPT_phaseDataIn(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3937
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3938
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3939

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3940
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3941

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3942
3943
3944
  	if (currSCCB == NULL) {
  		return;		/* Exit if No SCCB record */
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3945

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3946
3947
3948
  	currSCCB->Sccb_scsistat = DATA_IN_ST;
  	currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
  	currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3949

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3950
  	WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3951

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3952
  	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3953

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3954
  	WR_HARPOON(port + hp_autostart_0, (END_DATA + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3955

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3956
  	FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3957

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3958
  	if (currSCCB->Sccb_XferCnt == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3959

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3960
3961
3962
  		if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
  		    (currSCCB->HostStatus == SCCB_COMPLETE))
  			currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3963

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3964
3965
3966
  		FPT_sxfrp(port, p_card);
  		if (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | RESET)))
  			FPT_phaseDecode(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3967

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3968
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3969
3970
3971
3972
3973
3974
3975
3976
3977
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Command Phase
   *
   * Description: Load the CDB into the automation and start it up.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
3978
  static void FPT_phaseCommand(unsigned long p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3979
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3980
3981
3982
  	struct sccb *currSCCB;
  	unsigned long cdb_reg;
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3983

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3984
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3985

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3986
  	if (currSCCB->OperationCode == RESET_COMMAND) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3987

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3988
3989
3990
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->CdbLength = SIX_BYTE_CMD;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3991

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3992
  	WR_HARPOON(p_port + hp_scsisig, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3993

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3994
  	ARAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3995

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3996
  	cdb_reg = p_port + CMD_STRT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3997

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3998
  	for (i = 0; i < currSCCB->CdbLength; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3999

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4000
  		if (currSCCB->OperationCode == RESET_COMMAND)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4001

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4002
  			WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4003

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4004
4005
4006
4007
4008
  		else
  			WRW_HARPOON(cdb_reg,
  				    (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
  		cdb_reg += 2;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4009

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4010
4011
  	if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
  		WRW_HARPOON(cdb_reg, (BRH_OP + ALWAYS + NP));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4013
  	WR_HARPOON(p_port + hp_portctrl_0, (SCSI_PORT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4014

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4015
  	currSCCB->Sccb_scsistat = COMMAND_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4016

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4017
4018
  	WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4019
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4020
4021
4022
4023
4024
4025
4026
  /*---------------------------------------------------------------------
   *
   * Function: Status phase
   *
   * Description: Bring in the status and command complete message bytes
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4027
  static void FPT_phaseStatus(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4028
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4029
4030
4031
4032
  	/* Start-up the automation to finish off this command and let the
  	   isr handle the interrupt for command complete when it comes in.
  	   We could wait here for the interrupt to be generated?
  	 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4033

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4034
  	WR_HARPOON(port + hp_scsisig, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4035

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4036
  	WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4037
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4038
4039
4040
4041
4042
4043
4044
4045
  /*---------------------------------------------------------------------
   *
   * Function: Phase Message Out
   *
   * Description: Send out our message (if we have one) and handle whatever
   *              else is involed.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4046
  static void FPT_phaseMsgOut(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4047
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4048
4049
4050
  	unsigned char message, scsiID;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4051

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4052
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4053
4054
4055
4056
4057
  
  	if (currSCCB != NULL) {
  
  		message = currSCCB->Sccb_scsimsg;
  		scsiID = currSCCB->TargID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4058
  		if (message == SMDEV_RESET) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4059

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4060
  			currTar_Info = &FPT_sccbMgrTbl[p_card][scsiID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4061
  			currTar_Info->TarSyncCtrl = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4062
  			FPT_sssyncv(port, scsiID, NARROW_SCSI, currTar_Info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4063

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4064
4065
  			if (FPT_sccbMgrTbl[p_card][scsiID].
  			    TarEEValue & EE_SYNC_MASK) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4066

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4067
4068
  				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
  				    ~TAR_SYNC_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4069
4070
  
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4071
4072
  			if (FPT_sccbMgrTbl[p_card][scsiID].
  			    TarEEValue & EE_WIDE_SCSI) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4073

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4074
4075
  				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
  				    ~TAR_WIDE_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4076
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4077
4078
4079
  			FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
  			FPT_SccbMgrTableInitTarget(p_card, scsiID);
  		} else if (currSCCB->Sccb_scsistat == ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4080
  			currSCCB->HostStatus = SCCB_COMPLETE;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4081
4082
4083
4084
  			if (FPT_BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] !=
  			    NULL) {
  				FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
  							      Sccb_tag] = NULL;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4085
  				FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4086
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4087

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4088
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4089

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4090
  		else if (currSCCB->Sccb_scsistat < COMMAND_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4091

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4092
  			if (message == SMNO_OP) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4093
  				currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4094
4095
  
  				FPT_ssel(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4096
4097
  				return;
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4098
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4099
4100
  
  			if (message == SMABORT)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4101
  				FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4102
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4103
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4104
4105
  		message = SMABORT;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4106
  	WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4107

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4108
  	WR_HARPOON(port + hp_portctrl_0, SCSI_BUS_EN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4109

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4110
  	WR_HARPOON(port + hp_scsidata_0, message);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4111

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4112
  	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4113
4114
  
  	ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4115
  	WR_HARPOON(port + hp_portctrl_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4116

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4117
4118
  	if ((message == SMABORT) || (message == SMDEV_RESET) ||
  	    (message == SMABORT_TAG)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4119

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4120
4121
  		while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | PHASE))) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4122

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4123
4124
  		if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
  			WRW_HARPOON((port + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4125

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4126
  			if (currSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4127

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4128
4129
4130
4131
4132
4133
4134
4135
4136
  				if ((FPT_BL_Card[p_card].
  				     globalFlags & F_CONLUN_IO)
  				    &&
  				    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				      TarStatus & TAR_TAG_Q_MASK) !=
  				     TAG_Q_TRYING))
  					FPT_sccbMgrTbl[p_card][currSCCB->
  							       TargID].
  					    TarLUNBusy[currSCCB->Lun] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4137
  				else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4138
4139
4140
  					FPT_sccbMgrTbl[p_card][currSCCB->
  							       TargID].
  					    TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4141

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4142
4143
  				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
  						     currSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4144
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4145
4146
4147
  			else {
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4148
4149
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4150
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4151

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4152
  			FPT_sxfrp(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4153
4154
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4155
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4156

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4157
  		if (message == SMPARITY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4158
  			currSCCB->Sccb_scsimsg = SMNO_OP;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4159
4160
4161
4162
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
  		} else {
  			FPT_sxfrp(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4163
4164
4165
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4166
4167
4168
4169
4170
4171
4172
  /*---------------------------------------------------------------------
   *
   * Function: Message In phase
   *
   * Description: Bring in the message and determine what to do with it.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4173
  static void FPT_phaseMsgIn(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4174
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
4175
  	unsigned char message;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4176
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4177

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4178
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4179

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4180
  	if (FPT_BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4181

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4182
  		FPT_phaseChkFifo(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4183
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4184
4185
  	message = RD_HARPOON(port + hp_scsidata_0);
  	if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4186

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4187
4188
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4189
4190
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4191
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4192

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4193
4194
  		message = FPT_sfm(port, currSCCB);
  		if (message) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4195

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4196
  			FPT_sdecm(message, port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4198
4199
  		} else {
  			if (currSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4200
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4201
4202
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4203
4204
4205
4206
  		}
  	}
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4207
4208
4209
4210
4211
4212
4213
4214
4215
  /*---------------------------------------------------------------------
   *
   * Function: Illegal phase
   *
   * Description: Target switched to some illegal phase, so all we can do
   *              is report an error back to the host (if that is possible)
   *              and send an ABORT message to the misbehaving target.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4216
  static void FPT_phaseIllegal(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4217
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4218
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4219

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4220
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4221

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4222
4223
  	WR_HARPOON(port + hp_scsisig, RD_HARPOON(port + hp_scsisig));
  	if (currSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4224

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4225
4226
4227
4228
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->Sccb_scsistat = ABORT_ST;
  		currSCCB->Sccb_scsimsg = SMABORT;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4229

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4230
  	ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4231
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4232
4233
4234
4235
4236
4237
4238
4239
  /*---------------------------------------------------------------------
   *
   * Function: Phase Check FIFO
   *
   * Description: Make sure data has been flushed from both FIFOs and abort
   *              the operations if necessary.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4240
  static void FPT_phaseChkFifo(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4241
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4242
4243
  	unsigned long xfercnt;
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4245
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4246

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4247
  	if (currSCCB->Sccb_scsistat == DATA_IN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4248

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4249
4250
4251
  		while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) &&
  		       (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4252

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4253
4254
  		if (!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY)) {
  			currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4255

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4256
  			currSCCB->Sccb_XferCnt = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4257

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4258
4259
4260
4261
4262
  			if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
  			    (currSCCB->HostStatus == SCCB_COMPLETE)) {
  				currSCCB->HostStatus = SCCB_PARITY_ERR;
  				WRW_HARPOON((port + hp_intstat), PARITY);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4263

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4264
  			FPT_hostDataXferAbort(port, p_card, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4265

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4266
  			FPT_dataXferProcessor(port, &FPT_BL_Card[p_card]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4267

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4268
4269
4270
4271
  			while ((!(RD_HARPOON(port + hp_xferstat) & FIFO_EMPTY))
  			       && (RD_HARPOON(port + hp_ext_status) &
  				   BM_CMD_BUSY)) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4272

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4273
4274
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4275

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4276
4277
  	/*End Data In specific code. */
  	GET_XFER_CNT(port, xfercnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4278

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4279
  	WR_HARPOON(port + hp_xfercnt_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4280

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4281
  	WR_HARPOON(port + hp_portctrl_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4282

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4283
  	currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4284

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4285
  	currSCCB->Sccb_XferCnt = xfercnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4286

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4287
4288
  	if ((RDW_HARPOON((port + hp_intstat)) & PARITY) &&
  	    (currSCCB->HostStatus == SCCB_COMPLETE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4289

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4290
4291
4292
  		currSCCB->HostStatus = SCCB_PARITY_ERR;
  		WRW_HARPOON((port + hp_intstat), PARITY);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4293

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4294
  	FPT_hostDataXferAbort(port, p_card, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4295

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4296
4297
4298
  	WR_HARPOON(port + hp_fifowrite, 0x00);
  	WR_HARPOON(port + hp_fiforead, 0x00);
  	WR_HARPOON(port + hp_xferstat, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4299

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4300
  	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4301
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4302
4303
4304
4305
4306
4307
4308
4309
  /*---------------------------------------------------------------------
   *
   * Function: Phase Bus Free
   *
   * Description: We just went bus free so figure out if it was
   *              because of command complete or from a disconnect.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4310
  static void FPT_phaseBusFree(unsigned long port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4311
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4312
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4313

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4314
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4315

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4316
  	if (currSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4317

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4318
  		DISABLE_AUTO(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4319

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4320
  		if (currSCCB->OperationCode == RESET_COMMAND) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4321

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4322
4323
4324
4325
4326
  			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[currSCCB->Lun] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4327
  			else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[0] = 0;
  
  			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
  					     p_card);
  
  			FPT_queueSearchSelect(&FPT_BL_Card[p_card], p_card);
  
  		}
  
  		else if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
  			    (unsigned char)SYNC_SUPPORTED;
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
  			    ~EE_SYNC_MASK;
  		}
  
  		else if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
  			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
  
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
  			    ~EE_WIDE_SCSI;
  		}
  
  		else if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
  			/* Make sure this is not a phony BUS_FREE.  If we were
  			   reselected or if BUSY is NOT on then this is a
  			   valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
  
  			if ((!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) ||
  			    (RDW_HARPOON((port + hp_intstat)) & RSEL)) {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarStatus &= ~TAR_TAG_Q_MASK;
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarStatus |= TAG_Q_REJECT;
  			}
  
  			else {
  				return;
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4371

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4372
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4373

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4374
  			currSCCB->Sccb_scsistat = BUS_FREE_ST;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4375

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4376
4377
4378
  			if (!currSCCB->HostStatus) {
  				currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4379

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4380
4381
4382
4383
4384
4385
4386
4387
  			if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  			    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[currSCCB->Lun] = 0;
  			else
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4388

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4389
4390
4391
4392
  			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
  					     p_card);
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4393

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4394
  		FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4395

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4396
4397
  	}			/*end if !=null */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4398

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4399
4400
4401
4402
4403
4404
4405
  /*---------------------------------------------------------------------
   *
   * Function: Auto Load Default Map
   *
   * Description: Load the Automation RAM with the defualt map values.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4406
  static void FPT_autoLoadDefaultMap(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4407
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
  	unsigned long map_addr;
  
  	ARAM_ACCESS(p_port);
  	map_addr = p_port + hp_aramBase;
  
  	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0xC0));	/*ID MESSAGE */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x20));	/*SIMPLE TAG QUEUEING MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, RAT_OP);	/*RESET ATTENTION */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + AMSG_OUT + 0x00));	/*TAG ID MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 0 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 1 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 2 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 3 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 4 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 5 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 6 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 7 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 8 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 9 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 10 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MPM_OP + ACOMMAND + 0x00));	/*CDB BYTE 11 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPE_OP + ADATA_OUT + DINT));	/*JUMP IF DATA OUT */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (TCB_OP + FIFO_0 + DI));	/*JUMP IF NO DATA IN FIFO */
  	map_addr += 2;		/*This means AYNC DATA IN */
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_IDO_STRT));	/*STOP AND INTERRUPT */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPE_OP + ADATA_IN + DINT));	/*JUMP IF NOT DATA IN PHZ */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK 4 DATA IN */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x02));	/*SAVE DATA PTR MSG? */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + DC));	/*GO CHECK FOR DISCONNECT MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR1));	/*SAVE DATA PTRS MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + ST));	/*IF NOT MSG IN CHECK DATA IN */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x04));	/*DISCONNECT MSG? */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + UNKNWN));	/*UKNKNOWN MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*XFER DISCONNECT MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITAR_DISC));	/*STOP AND INTERRUPT */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPN_OP + ASTATUS + UNKNWN));	/*JUMP IF NOT STATUS PHZ. */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_AR0));	/*GET STATUS BYTE */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CPN_OP + AMSG_IN + CC));	/*ERROR IF NOT MSG IN PHZ */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (CRD_OP + SDATA + 0x00));	/*CHECK FOR CMD COMPLETE MSG. */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (BRH_OP + NOT_EQ + CC));	/*ERROR IF NOT CMD COMPLETE MSG. */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (MRR_OP + SDATA + D_BUCKET));	/*GET CMD COMPLETE MSG */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_ICMD_COMP));	/*END OF COMMAND */
  	map_addr += 2;
  
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_IUNKWN));	/*RECEIVED UNKNOWN MSG BYTE */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_ITICKLE));	/*BIOS Tickled the Mgr */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_IRFAIL));	/*EXPECTED ID/TAG MESSAGES AND */
  	map_addr += 2;		/* DIDN'T GET ONE */
  	WRW_HARPOON(map_addr, (CRR_OP + AR3 + S_IDREG));	/* comp SCSI SEL ID & AR3 */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (BRH_OP + EQUAL + 0x00));	/*SEL ID OK then Conti. */
  	map_addr += 2;
  	WRW_HARPOON(map_addr, (SSI_OP + SSI_INO_CC));	/*NO COMMAND COMPLETE AFTER STATUS */
  
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Auto Command Complete
   *
   * Description: Post command back to host and find another command
   *              to execute.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4511
  static void FPT_autoCmdCmplt(unsigned long p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4512
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4513
4514
  	struct sccb *currSCCB;
  	unsigned char status_byte;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4515

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4516
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4517

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4518
  	status_byte = RD_HARPOON(p_port + hp_gp_reg_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4519

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4520
  	FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4521

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4522
  	if (status_byte != SSGOOD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4523

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4524
  		if (status_byte == SSQ_FULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4525

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4526
4527
4528
4529
4530
4531
  			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[currSCCB->Lun] = 1;
  				if (FPT_BL_Card[p_card].discQCount != 0)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4532
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
  				FPT_BL_Card[p_card].
  				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  					      [currSCCB->TargID].
  					      LunDiscQ_Idx[currSCCB->Lun]] =
  				    NULL;
  			} else {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[0] = 1;
  				if (currSCCB->Sccb_tag) {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
  								      Sccb_tag]
  					    = NULL;
  				} else {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].
  					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  						      [currSCCB->TargID].
  						      LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4556
4557
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4558
  			currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4559

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4560
  			FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4561

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4562
4563
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4564

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4565
4566
4567
  		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
  			    (unsigned char)SYNC_SUPPORTED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4568

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4569
4570
4571
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
  			    ~EE_SYNC_MASK;
  			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4572

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4573
4574
4575
4576
4577
4578
  			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[currSCCB->Lun] = 1;
  				if (FPT_BL_Card[p_card].discQCount != 0)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4579
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
  				FPT_BL_Card[p_card].
  				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  					      [currSCCB->TargID].
  					      LunDiscQ_Idx[currSCCB->Lun]] =
  				    NULL;
  			} else {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[0] = 1;
  				if (currSCCB->Sccb_tag) {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
  								      Sccb_tag]
  					    = NULL;
  				} else {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].
  					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  						      [currSCCB->TargID].
  						      LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4603
4604
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4605
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4606

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4607
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4608

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4609
  		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4610

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4611
4612
4613
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
  			    (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			     TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4614

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4615
4616
4617
  			FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &=
  			    ~EE_WIDE_SCSI;
  			FPT_BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4618

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4619
4620
4621
4622
4623
4624
  			if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  			     ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  			       TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[currSCCB->Lun] = 1;
  				if (FPT_BL_Card[p_card].discQCount != 0)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4625
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
  				FPT_BL_Card[p_card].
  				    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  					      [currSCCB->TargID].
  					      LunDiscQ_Idx[currSCCB->Lun]] =
  				    NULL;
  			} else {
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUNBusy[0] = 1;
  				if (currSCCB->Sccb_tag) {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].discQ_Tbl[currSCCB->
  								      Sccb_tag]
  					    = NULL;
  				} else {
  					if (FPT_BL_Card[p_card].discQCount != 0)
  						FPT_BL_Card[p_card].
  						    discQCount--;
  					FPT_BL_Card[p_card].
  					    discQ_Tbl[FPT_sccbMgrTbl[p_card]
  						      [currSCCB->TargID].
  						      LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4649
4650
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
  			return;
  
  		}
  
  		if (status_byte == SSCHECK) {
  			if (FPT_BL_Card[p_card].globalFlags & F_DO_RENEGO) {
  				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarEEValue & EE_SYNC_MASK) {
  					FPT_sccbMgrTbl[p_card][currSCCB->
  							       TargID].
  					    TarStatus &= ~TAR_SYNC_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4662
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4663
4664
4665
4666
4667
  				if (FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarEEValue & EE_WIDE_SCSI) {
  					FPT_sccbMgrTbl[p_card][currSCCB->
  							       TargID].
  					    TarStatus &= ~TAR_WIDE_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4668
4669
4670
  				}
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
  		if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
  
  			currSCCB->SccbStatus = SCCB_ERROR;
  			currSCCB->TargetStatus = status_byte;
  
  			if (status_byte == SSCHECK) {
  
  				FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  				    TarLUN_CA = 1;
  
  				if (currSCCB->RequestSenseLength !=
  				    NO_AUTO_REQUEST_SENSE) {
  
  					if (currSCCB->RequestSenseLength == 0)
  						currSCCB->RequestSenseLength =
  						    14;
  
  					FPT_ssenss(&FPT_BL_Card[p_card]);
  					FPT_BL_Card[p_card].globalFlags |=
  					    F_NEW_SCCB_CMD;
  
  					if (((FPT_BL_Card[p_card].
  					      globalFlags & F_CONLUN_IO)
  					     &&
  					     ((FPT_sccbMgrTbl[p_card]
  					       [currSCCB->TargID].
  					       TarStatus & TAR_TAG_Q_MASK) !=
  					      TAG_Q_TRYING))) {
  						FPT_sccbMgrTbl[p_card]
  						    [currSCCB->TargID].
  						    TarLUNBusy[currSCCB->Lun] =
  						    1;
  						if (FPT_BL_Card[p_card].
  						    discQCount != 0)
  							FPT_BL_Card[p_card].
  							    discQCount--;
  						FPT_BL_Card[p_card].
  						    discQ_Tbl[FPT_sccbMgrTbl
  							      [p_card]
  							      [currSCCB->
  							       TargID].
  							      LunDiscQ_Idx
  							      [currSCCB->Lun]] =
  						    NULL;
  					} else {
  						FPT_sccbMgrTbl[p_card]
  						    [currSCCB->TargID].
  						    TarLUNBusy[0] = 1;
  						if (currSCCB->Sccb_tag) {
  							if (FPT_BL_Card[p_card].
  							    discQCount != 0)
  								FPT_BL_Card
  								    [p_card].
  								    discQCount--;
  							FPT_BL_Card[p_card].
  							    discQ_Tbl[currSCCB->
  								      Sccb_tag]
  							    = NULL;
  						} else {
  							if (FPT_BL_Card[p_card].
  							    discQCount != 0)
  								FPT_BL_Card
  								    [p_card].
  								    discQCount--;
  							FPT_BL_Card[p_card].
  							    discQ_Tbl
  							    [FPT_sccbMgrTbl
  							     [p_card][currSCCB->
  								      TargID].
  							     LunDiscQ_Idx[0]] =
  							    NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4742
4743
  						}
  					}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4744
4745
4746
4747
4748
  					return;
  				}
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4749

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4750
4751
4752
4753
4754
  	if ((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  	    ((FPT_sccbMgrTbl[p_card][currSCCB->TargID].
  	      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
  		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->
  								    Lun] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4755
  	else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4756
  		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4757

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4758
  	FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4759
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4760
4761
4762
  
  #define SHORT_WAIT   0x0000000F
  #define LONG_WAIT    0x0000FFFFL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
  /*---------------------------------------------------------------------
   *
   * Function: Data Transfer Processor
   *
   * Description: This routine performs two tasks.
   *              (1) Start data transfer by calling HOST_DATA_XFER_START
   *              function.  Once data transfer is started, (2) Depends
   *              on the type of data transfer mode Scatter/Gather mode
   *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
   *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
   *              data transfer done.  In Scatter/Gather mode, this routine
   *              checks bus master command complete and dual rank busy
   *              bit to keep chaining SC transfer command.  Similarly,
   *              in Scatter/Gather mode, it checks Sccb_MGRFlag
   *              (F_HOST_XFER_ACT bit) for data transfer done.
   *              
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4780
4781
  static void FPT_dataXferProcessor(unsigned long port,
  				  struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4782
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4783
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4784

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4785
  	currSCCB = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4786

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4787
4788
4789
4790
4791
4792
4793
  	if (currSCCB->Sccb_XferState & F_SG_XFER) {
  		if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
  		{
  			currSCCB->Sccb_sgseg += (unsigned char)SG_BUF_CNT;
  			currSCCB->Sccb_SGoffset = 0x00;
  		}
  		pCurrCard->globalFlags |= F_HOST_XFER_ACT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4794

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4795
4796
4797
4798
4799
  		FPT_busMstrSGDataXferStart(port, currSCCB);
  	}
  
  	else {
  		if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4800
  			pCurrCard->globalFlags |= F_HOST_XFER_ACT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4801

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4802
4803
4804
  			FPT_busMstrDataXferStart(port, currSCCB);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4805
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4806
4807
4808
4809
4810
4811
4812
  /*---------------------------------------------------------------------
   *
   * Function: BusMaster Scatter Gather Data Transfer Start
   *
   * Description:
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4813
4814
  static void FPT_busMstrSGDataXferStart(unsigned long p_port,
  				       struct sccb *pcurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4815
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4816
4817
4818
4819
  	unsigned long count, addr, tmpSGCnt;
  	unsigned int sg_index;
  	unsigned char sg_count, i;
  	unsigned long reg_offset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4820

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4821
  	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4822

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4823
4824
  		count = ((unsigned long)HOST_RD_CMD) << 24;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4825

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4826
4827
4828
  	else {
  		count = ((unsigned long)HOST_WRT_CMD) << 24;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4829

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4830
4831
4832
4833
  	sg_count = 0;
  	tmpSGCnt = 0;
  	sg_index = pcurrSCCB->Sccb_sgseg;
  	reg_offset = hp_aramBase;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4834

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4835
4836
  	i = (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
  			    ~(SGRAM_ARAM | SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4837

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4838
  	WR_HARPOON(p_port + hp_page_ctrl, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4839

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4840
4841
4842
  	while ((sg_count < (unsigned char)SG_BUF_CNT) &&
  	       ((unsigned long)(sg_index * (unsigned int)SG_ELEMENT_SIZE) <
  		pcurrSCCB->DataLength)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4844
4845
  		tmpSGCnt += *(((unsigned long *)pcurrSCCB->DataPointer) +
  			      (sg_index * 2));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4846

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4847
4848
  		count |= *(((unsigned long *)pcurrSCCB->DataPointer) +
  			   (sg_index * 2));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4849

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4850
4851
  		addr = *(((unsigned long *)pcurrSCCB->DataPointer) +
  			 ((sg_index * 2) + 1));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4852

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4853
  		if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4854

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4855
4856
4857
4858
  			addr +=
  			    ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
  			count =
  			    (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4859

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4860
4861
  			tmpSGCnt = count & 0x00FFFFFFL;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4862

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4863
4864
  		WR_HARP32(p_port, reg_offset, addr);
  		reg_offset += 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4865

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4866
4867
  		WR_HARP32(p_port, reg_offset, count);
  		reg_offset += 4;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4868

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4869
4870
4871
  		count &= 0xFF000000L;
  		sg_index++;
  		sg_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4872

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4873
  	}			/*End While */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4874

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4875
  	pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4876

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4877
  	WR_HARPOON(p_port + hp_sg_addr, (sg_count << 4));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4878

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4879
  	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4880

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4881
  		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4882

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4883
4884
4885
4886
  		WR_HARPOON(p_port + hp_portctrl_0,
  			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
  		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4887

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4888
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4889

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4890
4891
  		if ((!(RD_HARPOON(p_port + hp_synctarg_0) & NARROW_SCSI)) &&
  		    (tmpSGCnt & 0x000000001)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4892

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4893
4894
4895
  			pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
  			tmpSGCnt--;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4896

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4897
  		WR_HARP32(p_port, hp_xfercnt_0, tmpSGCnt);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4898

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4899
4900
4901
4902
  		WR_HARPOON(p_port + hp_portctrl_0,
  			   (SCSI_PORT | DMA_PORT | DMA_RD));
  		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4903

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4904
  	WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4905
4906
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4907
4908
4909
4910
4911
4912
4913
  /*---------------------------------------------------------------------
   *
   * Function: BusMaster Data Transfer Start
   *
   * Description: 
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4914
4915
  static void FPT_busMstrDataXferStart(unsigned long p_port,
  				     struct sccb *pcurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4916
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4917
  	unsigned long addr, count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4918

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4919
  	if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4920

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4921
  		count = pcurrSCCB->Sccb_XferCnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4922

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4923
4924
4925
  		addr =
  		    (unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4926

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4927
4928
4929
  	else {
  		addr = pcurrSCCB->SensePointer;
  		count = pcurrSCCB->RequestSenseLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4930

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4931
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4932

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4933
  	HP_SETUP_ADDR_CNT(p_port, addr, count);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4934

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4935
  	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4936

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4937
4938
4939
  		WR_HARPOON(p_port + hp_portctrl_0,
  			   (DMA_PORT | SCSI_PORT | SCSI_INBIT));
  		WR_HARPOON(p_port + hp_scsisig, S_DATAI_PH);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4940

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4941
4942
4943
  		WR_HARPOON(p_port + hp_xfer_cmd,
  			   (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4944

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4945
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4946

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4947
4948
4949
  		WR_HARPOON(p_port + hp_portctrl_0,
  			   (SCSI_PORT | DMA_PORT | DMA_RD));
  		WR_HARPOON(p_port + hp_scsisig, S_DATAO_PH);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4950

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4951
4952
  		WR_HARPOON(p_port + hp_xfer_cmd,
  			   (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4953

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4954
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4955
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
  /*---------------------------------------------------------------------
   *
   * Function: BusMaster Timeout Handler
   *
   * Description: This function is called after a bus master command busy time
   *               out is detected.  This routines issue halt state machine
   *               with a software time out for command busy.  If command busy
   *               is still asserted at the end of the time out, it issues
   *               hard abort with another software time out.  It hard abort
   *               command busy is also time out, it'll just give up.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
4968
  static unsigned char FPT_busMstrTimeOut(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4969
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4970
  	unsigned long timeout;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4971

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4972
  	timeout = LONG_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4973

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4974
  	WR_HARPOON(p_port + hp_sys_ctrl, HALT_MACH);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4975

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4976
4977
4978
  	while ((!(RD_HARPOON(p_port + hp_ext_status) & CMD_ABORTED))
  	       && timeout--) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4979

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4980
4981
  	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
  		WR_HARPOON(p_port + hp_sys_ctrl, HARD_ABORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4982

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4983
4984
4985
4986
4987
  		timeout = LONG_WAIT;
  		while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY)
  		       && timeout--) {
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4988

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4989
  	RD_HARPOON(p_port + hp_int_status);	/*Clear command complete */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4990

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4991
  	if (RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY) {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
4992
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4993
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4994

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4995
  	else {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
4996
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4997
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4998
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4999
5000
5001
5002
5003
5004
5005
  /*---------------------------------------------------------------------
   *
   * Function: Host Data Transfer Abort
   *
   * Description: Abort any in progress transfer.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5006
5007
  static void FPT_hostDataXferAbort(unsigned long port, unsigned char p_card,
  				  struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5008
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5009
5010
5011
  	unsigned long timeout;
  	unsigned long remain_cnt;
  	unsigned int sg_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5013
  	FPT_BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5014

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5015
  	if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5016

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5017
  		if (!(RD_HARPOON(port + hp_int_status) & INT_CMD_COMPL)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5018

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5019
5020
5021
5022
  			WR_HARPOON(port + hp_bm_ctrl,
  				   (RD_HARPOON(port + hp_bm_ctrl) |
  				    FLUSH_XFER_CNTR));
  			timeout = LONG_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5023

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5024
5025
5026
  			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
  			       && timeout--) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5027

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5028
5029
5030
  			WR_HARPOON(port + hp_bm_ctrl,
  				   (RD_HARPOON(port + hp_bm_ctrl) &
  				    ~FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5031

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5032
  			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5033

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5034
  				if (FPT_busMstrTimeOut(port)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5035

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5036
  					if (pCurrSCCB->HostStatus == 0x00)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5037

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5038
5039
  						pCurrSCCB->HostStatus =
  						    SCCB_BM_ERR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5040

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5041
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5042

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5043
5044
  				if (RD_HARPOON(port + hp_int_status) &
  				    INT_EXT_STATUS)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5045

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5046
5047
  					if (RD_HARPOON(port + hp_ext_status) &
  					    BAD_EXT_STATUS)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5048

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5049
5050
5051
5052
5053
5054
5055
5056
5057
  						if (pCurrSCCB->HostStatus ==
  						    0x00)
  						{
  							pCurrSCCB->HostStatus =
  							    SCCB_BM_ERR;
  						}
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5058

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5059
  	else if (pCurrSCCB->Sccb_XferCnt) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5060

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5061
  		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5062

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5063
5064
5065
  			WR_HARPOON(port + hp_page_ctrl,
  				   (RD_HARPOON(port + hp_page_ctrl) &
  				    ~SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5066

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5067
  			WR_HARPOON(port + hp_sg_addr, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5068

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5069
  			sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5070

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5071
5072
5073
  			if (sg_ptr >
  			    (unsigned int)(pCurrSCCB->DataLength /
  					   SG_ELEMENT_SIZE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5074

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5075
5076
5077
5078
  				sg_ptr =
  				    (unsigned int)(pCurrSCCB->DataLength /
  						   SG_ELEMENT_SIZE);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5079

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5080
  			remain_cnt = pCurrSCCB->Sccb_XferCnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5081

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5082
  			while (remain_cnt < 0x01000000L) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5083

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5084
  				sg_ptr--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5085

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5086
5087
5088
5089
  				if (remain_cnt >
  				    (unsigned
  				     long)(*(((unsigned long *)pCurrSCCB->
  					      DataPointer) + (sg_ptr * 2)))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5090

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5091
5092
5093
5094
5095
5096
  					remain_cnt -=
  					    (unsigned
  					     long)(*(((unsigned long *)
  						      pCurrSCCB->DataPointer) +
  						     (sg_ptr * 2)));
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5097

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5098
  				else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5099

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5100
5101
5102
  					break;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5103

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5104
  			if (remain_cnt < 0x01000000L) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5105

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5106
  				pCurrSCCB->Sccb_SGoffset = remain_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5107

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5108
  				pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5109

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5110
5111
  				if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) ==
  				    pCurrSCCB->DataLength && (remain_cnt == 0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5112

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5113
5114
5115
  					pCurrSCCB->Sccb_XferState |=
  					    F_ALL_XFERRED;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5116

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5117
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5118

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5119
  				if (pCurrSCCB->HostStatus == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5120

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5121
5122
5123
5124
5125
  					pCurrSCCB->HostStatus =
  					    SCCB_GROSS_FW_ERR;
  				}
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5126

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5127
  		if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5128

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5129
  			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5130

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5131
5132
  				FPT_busMstrTimeOut(port);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5134
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5135

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5136
5137
  				if (RD_HARPOON(port + hp_int_status) &
  				    INT_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5138

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5139
5140
  					if (RD_HARPOON(port + hp_ext_status) &
  					    BAD_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5141

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5142
5143
  						if (pCurrSCCB->HostStatus ==
  						    0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5144

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5145
5146
5147
5148
5149
  							pCurrSCCB->HostStatus =
  							    SCCB_BM_ERR;
  						}
  					}
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5151
5152
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5153

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5154
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5155

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5156
  			if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5157

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5158
  				timeout = SHORT_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5159

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5160
5161
5162
5163
5164
5165
  				while ((RD_HARPOON(port + hp_ext_status) &
  					BM_CMD_BUSY)
  				       && ((RD_HARPOON(port + hp_fifo_cnt)) >=
  					   BM_THRESHOLD) && timeout--) {
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5166

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5167
  			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5168

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5169
5170
5171
  				WR_HARPOON(port + hp_bm_ctrl,
  					   (RD_HARPOON(port + hp_bm_ctrl) |
  					    FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5172

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5173
  				timeout = LONG_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5174

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5175
5176
5177
  				while ((RD_HARPOON(port + hp_ext_status) &
  					BM_CMD_BUSY) && timeout--) {
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5178

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5179
5180
5181
  				WR_HARPOON(port + hp_bm_ctrl,
  					   (RD_HARPOON(port + hp_bm_ctrl) &
  					    ~FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5182

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5183
5184
  				if (RD_HARPOON(port + hp_ext_status) &
  				    BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5185

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5186
  					if (pCurrSCCB->HostStatus == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5187

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5188
5189
5190
  						pCurrSCCB->HostStatus =
  						    SCCB_BM_ERR;
  					}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5191

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5192
5193
5194
  					FPT_busMstrTimeOut(port);
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5195

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5196
  			if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5198
5199
  				if (RD_HARPOON(port + hp_ext_status) &
  				    BAD_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5200

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5201
  					if (pCurrSCCB->HostStatus == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5202

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5203
5204
5205
5206
5207
5208
  						pCurrSCCB->HostStatus =
  						    SCCB_BM_ERR;
  					}
  				}
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5209

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5210
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5211

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5212
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5213

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5214
  		if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5215

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5216
  			timeout = LONG_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5217

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5218
5219
5220
  			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
  			       && timeout--) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5221

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5222
  			if (RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5223

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5224
  				if (pCurrSCCB->HostStatus == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5225

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5226
5227
  					pCurrSCCB->HostStatus = SCCB_BM_ERR;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5228

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5229
5230
5231
  				FPT_busMstrTimeOut(port);
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5232

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5233
  		if (RD_HARPOON(port + hp_int_status) & INT_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5234

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5235
  			if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5236

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5237
  				if (pCurrSCCB->HostStatus == 0x00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5238

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5239
5240
5241
  					pCurrSCCB->HostStatus = SCCB_BM_ERR;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5242

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5243
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5245
  		if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5246

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5247
5248
5249
  			WR_HARPOON(port + hp_page_ctrl,
  				   (RD_HARPOON(port + hp_page_ctrl) &
  				    ~SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5250

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5251
  			WR_HARPOON(port + hp_sg_addr, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5252

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5253
  			pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5254

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5255
  			pCurrSCCB->Sccb_SGoffset = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5256

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5257
5258
5259
  			if ((unsigned long)(pCurrSCCB->Sccb_sgseg *
  					    SG_ELEMENT_SIZE) >=
  			    pCurrSCCB->DataLength) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5260

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5261
  				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5262

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5263
5264
5265
  				pCurrSCCB->Sccb_sgseg =
  				    (unsigned short)(pCurrSCCB->DataLength /
  						     SG_ELEMENT_SIZE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5266

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5267
5268
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5269

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5270
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5271

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5272
  			if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5273

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5274
5275
5276
  				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5277

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5278
  	WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5279
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5280
5281
5282
5283
5284
5285
5286
5287
  /*---------------------------------------------------------------------
   *
   * Function: Host Data Transfer Restart
   *
   * Description: Reset the available count due to a restore data
   *              pointers message.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5288
  static void FPT_hostDataXferRestart(struct sccb *currSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5289
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5290
5291
5292
  	unsigned long data_count;
  	unsigned int sg_index;
  	unsigned long *sg_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5293

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5294
  	if (currSCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5295

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5296
  		currSCCB->Sccb_XferCnt = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5297

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5298
5299
  		sg_index = 0xffff;	/*Index by long words into sg list. */
  		data_count = 0;	/*Running count of SG xfer counts. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5300

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5301
  		sg_ptr = (unsigned long *)currSCCB->DataPointer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5302

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5303
  		while (data_count < currSCCB->Sccb_ATC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5304

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5305
5306
5307
  			sg_index++;
  			data_count += *(sg_ptr + (sg_index * 2));
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5308

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5309
  		if (data_count == currSCCB->Sccb_ATC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5310

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5311
5312
5313
  			currSCCB->Sccb_SGoffset = 0;
  			sg_index++;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5314

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5315
5316
5317
5318
  		else {
  			currSCCB->Sccb_SGoffset =
  			    data_count - currSCCB->Sccb_ATC;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5319

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5320
5321
  		currSCCB->Sccb_sgseg = (unsigned short)sg_index;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5322

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5323
5324
5325
5326
  	else {
  		currSCCB->Sccb_XferCnt =
  		    currSCCB->DataLength - currSCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5327
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5328

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5329
5330
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5331
   * Function: FPT_scini
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5332
5333
5334
5335
   *
   * Description: Setup all data structures necessary for SCAM selection.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5336
5337
  static void FPT_scini(unsigned char p_card, unsigned char p_our_id,
  		      unsigned char p_power_up)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5338
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5339
5340
  	unsigned char loser, assigned_id;
  	unsigned long p_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5341

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5342
5343
5344
  	unsigned char i, k, ScamFlg;
  	struct sccb_card *currCard;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5345

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5346
5347
  	currCard = &FPT_BL_Card[p_card];
  	p_port = currCard->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5348
  	pCurrNvRam = currCard->pNvRamInfo;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5349
  	if (pCurrNvRam) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5350
5351
  		ScamFlg = pCurrNvRam->niScamConf;
  		i = pCurrNvRam->niSysConf;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5352
5353
5354
5355
5356
  	} else {
  		ScamFlg =
  		    (unsigned char)FPT_utilEERead(p_port, SCAM_CONFIG / 2);
  		i = (unsigned
  		     char)(FPT_utilEERead(p_port, (SYSTEM_CONFIG / 2)));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5357
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5358
  	if (!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5359
  		return;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5360
  	FPT_inisci(p_card, p_port, p_our_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5361

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5362
5363
  	/* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
  	   too slow to return to SCAM selection */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5364

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5365
5366
5367
5368
  	/* if (p_power_up)
  	   FPT_Wait1Second(p_port);
  	   else
  	   FPT_Wait(p_port, TO_250ms); */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5369

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5370
  	FPT_Wait1Second(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5371

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5372
5373
5374
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
  		while (!(FPT_scarb(p_port, INIT_SELTD))) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5375

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5376
  		FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5377

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5378
5379
5380
5381
5382
5383
5384
  		do {
  			FPT_scxferc(p_port, SYNC_PTRN);
  			FPT_scxferc(p_port, DOM_MSTR);
  			loser =
  			    FPT_scsendi(p_port,
  					&FPT_scamInfo[p_our_id].id_string[0]);
  		} while (loser == 0xFF);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5385

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5386
  		FPT_scbusf(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5387

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5388
5389
5390
  		if ((p_power_up) && (!loser)) {
  			FPT_sresb(p_port, p_card);
  			FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5391

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5392
5393
  			while (!(FPT_scarb(p_port, INIT_SELTD))) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5394

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5395
  			FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5396

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5397
5398
5399
5400
5401
5402
5403
5404
  			do {
  				FPT_scxferc(p_port, SYNC_PTRN);
  				FPT_scxferc(p_port, DOM_MSTR);
  				loser =
  				    FPT_scsendi(p_port,
  						&FPT_scamInfo[p_our_id].
  						id_string[0]);
  			} while (loser == 0xFF);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5405

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5406
5407
5408
  			FPT_scbusf(p_port);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5409

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5410
5411
5412
  	else {
  		loser = 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5413

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5414
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
5440
5441
5442
  	if (!loser) {
  
  		FPT_scamInfo[p_our_id].state = ID_ASSIGNED;
  
  		if (ScamFlg & SCAM_ENABLED) {
  
  			for (i = 0; i < MAX_SCSI_TAR; i++) {
  				if ((FPT_scamInfo[i].state == ID_UNASSIGNED) ||
  				    (FPT_scamInfo[i].state == ID_UNUSED)) {
  					if (FPT_scsell(p_port, i)) {
  						FPT_scamInfo[i].state = LEGACY;
  						if ((FPT_scamInfo[i].
  						     id_string[0] != 0xFF)
  						    || (FPT_scamInfo[i].
  							id_string[1] != 0xFA)) {
  
  							FPT_scamInfo[i].
  							    id_string[0] = 0xFF;
  							FPT_scamInfo[i].
  							    id_string[1] = 0xFA;
  							if (pCurrNvRam == NULL)
  								currCard->
  								    globalFlags
  								    |=
  								    F_UPDATE_EEPROM;
  						}
  					}
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5443

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5444
5445
5446
5447
5448
5449
5450
  			FPT_sresb(p_port, p_card);
  			FPT_Wait1Second(p_port);
  			while (!(FPT_scarb(p_port, INIT_SELTD))) {
  			}
  			FPT_scsel(p_port);
  			FPT_scasid(p_card, p_port);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5451

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5452
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5453

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5454
5455
5456
5457
  	else if ((loser) && (ScamFlg & SCAM_ENABLED)) {
  		FPT_scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
  		assigned_id = 0;
  		FPT_scwtsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5458

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5459
5460
5461
  		do {
  			while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5462

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5463
5464
5465
5466
5467
5468
5469
5470
5471
5472
5473
5474
5475
5476
5477
5478
5479
5480
5481
5482
5483
5484
5485
5486
5487
5488
5489
5490
5491
5492
5493
5494
5495
5496
5497
  			i = FPT_scxferc(p_port, 0x00);
  			if (i == ASSIGN_ID) {
  				if (!
  				    (FPT_scsendi
  				     (p_port,
  				      &FPT_scamInfo[p_our_id].id_string[0]))) {
  					i = FPT_scxferc(p_port, 0x00);
  					if (FPT_scvalq(i)) {
  						k = FPT_scxferc(p_port, 0x00);
  
  						if (FPT_scvalq(k)) {
  							currCard->ourId =
  							    ((unsigned char)(i
  									     <<
  									     3)
  							     +
  							     (k &
  							      (unsigned char)7))
  							    & (unsigned char)
  							    0x3F;
  							FPT_inisci(p_card,
  								   p_port,
  								   p_our_id);
  							FPT_scamInfo[currCard->
  								     ourId].
  							    state = ID_ASSIGNED;
  							FPT_scamInfo[currCard->
  								     ourId].
  							    id_string[0]
  							    = SLV_TYPE_CODE0;
  							assigned_id = 1;
  						}
  					}
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5498

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5499
5500
5501
5502
5503
5504
5505
5506
  			else if (i == SET_P_FLAG) {
  				if (!(FPT_scsendi(p_port,
  						  &FPT_scamInfo[p_our_id].
  						  id_string[0])))
  					FPT_scamInfo[p_our_id].id_string[0] |=
  					    0x80;
  			}
  		} while (!assigned_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5507

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5508
5509
5510
  		while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5511

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5512
5513
5514
5515
5516
5517
5518
  	if (ScamFlg & SCAM_ENABLED) {
  		FPT_scbusf(p_port);
  		if (currCard->globalFlags & F_UPDATE_EEPROM) {
  			FPT_scsavdi(p_card, p_port);
  			currCard->globalFlags &= ~F_UPDATE_EEPROM;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5519

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5520
5521
5522
  /*
     for (i=0,k=0; i < MAX_SCSI_TAR; i++)
        {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5523
5524
        if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
           (FPT_scamInfo[i].state == LEGACY))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5525
5526
5527
5528
5529
5530
5531
5532
5533
           k++;
        }
  
     if (k==2)
        currCard->globalFlags |= F_SINGLE_DEVICE;
     else
        currCard->globalFlags &= ~F_SINGLE_DEVICE;
  */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5534
5535
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5536
   * Function: FPT_scarb
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5537
5538
5539
5540
   *
   * Description: Gain control of the bus and wait SCAM select time (250ms)
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5541
  static int FPT_scarb(unsigned long p_port, unsigned char p_sel_type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5542
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5543
  	if (p_sel_type == INIT_SELTD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5544

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5545
5546
  		while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5547

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5548
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5549
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5550

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5551
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5552
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5553

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5554
5555
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5556

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5557
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5558

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5559
5560
5561
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~SCSI_BSY));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5562
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5563
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5564

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5565
5566
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5567

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5568
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5569

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5570
5571
5572
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~(SCSI_BSY | SCSI_SEL)));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5573
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5574
5575
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5576

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5577
5578
5579
5580
5581
5582
  	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
  					   & ~ACTdeassert));
  	WR_HARPOON(p_port + hp_scsireset, SCAM_EN);
  	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
  	WR_HARPOON(p_port + hp_scsidata_1, 0x00);
  	WR_HARPOON(p_port + hp_portctrl_0, SCSI_BUS_EN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5583

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5584
5585
  	WR_HARPOON(p_port + hp_scsisig,
  		   (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5586

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5587
5588
  	WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
  					 & ~SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5589

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5590
  	FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5591

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5592
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5593
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5594
5595
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5596
   * Function: FPT_scbusf
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5597
5598
5599
5600
   *
   * Description: Release the SCSI bus and disable SCAM selection.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5601
  static void FPT_scbusf(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5602
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5603
5604
  	WR_HARPOON(p_port + hp_page_ctrl,
  		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5605

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5606
  	WR_HARPOON(p_port + hp_scsidata_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5607

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5608
5609
  	WR_HARPOON(p_port + hp_portctrl_0, (RD_HARPOON(p_port + hp_portctrl_0)
  					    & ~SCSI_BUS_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5610

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5611
  	WR_HARPOON(p_port + hp_scsisig, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5612

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5613
5614
  	WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
  					   & ~SCAM_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5615

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5616
5617
  	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
  					   | ACTdeassert));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5618

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5619
  	WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5620

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5621
5622
  	WR_HARPOON(p_port + hp_page_ctrl,
  		   (RD_HARPOON(p_port + hp_page_ctrl) & ~G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5623
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5624
5625
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5626
   * Function: FPT_scasid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5627
5628
5629
5630
   *
   * Description: Assign an ID to all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5631
  static void FPT_scasid(unsigned char p_card, unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5632
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5633
  	unsigned char temp_id_string[ID_STRING_LENGTH];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5634

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5635
  	unsigned char i, k, scam_id;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5636
  	unsigned char crcBytes[3];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5637
5638
  	struct nvram_info *pCurrNvRam;
  	unsigned short *pCrcBytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5639

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5640
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5641

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5642
  	i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5643

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5644
  	while (!i) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5645

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5646
5647
5648
  		for (k = 0; k < ID_STRING_LENGTH; k++) {
  			temp_id_string[k] = (unsigned char)0x00;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5649

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5650
5651
  		FPT_scxferc(p_port, SYNC_PTRN);
  		FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5652

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5653
5654
  		if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
  			if (pCurrNvRam) {
fd1e29ed6   Alexey Dobriyan   [SCSI] drivers/sc...
5655
  				pCrcBytes = (unsigned short *)&crcBytes[0];
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5656
5657
  				*pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
  				crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5658
5659
5660
  				temp_id_string[1] = crcBytes[2];
  				temp_id_string[2] = crcBytes[0];
  				temp_id_string[3] = crcBytes[1];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5661
5662
  				for (k = 4; k < ID_STRING_LENGTH; k++)
  					temp_id_string[k] = (unsigned char)0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5663
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5664
  			i = FPT_scmachid(p_card, temp_id_string);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5665

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5666
5667
5668
5669
5670
  			if (i == CLR_PRIORITY) {
  				FPT_scxferc(p_port, MISC_CODE);
  				FPT_scxferc(p_port, CLR_P_FLAG);
  				i = 0;	/*Not the last ID yet. */
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5671

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5672
5673
5674
5675
5676
  			else if (i != NO_ID_AVAIL) {
  				if (i < 8)
  					FPT_scxferc(p_port, ID_0_7);
  				else
  					FPT_scxferc(p_port, ID_8_F);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5677

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5678
  				scam_id = (i & (unsigned char)0x07);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5679

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5680
5681
5682
  				for (k = 1; k < 0x08; k <<= 1)
  					if (!(k & i))
  						scam_id += 0x08;	/*Count number of zeros in DB0-3. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5683

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5684
  				FPT_scxferc(p_port, scam_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5685

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5686
5687
5688
  				i = 0;	/*Not the last ID yet. */
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5689

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5690
5691
5692
  		else {
  			i = 1;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5693

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5694
  	}			/*End while */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5695

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5696
5697
  	FPT_scxferc(p_port, SYNC_PTRN);
  	FPT_scxferc(p_port, CFG_CMPLT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5698
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5699
5700
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5701
   * Function: FPT_scsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5702
5703
5704
5705
   *
   * Description: Select all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5706
  static void FPT_scsel(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5707
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5708
5709
  	WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
  	FPT_scwiros(p_port, SCSI_MSG);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5710

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5711
  	WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5712

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5713
5714
5715
5716
5717
  	WR_HARPOON(p_port + hp_scsisig,
  		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
  	WR_HARPOON(p_port + hp_scsidata_0,
  		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) |
  				   (unsigned char)(BIT(7) + BIT(6))));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5718

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5719
5720
  	WR_HARPOON(p_port + hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
  	FPT_scwiros(p_port, SCSI_SEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5721

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5722
5723
5724
5725
  	WR_HARPOON(p_port + hp_scsidata_0,
  		   (unsigned char)(RD_HARPOON(p_port + hp_scsidata_0) &
  				   ~(unsigned char)BIT(6)));
  	FPT_scwirod(p_port, BIT(6));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5726

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5727
5728
  	WR_HARPOON(p_port + hp_scsisig,
  		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5729
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5730
5731
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5732
   * Function: FPT_scxferc
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5733
5734
5735
5736
   *
   * Description: Handshake the p_data (DB4-0) across the bus.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5737
  static unsigned char FPT_scxferc(unsigned long p_port, unsigned char p_data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5738
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5739
  	unsigned char curr_data, ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5740

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5741
  	curr_data = p_data | BIT(7) | BIT(5);	/*Start with DB7 & DB5 asserted. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5742

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5743
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5744

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5745
  	curr_data &= ~BIT(7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5746

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5747
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5748

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5749
5750
  	FPT_scwirod(p_port, BIT(7));	/*Wait for DB7 to be released. */
  	while (!(RD_HARPOON(p_port + hp_scsidata_0) & BIT(5))) ;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5751

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5752
  	ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5753

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5754
  	curr_data |= BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5755

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5756
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5757

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5758
  	curr_data &= ~BIT(5);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5759

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5760
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5761

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5762
  	FPT_scwirod(p_port, BIT(5));	/*Wait for DB5 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5763

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5764
5765
  	curr_data &= ~(BIT(4) | BIT(3) | BIT(2) | BIT(1) | BIT(0));	/*Release data bits */
  	curr_data |= BIT(7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5766

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5767
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5768

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5769
  	curr_data &= ~BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5770

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5771
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5772

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5773
  	FPT_scwirod(p_port, BIT(6));	/*Wait for DB6 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5774

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5775
  	return ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5776
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5777
5778
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5779
   * Function: FPT_scsendi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5780
5781
5782
5783
5784
   *
   * Description: Transfer our Identification string to determine if we
   *              will be the dominant master.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5785
5786
  static unsigned char FPT_scsendi(unsigned long p_port,
  				 unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5787
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5788
  	unsigned char ret_data, byte_cnt, bit_cnt, defer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5789

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5790
  	defer = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5791

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5792
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5793

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5794
  		for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5795

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5796
5797
  			if (defer)
  				ret_data = FPT_scxferc(p_port, 00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5798

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5799
  			else if (p_id_string[byte_cnt] & bit_cnt)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5800

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5801
  				ret_data = FPT_scxferc(p_port, 02);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5802

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5803
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5804

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5805
5806
5807
5808
  				ret_data = FPT_scxferc(p_port, 01);
  				if (ret_data & 02)
  					defer = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5809

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5810
  			if ((ret_data & 0x1C) == 0x10)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5811
  				return 0x00;	/*End of isolation stage, we won! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5812

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5813
  			if (ret_data & 0x1C)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5814
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5816
  			if ((defer) && (!(ret_data & 0x1F)))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5817
  				return 0x01;	/*End of isolation stage, we lost. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5818

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5819
  		}		/*bit loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5820

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5821
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5822

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5823
  	if (defer)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5824
  		return 0x01;	/*We lost */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5825
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5826
  		return 0;	/*We WON! Yeeessss! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5827
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5828
5829
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5830
   * Function: FPT_sciso
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5831
5832
5833
5834
   *
   * Description: Transfer the Identification string.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5835
5836
  static unsigned char FPT_sciso(unsigned long p_port,
  			       unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5837
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5838
  	unsigned char ret_data, the_data, byte_cnt, bit_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5839

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5840
  	the_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5841

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5842
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5844
  		for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5845

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5846
  			ret_data = FPT_scxferc(p_port, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5847

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5848
  			if (ret_data & 0xFC)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5849
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5850

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5851
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5852

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5853
5854
5855
5856
5857
  				the_data <<= 1;
  				if (ret_data & BIT(1)) {
  					the_data |= 1;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5858

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5859
  			if ((ret_data & 0x1F) == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5860
5861
5862
5863
5864
  /*
  				if(bit_cnt != 0 || bit_cnt != 8)
  				{
  					byte_cnt = 0;
  					bit_cnt = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5865
5866
  					FPT_scxferc(p_port, SYNC_PTRN);
  					FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5867
5868
5869
  					continue;
  				}
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5870
  				if (byte_cnt)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5871
  					return 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5872
  				else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5873
  					return 0xFF;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5874
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5875

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5876
  		}		/*bit loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5877

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5878
  		p_id_string[byte_cnt] = the_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5879

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5880
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5881

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5882
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5883
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5884
5885
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5886
   * Function: FPT_scwirod
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5887
5888
5889
5890
5891
   *
   * Description: Sample the SCSI data bus making sure the signal has been
   *              deasserted for the correct number of consecutive samples.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5892
  static void FPT_scwirod(unsigned long p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5893
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5894
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5895

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5896
5897
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5898

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5899
  		if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5900

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5901
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5902

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5903
  		else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5904

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5905
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5906

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5907
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5908
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5909
5910
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5911
   * Function: FPT_scwiros
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5912
5913
5914
5915
5916
   *
   * Description: Sample the SCSI Signal lines making sure the signal has been
   *              deasserted for the correct number of consecutive samples.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5917
  static void FPT_scwiros(unsigned long p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5918
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5919
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5920

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5921
5922
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5923

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5924
  		if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5925

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5926
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5927

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5928
  		else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5929

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5930
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5931

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5932
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5933
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5934

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5935
5936
5937
5938
5939
5940
5941
  /*---------------------------------------------------------------------
   *
   * Function: FPT_scvalq
   *
   * Description: Make sure we received a valid data byte.
   *
   *---------------------------------------------------------------------*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5942

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5943
  static unsigned char FPT_scvalq(unsigned char p_quintet)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5944
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5945
  	unsigned char count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5946

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5947
5948
5949
5950
  	for (count = 1; count < 0x08; count <<= 1) {
  		if (!(p_quintet & count))
  			p_quintet -= 0x80;
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5951

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5952
  	if (p_quintet & 0x18)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5953
  		return 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5954

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5955
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5956
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5957
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5958
5959
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5960
   * Function: FPT_scsell
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5961
5962
   *
   * Description: Select the specified device ID using a selection timeout
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5963
5964
   *              less than 4ms.  If somebody responds then it is a legacy
   *              drive and this ID must be marked as such.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5965
5966
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
5967
  static unsigned char FPT_scsell(unsigned long p_port, unsigned char targ_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5968
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5969
  	unsigned long i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5970

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5971
5972
  	WR_HARPOON(p_port + hp_page_ctrl,
  		   (RD_HARPOON(p_port + hp_page_ctrl) | G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5973

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5974
  	ARAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5975

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5976
5977
5978
  	WR_HARPOON(p_port + hp_addstat,
  		   (RD_HARPOON(p_port + hp_addstat) | SCAM_TIMER));
  	WR_HARPOON(p_port + hp_seltimeout, TO_4ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5979

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5980
5981
5982
5983
  	for (i = p_port + CMD_STRT; i < p_port + CMD_STRT + 12; i += 2) {
  		WRW_HARPOON(i, (MPM_OP + ACOMMAND));
  	}
  	WRW_HARPOON(i, (BRH_OP + ALWAYS + NP));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5984

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5985
5986
  	WRW_HARPOON((p_port + hp_intstat),
  		    (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5987

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5988
  	WR_HARPOON(p_port + hp_select_id, targ_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5989

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5990
5991
5992
  	WR_HARPOON(p_port + hp_portctrl_0, SCSI_PORT);
  	WR_HARPOON(p_port + hp_autostart_3, (SELECT | CMD_ONLY_STRT));
  	WR_HARPOON(p_port + hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5993

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5994
5995
5996
  	while (!(RDW_HARPOON((p_port + hp_intstat)) &
  		 (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5997

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5998
5999
  	if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6000

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6001
  	DISABLE_AUTO(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6002

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6003
6004
6005
  	WR_HARPOON(p_port + hp_addstat,
  		   (RD_HARPOON(p_port + hp_addstat) & ~SCAM_TIMER));
  	WR_HARPOON(p_port + hp_seltimeout, TO_290ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6006

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6007
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6008

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6009
  	if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6010

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6011
6012
  		WRW_HARPOON((p_port + hp_intstat),
  			    (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6013

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6014
6015
6016
  		WR_HARPOON(p_port + hp_page_ctrl,
  			   (RD_HARPOON(p_port + hp_page_ctrl) &
  			    ~G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6017

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6018
  		return 0;	/*No legacy device */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6019
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6020

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6021
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6022

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6023
6024
6025
6026
6027
6028
  		while (!(RDW_HARPOON((p_port + hp_intstat)) & BUS_FREE)) {
  			if (RD_HARPOON(p_port + hp_scsisig) & SCSI_REQ) {
  				WR_HARPOON(p_port + hp_scsisig,
  					   (SCSI_ACK + S_ILL_PH));
  				ACCEPT_MSG(p_port);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6029
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6030
  		WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6031

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6032
6033
6034
  		WR_HARPOON(p_port + hp_page_ctrl,
  			   (RD_HARPOON(p_port + hp_page_ctrl) &
  			    ~G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6035

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6036
  		return 1;	/*Found one of them oldies! */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6037
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6038
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6039
6040
6041
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6042
   * Function: FPT_scwtsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6043
6044
6045
6046
   *
   * Description: Wait to be selected by another SCAM initiator.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
6047
  static void FPT_scwtsel(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6048
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6049
6050
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6051
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6052
6053
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6054
   * Function: FPT_inisci
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6055
6056
6057
6058
   *
   * Description: Setup the data Structure with the info from the EEPROM.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6059
6060
  static void FPT_inisci(unsigned char p_card, unsigned long p_port,
  		       unsigned char p_our_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6061
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6062
6063
6064
  	unsigned char i, k, max_id;
  	unsigned short ee_data;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6065

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6066
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6067

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6068
6069
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6070

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6071
6072
  	else
  		max_id = 0x10;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6073

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6074
6075
  	if (pCurrNvRam) {
  		for (i = 0; i < max_id; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6076

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6077
6078
6079
6080
6081
6082
  			for (k = 0; k < 4; k++)
  				FPT_scamInfo[i].id_string[k] =
  				    pCurrNvRam->niScamTbl[i][k];
  			for (k = 4; k < ID_STRING_LENGTH; k++)
  				FPT_scamInfo[i].id_string[k] =
  				    (unsigned char)0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6083

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6084
6085
6086
6087
  			if (FPT_scamInfo[i].id_string[0] == 0x00)
  				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
  			else
  				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6088
6089
  
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6090
6091
6092
6093
6094
6095
6096
6097
6098
6099
6100
6101
6102
6103
6104
  	} else {
  		for (i = 0; i < max_id; i++) {
  			for (k = 0; k < ID_STRING_LENGTH; k += 2) {
  				ee_data =
  				    FPT_utilEERead(p_port,
  						   (unsigned
  						    short)((EE_SCAMBASE / 2) +
  							   (unsigned short)(i *
  									    ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
  				FPT_scamInfo[i].id_string[k] =
  				    (unsigned char)ee_data;
  				ee_data >>= 8;
  				FPT_scamInfo[i].id_string[k + 1] =
  				    (unsigned char)ee_data;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6105

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6106
6107
  			if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
  			    (FPT_scamInfo[i].id_string[0] == 0xFF))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6108

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6109
  				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6110

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6111
6112
  			else
  				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6113

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6114
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6115
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6116
  	for (k = 0; k < ID_STRING_LENGTH; k++)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6117
  		FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6118
6119
6120
6121
6122
  
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6123
   * Function: FPT_scmachid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6124
6125
6126
6127
6128
   *
   * Description: Match the Device ID string with our values stored in
   *              the EEPROM.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6129
6130
  static unsigned char FPT_scmachid(unsigned char p_card,
  				  unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6131
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6132
  	unsigned char i, k, match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6134
  	for (i = 0; i < MAX_SCSI_TAR; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6135

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6136
  		match = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6137

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6138
6139
6140
6141
  		for (k = 0; k < ID_STRING_LENGTH; k++) {
  			if (p_id_string[k] != FPT_scamInfo[i].id_string[k])
  				match = 0;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6142

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6143
6144
  		if (match) {
  			FPT_scamInfo[i].state = ID_ASSIGNED;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6145
  			return i;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6146
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6147

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6148
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6149

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6150
6151
6152
6153
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6154

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6155
6156
6157
6158
6159
  	if (((p_id_string[0] & 0x06) == 0x02)
  	    || ((p_id_string[0] & 0x06) == 0x04))
  		match = p_id_string[1] & (unsigned char)0x1F;
  	else
  		match = 7;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6160

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6161
6162
  	while (i > 0) {
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6163

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6164
6165
6166
6167
6168
  		if (FPT_scamInfo[match].state == ID_UNUSED) {
  			for (k = 0; k < ID_STRING_LENGTH; k++) {
  				FPT_scamInfo[match].id_string[k] =
  				    p_id_string[k];
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6169

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6170
  			FPT_scamInfo[match].state = ID_ASSIGNED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6171

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6172
6173
6174
  			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_UPDATE_EEPROM;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6175
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6176

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6177
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6178

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6179
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6180

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6181
6182
6183
6184
6185
6186
  		if (match == 0xFF) {
  			if (p_id_string[0] & BIT(5))
  				match = 7;
  			else
  				match = MAX_SCSI_TAR - 1;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6187
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6188

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6189
  	if (p_id_string[0] & BIT(7)) {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6190
  		return CLR_PRIORITY;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6191
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6192

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6193
6194
6195
6196
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6198
6199
6200
6201
6202
  	if (((p_id_string[0] & 0x06) == 0x02)
  	    || ((p_id_string[0] & 0x06) == 0x04))
  		match = p_id_string[1] & (unsigned char)0x1F;
  	else
  		match = 7;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6203

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6204
  	while (i > 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6205

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6206
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6207

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6208
6209
6210
6211
6212
  		if (FPT_scamInfo[match].state == ID_UNASSIGNED) {
  			for (k = 0; k < ID_STRING_LENGTH; k++) {
  				FPT_scamInfo[match].id_string[k] =
  				    p_id_string[k];
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6213

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6214
6215
6216
6217
6218
  			FPT_scamInfo[match].id_string[0] |= BIT(7);
  			FPT_scamInfo[match].state = ID_ASSIGNED;
  			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_UPDATE_EEPROM;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6219
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6220

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6221
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6222

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6223
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6224

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6225
6226
6227
6228
6229
6230
  		if (match == 0xFF) {
  			if (p_id_string[0] & BIT(5))
  				match = 7;
  			else
  				match = MAX_SCSI_TAR - 1;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6231
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6232

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6233
  	return NO_ID_AVAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6234
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6235
6236
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6237
   * Function: FPT_scsavdi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6238
6239
6240
6241
   *
   * Description: Save off the device SCAM ID strings.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
6242
  static void FPT_scsavdi(unsigned char p_card, unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6243
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6244
6245
  	unsigned char i, k, max_id;
  	unsigned short ee_data, sum_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6246

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6247
  	sum_data = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6248

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6249
6250
6251
  	for (i = 1; i < EE_SCAMBASE / 2; i++) {
  		sum_data += FPT_utilEERead(p_port, i);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6252

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6253
  	FPT_utilEEWriteOnOff(p_port, 1);	/* Enable write access to the EEPROM */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6254

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6255
6256
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6257

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6258
6259
6260
6261
6262
6263
6264
6265
6266
6267
6268
6269
6270
6271
6272
6273
  	else
  		max_id = 0x10;
  
  	for (i = 0; i < max_id; i++) {
  
  		for (k = 0; k < ID_STRING_LENGTH; k += 2) {
  			ee_data = FPT_scamInfo[i].id_string[k + 1];
  			ee_data <<= 8;
  			ee_data |= FPT_scamInfo[i].id_string[k];
  			sum_data += ee_data;
  			FPT_utilEEWrite(p_port, ee_data,
  					(unsigned short)((EE_SCAMBASE / 2) +
  							 (unsigned short)(i *
  									  ((unsigned short)ID_STRING_LENGTH / 2)) + (unsigned short)(k / 2)));
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6274

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6275
6276
  	FPT_utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM / 2);
  	FPT_utilEEWriteOnOff(p_port, 0);	/* Turn off write access */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6277
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6278
6279
6280
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6281
   * Function: FPT_XbowInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6282
6283
6284
6285
   *
   * Description: Setup the Xbow for normal operation.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
6286
  static void FPT_XbowInit(unsigned long port, unsigned char ScamFlg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6287
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6288
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6289

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6290
6291
  	i = RD_HARPOON(port + hp_page_ctrl);
  	WR_HARPOON(port + hp_page_ctrl, (unsigned char)(i | G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6292

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6293
6294
  	WR_HARPOON(port + hp_scsireset, 0x00);
  	WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6295

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6296
6297
  	WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
  					 FIFO_CLR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6298

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6299
  	WR_HARPOON(port + hp_scsireset, SCSI_INI);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6300

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6301
  	WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6302

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6303
6304
  	WR_HARPOON(port + hp_scsisig, 0x00);	/*  Clear any signals we might */
  	WR_HARPOON(port + hp_scsictrl_0, ENA_SCAM_SEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6305

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6306
  	WRW_HARPOON((port + hp_intstat), CLR_ALL_INT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6307

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6308
6309
  	FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
  	    BUS_FREE | XFER_CNT_0 | AUTO_INT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6310

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6311
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6312
  		FPT_default_intena |= SCAM_SEL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6313

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6314
  	WRW_HARPOON((port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6315

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6316
  	WR_HARPOON(port + hp_seltimeout, TO_290ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6317

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6318
6319
6320
6321
  	/* Turn on SCSI_MODE8 for narrow cards to fix the
  	   strapping issue with the DUAL CHANNEL card */
  	if (RD_HARPOON(port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		WR_HARPOON(port + hp_addstat, SCSI_MODE8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6322

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6323
  	WR_HARPOON(port + hp_page_ctrl, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6324
6325
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6326
6327
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6328
   * Function: FPT_BusMasterInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6329
6330
6331
6332
   *
   * Description: Initialize the BusMaster for normal operations.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
6333
  static void FPT_BusMasterInit(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6334
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6335
6336
  	WR_HARPOON(p_port + hp_sys_ctrl, DRVR_RST);
  	WR_HARPOON(p_port + hp_sys_ctrl, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6337

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6338
  	WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6339

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6340
  	WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6341

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6342
  	WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6343

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6344
6345
6346
6347
  	RD_HARPOON(p_port + hp_int_status);	/*Clear interrupts. */
  	WR_HARPOON(p_port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
  	WR_HARPOON(p_port + hp_page_ctrl, (RD_HARPOON(p_port + hp_page_ctrl) &
  					   ~SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6348
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6349
6350
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6351
   * Function: FPT_DiagEEPROM
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6352
6353
6354
6355
6356
   *
   * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
   *              necessary.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
6357
  static void FPT_DiagEEPROM(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6358
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6359
  	unsigned short index, temp, max_wd_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6360

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6361
6362
6363
6364
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_wd_cnt = EEPROM_WD_CNT;
  	else
  		max_wd_cnt = EEPROM_WD_CNT * 2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6365

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6366
  	temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6367

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6368
  	if (temp == 0x4641) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6369

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6370
  		for (index = 2; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6371

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6372
  			temp += FPT_utilEERead(p_port, index);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6373

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6374
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6375

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6376
  		if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6377

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6378
6379
6380
  			return;	/*EEPROM is Okay so return now! */
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6381

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6382
  	FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6383

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6384
  	for (index = 0; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6385

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6386
6387
  		FPT_utilEEWrite(p_port, 0x0000, index);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6388

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
  	temp = 0;
  
  	FPT_utilEEWrite(p_port, 0x4641, FW_SIGNATURE / 2);
  	temp += 0x4641;
  	FPT_utilEEWrite(p_port, 0x3920, MODEL_NUMB_0 / 2);
  	temp += 0x3920;
  	FPT_utilEEWrite(p_port, 0x3033, MODEL_NUMB_2 / 2);
  	temp += 0x3033;
  	FPT_utilEEWrite(p_port, 0x2020, MODEL_NUMB_4 / 2);
  	temp += 0x2020;
  	FPT_utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG / 2);
  	temp += 0x70D3;
  	FPT_utilEEWrite(p_port, 0x0010, BIOS_CONFIG / 2);
  	temp += 0x0010;
  	FPT_utilEEWrite(p_port, 0x0003, SCAM_CONFIG / 2);
  	temp += 0x0003;
  	FPT_utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID / 2);
  	temp += 0x0007;
  
  	FPT_utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN / 2);
  	temp += 0x0000;
  	FPT_utilEEWrite(p_port, 0x0000, SEND_START_ENA / 2);
  	temp += 0x0000;
  	FPT_utilEEWrite(p_port, 0x0000, DEVICE_ENABLE / 2);
  	temp += 0x0000;
  
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01 / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23 / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45 / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67 / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89 / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd / 2);
  	temp += 0x4242;
  	FPT_utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef / 2);
  	temp += 0x4242;
  
  	FPT_utilEEWrite(p_port, 0x6C46, 64 / 2);	/*PRODUCT ID */
  	temp += 0x6C46;
  	FPT_utilEEWrite(p_port, 0x7361, 66 / 2);	/* FlashPoint LT   */
  	temp += 0x7361;
  	FPT_utilEEWrite(p_port, 0x5068, 68 / 2);
  	temp += 0x5068;
  	FPT_utilEEWrite(p_port, 0x696F, 70 / 2);
  	temp += 0x696F;
  	FPT_utilEEWrite(p_port, 0x746E, 72 / 2);
  	temp += 0x746E;
  	FPT_utilEEWrite(p_port, 0x4C20, 74 / 2);
  	temp += 0x4C20;
  	FPT_utilEEWrite(p_port, 0x2054, 76 / 2);
  	temp += 0x2054;
  	FPT_utilEEWrite(p_port, 0x2020, 78 / 2);
  	temp += 0x2020;
  
  	index = ((EE_SCAMBASE / 2) + (7 * 16));
  	FPT_utilEEWrite(p_port, (0x0700 + TYPE_CODE0), index);
  	temp += (0x0700 + TYPE_CODE0);
  	index++;
  	FPT_utilEEWrite(p_port, 0x5542, index);	/*Vendor ID code */
  	temp += 0x5542;		/* BUSLOGIC      */
  	index++;
  	FPT_utilEEWrite(p_port, 0x4C53, index);
  	temp += 0x4C53;
  	index++;
  	FPT_utilEEWrite(p_port, 0x474F, index);
  	temp += 0x474F;
  	index++;
  	FPT_utilEEWrite(p_port, 0x4349, index);
  	temp += 0x4349;
  	index++;
  	FPT_utilEEWrite(p_port, 0x5442, index);	/*Vendor unique code */
  	temp += 0x5442;		/* BT- 930           */
  	index++;
  	FPT_utilEEWrite(p_port, 0x202D, index);
  	temp += 0x202D;
  	index++;
  	FPT_utilEEWrite(p_port, 0x3339, index);
  	temp += 0x3339;
  	index++;		/*Serial #          */
  	FPT_utilEEWrite(p_port, 0x2030, index);	/* 01234567         */
  	temp += 0x2030;
  	index++;
  	FPT_utilEEWrite(p_port, 0x5453, index);
  	temp += 0x5453;
  	index++;
  	FPT_utilEEWrite(p_port, 0x5645, index);
  	temp += 0x5645;
  	index++;
  	FPT_utilEEWrite(p_port, 0x2045, index);
  	temp += 0x2045;
  	index++;
  	FPT_utilEEWrite(p_port, 0x202F, index);
  	temp += 0x202F;
  	index++;
  	FPT_utilEEWrite(p_port, 0x4F4A, index);
  	temp += 0x4F4A;
  	index++;
  	FPT_utilEEWrite(p_port, 0x204E, index);
  	temp += 0x204E;
  	index++;
  	FPT_utilEEWrite(p_port, 0x3539, index);
  	temp += 0x3539;
  
  	FPT_utilEEWrite(p_port, temp, EEPROM_CHECK_SUM / 2);
  
  	FPT_utilEEWriteOnOff(p_port, (unsigned char)0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6501
6502
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6503
6504
6505
6506
6507
6508
6509
  /*---------------------------------------------------------------------
   *
   * Function: Queue Search Select
   *
   * Description: Try to find a new command to execute.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6510
6511
  static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
  				  unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6512
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6513
6514
6515
  	unsigned char scan_ptr, lun;
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct sccb *pOldSccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6516

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6517
6518
  	scan_ptr = pCurrCard->scanIndex;
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6519
  		currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6520
6521
6522
6523
  		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
  		    ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
  		     TAG_Q_TRYING)) {
  			if (currTar_Info->TarSelQ_Cnt != 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6524
6525
6526
6527
  
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR)
  					scan_ptr = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6528

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6529
6530
6531
6532
6533
  				for (lun = 0; lun < MAX_LUN; lun++) {
  					if (currTar_Info->TarLUNBusy[lun] == 0) {
  
  						pCurrCard->currentSCCB =
  						    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6534
  						pOldSccb = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
  						while ((pCurrCard->
  							currentSCCB != NULL)
  						       && (lun !=
  							   pCurrCard->
  							   currentSCCB->Lun)) {
  							pOldSccb =
  							    pCurrCard->
  							    currentSCCB;
  							pCurrCard->currentSCCB =
  							    (struct sccb
  							     *)(pCurrCard->
  								currentSCCB)->
  							    Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6548
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6549
6550
  						if (pCurrCard->currentSCCB ==
  						    NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6551
  							continue;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
6585
6586
6587
6588
6589
6590
6591
6592
  						if (pOldSccb != NULL) {
  							pOldSccb->
  							    Sccb_forwardlink =
  							    (struct sccb
  							     *)(pCurrCard->
  								currentSCCB)->
  							    Sccb_forwardlink;
  							pOldSccb->
  							    Sccb_backlink =
  							    (struct sccb
  							     *)(pCurrCard->
  								currentSCCB)->
  							    Sccb_backlink;
  							currTar_Info->
  							    TarSelQ_Cnt--;
  						} else {
  							currTar_Info->
  							    TarSelQ_Head =
  							    (struct sccb
  							     *)(pCurrCard->
  								currentSCCB)->
  							    Sccb_forwardlink;
  
  							if (currTar_Info->
  							    TarSelQ_Head ==
  							    NULL) {
  								currTar_Info->
  								    TarSelQ_Tail
  								    = NULL;
  								currTar_Info->
  								    TarSelQ_Cnt
  								    = 0;
  							} else {
  								currTar_Info->
  								    TarSelQ_Cnt--;
  								currTar_Info->
  								    TarSelQ_Head->
  								    Sccb_backlink
  								    =
  								    (struct sccb
  								     *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6593
6594
  							}
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6595
  						pCurrCard->scanIndex = scan_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6596

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6597
6598
  						pCurrCard->globalFlags |=
  						    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6599

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6600
  						break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6601
6602
6603
  					}
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6604
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6605
6606
6607
6608
6609
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR) {
  					scan_ptr = 0;
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6610
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6611
  			if ((currTar_Info->TarSelQ_Cnt != 0) &&
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6612
  			    (currTar_Info->TarLUNBusy[0] == 0)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6613

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6614
6615
  				pCurrCard->currentSCCB =
  				    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6616

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6617
6618
6619
  				currTar_Info->TarSelQ_Head =
  				    (struct sccb *)(pCurrCard->currentSCCB)->
  				    Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6620

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6621
  				if (currTar_Info->TarSelQ_Head == NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6622
6623
  					currTar_Info->TarSelQ_Tail = NULL;
  					currTar_Info->TarSelQ_Cnt = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6624
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6625
  					currTar_Info->TarSelQ_Cnt--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6626
6627
  					currTar_Info->TarSelQ_Head->
  					    Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6628
6629
6630
6631
6632
6633
6634
6635
6636
6637
6638
6639
  				}
  
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR)
  					scan_ptr = 0;
  
  				pCurrCard->scanIndex = scan_ptr;
  
  				pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
  
  				break;
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6640
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6641
  				scan_ptr++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6642
  				if (scan_ptr == MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6643
6644
6645
6646
6647
6648
  					scan_ptr = 0;
  				}
  			}
  		}
  	} while (scan_ptr != pCurrCard->scanIndex);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6649
6650
6651
6652
6653
6654
6655
  /*---------------------------------------------------------------------
   *
   * Function: Queue Select Fail
   *
   * Description: Add the current SCCB to the head of the Queue.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6656
6657
  static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
  				unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6658
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6659
6660
  	unsigned char thisTarg;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6661

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6662
6663
6664
6665
6666
  	if (pCurrCard->currentSCCB != NULL) {
  		thisTarg =
  		    (unsigned char)(((struct sccb *)(pCurrCard->currentSCCB))->
  				    TargID);
  		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6667

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6668
  		pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6669

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6670
6671
  		pCurrCard->currentSCCB->Sccb_forwardlink =
  		    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6672

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6673
6674
6675
  		if (currTar_Info->TarSelQ_Cnt == 0) {
  			currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6676

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6677
6678
6679
6680
  		else {
  			currTar_Info->TarSelQ_Head->Sccb_backlink =
  			    pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6681

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6682
  		currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6683

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6684
6685
6686
  		pCurrCard->currentSCCB = NULL;
  		currTar_Info->TarSelQ_Cnt++;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6687
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6688

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6689
6690
6691
6692
6693
6694
6695
  /*---------------------------------------------------------------------
   *
   * Function: Queue Command Complete
   *
   * Description: Call the callback function with the current SCCB.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6696
6697
  static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
  				 struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6698
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
  	unsigned char i, SCSIcmd;
  	CALL_BK_FN callback;
  	struct sccb_mgr_tar_info *currTar_Info;
  
  	SCSIcmd = p_sccb->Cdb[0];
  
  	if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
  
  		if ((p_sccb->
  		     ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN))
  		    && (p_sccb->HostStatus == SCCB_COMPLETE)
  		    && (p_sccb->TargetStatus != SSCHECK))
  
  			if ((SCSIcmd == SCSI_READ) ||
  			    (SCSIcmd == SCSI_WRITE) ||
  			    (SCSIcmd == SCSI_READ_EXTENDED) ||
  			    (SCSIcmd == SCSI_WRITE_EXTENDED) ||
  			    (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
  			    (SCSIcmd == SCSI_START_STOP_UNIT) ||
  			    (pCurrCard->globalFlags & F_NO_FILTER)
  			    )
  				p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6722

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6723
6724
6725
6726
6727
  	if (p_sccb->SccbStatus == SCCB_IN_PROCESS) {
  		if (p_sccb->HostStatus || p_sccb->TargetStatus)
  			p_sccb->SccbStatus = SCCB_ERROR;
  		else
  			p_sccb->SccbStatus = SCCB_SUCCESS;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6728
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6729
  	if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6730

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6731
6732
6733
6734
6735
  		p_sccb->CdbLength = p_sccb->Save_CdbLen;
  		for (i = 0; i < 6; i++) {
  			p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6736

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6737
6738
  	if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
  	    (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6739

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6740
6741
  		FPT_utilUpdateResidual(p_sccb);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6742

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6743
6744
  	pCurrCard->cmdCounter--;
  	if (!pCurrCard->cmdCounter) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6745

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6746
6747
6748
6749
6750
  		if (pCurrCard->globalFlags & F_GREEN_PC) {
  			WR_HARPOON(pCurrCard->ioPort + hp_clkctrl_0,
  				   (PWR_DWN | CLKCTRL_DEFAULT));
  			WR_HARPOON(pCurrCard->ioPort + hp_sys_ctrl, STOP_CLK);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6751

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6752
6753
6754
  		WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
  			   (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
  			    ~SCCB_MGR_ACTIVE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6755

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6756
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6757

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6758
6759
6760
6761
6762
  	if (pCurrCard->discQCount != 0) {
  		currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
  		if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
  		     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) !=
  		      TAG_Q_TRYING))) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6763
  			pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6764
6765
6766
6767
  			pCurrCard->discQ_Tbl[currTar_Info->
  					     LunDiscQ_Idx[p_sccb->Lun]] = NULL;
  		} else {
  			if (p_sccb->Sccb_tag) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6768
6769
  				pCurrCard->discQCount--;
  				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6770
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6771
  				pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6772
6773
  				pCurrCard->discQ_Tbl[currTar_Info->
  						     LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6774
6775
6776
6777
  			}
  		}
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6778
6779
6780
6781
  	callback = (CALL_BK_FN) p_sccb->SccbCallback;
  	callback(p_sccb);
  	pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
  	pCurrCard->currentSCCB = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6782
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6783

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6784
6785
6786
6787
6788
6789
6790
  /*---------------------------------------------------------------------
   *
   * Function: Queue Disconnect
   *
   * Description: Add SCCB to our disconnect array.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6791
  static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6792
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6793
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6794

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6795
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6796

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
  	if (((FPT_BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
  	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
  		FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
  					      LunDiscQ_Idx[p_sccb->Lun]] =
  		    p_sccb;
  	} else {
  		if (p_sccb->Sccb_tag) {
  			FPT_BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] =
  			    p_sccb;
  			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] =
  			    0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6808
  			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6809
6810
6811
  		} else {
  			FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
  						      LunDiscQ_Idx[0]] = p_sccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6812
6813
  		}
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6814
  	FPT_BL_Card[p_card].currentSCCB = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6815
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6816
6817
6818
6819
6820
6821
6822
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6823
  static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6824
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6825
6826
6827
  	unsigned char qtag, thisTarg;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6828

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6829
6830
6831
6832
6833
6834
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	if (currSCCB != NULL) {
  		thisTarg = (unsigned char)currSCCB->TargID;
  		currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
  
  		for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6835

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6836
6837
6838
  			if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
  			    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID ==
  			     thisTarg)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6839

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6840
6841
  				FPT_BL_Card[p_card].discQ_Tbl[qtag]->
  				    HostStatus = (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6842

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6843
6844
6845
  				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
  						     FPT_BL_Card[p_card].
  						     discQ_Tbl[qtag], p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6846

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6847
6848
  				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  				currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6849

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6850
6851
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
  	}
  
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush Target SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6863
6864
  static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
  				   unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6865
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6866
6867
  	unsigned char qtag;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6868

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6869
  	currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6870

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6871
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6872

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6873
6874
  		if (FPT_BL_Card[p_card].discQ_Tbl[qtag] &&
  		    (FPT_BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6875

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6876
6877
  			FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
  			    (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6878

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6879
6880
6881
  			FPT_queueCmdComplete(&FPT_BL_Card[p_card],
  					     FPT_BL_Card[p_card].
  					     discQ_Tbl[qtag], p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6882

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6883
6884
  			FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  			currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6885

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6886
6887
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6888
6889
  
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6890
  static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6891
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6892
6893
  	struct sccb_mgr_tar_info *currTar_Info;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6894

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6895
  	p_SCCB->Sccb_forwardlink = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6896

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6897
  	p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6898

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6899
  	if (currTar_Info->TarSelQ_Cnt == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6900

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6901
6902
  		currTar_Info->TarSelQ_Head = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6903

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6904
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6905

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6906
6907
  		currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6908

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6909
6910
  	currTar_Info->TarSelQ_Tail = p_SCCB;
  	currTar_Info->TarSelQ_Cnt++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6911
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6912
6913
6914
6915
6916
6917
6918
6919
  /*---------------------------------------------------------------------
   *
   * Function: Queue Find SCCB
   *
   * Description: Search the target select Queue for this SCCB, and
   *              remove it if found.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6920
6921
  static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
  				       unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6922
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6923
6924
  	struct sccb *q_ptr;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6925

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6926
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6927

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6928
  	q_ptr = currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6929

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6930
  	while (q_ptr != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6931

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6932
  		if (q_ptr == p_SCCB) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6933

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6934
  			if (currTar_Info->TarSelQ_Head == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6935

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6936
6937
  				currTar_Info->TarSelQ_Head =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6938
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6939
  			if (currTar_Info->TarSelQ_Tail == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6940

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6941
6942
  				currTar_Info->TarSelQ_Tail =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6943
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6944
6945
6946
  			if (q_ptr->Sccb_forwardlink != NULL) {
  				q_ptr->Sccb_forwardlink->Sccb_backlink =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6947
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6948
6949
6950
  			if (q_ptr->Sccb_backlink != NULL) {
  				q_ptr->Sccb_backlink->Sccb_forwardlink =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6951
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6952
  			currTar_Info->TarSelQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6953

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6954
  			return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6955
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6956

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6957
6958
6959
6960
  		else {
  			q_ptr = q_ptr->Sccb_forwardlink;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6961

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6962
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6963
6964
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6965
6966
6967
6968
6969
6970
6971
6972
6973
6974
6975
6976
  /*---------------------------------------------------------------------
   *
   * Function: Utility Update Residual Count
   *
   * Description: Update the XferCnt to the remaining byte count.
   *              If we transferred all the data then just write zero.
   *              If Non-SG transfer then report Total Cnt - Actual Transfer
   *              Cnt.  For SG transfers add the count fields of all
   *              remaining SG elements, as well as any partial remaining
   *              element.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6977
  static void FPT_utilUpdateResidual(struct sccb *p_SCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6978
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6979
6980
6981
  	unsigned long partial_cnt;
  	unsigned int sg_index;
  	unsigned long *sg_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6982

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6983
  	if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6984

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6985
6986
  		p_SCCB->DataLength = 0x0000;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6987

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6988
  	else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6989

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6990
  		partial_cnt = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6991

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6992
  		sg_index = p_SCCB->Sccb_sgseg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6993

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6994
  		sg_ptr = (unsigned long *)p_SCCB->DataPointer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6995

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6996
  		if (p_SCCB->Sccb_SGoffset) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6997
6998
6999
  
  			partial_cnt = p_SCCB->Sccb_SGoffset;
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7000
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7001

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7002
7003
  		while (((unsigned long)sg_index *
  			(unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7004

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7005
  			partial_cnt += *(sg_ptr + (sg_index * 2));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7006
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7007
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7008

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7009
7010
  		p_SCCB->DataLength = partial_cnt;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7011

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7012
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7013

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7014
7015
  		p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7016
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7017
7018
7019
7020
7021
7022
7023
  /*---------------------------------------------------------------------
   *
   * Function: Wait 1 Second
   *
   * Description: Wait for 1 second.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
7024
  static void FPT_Wait1Second(unsigned long p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7025
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7026
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7027

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7028
  	for (i = 0; i < 4; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7029

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7030
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7031

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7032
7033
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7034

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7035
7036
7037
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7038
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7039
7040
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7041
   * Function: FPT_Wait
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7042
7043
7044
7045
   *
   * Description: Wait the desired delay.
   *
   *---------------------------------------------------------------------*/
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
7046
  static void FPT_Wait(unsigned long p_port, unsigned char p_delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7047
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7048
7049
  	unsigned char old_timer;
  	unsigned char green_flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7050

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7051
  	old_timer = RD_HARPOON(p_port + hp_seltimeout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7052

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7053
7054
  	green_flag = RD_HARPOON(p_port + hp_clkctrl_0);
  	WR_HARPOON(p_port + hp_clkctrl_0, CLKCTRL_DEFAULT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7055

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7056
7057
7058
  	WR_HARPOON(p_port + hp_seltimeout, p_delay);
  	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
  	WRW_HARPOON((p_port + hp_intena), (FPT_default_intena & ~TIMEOUT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7059

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7060
7061
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7062

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7063
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7064

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7065
7066
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7067

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7068
7069
7070
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7071

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7072
7073
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7074

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7075
7076
  	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
  	WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7077

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7078
  	WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7079

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7080
  	WR_HARPOON(p_port + hp_seltimeout, old_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7081
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7082
7083
7084
7085
7086
7087
7088
7089
  /*---------------------------------------------------------------------
   *
   * Function: Enable/Disable Write to EEPROM
   *
   * Description: The EEPROM must first be enabled for writes
   *              A total of 9 clocks are needed.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7090
  static void FPT_utilEEWriteOnOff(unsigned long p_port, unsigned char p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7091
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7092
  	unsigned char ee_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7093

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7094
7095
7096
  	ee_value =
  	    (unsigned char)(RD_HARPOON(p_port + hp_ee_ctrl) &
  			    (EXT_ARB_ACK | SCSI_TERM_ENA_H));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7097

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7098
  	if (p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7099

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7100
  		FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7101

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7102
  	else
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7103

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7104
  		FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7105

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7106
7107
  	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7108
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7109
7110
7111
7112
7113
7114
7115
7116
  /*---------------------------------------------------------------------
   *
   * Function: Write EEPROM
   *
   * Description: Write a word to the EEPROM at the specified
   *              address.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7117
7118
  static void FPT_utilEEWrite(unsigned long p_port, unsigned short ee_data,
  			    unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7119
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7120
7121
  	unsigned char ee_value;
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7122

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7123
7124
7125
7126
  	ee_value =
  	    (unsigned
  	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
  		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7127

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7128
  	FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7129

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7130
  	ee_value |= (SEE_MS + SEE_CS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7131

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7132
  	for (i = 0x8000; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7134
7135
7136
7137
7138
7139
7140
7141
7142
7143
7144
7145
7146
7147
7148
7149
  		if (i & ee_data)
  			ee_value |= SEE_DO;
  		else
  			ee_value &= ~SEE_DO;
  
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value |= SEE_CLK;	/* Clock  data! */
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value &= ~SEE_CLK;
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  	}
  	ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
  	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7151
  	FPT_Wait(p_port, TO_10ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7152

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7153
7154
7155
  	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS));	/* Set CS to EEPROM */
  	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/* Turn off CS */
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/* Turn off Master Select */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7156
7157
7158
7159
7160
7161
7162
7163
7164
7165
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7166
7167
  static unsigned short FPT_utilEERead(unsigned long p_port,
  				     unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7168
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7169
  	unsigned short i, ee_data1, ee_data2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7170
7171
  
  	i = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7172
  	ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7173
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7174
  		ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7175

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7176
  		if (ee_data1 == ee_data2)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7177
  			return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7178
7179
7180
  
  		ee_data1 = ee_data2;
  		i++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7181
  	} while (i < 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7182

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7183
  	return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM Original 
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7194
7195
  static unsigned short FPT_utilEEReadOrg(unsigned long p_port,
  					unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7196
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7197
7198
  	unsigned char ee_value;
  	unsigned short i, ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7199

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7200
7201
7202
7203
  	ee_value =
  	    (unsigned
  	     char)((RD_HARPOON(p_port + hp_ee_ctrl) &
  		    (EXT_ARB_ACK | SCSI_TERM_ENA_H)) | (SEE_MS | SEE_CS));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7204

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7205
  	FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7206

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7207
7208
  	ee_value |= (SEE_MS + SEE_CS);
  	ee_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7209

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7210
  	for (i = 1; i <= 16; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7211

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7212
7213
7214
7215
7216
7217
  		ee_value |= SEE_CLK;	/* Clock  data! */
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value &= ~SEE_CLK;
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7218

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7219
  		ee_data <<= 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7220

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7221
7222
7223
  		if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
  			ee_data |= 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7224

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7225
7226
7227
  	ee_value &= ~(SEE_MS + SEE_CS);
  	WR_HARPOON(p_port + hp_ee_ctrl, (ee_value | SEE_MS));	/*Turn off CS */
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);	/*Turn off Master Select */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7228

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7229
  	return ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7230
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7231
7232
7233
7234
7235
7236
7237
7238
  /*---------------------------------------------------------------------
   *
   * Function: Send EE command and Address to the EEPROM
   *
   * Description: Transfers the correct command and sends the address
   *              to the eeprom.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7239
7240
  static void FPT_utilEESendCmdAddr(unsigned long p_port, unsigned char ee_cmd,
  				  unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7241
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7242
7243
  	unsigned char ee_value;
  	unsigned char narrow_flg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7245
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7246

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7247
7248
7249
  	narrow_flg =
  	    (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
  			    NARROW_SCSI_CARD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7250

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7251
7252
  	ee_value = SEE_MS;
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7253

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7254
7255
  	ee_value |= SEE_CS;	/* Set CS to EEPROM */
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7256

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7257
  	for (i = 0x04; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7258

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7259
7260
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
  		if (i & ee_cmd)
  			ee_value |= SEE_DO;
  		else
  			ee_value &= ~SEE_DO;
  
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value |= SEE_CLK;	/* Clock  data! */
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value &= ~SEE_CLK;
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7273

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7274
7275
  	if (narrow_flg)
  		i = 0x0080;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7276

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7277
7278
  	else
  		i = 0x0200;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7279

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7280
  	while (i != 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7281

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7282
7283
7284
7285
7286
7287
7288
7289
7290
7291
7292
7293
7294
7295
7296
7297
  		if (i & ee_addr)
  			ee_value |= SEE_DO;
  		else
  			ee_value &= ~SEE_DO;
  
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value |= SEE_CLK;	/* Clock  data! */
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		ee_value &= ~SEE_CLK;
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  		WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
  
  		i >>= 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7298
  }
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
7299
  static unsigned short FPT_CalcCrc16(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7300
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7301
7302
7303
7304
7305
7306
7307
7308
7309
7310
7311
7312
7313
  	unsigned short crc = 0;
  	int i, j;
  	unsigned short ch;
  	for (i = 0; i < ID_STRING_LENGTH; i++) {
  		ch = (unsigned short)buffer[i];
  		for (j = 0; j < 8; j++) {
  			if ((crc ^ ch) & 1)
  				crc = (crc >> 1) ^ CRCMASK;
  			else
  				crc >>= 1;
  			ch >>= 1;
  		}
  	}
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7314
  	return crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7315
  }
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7316
  static unsigned char FPT_CalcLrc(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7317
7318
  {
  	int i;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7319
  	unsigned char lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7320
  	lrc = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7321
  	for (i = 0; i < ID_STRING_LENGTH; i++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7322
  		lrc ^= buffer[i];
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7323
  	return lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7324
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7325
7326
7327
7328
7329
7330
7331
  /*
    The following inline definitions avoid type conflicts.
  */
  
  static inline unsigned char
  FlashPoint__ProbeHostAdapter(struct FlashPoint_Info *FlashPointInfo)
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7332
7333
  	return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
  					   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7334
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7335
7336
7337
  static inline FlashPoint_CardHandle_T
  FlashPoint__HardwareResetHostAdapter(struct FlashPoint_Info *FlashPointInfo)
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7338
7339
  	return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
  						   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7340
7341
7342
7343
7344
  }
  
  static inline void
  FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7345
  	FlashPoint_ReleaseHostAdapter(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7346
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7347
  static inline void
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7348
7349
  FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle,
  		     struct BusLogic_CCB *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7350
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7351
  	FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7352
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7353
  static inline void
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7354
7355
  FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle,
  		     struct BusLogic_CCB *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7356
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7357
  	FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7358
  }
2065e310c   Richard Knutsson   [SCSI] BusLogic: ...
7359
  static inline bool
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7360
7361
  FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7362
  	return FlashPoint_InterruptPending(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7363
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7364
7365
7366
  static inline int
  FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7367
  	return FlashPoint_HandleInterrupt(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7368
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7369
7370
7371
7372
7373
7374
7375
  #define FlashPoint_ProbeHostAdapter	    FlashPoint__ProbeHostAdapter
  #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
  #define FlashPoint_ReleaseHostAdapter	    FlashPoint__ReleaseHostAdapter
  #define FlashPoint_StartCCB		    FlashPoint__StartCCB
  #define FlashPoint_AbortCCB		    FlashPoint__AbortCCB
  #define FlashPoint_InterruptPending	    FlashPoint__InterruptPending
  #define FlashPoint_HandleInterrupt	    FlashPoint__HandleInterrupt
78b4b05db   Matthew Wilcox   [SCSI] BusLogic: ...
7376
  #else				/* !CONFIG_SCSI_FLASHPOINT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7377
7378
7379
7380
7381
7382
7383
  
  /*
    Define prototypes for the FlashPoint SCCB Manager Functions.
  */
  
  extern unsigned char FlashPoint_ProbeHostAdapter(struct FlashPoint_Info *);
  extern FlashPoint_CardHandle_T
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7384
  FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7385
7386
  extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
  extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
2065e310c   Richard Knutsson   [SCSI] BusLogic: ...
7387
  extern bool FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7388
7389
  extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
  extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7390

78b4b05db   Matthew Wilcox   [SCSI] BusLogic: ...
7391
  #endif				/* CONFIG_SCSI_FLASHPOINT */