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
  		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 */
df561f668   Gustavo A. R. Silva   treewide: Use fal...
1000
1001
  				temp6 |= 0x8000;
  				fallthrough;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1002
  			case AUTO_RATE_10:	/* Synchronous, 10 mega-transfers/second */
df561f668   Gustavo A. R. Silva   treewide: Use fal...
1003
1004
  				temp5 |= 0x8000;
  				fallthrough;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1005
  			case AUTO_RATE_05:	/* Synchronous, 5 mega-transfers/second */
df561f668   Gustavo A. R. Silva   treewide: Use fal...
1006
1007
  				temp2 |= 0x8000;
  				fallthrough;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1008
1009
1010
  			case AUTO_RATE_00:	/* Asynchronous */
  				break;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1011

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1021
1022
1023
1024
1025
  	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
1026

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1056
1057
1058
1059
1060
  	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
1061

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
1096
1097
1098
  	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
1099

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1100
1101
1102
  		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
1103

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
1133
1134
1135
  	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
1136

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1139
1140
1141
1142
1143
  	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
1144
1145
1146
1147
1148
  
  	/* 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...
1149
1150
  	    (unsigned
  	     char)(RD_HARPOON(ioport + hp_aramBase + BIOS_RELATIVE_CARD) - 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1151

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1154
1155
1156
1157
1158
1159
1160
1161
  	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
1162

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1165
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1166
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1167
1168
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1169
   * Function: FlashPoint_HardwareResetHostAdapter
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1170
1171
1172
1173
   *
   * Description: Setup adapter for normal operation (hard reset).
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1174
  static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1175
  							 *pCardInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1176
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1177
1178
1179
1180
  	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: ...
1181
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1182

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1247
1248
1249
1250
  	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
1251

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1553
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1554
1555
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1556
   * Function: FlashPoint_AbortCCB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1557
1558
1559
1560
1561
1562
   *
   * 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: ...
1563
  static int FlashPoint_AbortCCB(void *pCurrCard, struct sccb *p_Sccb)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1564
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
1565
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1566

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

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1590
1591
1592
  			p_Sccb->SccbStatus = SCCB_ABORT;
  			callback = p_Sccb->SccbCallback;
  			callback(p_Sccb);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1593

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

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

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
1679
  		return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1680
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1681
1682
  /*---------------------------------------------------------------------
   *
d8b6b8bd8   Alexey Dobriyan   [SCSI] drivers/sc...
1683
   * Function: FlashPoint_HandleInterrupt
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1684
1685
1686
1687
1688
1689
   *
   * 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: ...
1690
  static int FlashPoint_HandleInterrupt(void *pcard)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1691
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1692
1693
1694
1695
  	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: ...
1696
1697
  	struct sccb_card *pCurrCard = pcard;
  	u32 ioport;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1698

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1825
1826
1827
1828
1829
  				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
1830

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
1872
1873
1874
  		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
1875

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1944
1945
  	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
1946

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1953
1954
1955
1956
1957
  		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
1958

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1971
1972
1973
1974
1975
  			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
1976

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
1987
1988
1989
  		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
1990

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2048
2049
2050
2051
  		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
2052

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2248
2249
2250
2251
2252
  	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
2253

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2338
2339
2340
2341
  	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
2342

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2351
2352
2353
2354
  		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
2355

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2365
2366
2367
2368
  	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
2369

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2393
2394
2395
2396
2397
  	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
2398

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2409
2410
2411
2412
  				/* 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
2413

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2489
2490
2491
2492
2493
  		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
2494

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2507
2508
2509
2510
  	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
2511

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
2851
  			if (currSCCB->Lun == 0x00) {
adb11023a   Nathan Chancellor   scsi: FlashPoint:...
2852
  				if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2853

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

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

adb11023a   Nathan Chancellor   scsi: FlashPoint:...
2861
2862
  				else if (currSCCB->Sccb_scsistat ==
  					  SELECT_WN_ST) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2863

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3037
3038
3039
3040
  		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
3041

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3044
3045
3046
3047
3048
  		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
3049

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3145
3146
3147
  	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
3148

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3270
3271
3272
3273
  		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
3274

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

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

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

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

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
3293
  		return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3294
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3295

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3394
3395
  	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
3396

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3399
3400
  	while (!(RDW_HARPOON((port + hp_intstat)) & (BUS_FREE | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3401
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3402
3403
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
3404
   * Function: FPT_sssyncv
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3405
3406
3407
3408
3409
   *
   * Description: Write the desired value to the Sync Register for the
   *              ID specified.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
3410
  static void FPT_sssyncv(u32 p_port, unsigned char p_id,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3411
3412
  			unsigned char p_sync_value,
  			struct sccb_mgr_tar_info *currTar_Info)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3413
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
3464
3465
3466
  	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
3467

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3487
3488
3489
  	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
3490

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3493
3494
3495
  	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
3496

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3515
3516
3517
3518
  		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
3519

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3649
3650
3651
3652
3653
  	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
3654

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3655
3656
3657
3658
3659
  	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
3660

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3696
3697
3698
3699
  		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
3700

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3737
3738
3739
3740
3741
  	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
3742

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3745
3746
3747
3748
  		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
3749

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3790
3791
3792
3793
  		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
3794

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3799
3800
3801
  	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
3802

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3881
3882
  	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
3883

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3894
3895
3896
  		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
3897

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3920
3921
3922
  	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
3923

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
3938
3939
3940
  		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
3941

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4204
  	ACCEPT_MSG_ATN(port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4205
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4206
4207
4208
4209
4210
4211
4212
4213
  /*---------------------------------------------------------------------
   *
   * 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: ...
4214
  static void FPT_phaseChkFifo(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4215
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4216
  	u32 xfercnt;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4217
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4218

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4223
4224
4225
  		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
4226

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4232
4233
4234
4235
4236
  			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
4237

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4242
4243
4244
4245
  			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
4246

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4270
4271
4272
  	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
4273

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4274
  	WRW_HARPOON((port + hp_intstat), XFER_CNT_0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4275
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4276
4277
4278
4279
4280
4281
4282
4283
  /*---------------------------------------------------------------------
   *
   * 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: ...
4284
  static void FPT_phaseBusFree(u32 port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4285
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4286
  	struct sccb *currSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4287

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4296
4297
4298
4299
4300
  			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
4301
  			else
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
4342
4343
4344
  				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
4345

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

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4373
4374
4375
4376
4377
4378
4379
  /*---------------------------------------------------------------------
   *
   * Function: Auto Load Default Map
   *
   * Description: Load the Automation RAM with the defualt map values.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4380
  static void FPT_autoLoadDefaultMap(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4381
  {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4382
  	u32 map_addr;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
4472
4473
4474
  
  	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
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Auto Command Complete
   *
   * Description: Post command back to host and find another command
   *              to execute.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4485
  static void FPT_autoCmdCmplt(u32 p_port, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4486
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4487
4488
  	struct sccb *currSCCB;
  	unsigned char status_byte;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4489

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4536
4537
  			return;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4538

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4543
4544
4545
  			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
4546

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4589
4590
4591
  			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
4592

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4593
4594
4595
4596
4597
4598
  			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...
4599
  					FPT_BL_Card[p_card].discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
  				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
4623
4624
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
  			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
4636
  				}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4637
4638
4639
4640
4641
  				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
4642
4643
4644
  				}
  			}
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
4713
4714
4715
  		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
4716
4717
  						}
  					}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4718
4719
4720
4721
4722
  					return;
  				}
  			}
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4723

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

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

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

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4794
4795
4796
4797
  	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
4798

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

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

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

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

391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
4813
4814
4815
4816
4817
  		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
4818

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4847
4848
4849
4850
  		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
4851

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4863
4864
4865
4866
  		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
4867

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4899
4900
4901
  		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
4902

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4909
4910
4911
  		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
4912

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4942
4943
  	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
4944

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
4982
4983
4984
4985
  			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
4986

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5112
5113
5114
5115
5116
5117
  				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
5118

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5191
5192
5193
  					pCurrSCCB->HostStatus = SCCB_BM_ERR;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5194

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

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

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

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

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

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

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

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

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

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

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

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5248

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5251
  			sg_index++;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5252
5253
5254
  			segp = (struct blogic_sg_seg *)(currSCCB->DataPointer) +
  						(sg_index * 2);
  			data_count += segp->segbytes;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5255
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5256

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5257
  		if (data_count == currSCCB->Sccb_ATC) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5258

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5259
5260
5261
  			currSCCB->Sccb_SGoffset = 0;
  			sg_index++;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5262

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5263
5264
5265
5266
  		else {
  			currSCCB->Sccb_SGoffset =
  			    data_count - currSCCB->Sccb_ATC;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5267

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5268
5269
  		currSCCB->Sccb_sgseg = (unsigned short)sg_index;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5270

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5271
5272
5273
5274
  	else {
  		currSCCB->Sccb_XferCnt =
  		    currSCCB->DataLength - currSCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5275
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5276

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5277
5278
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5279
   * Function: FPT_scini
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5280
5281
5282
5283
   *
   * Description: Setup all data structures necessary for SCAM selection.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5284
5285
  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
5286
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5287
  	unsigned char loser, assigned_id;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5288
  	u32 p_port;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5289

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5290
5291
5292
  	unsigned char i, k, ScamFlg;
  	struct sccb_card *currCard;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5293

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5294
5295
  	currCard = &FPT_BL_Card[p_card];
  	p_port = currCard->ioPort;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5296
  	pCurrNvRam = currCard->pNvRamInfo;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5297
  	if (pCurrNvRam) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5298
5299
  		ScamFlg = pCurrNvRam->niScamConf;
  		i = pCurrNvRam->niSysConf;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5300
5301
5302
5303
5304
  	} 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
5305
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5306
  	if (!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5307
  		return;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5308
  	FPT_inisci(p_card, p_port, p_our_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5309

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5310
5311
  	/* 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
5312

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5313
5314
5315
5316
  	/* if (p_power_up)
  	   FPT_Wait1Second(p_port);
  	   else
  	   FPT_Wait(p_port, TO_250ms); */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5317

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5318
  	FPT_Wait1Second(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5319

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5320
5321
5322
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2)) {
  		while (!(FPT_scarb(p_port, INIT_SELTD))) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5323

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5324
  		FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5325

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5326
5327
5328
5329
5330
5331
5332
  		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
5333

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5336
5337
5338
  		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
5339

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5340
5341
  			while (!(FPT_scarb(p_port, INIT_SELTD))) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5342

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5343
  			FPT_scsel(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5344

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5345
5346
5347
5348
5349
5350
5351
5352
  			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
5353

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5354
5355
5356
  			FPT_scbusf(p_port);
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5357

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5358
5359
5360
  	else {
  		loser = 0;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5361

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
5388
5389
5390
  	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
5391

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5392
5393
5394
5395
5396
5397
5398
  			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
5399

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5402
5403
5404
5405
  	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
5406

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5407
5408
5409
  		do {
  			while (FPT_scxferc(p_port, 0x00) != SYNC_PTRN) {
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5410

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
5443
5444
5445
  			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
5446

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5447
5448
5449
5450
5451
5452
5453
5454
  			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
5455

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5456
5457
5458
  		while (FPT_scxferc(p_port, 0x00) != CFG_CMPLT) {
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5459

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5460
5461
5462
5463
5464
5465
5466
  	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
5467

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5468
5469
5470
  /*
     for (i=0,k=0; i < MAX_SCSI_TAR; i++)
        {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5471
5472
        if ((FPT_scamInfo[i].state == ID_ASSIGNED) ||
           (FPT_scamInfo[i].state == LEGACY))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5473
5474
5475
5476
5477
5478
5479
5480
5481
           k++;
        }
  
     if (k==2)
        currCard->globalFlags |= F_SINGLE_DEVICE;
     else
        currCard->globalFlags &= ~F_SINGLE_DEVICE;
  */
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5482
5483
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5484
   * Function: FPT_scarb
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5485
5486
5487
5488
   *
   * Description: Gain control of the bus and wait SCAM select time (250ms)
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5489
  static int FPT_scarb(u32 p_port, unsigned char p_sel_type)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5490
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5491
  	if (p_sel_type == INIT_SELTD) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5492

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5493
5494
  		while (RD_HARPOON(p_port + hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5495

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5496
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL)
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
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5500
  			return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5501

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5502
5503
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5504

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5505
  		if (RD_HARPOON(p_port + hp_scsisig) & SCSI_SEL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5506

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5507
5508
5509
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~SCSI_BSY));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5510
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5511
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5512

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5513
5514
  		WR_HARPOON(p_port + hp_scsisig,
  			   (RD_HARPOON(p_port + hp_scsisig) | SCSI_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5515

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5516
  		if (RD_HARPOON(p_port + hp_scsidata_0) != 00) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5517

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5518
5519
5520
  			WR_HARPOON(p_port + hp_scsisig,
  				   (RD_HARPOON(p_port + hp_scsisig) &
  				    ~(SCSI_BSY | SCSI_SEL)));
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5521
  			return 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5522
5523
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5524

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5525
5526
5527
5528
5529
5530
  	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
5531

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5532
5533
  	WR_HARPOON(p_port + hp_scsisig,
  		   (RD_HARPOON(p_port + hp_scsisig) | SCSI_MSG));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5534

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5535
5536
  	WR_HARPOON(p_port + hp_scsisig, (RD_HARPOON(p_port + hp_scsisig)
  					 & ~SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5537

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5538
  	FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5539

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5540
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5541
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5542
5543
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5544
   * Function: FPT_scbusf
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5545
5546
5547
5548
   *
   * Description: Release the SCSI bus and disable SCAM selection.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5549
  static void FPT_scbusf(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5550
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5551
5552
  	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
5553

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5556
5557
  	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
5558

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5561
5562
  	WR_HARPOON(p_port + hp_scsireset, (RD_HARPOON(p_port + hp_scsireset)
  					   & ~SCAM_EN));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5563

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5564
5565
  	WR_HARPOON(p_port + hp_clkctrl_0, (RD_HARPOON(p_port + hp_clkctrl_0)
  					   | ACTdeassert));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5566

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5567
  	WRW_HARPOON((p_port + hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5568

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5569
5570
  	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
5571
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5572
5573
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5574
   * Function: FPT_scasid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5575
5576
5577
5578
   *
   * Description: Assign an ID to all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5579
  static void FPT_scasid(unsigned char p_card, u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5580
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5581
  	unsigned char temp_id_string[ID_STRING_LENGTH];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5582

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5583
  	unsigned char i, k, scam_id;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5584
  	unsigned char crcBytes[3];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5585
5586
  	struct nvram_info *pCurrNvRam;
  	unsigned short *pCrcBytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5587

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5588
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5589

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5590
  	i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5591

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5592
  	while (!i) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5593

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5594
5595
5596
  		for (k = 0; k < ID_STRING_LENGTH; k++) {
  			temp_id_string[k] = (unsigned char)0x00;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5597

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5598
5599
  		FPT_scxferc(p_port, SYNC_PTRN);
  		FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5600

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5601
5602
  		if (!(FPT_sciso(p_port, &temp_id_string[0]))) {
  			if (pCurrNvRam) {
fd1e29ed6   Alexey Dobriyan   [SCSI] drivers/sc...
5603
  				pCrcBytes = (unsigned short *)&crcBytes[0];
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5604
5605
  				*pCrcBytes = FPT_CalcCrc16(&temp_id_string[0]);
  				crcBytes[2] = FPT_CalcLrc(&temp_id_string[0]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5606
5607
5608
  				temp_id_string[1] = crcBytes[2];
  				temp_id_string[2] = crcBytes[0];
  				temp_id_string[3] = crcBytes[1];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5609
5610
  				for (k = 4; k < ID_STRING_LENGTH; k++)
  					temp_id_string[k] = (unsigned char)0x00;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5611
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5612
  			i = FPT_scmachid(p_card, temp_id_string);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5613

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5614
5615
5616
5617
5618
  			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
5619

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5620
5621
5622
5623
5624
  			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
5625

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5626
  				scam_id = (i & (unsigned char)0x07);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5627

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5628
5629
5630
  				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
5631

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5632
  				FPT_scxferc(p_port, scam_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5633

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5634
5635
5636
  				i = 0;	/*Not the last ID yet. */
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5637

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5638
5639
5640
  		else {
  			i = 1;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5641

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5642
  	}			/*End while */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5643

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5644
5645
  	FPT_scxferc(p_port, SYNC_PTRN);
  	FPT_scxferc(p_port, CFG_CMPLT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5646
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5647
5648
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5649
   * Function: FPT_scsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5650
5651
5652
5653
   *
   * Description: Select all the SCAM devices.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5654
  static void FPT_scsel(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5655
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5656
5657
  	WR_HARPOON(p_port + hp_scsisig, SCSI_SEL);
  	FPT_scwiros(p_port, SCSI_MSG);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5658

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5659
  	WR_HARPOON(p_port + hp_scsisig, (SCSI_SEL | SCSI_BSY));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5660

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5661
5662
5663
5664
5665
  	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
5666

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5667
5668
  	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
5669

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5670
5671
5672
5673
  	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
5674

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5675
5676
  	WR_HARPOON(p_port + hp_scsisig,
  		   (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5677
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5678
5679
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5680
   * Function: FPT_scxferc
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5681
5682
5683
5684
   *
   * Description: Handshake the p_data (DB4-0) across the bus.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5685
  static unsigned char FPT_scxferc(u32 p_port, unsigned char p_data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5686
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5687
  	unsigned char curr_data, ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5688

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5689
  	curr_data = p_data | BIT(7) | BIT(5);	/*Start with DB7 & DB5 asserted. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5690

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5691
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5692

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5693
  	curr_data &= ~BIT(7);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5694

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5695
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5696

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5697
5698
  	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
5699

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5700
  	ret_data = (RD_HARPOON(p_port + hp_scsidata_0) & (unsigned char)0x1F);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5701

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5702
  	curr_data |= BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5703

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5704
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5705

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5706
  	curr_data &= ~BIT(5);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5707

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5708
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5709

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5710
  	FPT_scwirod(p_port, BIT(5));	/*Wait for DB5 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5711

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5712
5713
  	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
5714

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5715
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5716

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5717
  	curr_data &= ~BIT(6);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5718

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5719
  	WR_HARPOON(p_port + hp_scsidata_0, curr_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5720

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5721
  	FPT_scwirod(p_port, BIT(6));	/*Wait for DB6 to be released. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5722

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5723
  	return ret_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5724
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5725
5726
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5727
   * Function: FPT_scsendi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5728
5729
5730
5731
5732
   *
   * Description: Transfer our Identification string to determine if we
   *              will be the dominant master.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5733
  static unsigned char FPT_scsendi(u32 p_port, unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5734
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5735
  	unsigned char ret_data, byte_cnt, bit_cnt, defer;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5736

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5737
  	defer = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5738

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5739
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5740

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5741
  		for (bit_cnt = 0x80; bit_cnt != 0; bit_cnt >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5742

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5743
5744
  			if (defer)
  				ret_data = FPT_scxferc(p_port, 00);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5745

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5746
  			else if (p_id_string[byte_cnt] & bit_cnt)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5747

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5748
  				ret_data = FPT_scxferc(p_port, 02);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5749

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5752
5753
5754
5755
  				ret_data = FPT_scxferc(p_port, 01);
  				if (ret_data & 02)
  					defer = 1;
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5756

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5757
  			if ((ret_data & 0x1C) == 0x10)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5758
  				return 0x00;	/*End of isolation stage, we won! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5759

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5760
  			if (ret_data & 0x1C)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5761
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5762

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5763
  			if ((defer) && (!(ret_data & 0x1F)))
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5764
  				return 0x01;	/*End of isolation stage, we lost. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5765

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5766
  		}		/*bit loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5767

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5768
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5769

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5770
  	if (defer)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5771
  		return 0x01;	/*We lost */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5772
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5773
  		return 0;	/*We WON! Yeeessss! */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5774
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5775
5776
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5777
   * Function: FPT_sciso
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5778
5779
5780
5781
   *
   * Description: Transfer the Identification string.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5782
  static unsigned char FPT_sciso(u32 p_port, unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5783
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5784
  	unsigned char ret_data, the_data, byte_cnt, bit_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5785

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5786
  	the_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5787

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5788
  	for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5789

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5790
  		for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5791

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5792
  			ret_data = FPT_scxferc(p_port, 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5793

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5794
  			if (ret_data & 0xFC)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5795
  				return 0xFF;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5796

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5799
5800
5801
5802
5803
  				the_data <<= 1;
  				if (ret_data & BIT(1)) {
  					the_data |= 1;
  				}
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5804

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5805
  			if ((ret_data & 0x1F) == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5806
5807
5808
5809
5810
  /*
  				if(bit_cnt != 0 || bit_cnt != 8)
  				{
  					byte_cnt = 0;
  					bit_cnt = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5811
5812
  					FPT_scxferc(p_port, SYNC_PTRN);
  					FPT_scxferc(p_port, ASSIGN_ID);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5813
5814
5815
  					continue;
  				}
  */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5816
  				if (byte_cnt)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5817
  					return 0x00;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5818
  				else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5819
  					return 0xFF;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5820
  			}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5821

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5822
  		}		/*bit loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5823

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5824
  		p_id_string[byte_cnt] = the_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5825

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5826
  	}			/*byte loop */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5827

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5828
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5829
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5830
5831
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5832
   * Function: FPT_scwirod
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5833
5834
5835
5836
5837
   *
   * 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: ...
5838
  static void FPT_scwirod(u32 p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5839
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5840
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5841

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5842
5843
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5844

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5845
  		if (RD_HARPOON(p_port + hp_scsidata_0) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5846

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5847
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5848

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5851
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5852

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5853
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5854
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5855
5856
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5857
   * Function: FPT_scwiros
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5858
5859
5860
5861
5862
   *
   * 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: ...
5863
  static void FPT_scwiros(u32 p_port, unsigned char p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5864
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5865
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5866

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5867
5868
  	i = 0;
  	while (i < MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5869

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5870
  		if (RD_HARPOON(p_port + hp_scsisig) & p_data_bit)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5871

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5872
  			i = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5873

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5876
  			i++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5877

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5878
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5879
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5880

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5881
5882
5883
5884
5885
5886
5887
  /*---------------------------------------------------------------------
   *
   * Function: FPT_scvalq
   *
   * Description: Make sure we received a valid data byte.
   *
   *---------------------------------------------------------------------*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5888

db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
5889
  static unsigned char FPT_scvalq(unsigned char p_quintet)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5890
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5891
  	unsigned char count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5892

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5893
5894
5895
5896
  	for (count = 1; count < 0x08; count <<= 1) {
  		if (!(p_quintet & count))
  			p_quintet -= 0x80;
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5897

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5898
  	if (p_quintet & 0x18)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5899
  		return 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5900

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5901
  	else
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5902
  		return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5903
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5904
5905
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5906
   * Function: FPT_scsell
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5907
5908
   *
   * Description: Select the specified device ID using a selection timeout
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5909
5910
   *              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
5911
5912
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5913
  static unsigned char FPT_scsell(u32 p_port, unsigned char targ_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5914
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5915
  	unsigned long i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5916

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5917
5918
  	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
5919

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5922
5923
5924
  	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
5925

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5926
5927
5928
5929
  	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
5930

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5931
5932
  	WRW_HARPOON((p_port + hp_intstat),
  		    (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5933

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5934
  	WR_HARPOON(p_port + hp_select_id, targ_id);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5935

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5936
5937
5938
  	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
5939

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5940
5941
5942
  	while (!(RDW_HARPOON((p_port + hp_intstat)) &
  		 (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5943

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5944
5945
  	if (RDW_HARPOON((p_port + hp_intstat)) & RESET)
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5946

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5949
5950
5951
  	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
5952

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5953
  	SGRAM_ACCESS(p_port);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5954

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5955
  	if (RDW_HARPOON((p_port + hp_intstat)) & (RESET | TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5956

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5957
5958
  		WRW_HARPOON((p_port + hp_intstat),
  			    (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5959

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5960
5961
5962
  		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
5963

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5964
  		return 0;	/*No legacy device */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5965
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5966

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5969
5970
5971
5972
5973
5974
  		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
5975
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5976
  		WRW_HARPOON((p_port + hp_intstat), CLR_ALL_INT_1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5977

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5978
5979
5980
  		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
5981

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
5982
  		return 1;	/*Found one of them oldies! */
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5983
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5984
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5985
5986
5987
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
5988
   * Function: FPT_scwtsel
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5989
5990
5991
5992
   *
   * Description: Wait to be selected by another SCAM initiator.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
5993
  static void FPT_scwtsel(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5994
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
5995
5996
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL)) {
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5997
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5998
5999
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6000
   * Function: FPT_inisci
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6001
6002
6003
6004
   *
   * Description: Setup the data Structure with the info from the EEPROM.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6005
  static void FPT_inisci(unsigned char p_card, u32 p_port, unsigned char p_our_id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6006
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6007
6008
6009
  	unsigned char i, k, max_id;
  	unsigned short ee_data;
  	struct nvram_info *pCurrNvRam;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6010

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6011
  	pCurrNvRam = FPT_BL_Card[p_card].pNvRamInfo;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6013
6014
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6015

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6016
6017
  	else
  		max_id = 0x10;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6018

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6019
6020
  	if (pCurrNvRam) {
  		for (i = 0; i < max_id; i++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6021

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6022
6023
6024
6025
6026
6027
  			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
6028

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6029
6030
6031
6032
  			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
6033
6034
  
  		}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6035
6036
6037
6038
6039
6040
6041
6042
6043
6044
6045
6046
6047
6048
6049
  	} 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
6050

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6051
6052
  			if ((FPT_scamInfo[i].id_string[0] == 0x00) ||
  			    (FPT_scamInfo[i].id_string[0] == 0xFF))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6053

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6054
  				FPT_scamInfo[i].state = ID_UNUSED;	/*Default to unused ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6055

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6056
6057
  			else
  				FPT_scamInfo[i].state = ID_UNASSIGNED;	/*Default to unassigned ID. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6058

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6059
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6060
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6061
  	for (k = 0; k < ID_STRING_LENGTH; k++)
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6062
  		FPT_scamInfo[p_our_id].id_string[k] = FPT_scamHAString[k];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6063
6064
6065
6066
6067
  
  }
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6068
   * Function: FPT_scmachid
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6069
6070
6071
6072
6073
   *
   * Description: Match the Device ID string with our values stored in
   *              the EEPROM.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6074
6075
  static unsigned char FPT_scmachid(unsigned char p_card,
  				  unsigned char p_id_string[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6076
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6077
  	unsigned char i, k, match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6078

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6081
  		match = 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6082

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6083
6084
6085
6086
  		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
6087

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6088
6089
  		if (match) {
  			FPT_scamInfo[i].state = ID_ASSIGNED;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6090
  			return i;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6091
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6092

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6095
6096
6097
6098
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6099

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6100
6101
6102
6103
6104
  	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
6105

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6106
6107
  	while (i > 0) {
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6108

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6109
6110
6111
6112
6113
  		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
6114

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6115
  			FPT_scamInfo[match].state = ID_ASSIGNED;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6116

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6117
6118
6119
  			if (FPT_BL_Card[p_card].pNvRamInfo == NULL)
  				FPT_BL_Card[p_card].globalFlags |=
  				    F_UPDATE_EEPROM;
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6120
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6121

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6124
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6125

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6126
6127
6128
6129
6130
6131
  		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
6132
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6133

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6134
  	if (p_id_string[0] & BIT(7)) {
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6135
  		return CLR_PRIORITY;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6136
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6137

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6138
6139
6140
6141
  	if (p_id_string[0] & BIT(5))
  		i = 8;
  	else
  		i = MAX_SCSI_TAR;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6142

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6143
6144
6145
6146
6147
  	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
6148

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6149
  	while (i > 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6151
  		i--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6152

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6153
6154
6155
6156
6157
  		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
6158

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6159
6160
6161
6162
6163
  			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...
6164
  			return match;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6165

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6168
  		match--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6169

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6170
6171
6172
6173
6174
6175
  		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
6176
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6177

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6178
  	return NO_ID_AVAIL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6179
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6180
6181
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6182
   * Function: FPT_scsavdi
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6183
6184
6185
6186
   *
   * Description: Save off the device SCAM ID strings.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6187
  static void FPT_scsavdi(unsigned char p_card, u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6188
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6189
6190
  	unsigned char i, k, max_id;
  	unsigned short ee_data, sum_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6191

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6192
  	sum_data = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6193

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6194
6195
6196
  	for (i = 1; i < EE_SCAMBASE / 2; i++) {
  		sum_data += FPT_utilEERead(p_port, i);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6197

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6198
  	FPT_utilEEWriteOnOff(p_port, 1);	/* Enable write access to the EEPROM */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6199

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6200
6201
  	if (RD_HARPOON(p_port + hp_page_ctrl) & NARROW_SCSI_CARD)
  		max_id = 0x08;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6202

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
  	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
6219

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6220
6221
  	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
6222
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6223
6224
6225
  
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6226
   * Function: FPT_XbowInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6227
6228
6229
6230
   *
   * Description: Setup the Xbow for normal operation.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6231
  static void FPT_XbowInit(u32 port, unsigned char ScamFlg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6232
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6233
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6234

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6235
6236
  	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
6237

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6238
6239
  	WR_HARPOON(port + hp_scsireset, 0x00);
  	WR_HARPOON(port + hp_portctrl_1, HOST_MODE8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6240

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6241
6242
  	WR_HARPOON(port + hp_scsireset, (DMA_RESET | HPSCSI_RESET | PROG_RESET |
  					 FIFO_CLR));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6243

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6244
  	WR_HARPOON(port + hp_scsireset, SCSI_INI);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6245

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6246
  	WR_HARPOON(port + hp_clkctrl_0, CLKCTRL_DEFAULT);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6247

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6248
6249
  	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
6250

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6253
6254
  	FPT_default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
  	    BUS_FREE | XFER_CNT_0 | AUTO_INT;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6255

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6256
  	if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6257
  		FPT_default_intena |= SCAM_SEL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6258

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6259
  	WRW_HARPOON((port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6260

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6263
6264
6265
6266
  	/* 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
6267

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6268
  	WR_HARPOON(port + hp_page_ctrl, i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6269
6270
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6271
6272
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6273
   * Function: FPT_BusMasterInit
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6274
6275
6276
6277
   *
   * Description: Initialize the BusMaster for normal operations.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6278
  static void FPT_BusMasterInit(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6279
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6280
6281
  	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
6282

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6283
  	WR_HARPOON(p_port + hp_host_blk_cnt, XFER_BLK64);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6284

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6285
  	WR_HARPOON(p_port + hp_bm_ctrl, (BMCTRL_DEFAULT));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6286

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6287
  	WR_HARPOON(p_port + hp_ee_ctrl, (SCSI_TERM_ENA_H));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6288

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6289
6290
6291
6292
  	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
6293
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6294
6295
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6296
   * Function: FPT_DiagEEPROM
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6297
6298
6299
6300
6301
   *
   * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
   *              necessary.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6302
  static void FPT_DiagEEPROM(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6303
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6304
  	unsigned short index, temp, max_wd_cnt;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6305

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6306
6307
6308
6309
  	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
6310

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6311
  	temp = FPT_utilEERead(p_port, FW_SIGNATURE / 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6312

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6313
  	if (temp == 0x4641) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6314

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6315
  		for (index = 2; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6316

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6317
  			temp += FPT_utilEERead(p_port, index);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6318

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6321
  		if (temp == FPT_utilEERead(p_port, EEPROM_CHECK_SUM / 2)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6322

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6323
6324
6325
  			return;	/*EEPROM is Okay so return now! */
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6326

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6327
  	FPT_utilEEWriteOnOff(p_port, (unsigned char)1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6328

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6329
  	for (index = 0; index < max_wd_cnt; index++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6330

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6331
6332
  		FPT_utilEEWrite(p_port, 0x0000, index);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6333

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
6443
6444
6445
  	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
6446
6447
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6448
6449
6450
6451
6452
6453
6454
  /*---------------------------------------------------------------------
   *
   * Function: Queue Search Select
   *
   * Description: Try to find a new command to execute.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6455
6456
  static void FPT_queueSearchSelect(struct sccb_card *pCurrCard,
  				  unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6457
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6458
6459
6460
  	unsigned char scan_ptr, lun;
  	struct sccb_mgr_tar_info *currTar_Info;
  	struct sccb *pOldSccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6461

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6462
6463
  	scan_ptr = pCurrCard->scanIndex;
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6464
  		currTar_Info = &FPT_sccbMgrTbl[p_card][scan_ptr];
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6465
6466
6467
6468
  		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
6469
6470
6471
6472
  
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR)
  					scan_ptr = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6473

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6474
6475
6476
6477
6478
  				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
6479
  						pOldSccb = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
  						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
6493
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6494
6495
  						if (pCurrCard->currentSCCB ==
  						    NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6496
  							continue;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
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
6535
6536
6537
  						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
6538
6539
  							}
  						}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6540
  						pCurrCard->scanIndex = scan_ptr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6541

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6542
6543
  						pCurrCard->globalFlags |=
  						    F_NEW_SCCB_CMD;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6544

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6545
  						break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6546
6547
6548
  					}
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6549
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6550
6551
6552
6553
6554
  				scan_ptr++;
  				if (scan_ptr == MAX_SCSI_TAR) {
  					scan_ptr = 0;
  				}
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6555
  		} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6556
  			if ((currTar_Info->TarSelQ_Cnt != 0) &&
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6557
  			    (currTar_Info->TarLUNBusy[0] == 0)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6558

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6559
6560
  				pCurrCard->currentSCCB =
  				    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6561

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6562
6563
6564
  				currTar_Info->TarSelQ_Head =
  				    (struct sccb *)(pCurrCard->currentSCCB)->
  				    Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6565

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6566
  				if (currTar_Info->TarSelQ_Head == NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6567
6568
  					currTar_Info->TarSelQ_Tail = NULL;
  					currTar_Info->TarSelQ_Cnt = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6569
  				} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6570
  					currTar_Info->TarSelQ_Cnt--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6571
6572
  					currTar_Info->TarSelQ_Head->
  					    Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6584
  				}
  
  				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...
6585
  			else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6586
  				scan_ptr++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6587
  				if (scan_ptr == MAX_SCSI_TAR) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6588
6589
6590
6591
6592
6593
  					scan_ptr = 0;
  				}
  			}
  		}
  	} while (scan_ptr != pCurrCard->scanIndex);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6594
6595
6596
6597
6598
6599
6600
  /*---------------------------------------------------------------------
   *
   * Function: Queue Select Fail
   *
   * Description: Add the current SCCB to the head of the Queue.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6601
6602
  static void FPT_queueSelectFail(struct sccb_card *pCurrCard,
  				unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6603
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6604
6605
  	unsigned char thisTarg;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6606

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6607
6608
6609
6610
6611
  	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
6612

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6613
  		pCurrCard->currentSCCB->Sccb_backlink = (struct sccb *)NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6614

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6615
6616
  		pCurrCard->currentSCCB->Sccb_forwardlink =
  		    currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6617

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6618
6619
6620
  		if (currTar_Info->TarSelQ_Cnt == 0) {
  			currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6621

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6622
6623
6624
6625
  		else {
  			currTar_Info->TarSelQ_Head->Sccb_backlink =
  			    pCurrCard->currentSCCB;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6626

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6627
  		currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6628

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6629
6630
6631
  		pCurrCard->currentSCCB = NULL;
  		currTar_Info->TarSelQ_Cnt++;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6632
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6633

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6634
6635
6636
6637
6638
6639
6640
  /*---------------------------------------------------------------------
   *
   * Function: Queue Command Complete
   *
   * Description: Call the callback function with the current SCCB.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6641
6642
  static void FPT_queueCmdComplete(struct sccb_card *pCurrCard,
  				 struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6643
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656
6657
6658
6659
6660
6661
6662
6663
6664
6665
6666
  	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
6667

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6668
6669
6670
6671
6672
  	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
6673
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6674
  	if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6675

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6676
6677
6678
6679
6680
  		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
6681

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6682
6683
  	if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
  	    (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6684

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6685
6686
  		FPT_utilUpdateResidual(p_sccb);
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6687

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6688
6689
  	pCurrCard->cmdCounter--;
  	if (!pCurrCard->cmdCounter) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6690

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6691
6692
6693
6694
6695
  		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
6696

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6697
6698
6699
  		WR_HARPOON(pCurrCard->ioPort + hp_semaphore,
  			   (RD_HARPOON(pCurrCard->ioPort + hp_semaphore) &
  			    ~SCCB_MGR_ACTIVE));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6700

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6703
6704
6705
6706
6707
  	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
6708
  			pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6709
6710
6711
6712
  			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
6713
6714
  				pCurrCard->discQCount--;
  				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6715
  			} else {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6716
  				pCurrCard->discQCount--;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6717
6718
  				pCurrCard->discQ_Tbl[currTar_Info->
  						     LunDiscQ_Idx[0]] = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6719
6720
6721
6722
  			}
  		}
  
  	}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6723
6724
6725
6726
  	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
6727
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6728

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6729
6730
6731
6732
6733
6734
6735
  /*---------------------------------------------------------------------
   *
   * Function: Queue Disconnect
   *
   * Description: Add SCCB to our disconnect array.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6736
  static void FPT_queueDisconnect(struct sccb *p_sccb, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6737
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6738
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6739

47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6740
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_sccb->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6741

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6742
6743
6744
6745
6746
6747
6748
6749
6750
6751
6752
  	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...
6753
  			FPT_sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6754
6755
6756
  		} else {
  			FPT_BL_Card[p_card].discQ_Tbl[currTar_Info->
  						      LunDiscQ_Idx[0]] = p_sccb;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6757
6758
  		}
  	}
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6759
  	FPT_BL_Card[p_card].currentSCCB = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6760
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6761
6762
6763
6764
6765
6766
6767
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6768
  static void FPT_queueFlushSccb(unsigned char p_card, unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6769
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6770
6771
6772
  	unsigned char qtag, thisTarg;
  	struct sccb *currSCCB;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6773

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6774
6775
6776
6777
6778
6779
  	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
6780

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6781
6782
6783
  			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
6784

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6785
6786
  				FPT_BL_Card[p_card].discQ_Tbl[qtag]->
  				    HostStatus = (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6787

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6788
6789
6790
  				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
6791

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6792
6793
  				FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  				currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6794

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6795
6796
  			}
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6797
6798
6799
6800
6801
6802
6803
6804
6805
6806
6807
  	}
  
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Queue Flush Target SCCB
   *
   * Description: Flush all SCCB's back to the host driver for this target.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6808
6809
  static void FPT_queueFlushTargSccb(unsigned char p_card, unsigned char thisTarg,
  				   unsigned char error_code)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6810
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6811
6812
  	unsigned char qtag;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6813

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6814
  	currTar_Info = &FPT_sccbMgrTbl[p_card][thisTarg];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6815

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6816
  	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6817

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6818
6819
  		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
6820

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6821
6822
  			FPT_BL_Card[p_card].discQ_Tbl[qtag]->HostStatus =
  			    (unsigned char)error_code;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6823

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6824
6825
6826
  			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
6827

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6828
6829
  			FPT_BL_Card[p_card].discQ_Tbl[qtag] = NULL;
  			currTar_Info->TarTagQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6830

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6831
6832
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6833
6834
  
  }
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6835
  static void FPT_queueAddSccb(struct sccb *p_SCCB, unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6836
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6837
6838
  	struct sccb_mgr_tar_info *currTar_Info;
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6839

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6840
  	p_SCCB->Sccb_forwardlink = NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6841

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6842
  	p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6843

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6844
  	if (currTar_Info->TarSelQ_Cnt == 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6845

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6846
6847
  		currTar_Info->TarSelQ_Head = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6848

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6851
6852
  		currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6853

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6854
6855
  	currTar_Info->TarSelQ_Tail = p_SCCB;
  	currTar_Info->TarSelQ_Cnt++;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6856
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6857
6858
6859
6860
6861
6862
6863
6864
  /*---------------------------------------------------------------------
   *
   * Function: Queue Find SCCB
   *
   * Description: Search the target select Queue for this SCCB, and
   *              remove it if found.
   *
   *---------------------------------------------------------------------*/
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6865
6866
  static unsigned char FPT_queueFindSccb(struct sccb *p_SCCB,
  				       unsigned char p_card)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6867
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6868
6869
  	struct sccb *q_ptr;
  	struct sccb_mgr_tar_info *currTar_Info;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6870

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6871
  	currTar_Info = &FPT_sccbMgrTbl[p_card][p_SCCB->TargID];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6872

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6873
  	q_ptr = currTar_Info->TarSelQ_Head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6874

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6875
  	while (q_ptr != NULL) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6876

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6877
  		if (q_ptr == p_SCCB) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6878

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6879
  			if (currTar_Info->TarSelQ_Head == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6880

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6881
6882
  				currTar_Info->TarSelQ_Head =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6883
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6884
  			if (currTar_Info->TarSelQ_Tail == q_ptr) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6885

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6886
6887
  				currTar_Info->TarSelQ_Tail =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6888
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6889
6890
6891
  			if (q_ptr->Sccb_forwardlink != NULL) {
  				q_ptr->Sccb_forwardlink->Sccb_backlink =
  				    q_ptr->Sccb_backlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6892
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6893
6894
6895
  			if (q_ptr->Sccb_backlink != NULL) {
  				q_ptr->Sccb_backlink->Sccb_forwardlink =
  				    q_ptr->Sccb_forwardlink;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6896
  			}
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6897
  			currTar_Info->TarSelQ_Cnt--;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6898

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6899
  			return 1;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6900
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6901

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6902
6903
6904
6905
  		else {
  			q_ptr = q_ptr->Sccb_forwardlink;
  		}
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6906

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
6907
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6908
6909
  
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6910
6911
6912
6913
6914
6915
6916
6917
6918
6919
6920
6921
  /*---------------------------------------------------------------------
   *
   * 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...
6922
  static void FPT_utilUpdateResidual(struct sccb *p_SCCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6923
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6924
6925
  	unsigned long partial_cnt;
  	unsigned int sg_index;
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6926
  	struct blogic_sg_seg *segp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6927

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6928
  	if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6929

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6930
6931
  		p_SCCB->DataLength = 0x0000;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6932

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6933
  	else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6934

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6935
  		partial_cnt = 0x0000;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6936

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6937
  		sg_index = p_SCCB->Sccb_sgseg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6938

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6939

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6940
  		if (p_SCCB->Sccb_SGoffset) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6941
6942
6943
  
  			partial_cnt = p_SCCB->Sccb_SGoffset;
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6944
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6945

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6946
6947
  		while (((unsigned long)sg_index *
  			(unsigned long)SG_ELEMENT_SIZE) < p_SCCB->DataLength) {
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6948
6949
6950
  			segp = (struct blogic_sg_seg *)(p_SCCB->DataPointer) +
  					(sg_index * 2);
  			partial_cnt += segp->segbytes;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6951
  			sg_index++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6952
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6953

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6954
6955
  		p_SCCB->DataLength = partial_cnt;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6956

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6959
6960
  		p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6961
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6962
6963
6964
6965
6966
6967
6968
  /*---------------------------------------------------------------------
   *
   * Function: Wait 1 Second
   *
   * Description: Wait for 1 second.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6969
  static void FPT_Wait1Second(u32 p_port)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6970
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6971
  	unsigned char i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6972

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6975
  		FPT_Wait(p_port, TO_250ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6976

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6977
6978
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6979

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6980
6981
6982
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6983
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6984
6985
  /*---------------------------------------------------------------------
   *
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
6986
   * Function: FPT_Wait
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6987
6988
6989
6990
   *
   * Description: Wait the desired delay.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
6991
  static void FPT_Wait(u32 p_port, unsigned char p_delay)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6992
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6993
6994
  	unsigned char old_timer;
  	unsigned char green_flag;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6995

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6996
  	old_timer = RD_HARPOON(p_port + hp_seltimeout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6997

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
6998
6999
  	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
7000

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7001
7002
7003
  	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
7004

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7005
7006
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) | START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7007

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7008
  	while (!(RDW_HARPOON((p_port + hp_intstat)) & TIMEOUT)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7009

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7010
7011
  		if ((RD_HARPOON(p_port + hp_scsictrl_0) & SCSI_RST))
  			break;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7012

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7013
7014
7015
  		if ((RDW_HARPOON((p_port + hp_intstat)) & SCAM_SEL))
  			break;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7016

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7017
7018
  	WR_HARPOON(p_port + hp_portctrl_0,
  		   (RD_HARPOON(p_port + hp_portctrl_0) & ~START_TO));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7019

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7020
7021
  	WRW_HARPOON((p_port + hp_intstat), TIMEOUT);
  	WRW_HARPOON((p_port + hp_intena), FPT_default_intena);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7022

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7023
  	WR_HARPOON(p_port + hp_clkctrl_0, green_flag);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7024

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7025
  	WR_HARPOON(p_port + hp_seltimeout, old_timer);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7026
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7027
7028
7029
7030
7031
7032
7033
7034
  /*---------------------------------------------------------------------
   *
   * 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: ...
7035
  static void FPT_utilEEWriteOnOff(u32 p_port, unsigned char p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7036
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7037
  	unsigned char ee_value;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7038

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7039
7040
7041
  	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
7042

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7043
  	if (p_mode)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7044

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7045
  		FPT_utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7046

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7049
  		FPT_utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7050

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7051
7052
  	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
7053
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7054
7055
7056
7057
7058
7059
7060
7061
  /*---------------------------------------------------------------------
   *
   * Function: Write EEPROM
   *
   * Description: Write a word to the EEPROM at the specified
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7062
  static void FPT_utilEEWrite(u32 p_port, unsigned short ee_data,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7063
  			    unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7064
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7065
7066
  	unsigned char ee_value;
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7067

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7068
7069
7070
7071
  	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
7072

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7073
  	FPT_utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7074

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7075
  	ee_value |= (SEE_MS + SEE_CS);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7076

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7077
  	for (i = 0x8000; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7078

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
7094
  		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
7095

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7096
  	FPT_Wait(p_port, TO_10ms);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7097

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7098
7099
7100
  	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
7101
7102
7103
7104
7105
7106
7107
7108
7109
7110
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7111
  static unsigned short FPT_utilEERead(u32 p_port,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7112
  				     unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7113
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7114
  	unsigned short i, ee_data1, ee_data2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7115
7116
  
  	i = 0;
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7117
  	ee_data1 = FPT_utilEEReadOrg(p_port, ee_addr);
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7118
  	do {
47b5d69c4   James Bottomley   [SCSI] drivers/sc...
7119
  		ee_data2 = FPT_utilEEReadOrg(p_port, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7120

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7121
  		if (ee_data1 == ee_data2)
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7122
  			return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7123
7124
7125
  
  		ee_data1 = ee_data2;
  		i++;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7126
  	} while (i < 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7127

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7128
  	return ee_data1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
  }
  
  /*---------------------------------------------------------------------
   *
   * Function: Read EEPROM Original 
   *
   * Description: Read a word from the EEPROM at the desired
   *              address.
   *
   *---------------------------------------------------------------------*/
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7139
  static unsigned short FPT_utilEEReadOrg(u32 p_port, unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7140
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7141
7142
  	unsigned char ee_value;
  	unsigned short i, ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7143

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7144
7145
7146
7147
  	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
7148

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7149
  	FPT_utilEESendCmdAddr(p_port, EE_READ, ee_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7150

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7151
7152
  	ee_value |= (SEE_MS + SEE_CS);
  	ee_data = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7153

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

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7156
7157
7158
7159
7160
7161
  		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
7162

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7163
  		ee_data <<= 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7164

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7165
7166
7167
  		if (RD_HARPOON(p_port + hp_ee_ctrl) & SEE_DI)
  			ee_data |= 1;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7168

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7169
7170
7171
  	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
7172

5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7173
  	return ee_data;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7174
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7175
7176
7177
7178
7179
7180
7181
7182
  /*---------------------------------------------------------------------
   *
   * 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: ...
7183
  static void FPT_utilEESendCmdAddr(u32 p_port, unsigned char ee_cmd,
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7184
  				  unsigned short ee_addr)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7185
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7186
7187
  	unsigned char ee_value;
  	unsigned char narrow_flg;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7188

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7189
  	unsigned short i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7190

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7191
7192
7193
  	narrow_flg =
  	    (unsigned char)(RD_HARPOON(p_port + hp_page_ctrl) &
  			    NARROW_SCSI_CARD);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7194

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7195
7196
  	ee_value = SEE_MS;
  	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
7199
  	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
7200

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7201
  	for (i = 0x04; i != 0; i >>= 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7202

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
  		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
7217

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7218
7219
  	if (narrow_flg)
  		i = 0x0080;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7220

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7221
7222
  	else
  		i = 0x0200;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7223

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7224
  	while (i != 0) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7225

5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7226
7227
7228
7229
7230
7231
7232
7233
7234
7235
7236
7237
7238
7239
7240
7241
  		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
7242
  }
c823feeb3   Alexey Dobriyan   [SCSI] drivers/sc...
7243
  static unsigned short FPT_CalcCrc16(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7244
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
  	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...
7258
  	return crc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7259
  }
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7260
  static unsigned char FPT_CalcLrc(unsigned char buffer[])
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7261
7262
  {
  	int i;
db038cf86   Alexey Dobriyan   [SCSI] drivers/sc...
7263
  	unsigned char lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7264
  	lrc = 0;
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7265
  	for (i = 0; i < ID_STRING_LENGTH; i++)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7266
  		lrc ^= buffer[i];
5c1b85e20   Alexey Dobriyan   [SCSI] drivers/sc...
7267
  	return lrc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7268
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7269
7270
7271
7272
7273
  /*
    The following inline definitions avoid type conflicts.
  */
  
  static inline unsigned char
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7274
  FlashPoint__ProbeHostAdapter(struct fpoint_info *FlashPointInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7275
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7276
7277
  	return FlashPoint_ProbeHostAdapter((struct sccb_mgr_info *)
  					   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7278
  }
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7279
  static inline void *
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7280
  FlashPoint__HardwareResetHostAdapter(struct fpoint_info *FlashPointInfo)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7281
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7282
7283
  	return FlashPoint_HardwareResetHostAdapter((struct sccb_mgr_info *)
  						   FlashPointInfo);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7284
7285
7286
  }
  
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7287
  FlashPoint__ReleaseHostAdapter(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7288
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7289
  	FlashPoint_ReleaseHostAdapter(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7290
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7291
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7292
  FlashPoint__StartCCB(void *CardHandle, struct blogic_ccb *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7293
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7294
  	FlashPoint_StartCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7295
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7296
  static inline void
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7297
  FlashPoint__AbortCCB(void *CardHandle, struct blogic_ccb *CCB)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7298
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7299
  	FlashPoint_AbortCCB(CardHandle, (struct sccb *)CCB);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7300
  }
2065e310c   Richard Knutsson   [SCSI] BusLogic: ...
7301
  static inline bool
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7302
  FlashPoint__InterruptPending(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7303
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7304
  	return FlashPoint_InterruptPending(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7305
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7306
  static inline int
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7307
  FlashPoint__HandleInterrupt(void *CardHandle)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7308
  {
5c04a7b89   Alexey Dobriyan   [SCSI] drivers/sc...
7309
  	return FlashPoint_HandleInterrupt(CardHandle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7310
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7311
7312
7313
7314
7315
7316
7317
  #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: ...
7318
  #else				/* !CONFIG_SCSI_FLASHPOINT */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7319
7320
7321
7322
  
  /*
    Define prototypes for the FlashPoint SCCB Manager Functions.
  */
839cb99e8   Khalid Aziz   [SCSI] BusLogic: ...
7323
  extern unsigned char FlashPoint_ProbeHostAdapter(struct fpoint_info *);
391e2f256   Khalid Aziz   [SCSI] BusLogic: ...
7324
7325
7326
7327
7328
7329
  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
7330

78b4b05db   Matthew Wilcox   [SCSI] BusLogic: ...
7331
  #endif				/* CONFIG_SCSI_FLASHPOINT */