Blame view

drivers/scsi/FlashPoint.c 193 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 {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
28
  	u32 si_baseaddr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
29
30
31
32
  	unsigned char si_present;
  	unsigned char si_intvect;
  	unsigned char si_id;
  	unsigned char si_lun;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
33
34
35
36
37
38
39
  	u16 si_fw_revision;
  	u16 si_per_targ_init_sync;
  	u16 si_per_targ_fast_nego;
  	u16 si_per_targ_ultra_nego;
  	u16 si_per_targ_no_disc;
  	u16 si_per_targ_wide_nego;
  	u16 si_flags;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
40
41
42
43
44
  	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];
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
45
  	u32 si_OS_reserved;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
46
  	unsigned char si_XlatInfo[4];
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
47
48
  	u32 si_reserved2[5];
  	u32 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' 
   */
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
66
  /*#pragma pack(1)*/
69eb2ea47   Alexey Dobriyan   [SCSI] drivers/sc...
67
  struct sccb {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
68
69
70
71
  	unsigned char OperationCode;
  	unsigned char ControlByte;
  	unsigned char CdbLength;
  	unsigned char RequestSenseLength;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
72
73
  	u32 DataLength;
  	void *DataPointer;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
74
75
76
77
78
79
80
81
  	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;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
82
83
  	u32 Reserved2;
  	u32 SensePointer;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
84
85
  
  	CALL_BK_FN SccbCallback;	/* VOID (*SccbCallback)(); */
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
86
  	u32 SccbIOPort;			/* Identifies board base port */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
87
88
  	unsigned char SccbStatus;
  	unsigned char SCCBRes2;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
89
90
91
92
93
94
95
96
  	u16 SccbOSFlags;
  
  	u32 Sccb_XferCnt;	/* actual transfer count */
  	u32 Sccb_ATC;
  	u32 SccbVirtDataPtr;	/* virtual addr for OS/2 */
  	u32 Sccb_res1;
  	u16 Sccb_MGRFlags;
  	u16 Sccb_sgseg;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
97
98
99
100
101
102
  	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;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
103
  	u32 Sccb_savedATC;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
104
105
106
  	unsigned char Save_Cdb[6];
  	unsigned char Save_CdbLen;
  	unsigned char Sccb_XferState;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
107
  	u32 Sccb_SGoffset;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
108
  };
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 {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
  	unsigned char niModel;		/* Model No. of card */
  	unsigned char niCardNo;		/* Card no. */
  	u32 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...
226
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
227

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
230
231
  #define	MODEL_LT		1
  #define	MODEL_DL		2
  #define	MODEL_LW		3
  #define	MODEL_DW		4
13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
232
  struct sccb_card {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
233
234
  	struct sccb *currentSCCB;
  	struct sccb_mgr_info *cardInfo;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
235
  	u32 ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
237
238
239
240
241
242
243
244
245
  	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
246

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
247
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
248
249
250
251
252
253
254
255
256
  
  #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
257
  #define  ID_STRING_LENGTH  32
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
258
  #define  TYPE_CODE0        0x63	/*Level2 Mstr (bits 7-6),  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
259

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
260
  #define  SLV_TYPE_CODE0    0xA3	/*Priority Bit set (bits 7-6),  */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
261
262
263
264
265
266
267
268
269
  
  #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
270
271
  #define  MISC_CODE   0x14
  #define  CLR_P_FLAG  0x18
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
273
274
  #define  INIT_SELTD  0x01
  #define  LEVEL2_TAR  0x02
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
275
276
277
278
279
  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
280
281
  
  typedef struct SCCBscam_info {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
282
283
  	unsigned char id_string[ID_STRING_LENGTH];
  	enum scam_id_st state;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  #define  SCSI_REQUEST_SENSE      0x03
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
289
  #define  SCSI_READ               0x08
  #define  SCSI_WRITE              0x0A
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
  #define  SCSI_START_STOP_UNIT    0x1B
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
292
  #define  SCSI_READ_EXTENDED      0x28
  #define  SCSI_WRITE_EXTENDED     0x2A
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  #define  SCSI_WRITE_AND_VERIFY   0x2E
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
295
296
  #define  SSGOOD                  0x00
  #define  SSCHECK                 0x02
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
297
  #define  SSQ_FULL                0x28
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
298
299
300
301
302
  #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
303
304
305
306
307
308
309
310
311
312
313
  #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
314
  #define  SMSYNC                  0x01
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
316
317
  #define  SMWDTR                  0x03
  #define  SM8BIT                  0x00
  #define  SM16BIT                 0x01
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
318
  #define  SMIGNORWR               0x23	/* Ignore Wide Residue */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
319
320
  
  #define  SIX_BYTE_CMD            0x06
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
322
323
  #define  TWELVE_BYTE_CMD         0x0C
  
  #define  ASYNC                   0x00
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
324
  #define  MAX_OFFSET              0x0F	/* Maxbyteoffset for Sync Xfers */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
326
327
328
329
330
  
  #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
331
  #define  MODEL_NUMB_2      6
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
  #define  MODEL_NUMB_4      8
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
333
334
335
  #define  SYSTEM_CONFIG     16
  #define  SCSI_CONFIG       17
  #define  BIOS_CONFIG       18
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
337
  #define  SCAM_CONFIG       20
  #define  ADAPTER_SCSI_ID   24
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
338
339
340
341
342
343
344
345
346
347
348
349
350
  #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...
351
  #define  EE_SCAMBASE      256
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
352

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

1cafc30f4   Jiri Slaby   FlashPoint, use B...
356
357
358
  #define	RENEGO_ENA		BIT(10)
  #define	CONNIO_ENA		BIT(11)
  #define  GREEN_PC_ENA   BIT(12)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
360
361
362
363
  #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
364

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
385
386
387
388
389
  #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
390

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
393
394
395
396
  #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
397

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
406
407
  #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
408

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
409
410
411
  #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
412

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
413
414
  #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
415

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
422
423
  #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
424

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
430
431
432
433
434
435
436
  #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
437

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
438
439
440
441
442
443
  #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
444

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
447
448
449
450
  #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
451

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
457
458
459
460
  #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
461

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
473
474
475
476
477
478
479
480
  #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
481
                                    BM_PARITY_ERR | PIO_OVERRUN)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
482
483
484
485
486
487
488
489
490
  #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...
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
  #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...
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
533
534
535
536
537
  #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
538

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
541
542
543
544
545
546
547
548
  #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
549

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
552
553
554
555
556
557
  #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
558

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
565
566
567
  #define  SCAM_TIMER        BIT(7)
  #define  SCSI_MODE8        BIT(3)
  #define  SCSI_PAR_ERR      BIT(0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
568

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
571
572
573
  #define  hp_selfid_0          0x50
  #define  hp_selfid_1          0x51
  #define  hp_arb_id            0x52
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
574

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
577
578
579
580
581
  #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
582

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
583
584
585
586
  #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
587

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
588
589
590
591
  #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
592

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
593
594
595
596
  #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
597

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
601
602
603
  #define  hp_autostart_0       0x64
  #define  hp_autostart_1       0x65
  #define  hp_autostart_3       0x67
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
604

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
605
606
607
  #define  AUTO_IMMED    BIT(5)
  #define  SELECT   BIT(6)
  #define  END_DATA (BIT(7)+BIT(6))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
608

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
609
610
611
  #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
612

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
617
618
619
620
  #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
621

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
624
625
626
  #define  PWR_DWN           BIT(6)
  #define  ACTdeassert       BIT(4)
  #define  CLK_40MHZ         (BIT(1) + BIT(0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
627

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
650
651
652
  #define  hp_aramBase          0x80
  #define  BIOS_DATA_OFFSET     0x60
  #define  BIOS_RELATIVE_CARD   0x64
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
653

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
665
  #define  ADATA_OUT   0x00
1cafc30f4   Jiri Slaby   FlashPoint, use B...
666
667
668
669
670
  #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
671

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
688
689
690
  #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
691

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
702
703
704
  #define  SSI_IUNKWN	(IUNKWN >> 8)
  #define  SSI_INO_CC	(IUNKWN >> 8)
  #define  SSI_IRFAIL	(IUNKWN >> 8)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
705

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
706
707
708
709
710
711
712
713
714
715
716
  #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
717

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
718
719
720
721
  #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
722

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
723
724
725
726
727
  #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
728
729
730
731
  
  #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...
732
                                   xfercnt |= RDW_HARPOON((unsigned short)(port+hp_xfercnt_0)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
733
   */
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
734
  #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
735
           addr >>= 16,\
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
736
           WRW_HARPOON((port+hp_host_addr_hmi), (unsigned short)(addr & 0x0000FFFFL)),\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
737
           WR_HARP32(port,hp_xfercnt_0,count),\
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
738
           WRW_HARPOON((port+hp_xfer_cnt_lo), (unsigned short)(count & 0x0000FFFFL)),\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
739
740
           count >>= 16,\
           WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
741
742
743
  
  #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
744
745
  #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
746
747
748
749
750
751
752
753
754
755
756
757
758
759
  #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)))
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
760
  static unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
761
  				 unsigned char syncFlag);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
762
763
  static void FPT_ssel(u32 port, unsigned char p_card);
  static void FPT_sres(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
764
  		     struct sccb_card *pCurrCard);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
765
  static void FPT_shandem(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
766
  			struct sccb *pCurrSCCB);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
767
768
  static void FPT_stsyncn(u32 port, unsigned char p_card);
  static void FPT_sisyncr(u32 port, unsigned char sync_pulse,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
769
  			unsigned char offset);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
770
  static void FPT_sssyncv(u32 p_port, unsigned char p_id,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
771
772
  			unsigned char p_sync_value,
  			struct sccb_mgr_tar_info *currTar_Info);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
773
774
775
776
777
  static void FPT_sresb(u32 port, unsigned char p_card);
  static void FPT_sxfrp(u32 p_port, unsigned char p_card);
  static void FPT_schkdd(u32 port, unsigned char p_card);
  static unsigned char FPT_RdStack(u32 port, unsigned char index);
  static void FPT_WrStack(u32 portBase, unsigned char index,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
778
  			unsigned char data);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
779
  static unsigned char FPT_ChkIfChipInitialized(u32 ioPort);
d63a4cccf   Alexey Dobriyan   [SCSI] drivers/sc...
780

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
781
  static void FPT_SendMsg(u32 port, unsigned char message);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
782
783
  static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
  				   unsigned char error_code);
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
784

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
785
786
  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
787

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
788
789
790
  static unsigned char FPT_siwidn(u32 port, unsigned char p_card);
  static void FPT_stwidn(u32 port, unsigned char p_card);
  static void FPT_siwidr(u32 port, unsigned char width);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
791
792
793
794
795
796
797
  
  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...
798
  				  unsigned char p_card);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
799
800
801
802
803
  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...
804
  static unsigned short FPT_CalcCrc16(unsigned char buffer[]);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
805
  static unsigned char FPT_CalcLrc(unsigned char buffer[]);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
806
807
808
809
  static void FPT_Wait1Second(u32 p_port);
  static void FPT_Wait(u32 p_port, unsigned char p_delay);
  static void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode);
  static void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
810
  			    unsigned short ee_addr);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
811
  static unsigned short FPT_utilEERead(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
812
  				     unsigned short ee_addr);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
813
  static unsigned short FPT_utilEEReadOrg(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
814
  					unsigned short ee_addr);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
815
  static void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
816
  				  unsigned short ee_addr);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
817
818
819
820
821
822
823
  static void FPT_phaseDataOut(u32 port, unsigned char p_card);
  static void FPT_phaseDataIn(u32 port, unsigned char p_card);
  static void FPT_phaseCommand(u32 port, unsigned char p_card);
  static void FPT_phaseStatus(u32 port, unsigned char p_card);
  static void FPT_phaseMsgOut(u32 port, unsigned char p_card);
  static void FPT_phaseMsgIn(u32 port, unsigned char p_card);
  static void FPT_phaseIllegal(u32 port, unsigned char p_card);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
824

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
825
826
827
  static void FPT_phaseDecode(u32 port, unsigned char p_card);
  static void FPT_phaseChkFifo(u32 port, unsigned char p_card);
  static void FPT_phaseBusFree(u32 p_port, unsigned char p_card);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
828

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
829
830
831
  static void FPT_XbowInit(u32 port, unsigned char scamFlg);
  static void FPT_BusMasterInit(u32 p_port);
  static void FPT_DiagEEPROM(u32 p_port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
832

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
833
  static void FPT_dataXferProcessor(u32 port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
834
  				  struct sccb_card *pCurrCard);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
835
  static void FPT_busMstrSGDataXferStart(u32 port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
836
  				       struct sccb *pCurrSCCB);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
837
  static void FPT_busMstrDataXferStart(u32 port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
838
  				     struct sccb *pCurrSCCB);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
839
  static void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
840
841
  				  struct sccb *pCurrSCCB);
  static void FPT_hostDataXferRestart(struct sccb *currSCCB);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
842
  static unsigned char FPT_SccbMgr_bad_isr(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
843
844
845
846
847
848
849
850
851
852
853
854
  					 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);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
855
856
857
858
859
860
  static int FPT_scarb(u32 p_port, unsigned char p_sel_type);
  static void FPT_scbusf(u32 p_port);
  static void FPT_scsel(u32 p_port);
  static void FPT_scasid(unsigned char p_card, u32 p_port);
  static unsigned char FPT_scxferc(u32 p_port, unsigned char p_data);
  static unsigned char FPT_scsendi(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
861
  				 unsigned char p_id_string[]);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
862
  static unsigned char FPT_sciso(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
863
  			       unsigned char p_id_string[]);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
864
865
  static void FPT_scwirod(u32 p_port, unsigned char p_data_bit);
  static void FPT_scwiros(u32 p_port, unsigned char p_data_bit);
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
866
  static unsigned char FPT_scvalq(unsigned char p_quintet);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
867
868
869
  static unsigned char FPT_scsell(u32 p_port, unsigned char targ_id);
  static void FPT_scwtsel(u32 p_port);
  static void FPT_inisci(unsigned char p_card, u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
870
  		       unsigned char p_our_id);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
871
  static void FPT_scsavdi(unsigned char p_card, u32 p_port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
872
873
  static unsigned char FPT_scmachid(unsigned char p_card,
  				  unsigned char p_id_string[]);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
874
875
  static void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card);
  static void FPT_autoLoadDefaultMap(u32 p_port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
876
877
878
879
880
881
  
  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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
893
  static void (*FPT_s_PhaseTbl[8]) (u32, unsigned char) = {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
894
  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
  	unsigned char i, j, id, ScamFlg;
  	unsigned short temp, temp2, temp3, temp4, temp5, temp6;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
909
  	u32 ioport;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
910
  	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).
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1171
  static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1172
  							 *pCardInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1173
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1174
1175
1176
1177
  	struct sccb_card *CurrCard = NULL;
  	struct nvram_info *pCurrNvRam;
  	unsigned char i, j, thisCard, ScamFlg;
  	unsigned short temp, sync_bit_map, id;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1178
  	u32 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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1184
1185
  		if (thisCard == MAX_CARDS)
  			return (void *)FAILURE;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1186

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1199
1200
1201
1202
1203
1204
  			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
1205
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1206
1207
1208
  			FPT_SccbMgrTableInitCard(CurrCard, thisCard);
  			CurrCard->cardIndex = thisCard;
  			CurrCard->cardInfo = pCardInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1209

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1230
1231
1232
1233
  	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
1234

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1235
1236
1237
  	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
1238

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1239
1240
1241
1242
  	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
1243

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1244
1245
1246
1247
  	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
1248

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1259
1260
1261
1262
1263
  	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...
1264
  			CurrCard->globalFlags |= F_GREEN_PC;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1265
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1266

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1267
  	/* Set global flag to indicate Re-Negotiation to be done on all
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1268
1269
1270
1271
1272
1273
  	   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...
1274
  			CurrCard->globalFlags |= F_DO_RENEGO;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1275
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1276

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1277
1278
1279
1280
1281
  	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...
1282
1283
  			CurrCard->globalFlags |= F_CONLUN_IO;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1284

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1297
1298
  		if (pCurrNvRam) {
  			temp = (unsigned short)pCurrNvRam->niSyncTbl[id];
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1299
  			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1300
1301
1302
1303
1304
1305
  			    (((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
1306

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1316
1317
1318
1319
1320
1321
1322
1323
  			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
1324

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

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

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

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

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1351
  	return (void *)CurrCard;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1352
  }
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1353
  static void FlashPoint_ReleaseHostAdapter(void *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1354
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1355
  	unsigned char i;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1356
1357
1358
1359
  	u32 portBase;
  	u32 regOffset;
  	u32 scamData;
  	u32 *pScamTbl;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1360
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1361

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1364
  	if (pCurrNvRam) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
1365
1366
1367
1368
1369
  		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
1370

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1371
1372
1373
1374
  		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
1375
1376
  
  		portBase = pCurrNvRam->niBaseAddr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1377
1378
  		for (i = 0; i < MAX_SCSI_TAR; i++) {
  			regOffset = hp_aramBase + 64 + i * 4;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1379
  			pScamTbl = (u32 *)&pCurrNvRam->niScamTbl[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1380
1381
1382
  			scamData = *pScamTbl;
  			WR_HARP32(portBase, regOffset, scamData);
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1383
  	} else {
13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1384
  		FPT_WrStack(((struct sccb_card *)pCurrCard)->ioPort, 0, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1385
1386
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1387

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1388
  static void FPT_RNVRamData(struct nvram_info *pNvRamInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1389
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1390
  	unsigned char i;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1391
1392
1393
1394
  	u32 portBase;
  	u32 regOffset;
  	u32 scamData;
  	u32 *pScamTbl;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1395

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1456
1457
  	thisCard = pCurrCard->cardIndex;
  	ioport = pCurrCard->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1458

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1471
  	if (!pCurrCard->cmdCounter) {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1472
1473
1474
  		WR_HARPOON(ioport + hp_semaphore,
  			   (RD_HARPOON(ioport + hp_semaphore)
  			    | SCCB_MGR_ACTIVE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1476
  		if (pCurrCard->globalFlags & F_GREEN_PC) {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1477
1478
1479
1480
  			WR_HARPOON(ioport + hp_clkctrl_0, CLKCTRL_DEFAULT);
  			WR_HARPOON(ioport + hp_sys_ctrl, 0x00);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1482
  	pCurrCard->cmdCounter++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1483
1484
1485
1486
1487
1488
1489
1490
  
  	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 =
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1491
1492
  			    pCurrCard->currentSCCB;
  			pCurrCard->currentSCCB = p_Sccb;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1493
  			FPT_queueSelectFail(&FPT_BL_Card[thisCard], thisCard);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1494
  			pCurrCard->currentSCCB =
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1495
1496
1497
1498
1499
  			    pSaveSccb;
  		} else {
  			FPT_queueAddSccb(p_Sccb, thisCard);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1500

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1519
  		if ((pCurrCard->globalFlags & F_CONLUN_IO) &&
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1520
1521
  		    ((FPT_sccbMgrTbl[thisCard][p_Sccb->TargID].
  		      TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1522
1523
1524
  			lun = p_Sccb->Lun;
  		else
  			lun = 0;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1525
  		if ((pCurrCard->currentSCCB == NULL) &&
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1526
1527
1528
  		    (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
1529

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1530
  			pCurrCard->currentSCCB = p_Sccb;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1531
1532
  			FPT_ssel(p_Sccb->SccbIOPort, thisCard);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1533

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1534
1535
1536
  		else {
  
  			if (p_Sccb->OperationCode == RESET_COMMAND) {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1537
1538
  				pSaveSccb = pCurrCard->currentSCCB;
  				pCurrCard->currentSCCB = p_Sccb;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1539
1540
  				FPT_queueSelectFail(&FPT_BL_Card[thisCard],
  						    thisCard);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1541
  				pCurrCard->currentSCCB = pSaveSccb;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1542
1543
1544
1545
  			} else {
  				FPT_queueAddSccb(p_Sccb, thisCard);
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1546

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1550
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1551
1552
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1553
   * Function: FlashPoint_AbortCCB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1554
1555
1556
1557
1558
1559
   *
   * Description: Abort the command pointed to by p_Sccb.  When the
   *              command is completed it will be returned via the
   *              callback function.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1560
  static int FlashPoint_AbortCCB(void *pCurrCard, struct sccb *p_Sccb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1561
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1562
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1563

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1564
  	unsigned char thisCard;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1565
  	CALL_BK_FN callback;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
1566
  	unsigned char TID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1567
1568
  	struct sccb *pSaveSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1569

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

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

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

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

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

13e6851aa   Alexey Dobriyan   [SCSI] drivers/sc...
1580
  			if (!((struct sccb_card *)pCurrCard)->cmdCounter)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1581
1582
1583
1584
1585
  				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
1586

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1587
1588
1589
  			p_Sccb->SccbStatus = SCCB_ABORT;
  			callback = p_Sccb->SccbCallback;
  			callback(p_Sccb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1590

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1591
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1592
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1593
1594
1595
  		else {
  			if (((struct sccb_card *)pCurrCard)->currentSCCB ==
  			    p_Sccb) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1596
  				p_Sccb->SccbStatus = SCCB_ABORT;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1597
  				return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1598
1599
  
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1600
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1601
1602
  
  				TID = p_Sccb->TargID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1603
  				if (p_Sccb->Sccb_tag) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1604
  					MDISABLE_INT(ioport);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1605
1606
1607
  					if (((struct sccb_card *)pCurrCard)->
  					    discQ_Tbl[p_Sccb->Sccb_tag] ==
  					    p_Sccb) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
  						p_Sccb->SccbStatus = SCCB_ABORT;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
  						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
1634
1635
1636
  						}
  					}
  					MENABLE_INT(ioport);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1637
  					return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1638
1639
1640
1641
1642
1643
1644
1645
1646
  				} 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
1647
  						p_Sccb->SccbStatus = SCCB_ABORT;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1648
  						return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1649
1650
1651
1652
1653
  					}
  				}
  			}
  		}
  	}
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1654
  	return -1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1655
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1656
1657
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1658
   * Function: FlashPoint_InterruptPending
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1659
1660
1661
1662
1663
   *
   * Description: Do a quick check to determine if there is a pending
   *              interrupt for this card and disable the IRQ Pin if so.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1664
  static unsigned char FlashPoint_InterruptPending(void *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1665
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1666
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1667

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

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1676
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1677
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1678
1679
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1680
   * Function: FlashPoint_HandleInterrupt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
1683
1684
1685
1686
   *
   * Description: This is our entry point when an interrupt is generated
   *              by the card and the upper level driver passes it on to
   *              us.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1687
  static int FlashPoint_HandleInterrupt(void *pcard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1688
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1689
1690
1691
1692
  	struct sccb *currSCCB;
  	unsigned char thisCard, result, bm_status, bm_int_st;
  	unsigned short hp_int;
  	unsigned char i, target;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1693
1694
  	struct sccb_card *pCurrCard = pcard;
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1695

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1696
1697
  	thisCard = pCurrCard->cardIndex;
  	ioport = pCurrCard->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1698

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1701
  	if ((bm_int_st = RD_HARPOON(ioport + hp_int_status)) & EXT_STATUS_ON)
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1702
1703
  		bm_status = RD_HARPOON(ioport + hp_ext_status) &
  					(unsigned char)BAD_EXT_STATUS;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1704
1705
  	else
  		bm_status = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1706

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1709
1710
  	while ((hp_int = RDW_HARPOON((ioport + hp_intstat)) &
  				FPT_default_intena) | bm_status) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1711

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1712
  		currSCCB = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1713

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1714
1715
  		if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
  			result =
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1716
  			    FPT_SccbMgr_bad_isr(ioport, thisCard, pCurrCard,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1717
1718
1719
1720
  						hp_int);
  			WRW_HARPOON((ioport + hp_intstat),
  				    (FIFO | TIMEOUT | RESET | SCAM_SEL));
  			bm_status = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1721

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1724
  				MENABLE_INT(ioport);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1725
  				return result;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1726
1727
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1728

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
  		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
1741

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1742
  			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1743

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1744
  				FPT_phaseChkFifo(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1745
1746
1747
1748
  
  /*         WRW_HARPOON((ioport+hp_intstat),
              (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
           */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1749
  			WRW_HARPOON((ioport + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1750

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1757
  			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1758
  				FPT_phaseChkFifo(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1759

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1760
1761
  			if (RD_HARPOON(ioport + hp_gp_reg_1) ==
  					SMSAVE_DATA_PTR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1762

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
  			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
1796

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1800
  			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1801

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1809
  			if (RDW_HARPOON((ioport + hp_intstat)) & ITAR_DISC) {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1810
  				if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1811
  					FPT_phaseChkFifo(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1812

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1813
1814
1815
1816
1817
1818
1819
1820
  				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
1821

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1822
1823
1824
1825
1826
  				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
1827

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1828
  			FPT_sres(ioport, thisCard, pCurrCard);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1829
  			FPT_phaseDecode(ioport, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1830

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
  		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
1872

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

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

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

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1885
  			if (pCurrCard->globalFlags & F_HOST_XFER_ACT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1886

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1887
1888
  				FPT_hostDataXferAbort(ioport, thisCard,
  						      currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1889
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1890
1891
  			FPT_phaseBusFree(ioport, thisCard);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1892

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1895
  			WRW_HARPOON((ioport + hp_intstat), ITICKLE);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1896
  			pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1897
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1898

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1902
  			pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1903

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1904
1905
  			if (pCurrCard->currentSCCB == NULL)
  				FPT_queueSearchSelect(pCurrCard, thisCard);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1906

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1907
1908
  			if (pCurrCard->currentSCCB != NULL) {
  				pCurrCard->globalFlags &= ~F_NEW_SCCB_CMD;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1909
1910
  				FPT_ssel(ioport, thisCard);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1911

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

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

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1920
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
  }
  
  /*---------------------------------------------------------------------
   *
   * 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.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1933
  static unsigned char FPT_SccbMgr_bad_isr(u32 p_port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1934
1935
  					 struct sccb_card *pCurrCard,
  					 unsigned short p_int)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1936
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1937
1938
1939
  	unsigned char temp, ScamFlg;
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1940

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1941
1942
  	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
1943

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1946
1947
1948
  			FPT_hostDataXferAbort(p_port, p_card,
  					      pCurrCard->currentSCCB);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1949

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1950
1951
1952
1953
1954
  		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
1955

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1962
1963
1964
  			if (!pCurrCard->currentSCCB->HostStatus)
  				pCurrCard->currentSCCB->HostStatus =
  				    SCCB_BM_ERR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1965

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1968
1969
1970
1971
1972
  			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
1973

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1974
1975
1976
1977
1978
1979
1980
  			if (!
  			    (RDW_HARPOON((p_port + hp_intstat)) &
  			     (BUS_FREE | RESET))) {
  				FPT_phaseDecode(p_port, p_card);
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1981

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1984
1985
1986
  		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
1987

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1990
1991
1992
  				FPT_hostDataXferAbort(p_port, p_card,
  						      pCurrCard->currentSCCB);
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1993

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2001
2002
2003
2004
2005
2006
2007
2008
  		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
2009

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2035
2036
2037
2038
2039
2040
2041
  		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
2042
  		else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2043
  			currTar_Info->TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2044

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2045
2046
2047
2048
  		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
2049

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2063
2064
2065
  		FPT_scarb(p_port, LEVEL2_TAR);
  		FPT_scsel(p_port);
  		FPT_scasid(p_card, p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2066

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2072
  	return 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2073
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2074
2075
2076
2077
2078
2079
2080
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
cd9d715c2   Sudip Mukherjee   FlashPoint: fix b...
2081
  static void FPT_SccbMgrTableInitAll(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2082
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2083
  	unsigned char thisCard;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2084

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2088
2089
2090
2091
2092
2093
  		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
2094
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2095
2096
2097
2098
2099
2100
2101
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2102
2103
  static void FPT_SccbMgrTableInitCard(struct sccb_card *pCurrCard,
  				     unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2104
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2105
  	unsigned char scsiID, qtag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2106

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2107
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2108
  		FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2109
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2110
2111
2112
2113
2114
  	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
2115

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2116
2117
2118
2119
  	pCurrCard->scanIndex = 0x00;
  	pCurrCard->currentSCCB = NULL;
  	pCurrCard->globalFlags = 0x00;
  	pCurrCard->cmdCounter = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2120
  	pCurrCard->tagQ_Lst = 0x01;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2121
  	pCurrCard->discQCount = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2122
2123
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2124
2125
2126
2127
2128
2129
2130
  /*---------------------------------------------------------------------
   *
   * Function: SccbMgrTableInit
   *
   * Description: Initialize all Sccb manager data structures.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2131
2132
  static void FPT_SccbMgrTableInitTarget(unsigned char p_card,
  				       unsigned char target)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2133
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2134
  	unsigned char lun, qtag;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2135
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2136

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2137
  	currTar_Info = &FPT_sccbMgrTbl[p_card][target];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2138
2139
2140
2141
2142
2143
2144
  
  	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...
2145
  	currTar_Info->TarLUN_CA = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2146

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2147
  	for (lun = 0; lun < MAX_LUN; lun++) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2148
  		currTar_Info->TarLUNBusy[lun] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2149
2150
  		currTar_Info->LunDiscQ_Idx[lun] = 0;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2151
2152
2153
2154
  	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...
2155
2156
  				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  				FPT_BL_Card[p_card].discQCount--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2157
2158
2159
2160
  			}
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2161
2162
2163
2164
2165
2166
2167
2168
  /*---------------------------------------------------------------------
   *
   * Function: sfetm
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2169
  static unsigned char FPT_sfm(u32 port, struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2170
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2171
  	unsigned char message;
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
2172
  	unsigned short TimeOutLoop;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2173
2174
  
  	TimeOutLoop = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2175
2176
2177
  	while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  	       (TimeOutLoop++ < 20000)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2178

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2183
  	WR_HARPOON(port + hp_scsisig, SCSI_ACK + S_MSGI_PH);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2184
2185
  
  	if (TimeOutLoop > 20000)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2186
2187
2188
2189
2190
2191
2192
2193
2194
  		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
2195
2196
2197
  			pCurrSCCB->Sccb_scsimsg = SMPARITY;
  		}
  		message = 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2198
  		do {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2199
2200
  			ACCEPT_MSG_ATN(port);
  			TimeOutLoop = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2201
2202
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (TimeOutLoop++ < 20000)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2203
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2204
2205
  			if (TimeOutLoop > 20000) {
  				WRW_HARPOON((port + hp_intstat), PARITY);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2206
  				return message;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2207
2208
2209
2210
  			}
  			if ((RD_HARPOON(port + hp_scsisig) & S_SCSI_PHZ) !=
  			    S_MSGI_PH) {
  				WRW_HARPOON((port + hp_intstat), PARITY);
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
2211
  				return message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2212
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2213
  			WR_HARPOON(port + hp_portctrl_0, SCSI_PORT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2214

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2219
  		} while (1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2220
2221
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2222
2223
2224
2225
  	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...
2226
  	return message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2227
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2228
2229
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2230
   * Function: FPT_ssel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2231
2232
2233
2234
   *
   * Description: Load up automation and select target device.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2235
  static void FPT_ssel(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2236
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2237
  	unsigned char auto_loaded, i, target, *theCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2238

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2239
  	u32 cdb_reg;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2240
2241
2242
2243
  	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
2244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2245
2246
2247
2248
2249
  	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
2250

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2251
  	ARAM_ACCESS(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2252
2253
2254
  
  	if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
  		currSCCB->ControlByte &= ~F_USE_CMD_Q;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2255
2256
  	if (((CurrCard->globalFlags & F_CONLUN_IO) &&
  	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2257

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2258
  		lun = currSCCB->Lun;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2259
2260
  	else
  		lun = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
  	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
2273

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2274
2275
2276
  				else {
  					currTar_Info->TarLUNBusy[lun] = 1;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2277

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2278
2279
2280
2281
2282
  			}
  			/*End non-tagged */
  			else {
  				currTar_Info->TarLUNBusy[lun] = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2283

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2284
2285
2286
2287
2288
2289
2290
2291
  		}
  		/*!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
2292

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2297
2298
2299
2300
2301
  	}
  	/*if glob tagged started */
  	else {
  		currTar_Info->TarLUNBusy[lun] = 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2302

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2303
2304
2305
2306
  	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...
2307
  			currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2308
  			FPT_queueSelectFail(CurrCard, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2309
2310
2311
  			SGRAM_ACCESS(port);
  			return;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2312
2313
2314
2315
  		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
2316
2317
2318
2319
2320
2321
2322
  				CurrCard->tagQ_Lst = lastTag;
  				currTar_Info->LunDiscQ_Idx[lun] = lastTag;
  				CurrCard->discQ_Tbl[lastTag] = currSCCB;
  				CurrCard->discQCount++;
  				break;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2323
  		if (i == QUEUE_DEPTH) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2324
  			currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2325
  			FPT_queueSelectFail(CurrCard, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2326
2327
2328
2329
  			SGRAM_ACCESS(port);
  			return;
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2330
  	auto_loaded = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2331

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2332
2333
  	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
2334

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2335
2336
2337
2338
  	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
2339

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2344
2345
2346
  		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
2347

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2348
2349
2350
2351
  		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
2352

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2362
2363
2364
2365
  	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
2366

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
  		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
2379

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2385
2386
2387
2388
  	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
2389

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2390
2391
2392
2393
2394
  	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
2395

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2402
2403
2404
  			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
2405

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2406
2407
2408
2409
  				/* 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
2410

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
  			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
2446
2447
  						CurrCard->tagQ_Lst = lastTag;
  						currSCCB->Sccb_tag = lastTag;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2448
2449
  						CurrCard->discQ_Tbl[lastTag] =
  						    currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2450
2451
2452
2453
  						CurrCard->discQCount++;
  						break;
  					}
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2454
2455
2456
2457
2458
2459
  				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
2460

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2463
2464
2465
2466
  				WR_HARPOON(port + hp_autostart_3,
  					   (SELECT + SELCHK_STRT));
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2467

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2486
2487
2488
2489
2490
  		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
2491

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2495
2496
2497
2498
  	}
  	/* auto_loaded */
  	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
  	WR_HARPOON(port + hp_xferstat, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2499

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2504
2505
2506
2507
  	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
2508

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2518
  	SGRAM_ACCESS(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2519
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2520
2521
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2522
   * Function: FPT_sres
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2523
2524
2525
2526
   *
   * Description: Hookup the correct CCB and handle the incoming messages.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2527
  static void FPT_sres(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2528
  		     struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2529
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2530
  	unsigned char our_target, message, lun = 0, tag, msgRetryCount;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2531

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2535
2536
2537
  	if (pCurrCard->currentSCCB != NULL) {
  		currTar_Info =
  		    &FPT_sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2538
  		DISABLE_AUTO(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2539
  		WR_HARPOON((port + hp_scsictrl_0), (ENA_RESEL | ENA_SCAM_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2540
2541
  
  		currSCCB = pCurrCard->currentSCCB;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2542
  		if (currSCCB->Sccb_scsistat == SELECT_WN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2543
2544
2545
  			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
  			currSCCB->Sccb_scsistat = BUS_FREE_ST;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2546
  		if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2547
2548
2549
  			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
  			currSCCB->Sccb_scsistat = BUS_FREE_ST;
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2550
2551
2552
2553
2554
  		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
2555
  				pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2556
2557
2558
2559
  				pCurrCard->discQ_Tbl[currTar_Info->
  						     LunDiscQ_Idx[currSCCB->
  								  Lun]]
  				    = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2560
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2561
2562
2563
2564
  		} else {
  			currTar_Info->TarLUNBusy[0] = 0;
  			if (currSCCB->Sccb_tag) {
  				if (currSCCB->Sccb_scsistat != ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2565
  					pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2566
2567
  					pCurrCard->discQ_Tbl[currSCCB->
  							     Sccb_tag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2568
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2569
2570
  			} else {
  				if (currSCCB->Sccb_scsistat != ABORT_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2571
  					pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2572
2573
2574
  					pCurrCard->discQ_Tbl[currTar_Info->
  							     LunDiscQ_Idx[0]] =
  					    NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2575
2576
2577
  				}
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2578
  		FPT_queueSelectFail(&FPT_BL_Card[p_card], p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2579
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2580
  	WRW_HARPOON((port + hp_fiforead), (unsigned short)0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2581

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2593
  				WRW_HARPOON((port + hp_intstat), PHASE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2594
2595
2596
  				return;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2597
2598
  		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
2599

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
  					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
2625
2626
2627
  								}
  
  								else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
  									message
  									    = 0;
  
  								if (message !=
  								    0) {
  									tag =
  									    FPT_sfm
  									    (port,
  									     pCurrCard->
  									     currentSCCB);
  
  									if (!
  									    (tag))
  										message
  										    =
  										    0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2644
  								}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2645
2646
2647
2648
2649
2650
2651
2652
2653
  							}
  							/*C.A. exists! */
  						}
  						/*End Q cnt != 0 */
  					}
  					/*End Tag cmds supported! */
  				}
  				/*End valid ID message.  */
  				else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2654
2655
2656
  
  					ACCEPT_MSG_ATN(port);
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2657
2658
2659
  			}
  			/* End good id message. */
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2660

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2661
  				message = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2662
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2663
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2664
  			ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2665
2666
2667
2668
2669
  			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
2670
2671
2672
  
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2673

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2674
  		if (message == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2675
  			msgRetryCount++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2676
  			if (msgRetryCount == 1) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2677
  				FPT_SendMsg(port, SMPARITY);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2678
  			} else {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2679
  				FPT_SendMsg(port, SMDEV_RESET);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2680

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2684
2685
2686
2687
2688
  				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
2689
2690
  
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2691
2692
  				if (FPT_sccbMgrTbl[p_card][our_target].
  				    TarEEValue & EE_WIDE_SCSI) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2693

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2694
2695
  					FPT_sccbMgrTbl[p_card][our_target].
  					    TarStatus &= ~TAR_WIDE_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2696
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2697
2698
2699
  				FPT_queueFlushTargSccb(p_card, our_target,
  						       SCCB_COMPLETE);
  				FPT_SccbMgrTableInitTarget(p_card, our_target);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2700
2701
2702
  				return;
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2703
  	} while (message == 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2704

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2705
2706
  	if (((pCurrCard->globalFlags & F_CONLUN_IO) &&
  	     ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))) {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2707
  		currTar_Info->TarLUNBusy[lun] = 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2708
2709
2710
  		pCurrCard->currentSCCB =
  		    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
  		if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2711
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2712
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2713
2714
  			ACCEPT_MSG_ATN(port);
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2715
  	} else {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2716
  		currTar_Info->TarLUNBusy[0] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2717

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2718
2719
2720
2721
2722
  		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
2723
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2724
2725
  			} else {
  				ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2726
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2727
2728
2729
2730
  		} else {
  			pCurrCard->currentSCCB =
  			    pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
  			if (pCurrCard->currentSCCB != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2731
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2732
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2733
2734
2735
2736
  				ACCEPT_MSG_ATN(port);
  			}
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2737
2738
2739
2740
2741
  	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...
2742
  			FPT_queueFindSccb(pCurrCard->currentSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2743
2744
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2745
2746
2747
  	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
2748
  }
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2749
  static void FPT_SendMsg(u32 port, unsigned char message)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2750
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2751
2752
  	while (!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) {
  		if (!(RD_HARPOON(port + hp_scsisig) & SCSI_BSY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2753

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2754
  			WRW_HARPOON((port + hp_intstat), PHASE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2755
2756
2757
  			return;
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2758
2759
2760
2761
  	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
2762

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2767
  		WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2768
2769
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2770
  		WR_HARPOON(port + hp_portctrl_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2771
2772
  
  		if ((message == SMABORT) || (message == SMDEV_RESET) ||
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2773
2774
2775
2776
2777
  		    (message == SMABORT_TAG)) {
  			while (!
  			       (RDW_HARPOON((port + hp_intstat)) &
  				(BUS_FREE | PHASE))) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2778

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2779
2780
  			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
  				WRW_HARPOON((port + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2781
2782
2783
2784
2785
2786
2787
  			}
  		}
  	}
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2788
   * Function: FPT_sdecm
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2789
   *
25985edce   Lucas De Marchi   Fix common misspe...
2790
   * Description: Determine the proper response to the message from the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2791
2792
2793
   *              target device.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2794
  static void FPT_sdecm(unsigned char message, u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2795
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2796
2797
2798
  	struct sccb *currSCCB;
  	struct sccb_card *CurrCard;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2799

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2800
  	CurrCard = &FPT_BL_Card[p_card];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2801
  	currSCCB = CurrCard->currentSCCB;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2802
  	currTar_Info = &FPT_sccbMgrTbl[p_card][currSCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2803

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2804
2805
  	if (message == SMREST_DATA_PTR) {
  		if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2806
  			currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2807
  			FPT_hostDataXferRestart(currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2808
2809
2810
  		}
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2811
2812
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2813
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2814
  	else if (message == SMCMD_COMP) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2816
2817
2818
  		if (currSCCB->Sccb_scsistat == SELECT_Q_ST) {
  			currTar_Info->TarStatus &=
  			    ~(unsigned char)TAR_TAG_Q_MASK;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
2819
  			currTar_Info->TarStatus |= (unsigned char)TAG_Q_REJECT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2820
2821
2822
2823
2824
  		}
  
  		ACCEPT_MSG(port);
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2825
2826
  	else if ((message == SMNO_OP) || (message >= SMIDENT)
  		 || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2827
2828
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2829
2830
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2831
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2832
  	else if (message == SMREJECT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2833
2834
  
  		if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2835
2836
2837
2838
  		    (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
2839
  		{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2840
  			WRW_HARPOON((port + hp_intstat), BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2841
2842
  
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2843
2844
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2845
  			{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2846
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2847

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2854
2855
2856
  					currTar_Info->TarEEValue &=
  					    ~EE_SYNC_MASK;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2857

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2861
2862
2863
2864
  					currTar_Info->TarStatus =
  					    (currTar_Info->
  					     TarStatus & ~WIDE_ENABLED) |
  					    WIDE_NEGOCIATED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2865

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2866
2867
  					currTar_Info->TarEEValue &=
  					    ~EE_WIDE_SCSI;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2868
2869
  
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2870

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2871
2872
2873
2874
2875
2876
2877
  				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
2878
2879
2880
  
  					currSCCB->ControlByte &= ~F_USE_CMD_Q;
  					CurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2881
2882
  					CurrCard->discQ_Tbl[currSCCB->
  							    Sccb_tag] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2883
2884
2885
2886
  					currSCCB->Sccb_tag = 0x00;
  
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2887
  			if (RDW_HARPOON((port + hp_intstat)) & BUS_FREE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2888

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2889
2890
2891
  				if (currSCCB->Lun == 0x00) {
  					WRW_HARPOON((port + hp_intstat),
  						    BUS_FREE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2892
2893
2894
  					CurrCard->globalFlags |= F_NEW_SCCB_CMD;
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2895
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2896

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2897
2898
2899
2900
2901
2902
  				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
2903
  				else
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2904
  					currTar_Info->TarLUNBusy[0] = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2905

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2909
2910
  				WR_HARPOON(port + hp_autostart_1,
  					   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2911
2912
2913
  
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2914
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2915
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2916
2917
  			while ((!(RD_HARPOON(port + hp_scsisig) & SCSI_REQ)) &&
  			       (!(RDW_HARPOON((port + hp_intstat)) & BUS_FREE)))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2918
  			{
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2919
2920
2921
2922
2923
  			}
  
  			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
2924
2925
2926
  			}
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2927
  	else if (message == SMEXT) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2928
2929
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2930
  		FPT_shandem(port, p_card, currSCCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2931
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2932
  	else if (message == SMIGNORWR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2933

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2938
  		if (currSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2939
  			ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2940
2941
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2942
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2943
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2944
2945
2946
2947
2948
  
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->Sccb_scsimsg = SMREJECT;
  
  		ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2949
2950
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2951
2952
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2953
2954
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
2955
   * Function: FPT_shandem
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2956
2957
2958
2959
   *
   * Description: Decide what to do with the extended message.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
2960
  static void FPT_shandem(u32 port, unsigned char p_card, struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2961
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2962
  	unsigned char length, message;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2963

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2964
2965
  	length = FPT_sfm(port, pCurrSCCB);
  	if (length) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2966
2967
  
  		ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2968
2969
  		message = FPT_sfm(port, pCurrSCCB);
  		if (message) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2970

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2973
  				if (length == 0x03) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2974
2975
  
  					ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2976
2977
  					FPT_stsyncn(port, p_card);
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2978
2979
2980
2981
  
  					pCurrSCCB->Sccb_scsimsg = SMREJECT;
  					ACCEPT_MSG_ATN(port);
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2982
  			} else if (message == SMWDTR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2983

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2984
  				if (length == 0x02) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2985
2986
  
  					ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2987
2988
  					FPT_stwidn(port, p_card);
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2989
2990
2991
  
  					pCurrSCCB->Sccb_scsimsg = SMREJECT;
  					ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2992
2993
2994
  					WR_HARPOON(port + hp_autostart_1,
  						   (AUTO_IMMED +
  						    DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2995
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2996
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2997
2998
2999
  
  				pCurrSCCB->Sccb_scsimsg = SMREJECT;
  				ACCEPT_MSG_ATN(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3000
3001
  				WR_HARPOON(port + hp_autostart_1,
  					   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3002
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3003
3004
  		} else {
  			if (pCurrSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3005
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3006
3007
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3008
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3009
3010
3011
3012
  	} else {
  		if (pCurrSCCB->Sccb_scsimsg == SMPARITY)
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3013
3014
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3015
3016
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3017
   * Function: FPT_sisyncn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3018
3019
3020
3021
3022
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3023
  static unsigned char FPT_sisyncn(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3024
  				 unsigned char syncFlag)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3025
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3026
3027
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3028

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3034
3035
3036
3037
  		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
3038

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3041
3042
3043
3044
3045
  		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
3046

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3064
  		else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
  			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
3083
  		}
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3084
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3085
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3086

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3089
3090
  		currTar_Info->TarStatus |= (unsigned char)SYNC_SUPPORTED;
  		currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3091
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3092
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3093
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3094
3095
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3096
   * Function: FPT_stsyncn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3097
3098
3099
3100
3101
   *
   * Description: The has sent us a Sync Nego message so handle it as
   *              necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3102
  static void FPT_stsyncn(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3103
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3104
3105
3106
  	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
3107

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3113
3114
3115
  	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
3116
3117
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3118
  	ACCEPT_MSG(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3119

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3122
3123
3124
  	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
3125
3126
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3127
  	if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3128

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3142
3143
3144
  	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
3145

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3184
3185
3186
  		sync_reg = 0x00;	/* Use ASYNC */
  		offset = 0x00;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3187

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3206
3207
3208
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + DISCONNECT_START));
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3209

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3216
3217
3218
3219
  		currTar_Info->TarStatus = ((currTar_Info->TarStatus &
  					    ~(unsigned char)TAR_SYNC_MASK) |
  					   (unsigned char)SYNC_SUPPORTED);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3220
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3221
3222
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3223
   * Function: FPT_sisyncr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3224
3225
3226
3227
   *
   * Description: Answer the targets sync message.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3228
  static void FPT_sisyncr(u32 port, unsigned char sync_pulse,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3229
  			unsigned char offset)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3230
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
  	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
3248
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3249
3250
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3251
   * Function: FPT_siwidn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3252
3253
3254
3255
3256
   *
   * Description: Read in a message byte from the SCSI bus, and check
   *              for a parity error.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3257
  static unsigned char FPT_siwidn(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3258
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3259
3260
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3261

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3267
3268
3269
3270
  		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
3271

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3274
3275
3276
3277
3278
3279
3280
3281
3282
  		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
3283

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3290
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3291
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3292

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3299
  		currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3300
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3301
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3302
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3303
3304
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3305
   * Function: FPT_stwidn
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3306
3307
3308
3309
3310
   *
   * Description: The has sent us a Wide Nego message so handle it as
   *              necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3311
  static void FPT_stwidn(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3312
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3313
3314
3315
  	unsigned char width;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3316

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3322
3323
3324
  	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
3325
3326
  		return;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3327
3328
  	if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
  		width = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3329

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3330
3331
3332
3333
3334
3335
3336
  	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
3337

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
  		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
3356
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3357
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3358

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3363
3364
3365
3366
  		if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
  			width = SM16BIT;
  		else
  			width = SM8BIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3367

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3370
3371
  		currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3372
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3373
3374
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3375
   * Function: FPT_siwidr
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3376
3377
3378
3379
   *
   * Description: Answer the targets Wide nego message.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3380
  static void FPT_siwidr(u32 port, unsigned char width)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3381
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3382
3383
3384
3385
3386
3387
3388
3389
  	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
3390

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3391
3392
  	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
3393

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3396
3397
  	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3398
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3399
3400
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3401
   * Function: FPT_sssyncv
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3402
3403
3404
3405
3406
   *
   * Description: Write the desired value to the Sync Register for the
   *              ID specified.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3407
  static void FPT_sssyncv(u32 p_port, unsigned char p_id,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3408
3409
  			unsigned char p_sync_value,
  			struct sccb_mgr_tar_info *currTar_Info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3410
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
  	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
3464

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3467
  	WR_HARPOON(p_port + hp_synctarg_base + index, p_sync_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3468
3469
3470
  
  	currTar_Info->TarSyncCtrl = p_sync_value;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3471
3472
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3473
   * Function: FPT_sresb
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3474
3475
3476
3477
   *
   * Description: Reset the desired card's SCSI bus.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3478
  static void FPT_sresb(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3479
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3480
  	unsigned char scsiID, i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3481

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3484
3485
3486
  	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
3487

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3490
3491
3492
  	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
3493

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3512
3513
3514
3515
  		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
3516

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3526
3527
3528
3529
3530
  	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...
3531
  	FPT_BL_Card[p_card].discQCount = 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3532
  	FPT_BL_Card[p_card].tagQ_Lst = 0x01;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3533

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3537
3538
  	WR_HARPOON(port + hp_page_ctrl,
  		   (RD_HARPOON(port + hp_page_ctrl) & ~G_INT_DISABLE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3539
3540
3541
3542
3543
  
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3544
   * Function: FPT_ssenss
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3545
3546
3547
3548
   *
   * Description: Setup for the Auto Sense command.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3549
  static void FPT_ssenss(struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3550
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3551
3552
  	unsigned char i;
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3553

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3563
3564
3565
3566
3567
3568
3569
  	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
3570

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3571
  	currSCCB->Sccb_XferCnt = (u32)currSCCB->RequestSenseLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3572

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3583
  	currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3584
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3585
3586
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3587
   * Function: FPT_sxfrp
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3588
3589
3590
3591
3592
   *
   * Description: Transfer data into the bit bucket until the device
   *              decides to switch phase.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3593
  static void FPT_sxfrp(u32 p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3594
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3595
  	unsigned char curr_phz;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3596

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
  	/* 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
3616

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3621
3622
3623
3624
3625
3626
3627
  	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
3628

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
  			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
3640

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3641
3642
3643
3644
  	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
3645

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3646
3647
3648
3649
3650
  	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
3651

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3652
3653
3654
3655
3656
  	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
3657

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3658
3659
3660
3661
3662
3663
  		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
3664
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3665
3666
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3667
   * Function: FPT_schkdd
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3668
3669
3670
3671
3672
   *
   * Description: Make sure data has been flushed from both FIFOs and abort
   *              the operations if necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3673
  static void FPT_schkdd(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3674
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3675
  	unsigned short TimeOutLoop;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
3676
  	unsigned char sPhase;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3677

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3682
3683
3684
3685
  	if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
  	    (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
  		return;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3686

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3693
3694
3695
3696
  		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
3697

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
  	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
3733

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3734
3735
3736
3737
3738
  	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
3739

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3742
3743
3744
3745
  		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
3746

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
  			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
3758

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3761
3762
3763
  	else {
  		WR_HARPOON(port + hp_portctrl_0, 0x00);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3764
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3765
3766
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3767
   * Function: FPT_sinits
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3768
3769
3770
3771
   *
   * Description: Setup SCCB manager fields in this SCCB.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3772
  static void FPT_sinits(struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3773
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3774
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3775

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3787
3788
3789
3790
  		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
3791

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3796
3797
3798
  	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
3799

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3800
3801
3802
  		else
  			currTar_Info->TarStatus |= TAG_Q_TRYING;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3803
3804
3805
3806
3807
3808
  
  /*      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...
3809
     if (((!(FPT_BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3810
3811
3812
        (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
        (currTar_Info->TarStatus & TAG_Q_TRYING)) {
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3813
3814
3815
3816
3817
  	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
3818

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3824
3825
3826
3827
3828
3829
3830
  	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
3831
3832
3833
3834
3835
  /*
     p_sccb->SccbVirtDataPtr    = 0x00;
     p_sccb->Sccb_forwardlink   = NULL;
     p_sccb->Sccb_backlink      = NULL;
   */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3836
3837
3838
  	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
3839
3840
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3841
3842
3843
3844
3845
3846
3847
  /*---------------------------------------------------------------------
   *
   * Function: Phase Decode
   *
   * Description: Determine the phase and call the appropriate function.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3848
  static void FPT_phaseDecode(u32 p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3849
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3850
  	unsigned char phase_ref;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3851
  	void (*phase) (u32, unsigned char);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3852

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3860
  	(*phase) (p_port, p_card);	/* Call the correct phase func */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3861
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3862
3863
3864
3865
3866
3867
3868
  /*---------------------------------------------------------------------
   *
   * Function: Data Out Phase
   *
   * Description: Start up both the BusMaster and Xbow.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3869
  static void FPT_phaseDataOut(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3870
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3871
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3872

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3873
3874
3875
3876
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
  	if (currSCCB == NULL) {
  		return;		/* Exit if No SCCB record */
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3877

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3878
3879
  	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
3880

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3891
3892
3893
  		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
3894

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3895
3896
3897
3898
  		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
3899
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3900
3901
3902
3903
3904
3905
3906
  /*---------------------------------------------------------------------
   *
   * Function: Data In Phase
   *
   * Description: Startup the BusMaster and the XBOW.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3907
  static void FPT_phaseDataIn(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3908
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3909
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3910

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3917
3918
3919
  	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
3920

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3931
3932
3933
  		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
3934

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3935
3936
3937
  		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
3938

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3939
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3940
3941
3942
3943
3944
3945
3946
3947
3948
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Command Phase
   *
   * Description: Load the CDB into the automation and start it up.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3949
  static void FPT_phaseCommand(u32 p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3950
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3951
  	struct sccb *currSCCB;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3952
  	u32 cdb_reg;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3953
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3954

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3959
3960
3961
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->CdbLength = SIX_BYTE_CMD;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3962

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3975
3976
3977
3978
3979
  		else
  			WRW_HARPOON(cdb_reg,
  				    (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
  		cdb_reg += 2;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3980

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3988
3989
  	WR_HARPOON(p_port + hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3990
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3991
3992
3993
3994
3995
3996
3997
  /*---------------------------------------------------------------------
   *
   * Function: Status phase
   *
   * Description: Bring in the status and command complete message bytes
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3998
  static void FPT_phaseStatus(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3999
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4000
4001
4002
4003
  	/* 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
4004

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4007
  	WR_HARPOON(port + hp_autostart_0, (AUTO_IMMED + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4008
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4009
4010
4011
4012
4013
4014
4015
4016
  /*---------------------------------------------------------------------
   *
   * Function: Phase Message Out
   *
   * Description: Send out our message (if we have one) and handle whatever
   *              else is involed.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4017
  static void FPT_phaseMsgOut(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4018
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4019
4020
4021
  	unsigned char message, scsiID;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4022

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
4023
  	currSCCB = FPT_BL_Card[p_card].currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4024
4025
4026
4027
4028
  
  	if (currSCCB != NULL) {
  
  		message = currSCCB->Sccb_scsimsg;
  		scsiID = currSCCB->TargID;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4029
  		if (message == SMDEV_RESET) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4030

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4038
4039
  				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
  				    ~TAR_SYNC_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4040
4041
  
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4042
4043
  			if (FPT_sccbMgrTbl[p_card][scsiID].
  			    TarEEValue & EE_WIDE_SCSI) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4044

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4045
4046
  				FPT_sccbMgrTbl[p_card][scsiID].TarStatus &=
  				    ~TAR_WIDE_MASK;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4047
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4048
4049
4050
  			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
4051
  			currSCCB->HostStatus = SCCB_COMPLETE;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4052
4053
4054
4055
  			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...
4056
  				FPT_sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4057
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4058

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4063
  			if (message == SMNO_OP) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4064
  				currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4065
4066
  
  				FPT_ssel(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4067
4068
  				return;
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4069
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4070
4071
  
  			if (message == SMABORT)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4072
  				FPT_queueFlushSccb(p_card, SCCB_COMPLETE);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4073
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4074
  	} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4075
4076
  		message = SMABORT;
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4077
  	WRW_HARPOON((port + hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4078

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4083
  	WR_HARPOON(port + hp_scsisig, (SCSI_ACK + S_ILL_PH));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4084
4085
  
  	ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4086
  	WR_HARPOON(port + hp_portctrl_0, 0x00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4087

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4099
4100
4101
4102
4103
4104
4105
4106
4107
  				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
4108
  				else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4109
4110
4111
  					FPT_sccbMgrTbl[p_card][currSCCB->
  							       TargID].
  					    TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4112

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4113
4114
  				FPT_queueCmdComplete(&FPT_BL_Card[p_card],
  						     currSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4115
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4116
4117
4118
  			else {
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4119
4120
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4121
  		else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4122

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4123
  			FPT_sxfrp(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4124
4125
  		}
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4126
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4127

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4128
  		if (message == SMPARITY) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4129
  			currSCCB->Sccb_scsimsg = SMNO_OP;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4130
4131
4132
4133
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
  		} else {
  			FPT_sxfrp(port, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4134
4135
4136
  		}
  	}
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4137
4138
4139
4140
4141
4142
4143
  /*---------------------------------------------------------------------
   *
   * Function: Message In phase
   *
   * Description: Bring in the message and determine what to do with it.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4144
  static void FPT_phaseMsgIn(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4145
  {
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
4146
  	unsigned char message;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4147
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4148

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4158
4159
  		WR_HARPOON(port + hp_autostart_1,
  			   (AUTO_IMMED + END_DATA_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4160
4161
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4162
  	else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4163

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4169
4170
  		} else {
  			if (currSCCB->Sccb_scsimsg != SMPARITY)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4171
  				ACCEPT_MSG(port);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4172
4173
  			WR_HARPOON(port + hp_autostart_1,
  				   (AUTO_IMMED + DISCONNECT_START));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4174
4175
4176
4177
  		}
  	}
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4178
4179
4180
4181
4182
4183
4184
4185
4186
  /*---------------------------------------------------------------------
   *
   * 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.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4187
  static void FPT_phaseIllegal(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4188
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4189
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4190

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4196
4197
4198
4199
  		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  		currSCCB->Sccb_scsistat = ABORT_ST;
  		currSCCB->Sccb_scsimsg = SMABORT;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4200

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4201
  	ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4202
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4203
4204
4205
4206
4207
4208
4209
4210
  /*---------------------------------------------------------------------
   *
   * Function: Phase Check FIFO
   *
   * Description: Make sure data has been flushed from both FIFOs and abort
   *              the operations if necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4211
  static void FPT_phaseChkFifo(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4212
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4213
  	u32 xfercnt;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4214
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4215

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4220
4221
4222
  		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
4223

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4229
4230
4231
4232
4233
  			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
4234

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4239
4240
4241
4242
  			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
4243

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4267
4268
4269
  	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
4270

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4271
  	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4272
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4273
4274
4275
4276
4277
4278
4279
4280
  /*---------------------------------------------------------------------
   *
   * Function: Phase Bus Free
   *
   * Description: We just went bus free so figure out if it was
   *              because of command complete or from a disconnect.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4281
  static void FPT_phaseBusFree(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4282
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4283
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4284

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4293
4294
4295
4296
4297
  			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
4298
  			else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
  				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
4342

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4347
4348
4349
  			if (!currSCCB->HostStatus) {
  				currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4350

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4351
4352
4353
4354
4355
4356
4357
4358
  			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
4359

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4360
4361
4362
4363
  			FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB,
  					     p_card);
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4364

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4370
4371
4372
4373
4374
4375
4376
  /*---------------------------------------------------------------------
   *
   * Function: Auto Load Default Map
   *
   * Description: Load the Automation RAM with the defualt map values.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4377
  static void FPT_autoLoadDefaultMap(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4378
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4379
  	u32 map_addr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
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
  
  	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
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Auto Command Complete
   *
   * Description: Post command back to host and find another command
   *              to execute.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4482
  static void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4483
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4484
4485
  	struct sccb *currSCCB;
  	unsigned char status_byte;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4486

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4497
4498
4499
4500
4501
4502
  			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...
4503
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
  				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
4527
4528
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4529
  			currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4530

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4533
4534
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4535

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4536
4537
4538
  		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
4539

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4540
4541
4542
  			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
4543

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4544
4545
4546
4547
4548
4549
  			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...
4550
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
  				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
4574
4575
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4576
  			return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4577

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4582
4583
4584
  			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
4585

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4586
4587
4588
  			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
4589

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4590
4591
4592
4593
4594
4595
  			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...
4596
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
  				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
4620
4621
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
  			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
4633
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4634
4635
4636
4637
4638
  				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
4639
4640
4641
  				}
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
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
  		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
4713
4714
  						}
  					}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4715
4716
4717
4718
4719
  					return;
  				}
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4720

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4721
4722
4723
4724
4725
  	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
4726
  	else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4727
  		FPT_sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4728

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4729
  	FPT_queueCmdComplete(&FPT_BL_Card[p_card], currSCCB, p_card);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4730
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4731
4732
4733
  
  #define SHORT_WAIT   0x0000000F
  #define LONG_WAIT    0x0000FFFFL
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
  /*---------------------------------------------------------------------
   *
   * 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.
   *              
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4751
  static void FPT_dataXferProcessor(u32 port, struct sccb_card *pCurrCard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4752
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4753
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4754

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4757
4758
4759
4760
4761
4762
4763
  	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
4764

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4765
4766
4767
4768
4769
  		FPT_busMstrSGDataXferStart(port, currSCCB);
  	}
  
  	else {
  		if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4770
  			pCurrCard->globalFlags |= F_HOST_XFER_ACT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4771

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4772
4773
4774
  			FPT_busMstrDataXferStart(port, currSCCB);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4775
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4776
4777
4778
4779
4780
4781
4782
  /*---------------------------------------------------------------------
   *
   * Function: BusMaster Scatter Gather Data Transfer Start
   *
   * Description:
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4783
  static void FPT_busMstrSGDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4784
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4785
  	u32 count, addr, tmpSGCnt;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4786
4787
  	unsigned int sg_index;
  	unsigned char sg_count, i;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4788
4789
  	u32 reg_offset;
  	struct blogic_sg_seg *segp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4790

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4791
4792
4793
4794
  	if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)
  		count = ((u32)HOST_RD_CMD) << 24;
  	else
  		count = ((u32)HOST_WRT_CMD) << 24;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4795

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4796
4797
4798
4799
  	sg_count = 0;
  	tmpSGCnt = 0;
  	sg_index = pcurrSCCB->Sccb_sgseg;
  	reg_offset = hp_aramBase;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4800

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4806
  	while ((sg_count < (unsigned char)SG_BUF_CNT) &&
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4807
4808
  			((sg_index * (unsigned int)SG_ELEMENT_SIZE) <
  			pcurrSCCB->DataLength)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4809

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4810
4811
4812
4813
4814
  		segp = (struct blogic_sg_seg *)(pcurrSCCB->DataPointer) +
  				sg_index;
  		tmpSGCnt += segp->segbytes;
  		count |= segp->segbytes;
  		addr = segp->segdata;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4816
  		if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4817
4818
4819
4820
  			addr +=
  			    ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
  			count =
  			    (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4821
4822
  			tmpSGCnt = count & 0x00FFFFFFL;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4823

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4830
4831
4832
  		count &= 0xFF000000L;
  		sg_index++;
  		sg_count++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4833

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4844
4845
4846
4847
  		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
4848

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4854
4855
4856
  			pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
  			tmpSGCnt--;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4857

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4860
4861
4862
4863
  		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
4864

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4865
  	WR_HARPOON(p_port + hp_page_ctrl, (unsigned char)(i | SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4866
4867
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4868
4869
4870
4871
4872
4873
4874
  /*---------------------------------------------------------------------
   *
   * Function: BusMaster Data Transfer Start
   *
   * Description: 
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4875
  static void FPT_busMstrDataXferStart(u32 p_port, struct sccb *pcurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4876
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4877
  	u32 addr, count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4878

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4883
  		addr = (u32)(unsigned long)pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4884
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4885

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4886
4887
4888
  	else {
  		addr = pcurrSCCB->SensePointer;
  		count = pcurrSCCB->RequestSenseLength;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4889

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4896
4897
4898
  		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
4899

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4906
4907
4908
  		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
4909

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4913
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4914
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
  /*---------------------------------------------------------------------
   *
   * 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.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4927
  static unsigned char FPT_busMstrTimeOut(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4928
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4929
  	unsigned long timeout;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4930

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4939
4940
  	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
4941

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4942
4943
4944
4945
4946
  		timeout = LONG_WAIT;
  		while ((RD_HARPOON(p_port + hp_ext_status) & BM_CMD_BUSY)
  		       && timeout--) {
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4947

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4954
  	else {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
4955
  		return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4956
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4957
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4958
4959
4960
4961
4962
4963
4964
  /*---------------------------------------------------------------------
   *
   * Function: Host Data Transfer Abort
   *
   * Description: Abort any in progress transfer.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4965
  static void FPT_hostDataXferAbort(u32 port, unsigned char p_card,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4966
  				  struct sccb *pCurrSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4967
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4968
4969
  	unsigned long timeout;
  	unsigned long remain_cnt;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4970
4971
  	u32 sg_ptr;
  	struct blogic_sg_seg *segp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4972

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4979
4980
4981
4982
  			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
4983

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4988
4989
4990
  			WR_HARPOON(port + hp_bm_ctrl,
  				   (RD_HARPOON(port + hp_bm_ctrl) &
  				    ~FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4991

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5009
5010
5011
5012
5013
5014
5015
5016
5017
  						if (pCurrSCCB->HostStatus ==
  						    0x00)
  						{
  							pCurrSCCB->HostStatus =
  							    SCCB_BM_ERR;
  						}
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5018

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5023
5024
5025
  			WR_HARPOON(port + hp_page_ctrl,
  				   (RD_HARPOON(port + hp_page_ctrl) &
  				    ~SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5026

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5031
5032
5033
  			if (sg_ptr >
  			    (unsigned int)(pCurrSCCB->DataLength /
  					   SG_ELEMENT_SIZE)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5034

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5035
5036
  				sg_ptr = (u32)(pCurrSCCB->DataLength /
  							SG_ELEMENT_SIZE);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5037
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5038

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5043
  				sg_ptr--;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5044
5045
5046
  				segp = (struct blogic_sg_seg *)(pCurrSCCB->
  						DataPointer) + (sg_ptr * 2);
  				if (remain_cnt > (unsigned long)segp->segbytes)
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5047
  					remain_cnt -=
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5048
5049
  						(unsigned long)segp->segbytes;
  				else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5050
  					break;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5051
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5052

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5057
  				pCurrSCCB->Sccb_sgseg = (unsigned short)sg_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5058

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5059
5060
  				if ((unsigned long)(sg_ptr * SG_ELEMENT_SIZE) ==
  				    pCurrSCCB->DataLength && (remain_cnt == 0))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5061

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5062
5063
5064
  					pCurrSCCB->Sccb_XferState |=
  					    F_ALL_XFERRED;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5065

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5070
5071
5072
5073
5074
  					pCurrSCCB->HostStatus =
  					    SCCB_GROSS_FW_ERR;
  				}
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5075

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5076
  		if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5077

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5080
5081
  				FPT_busMstrTimeOut(port);
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5082

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5094
5095
5096
5097
5098
  							pCurrSCCB->HostStatus =
  							    SCCB_BM_ERR;
  						}
  					}
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5099

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5105
  			if ((RD_HARPOON(port + hp_fifo_cnt)) >= BM_THRESHOLD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5106

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5107
  				timeout = SHORT_WAIT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5108

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5109
5110
5111
5112
5113
5114
  				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
5115

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5118
5119
5120
  				WR_HARPOON(port + hp_bm_ctrl,
  					   (RD_HARPOON(port + hp_bm_ctrl) |
  					    FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5121

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5124
5125
5126
  				while ((RD_HARPOON(port + hp_ext_status) &
  					BM_CMD_BUSY) && timeout--) {
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5127

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5128
5129
5130
  				WR_HARPOON(port + hp_bm_ctrl,
  					   (RD_HARPOON(port + hp_bm_ctrl) &
  					    ~FLUSH_XFER_CNTR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5131

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5137
5138
5139
  						pCurrSCCB->HostStatus =
  						    SCCB_BM_ERR;
  					}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5140

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5141
5142
5143
  					FPT_busMstrTimeOut(port);
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5144

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5152
5153
5154
5155
5156
5157
  						pCurrSCCB->HostStatus =
  						    SCCB_BM_ERR;
  					}
  				}
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5158

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5167
5168
5169
  			while ((RD_HARPOON(port + hp_ext_status) & BM_CMD_BUSY)
  			       && timeout--) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5170

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5175
5176
  					pCurrSCCB->HostStatus = SCCB_BM_ERR;
  				}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5177

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5178
5179
5180
  				FPT_busMstrTimeOut(port);
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5181

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5184
  			if (RD_HARPOON(port + hp_ext_status) & BAD_EXT_STATUS) {
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
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5193

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5196
5197
5198
  			WR_HARPOON(port + hp_page_ctrl,
  				   (RD_HARPOON(port + hp_page_ctrl) &
  				    ~SCATTER_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5199

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5204
  			pCurrSCCB->Sccb_SGoffset = 0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5205

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5206
5207
  			if ((u32)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
  					pCurrSCCB->DataLength) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5208

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5209
  				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5210
5211
5212
  				pCurrSCCB->Sccb_sgseg =
  				    (unsigned short)(pCurrSCCB->DataLength /
  						     SG_ELEMENT_SIZE);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5213
5214
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5215

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5216
  		else {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5217
  			if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5218
5219
5220
  				pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5221

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5222
  	WR_HARPOON(port + hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5223
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5224
5225
5226
5227
5228
5229
5230
5231
  /*---------------------------------------------------------------------
   *
   * Function: Host Data Transfer Restart
   *
   * Description: Reset the available count due to a restore data
   *              pointers message.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5232
  static void FPT_hostDataXferRestart(struct sccb *currSCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5233
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5234
5235
  	unsigned long data_count;
  	unsigned int sg_index;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5236
  	struct blogic_sg_seg *segp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5237

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5242
  		sg_index = 0xffff;	/*Index by long words into sg list. */
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5243
  		data_count = 0;		/*Running count of SG xfer counts. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5244

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5245

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5246
  		while (data_count < currSCCB->Sccb_ATC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5247

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5248
  			sg_index++;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5249
5250
5251
  			segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) +
  						(sg_index * 2);
  			data_count += segp->segbytes;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5252
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5253

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5254
  		if (data_count == currSCCB->Sccb_ATC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5255

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5256
5257
5258
  			currSCCB->Sccb_SGoffset = 0;
  			sg_index++;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5259

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5260
5261
5262
5263
  		else {
  			currSCCB->Sccb_SGoffset =
  			    data_count - currSCCB->Sccb_ATC;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5264

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5265
5266
  		currSCCB->Sccb_sgseg = (unsigned short)sg_index;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5267

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5268
5269
5270
5271
  	else {
  		currSCCB->Sccb_XferCnt =
  		    currSCCB->DataLength - currSCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5272
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5273

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5274
5275
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5276
   * Function: FPT_scini
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5277
5278
5279
5280
   *
   * Description: Setup all data structures necessary for SCAM selection.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5281
5282
  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
5283
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5284
  	unsigned char loser, assigned_id;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5285
  	u32 p_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5286

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5287
5288
5289
  	unsigned char i, k, ScamFlg;
  	struct sccb_card *currCard;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5290

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5291
5292
  	currCard = &FPT_BL_Card[p_card];
  	p_port = currCard->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5293
  	pCurrNvRam = currCard->pNvRamInfo;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5294
  	if (pCurrNvRam) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5295
5296
  		ScamFlg = pCurrNvRam->niScamConf;
  		i = pCurrNvRam->niSysConf;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5297
5298
5299
5300
5301
  	} 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
5302
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5303
  	if (!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5304
  		return;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5305
  	FPT_inisci(p_card, p_port, p_our_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5306

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5307
5308
  	/* 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
5309

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5310
5311
5312
5313
  	/* if (p_power_up)
  	   FPT_Wait1Second(p_port);
  	   else
  	   FPT_Wait(p_port, TO_250ms); */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5314

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5315
  	FPT_Wait1Second(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5316

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5317
5318
5319
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
  		while (!(FPT_scarb(p_port, INIT_SELTD))) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5320

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5321
  		FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5322

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5323
5324
5325
5326
5327
5328
5329
  		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
5330

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5333
5334
5335
  		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
5336

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5337
5338
  			while (!(FPT_scarb(p_port, INIT_SELTD))) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5339

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5340
  			FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5341

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5342
5343
5344
5345
5346
5347
5348
5349
  			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
5350

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5351
5352
5353
  			FPT_scbusf(p_port);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5354

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5355
5356
5357
  	else {
  		loser = 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5358

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5359
5360
5361
5362
5363
5364
5365
5366
5367
5368
5369
5370
5371
5372
5373
5374
5375
5376
5377
5378
5379
5380
5381
5382
5383
5384
5385
5386
5387
  	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
5388

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5389
5390
5391
5392
5393
5394
5395
  			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
5396

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5399
5400
5401
5402
  	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
5403

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5404
5405
5406
  		do {
  			while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5407

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5408
5409
5410
5411
5412
5413
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
  			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
5443

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5444
5445
5446
5447
5448
5449
5450
5451
  			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
5452

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5453
5454
5455
  		while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5456

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5457
5458
5459
5460
5461
5462
5463
  	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
5464

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5465
5466
5467
  /*
     for (i=0,k=0; i < MAX_SCSI_TAR; i++)
        {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5468
5469
        if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
           (FPT_scamInfo[i].state == LEGACY))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5470
5471
5472
5473
5474
5475
5476
5477
5478
           k++;
        }
  
     if (k==2)
        currCard->globalFlags |= F_SINGLE_DEVICE;
     else
        currCard->globalFlags &= ~F_SINGLE_DEVICE;
  */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5479
5480
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5481
   * Function: FPT_scarb
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5482
5483
5484
5485
   *
   * Description: Gain control of the bus and wait SCAM select time (250ms)
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5486
  static int FPT_scarb(u32 p_port, unsigned char p_sel_type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5487
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5488
  	if (p_sel_type == INIT_SELTD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5489

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5490
5491
  		while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5492

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5493
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5494
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5495

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5496
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5497
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5498

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5499
5500
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5501

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5502
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5503

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5504
5505
5506
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~SCSI_BSY));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5507
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5508
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5509

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5510
5511
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5512

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5513
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5514

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5515
5516
5517
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~(SCSI_BSY | SCSI_SEL)));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5518
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5519
5520
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5521

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5522
5523
5524
5525
5526
5527
  	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
5528

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5529
5530
  	WR_HARPOON(p_port + hp_scsisig,
  		   (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5531

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5532
5533
  	WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
  					 & ~SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5534

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5535
  	FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5536

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5537
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5538
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5539
5540
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5541
   * Function: FPT_scbusf
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5542
5543
5544
5545
   *
   * Description: Release the SCSI bus and disable SCAM selection.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5546
  static void FPT_scbusf(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5547
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5548
5549
  	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
5550

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5553
5554
  	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
5555

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5558
5559
  	WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
  					   & ~SCAM_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5560

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5561
5562
  	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
  					   | ACTdeassert));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5563

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5564
  	WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5565

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5566
5567
  	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
5568
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5569
5570
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5571
   * Function: FPT_scasid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5572
5573
5574
5575
   *
   * Description: Assign an ID to all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5576
  static void FPT_scasid(unsigned char p_card, u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5577
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5578
  	unsigned char temp_id_string[ID_STRING_LENGTH];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5579

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5580
  	unsigned char i, k, scam_id;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5581
  	unsigned char crcBytes[3];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5582
5583
  	struct nvram_info *pCurrNvRam;
  	unsigned short *pCrcBytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5584

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5585
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5586

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5587
  	i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5588

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5589
  	while (!i) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5590

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5591
5592
5593
  		for (k = 0; k < ID_STRING_LENGTH; k++) {
  			temp_id_string[k] = (unsigned char)0x00;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5594

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5595
5596
  		FPT_scxferc(p_port, SYNC_PTRN);
  		FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5597

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5598
5599
  		if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
  			if (pCurrNvRam) {
fd1e29ed6   Alexey Dobriyan   [SCSI] drivers/sc...
5600
  				pCrcBytes = (unsigned short *)&crcBytes[0];
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5601
5602
  				*pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
  				crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5603
5604
5605
  				temp_id_string[1] = crcBytes[2];
  				temp_id_string[2] = crcBytes[0];
  				temp_id_string[3] = crcBytes[1];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5606
5607
  				for (k = 4; k < ID_STRING_LENGTH; k++)
  					temp_id_string[k] = (unsigned char)0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5608
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5609
  			i = FPT_scmachid(p_card, temp_id_string);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5610

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5611
5612
5613
5614
5615
  			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
5616

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5617
5618
5619
5620
5621
  			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
5622

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5623
  				scam_id = (i & (unsigned char)0x07);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5624

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5625
5626
5627
  				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
5628

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5629
  				FPT_scxferc(p_port, scam_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5630

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5631
5632
5633
  				i = 0;	/*Not the last ID yet. */
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5634

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5635
5636
5637
  		else {
  			i = 1;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5638

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5639
  	}			/*End while */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5640

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5641
5642
  	FPT_scxferc(p_port, SYNC_PTRN);
  	FPT_scxferc(p_port, CFG_CMPLT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5643
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5644
5645
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5646
   * Function: FPT_scsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5647
5648
5649
5650
   *
   * Description: Select all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5651
  static void FPT_scsel(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5652
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5653
5654
  	WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
  	FPT_scwiros(p_port, SCSI_MSG);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5655

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5656
  	WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5657

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5658
5659
5660
5661
5662
  	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
5663

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5664
5665
  	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
5666

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5667
5668
5669
5670
  	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
5671

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5672
5673
  	WR_HARPOON(p_port + hp_scsisig,
  		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5674
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5675
5676
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5677
   * Function: FPT_scxferc
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5678
5679
5680
5681
   *
   * Description: Handshake the p_data (DB4-0) across the bus.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5682
  static unsigned char FPT_scxferc(u32 p_port, unsigned char p_data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5683
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5684
  	unsigned char curr_data, ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5685

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5686
  	curr_data = p_data | BIT(7) | BIT(5);	/*Start with DB7 & DB5 asserted. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5687

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5688
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5689

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5690
  	curr_data &= ~BIT(7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5691

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5692
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5693

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5694
5695
  	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
5696

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5697
  	ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5698

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5699
  	curr_data |= BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5700

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5701
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5702

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5703
  	curr_data &= ~BIT(5);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5704

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5705
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5706

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5707
  	FPT_scwirod(p_port, BIT(5));	/*Wait for DB5 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5708

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5709
5710
  	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
5711

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5712
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5713

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5714
  	curr_data &= ~BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5715

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5716
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5717

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5718
  	FPT_scwirod(p_port, BIT(6));	/*Wait for DB6 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5719

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5720
  	return ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5721
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5722
5723
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5724
   * Function: FPT_scsendi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5725
5726
5727
5728
5729
   *
   * Description: Transfer our Identification string to determine if we
   *              will be the dominant master.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5730
  static unsigned char FPT_scsendi(u32 p_port, unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5731
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5732
  	unsigned char ret_data, byte_cnt, bit_cnt, defer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5733

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5734
  	defer = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5735

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5736
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5737

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5738
  		for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5739

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5740
5741
  			if (defer)
  				ret_data = FPT_scxferc(p_port, 00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5742

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5743
  			else if (p_id_string[byte_cnt] & bit_cnt)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5744

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5745
  				ret_data = FPT_scxferc(p_port, 02);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5746

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5749
5750
5751
5752
  				ret_data = FPT_scxferc(p_port, 01);
  				if (ret_data & 02)
  					defer = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5753

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5754
  			if ((ret_data & 0x1C) == 0x10)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5755
  				return 0x00;	/*End of isolation stage, we won! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5756

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5757
  			if (ret_data & 0x1C)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5758
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5759

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5760
  			if ((defer) && (!(ret_data & 0x1F)))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5761
  				return 0x01;	/*End of isolation stage, we lost. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5762

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5763
  		}		/*bit loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5764

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5765
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5766

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5767
  	if (defer)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5768
  		return 0x01;	/*We lost */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5769
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5770
  		return 0;	/*We WON! Yeeessss! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5771
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5772
5773
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5774
   * Function: FPT_sciso
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5775
5776
5777
5778
   *
   * Description: Transfer the Identification string.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5779
  static unsigned char FPT_sciso(u32 p_port, unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5780
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5781
  	unsigned char ret_data, the_data, byte_cnt, bit_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5782

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5783
  	the_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5784

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5785
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5786

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5787
  		for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5788

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5789
  			ret_data = FPT_scxferc(p_port, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5790

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5791
  			if (ret_data & 0xFC)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5792
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5793

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5796
5797
5798
5799
5800
  				the_data <<= 1;
  				if (ret_data & BIT(1)) {
  					the_data |= 1;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5801

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5802
  			if ((ret_data & 0x1F) == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5803
5804
5805
5806
5807
  /*
  				if(bit_cnt != 0 || bit_cnt != 8)
  				{
  					byte_cnt = 0;
  					bit_cnt = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5808
5809
  					FPT_scxferc(p_port, SYNC_PTRN);
  					FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5810
5811
5812
  					continue;
  				}
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5813
  				if (byte_cnt)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5814
  					return 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5815
  				else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5816
  					return 0xFF;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5817
  			}
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
  		p_id_string[byte_cnt] = the_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5822

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5823
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5824

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5825
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5826
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5827
5828
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5829
   * Function: FPT_scwirod
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5830
5831
5832
5833
5834
   *
   * Description: Sample the SCSI data bus making sure the signal has been
   *              deasserted for the correct number of consecutive samples.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5835
  static void FPT_scwirod(u32 p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5836
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5837
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5838

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5839
5840
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5841

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5842
  		if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5844
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5845

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5848
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5849

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5850
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5851
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5852
5853
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5854
   * Function: FPT_scwiros
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5855
5856
5857
5858
5859
   *
   * Description: Sample the SCSI Signal lines making sure the signal has been
   *              deasserted for the correct number of consecutive samples.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5860
  static void FPT_scwiros(u32 p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5861
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5862
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5863

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5864
5865
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5866

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5867
  		if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5868

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5869
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5870

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5873
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5874

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5875
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5876
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5877

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5878
5879
5880
5881
5882
5883
5884
  /*---------------------------------------------------------------------
   *
   * Function: FPT_scvalq
   *
   * Description: Make sure we received a valid data byte.
   *
   *---------------------------------------------------------------------*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5885

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5886
  static unsigned char FPT_scvalq(unsigned char p_quintet)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5887
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5888
  	unsigned char count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5889

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5890
5891
5892
5893
  	for (count = 1; count < 0x08; count <<= 1) {
  		if (!(p_quintet & count))
  			p_quintet -= 0x80;
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5894

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5895
  	if (p_quintet & 0x18)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5896
  		return 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5897

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5898
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5899
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5900
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5901
5902
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5903
   * Function: FPT_scsell
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5904
5905
   *
   * Description: Select the specified device ID using a selection timeout
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5906
5907
   *              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
5908
5909
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5910
  static unsigned char FPT_scsell(u32 p_port, unsigned char targ_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5911
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5912
  	unsigned long i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5913

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5914
5915
  	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
5916

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5919
5920
5921
  	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
5922

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5923
5924
5925
5926
  	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
5927

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5928
5929
  	WRW_HARPOON((p_port + hp_intstat),
  		    (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5930

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5931
  	WR_HARPOON(p_port + hp_select_id, targ_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5932

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5933
5934
5935
  	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
5936

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5937
5938
5939
  	while (!(RDW_HARPOON((p_port + hp_intstat)) &
  		 (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5940

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5941
5942
  	if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5943

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5946
5947
5948
  	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
5949

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5950
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5951

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5952
  	if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5953

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5954
5955
  		WRW_HARPOON((p_port + hp_intstat),
  			    (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5956

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5957
5958
5959
  		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
5960

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5961
  		return 0;	/*No legacy device */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5962
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5963

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5966
5967
5968
5969
5970
5971
  		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
5972
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5973
  		WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5974

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5975
5976
5977
  		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
5978

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5979
  		return 1;	/*Found one of them oldies! */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5980
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5981
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5982
5983
5984
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5985
   * Function: FPT_scwtsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5986
5987
5988
5989
   *
   * Description: Wait to be selected by another SCAM initiator.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5990
  static void FPT_scwtsel(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5991
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5992
5993
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5994
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5995
5996
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5997
   * Function: FPT_inisci
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5998
5999
6000
6001
   *
   * Description: Setup the data Structure with the info from the EEPROM.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6002
  static void FPT_inisci(unsigned char p_card, u32 p_port, unsigned char p_our_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6003
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6004
6005
6006
  	unsigned char i, k, max_id;
  	unsigned short ee_data;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6007

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6008
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6009

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6010
6011
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6013
6014
  	else
  		max_id = 0x10;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6015

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6016
6017
  	if (pCurrNvRam) {
  		for (i = 0; i < max_id; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6018

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6019
6020
6021
6022
6023
6024
  			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
6025

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6026
6027
6028
6029
  			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
6030
6031
  
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6032
6033
6034
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
  	} 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
6047

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6048
6049
  			if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
  			    (FPT_scamInfo[i].id_string[0] == 0xFF))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6050

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6051
  				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6052

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6053
6054
  			else
  				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6055

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6056
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6057
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6058
  	for (k = 0; k < ID_STRING_LENGTH; k++)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6059
  		FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6060
6061
6062
6063
6064
  
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6065
   * Function: FPT_scmachid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6066
6067
6068
6069
6070
   *
   * Description: Match the Device ID string with our values stored in
   *              the EEPROM.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6071
6072
  static unsigned char FPT_scmachid(unsigned char p_card,
  				  unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6073
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6074
  	unsigned char i, k, match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6075

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6078
  		match = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6079

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6080
6081
6082
6083
  		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
6084

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6085
6086
  		if (match) {
  			FPT_scamInfo[i].state = ID_ASSIGNED;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6087
  			return i;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6088
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6089

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6092
6093
6094
6095
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6096

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6097
6098
6099
6100
6101
  	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
6102

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6103
6104
  	while (i > 0) {
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6105

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6106
6107
6108
6109
6110
  		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
6111

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6112
  			FPT_scamInfo[match].state = ID_ASSIGNED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6113

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6114
6115
6116
  			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_UPDATE_EEPROM;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6117
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6118

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6121
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6122

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6123
6124
6125
6126
6127
6128
  		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
6129
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6130

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6131
  	if (p_id_string[0] & BIT(7)) {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6132
  		return CLR_PRIORITY;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6133
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6134

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6135
6136
6137
6138
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6139

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6140
6141
6142
6143
6144
  	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
6145

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6146
  	while (i > 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6147

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6148
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6149

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6150
6151
6152
6153
6154
  		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
6155

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6156
6157
6158
6159
6160
  			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...
6161
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6162

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6165
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6166

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6167
6168
6169
6170
6171
6172
  		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
6173
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6174

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6175
  	return NO_ID_AVAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6176
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6177
6178
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6179
   * Function: FPT_scsavdi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6180
6181
6182
6183
   *
   * Description: Save off the device SCAM ID strings.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6184
  static void FPT_scsavdi(unsigned char p_card, u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6185
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6186
6187
  	unsigned char i, k, max_id;
  	unsigned short ee_data, sum_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6188

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6189
  	sum_data = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6190

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6191
6192
6193
  	for (i = 1; i < EE_SCAMBASE / 2; i++) {
  		sum_data += FPT_utilEERead(p_port, i);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6194

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6195
  	FPT_utilEEWriteOnOff(p_port, 1);	/* Enable write access to the EEPROM */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6196

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6197
6198
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6199

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
  	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
6216

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6217
6218
  	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
6219
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6220
6221
6222
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6223
   * Function: FPT_XbowInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6224
6225
6226
6227
   *
   * Description: Setup the Xbow for normal operation.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6228
  static void FPT_XbowInit(u32 port, unsigned char ScamFlg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6229
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6230
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6231

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6232
6233
  	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
6234

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6235
6236
  	WR_HARPOON(port + hp_scsireset, 0x00);
  	WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6237

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6238
6239
  	WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
  					 FIFO_CLR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6240

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6241
  	WR_HARPOON(port + hp_scsireset, SCSI_INI);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6242

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6243
  	WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6244

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6245
6246
  	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
6247

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6250
6251
  	FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
  	    BUS_FREE | XFER_CNT_0 | AUTO_INT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6252

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6253
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6254
  		FPT_default_intena |= SCAM_SEL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6255

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6256
  	WRW_HARPOON((port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6257

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6260
6261
6262
6263
  	/* 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
6264

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6265
  	WR_HARPOON(port + hp_page_ctrl, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6266
6267
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6268
6269
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6270
   * Function: FPT_BusMasterInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6271
6272
6273
6274
   *
   * Description: Initialize the BusMaster for normal operations.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6275
  static void FPT_BusMasterInit(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6276
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6277
6278
  	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
6279

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6280
  	WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6281

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6282
  	WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6283

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6284
  	WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6285

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6286
6287
6288
6289
  	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
6290
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6291
6292
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6293
   * Function: FPT_DiagEEPROM
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6294
6295
6296
6297
6298
   *
   * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
   *              necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6299
  static void FPT_DiagEEPROM(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6300
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6301
  	unsigned short index, temp, max_wd_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6302

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6303
6304
6305
6306
  	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
6307

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6308
  	temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6309

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6310
  	if (temp == 0x4641) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6311

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6312
  		for (index = 2; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6313

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6314
  			temp += FPT_utilEERead(p_port, index);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6315

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6318
  		if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6319

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6320
6321
6322
  			return;	/*EEPROM is Okay so return now! */
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6323

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6324
  	FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6325

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6326
  	for (index = 0; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6327

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6328
6329
  		FPT_utilEEWrite(p_port, 0x0000, index);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6330

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
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
  	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
6443
6444
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6445
6446
6447
6448
6449
6450
6451
  /*---------------------------------------------------------------------
   *
   * Function: Queue Search Select
   *
   * Description: Try to find a new command to execute.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6452
6453
  static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
  				  unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6454
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6455
6456
6457
  	unsigned char scan_ptr, lun;
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct sccb *pOldSccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6458

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6459
6460
  	scan_ptr = pCurrCard->scanIndex;
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6461
  		currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6462
6463
6464
6465
  		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
6466
6467
6468
6469
  
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR)
  					scan_ptr = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6470

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6471
6472
6473
6474
6475
  				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
6476
  						pOldSccb = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
  						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
6490
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6491
6492
  						if (pCurrCard->currentSCCB ==
  						    NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6493
  							continue;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520
6521
6522
6523
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
  						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
6535
6536
  							}
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6537
  						pCurrCard->scanIndex = scan_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6538

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6539
6540
  						pCurrCard->globalFlags |=
  						    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6541

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6542
  						break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6543
6544
6545
  					}
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6546
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6547
6548
6549
6550
6551
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR) {
  					scan_ptr = 0;
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6552
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6553
  			if ((currTar_Info->TarSelQ_Cnt != 0) &&
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6554
  			    (currTar_Info->TarLUNBusy[0] == 0)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6555

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6556
6557
  				pCurrCard->currentSCCB =
  				    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6558

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6559
6560
6561
  				currTar_Info->TarSelQ_Head =
  				    (struct sccb *)(pCurrCard->currentSCCB)->
  				    Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6562

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6563
  				if (currTar_Info->TarSelQ_Head == NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6564
6565
  					currTar_Info->TarSelQ_Tail = NULL;
  					currTar_Info->TarSelQ_Cnt = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6566
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6567
  					currTar_Info->TarSelQ_Cnt--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6568
6569
  					currTar_Info->TarSelQ_Head->
  					    Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
  				}
  
  				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...
6582
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6583
  				scan_ptr++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6584
  				if (scan_ptr == MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6585
6586
6587
6588
6589
6590
  					scan_ptr = 0;
  				}
  			}
  		}
  	} while (scan_ptr != pCurrCard->scanIndex);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6591
6592
6593
6594
6595
6596
6597
  /*---------------------------------------------------------------------
   *
   * Function: Queue Select Fail
   *
   * Description: Add the current SCCB to the head of the Queue.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6598
6599
  static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
  				unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6600
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6601
6602
  	unsigned char thisTarg;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6603

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6604
6605
6606
6607
6608
  	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
6609

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6610
  		pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6611

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6612
6613
  		pCurrCard->currentSCCB->Sccb_forwardlink =
  		    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6614

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6615
6616
6617
  		if (currTar_Info->TarSelQ_Cnt == 0) {
  			currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6618

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6619
6620
6621
6622
  		else {
  			currTar_Info->TarSelQ_Head->Sccb_backlink =
  			    pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6623

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6624
  		currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6625

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6626
6627
6628
  		pCurrCard->currentSCCB = NULL;
  		currTar_Info->TarSelQ_Cnt++;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6629
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6630

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6631
6632
6633
6634
6635
6636
6637
  /*---------------------------------------------------------------------
   *
   * Function: Queue Command Complete
   *
   * Description: Call the callback function with the current SCCB.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6638
6639
  static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
  				 struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6640
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6641
6642
6643
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
  	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
6664

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6665
6666
6667
6668
6669
  	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
6670
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6671
  	if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6672

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6673
6674
6675
6676
6677
  		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
6678

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6679
6680
  	if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
  	    (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6681

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6682
6683
  		FPT_utilUpdateResidual(p_sccb);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6684

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6685
6686
  	pCurrCard->cmdCounter--;
  	if (!pCurrCard->cmdCounter) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6687

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6688
6689
6690
6691
6692
  		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
6693

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6694
6695
6696
  		WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
  			   (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
  			    ~SCCB_MGR_ACTIVE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6697

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6700
6701
6702
6703
6704
  	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
6705
  			pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6706
6707
6708
6709
  			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
6710
6711
  				pCurrCard->discQCount--;
  				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6712
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6713
  				pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6714
6715
  				pCurrCard->discQ_Tbl[currTar_Info->
  						     LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6716
6717
6718
6719
  			}
  		}
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6720
6721
6722
6723
  	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
6724
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6725

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6726
6727
6728
6729
6730
6731
6732
  /*---------------------------------------------------------------------
   *
   * Function: Queue Disconnect
   *
   * Description: Add SCCB to our disconnect array.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6733
  static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6734
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6735
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6736

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6737
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6738

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6739
6740
6741
6742
6743
6744
6745
6746
6747
6748
6749
  	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...
6750
  			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6751
6752
6753
  		} else {
  			FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
  						      LunDiscQ_Idx[0]] = p_sccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6754
6755
  		}
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6756
  	FPT_BL_Card[p_card].currentSCCB = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6757
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6758
6759
6760
6761
6762
6763
6764
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6765
  static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6766
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6767
6768
6769
  	unsigned char qtag, thisTarg;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6770

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6771
6772
6773
6774
6775
6776
  	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
6777

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6778
6779
6780
  			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
6781

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6782
6783
  				FPT_BL_Card[p_card].discQ_Tbl[qtag]->
  				    HostStatus = (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6784

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6785
6786
6787
  				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
6788

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6789
6790
  				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  				currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6791

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6792
6793
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6794
6795
6796
6797
6798
6799
6800
6801
6802
6803
6804
  	}
  
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush Target SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6805
6806
  static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
  				   unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6807
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6808
6809
  	unsigned char qtag;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6810

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6811
  	currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6812

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6813
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6814

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6815
6816
  		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
6817

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6818
6819
  			FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
  			    (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6820

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6821
6822
6823
  			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
6824

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6825
6826
  			FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  			currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6827

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6828
6829
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6830
6831
  
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6832
  static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6833
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6834
6835
  	struct sccb_mgr_tar_info *currTar_Info;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6836

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6837
  	p_SCCB->Sccb_forwardlink = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6838

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6839
  	p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6840

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6841
  	if (currTar_Info->TarSelQ_Cnt == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6842

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6843
6844
  		currTar_Info->TarSelQ_Head = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6845

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6848
6849
  		currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6850

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6851
6852
  	currTar_Info->TarSelQ_Tail = p_SCCB;
  	currTar_Info->TarSelQ_Cnt++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6853
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6854
6855
6856
6857
6858
6859
6860
6861
  /*---------------------------------------------------------------------
   *
   * Function: Queue Find SCCB
   *
   * Description: Search the target select Queue for this SCCB, and
   *              remove it if found.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6862
6863
  static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
  				       unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6864
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6865
6866
  	struct sccb *q_ptr;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6867

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6868
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6869

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6870
  	q_ptr = currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6871

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6872
  	while (q_ptr != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6873

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6874
  		if (q_ptr == p_SCCB) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6875

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6876
  			if (currTar_Info->TarSelQ_Head == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6877

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6878
6879
  				currTar_Info->TarSelQ_Head =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6880
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6881
  			if (currTar_Info->TarSelQ_Tail == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6882

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6883
6884
  				currTar_Info->TarSelQ_Tail =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6885
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6886
6887
6888
  			if (q_ptr->Sccb_forwardlink != NULL) {
  				q_ptr->Sccb_forwardlink->Sccb_backlink =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6889
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6890
6891
6892
  			if (q_ptr->Sccb_backlink != NULL) {
  				q_ptr->Sccb_backlink->Sccb_forwardlink =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6893
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6894
  			currTar_Info->TarSelQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6895

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6896
  			return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6897
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6898

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6899
6900
6901
6902
  		else {
  			q_ptr = q_ptr->Sccb_forwardlink;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6903

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6904
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6905
6906
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6907
6908
6909
6910
6911
6912
6913
6914
6915
6916
6917
6918
  /*---------------------------------------------------------------------
   *
   * 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...
6919
  static void FPT_utilUpdateResidual(struct sccb *p_SCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6920
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6921
6922
  	unsigned long partial_cnt;
  	unsigned int sg_index;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6923
  	struct blogic_sg_seg *segp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6924

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6925
  	if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6926

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6927
6928
  		p_SCCB->DataLength = 0x0000;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6929

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6930
  	else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6931

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6932
  		partial_cnt = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6933

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6934
  		sg_index = p_SCCB->Sccb_sgseg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6935

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6936

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6937
  		if (p_SCCB->Sccb_SGoffset) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6938
6939
6940
  
  			partial_cnt = p_SCCB->Sccb_SGoffset;
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6941
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6942

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6943
6944
  		while (((unsigned long)sg_index *
  			(unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6945
6946
6947
  			segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) +
  					(sg_index * 2);
  			partial_cnt += segp->segbytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6948
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6949
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6950

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6951
6952
  		p_SCCB->DataLength = partial_cnt;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6953

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6956
6957
  		p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6958
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6959
6960
6961
6962
6963
6964
6965
  /*---------------------------------------------------------------------
   *
   * Function: Wait 1 Second
   *
   * Description: Wait for 1 second.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6966
  static void FPT_Wait1Second(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6967
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6968
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6969

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6972
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6973

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6974
6975
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6976

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6977
6978
6979
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6980
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6981
6982
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6983
   * Function: FPT_Wait
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6984
6985
6986
6987
   *
   * Description: Wait the desired delay.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6988
  static void FPT_Wait(u32 p_port, unsigned char p_delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6989
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6990
6991
  	unsigned char old_timer;
  	unsigned char green_flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6992

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6993
  	old_timer = RD_HARPOON(p_port + hp_seltimeout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6994

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6995
6996
  	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
6997

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6998
6999
7000
  	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
7001

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7002
7003
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7004

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7005
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7006

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7007
7008
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7009

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7010
7011
7012
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7013

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7014
7015
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7016

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7017
7018
  	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
  	WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7019

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7020
  	WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7021

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7022
  	WR_HARPOON(p_port + hp_seltimeout, old_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7023
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7024
7025
7026
7027
7028
7029
7030
7031
  /*---------------------------------------------------------------------
   *
   * Function: Enable/Disable Write to EEPROM
   *
   * Description: The EEPROM must first be enabled for writes
   *              A total of 9 clocks are needed.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7032
  static void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7033
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7034
  	unsigned char ee_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7035

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7036
7037
7038
  	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
7039

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7040
  	if (p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7041

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7042
  		FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7043

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7046
  		FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7047

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7048
7049
  	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
7050
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7051
7052
7053
7054
7055
7056
7057
7058
  /*---------------------------------------------------------------------
   *
   * Function: Write EEPROM
   *
   * Description: Write a word to the EEPROM at the specified
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7059
  static void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7060
  			    unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7061
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7062
7063
  	unsigned char ee_value;
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7064

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7065
7066
7067
7068
  	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
7069

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7070
  	FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7071

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7072
  	ee_value |= (SEE_MS + SEE_CS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7073

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7074
  	for (i = 0x8000; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7075

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
  		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
7092

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7093
  	FPT_Wait(p_port, TO_10ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7094

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7095
7096
7097
  	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
7098
7099
7100
7101
7102
7103
7104
7105
7106
7107
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7108
  static unsigned short FPT_utilEERead(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7109
  				     unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7110
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7111
  	unsigned short i, ee_data1, ee_data2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7112
7113
  
  	i = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7114
  	ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7115
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7116
  		ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7117

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7118
  		if (ee_data1 == ee_data2)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7119
  			return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7120
7121
7122
  
  		ee_data1 = ee_data2;
  		i++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7123
  	} while (i < 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7124

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7125
  	return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7126
7127
7128
7129
7130
7131
7132
7133
7134
7135
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM Original 
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7136
  static unsigned short FPT_utilEEReadOrg(u32 p_port, unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7137
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7138
7139
  	unsigned char ee_value;
  	unsigned short i, ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7140

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7141
7142
7143
7144
  	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
7145

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7146
  	FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7147

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7148
7149
  	ee_value |= (SEE_MS + SEE_CS);
  	ee_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7150

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7153
7154
7155
7156
7157
7158
  		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
7159

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7160
  		ee_data <<= 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7161

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7162
7163
7164
  		if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
  			ee_data |= 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7165

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7166
7167
7168
  	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
7169

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7170
  	return ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7171
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7172
7173
7174
7175
7176
7177
7178
7179
  /*---------------------------------------------------------------------
   *
   * Function: Send EE command and Address to the EEPROM
   *
   * Description: Transfers the correct command and sends the address
   *              to the eeprom.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7180
  static void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7181
  				  unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7182
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7183
7184
  	unsigned char ee_value;
  	unsigned char narrow_flg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7185

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7186
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7187

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7188
7189
7190
  	narrow_flg =
  	    (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
  			    NARROW_SCSI_CARD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7191

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7192
7193
  	ee_value = SEE_MS;
  	WR_HARPOON(p_port + hp_ee_ctrl, ee_value);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7194

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7195
7196
  	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
7197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7198
  	for (i = 0x04; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7199

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
  		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
7214

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7215
7216
  	if (narrow_flg)
  		i = 0x0080;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7217

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7218
7219
  	else
  		i = 0x0200;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7220

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7221
  	while (i != 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7222

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7223
7224
7225
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
  		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
7239
  }
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
7240
  static unsigned short FPT_CalcCrc16(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7241
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7242
7243
7244
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
  	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...
7255
  	return crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7256
  }
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7257
  static unsigned char FPT_CalcLrc(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7258
7259
  {
  	int i;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7260
  	unsigned char lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7261
  	lrc = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7262
  	for (i = 0; i < ID_STRING_LENGTH; i++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7263
  		lrc ^= buffer[i];
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7264
  	return lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7265
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7266
7267
7268
7269
7270
  /*
    The following inline definitions avoid type conflicts.
  */
  
  static inline unsigned char
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7271
  FlashPoint__ProbeHostAdapter(struct fpoint_info *FlashPointInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7272
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7273
7274
  	return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
  					   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7275
  }
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7276
  static inline void *
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7277
  FlashPoint__HardwareResetHostAdapter(struct fpoint_info *FlashPointInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7278
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7279
7280
  	return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
  						   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7281
7282
7283
  }
  
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7284
  FlashPoint__ReleaseHostAdapter(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7285
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7286
  	FlashPoint_ReleaseHostAdapter(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7287
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7288
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7289
  FlashPoint__StartCCB(void *CardHandle, struct blogic_ccb *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7290
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7291
  	FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7292
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7293
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7294
  FlashPoint__AbortCCB(void *CardHandle, struct blogic_ccb *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7295
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7296
  	FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7297
  }
2065e310c   Richard Knutsson   [SCSI] BusLogic: ...
7298
  static inline bool
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7299
  FlashPoint__InterruptPending(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7300
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7301
  	return FlashPoint_InterruptPending(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7302
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7303
  static inline int
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7304
  FlashPoint__HandleInterrupt(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7305
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7306
  	return FlashPoint_HandleInterrupt(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7307
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7308
7309
7310
7311
7312
7313
7314
  #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: ...
7315
  #else				/* !CONFIG_SCSI_FLASHPOINT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7316
7317
7318
7319
  
  /*
    Define prototypes for the FlashPoint SCCB Manager Functions.
  */
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7320
  extern unsigned char FlashPoint_ProbeHostAdapter(struct fpoint_info *);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7321
7322
7323
7324
7325
7326
  extern void *FlashPoint_HardwareResetHostAdapter(struct fpoint_info *);
  extern void FlashPoint_StartCCB(void *, struct blogic_ccb *);
  extern int FlashPoint_AbortCCB(void *, struct blogic_ccb *);
  extern bool FlashPoint_InterruptPending(void *);
  extern int FlashPoint_HandleInterrupt(void *);
  extern void FlashPoint_ReleaseHostAdapter(void *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7327

78b4b05db   Matthew Wilcox   [SCSI] BusLogic: ...
7328
  #endif				/* CONFIG_SCSI_FLASHPOINT */