i386: sched.h inclusion from module.h is baack
[linux-2.6] / drivers / scsi / tmscsim.c
1 /************************************************************************
2  *      FILE NAME : TMSCSIM.C                                           *
3  *           BY   : C.L. Huang,  ching@tekram.com.tw                    *
4  *      Description: Device Driver for Tekram DC-390(T) PCI SCSI        *
5  *                   Bus Master Host Adapter                            *
6  * (C)Copyright 1995-1996 Tekram Technology Co., Ltd.                   *
7  ************************************************************************
8  * (C) Copyright: put under GNU GPL in 10/96                            *
9  *                              (see Documentation/scsi/tmscsim.txt)    *
10  ************************************************************************
11  * $Id: tmscsim.c,v 2.60.2.30 2000/12/20 01:07:12 garloff Exp $         *
12  *      Enhancements and bugfixes by                                    *
13  *      Kurt Garloff <kurt@garloff.de>  <garloff@suse.de>               *
14  ************************************************************************
15  *      HISTORY:                                                        *
16  *                                                                      *
17  *      REV#    DATE    NAME    DESCRIPTION                             *
18  *      1.00  96/04/24  CLH     First release                           *
19  *      1.01  96/06/12  CLH     Fixed bug of Media Change for Removable *
20  *                              Device, scan all LUN. Support Pre2.0.10 *
21  *      1.02  96/06/18  CLH     Fixed bug of Command timeout ...        *
22  *      1.03  96/09/25  KG      Added tmscsim_proc_info()               *
23  *      1.04  96/10/11  CLH     Updating for support KV 2.0.x           *
24  *      1.05  96/10/18  KG      Fixed bug in DC390_abort(null ptr deref)*
25  *      1.06  96/10/25  KG      Fixed module support                    *
26  *      1.07  96/11/09  KG      Fixed tmscsim_proc_info()               *
27  *      1.08  96/11/18  KG      Fixed null ptr in DC390_Disconnect()    *
28  *      1.09  96/11/30  KG      Added register the allocated IO space   *
29  *      1.10  96/12/05  CLH     Modified tmscsim_proc_info(), and reset *
30  *                              pending interrupt in DC390_detect()     *
31  *      1.11  97/02/05  KG/CLH  Fixeds problem with partitions greater  *
32  *                              than 1GB                                *
33  *      1.12  98/02/15  MJ      Rewritten PCI probing                   *
34  *      1.13  98/04/08  KG      Support for non DC390, __initfunc decls,*
35  *                              changed max devs from 10 to 16          *
36  *      1.14a 98/05/05  KG      Dynamic DCB allocation, add-single-dev  *
37  *                              for LUNs if LUN_SCAN (BIOS) not set     *
38  *                              runtime config using /proc interface    *
39  *      1.14b 98/05/06  KG      eliminated cli (); sti (); spinlocks    *
40  *      1.14c 98/05/07  KG      2.0.x compatibility                     *
41  *      1.20a 98/05/07  KG      changed names of funcs to be consistent *
42  *                              DC390_ (entry points), dc390_ (internal)*
43  *                              reworked locking                        *
44  *      1.20b 98/05/12  KG      bugs: version, kfree, _ctmp             *
45  *                              debug output                            *
46  *      1.20c 98/05/12  KG      bugs: kfree, parsing, EEpromDefaults    *
47  *      1.20d 98/05/14  KG      bugs: list linkage, clear flag after    *
48  *                              reset on startup, code cleanup          *
49  *      1.20e 98/05/15  KG      spinlock comments, name space cleanup   *
50  *                              pLastDCB now part of ACB structure      *
51  *                              added stats, timeout for 2.1, TagQ bug  *
52  *                              RESET and INQUIRY interface commands    *
53  *      1.20f 98/05/18  KG      spinlocks fixes, max_lun fix, free DCBs *
54  *                              for missing LUNs, pending int           *
55  *      1.20g 98/05/19  KG      Clean up: Avoid short                   *
56  *      1.20h 98/05/21  KG      Remove AdaptSCSIID, max_lun ...         *
57  *      1.20i 98/05/21  KG      Aiiie: Bug with TagQMask                *
58  *      1.20j 98/05/24  KG      Handle STAT_BUSY, handle pACB->pLinkDCB *
59  *                              == 0 in remove_dev and DoingSRB_Done    *
60  *      1.20k 98/05/25  KG      DMA_INT (experimental)                  *
61  *      1.20l 98/05/27  KG      remove DMA_INT; DMA_IDLE cmds added;    *
62  *      1.20m 98/06/10  KG      glitch configurable; made some global   *
63  *                              vars part of ACB; use DC390_readX       *
64  *      1.20n 98/06/11  KG      startup params                          *
65  *      1.20o 98/06/15  KG      added TagMaxNum to boot/module params   *
66  *                              Device Nr -> Idx, TagMaxNum power of 2  *
67  *      1.20p 98/06/17  KG      Docu updates. Reset depends on settings *
68  *                              pci_set_master added; 2.0.xx: pcibios_* *
69  *                              used instead of MechNum things ...      *
70  *      1.20q 98/06/23  KG      Changed defaults. Added debug code for  *
71  *                              removable media and fixed it. TagMaxNum *
72  *                              fixed for DC390. Locking: ACB, DRV for  *
73  *                              better IRQ sharing. Spelling: Queueing  *
74  *                              Parsing and glitch_cfg changes. Display *
75  *                              real SyncSpeed value. Made DisConn      *
76  *                              functional (!)                          *
77  *      1.20r 98/06/30  KG      Debug macros, allow disabling DsCn, set *
78  *                              BIT4 in CtrlR4, EN_PAGE_INT, 2.0 module *
79  *                              param -1 fixed.                         *
80  *      1.20s 98/08/20  KG      Debug info on abort(), try to check PCI,*
81  *                              phys_to_bus instead of phys_to_virt,    *
82  *                              fixed sel. process, fixed locking,      *
83  *                              added MODULE_XXX infos, changed IRQ     *
84  *                              request flags, disable DMA_INT          *
85  *      1.20t 98/09/07  KG      TagQ report fixed; Write Erase DMA Stat;*
86  *                              initfunc -> __init; better abort;       *
87  *                              Timeout for XFER_DONE & BLAST_COMPLETE; *
88  *                              Allow up to 33 commands being processed *
89  *      2.0a  98/10/14  KG      Max Cmnds back to 17. DMA_Stat clearing *
90  *                              all flags. Clear within while() loops   *
91  *                              in DataIn_0/Out_0. Null ptr in dumpinfo *
92  *                              for pSRB==0. Better locking during init.*
93  *                              bios_param() now respects part. table.  *
94  *      2.0b  98/10/24  KG      Docu fixes. Timeout Msg in DMA Blast.   *
95  *                              Disallow illegal idx in INQUIRY/REMOVE  *
96  *      2.0c  98/11/19  KG      Cleaned up detect/init for SMP boxes,   *
97  *                              Write Erase DMA (1.20t) caused problems *
98  *      2.0d  98/12/25  KG      Christmas release ;-) Message handling  *
99  *                              completely reworked. Handle target ini- *
100  *                              tiated SDTR correctly.                  *
101  *      2.0d1 99/01/25  KG      Try to handle RESTORE_PTR               *
102  *      2.0d2 99/02/08  KG      Check for failure of kmalloc, correct   *
103  *                              inclusion of scsicam.h, DelayReset      *
104  *      2.0d3 99/05/31  KG      DRIVER_OK -> DID_OK, DID_NO_CONNECT,    *
105  *                              detect Target mode and warn.            *
106  *                              pcmd->result handling cleaned up.       *
107  *      2.0d4 99/06/01  KG      Cleaned selection process. Found bug    *
108  *                              which prevented more than 16 tags. Now: *
109  *                              24. SDTR cleanup. Cleaner multi-LUN     *
110  *                              handling. Don't modify ControlRegs/FIFO *
111  *                              when connected.                         *
112  *      2.0d5 99/06/01  KG      Clear DevID, Fix INQUIRY after cfg chg. *
113  *      2.0d6 99/06/02  KG      Added ADD special command to allow cfg. *
114  *                              before detection. Reset SYNC_NEGO_DONE  *
115  *                              after a bus reset.                      *
116  *      2.0d7 99/06/03  KG      Fixed bugs wrt add,remove commands      *
117  *      2.0d8 99/06/04  KG      Removed copying of cmnd into CmdBlock.  *
118  *                              Fixed Oops in _release().               *
119  *      2.0d9 99/06/06  KG      Also tag queue INQUIRY, T_U_R, ...      *
120  *                              Allow arb. no. of Tagged Cmnds. Max 32  *
121  *      2.0d1099/06/20  KG      TagMaxNo changes now honoured! Queueing *
122  *                              clearified (renamed ..) TagMask handling*
123  *                              cleaned.                                *
124  *      2.0d1199/06/28  KG      cmd->result now identical to 2.0d2      *
125  *      2.0d1299/07/04  KG      Changed order of processing in IRQ      *
126  *      2.0d1399/07/05  KG      Don't update DCB fields if removed      *
127  *      2.0d1499/07/05  KG      remove_dev: Move kfree() to the end     *
128  *      2.0d1599/07/12  KG      use_new_eh_code: 0, ULONG -> UINT where *
129  *                              appropriate                             *
130  *      2.0d1699/07/13  KG      Reenable StartSCSI interrupt, Retry msg *
131  *      2.0d1799/07/15  KG      Remove debug msg. Disable recfg. when   *
132  *                              there are queued cmnds                  *
133  *      2.0d1899/07/18  KG      Selection timeout: Don't requeue        *
134  *      2.0d1999/07/18  KG      Abort: Only call scsi_done if dequeued  *
135  *      2.0d2099/07/19  KG      Rst_Detect: DoingSRB_Done               *
136  *      2.0d2199/08/15  KG      dev_id for request/free_irq, cmnd[0] for*
137  *                              RETRY, SRBdone does DID_ABORT for the   *
138  *                              cmd passed by DC390_reset()             *
139  *      2.0d2299/08/25  KG      dev_id fixed. can_queue: 42             *
140  *      2.0d2399/08/25  KG      Removed some debugging code. dev_id     *
141  *                              now is set to pACB. Use u8,u16,u32.     *
142  *      2.0d2499/11/14  KG      Unreg. I/O if failed IRQ alloc. Call    *
143  *                              done () w/ DID_BAD_TARGET in case of    *
144  *                              missing DCB. We are old EH!!            *
145  *      2.0d2500/01/15  KG      2.3.3x compat from Andreas Schultz      *
146  *                              set unique_id. Disable RETRY message.   *
147  *      2.0d2600/01/29  KG      Go to new EH.                           *
148  *      2.0d2700/01/31  KG      ... but maintain 2.0 compat.            *
149  *                              and fix DCB freeing                     *
150  *      2.0d2800/02/14  KG      Queue statistics fixed, dump special cmd*
151  *                              Waiting_Timer for failed StartSCSI      *
152  *                              New EH: Don't return cmnds to ML on RST *
153  *                              Use old EH (don't have new EH fns yet)  *
154  *                              Reset: Unlock, but refuse to queue      *
155  *                              2.3 __setup function                    *
156  *      2.0e  00/05/22  KG      Return residual for 2.3                 *
157  *      2.0e1 00/05/25  KG      Compile fixes for 2.3.99                *
158  *      2.0e2 00/05/27  KG      Jeff Garzik's pci_enable_device()       *
159  *      2.0e3 00/09/29  KG      Some 2.4 changes. Don't try Sync Nego   *
160  *                              before INQUIRY has reported ability.    *
161  *                              Recognise INQUIRY as scanning command.  *
162  *      2.0e4 00/10/13  KG      Allow compilation into 2.4 kernel       *
163  *      2.0e5 00/11/17  KG      Store Inq.flags in DCB                  *
164  *      2.0e6 00/11/22  KG      2.4 init function (Thx to O.Schumann)   *
165  *                              2.4 PCI device table (Thx to A.Richter) *
166  *      2.0e7 00/11/28  KG      Allow overriding of BIOS settings       *
167  *      2.0f  00/12/20  KG      Handle failed INQUIRYs during scan      *
168  *      2.1a  03/11/29  GL, KG  Initial fixing for 2.6. Convert to      *
169  *                              use the current PCI-mapping API, update *
170  *                              command-queuing.                        *
171  *      2.1b  04/04/13  GL      Fix for 64-bit platforms                *
172  *      2.1b1 04/01/31  GL      (applied 05.04) Remove internal         *
173  *                              command-queuing.                        *
174  *      2.1b2 04/02/01  CH      (applied 05.04) Fix error-handling      *
175  *      2.1c  04/05/23  GL      Update to use the new pci_driver API,   *
176  *                              some scsi EH updates, more cleanup.     *
177  *      2.1d  04/05/27  GL      Moved setting of scan_devices to        *
178  *                              slave_alloc/_configure/_destroy, as     *
179  *                              suggested by CH.                        *
180  ***********************************************************************/
181
182 /* DEBUG options */
183 //#define DC390_DEBUG0
184 //#define DC390_DEBUG1
185 //#define DC390_DCBDEBUG
186 //#define DC390_PARSEDEBUG
187 //#define DC390_REMOVABLEDEBUG
188 //#define DC390_LOCKDEBUG
189
190 //#define NOP do{}while(0)
191 #define C_NOP
192
193 /* Debug definitions */
194 #ifdef DC390_DEBUG0
195 # define DEBUG0(x) x
196 #else
197 # define DEBUG0(x) C_NOP
198 #endif
199 #ifdef DC390_DEBUG1
200 # define DEBUG1(x) x
201 #else
202 # define DEBUG1(x) C_NOP
203 #endif
204 #ifdef DC390_DCBDEBUG
205 # define DCBDEBUG(x) x
206 #else
207 # define DCBDEBUG(x) C_NOP
208 #endif
209 #ifdef DC390_PARSEDEBUG
210 # define PARSEDEBUG(x) x
211 #else
212 # define PARSEDEBUG(x) C_NOP
213 #endif
214 #ifdef DC390_REMOVABLEDEBUG
215 # define REMOVABLEDEBUG(x) x
216 #else
217 # define REMOVABLEDEBUG(x) C_NOP
218 #endif
219 #define DCBDEBUG1(x) C_NOP
220
221 #include <linux/module.h>
222 #include <linux/delay.h>
223 #include <linux/signal.h>
224 #include <linux/errno.h>
225 #include <linux/kernel.h>
226 #include <linux/ioport.h>
227 #include <linux/pci.h>
228 #include <linux/proc_fs.h>
229 #include <linux/string.h>
230 #include <linux/mm.h>
231 #include <linux/blkdev.h>
232 #include <linux/timer.h>
233 #include <linux/interrupt.h>
234 #include <linux/init.h>
235 #include <linux/spinlock.h>
236 #include <asm/io.h>
237
238 #include <scsi/scsi.h>
239 #include <scsi/scsi_cmnd.h>
240 #include <scsi/scsi_device.h>
241 #include <scsi/scsi_host.h>
242 #include <scsi/scsicam.h>
243 #include <scsi/scsi_tcq.h>
244
245
246 #define DC390_BANNER "Tekram DC390/AM53C974"
247 #define DC390_VERSION "2.1d 2004-05-27"
248
249 #define PCI_DEVICE_ID_AMD53C974         PCI_DEVICE_ID_AMD_SCSI
250
251 #include "tmscsim.h"
252
253
254 static void dc390_DataOut_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
255 static void dc390_DataIn_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
256 static void dc390_Command_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
257 static void dc390_Status_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
258 static void dc390_MsgOut_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
259 static void dc390_MsgIn_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
260 static void dc390_DataOutPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
261 static void dc390_DataInPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
262 static void dc390_CommandPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
263 static void dc390_StatusPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
264 static void dc390_MsgOutPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
265 static void dc390_MsgInPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
266 static void dc390_Nop_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
267 static void dc390_Nop_1( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus);
268
269 static void dc390_SetXferRate( struct dc390_acb* pACB, struct dc390_dcb* pDCB );
270 static void dc390_Disconnect( struct dc390_acb* pACB );
271 static void dc390_Reselect( struct dc390_acb* pACB );
272 static void dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB );
273 static void dc390_ScsiRstDetect( struct dc390_acb* pACB );
274 static void dc390_EnableMsgOut_Abort(struct dc390_acb*, struct dc390_srb*);
275 static void dc390_dumpinfo(struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB);
276 static void dc390_ResetDevParam(struct dc390_acb* pACB);
277
278 static u32      dc390_laststatus = 0;
279 static u8       dc390_adapterCnt = 0;
280
281 static int disable_clustering;
282 module_param(disable_clustering, int, S_IRUGO);
283 MODULE_PARM_DESC(disable_clustering, "If you experience problems with your devices, try setting to 1");
284
285 /* Startup values, to be overriden on the commandline */
286 static int tmscsim[] = {-2, -2, -2, -2, -2, -2};
287
288 module_param_array(tmscsim, int, NULL, 0);
289 MODULE_PARM_DESC(tmscsim, "Host SCSI ID, Speed (0=10MHz), Device Flags, Adapter Flags, Max Tags (log2(tags)-1), DelayReset (s)");
290 MODULE_AUTHOR("C.L. Huang / Kurt Garloff");
291 MODULE_DESCRIPTION("SCSI host adapter driver for Tekram DC390 and other AMD53C974A based PCI SCSI adapters");
292 MODULE_LICENSE("GPL");
293 MODULE_SUPPORTED_DEVICE("sd,sr,sg,st");
294
295 static void *dc390_phase0[]={
296        dc390_DataOut_0,
297        dc390_DataIn_0,
298        dc390_Command_0,
299        dc390_Status_0,
300        dc390_Nop_0,
301        dc390_Nop_0,
302        dc390_MsgOut_0,
303        dc390_MsgIn_0,
304        dc390_Nop_1
305        };
306
307 static void *dc390_phase1[]={
308        dc390_DataOutPhase,
309        dc390_DataInPhase,
310        dc390_CommandPhase,
311        dc390_StatusPhase,
312        dc390_Nop_0,
313        dc390_Nop_0,
314        dc390_MsgOutPhase,
315        dc390_MsgInPhase,
316        dc390_Nop_1
317        };
318
319 #ifdef DC390_DEBUG1
320 static char* dc390_p0_str[] = {
321        "dc390_DataOut_0",
322        "dc390_DataIn_0",
323        "dc390_Command_0",
324        "dc390_Status_0",
325        "dc390_Nop_0",
326        "dc390_Nop_0",
327        "dc390_MsgOut_0",
328        "dc390_MsgIn_0",
329        "dc390_Nop_1"
330        };
331      
332 static char* dc390_p1_str[] = {
333        "dc390_DataOutPhase",
334        "dc390_DataInPhase",
335        "dc390_CommandPhase",
336        "dc390_StatusPhase",
337        "dc390_Nop_0",
338        "dc390_Nop_0",
339        "dc390_MsgOutPhase",
340        "dc390_MsgInPhase",
341        "dc390_Nop_1"
342        };
343 #endif   
344
345 static u8  dc390_eepromBuf[MAX_ADAPTER_NUM][EE_LEN];
346 static u8  dc390_clock_period1[] = {4, 5, 6, 7, 8, 10, 13, 20};
347 static u8  dc390_clock_speed[] = {100,80,67,57,50, 40, 31, 20};
348
349 /***********************************************************************
350  * Functions for the management of the internal structures 
351  * (DCBs, SRBs, Queueing)
352  *
353  **********************************************************************/
354 static struct dc390_dcb __inline__ *dc390_findDCB ( struct dc390_acb* pACB, u8 id, u8 lun)
355 {
356    struct dc390_dcb* pDCB = pACB->pLinkDCB; if (!pDCB) return NULL;
357    while (pDCB->TargetID != id || pDCB->TargetLUN != lun)
358      {
359         pDCB = pDCB->pNextDCB;
360         if (pDCB == pACB->pLinkDCB)
361              return NULL;
362      }
363    DCBDEBUG1( printk (KERN_DEBUG "DCB %p (%02x,%02x) found.\n", \
364                       pDCB, pDCB->TargetID, pDCB->TargetLUN));
365    return pDCB;
366 }
367
368 /* Insert SRB oin top of free list */
369 static __inline__ void dc390_Free_insert (struct dc390_acb* pACB, struct dc390_srb* pSRB)
370 {
371     DEBUG0(printk ("DC390: Free SRB %p\n", pSRB));
372     pSRB->pNextSRB = pACB->pFreeSRB;
373     pACB->pFreeSRB = pSRB;
374 }
375
376 static __inline__ void dc390_Going_append (struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
377 {
378     pDCB->GoingSRBCnt++;
379     DEBUG0(printk("DC390: Append SRB %p to Going\n", pSRB));
380     /* Append to the list of Going commands */
381     if( pDCB->pGoingSRB )
382         pDCB->pGoingLast->pNextSRB = pSRB;
383     else
384         pDCB->pGoingSRB = pSRB;
385
386     pDCB->pGoingLast = pSRB;
387     /* No next one in sent list */
388     pSRB->pNextSRB = NULL;
389 }
390
391 static __inline__ void dc390_Going_remove (struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
392 {
393         DEBUG0(printk("DC390: Remove SRB %p from Going\n", pSRB));
394    if (pSRB == pDCB->pGoingSRB)
395         pDCB->pGoingSRB = pSRB->pNextSRB;
396    else
397      {
398         struct dc390_srb* psrb = pDCB->pGoingSRB;
399         while (psrb && psrb->pNextSRB != pSRB)
400           psrb = psrb->pNextSRB;
401         if (!psrb) 
402           { printk (KERN_ERR "DC390: Remove non-ex. SRB %p from Going!\n", pSRB); return; }
403         psrb->pNextSRB = pSRB->pNextSRB;
404         if (pSRB == pDCB->pGoingLast)
405           pDCB->pGoingLast = psrb;
406      }
407    pDCB->GoingSRBCnt--;
408 }
409
410 static struct scatterlist* dc390_sg_build_single(struct scatterlist *sg, void *addr, unsigned int length)
411 {
412         memset(sg, 0, sizeof(struct scatterlist));
413         sg->page        = virt_to_page(addr);
414         sg->length      = length;
415         sg->offset      = (unsigned long)addr & ~PAGE_MASK;
416         return sg;
417 }
418
419 /* Create pci mapping */
420 static int dc390_pci_map (struct dc390_srb* pSRB)
421 {
422         int error = 0;
423         struct scsi_cmnd *pcmd = pSRB->pcmd;
424         struct pci_dev *pdev = pSRB->pSRBDCB->pDCBACB->pdev;
425         dc390_cmd_scp_t* cmdp = ((dc390_cmd_scp_t*)(&pcmd->SCp));
426
427         /* Map sense buffer */
428         if (pSRB->SRBFlag & AUTO_REQSENSE) {
429                 pSRB->pSegmentList      = dc390_sg_build_single(&pSRB->Segmentx, pcmd->sense_buffer, sizeof(pcmd->sense_buffer));
430                 pSRB->SGcount           = pci_map_sg(pdev, pSRB->pSegmentList, 1,
431                                                      DMA_FROM_DEVICE);
432                 cmdp->saved_dma_handle  = sg_dma_address(pSRB->pSegmentList);
433
434                 /* TODO: error handling */
435                 if (pSRB->SGcount != 1)
436                         error = 1;
437                 DEBUG1(printk("%s(): Mapped sense buffer %p at %x\n", __FUNCTION__, pcmd->sense_buffer, cmdp->saved_dma_handle));
438         /* Map SG list */
439         } else if (pcmd->use_sg) {
440                 pSRB->pSegmentList      = (struct scatterlist *) pcmd->request_buffer;
441                 pSRB->SGcount           = pci_map_sg(pdev, pSRB->pSegmentList, pcmd->use_sg,
442                                                      pcmd->sc_data_direction);
443                 /* TODO: error handling */
444                 if (!pSRB->SGcount)
445                         error = 1;
446                 DEBUG1(printk("%s(): Mapped SG %p with %d (%d) elements\n",\
447                               __FUNCTION__, pcmd->request_buffer, pSRB->SGcount, pcmd->use_sg));
448         /* Map single segment */
449         } else if (pcmd->request_buffer && pcmd->request_bufflen) {
450                 pSRB->pSegmentList      = dc390_sg_build_single(&pSRB->Segmentx, pcmd->request_buffer, pcmd->request_bufflen);
451                 pSRB->SGcount           = pci_map_sg(pdev, pSRB->pSegmentList, 1,
452                                                      pcmd->sc_data_direction);
453                 cmdp->saved_dma_handle  = sg_dma_address(pSRB->pSegmentList);
454
455                 /* TODO: error handling */
456                 if (pSRB->SGcount != 1)
457                         error = 1;
458                 DEBUG1(printk("%s(): Mapped request buffer %p at %x\n", __FUNCTION__, pcmd->request_buffer, cmdp->saved_dma_handle));
459         /* No mapping !? */     
460         } else
461                 pSRB->SGcount = 0;
462
463         return error;
464 }
465
466 /* Remove pci mapping */
467 static void dc390_pci_unmap (struct dc390_srb* pSRB)
468 {
469         struct scsi_cmnd *pcmd = pSRB->pcmd;
470         struct pci_dev *pdev = pSRB->pSRBDCB->pDCBACB->pdev;
471         DEBUG1(dc390_cmd_scp_t* cmdp = ((dc390_cmd_scp_t*)(&pcmd->SCp)));
472
473         if (pSRB->SRBFlag) {
474                 pci_unmap_sg(pdev, &pSRB->Segmentx, 1, DMA_FROM_DEVICE);
475                 DEBUG1(printk("%s(): Unmapped sense buffer at %x\n", __FUNCTION__, cmdp->saved_dma_handle));
476         } else if (pcmd->use_sg) {
477                 pci_unmap_sg(pdev, pcmd->request_buffer, pcmd->use_sg, pcmd->sc_data_direction);
478                 DEBUG1(printk("%s(): Unmapped SG at %p with %d elements\n", __FUNCTION__, pcmd->request_buffer, pcmd->use_sg));
479         } else if (pcmd->request_buffer && pcmd->request_bufflen) {
480                 pci_unmap_sg(pdev, &pSRB->Segmentx, 1, pcmd->sc_data_direction);
481                 DEBUG1(printk("%s(): Unmapped request buffer at %x\n", __FUNCTION__, cmdp->saved_dma_handle));
482         }
483 }
484
485 static void __inline__
486 dc390_freetag (struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
487 {
488         if (pSRB->TagNumber != SCSI_NO_TAG) {
489                 pDCB->TagMask &= ~(1 << pSRB->TagNumber);   /* free tag mask */
490                 pSRB->TagNumber = SCSI_NO_TAG;
491         }
492 }
493
494
495 static int
496 dc390_StartSCSI( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB )
497 {
498     struct scsi_cmnd *scmd = pSRB->pcmd;
499     struct scsi_device *sdev = scmd->device;
500     u8 cmd, disc_allowed, try_sync_nego;
501     char tag[2];
502
503     pSRB->ScsiPhase = SCSI_NOP0;
504
505     if (pACB->Connected)
506     {
507         // Should not happen normally
508         printk (KERN_WARNING "DC390: Can't select when connected! (%08x,%02x)\n",
509                 pSRB->SRBState, pSRB->SRBFlag);
510         pSRB->SRBState = SRB_READY;
511         pACB->SelConn++;
512         return 1;
513     }
514     if (time_before (jiffies, pACB->pScsiHost->last_reset))
515     {
516         DEBUG0(printk ("DC390: We were just reset and don't accept commands yet!\n"));
517         return 1;
518     }
519     /* KG: Moved pci mapping here */
520     dc390_pci_map(pSRB);
521     /* TODO: error handling */
522     DC390_write8 (Scsi_Dest_ID, pDCB->TargetID);
523     DC390_write8 (Sync_Period, pDCB->SyncPeriod);
524     DC390_write8 (Sync_Offset, pDCB->SyncOffset);
525     DC390_write8 (CtrlReg1, pDCB->CtrlR1);
526     DC390_write8 (CtrlReg3, pDCB->CtrlR3);
527     DC390_write8 (CtrlReg4, pDCB->CtrlR4);
528     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);             /* Flush FIFO */
529     DEBUG1(printk (KERN_INFO "DC390: Start SCSI command: %02x (Sync:%02x)\n",\
530             scmd->cmnd[0], pDCB->SyncMode));
531
532     /* Don't disconnect on AUTO_REQSENSE, cause it might be an
533      * Contingent Allegiance Condition (6.6), where no tags should be used.
534      * All other have to be allowed to disconnect to prevent Incorrect 
535      * Initiator Connection (6.8.2/6.5.2) */
536     /* Changed KG, 99/06/06 */
537     if (! (pSRB->SRBFlag & AUTO_REQSENSE))
538         disc_allowed = pDCB->DevMode & EN_DISCONNECT_;
539     else
540         disc_allowed = 0;
541
542     if ((pDCB->SyncMode & SYNC_ENABLE) && pDCB->TargetLUN == 0 && sdev->sdtr &&
543         (((scmd->cmnd[0] == REQUEST_SENSE || (pSRB->SRBFlag & AUTO_REQSENSE)) &&
544           !(pDCB->SyncMode & SYNC_NEGO_DONE)) || scmd->cmnd[0] == INQUIRY))
545       try_sync_nego = 1;
546     else
547       try_sync_nego = 0;
548
549     pSRB->MsgCnt = 0;
550     cmd = SEL_W_ATN;
551     DC390_write8 (ScsiFifo, IDENTIFY(disc_allowed, pDCB->TargetLUN));
552     /* Change 99/05/31: Don't use tags when not disconnecting (BUSY) */
553     if ((pDCB->SyncMode & EN_TAG_QUEUEING) && disc_allowed && scsi_populate_tag_msg(scmd, tag)) {
554         DC390_write8(ScsiFifo, tag[0]);
555         pDCB->TagMask |= 1 << tag[1];
556         pSRB->TagNumber = tag[1];
557         DC390_write8(ScsiFifo, tag[1]);
558         DEBUG1(printk(KERN_INFO "DC390: Select w/DisCn for Cmd %li (SRB %p), block tag %02x\n", scmd->pid, pSRB, tag[1]));
559         cmd = SEL_W_ATN3;
560     } else {
561         /* No TagQ */
562 //no_tag:
563         DEBUG1(printk(KERN_INFO "DC390: Select w%s/DisCn for Cmd %li (SRB %p), No TagQ\n", disc_allowed ? "" : "o", scmd->pid, pSRB));
564     }
565
566     pSRB->SRBState = SRB_START_;
567
568     if (try_sync_nego)
569       { 
570         u8 Sync_Off = pDCB->SyncOffset;
571         DEBUG0(printk (KERN_INFO "DC390: NEW Sync Nego code triggered (%i %i)\n", pDCB->TargetID, pDCB->TargetLUN));
572         pSRB->MsgOutBuf[0] = EXTENDED_MESSAGE;
573         pSRB->MsgOutBuf[1] = 3;
574         pSRB->MsgOutBuf[2] = EXTENDED_SDTR;
575         pSRB->MsgOutBuf[3] = pDCB->NegoPeriod;
576         if (!(Sync_Off & 0x0f)) Sync_Off = SYNC_NEGO_OFFSET;
577         pSRB->MsgOutBuf[4] = Sync_Off;
578         pSRB->MsgCnt = 5;
579         //pSRB->SRBState = SRB_MSGOUT_;
580         pSRB->SRBState |= DO_SYNC_NEGO;
581         cmd = SEL_W_ATN_STOP;
582       }
583
584     /* Command is written in CommandPhase, if SEL_W_ATN_STOP ... */
585     if (cmd != SEL_W_ATN_STOP)
586       {
587         if( pSRB->SRBFlag & AUTO_REQSENSE )
588           {
589             DC390_write8 (ScsiFifo, REQUEST_SENSE);
590             DC390_write8 (ScsiFifo, pDCB->TargetLUN << 5);
591             DC390_write8 (ScsiFifo, 0);
592             DC390_write8 (ScsiFifo, 0);
593             DC390_write8 (ScsiFifo, sizeof(scmd->sense_buffer));
594             DC390_write8 (ScsiFifo, 0);
595             DEBUG1(printk (KERN_DEBUG "DC390: AutoReqSense !\n"));
596           }
597         else    /* write cmnd to bus */ 
598           {
599             u8 *ptr; u8 i;
600             ptr = (u8 *)scmd->cmnd;
601             for (i = 0; i < scmd->cmd_len; i++)
602               DC390_write8 (ScsiFifo, *(ptr++));
603           }
604       }
605     DEBUG0(if (pACB->pActiveDCB)        \
606            printk (KERN_WARNING "DC390: ActiveDCB != 0\n"));
607     DEBUG0(if (pDCB->pActiveSRB)        \
608            printk (KERN_WARNING "DC390: ActiveSRB != 0\n"));
609     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
610     if (DC390_read8 (Scsi_Status) & INTERRUPT)
611     {
612         dc390_freetag (pDCB, pSRB);
613         DEBUG0(printk ("DC390: Interrupt during Start SCSI (pid %li, target %02i-%02i)\n",
614                 scmd->pid, scmd->device->id, scmd->device->lun));
615         pSRB->SRBState = SRB_READY;
616         //DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
617         pACB->SelLost++;
618         return 1;
619     }
620     DC390_write8 (ScsiCmd, cmd);
621     pACB->pActiveDCB = pDCB;
622     pDCB->pActiveSRB = pSRB;
623     pACB->Connected = 1;
624     pSRB->ScsiPhase = SCSI_NOP1;
625     return 0;
626 }
627
628 //#define DMA_INT EN_DMA_INT /*| EN_PAGE_INT*/
629 #define DMA_INT 0
630
631 #if DMA_INT
632 /* This is similar to AM53C974.c ... */
633 static u8 
634 dc390_dma_intr (struct dc390_acb* pACB)
635 {
636   struct dc390_srb* pSRB;
637   u8 dstate;
638   DEBUG0(u16 pstate; struct pci_dev *pdev = pACB->pdev);
639   
640   DEBUG0(pci_read_config_word(pdev, PCI_STATUS, &pstate));
641   DEBUG0(if (pstate & (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY))\
642         { printk(KERN_WARNING "DC390: PCI state = %04x!\n", pstate); \
643           pci_write_config_word(pdev, PCI_STATUS, (PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY));});
644
645   dstate = DC390_read8 (DMA_Status); 
646
647   if (! pACB->pActiveDCB || ! pACB->pActiveDCB->pActiveSRB) return dstate;
648   else pSRB  = pACB->pActiveDCB->pActiveSRB;
649   
650   if (dstate & (DMA_XFER_ABORT | DMA_XFER_ERROR | POWER_DOWN | PCI_MS_ABORT))
651     {
652         printk (KERN_ERR "DC390: DMA error (%02x)!\n", dstate);
653         return dstate;
654     }
655   if (dstate & DMA_XFER_DONE)
656     {
657         u32 residual, xferCnt; int ctr = 6000000;
658         if (! (DC390_read8 (DMA_Cmd) & READ_DIRECTION))
659           {
660             do
661               {
662                 DEBUG1(printk (KERN_DEBUG "DC390: read residual bytes ... \n"));
663                 dstate = DC390_read8 (DMA_Status);
664                 residual = DC390_read8 (CtcReg_Low) | DC390_read8 (CtcReg_Mid) << 8 |
665                   DC390_read8 (CtcReg_High) << 16;
666                 residual += DC390_read8 (Current_Fifo) & 0x1f;
667               } while (residual && ! (dstate & SCSI_INTERRUPT) && --ctr);
668             if (!ctr) printk (KERN_CRIT "DC390: dma_intr: DMA aborted unfinished: %06x bytes remain!!\n", DC390_read32 (DMA_Wk_ByteCntr));
669             /* residual =  ... */
670           }
671         else
672             residual = 0;
673         
674         /* ??? */
675         
676         xferCnt = pSRB->SGToBeXferLen - residual;
677         pSRB->SGBusAddr += xferCnt;
678         pSRB->TotalXferredLen += xferCnt;
679         pSRB->SGToBeXferLen = residual;
680 # ifdef DC390_DEBUG0
681         printk (KERN_INFO "DC390: DMA: residual = %i, xfer = %i\n", 
682                 (unsigned int)residual, (unsigned int)xferCnt);
683 # endif
684         
685         DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
686     }
687   dc390_laststatus &= ~0xff000000; dc390_laststatus |= dstate << 24;
688   return dstate;
689 }
690 #endif
691
692
693 static void __inline__
694 dc390_InvalidCmd(struct dc390_acb* pACB)
695 {
696         if (pACB->pActiveDCB->pActiveSRB->SRBState & (SRB_START_ | SRB_MSGOUT))
697                 DC390_write8(ScsiCmd, CLEAR_FIFO_CMD);
698 }
699
700
701 static irqreturn_t __inline__
702 DC390_Interrupt(void *dev_id)
703 {
704     struct dc390_acb *pACB = dev_id;
705     struct dc390_dcb *pDCB;
706     struct dc390_srb *pSRB;
707     u8  sstatus=0;
708     u8  phase;
709     void   (*stateV)( struct dc390_acb*, struct dc390_srb*, u8 *);
710     u8  istate, istatus;
711 #if DMA_INT
712     u8  dstatus;
713 #endif
714
715     sstatus = DC390_read8 (Scsi_Status);
716     if( !(sstatus & INTERRUPT) )
717         return IRQ_NONE;
718
719     DEBUG1(printk (KERN_DEBUG "sstatus=%02x,", sstatus));
720
721 #if DMA_INT
722     spin_lock_irq(pACB->pScsiHost->host_lock);
723     dstatus = dc390_dma_intr (pACB);
724     spin_unlock_irq(pACB->pScsiHost->host_lock);
725
726     DEBUG1(printk (KERN_DEBUG "dstatus=%02x,", dstatus));
727     if (! (dstatus & SCSI_INTERRUPT))
728       {
729         DEBUG0(printk (KERN_WARNING "DC390 Int w/o SCSI actions (only DMA?)\n"));
730         return IRQ_NONE;
731       }
732 #else
733     //DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT);
734     //dstatus = DC390_read8 (DMA_Status);
735     //DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT);
736 #endif
737
738     spin_lock_irq(pACB->pScsiHost->host_lock);
739
740     istate = DC390_read8 (Intern_State);
741     istatus = DC390_read8 (INT_Status); /* This clears Scsi_Status, Intern_State and INT_Status ! */
742
743     DEBUG1(printk (KERN_INFO "Istatus(Res,Inv,Dis,Serv,Succ,ReS,SelA,Sel)=%02x,",istatus));
744     dc390_laststatus &= ~0x00ffffff;
745     dc390_laststatus |= /* dstatus<<24 | */ sstatus<<16 | istate<<8 | istatus;
746
747     if (sstatus & ILLEGAL_OP_ERR)
748     {
749         printk ("DC390: Illegal Operation detected (%08x)!\n", dc390_laststatus);
750         dc390_dumpinfo (pACB, pACB->pActiveDCB, pACB->pActiveDCB->pActiveSRB);
751     }
752         
753     else if (istatus &  INVALID_CMD)
754     {
755         printk ("DC390: Invalid Command detected (%08x)!\n", dc390_laststatus);
756         dc390_InvalidCmd( pACB );
757         goto unlock;
758     }
759
760     if (istatus &  SCSI_RESET)
761     {
762         dc390_ScsiRstDetect( pACB );
763         goto unlock;
764     }
765
766     if (istatus &  DISCONNECTED)
767     {
768         dc390_Disconnect( pACB );
769         goto unlock;
770     }
771
772     if (istatus &  RESELECTED)
773     {
774         dc390_Reselect( pACB );
775         goto unlock;
776     }
777
778     else if (istatus & (SELECTED | SEL_ATTENTION))
779     {
780         printk (KERN_ERR "DC390: Target mode not supported!\n");
781         goto unlock;
782     }
783
784     if (istatus & (SUCCESSFUL_OP|SERVICE_REQUEST) )
785     {
786         pDCB = pACB->pActiveDCB;
787         if (!pDCB)
788         {
789                 printk (KERN_ERR "DC390: Suc. op/ Serv. req: pActiveDCB = 0!\n");
790                 goto unlock;
791         }
792         pSRB = pDCB->pActiveSRB;
793         if( pDCB->DCBFlag & ABORT_DEV_ )
794           dc390_EnableMsgOut_Abort (pACB, pSRB);
795
796         phase = pSRB->ScsiPhase;
797         DEBUG1(printk (KERN_INFO "DC390: [%i]%s(0) (%02x)\n", phase, dc390_p0_str[phase], sstatus));
798         stateV = (void *) dc390_phase0[phase];
799         ( *stateV )( pACB, pSRB, &sstatus );
800
801         pSRB->ScsiPhase = sstatus & 7;
802         phase = (u8) sstatus & 7;
803         DEBUG1(printk (KERN_INFO "DC390: [%i]%s(1) (%02x)\n", phase, dc390_p1_str[phase], sstatus));
804         stateV = (void *) dc390_phase1[phase];
805         ( *stateV )( pACB, pSRB, &sstatus );
806     }
807
808  unlock:
809     spin_unlock_irq(pACB->pScsiHost->host_lock);
810     return IRQ_HANDLED;
811 }
812
813 static irqreturn_t do_DC390_Interrupt(int irq, void *dev_id)
814 {
815     irqreturn_t ret;
816     DEBUG1(printk (KERN_INFO "DC390: Irq (%i) caught: ", irq));
817     /* Locking is done in DC390_Interrupt */
818     ret = DC390_Interrupt(dev_id);
819     DEBUG1(printk (".. IRQ returned\n"));
820     return ret;
821 }
822
823 static void
824 dc390_DataOut_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
825 {
826     u8   sstatus;
827     struct scatterlist *psgl;
828     u32    ResidCnt, xferCnt;
829     u8   dstate = 0;
830
831     sstatus = *psstatus;
832
833     if( !(pSRB->SRBState & SRB_XFERPAD) )
834     {
835         if( sstatus & (PARITY_ERR | ILLEGAL_OP_ERR) )
836             pSRB->SRBStatus |= PARITY_ERROR;
837
838         if( sstatus & COUNT_2_ZERO )
839         {
840             unsigned long timeout = jiffies + HZ;
841
842             /* Function called from the ISR with the host_lock held and interrupts disabled */
843             if (pSRB->SGToBeXferLen)
844                 while (time_before(jiffies, timeout) && !((dstate = DC390_read8 (DMA_Status)) & DMA_XFER_DONE)) {
845                     spin_unlock_irq(pACB->pScsiHost->host_lock);
846                     udelay(50);
847                     spin_lock_irq(pACB->pScsiHost->host_lock);
848                 }
849             if (!time_before(jiffies, timeout))
850                 printk (KERN_CRIT "DC390: Deadlock in DataOut_0: DMA aborted unfinished: %06x bytes remain!!\n",
851                         DC390_read32 (DMA_Wk_ByteCntr));
852             dc390_laststatus &= ~0xff000000;
853             dc390_laststatus |= dstate << 24;
854             pSRB->TotalXferredLen += pSRB->SGToBeXferLen;
855             pSRB->SGIndex++;
856             if( pSRB->SGIndex < pSRB->SGcount )
857             {
858                 pSRB->pSegmentList++;
859                 psgl = pSRB->pSegmentList;
860
861                 pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
862                 pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
863             }
864             else
865                 pSRB->SGToBeXferLen = 0;
866         }
867         else
868         {
869             ResidCnt  = (u32) DC390_read8 (Current_Fifo) & 0x1f;
870             ResidCnt |= (u32) DC390_read8 (CtcReg_High) << 16;
871             ResidCnt |= (u32) DC390_read8 (CtcReg_Mid) << 8; 
872             ResidCnt += (u32) DC390_read8 (CtcReg_Low);
873
874             xferCnt = pSRB->SGToBeXferLen - ResidCnt;
875             pSRB->SGBusAddr += xferCnt;
876             pSRB->TotalXferredLen += xferCnt;
877             pSRB->SGToBeXferLen = ResidCnt;
878         }
879     }
880     if ((*psstatus & 7) != SCSI_DATA_OUT)
881     {
882             DC390_write8 (DMA_Cmd, WRITE_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
883             DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
884     }       
885 }
886
887 static void
888 dc390_DataIn_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
889 {
890     u8   sstatus, residual, bval;
891     struct scatterlist *psgl;
892     u32    ResidCnt, i;
893     unsigned long   xferCnt;
894     u8      *ptr;
895
896     sstatus = *psstatus;
897
898     if( !(pSRB->SRBState & SRB_XFERPAD) )
899     {
900         if( sstatus & (PARITY_ERR | ILLEGAL_OP_ERR))
901             pSRB->SRBStatus |= PARITY_ERROR;
902
903         if( sstatus & COUNT_2_ZERO )
904         {
905             int dstate = 0;
906             unsigned long timeout = jiffies + HZ;
907
908             /* Function called from the ISR with the host_lock held and interrupts disabled */
909             if (pSRB->SGToBeXferLen)
910                 while (time_before(jiffies, timeout) && !((dstate = DC390_read8 (DMA_Status)) & DMA_XFER_DONE)) {
911                     spin_unlock_irq(pACB->pScsiHost->host_lock);
912                     udelay(50);
913                     spin_lock_irq(pACB->pScsiHost->host_lock);
914                 }
915             if (!time_before(jiffies, timeout)) {
916                 printk (KERN_CRIT "DC390: Deadlock in DataIn_0: DMA aborted unfinished: %06x bytes remain!!\n",
917                         DC390_read32 (DMA_Wk_ByteCntr));
918                 printk (KERN_CRIT "DC390: DataIn_0: DMA State: %i\n", dstate);
919             }
920             dc390_laststatus &= ~0xff000000;
921             dc390_laststatus |= dstate << 24;
922             DEBUG1(ResidCnt = ((unsigned long) DC390_read8 (CtcReg_High) << 16) \
923                 + ((unsigned long) DC390_read8 (CtcReg_Mid) << 8)               \
924                 + ((unsigned long) DC390_read8 (CtcReg_Low)));
925             DEBUG1(printk (KERN_DEBUG "Count_2_Zero (ResidCnt=%i,ToBeXfer=%li),", ResidCnt, pSRB->SGToBeXferLen));
926
927             DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
928
929             pSRB->TotalXferredLen += pSRB->SGToBeXferLen;
930             pSRB->SGIndex++;
931             if( pSRB->SGIndex < pSRB->SGcount )
932             {
933                 pSRB->pSegmentList++;
934                 psgl = pSRB->pSegmentList;
935
936                 pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
937                 pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
938             }
939             else
940                 pSRB->SGToBeXferLen = 0;
941         }
942         else    /* phase changed */
943         {
944             residual = 0;
945             bval = DC390_read8 (Current_Fifo);
946             while( bval & 0x1f )
947             {
948                 DEBUG1(printk (KERN_DEBUG "Check for residuals,"));
949                 if( (bval & 0x1f) == 1 )
950                 {
951                     for(i=0; i < 0x100; i++)
952                     {
953                         bval = DC390_read8 (Current_Fifo);
954                         if( !(bval & 0x1f) )
955                             goto din_1;
956                         else if( i == 0x0ff )
957                         {
958                             residual = 1;   /* ;1 residual byte */
959                             goto din_1;
960                         }
961                     }
962                 }
963                 else
964                     bval = DC390_read8 (Current_Fifo);
965             }
966 din_1:
967             DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_BLAST_CMD);
968             for (i = 0xa000; i; i--)
969             {
970                 bval = DC390_read8 (DMA_Status);
971                 if (bval & BLAST_COMPLETE)
972                     break;
973             }
974             /* It seems a DMA Blast abort isn't that bad ... */
975             if (!i) printk (KERN_ERR "DC390: DMA Blast aborted unfinished!\n");
976             //DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
977             dc390_laststatus &= ~0xff000000; dc390_laststatus |= bval << 24;
978
979             DEBUG1(printk (KERN_DEBUG "Blast: Read %i times DMA_Status %02x", 0xa000-i, bval));
980             ResidCnt = (u32) DC390_read8 (CtcReg_High);
981             ResidCnt <<= 8;
982             ResidCnt |= (u32) DC390_read8 (CtcReg_Mid);
983             ResidCnt <<= 8;
984             ResidCnt |= (u32) DC390_read8 (CtcReg_Low);
985
986             xferCnt = pSRB->SGToBeXferLen - ResidCnt;
987             pSRB->SGBusAddr += xferCnt;
988             pSRB->TotalXferredLen += xferCnt;
989             pSRB->SGToBeXferLen = ResidCnt;
990
991             if( residual )
992             {
993                 static int feedback_requested;
994                 bval = DC390_read8 (ScsiFifo);      /* get one residual byte */
995
996                 if (!feedback_requested) {
997                         feedback_requested = 1;
998                         printk(KERN_WARNING "%s: Please, contact <linux-scsi@vger.kernel.org> "
999                                "to help improve support for your system.\n", __FILE__);
1000                 }
1001
1002                 ptr = (u8 *) bus_to_virt( pSRB->SGBusAddr );
1003                 *ptr = bval;
1004                 pSRB->SGBusAddr++; xferCnt++;
1005                 pSRB->TotalXferredLen++;
1006                 pSRB->SGToBeXferLen--;
1007             }
1008             DEBUG1(printk (KERN_DEBUG "Xfered: %li, Total: %li, Remaining: %li\n", xferCnt,\
1009                            pSRB->TotalXferredLen, pSRB->SGToBeXferLen));
1010
1011         }
1012     }
1013     if ((*psstatus & 7) != SCSI_DATA_IN)
1014     {
1015             DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1016             DC390_write8 (DMA_Cmd, READ_DIRECTION+DMA_IDLE_CMD); /* | DMA_INT */
1017     }
1018 }
1019
1020 static void
1021 dc390_Command_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1022 {
1023 }
1024
1025 static void
1026 dc390_Status_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1027 {
1028
1029     pSRB->TargetStatus = DC390_read8 (ScsiFifo);
1030     //udelay (1);
1031     pSRB->EndMessage = DC390_read8 (ScsiFifo);  /* get message */
1032
1033     *psstatus = SCSI_NOP0;
1034     pSRB->SRBState = SRB_COMPLETED;
1035     DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD);
1036 }
1037
1038 static void
1039 dc390_MsgOut_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1040 {
1041     if( pSRB->SRBState & (SRB_UNEXPECT_RESEL+SRB_ABORT_SENT) )
1042         *psstatus = SCSI_NOP0;
1043     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1044 }
1045
1046
1047 static void __inline__
1048 dc390_reprog (struct dc390_acb* pACB, struct dc390_dcb* pDCB)
1049 {
1050   DC390_write8 (Sync_Period, pDCB->SyncPeriod);
1051   DC390_write8 (Sync_Offset, pDCB->SyncOffset);
1052   DC390_write8 (CtrlReg3, pDCB->CtrlR3);
1053   DC390_write8 (CtrlReg4, pDCB->CtrlR4);
1054   dc390_SetXferRate (pACB, pDCB);
1055 }
1056
1057
1058 #ifdef DC390_DEBUG0
1059 static void
1060 dc390_printMsg (u8 *MsgBuf, u8 len)
1061 {
1062   int i;
1063   printk (" %02x", MsgBuf[0]);
1064   for (i = 1; i < len; i++)
1065     printk (" %02x", MsgBuf[i]);
1066   printk ("\n");
1067 }
1068 #endif
1069
1070 #define DC390_ENABLE_MSGOUT DC390_write8 (ScsiCmd, SET_ATN_CMD)
1071
1072 /* reject_msg */
1073 static void __inline__
1074 dc390_MsgIn_reject (struct dc390_acb* pACB, struct dc390_srb* pSRB)
1075 {
1076   pSRB->MsgOutBuf[0] = MESSAGE_REJECT;
1077   pSRB->MsgCnt = 1;
1078   DC390_ENABLE_MSGOUT;
1079   DEBUG0 (printk (KERN_INFO "DC390: Reject message\n"));
1080 }
1081
1082 /* abort command */
1083 static void
1084 dc390_EnableMsgOut_Abort ( struct dc390_acb* pACB, struct dc390_srb* pSRB )
1085 {
1086     pSRB->MsgOutBuf[0] = ABORT; 
1087     pSRB->MsgCnt = 1; DC390_ENABLE_MSGOUT;
1088     pSRB->pSRBDCB->DCBFlag &= ~ABORT_DEV_;
1089 }
1090
1091 static struct dc390_srb*
1092 dc390_MsgIn_QTag (struct dc390_acb* pACB, struct dc390_dcb* pDCB, s8 tag)
1093 {
1094   struct dc390_srb* pSRB = pDCB->pGoingSRB;
1095
1096   if (pSRB)
1097     {
1098         struct scsi_cmnd *scmd = scsi_find_tag(pSRB->pcmd->device, tag);
1099         pSRB = (struct dc390_srb *)scmd->host_scribble;
1100
1101         if (pDCB->DCBFlag & ABORT_DEV_)
1102         {
1103           pSRB->SRBState = SRB_ABORT_SENT;
1104           dc390_EnableMsgOut_Abort( pACB, pSRB );
1105         }
1106
1107         if (!(pSRB->SRBState & SRB_DISCONNECT))
1108                 goto mingx0;
1109
1110         pDCB->pActiveSRB = pSRB;
1111         pSRB->SRBState = SRB_DATA_XFER;
1112     }
1113   else
1114     {
1115     mingx0:
1116       pSRB = pACB->pTmpSRB;
1117       pSRB->SRBState = SRB_UNEXPECT_RESEL;
1118       pDCB->pActiveSRB = pSRB;
1119       pSRB->MsgOutBuf[0] = ABORT_TAG;
1120       pSRB->MsgCnt = 1; DC390_ENABLE_MSGOUT;
1121     }
1122   return pSRB;
1123 }
1124
1125
1126 /* set async transfer mode */
1127 static void 
1128 dc390_MsgIn_set_async (struct dc390_acb* pACB, struct dc390_srb* pSRB)
1129 {
1130   struct dc390_dcb* pDCB = pSRB->pSRBDCB;
1131   if (!(pSRB->SRBState & DO_SYNC_NEGO)) 
1132     printk (KERN_INFO "DC390: Target %i initiates Non-Sync?\n", pDCB->TargetID);
1133   pSRB->SRBState &= ~DO_SYNC_NEGO;
1134   pDCB->SyncMode &= ~(SYNC_ENABLE+SYNC_NEGO_DONE);
1135   pDCB->SyncPeriod = 0;
1136   pDCB->SyncOffset = 0;
1137   //pDCB->NegoPeriod = 50; /* 200ns <=> 5 MHz */
1138   pDCB->CtrlR3 = FAST_CLK;      /* fast clock / normal scsi */
1139   pDCB->CtrlR4 &= 0x3f;
1140   pDCB->CtrlR4 |= pACB->glitch_cfg;     /* glitch eater */
1141   dc390_reprog (pACB, pDCB);
1142 }
1143
1144 /* set sync transfer mode */
1145 static void
1146 dc390_MsgIn_set_sync (struct dc390_acb* pACB, struct dc390_srb* pSRB)
1147 {
1148   u8 bval;
1149   u16 wval, wval1;
1150   struct dc390_dcb* pDCB = pSRB->pSRBDCB;
1151   u8 oldsyncperiod = pDCB->SyncPeriod;
1152   u8 oldsyncoffset = pDCB->SyncOffset;
1153   
1154   if (!(pSRB->SRBState & DO_SYNC_NEGO))
1155     {
1156       printk (KERN_INFO "DC390: Target %i initiates Sync: %ins %i ... answer ...\n", 
1157               pDCB->TargetID, pSRB->MsgInBuf[3]<<2, pSRB->MsgInBuf[4]);
1158
1159       /* reject */
1160       //dc390_MsgIn_reject (pACB, pSRB);
1161       //return dc390_MsgIn_set_async (pACB, pSRB);
1162
1163       /* Reply with corrected SDTR Message */
1164       if (pSRB->MsgInBuf[4] > 15)
1165         { 
1166           printk (KERN_INFO "DC390: Lower Sync Offset to 15\n");
1167           pSRB->MsgInBuf[4] = 15;
1168         }
1169       if (pSRB->MsgInBuf[3] < pDCB->NegoPeriod)
1170         {
1171           printk (KERN_INFO "DC390: Set sync nego period to %ins\n", pDCB->NegoPeriod << 2);
1172           pSRB->MsgInBuf[3] = pDCB->NegoPeriod;
1173         }
1174       memcpy (pSRB->MsgOutBuf, pSRB->MsgInBuf, 5);
1175       pSRB->MsgCnt = 5;
1176       DC390_ENABLE_MSGOUT;
1177     }
1178
1179   pSRB->SRBState &= ~DO_SYNC_NEGO;
1180   pDCB->SyncMode |= SYNC_ENABLE+SYNC_NEGO_DONE;
1181   pDCB->SyncOffset &= 0x0f0;
1182   pDCB->SyncOffset |= pSRB->MsgInBuf[4];
1183   pDCB->NegoPeriod = pSRB->MsgInBuf[3];
1184
1185   wval = (u16) pSRB->MsgInBuf[3];
1186   wval = wval << 2; wval -= 3; wval1 = wval / 25;       /* compute speed */
1187   if( (wval1 * 25) != wval) wval1++;
1188   bval = FAST_CLK+FAST_SCSI;    /* fast clock / fast scsi */
1189
1190   pDCB->CtrlR4 &= 0x3f;         /* Glitch eater: 12ns less than normal */
1191   if (pACB->glitch_cfg != NS_TO_GLITCH(0))
1192     pDCB->CtrlR4 |= NS_TO_GLITCH(((GLITCH_TO_NS(pACB->glitch_cfg)) - 1));
1193   else
1194     pDCB->CtrlR4 |= NS_TO_GLITCH(0);
1195   if (wval1 < 4) pDCB->CtrlR4 |= NS_TO_GLITCH(0); /* Ultra */
1196
1197   if (wval1 >= 8)
1198     {
1199       wval1--;  /* Timing computation differs by 1 from FAST_SCSI */
1200       bval = FAST_CLK;          /* fast clock / normal scsi */
1201       pDCB->CtrlR4 |= pACB->glitch_cfg;         /* glitch eater */
1202     }
1203
1204   pDCB->CtrlR3 = bval;
1205   pDCB->SyncPeriod = (u8)wval1;
1206   
1207   if ((oldsyncperiod != wval1 || oldsyncoffset != pDCB->SyncOffset) && pDCB->TargetLUN == 0)
1208     {
1209       if (! (bval & FAST_SCSI)) wval1++;
1210       printk (KERN_INFO "DC390: Target %i: Sync transfer %i.%1i MHz, Offset %i\n", pDCB->TargetID, 
1211               40/wval1, ((40%wval1)*10+wval1/2)/wval1, pDCB->SyncOffset & 0x0f);
1212     }
1213   
1214   dc390_reprog (pACB, pDCB);
1215 }
1216
1217
1218 /* handle RESTORE_PTR */
1219 /* I presume, this command is already mapped, so, have to remap. */
1220 static void 
1221 dc390_restore_ptr (struct dc390_acb* pACB, struct dc390_srb* pSRB)
1222 {
1223     struct scsi_cmnd *pcmd = pSRB->pcmd;
1224     struct scatterlist *psgl;
1225     pSRB->TotalXferredLen = 0;
1226     pSRB->SGIndex = 0;
1227     if (pcmd->use_sg) {
1228         pSRB->pSegmentList = (struct scatterlist *)pcmd->request_buffer;
1229         psgl = pSRB->pSegmentList;
1230         //dc390_pci_sync(pSRB);
1231
1232         while (pSRB->TotalXferredLen + (unsigned long) sg_dma_len(psgl) < pSRB->Saved_Ptr)
1233         {
1234             pSRB->TotalXferredLen += (unsigned long) sg_dma_len(psgl);
1235             pSRB->SGIndex++;
1236             if( pSRB->SGIndex < pSRB->SGcount )
1237             {
1238                 pSRB->pSegmentList++;
1239                 psgl = pSRB->pSegmentList;
1240                 pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
1241                 pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
1242             }
1243             else
1244                 pSRB->SGToBeXferLen = 0;
1245         }
1246         pSRB->SGToBeXferLen -= (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
1247         pSRB->SGBusAddr += (pSRB->Saved_Ptr - pSRB->TotalXferredLen);
1248         printk (KERN_INFO "DC390: Pointer restored. Segment %i, Total %li, Bus %08lx\n",
1249                 pSRB->SGIndex, pSRB->Saved_Ptr, pSRB->SGBusAddr);
1250
1251     } else if(pcmd->request_buffer) {
1252         //dc390_pci_sync(pSRB);
1253
1254         sg_dma_len(&pSRB->Segmentx) = pcmd->request_bufflen - pSRB->Saved_Ptr;
1255         pSRB->SGcount = 1;
1256         pSRB->pSegmentList = (struct scatterlist *) &pSRB->Segmentx;
1257     } else {
1258          pSRB->SGcount = 0;
1259          printk (KERN_INFO "DC390: RESTORE_PTR message for Transfer without Scatter-Gather ??\n");
1260     }
1261
1262   pSRB->TotalXferredLen = pSRB->Saved_Ptr;
1263 }
1264
1265
1266 /* According to the docs, the AM53C974 reads the message and 
1267  * generates a Successful Operation IRQ before asserting ACK for
1268  * the last byte (how does it know whether it's the last ?) */
1269 /* The old code handled it in another way, indicating, that on
1270  * every message byte an IRQ is generated and every byte has to
1271  * be manually ACKed. Hmmm ?  (KG, 98/11/28) */
1272 /* The old implementation was correct. Sigh! */
1273
1274 /* Check if the message is complete */
1275 static u8 __inline__
1276 dc390_MsgIn_complete (u8 *msgbuf, u32 len)
1277
1278   if (*msgbuf == EXTENDED_MESSAGE)
1279   {
1280         if (len < 2) return 0;
1281         if (len < msgbuf[1] + 2) return 0;
1282   }
1283   else if (*msgbuf >= 0x20 && *msgbuf <= 0x2f) // two byte messages
1284         if (len < 2) return 0;
1285   return 1;
1286 }
1287
1288
1289
1290 /* read and eval received messages */
1291 static void
1292 dc390_MsgIn_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1293 {
1294     struct dc390_dcb*   pDCB = pACB->pActiveDCB;
1295
1296     /* Read the msg */
1297
1298     pSRB->MsgInBuf[pACB->MsgLen++] = DC390_read8 (ScsiFifo);
1299     //pSRB->SRBState = 0;
1300
1301     /* Msg complete ? */
1302     if (dc390_MsgIn_complete (pSRB->MsgInBuf, pACB->MsgLen))
1303       {
1304         DEBUG0 (printk (KERN_INFO "DC390: MsgIn:"); dc390_printMsg (pSRB->MsgInBuf, pACB->MsgLen));
1305         /* Now eval the msg */
1306         switch (pSRB->MsgInBuf[0]) 
1307           {
1308           case DISCONNECT: 
1309             pSRB->SRBState = SRB_DISCONNECT; break;
1310             
1311           case SIMPLE_QUEUE_TAG:
1312           case HEAD_OF_QUEUE_TAG:
1313           case ORDERED_QUEUE_TAG:
1314             pSRB = dc390_MsgIn_QTag (pACB, pDCB, pSRB->MsgInBuf[1]);
1315             break;
1316             
1317           case MESSAGE_REJECT: 
1318             DC390_write8 (ScsiCmd, RESET_ATN_CMD);
1319             pDCB->NegoPeriod = 50; /* 200ns <=> 5 MHz */
1320             if( pSRB->SRBState & DO_SYNC_NEGO)
1321               dc390_MsgIn_set_async (pACB, pSRB);
1322             break;
1323             
1324           case EXTENDED_MESSAGE:
1325             /* reject every extended msg but SDTR */
1326             if (pSRB->MsgInBuf[1] != 3 || pSRB->MsgInBuf[2] != EXTENDED_SDTR)
1327               dc390_MsgIn_reject (pACB, pSRB);
1328             else
1329               {
1330                 if (pSRB->MsgInBuf[3] == 0 || pSRB->MsgInBuf[4] == 0)
1331                   dc390_MsgIn_set_async (pACB, pSRB);
1332                 else
1333                   dc390_MsgIn_set_sync (pACB, pSRB);
1334               }
1335             
1336             // nothing has to be done
1337           case COMMAND_COMPLETE: break;
1338             
1339             // SAVE POINTER may be ignored as we have the struct dc390_srb* associated with the
1340             // scsi command. Thanks, Gerard, for pointing it out.
1341           case SAVE_POINTERS: 
1342             pSRB->Saved_Ptr = pSRB->TotalXferredLen;
1343             break;
1344             // The device might want to restart transfer with a RESTORE
1345           case RESTORE_POINTERS:
1346             DEBUG0(printk ("DC390: RESTORE POINTER message received ... try to handle\n"));
1347             dc390_restore_ptr (pACB, pSRB);
1348             break;
1349
1350             // reject unknown messages
1351           default: dc390_MsgIn_reject (pACB, pSRB);
1352           }
1353         
1354         /* Clear counter and MsgIn state */
1355         pSRB->SRBState &= ~SRB_MSGIN;
1356         pACB->MsgLen = 0;
1357       }
1358
1359     *psstatus = SCSI_NOP0;
1360     DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD);
1361     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1362 }
1363
1364
1365 static void
1366 dc390_DataIO_Comm( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 ioDir)
1367 {
1368     struct scatterlist *psgl;
1369     unsigned long  lval;
1370     struct dc390_dcb*   pDCB = pACB->pActiveDCB;
1371
1372     if (pSRB == pACB->pTmpSRB)
1373     {
1374         if (pDCB)
1375                 printk(KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (%02i-%i)\n", pDCB->TargetID, pDCB->TargetLUN);
1376         else
1377                 printk(KERN_ERR "DC390: pSRB == pTmpSRB! (TagQ Error?) (DCB 0!)\n");
1378
1379         /* Try to recover - some broken disks react badly to tagged INQUIRY */
1380         if (pDCB && pACB->scan_devices && pDCB->GoingSRBCnt == 1) {
1381                 pSRB = pDCB->pGoingSRB;
1382                 pDCB->pActiveSRB = pSRB;
1383         } else {
1384                 pSRB->pSRBDCB = pDCB;
1385                 dc390_EnableMsgOut_Abort(pACB, pSRB);
1386                 if (pDCB)
1387                         pDCB->DCBFlag |= ABORT_DEV;
1388                 return;
1389         }
1390     }
1391
1392     if( pSRB->SGIndex < pSRB->SGcount )
1393     {
1394         DC390_write8 (DMA_Cmd, DMA_IDLE_CMD | ioDir /* | DMA_INT */);
1395         if( !pSRB->SGToBeXferLen )
1396         {
1397             psgl = pSRB->pSegmentList;
1398             pSRB->SGBusAddr = cpu_to_le32(pci_dma_lo32(sg_dma_address(psgl)));
1399             pSRB->SGToBeXferLen = cpu_to_le32(sg_dma_len(psgl));
1400             DEBUG1(printk (KERN_DEBUG " DC390: Next SG segment."));
1401         }
1402         lval = pSRB->SGToBeXferLen;
1403         DEBUG1(printk (KERN_DEBUG " DC390: Start transfer: %li bytes (address %08lx)\n", lval, pSRB->SGBusAddr));
1404         DC390_write8 (CtcReg_Low, (u8) lval);
1405         lval >>= 8;
1406         DC390_write8 (CtcReg_Mid, (u8) lval);
1407         lval >>= 8;
1408         DC390_write8 (CtcReg_High, (u8) lval);
1409
1410         DC390_write32 (DMA_XferCnt, pSRB->SGToBeXferLen);
1411         DC390_write32 (DMA_XferAddr, pSRB->SGBusAddr);
1412
1413         //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD | ioDir); /* | DMA_INT; */
1414         pSRB->SRBState = SRB_DATA_XFER;
1415
1416         DC390_write8 (ScsiCmd, DMA_COMMAND+INFO_XFER_CMD);
1417
1418         DC390_write8 (DMA_Cmd, DMA_START_CMD | ioDir | DMA_INT);
1419         //DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT));
1420         //DEBUG1(printk (KERN_DEBUG "DC390: DMA_Status: %02x\n", DC390_read8 (DMA_Status)));
1421         //DEBUG1(DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT));
1422     }
1423     else    /* xfer pad */
1424     {
1425         if( pSRB->SGcount )
1426         {
1427             pSRB->AdaptStatus = H_OVER_UNDER_RUN;
1428             pSRB->SRBStatus |= OVER_RUN;
1429             DEBUG0(printk (KERN_WARNING " DC390: Overrun -"));
1430         }
1431         DEBUG0(printk (KERN_WARNING " Clear transfer pad \n"));
1432         DC390_write8 (CtcReg_Low, 0);
1433         DC390_write8 (CtcReg_Mid, 0);
1434         DC390_write8 (CtcReg_High, 0);
1435
1436         pSRB->SRBState |= SRB_XFERPAD;
1437         DC390_write8 (ScsiCmd, DMA_COMMAND+XFER_PAD_BYTE);
1438 /*
1439         DC390_write8 (DMA_Cmd, DMA_IDLE_CMD | ioDir); // | DMA_INT;
1440         DC390_write8 (DMA_Cmd, DMA_START_CMD | ioDir | DMA_INT);
1441 */
1442     }
1443 }
1444
1445
1446 static void
1447 dc390_DataOutPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1448 {
1449     dc390_DataIO_Comm (pACB, pSRB, WRITE_DIRECTION);
1450 }
1451
1452 static void
1453 dc390_DataInPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1454 {
1455     dc390_DataIO_Comm (pACB, pSRB, READ_DIRECTION);
1456 }
1457
1458 static void
1459 dc390_CommandPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1460 {
1461     struct dc390_dcb*   pDCB;
1462     u8  i, cnt;
1463     u8     *ptr;
1464
1465     DC390_write8 (ScsiCmd, RESET_ATN_CMD);
1466     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1467     if( !(pSRB->SRBFlag & AUTO_REQSENSE) )
1468     {
1469         cnt = (u8) pSRB->pcmd->cmd_len;
1470         ptr = (u8 *) pSRB->pcmd->cmnd;
1471         for(i=0; i < cnt; i++)
1472             DC390_write8 (ScsiFifo, *(ptr++));
1473     }
1474     else
1475     {
1476         DC390_write8 (ScsiFifo, REQUEST_SENSE);
1477         pDCB = pACB->pActiveDCB;
1478         DC390_write8 (ScsiFifo, pDCB->TargetLUN << 5);
1479         DC390_write8 (ScsiFifo, 0);
1480         DC390_write8 (ScsiFifo, 0);
1481         DC390_write8 (ScsiFifo, sizeof(pSRB->pcmd->sense_buffer));
1482         DC390_write8 (ScsiFifo, 0);
1483         DEBUG0(printk(KERN_DEBUG "DC390: AutoReqSense (CmndPhase)!\n"));
1484     }
1485     pSRB->SRBState = SRB_COMMAND;
1486     DC390_write8 (ScsiCmd, INFO_XFER_CMD);
1487 }
1488
1489 static void
1490 dc390_StatusPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1491 {
1492     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1493     pSRB->SRBState = SRB_STATUS;
1494     DC390_write8 (ScsiCmd, INITIATOR_CMD_CMPLTE);
1495     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1496 }
1497
1498 static void
1499 dc390_MsgOutPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1500 {
1501     u8   bval, i, cnt;
1502     u8     *ptr;
1503     struct dc390_dcb*    pDCB;
1504
1505     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1506     pDCB = pACB->pActiveDCB;
1507     if( !(pSRB->SRBState & SRB_MSGOUT) )
1508     {
1509         cnt = pSRB->MsgCnt;
1510         if( cnt )
1511         {
1512             ptr = (u8 *) pSRB->MsgOutBuf;
1513             for(i=0; i < cnt; i++)
1514                 DC390_write8 (ScsiFifo, *(ptr++));
1515             pSRB->MsgCnt = 0;
1516             if( (pDCB->DCBFlag & ABORT_DEV_) &&
1517                 (pSRB->MsgOutBuf[0] == ABORT) )
1518                 pSRB->SRBState = SRB_ABORT_SENT;
1519         }
1520         else
1521         {
1522             bval = ABORT;       /* ??? MSG_NOP */
1523             if( (pSRB->pcmd->cmnd[0] == INQUIRY ) ||
1524                 (pSRB->pcmd->cmnd[0] == REQUEST_SENSE) ||
1525                 (pSRB->SRBFlag & AUTO_REQSENSE) )
1526             {
1527                 if( pDCB->SyncMode & SYNC_ENABLE )
1528                     goto  mop1;
1529             }
1530             DC390_write8 (ScsiFifo, bval);
1531         }
1532         DC390_write8 (ScsiCmd, INFO_XFER_CMD);
1533     }
1534     else
1535     {
1536 mop1:
1537         printk (KERN_ERR "DC390: OLD Sync Nego code triggered! (%i %i)\n", pDCB->TargetID, pDCB->TargetLUN);
1538         DC390_write8 (ScsiFifo, EXTENDED_MESSAGE);
1539         DC390_write8 (ScsiFifo, 3);     /*    ;length of extended msg */
1540         DC390_write8 (ScsiFifo, EXTENDED_SDTR); /*    ; sync nego */
1541         DC390_write8 (ScsiFifo, pDCB->NegoPeriod);
1542         if (pDCB->SyncOffset & 0x0f)
1543                     DC390_write8 (ScsiFifo, pDCB->SyncOffset);
1544         else
1545                     DC390_write8 (ScsiFifo, SYNC_NEGO_OFFSET);              
1546         pSRB->SRBState |= DO_SYNC_NEGO;
1547         DC390_write8 (ScsiCmd, INFO_XFER_CMD);
1548     }
1549 }
1550
1551 static void
1552 dc390_MsgInPhase( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1553 {
1554     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1555     if( !(pSRB->SRBState & SRB_MSGIN) )
1556     {
1557         pSRB->SRBState &= ~SRB_DISCONNECT;
1558         pSRB->SRBState |= SRB_MSGIN;
1559     }
1560     DC390_write8 (ScsiCmd, INFO_XFER_CMD);
1561     //DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1562 }
1563
1564 static void
1565 dc390_Nop_0( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1566 {
1567 }
1568
1569 static void
1570 dc390_Nop_1( struct dc390_acb* pACB, struct dc390_srb* pSRB, u8 *psstatus)
1571 {
1572 }
1573
1574
1575 static void
1576 dc390_SetXferRate( struct dc390_acb* pACB, struct dc390_dcb* pDCB )
1577 {
1578     u8  bval, i, cnt;
1579     struct dc390_dcb*   ptr;
1580
1581     if( !(pDCB->TargetLUN) )
1582     {
1583         if( !pACB->scan_devices )
1584         {
1585             ptr = pACB->pLinkDCB;
1586             cnt = pACB->DCBCnt;
1587             bval = pDCB->TargetID;
1588             for(i=0; i<cnt; i++)
1589             {
1590                 if( ptr->TargetID == bval )
1591                 {
1592                     ptr->SyncPeriod = pDCB->SyncPeriod;
1593                     ptr->SyncOffset = pDCB->SyncOffset;
1594                     ptr->CtrlR3 = pDCB->CtrlR3;
1595                     ptr->CtrlR4 = pDCB->CtrlR4;
1596                     ptr->SyncMode = pDCB->SyncMode;
1597                 }
1598                 ptr = ptr->pNextDCB;
1599             }
1600         }
1601     }
1602     return;
1603 }
1604
1605
1606 static void
1607 dc390_Disconnect( struct dc390_acb* pACB )
1608 {
1609     struct dc390_dcb *pDCB;
1610     struct dc390_srb *pSRB, *psrb;
1611     u8  i, cnt;
1612
1613     DEBUG0(printk(KERN_INFO "DISC,"));
1614
1615     if (!pACB->Connected) printk(KERN_ERR "DC390: Disconnect not-connected bus?\n");
1616     pACB->Connected = 0;
1617     pDCB = pACB->pActiveDCB;
1618     if (!pDCB)
1619      {
1620         DEBUG0(printk(KERN_ERR "ACB:%p->ActiveDCB:%p IOPort:%04x IRQ:%02x !\n",\
1621                pACB, pDCB, pACB->IOPortBase, pACB->IRQLevel));
1622         mdelay(400);
1623         DC390_read8 (INT_Status);       /* Reset Pending INT */
1624         DC390_write8 (ScsiCmd, EN_SEL_RESEL);
1625         return;
1626      }
1627     DC390_write8 (ScsiCmd, EN_SEL_RESEL);
1628     pSRB = pDCB->pActiveSRB;
1629     pACB->pActiveDCB = NULL;
1630     pSRB->ScsiPhase = SCSI_NOP0;
1631     if( pSRB->SRBState & SRB_UNEXPECT_RESEL )
1632         pSRB->SRBState = 0;
1633     else if( pSRB->SRBState & SRB_ABORT_SENT )
1634     {
1635         pDCB->TagMask = 0;
1636         pDCB->DCBFlag = 0;
1637         cnt = pDCB->GoingSRBCnt;
1638         pDCB->GoingSRBCnt = 0;
1639         pSRB = pDCB->pGoingSRB;
1640         for( i=0; i < cnt; i++)
1641         {
1642             psrb = pSRB->pNextSRB;
1643             dc390_Free_insert (pACB, pSRB);
1644             pSRB = psrb;
1645         }
1646         pDCB->pGoingSRB = NULL;
1647     }
1648     else
1649     {
1650         if( (pSRB->SRBState & (SRB_START_+SRB_MSGOUT)) ||
1651            !(pSRB->SRBState & (SRB_DISCONNECT+SRB_COMPLETED)) )
1652         {       /* Selection time out */
1653                 pSRB->TargetStatus = SCSI_STAT_SEL_TIMEOUT;
1654                 goto  disc1;
1655         }
1656         else if (!(pSRB->SRBState & SRB_DISCONNECT) && (pSRB->SRBState & SRB_COMPLETED))
1657         {
1658 disc1:
1659             dc390_freetag (pDCB, pSRB);
1660             pDCB->pActiveSRB = NULL;
1661             pSRB->SRBState = SRB_FREE;
1662             dc390_SRBdone( pACB, pDCB, pSRB);
1663         }
1664     }
1665     pACB->MsgLen = 0;
1666 }
1667
1668
1669 static void
1670 dc390_Reselect( struct dc390_acb* pACB )
1671 {
1672     struct dc390_dcb*   pDCB;
1673     struct dc390_srb*   pSRB;
1674     u8  id, lun;
1675
1676     DEBUG0(printk(KERN_INFO "RSEL,"));
1677     pACB->Connected = 1;
1678     pDCB = pACB->pActiveDCB;
1679     if( pDCB )
1680     {   /* Arbitration lost but Reselection won */
1681         DEBUG0(printk ("DC390: (ActiveDCB != 0: Arb. lost but resel. won)!\n"));
1682         pSRB = pDCB->pActiveSRB;
1683         if( !( pACB->scan_devices ) )
1684         {
1685             struct scsi_cmnd *pcmd = pSRB->pcmd;
1686             pcmd->resid = pcmd->request_bufflen;
1687             SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
1688             dc390_Going_remove(pDCB, pSRB);
1689             dc390_Free_insert(pACB, pSRB);
1690             pcmd->scsi_done (pcmd);
1691             DEBUG0(printk(KERN_DEBUG"DC390: Return SRB %p to free\n", pSRB));
1692         }
1693     }
1694     /* Get ID */
1695     lun = DC390_read8 (ScsiFifo);
1696     DEBUG0(printk ("Dev %02x,", lun));
1697     if (!(lun & (1 << pACB->pScsiHost->this_id)))
1698       printk (KERN_ERR "DC390: Reselection must select host adapter: %02x!\n", lun);
1699     else
1700       lun ^= 1 << pACB->pScsiHost->this_id; /* Mask AdapterID */
1701     id = 0; while (lun >>= 1) id++;
1702     /* Get LUN */
1703     lun = DC390_read8 (ScsiFifo);
1704     if (!(lun & IDENTIFY_BASE)) printk (KERN_ERR "DC390: Resel: Expect identify message!\n");
1705     lun &= 7;
1706     DEBUG0(printk ("(%02i-%i),", id, lun));
1707     pDCB = dc390_findDCB (pACB, id, lun);
1708     if (!pDCB)
1709     {
1710         printk (KERN_ERR "DC390: Reselect from non existing device (%02i-%i)\n",
1711                     id, lun);
1712         return;
1713     }
1714     pACB->pActiveDCB = pDCB;
1715     /* TagQ: We expect a message soon, so never mind the exact SRB */
1716     if( pDCB->SyncMode & EN_TAG_QUEUEING )
1717     {
1718         pSRB = pACB->pTmpSRB;
1719         pDCB->pActiveSRB = pSRB;
1720     }
1721     else
1722     {
1723         pSRB = pDCB->pActiveSRB;
1724         if( !pSRB || !(pSRB->SRBState & SRB_DISCONNECT) )
1725         {
1726             pSRB= pACB->pTmpSRB;
1727             pSRB->SRBState = SRB_UNEXPECT_RESEL;
1728             printk (KERN_ERR "DC390: Reselect without outstanding cmnd (%02i-%i)\n",
1729                     id, lun);
1730             pDCB->pActiveSRB = pSRB;
1731             dc390_EnableMsgOut_Abort ( pACB, pSRB );
1732         }
1733         else
1734         {
1735             if( pDCB->DCBFlag & ABORT_DEV_ )
1736             {
1737                 pSRB->SRBState = SRB_ABORT_SENT;
1738                 printk (KERN_INFO "DC390: Reselect: Abort (%02i-%i)\n",
1739                         id, lun);
1740                 dc390_EnableMsgOut_Abort( pACB, pSRB );
1741             }
1742             else
1743                 pSRB->SRBState = SRB_DATA_XFER;
1744         }
1745     }
1746
1747     DEBUG1(printk (KERN_DEBUG "Resel SRB(%p): TagNum (%02x)\n", pSRB, pSRB->TagNumber));
1748     pSRB->ScsiPhase = SCSI_NOP0;
1749     DC390_write8 (Scsi_Dest_ID, pDCB->TargetID);
1750     DC390_write8 (Sync_Period, pDCB->SyncPeriod);
1751     DC390_write8 (Sync_Offset, pDCB->SyncOffset);
1752     DC390_write8 (CtrlReg1, pDCB->CtrlR1);
1753     DC390_write8 (CtrlReg3, pDCB->CtrlR3);
1754     DC390_write8 (CtrlReg4, pDCB->CtrlR4);      /* ; Glitch eater */
1755     DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD);   /* ;to release the /ACK signal */
1756 }
1757
1758 static int __inline__
1759 dc390_RequestSense(struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
1760 {
1761         struct scsi_cmnd *pcmd;
1762
1763         pcmd = pSRB->pcmd;
1764
1765         REMOVABLEDEBUG(printk(KERN_INFO "DC390: RequestSense(Cmd %02x, Id %02x, LUN %02x)\n",\
1766                               pcmd->cmnd[0], pDCB->TargetID, pDCB->TargetLUN));
1767
1768         pSRB->SRBFlag |= AUTO_REQSENSE;
1769         pSRB->SavedSGCount = pcmd->use_sg;
1770         pSRB->SavedTotXLen = pSRB->TotalXferredLen;
1771         pSRB->AdaptStatus = 0;
1772         pSRB->TargetStatus = 0; /* CHECK_CONDITION<<1; */
1773
1774         /* We are called from SRBdone, original PCI mapping has been removed
1775          * already, new one is set up from StartSCSI */
1776         pSRB->SGIndex = 0;
1777
1778         pSRB->TotalXferredLen = 0;
1779         pSRB->SGToBeXferLen = 0;
1780         return dc390_StartSCSI(pACB, pDCB, pSRB);
1781 }
1782
1783
1784 static void
1785 dc390_SRBdone( struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB )
1786 {
1787     u8 status;
1788     struct scsi_cmnd *pcmd;
1789
1790     pcmd = pSRB->pcmd;
1791     /* KG: Moved pci_unmap here */
1792     dc390_pci_unmap(pSRB);
1793
1794     status = pSRB->TargetStatus;
1795
1796     DEBUG0(printk (" SRBdone (%02x,%08x), SRB %p, pid %li\n", status, pcmd->result,\
1797                 pSRB, pcmd->pid));
1798     if(pSRB->SRBFlag & AUTO_REQSENSE)
1799     {   /* Last command was a Request Sense */
1800         pSRB->SRBFlag &= ~AUTO_REQSENSE;
1801         pSRB->AdaptStatus = 0;
1802         pSRB->TargetStatus = CHECK_CONDITION << 1;
1803
1804         //pcmd->result = MK_RES(DRIVER_SENSE,DID_OK,0,status);
1805         if (status == (CHECK_CONDITION << 1))
1806             pcmd->result = MK_RES_LNX(0, DID_BAD_TARGET, 0, /*CHECK_CONDITION*/0);
1807         else /* Retry */
1808         {
1809             if( pSRB->pcmd->cmnd[0] == TEST_UNIT_READY /* || pSRB->pcmd->cmnd[0] == START_STOP */)
1810             {
1811                 /* Don't retry on TEST_UNIT_READY */
1812                 pcmd->result = MK_RES_LNX(DRIVER_SENSE,DID_OK,0,CHECK_CONDITION);
1813                 REMOVABLEDEBUG(printk(KERN_INFO "Cmd=%02x, Result=%08x, XferL=%08x\n",pSRB->pcmd->cmnd[0],\
1814                        (u32) pcmd->result, (u32) pSRB->TotalXferredLen));
1815             } else {
1816                 SET_RES_DRV(pcmd->result, DRIVER_SENSE);
1817                 pcmd->use_sg = pSRB->SavedSGCount;
1818                 //pSRB->ScsiCmdLen       = (u8) (pSRB->Segment1[0] >> 8);
1819                 DEBUG0 (printk ("DC390: RETRY pid %li (%02x), target %02i-%02i\n", pcmd->pid, pcmd->cmnd[0], pcmd->device->id, pcmd->device->lun));
1820                 pSRB->TotalXferredLen = 0;
1821                 SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
1822             }
1823         }
1824         goto cmd_done;
1825     }
1826     if( status )
1827     {
1828         if( status_byte(status) == CHECK_CONDITION )
1829         {
1830             if (dc390_RequestSense(pACB, pDCB, pSRB)) {
1831                 SET_RES_DID(pcmd->result, DID_ERROR);
1832                 goto cmd_done;
1833             }
1834             return;
1835         }
1836         else if( status_byte(status) == QUEUE_FULL )
1837         {
1838             scsi_track_queue_full(pcmd->device, pDCB->GoingSRBCnt - 1);
1839             pcmd->use_sg = pSRB->SavedSGCount;
1840             DEBUG0 (printk ("DC390: RETRY pid %li (%02x), target %02i-%02i\n", pcmd->pid, pcmd->cmnd[0], pcmd->device->id, pcmd->device->lun));
1841             pSRB->TotalXferredLen = 0;
1842             SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
1843         }
1844         else if(status == SCSI_STAT_SEL_TIMEOUT)
1845         {
1846             pSRB->AdaptStatus = H_SEL_TIMEOUT;
1847             pSRB->TargetStatus = 0;
1848             pcmd->result = MK_RES(0,DID_NO_CONNECT,0,0);
1849             /* Devices are removed below ... */
1850         }
1851         else if (status_byte(status) == BUSY && 
1852                  (pcmd->cmnd[0] == TEST_UNIT_READY || pcmd->cmnd[0] == INQUIRY) &&
1853                  pACB->scan_devices)
1854         {
1855             pSRB->AdaptStatus = 0;
1856             pSRB->TargetStatus = status;
1857             pcmd->result = MK_RES(0,0,pSRB->EndMessage,/*status*/0);
1858         }
1859         else
1860         {   /* Another error */
1861             pSRB->TotalXferredLen = 0;
1862             SET_RES_DID(pcmd->result, DID_SOFT_ERROR);
1863             goto cmd_done;
1864         }
1865     }
1866     else
1867     {   /*  Target status == 0 */
1868         status = pSRB->AdaptStatus;
1869         if(status & H_OVER_UNDER_RUN)
1870         {
1871             pSRB->TargetStatus = 0;
1872             SET_RES_DID(pcmd->result,DID_OK);
1873             SET_RES_MSG(pcmd->result,pSRB->EndMessage);
1874         }
1875         else if( pSRB->SRBStatus & PARITY_ERROR)
1876         {
1877             //pcmd->result = MK_RES(0,DID_PARITY,pSRB->EndMessage,0);
1878             SET_RES_DID(pcmd->result,DID_PARITY);
1879             SET_RES_MSG(pcmd->result,pSRB->EndMessage);
1880         }
1881         else                   /* No error */
1882         {
1883             pSRB->AdaptStatus = 0;
1884             pSRB->TargetStatus = 0;
1885             SET_RES_DID(pcmd->result,DID_OK);
1886         }
1887     }
1888
1889 cmd_done:
1890     pcmd->resid = pcmd->request_bufflen - pSRB->TotalXferredLen;
1891
1892     dc390_Going_remove (pDCB, pSRB);
1893     /* Add to free list */
1894     dc390_Free_insert (pACB, pSRB);
1895
1896     DEBUG0(printk (KERN_DEBUG "DC390: SRBdone: done pid %li\n", pcmd->pid));
1897     pcmd->scsi_done (pcmd);
1898
1899     return;
1900 }
1901
1902
1903 /* Remove all SRBs from Going list and inform midlevel */
1904 static void
1905 dc390_DoingSRB_Done(struct dc390_acb* pACB, struct scsi_cmnd *cmd)
1906 {
1907     struct dc390_dcb *pDCB, *pdcb;
1908     struct dc390_srb *psrb, *psrb2;
1909     int i;
1910     struct scsi_cmnd *pcmd;
1911
1912     pDCB = pACB->pLinkDCB;
1913     pdcb = pDCB;
1914     if (! pdcb) return;
1915     do
1916     {
1917         psrb = pdcb->pGoingSRB;
1918         for (i = 0; i < pdcb->GoingSRBCnt; i++)
1919         {
1920             psrb2 = psrb->pNextSRB;
1921             pcmd = psrb->pcmd;
1922             dc390_Free_insert (pACB, psrb);
1923             psrb  = psrb2;
1924         }
1925         pdcb->GoingSRBCnt = 0;
1926         pdcb->pGoingSRB = NULL;
1927         pdcb->TagMask = 0;
1928         pdcb = pdcb->pNextDCB;
1929     } while( pdcb != pDCB );
1930 }
1931
1932
1933 static void
1934 dc390_ResetSCSIBus( struct dc390_acb* pACB )
1935 {
1936     //DC390_write8 (ScsiCmd, RST_DEVICE_CMD);
1937     //udelay (250);
1938     //DC390_write8 (ScsiCmd, NOP_CMD);
1939
1940     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1941     DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1942     DC390_write8 (ScsiCmd, RST_SCSI_BUS_CMD);
1943     pACB->Connected = 0;
1944
1945     return;
1946 }
1947
1948 static void
1949 dc390_ScsiRstDetect( struct dc390_acb* pACB )
1950 {
1951     printk ("DC390: Rst_Detect: laststat = %08x\n", dc390_laststatus);
1952     //DEBUG0(printk(KERN_INFO "RST_DETECT,"));
1953
1954     DC390_write8 (DMA_Cmd, DMA_IDLE_CMD);
1955     /* Unlock before ? */
1956     /* delay half a second */
1957     udelay (1000);
1958     DC390_write8 (ScsiCmd, CLEAR_FIFO_CMD);
1959     pACB->pScsiHost->last_reset = jiffies + 5*HZ/2
1960                     + HZ * dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY];
1961     pACB->Connected = 0;
1962
1963     if( pACB->ACBFlag & RESET_DEV )
1964         pACB->ACBFlag |= RESET_DONE;
1965     else
1966     {   /* Reset was issued by sb else */
1967         pACB->ACBFlag |= RESET_DETECT;
1968
1969         dc390_ResetDevParam( pACB );
1970         dc390_DoingSRB_Done( pACB, NULL);
1971         //dc390_RecoverSRB( pACB );
1972         pACB->pActiveDCB = NULL;
1973         pACB->ACBFlag = 0;
1974     }
1975     return;
1976 }
1977
1978 static int DC390_queuecommand(struct scsi_cmnd *cmd,
1979                 void (*done)(struct scsi_cmnd *))
1980 {
1981         struct scsi_device *sdev = cmd->device;
1982         struct dc390_acb *acb = (struct dc390_acb *)sdev->host->hostdata;
1983         struct dc390_dcb *dcb = sdev->hostdata;
1984         struct dc390_srb *srb;
1985
1986         if (sdev->queue_depth <= dcb->GoingSRBCnt)
1987                 goto device_busy;
1988         if (acb->pActiveDCB)
1989                 goto host_busy;
1990         if (acb->ACBFlag & (RESET_DETECT|RESET_DONE|RESET_DEV))
1991                 goto host_busy;
1992
1993         srb = acb->pFreeSRB;
1994         if (unlikely(srb == NULL))
1995                 goto host_busy;
1996
1997         cmd->scsi_done = done;
1998         cmd->result = 0;
1999         acb->Cmds++;
2000
2001         acb->pFreeSRB = srb->pNextSRB;
2002         srb->pNextSRB = NULL;
2003
2004         srb->pSRBDCB = dcb;
2005         srb->pcmd = cmd;
2006         cmd->host_scribble = (char *)srb;
2007     
2008         srb->SGIndex = 0;
2009         srb->AdaptStatus = 0;
2010         srb->TargetStatus = 0;
2011         srb->MsgCnt = 0;
2012
2013         srb->SRBStatus = 0;
2014         srb->SRBFlag = 0;
2015         srb->SRBState = 0;
2016         srb->TotalXferredLen = 0;
2017         srb->SGBusAddr = 0;
2018         srb->SGToBeXferLen = 0;
2019         srb->ScsiPhase = 0;
2020         srb->EndMessage = 0;
2021         srb->TagNumber = SCSI_NO_TAG;
2022
2023         if (dc390_StartSCSI(acb, dcb, srb)) {
2024                 dc390_Free_insert(acb, srb);
2025                 goto host_busy;
2026         }
2027
2028         dc390_Going_append(dcb, srb);
2029
2030         return 0;
2031
2032  host_busy:
2033         return SCSI_MLQUEUE_HOST_BUSY;
2034
2035  device_busy:
2036         return SCSI_MLQUEUE_DEVICE_BUSY;
2037 }
2038
2039 static void dc390_dumpinfo (struct dc390_acb* pACB, struct dc390_dcb* pDCB, struct dc390_srb* pSRB)
2040 {
2041     struct pci_dev *pdev;
2042     u16 pstat;
2043
2044     if (!pDCB) pDCB = pACB->pActiveDCB;
2045     if (!pSRB && pDCB) pSRB = pDCB->pActiveSRB;
2046
2047     if (pSRB) 
2048     {
2049         printk ("DC390: SRB: Xferred %08lx, Remain %08lx, State %08x, Phase %02x\n",
2050                 pSRB->TotalXferredLen, pSRB->SGToBeXferLen, pSRB->SRBState,
2051                 pSRB->ScsiPhase);
2052         printk ("DC390: AdpaterStatus: %02x, SRB Status %02x\n", pSRB->AdaptStatus, pSRB->SRBStatus);
2053     }
2054     printk ("DC390: Status of last IRQ (DMA/SC/Int/IRQ): %08x\n", dc390_laststatus);
2055     printk ("DC390: Register dump: SCSI block:\n");
2056     printk ("DC390: XferCnt  Cmd Stat IntS IRQS FFIS Ctl1 Ctl2 Ctl3 Ctl4\n");
2057     printk ("DC390:  %06x   %02x   %02x   %02x",
2058             DC390_read8(CtcReg_Low) + (DC390_read8(CtcReg_Mid) << 8) + (DC390_read8(CtcReg_High) << 16),
2059             DC390_read8(ScsiCmd), DC390_read8(Scsi_Status), DC390_read8(Intern_State));
2060     printk ("   %02x   %02x   %02x   %02x   %02x   %02x\n",
2061             DC390_read8(INT_Status), DC390_read8(Current_Fifo), DC390_read8(CtrlReg1),
2062             DC390_read8(CtrlReg2), DC390_read8(CtrlReg3), DC390_read8(CtrlReg4));
2063     DC390_write32 (DMA_ScsiBusCtrl, WRT_ERASE_DMA_STAT | EN_INT_ON_PCI_ABORT);
2064     if (DC390_read8(Current_Fifo) & 0x1f)
2065       {
2066         printk ("DC390: FIFO:");
2067         while (DC390_read8(Current_Fifo) & 0x1f) printk (" %02x", DC390_read8(ScsiFifo));
2068         printk ("\n");
2069       }
2070     printk ("DC390: Register dump: DMA engine:\n");
2071     printk ("DC390: Cmd   STrCnt    SBusA    WrkBC    WrkAC Stat SBusCtrl\n");
2072     printk ("DC390:  %02x %08x %08x %08x %08x   %02x %08x\n",
2073             DC390_read8(DMA_Cmd), DC390_read32(DMA_XferCnt), DC390_read32(DMA_XferAddr),
2074             DC390_read32(DMA_Wk_ByteCntr), DC390_read32(DMA_Wk_AddrCntr),
2075             DC390_read8(DMA_Status), DC390_read32(DMA_ScsiBusCtrl));
2076     DC390_write32 (DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT);
2077
2078     pdev = pACB->pdev;
2079     pci_read_config_word(pdev, PCI_STATUS, &pstat);
2080     printk ("DC390: Register dump: PCI Status: %04x\n", pstat);
2081     printk ("DC390: In case of driver trouble read Documentation/scsi/tmscsim.txt\n");
2082 }
2083
2084
2085 static int DC390_abort(struct scsi_cmnd *cmd)
2086 {
2087         struct dc390_acb *pACB = (struct dc390_acb*) cmd->device->host->hostdata;
2088         struct dc390_dcb *pDCB = (struct dc390_dcb*) cmd->device->hostdata;
2089
2090         scmd_printk(KERN_WARNING, cmd,
2091                 "DC390: Abort command (pid %li)\n", cmd->pid);
2092
2093         /* abort() is too stupid for already sent commands at the moment. 
2094          * If it's called we are in trouble anyway, so let's dump some info 
2095          * into the syslog at least. (KG, 98/08/20,99/06/20) */
2096         dc390_dumpinfo(pACB, pDCB, NULL);
2097
2098         pDCB->DCBFlag |= ABORT_DEV_;
2099         printk(KERN_INFO "DC390: Aborted pid %li\n", cmd->pid);
2100
2101         return FAILED;
2102 }
2103
2104
2105 static void dc390_ResetDevParam( struct dc390_acb* pACB )
2106 {
2107     struct dc390_dcb *pDCB, *pdcb;
2108
2109     pDCB = pACB->pLinkDCB;
2110     if (! pDCB) return;
2111     pdcb = pDCB;
2112     do
2113     {
2114         pDCB->SyncMode &= ~SYNC_NEGO_DONE;
2115         pDCB->SyncPeriod = 0;
2116         pDCB->SyncOffset = 0;
2117         pDCB->TagMask = 0;
2118         pDCB->CtrlR3 = FAST_CLK;
2119         pDCB->CtrlR4 &= NEGATE_REQACKDATA | CTRL4_RESERVED | NEGATE_REQACK;
2120         pDCB->CtrlR4 |= pACB->glitch_cfg;
2121         pDCB = pDCB->pNextDCB;
2122     }
2123     while( pdcb != pDCB );
2124     pACB->ACBFlag &= ~(RESET_DEV | RESET_DONE | RESET_DETECT);
2125
2126 }
2127
2128 static int DC390_bus_reset (struct scsi_cmnd *cmd)
2129 {
2130         struct dc390_acb*    pACB = (struct dc390_acb*) cmd->device->host->hostdata;
2131         u8   bval;
2132
2133         spin_lock_irq(cmd->device->host->host_lock);
2134
2135         bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
2136         DC390_write8(CtrlReg1, bval);   /* disable IRQ on bus reset */
2137
2138         pACB->ACBFlag |= RESET_DEV;
2139         dc390_ResetSCSIBus(pACB);
2140
2141         dc390_ResetDevParam(pACB);
2142         mdelay(1);
2143         pACB->pScsiHost->last_reset = jiffies + 3*HZ/2 
2144                 + HZ * dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY];
2145     
2146         DC390_write8(ScsiCmd, CLEAR_FIFO_CMD);
2147         DC390_read8(INT_Status);                /* Reset Pending INT */
2148
2149         dc390_DoingSRB_Done(pACB, cmd);
2150
2151         pACB->pActiveDCB = NULL;
2152         pACB->ACBFlag = 0;
2153
2154         bval = DC390_read8(CtrlReg1) & ~DIS_INT_ON_SCSI_RST;
2155         DC390_write8(CtrlReg1, bval);   /* re-enable interrupt */
2156
2157         spin_unlock_irq(cmd->device->host->host_lock);
2158
2159         return SUCCESS;
2160 }
2161
2162 /**
2163  * dc390_slave_alloc - Called by the scsi mid layer to tell us about a new
2164  * scsi device that we need to deal with.
2165  *
2166  * @scsi_device: The new scsi device that we need to handle.
2167  */
2168 static int dc390_slave_alloc(struct scsi_device *scsi_device)
2169 {
2170         struct dc390_acb *pACB = (struct dc390_acb*) scsi_device->host->hostdata;
2171         struct dc390_dcb *pDCB, *pDCB2 = NULL;
2172         uint id = scsi_device->id;
2173         uint lun = scsi_device->lun;
2174
2175         pDCB = kmalloc(sizeof(struct dc390_dcb), GFP_KERNEL);
2176         if (!pDCB)
2177                 return -ENOMEM;
2178         memset(pDCB, 0, sizeof(struct dc390_dcb));
2179
2180         if (!pACB->DCBCnt++) {
2181                 pACB->pLinkDCB = pDCB;
2182                 pACB->pDCBRunRobin = pDCB;
2183         } else {
2184                 pACB->pLastDCB->pNextDCB = pDCB;
2185         }
2186    
2187         pDCB->pNextDCB = pACB->pLinkDCB;
2188         pACB->pLastDCB = pDCB;
2189
2190         pDCB->pDCBACB = pACB;
2191         pDCB->TargetID = id;
2192         pDCB->TargetLUN = lun;
2193
2194         /*
2195          * Some values are for all LUNs: Copy them 
2196          * In a clean way: We would have an own structure for a SCSI-ID 
2197          */
2198         if (lun && (pDCB2 = dc390_findDCB(pACB, id, 0))) {
2199                 pDCB->DevMode = pDCB2->DevMode;
2200                 pDCB->SyncMode = pDCB2->SyncMode & SYNC_NEGO_DONE;
2201                 pDCB->SyncPeriod = pDCB2->SyncPeriod;
2202                 pDCB->SyncOffset = pDCB2->SyncOffset;
2203                 pDCB->NegoPeriod = pDCB2->NegoPeriod;
2204       
2205                 pDCB->CtrlR3 = pDCB2->CtrlR3;
2206                 pDCB->CtrlR4 = pDCB2->CtrlR4;
2207         } else {
2208                 u8 index = pACB->AdapterIndex;
2209                 PEEprom prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
2210
2211                 pDCB->DevMode = prom->EE_MODE1;
2212                 pDCB->NegoPeriod =
2213                         (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
2214                 pDCB->CtrlR3 = FAST_CLK;
2215                 pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
2216                 if (dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
2217                         pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
2218         }
2219
2220         if (pDCB->DevMode & SYNC_NEGO_)
2221                 pDCB->SyncMode |= SYNC_ENABLE;
2222         else {
2223                 pDCB->SyncMode = 0;
2224                 pDCB->SyncOffset &= ~0x0f;
2225         }
2226
2227         pDCB->CtrlR1 = pACB->pScsiHost->this_id;
2228         if (pDCB->DevMode & PARITY_CHK_)
2229                 pDCB->CtrlR1 |= PARITY_ERR_REPO;
2230
2231         pACB->scan_devices = 1;
2232         scsi_device->hostdata = pDCB;
2233         return 0;
2234 }
2235
2236 /**
2237  * dc390_slave_destroy - Called by the scsi mid layer to tell us about a
2238  * device that is going away.
2239  *
2240  * @scsi_device: The scsi device that we need to remove.
2241  */
2242 static void dc390_slave_destroy(struct scsi_device *scsi_device)
2243 {
2244         struct dc390_acb* pACB = (struct dc390_acb*) scsi_device->host->hostdata;
2245         struct dc390_dcb* pDCB = (struct dc390_dcb*) scsi_device->hostdata;
2246         struct dc390_dcb* pPrevDCB = pACB->pLinkDCB;
2247
2248         pACB->scan_devices = 0;
2249
2250         BUG_ON(pDCB->GoingSRBCnt > 1);
2251         
2252         if (pDCB == pACB->pLinkDCB) {
2253                 if (pACB->pLastDCB == pDCB) {
2254                         pDCB->pNextDCB = NULL;
2255                         pACB->pLastDCB = NULL;
2256                 }
2257                 pACB->pLinkDCB = pDCB->pNextDCB;
2258         } else {
2259                 while (pPrevDCB->pNextDCB != pDCB)
2260                         pPrevDCB = pPrevDCB->pNextDCB;
2261                 pPrevDCB->pNextDCB = pDCB->pNextDCB;
2262                 if (pDCB == pACB->pLastDCB)
2263                         pACB->pLastDCB = pPrevDCB;
2264         }
2265
2266         if (pDCB == pACB->pActiveDCB)
2267                 pACB->pActiveDCB = NULL;
2268         if (pDCB == pACB->pLinkDCB)
2269                 pACB->pLinkDCB = pDCB->pNextDCB;
2270         if (pDCB == pACB->pDCBRunRobin)
2271                 pACB->pDCBRunRobin = pDCB->pNextDCB;
2272         kfree(pDCB); 
2273         
2274         pACB->DCBCnt--;
2275 }
2276
2277 static int dc390_slave_configure(struct scsi_device *sdev)
2278 {
2279         struct dc390_acb *acb = (struct dc390_acb *)sdev->host->hostdata;
2280         struct dc390_dcb *dcb = (struct dc390_dcb *)sdev->hostdata;
2281
2282         acb->scan_devices = 0;
2283         if (sdev->tagged_supported && (dcb->DevMode & TAG_QUEUEING_)) {
2284                 dcb->SyncMode |= EN_TAG_QUEUEING;
2285                 scsi_activate_tcq(sdev, acb->TagMaxNum);
2286         }
2287
2288         return 0;
2289 }
2290
2291 static struct scsi_host_template driver_template = {
2292         .module                 = THIS_MODULE,
2293         .proc_name              = "tmscsim", 
2294         .name                   = DC390_BANNER " V" DC390_VERSION,
2295         .slave_alloc            = dc390_slave_alloc,
2296         .slave_configure        = dc390_slave_configure,
2297         .slave_destroy          = dc390_slave_destroy,
2298         .queuecommand           = DC390_queuecommand,
2299         .eh_abort_handler       = DC390_abort,
2300         .eh_bus_reset_handler   = DC390_bus_reset,
2301         .can_queue              = 1,
2302         .this_id                = 7,
2303         .sg_tablesize           = SG_ALL,
2304         .cmd_per_lun            = 1,
2305         .use_clustering         = ENABLE_CLUSTERING,
2306         .max_sectors            = 0x4000, /* 8MiB = 16 * 1024 * 512 */
2307 };
2308
2309 /***********************************************************************
2310  * Functions for access to DC390 EEPROM
2311  * and some to emulate it
2312  *
2313  **********************************************************************/
2314
2315 static void __devinit dc390_eeprom_prepare_read(struct pci_dev *pdev, u8 cmd)
2316 {
2317         u8 carryFlag = 1, j = 0x80, bval;
2318         int i;
2319
2320         for (i = 0; i < 9; i++) {
2321                 if (carryFlag) {
2322                         pci_write_config_byte(pdev, 0x80, 0x40);
2323                         bval = 0xc0;
2324                 } else
2325                         bval = 0x80;
2326
2327                 udelay(160);
2328                 pci_write_config_byte(pdev, 0x80, bval);
2329                 udelay(160);
2330                 pci_write_config_byte(pdev, 0x80, 0);
2331                 udelay(160);
2332
2333                 carryFlag = (cmd & j) ? 1 : 0;
2334                 j >>= 1;
2335         }
2336 }
2337
2338 static u16 __devinit dc390_eeprom_get_data(struct pci_dev *pdev)
2339 {
2340         int i;
2341         u16 wval = 0;
2342         u8 bval;
2343
2344         for (i = 0; i < 16; i++) {
2345                 wval <<= 1;
2346
2347                 pci_write_config_byte(pdev, 0x80, 0x80);
2348                 udelay(160);
2349                 pci_write_config_byte(pdev, 0x80, 0x40);
2350                 udelay(160);
2351                 pci_read_config_byte(pdev, 0x00, &bval);
2352
2353                 if (bval == 0x22)
2354                         wval |= 1;
2355         }
2356
2357         return wval;
2358 }
2359
2360 static void __devinit dc390_read_eeprom(struct pci_dev *pdev, u16 *ptr)
2361 {
2362         u8 cmd = EEPROM_READ, i;
2363
2364         for (i = 0; i < 0x40; i++) {
2365                 pci_write_config_byte(pdev, 0xc0, 0);
2366                 udelay(160);
2367
2368                 dc390_eeprom_prepare_read(pdev, cmd++);
2369                 *ptr++ = dc390_eeprom_get_data(pdev);
2370
2371                 pci_write_config_byte(pdev, 0x80, 0);
2372                 pci_write_config_byte(pdev, 0x80, 0);
2373                 udelay(160);
2374         }
2375 }
2376
2377 /* Override EEprom values with explicitly set values */
2378 static void __devinit dc390_eeprom_override(u8 index)
2379 {
2380         u8 *ptr = (u8 *) dc390_eepromBuf[index], id;
2381
2382         /* Adapter Settings */
2383         if (tmscsim[0] != -2)
2384                 ptr[EE_ADAPT_SCSI_ID] = (u8)tmscsim[0]; /* Adapter ID */
2385         if (tmscsim[3] != -2)
2386                 ptr[EE_MODE2] = (u8)tmscsim[3];
2387         if (tmscsim[5] != -2)
2388                 ptr[EE_DELAY] = tmscsim[5];             /* Reset delay */
2389         if (tmscsim[4] != -2)
2390                 ptr[EE_TAG_CMD_NUM] = (u8)tmscsim[4];   /* Tagged Cmds */
2391
2392         /* Device Settings */
2393         for (id = 0; id < MAX_SCSI_ID; id++) {
2394                 if (tmscsim[2] != -2)
2395                         ptr[id << 2] = (u8)tmscsim[2];          /* EE_MODE1 */
2396                 if (tmscsim[1] != -2)
2397                         ptr[(id << 2) + 1] = (u8)tmscsim[1];    /* EE_Speed */
2398         }
2399 }
2400
2401 static int __devinitdata tmscsim_def[] = {
2402         7,
2403         0 /* 10MHz */,
2404         PARITY_CHK_ | SEND_START_ | EN_DISCONNECT_ | SYNC_NEGO_ | TAG_QUEUEING_,
2405         MORE2_DRV | GREATER_1G | RST_SCSI_BUS | ACTIVE_NEGATION | LUN_CHECK,
2406         3 /* 16 Tags per LUN */,
2407         1 /* s delay after Reset */,
2408 };
2409
2410 /* Copy defaults over set values where missing */
2411 static void __devinit dc390_fill_with_defaults (void)
2412 {
2413         int i;
2414
2415         for (i = 0; i < 6; i++) {
2416                 if (tmscsim[i] < 0 || tmscsim[i] > 255)
2417                         tmscsim[i] = tmscsim_def[i];
2418         }
2419
2420         /* Sanity checks */
2421         if (tmscsim[0] > 7)
2422                 tmscsim[0] = 7;
2423         if (tmscsim[1] > 7)
2424                 tmscsim[1] = 4;
2425         if (tmscsim[4] > 5)
2426                 tmscsim[4] = 4;
2427         if (tmscsim[5] > 180)
2428                 tmscsim[5] = 180;
2429 }
2430
2431 static void __devinit dc390_check_eeprom(struct pci_dev *pdev, u8 index)
2432 {
2433         u8 interpd[] = {1, 3, 5, 10, 16, 30, 60, 120};
2434         u8 EEbuf[128];
2435         u16 *ptr = (u16 *)EEbuf, wval = 0;
2436         int i;
2437
2438         dc390_read_eeprom(pdev, ptr);
2439         memcpy(dc390_eepromBuf[index], EEbuf, EE_ADAPT_SCSI_ID);
2440         memcpy(&dc390_eepromBuf[index][EE_ADAPT_SCSI_ID], 
2441                &EEbuf[REAL_EE_ADAPT_SCSI_ID], EE_LEN - EE_ADAPT_SCSI_ID);
2442
2443         dc390_eepromBuf[index][EE_DELAY] = interpd[dc390_eepromBuf[index][EE_DELAY]];
2444
2445         for (i = 0; i < 0x40; i++, ptr++)
2446                 wval += *ptr;
2447
2448         /* no Tekram EEprom found */
2449         if (wval != 0x1234) {
2450                 int speed;
2451
2452                 printk(KERN_INFO "DC390_init: No EEPROM found! Trying default settings ...\n");
2453
2454                 /*
2455                  * XXX(hch): bogus, because we might have tekram and
2456                  *           non-tekram hbas in a single machine.
2457                  */
2458                 dc390_fill_with_defaults();
2459
2460                 speed = dc390_clock_speed[tmscsim[1]];
2461                 printk(KERN_INFO "DC390: Used defaults: AdaptID=%i, SpeedIdx=%i (%i.%i MHz), "
2462                        "DevMode=0x%02x, AdaptMode=0x%02x, TaggedCmnds=%i (%i), DelayReset=%is\n", 
2463                        tmscsim[0], tmscsim[1], speed / 10, speed % 10,
2464                        (u8)tmscsim[2], (u8)tmscsim[3], tmscsim[4], 2 << (tmscsim[4]), tmscsim[5]);
2465         }
2466 }
2467
2468 static void __devinit dc390_init_hw(struct dc390_acb *pACB, u8 index)
2469 {
2470         struct Scsi_Host *shost = pACB->pScsiHost;
2471         u8 dstate;
2472
2473         /* Disable SCSI bus reset interrupt */
2474         DC390_write8(CtrlReg1, DIS_INT_ON_SCSI_RST | shost->this_id);
2475
2476         if (pACB->Gmode2 & RST_SCSI_BUS) {
2477                 dc390_ResetSCSIBus(pACB);
2478                 udelay(1000);
2479                 shost->last_reset = jiffies + HZ/2 +
2480                         HZ * dc390_eepromBuf[pACB->AdapterIndex][EE_DELAY];
2481         }
2482
2483         pACB->ACBFlag = 0;
2484
2485         /* Reset Pending INT */
2486         DC390_read8(INT_Status);
2487         
2488         /* 250ms selection timeout */
2489         DC390_write8(Scsi_TimeOut, SEL_TIMEOUT);
2490         
2491         /* Conversion factor = 0 , 40MHz clock */
2492         DC390_write8(Clk_Factor, CLK_FREQ_40MHZ);
2493         
2494         /* NOP cmd - clear command register */
2495         DC390_write8(ScsiCmd, NOP_CMD);
2496         
2497         /* Enable Feature and SCSI-2 */
2498         DC390_write8(CtrlReg2, EN_FEATURE+EN_SCSI2_CMD);
2499         
2500         /* Fast clock */
2501         DC390_write8(CtrlReg3, FAST_CLK);
2502
2503         /* Negation */
2504         DC390_write8(CtrlReg4, pACB->glitch_cfg | /* glitch eater */
2505                 (dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION) ?
2506                  NEGATE_REQACKDATA : 0);
2507         
2508         /* Clear Transfer Count High: ID */
2509         DC390_write8(CtcReg_High, 0);
2510         DC390_write8(DMA_Cmd, DMA_IDLE_CMD);
2511         DC390_write8(ScsiCmd, CLEAR_FIFO_CMD);
2512         DC390_write32(DMA_ScsiBusCtrl, EN_INT_ON_PCI_ABORT);
2513
2514         dstate = DC390_read8(DMA_Status);
2515         DC390_write8(DMA_Status, dstate);
2516 }
2517
2518 static int __devinit dc390_probe_one(struct pci_dev *pdev,
2519                                     const struct pci_device_id *id)
2520 {
2521         struct dc390_acb *pACB;
2522         struct Scsi_Host *shost;
2523         unsigned long io_port;
2524         int error = -ENODEV, i;
2525
2526         if (pci_enable_device(pdev))
2527                 goto out;
2528
2529         pci_set_master(pdev);
2530
2531         error = -ENOMEM;
2532         if (disable_clustering)
2533                 driver_template.use_clustering = DISABLE_CLUSTERING;
2534         shost = scsi_host_alloc(&driver_template, sizeof(struct dc390_acb));
2535         if (!shost)
2536                 goto out_disable_device;
2537
2538         pACB = (struct dc390_acb *)shost->hostdata;
2539         memset(pACB, 0, sizeof(struct dc390_acb));
2540
2541         dc390_check_eeprom(pdev, dc390_adapterCnt);
2542         dc390_eeprom_override(dc390_adapterCnt);
2543
2544         io_port = pci_resource_start(pdev, 0);
2545
2546         shost->this_id = dc390_eepromBuf[dc390_adapterCnt][EE_ADAPT_SCSI_ID];
2547         shost->io_port = io_port;
2548         shost->n_io_port = 0x80;
2549         shost->irq = pdev->irq;
2550         shost->base = io_port;
2551         shost->unique_id = io_port;
2552         shost->last_reset = jiffies;
2553         
2554         pACB->pScsiHost = shost;
2555         pACB->IOPortBase = (u16) io_port;
2556         pACB->IRQLevel = pdev->irq;
2557         
2558         shost->max_id = 8;
2559
2560         if (shost->max_id - 1 ==
2561             dc390_eepromBuf[dc390_adapterCnt][EE_ADAPT_SCSI_ID])
2562                 shost->max_id--;
2563
2564         if (dc390_eepromBuf[dc390_adapterCnt][EE_MODE2] & LUN_CHECK)
2565                 shost->max_lun = 8;
2566         else
2567                 shost->max_lun = 1;
2568
2569         pACB->pFreeSRB = pACB->SRB_array;
2570         pACB->SRBCount = MAX_SRB_CNT;
2571         pACB->AdapterIndex = dc390_adapterCnt;
2572         pACB->TagMaxNum =
2573                 2 << dc390_eepromBuf[dc390_adapterCnt][EE_TAG_CMD_NUM];
2574         pACB->Gmode2 = dc390_eepromBuf[dc390_adapterCnt][EE_MODE2];
2575
2576         for (i = 0; i < pACB->SRBCount-1; i++)
2577                 pACB->SRB_array[i].pNextSRB = &pACB->SRB_array[i+1];
2578         pACB->SRB_array[pACB->SRBCount-1].pNextSRB = NULL;
2579         pACB->pTmpSRB = &pACB->TmpSRB;
2580
2581         pACB->sel_timeout = SEL_TIMEOUT;
2582         pACB->glitch_cfg = EATER_25NS;
2583         pACB->pdev = pdev;
2584
2585         if (!request_region(io_port, shost->n_io_port, "tmscsim")) {
2586                 printk(KERN_ERR "DC390: register IO ports error!\n");
2587                 goto out_host_put;
2588         }
2589
2590         /* Reset Pending INT */
2591         DC390_read8_(INT_Status, io_port);
2592
2593         if (request_irq(pdev->irq, do_DC390_Interrupt, IRQF_SHARED,
2594                                 "tmscsim", pACB)) {
2595                 printk(KERN_ERR "DC390: register IRQ error!\n");
2596                 goto out_release_region;
2597         }
2598
2599         dc390_init_hw(pACB, dc390_adapterCnt);
2600         
2601         dc390_adapterCnt++;
2602
2603         pci_set_drvdata(pdev, shost);
2604
2605         error = scsi_add_host(shost, &pdev->dev);
2606         if (error)
2607                 goto out_free_irq;
2608         scsi_scan_host(shost);
2609         return 0;
2610
2611  out_free_irq:
2612         free_irq(pdev->irq, pACB);
2613  out_release_region:
2614         release_region(io_port, shost->n_io_port);
2615  out_host_put:
2616         scsi_host_put(shost);
2617  out_disable_device:
2618         pci_disable_device(pdev);
2619  out:
2620         return error;
2621 }
2622
2623 /**
2624  * dc390_remove_one - Called to remove a single instance of the adapter.
2625  *
2626  * @dev: The PCI device to remove.
2627  */
2628 static void __devexit dc390_remove_one(struct pci_dev *dev)
2629 {
2630         struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
2631         unsigned long iflags;
2632         struct dc390_acb* pACB = (struct dc390_acb*) scsi_host->hostdata;
2633         u8 bval;
2634
2635         scsi_remove_host(scsi_host);
2636
2637         spin_lock_irqsave(scsi_host->host_lock, iflags);
2638         pACB->ACBFlag = RESET_DEV;
2639         bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
2640         DC390_write8 (CtrlReg1, bval);  /* disable interrupt */
2641         if (pACB->Gmode2 & RST_SCSI_BUS)
2642                 dc390_ResetSCSIBus(pACB);
2643         spin_unlock_irqrestore(scsi_host->host_lock, iflags);
2644
2645         free_irq(scsi_host->irq, pACB);
2646         release_region(scsi_host->io_port, scsi_host->n_io_port);
2647
2648         pci_disable_device(dev);
2649         scsi_host_put(scsi_host);
2650         pci_set_drvdata(dev, NULL);
2651 }
2652
2653 static struct pci_device_id tmscsim_pci_tbl[] = {
2654         { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD53C974,
2655                 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
2656         { }
2657 };
2658 MODULE_DEVICE_TABLE(pci, tmscsim_pci_tbl);
2659
2660 static struct pci_driver dc390_driver = {
2661         .name           = "tmscsim",
2662         .id_table       = tmscsim_pci_tbl,
2663         .probe          = dc390_probe_one,
2664         .remove         = __devexit_p(dc390_remove_one),
2665 };
2666
2667 static int __init dc390_module_init(void)
2668 {
2669         if (!disable_clustering)
2670                 printk(KERN_INFO "DC390: clustering now enabled by default. If you get problems load\n"
2671                        "\twith \"disable_clustering=1\" and report to maintainers\n");
2672
2673         if (tmscsim[0] == -1 || tmscsim[0] > 15) {
2674                 tmscsim[0] = 7;
2675                 tmscsim[1] = 4;
2676                 tmscsim[2] = PARITY_CHK_ | TAG_QUEUEING_;
2677                 tmscsim[3] = MORE2_DRV | GREATER_1G | RST_SCSI_BUS | ACTIVE_NEGATION;
2678                 tmscsim[4] = 2;
2679                 tmscsim[5] = 10;
2680                 printk (KERN_INFO "DC390: Using safe settings.\n");
2681         }
2682
2683         return pci_register_driver(&dc390_driver);
2684 }
2685
2686 static void __exit dc390_module_exit(void)
2687 {
2688         pci_unregister_driver(&dc390_driver);
2689 }
2690
2691 module_init(dc390_module_init);
2692 module_exit(dc390_module_exit);
2693
2694 #ifndef MODULE
2695 static int __init dc390_setup (char *str)
2696 {       
2697         int ints[8],i, im;
2698
2699         get_options(str, ARRAY_SIZE(ints), ints);
2700         im = ints[0];
2701
2702         if (im > 6) {
2703                 printk (KERN_NOTICE "DC390: ignore extra params!\n");
2704                 im = 6;
2705         }
2706
2707         for (i = 0; i < im; i++)
2708                 tmscsim[i] = ints[i+1];
2709         /* dc390_checkparams (); */
2710         return 1;
2711 }
2712
2713 __setup("tmscsim=", dc390_setup);
2714 #endif