OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [rc203soc/] [sw/] [uClinux/] [drivers/] [scsi/] [u14-34f.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1626 jcastillo
/*
2
 *      u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
3
 *
4
 *      26 Jul 1998 Rev. 4.33 for linux 2.0.35 and 2.1.111
5
 *          Added command line option (et:[y|n]) to use the existing
6
 *          translation (returned by scsicam_bios_param) as disk geometry.
7
 *          The default is et:n, which uses the disk geometry jumpered
8
 *          on the board.
9
 *          The default value et:n is compatible with all previous revisions
10
 *          of this driver.
11
 *
12
 *      28 May 1998 Rev. 4.32 for linux 2.0.33 and 2.1.104
13
 *          Increased busy timeout from 10 msec. to 200 msec. while
14
 *          processing interrupts.
15
 *
16
 *      18 May 1998 Rev. 4.31 for linux 2.0.33 and 2.1.102
17
 *          Improved abort handling during the eh recovery process.
18
 *
19
 *      13 May 1998 Rev. 4.30 for linux 2.0.33 and 2.1.101
20
 *          The driver is now fully SMP safe, including the
21
 *          abort and reset routines.
22
 *          Added command line options (eh:[y|n]) to choose between
23
 *          new_eh_code and the old scsi code.
24
 *          If linux version >= 2.1.101 the default is eh:y, while the eh
25
 *          option is ignored for previous releases and the old scsi code
26
 *          is used.
27
 *
28
 *      18 Apr 1998 Rev. 4.20 for linux 2.0.33 and 2.1.97
29
 *          Reworked interrupt handler.
30
 *
31
 *      11 Apr 1998 rev. 4.05 for linux 2.0.33 and 2.1.95
32
 *          Major reliability improvement: when a batch with overlapping
33
 *          requests is detected, requests are queued one at a time
34
 *          eliminating any possible board or drive reordering.
35
 *
36
 *      10 Apr 1998 rev. 4.04 for linux 2.0.33 and 2.1.95
37
 *          Improved SMP support (if linux version >= 2.1.95).
38
 *
39
 *       9 Apr 1998 rev. 4.03 for linux 2.0.33 and 2.1.94
40
 *          Performance improvement: when sequential i/o is detected,
41
 *          always use direct sort instead of reverse sort.
42
 *
43
 *       4 Apr 1998 rev. 4.02 for linux 2.0.33 and 2.1.92
44
 *          io_port is now unsigned long.
45
 *
46
 *      17 Mar 1998 rev. 4.01 for linux 2.0.33 and 2.1.88
47
 *          Use new scsi error handling code (if linux version >= 2.1.88).
48
 *          Use new interrupt code.
49
 *
50
 *      12 Sep 1997 rev. 3.11 for linux 2.0.30 and 2.1.55
51
 *          Use of udelay inside the wait loops to avoid timeout
52
 *          problems with fast cpus.
53
 *          Removed check about useless calls to the interrupt service
54
 *          routine (reported on SMP systems only).
55
 *          At initialization time "sorted/unsorted" is displayed instead
56
 *          of "linked/unlinked" to reinforce the fact that "linking" is
57
 *          nothing but "elevator sorting" in the actual implementation.
58
 *
59
 *      17 May 1997 rev. 3.10 for linux 2.0.30 and 2.1.38
60
 *          Use of serial_number_at_timeout in abort and reset processing.
61
 *          Use of the __initfunc and __initdata macro in setup code.
62
 *          Minor cleanups in the list_statistics code.
63
 *
64
 *      24 Feb 1997 rev. 3.00 for linux 2.0.29 and 2.1.26
65
 *          When loading as a module, parameter passing is now supported
66
 *          both in 2.0 and in 2.1 style.
67
 *          Fixed data transfer direction for some SCSI opcodes.
68
 *          Immediate acknowledge to request sense commands.
69
 *          Linked commands to each disk device are now reordered by elevator
70
 *          sorting. Rare cases in which reordering of write requests could
71
 *          cause wrong results are managed.
72
 *
73
 *      18 Jan 1997 rev. 2.60 for linux 2.1.21 and 2.0.28
74
 *          Added command line options to enable/disable linked commands
75
 *          (lc:[y|n]), old firmware support (of:[y|n]) and to set the max
76
 *          queue depth (mq:xx). Default is "u14-34f=lc:n,of:n,mq:8".
77
 *          Improved command linking.
78
 *
79
 *       8 Jan 1997 rev. 2.50 for linux 2.1.20 and 2.0.27
80
 *          Added linked command support.
81
 *
82
 *       3 Dec 1996 rev. 2.40 for linux 2.1.14 and 2.0.27
83
 *          Added queue depth adjustment.
84
 *
85
 *      22 Nov 1996 rev. 2.30 for linux 2.1.12 and 2.0.26
86
 *          The list of i/o ports to be probed can be overwritten by the
87
 *          "u14-34f=port0,port1,...." boot command line option.
88
 *          Scatter/gather lists are now allocated by a number of kmalloc
89
 *          calls, in order to avoid the previous size limit of 64Kb.
90
 *
91
 *      16 Nov 1996 rev. 2.20 for linux 2.1.10 and 2.0.25
92
 *          Added multichannel support.
93
 *
94
 *      27 Sep 1996 rev. 2.12 for linux 2.1.0
95
 *          Portability cleanups (virtual/bus addressing, little/big endian
96
 *          support).
97
 *
98
 *      09 Jul 1996 rev. 2.11 for linux 2.0.4
99
 *          "Data over/under-run" no longer implies a redo on all targets.
100
 *          Number of internal retries is now limited.
101
 *
102
 *      16 Apr 1996 rev. 2.10 for linux 1.3.90
103
 *          New argument "reset_flags" to the reset routine.
104
 *
105
 *      21 Jul 1995 rev. 2.02 for linux 1.3.11
106
 *          Fixed Data Transfer Direction for some SCSI commands.
107
 *
108
 *      13 Jun 1995 rev. 2.01 for linux 1.2.10
109
 *          HAVE_OLD_UX4F_FIRMWARE should be defined for U34F boards when
110
 *          the firmware prom is not the latest one (28008-006).
111
 *
112
 *      11 Mar 1995 rev. 2.00 for linux 1.2.0
113
 *          Fixed a bug which prevented media change detection for removable
114
 *          disk drives.
115
 *
116
 *      23 Feb 1995 rev. 1.18 for linux 1.1.94
117
 *          Added a check for scsi_register returning NULL.
118
 *
119
 *      11 Feb 1995 rev. 1.17 for linux 1.1.91
120
 *          U14F qualified to run with 32 sglists.
121
 *          Now DEBUG_RESET is disabled by default.
122
 *
123
 *       9 Feb 1995 rev. 1.16 for linux 1.1.90
124
 *          Use host->wish_block instead of host->block.
125
 *
126
 *       8 Feb 1995 rev. 1.15 for linux 1.1.89
127
 *          Cleared target_time_out counter while performing a reset.
128
 *
129
 *      28 Jan 1995 rev. 1.14 for linux 1.1.86
130
 *          Added module support.
131
 *          Log and do a retry when a disk drive returns a target status
132
 *          different from zero on a recovered error.
133
 *          Auto detects if U14F boards have an old firmware revision.
134
 *          Max number of scatter/gather lists set to 16 for all boards
135
 *          (most installation run fine using 33 sglists, while other
136
 *          has problems when using more then 16).
137
 *
138
 *      16 Jan 1995 rev. 1.13 for linux 1.1.81
139
 *          Display a message if check_region detects a port address
140
 *          already in use.
141
 *
142
 *      15 Dec 1994 rev. 1.12 for linux 1.1.74
143
 *          The host->block flag is set for all the detected ISA boards.
144
 *
145
 *      30 Nov 1994 rev. 1.11 for linux 1.1.68
146
 *          Redo i/o on target status CHECK_CONDITION for TYPE_DISK only.
147
 *          Added optional support for using a single board at a time.
148
 *
149
 *      14 Nov 1994 rev. 1.10 for linux 1.1.63
150
 *
151
 *      28 Oct 1994 rev. 1.09 for linux 1.1.58  Final BETA release.
152
 *      16 Jul 1994 rev. 1.00 for linux 1.1.29  Initial ALPHA release.
153
 *
154
 *          This driver is a total replacement of the original UltraStor
155
 *          scsi driver, but it supports ONLY the 14F and 34F boards.
156
 *          It can be configured in the same kernel in which the original
157
 *          ultrastor driver is configured to allow the original U24F
158
 *          support.
159
 *
160
 *          Multiple U14F and/or U34F host adapters are supported.
161
 *
162
 *  Copyright (C) 1994-1998 Dario Ballabio (dario@milano.europe.dg.com)
163
 *
164
 *  Redistribution and use in source and binary forms, with or without
165
 *  modification, are permitted provided that redistributions of source
166
 *  code retain the above copyright notice and this comment without
167
 *  modification.
168
 *
169
 *      WARNING: if your 14/34F board has an old firmware revision (see below)
170
 *               you must change "#undef" into "#define" in the following
171
 *               statement.
172
 */
173
#undef HAVE_OLD_UX4F_FIRMWARE
174
/*
175
 *  The UltraStor 14F, 24F, and 34F are a family of intelligent, high
176
 *  performance SCSI-2 host adapters.
177
 *  Here is the scoop on the various models:
178
 *
179
 *  14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
180
 *  24F - EISA Bus Master HA with floppy support and WD1003 emulation.
181
 *  34F - VESA Local-Bus Bus Master HA (no WD1003 emulation).
182
 *
183
 *  This code has been tested with up to two U14F boards, using both
184
 *  firmware 28004-005/38004-004 (BIOS rev. 2.00) and the latest firmware
185
 *  28004-006/38004-005 (BIOS rev. 2.01).
186
 *
187
 *  The latest firmware is required in order to get reliable operations when
188
 *  clustering is enabled. ENABLE_CLUSTERING provides a performance increase
189
 *  up to 50% on sequential access.
190
 *
191
 *  Since the Scsi_Host_Template structure is shared among all 14F and 34F,
192
 *  the last setting of use_clustering is in effect for all of these boards.
193
 *
194
 *  Here a sample configuration using two U14F boards:
195
 *
196
 U14F0: ISA 0x330, BIOS 0xc8000, IRQ 11, DMA 5, SG 32, MB 16, of:n, lc:y, mq:8.
197
 U14F1: ISA 0x340, BIOS 0x00000, IRQ 10, DMA 6, SG 32, MB 16, of:n, lc:y, mq:8.
198
 *
199
 *  The boot controller must have its BIOS enabled, while other boards can
200
 *  have their BIOS disabled, or enabled to an higher address.
201
 *  Boards are named Ux4F0, Ux4F1..., according to the port address order in
202
 *  the io_port[] array.
203
 *
204
 *  The following facts are based on real testing results (not on
205
 *  documentation) on the above U14F board.
206
 *
207
 *  - The U14F board should be jumpered for bus on time less or equal to 7
208
 *    microseconds, while the default is 11 microseconds. This is order to
209
 *    get acceptable performance while using floppy drive and hard disk
210
 *    together. The jumpering for 7 microseconds is: JP13 pin 15-16,
211
 *    JP14 pin 7-8 and pin 9-10.
212
 *    The reduction has a little impact on scsi performance.
213
 *
214
 *  - If scsi bus length exceeds 3m., the scsi bus speed needs to be reduced
215
 *    from 10Mhz to 5Mhz (do this by inserting a jumper on JP13 pin 7-8).
216
 *
217
 *  - If U14F on board firmware is older than 28004-006/38004-005,
218
 *    the U14F board is unable to provide reliable operations if the scsi
219
 *    request length exceeds 16Kbyte. When this length is exceeded the
220
 *    behavior is:
221
 *    - adapter_status equal 0x96 or 0xa3 or 0x93 or 0x94;
222
 *    - adapter_status equal 0 and target_status equal 2 on for all targets
223
 *      in the next operation following the reset.
224
 *    This sequence takes a long time (>3 seconds), so in the meantime
225
 *    the SD_TIMEOUT in sd.c could expire giving rise to scsi aborts
226
 *    (SD_TIMEOUT has been increased from 3 to 6 seconds in 1.1.31).
227
 *    Because of this I had to DISABLE_CLUSTERING and to work around the
228
 *    bus reset in the interrupt service routine, returning DID_BUS_BUSY
229
 *    so that the operations are retried without complains from the scsi.c
230
 *    code.
231
 *    Any reset of the scsi bus is going to kill tape operations, since
232
 *    no retry is allowed for tapes. Bus resets are more likely when the
233
 *    scsi bus is under heavy load.
234
 *    Requests using scatter/gather have a maximum length of 16 x 1024 bytes
235
 *    when DISABLE_CLUSTERING is in effect, but unscattered requests could be
236
 *    larger than 16Kbyte.
237
 *
238
 *    The new firmware has fixed all the above problems.
239
 *
240
 *  For U34F boards the latest bios prom is 38008-002 (BIOS rev. 2.01),
241
 *  the latest firmware prom is 28008-006. Older firmware 28008-005 has
242
 *  problems when using more then 16 scatter/gather lists.
243
 *
244
 *  The list of i/o ports to be probed can be totally replaced by the
245
 *  boot command line option: "u14-34f=port0,port1,port2,...", where the
246
 *  port0, port1... arguments are ISA/VESA addresses to be probed.
247
 *  For example using "u14-34f=0x230,0x340", the driver probes only the two
248
 *  addresses 0x230 and 0x340 in this order; "u14-34f=0" totally disables
249
 *  this driver.
250
 *
251
 *  After the optional list of detection probes, other possible command line
252
 *  options are:
253
 *
254
 *  eh:y  use new scsi code (linux 2.2 only);
255
 *  eh:n  use old scsi code;
256
 *  et:y  use disk geometry returned by scsicam_bios_param;
257
 *  et:n  use disk geometry jumpered on the board;
258
 *  lc:y  enables linked commands;
259
 *  lc:n  disables linked commands;
260
 *  of:y  enables old firmware support;
261
 *  of:n  disables old firmware support;
262
 *  mq:xx set the max queue depth to the value xx (2 <= xx <= 8).
263
 *
264
 *  The default value is: "u14-34f=lc:n,of:n,mq:8,et:n".
265
 *  An example using the list of detection probes could be:
266
 *  "u14-34f=0x230,0x340,lc:y,of:n,mq:4,eh:n,et:n".
267
 *
268
 *  When loading as a module, parameters can be specified as well.
269
 *  The above example would be (use 1 in place of y and 0 in place of n):
270
 *
271
 *  modprobe u14-34f io_port=0x230,0x340 linked_comm=1 have_old_firmware=0 \
272
 *                max_queue_depth=4 use_new_eh_code=0 ext_tran=0
273
 *
274
 *  ----------------------------------------------------------------------------
275
 *  In this implementation, linked commands are designed to work with any DISK
276
 *  or CD-ROM, since this linking has only the intent of clustering (time-wise)
277
 *  and reordering by elevator sorting commands directed to each device,
278
 *  without any relation with the actual SCSI protocol between the controller
279
 *  and the device.
280
 *  If Q is the queue depth reported at boot time for each device (also named
281
 *  cmds/lun) and Q > 2, whenever there is already an active command to the
282
 *  device all other commands to the same device  (up to Q-1) are kept waiting
283
 *  in the elevator sorting queue. When the active command completes, the
284
 *  commands in this queue are sorted by sector address. The sort is chosen
285
 *  between increasing or decreasing by minimizing the seek distance between
286
 *  the sector of the commands just completed and the sector of the first
287
 *  command in the list to be sorted.
288
 *  Trivial math assures that the unsorted average seek distance when doing
289
 *  random seeks over S sectors is S/3.
290
 *  When (Q-1) requests are uniformly distributed over S sectors, the average
291
 *  distance between two adjacent requests is S/((Q-1) + 1), so the sorted
292
 *  average seek distance for (Q-1) random requests over S sectors is S/Q.
293
 *  The elevator sorting hence divides the seek distance by a factor Q/3.
294
 *  The above pure geometric remarks are valid in all cases and the
295
 *  driver effectively reduces the seek distance by the predicted factor
296
 *  when there are Q concurrent read i/o operations on the device, but this
297
 *  does not necessarily results in a noticeable performance improvement:
298
 *  your mileage may vary....
299
 *
300
 *  Note: command reordering inside a batch of queued commands could cause
301
 *        wrong results only if there is at least one write request and the
302
 *        intersection (sector-wise) of all requests is not empty.
303
 *        When the driver detects a batch including overlapping requests
304
 *        (a really rare event) strict serial (pid) order is enforced.
305
 *  ----------------------------------------------------------------------------
306
 *
307
 *  The boards are named Ux4F0, Ux4F1,... according to the detection order.
308
 *
309
 *  In order to support multiple ISA boards in a reliable way,
310
 *  the driver sets host->wish_block = TRUE for all ISA boards.
311
 */
312
 
313
#include <linux/version.h>
314
 
315
#define LinuxVersionCode(v, p, s) (((v)<<16)+((p)<<8)+(s))
316
#define MAX_INT_PARAM 10
317
 
318
#if defined(MODULE)
319
#include <linux/module.h>
320
 
321
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,26)
322
MODULE_PARM(io_port, "1-" __MODULE_STRING(MAX_INT_PARAM) "i");
323
MODULE_PARM(linked_comm, "i");
324
MODULE_PARM(have_old_firmware, "i");
325
MODULE_PARM(link_statistics, "i");
326
MODULE_PARM(max_queue_depth, "i");
327
MODULE_PARM(use_new_eh_code, "i");
328
MODULE_PARM(ext_tran, "i");
329
MODULE_AUTHOR("Dario Ballabio");
330
#endif
331
 
332
#endif
333
 
334
#include <linux/string.h>
335
#include <linux/sched.h>
336
#include <linux/kernel.h>
337
#include <linux/ioport.h>
338
#include <linux/delay.h>
339
#include <asm/io.h>
340
#include <asm/system.h>
341
#include <asm/byteorder.h>
342
#include <linux/proc_fs.h>
343
#include <linux/blk.h>
344
#include "scsi.h"
345
#include "hosts.h"
346
#include "sd.h"
347
#include <asm/dma.h>
348
#include <asm/irq.h>
349
#include "u14-34f.h"
350
#include <linux/stat.h>
351
#include <linux/config.h>
352
 
353
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,36)
354
#include <linux/init.h>
355
#else
356
#define __initfunc(A) A
357
#define __initdata
358
#define __init
359
#endif
360
 
361
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
362
#include <asm/spinlock.h>
363
#define IRQ_FLAGS
364
#define IRQ_LOCK
365
#define IRQ_LOCK_SAVE
366
#define IRQ_UNLOCK
367
#define IRQ_UNLOCK_RESTORE
368
#define SPIN_FLAGS unsigned long spin_flags;
369
#define SPIN_LOCK spin_lock_irq(&io_request_lock);
370
#define SPIN_LOCK_SAVE spin_lock_irqsave(&io_request_lock, spin_flags);
371
#define SPIN_UNLOCK spin_unlock_irq(&io_request_lock);
372
#define SPIN_UNLOCK_RESTORE \
373
                  spin_unlock_irqrestore(&io_request_lock, spin_flags);
374
static int use_new_eh_code = TRUE;
375
#else
376
#define IRQ_FLAGS unsigned long irq_flags;
377
#define IRQ_LOCK cli();
378
#define IRQ_LOCK_SAVE do {save_flags(irq_flags); cli();} while (0);
379
#define IRQ_UNLOCK sti();
380
#define IRQ_UNLOCK_RESTORE do {restore_flags(irq_flags);} while (0);
381
#define SPIN_FLAGS
382
#define SPIN_LOCK
383
#define SPIN_LOCK_SAVE
384
#define SPIN_UNLOCK
385
#define SPIN_UNLOCK_RESTORE
386
static int use_new_eh_code = FALSE;
387
#endif
388
 
389
struct proc_dir_entry proc_scsi_u14_34f = {
390
    PROC_SCSI_U14_34F, 6, "u14_34f",
391
    S_IFDIR | S_IRUGO | S_IXUGO, 2
392
};
393
 
394
/* Values for the PRODUCT_ID ports for the 14/34F */
395
#define PRODUCT_ID1  0x56
396
#define PRODUCT_ID2  0x40        /* NOTE: Only upper nibble is used */
397
 
398
/* Subversion values */
399
#define ISA  0
400
#define ESA 1
401
 
402
#define OP_HOST_ADAPTER   0x1
403
#define OP_SCSI           0x2
404
#define OP_RESET          0x4
405
#define DTD_SCSI          0x0
406
#define DTD_IN            0x1
407
#define DTD_OUT           0x2
408
#define DTD_NONE          0x3
409
#define HA_CMD_INQUIRY    0x1
410
#define HA_CMD_SELF_DIAG  0x2
411
#define HA_CMD_READ_BUFF  0x3
412
#define HA_CMD_WRITE_BUFF 0x4
413
 
414
#undef  DEBUG_LINKED_COMMANDS
415
#undef  DEBUG_DETECT
416
#undef  DEBUG_INTERRUPT
417
#undef  DEBUG_RESET
418
#undef  DEBUG_GENERATE_ERRORS
419
#undef  DEBUG_GENERATE_ABORTS
420
#undef  DEBUG_GEOMETRY
421
 
422
#define MAX_ISA 3
423
#define MAX_VESA 1
424
#define MAX_EISA 0
425
#define MAX_PCI 0
426
#define MAX_BOARDS (MAX_ISA + MAX_VESA + MAX_EISA + MAX_PCI)
427
#define MAX_CHANNEL 1
428
#define MAX_LUN 8
429
#define MAX_TARGET 8
430
#define MAX_MAILBOXES 16
431
#define MAX_SGLIST 32
432
#define MAX_SAFE_SGLIST 16
433
#define MAX_INTERNAL_RETRIES 64
434
#define MAX_CMD_PER_LUN 2
435
#define MAX_TAGGED_CMD_PER_LUN (MAX_MAILBOXES - MAX_CMD_PER_LUN)
436
 
437
#define SKIP ULONG_MAX
438
#define FALSE 0
439
#define TRUE 1
440
#define FREE 0
441
#define IN_USE   1
442
#define LOCKED   2
443
#define IN_RESET 3
444
#define IGNORE   4
445
#define READY    5
446
#define ABORTING 6
447
#define NO_DMA  0xff
448
#define MAXLOOP  10000
449
 
450
#define REG_LCL_MASK      0
451
#define REG_LCL_INTR      1
452
#define REG_SYS_MASK      2
453
#define REG_SYS_INTR      3
454
#define REG_PRODUCT_ID1   4
455
#define REG_PRODUCT_ID2   5
456
#define REG_CONFIG1       6
457
#define REG_CONFIG2       7
458
#define REG_OGM           8
459
#define REG_ICM           12
460
#define REGION_SIZE       13
461
#define BSY_ASSERTED      0x01
462
#define IRQ_ASSERTED      0x01
463
#define CMD_RESET         0xc0
464
#define CMD_OGM_INTR      0x01
465
#define CMD_CLR_INTR      0x01
466
#define CMD_ENA_INTR      0x81
467
#define ASOK              0x00
468
#define ASST              0x91
469
 
470
#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr)[0])
471
#define YESNO(a) ((a) ? 'y' : 'n')
472
#define TLDEV(type) ((type) == TYPE_DISK || (type) == TYPE_ROM)
473
 
474
#define PACKED          __attribute__((packed))
475
 
476
struct sg_list {
477
   unsigned int address;                /* Segment Address */
478
   unsigned int num_bytes;              /* Segment Length */
479
   };
480
 
481
/* MailBox SCSI Command Packet */
482
struct mscp {
483
   unsigned char opcode: 3;             /* type of command */
484
   unsigned char xdir: 2;               /* data transfer direction */
485
   unsigned char dcn: 1;                /* disable disconnect */
486
   unsigned char ca: 1;                 /* use cache (if available) */
487
   unsigned char sg: 1;                 /* scatter/gather operation */
488
   unsigned char target: 3;             /* SCSI target id */
489
   unsigned char channel: 2;            /* SCSI channel number */
490
   unsigned char lun: 3;                /* SCSI logical unit number */
491
   unsigned int data_address PACKED;    /* transfer data pointer */
492
   unsigned int data_len PACKED;        /* length in bytes */
493
   unsigned int link_address PACKED;    /* for linking command chains */
494
   unsigned char clink_id;              /* identifies command in chain */
495
   unsigned char use_sg;                /* (if sg is set) 8 bytes per list */
496
   unsigned char sense_len;
497
   unsigned char scsi_cdbs_len;         /* 6, 10, or 12 */
498
   unsigned char scsi_cdbs[12];         /* SCSI commands */
499
   unsigned char adapter_status;        /* non-zero indicates HA error */
500
   unsigned char target_status;         /* non-zero indicates target error */
501
   unsigned int sense_addr PACKED;
502
   Scsi_Cmnd *SCpnt;
503
   unsigned int index;                  /* cp index */
504
   struct sg_list *sglist;
505
   };
506
 
507
struct hostdata {
508
   struct mscp cp[MAX_MAILBOXES];       /* Mailboxes for this board */
509
   unsigned int cp_stat[MAX_MAILBOXES]; /* FREE, IN_USE, LOCKED, IN_RESET */
510
   unsigned int last_cp_used;           /* Index of last mailbox used */
511
   unsigned int iocount;                /* Total i/o done for this board */
512
   int board_number;                    /* Number of this board */
513
   char board_name[16];                 /* Name of this board */
514
   char board_id[256];                  /* data from INQUIRY on this board */
515
   int in_reset;                        /* True if board is doing a reset */
516
   int target_to[MAX_TARGET][MAX_CHANNEL]; /* N. of timeout errors on target */
517
   int target_redo[MAX_TARGET][MAX_CHANNEL]; /* If TRUE redo i/o on target */
518
   unsigned int retries;                /* Number of internal retries */
519
   unsigned long last_retried_pid;      /* Pid of last retried command */
520
   unsigned char subversion;            /* Bus type, either ISA or ESA */
521
   unsigned char heads;
522
   unsigned char sectors;
523
 
524
   /* slot != 0 for the U24F, slot == 0 for both the U14F and U34F */
525
   unsigned char slot;
526
   };
527
 
528
static struct Scsi_Host *sh[MAX_BOARDS + 1];
529
static const char *driver_name = "Ux4F";
530
static char sha[MAX_BOARDS];
531
 
532
/* Initialize num_boards so that ihdlr can work while detect is in progress */
533
static unsigned int num_boards = MAX_BOARDS;
534
 
535
static unsigned long io_port[] __initdata = {
536
 
537
   /* Space for MAX_INT_PARAM ports usable while loading as a module */
538
   SKIP,    SKIP,   SKIP,   SKIP,   SKIP,   SKIP,   SKIP,   SKIP,
539
   SKIP,    SKIP,
540
 
541
   /* Possible ISA/VESA ports */
542
   0x330, 0x340, 0x230, 0x240, 0x210, 0x130, 0x140,
543
 
544
   /* End of list */
545
   0x0
546
   };
547
 
548
#define HD(board) ((struct hostdata *) &sh[board]->hostdata)
549
#define BN(board) (HD(board)->board_name)
550
 
551
#define SWAP_BYTE(x) ((unsigned long)( \
552
        (((unsigned long)(x) & 0x000000ffU) << 24) | \
553
        (((unsigned long)(x) & 0x0000ff00U) <<  8) | \
554
        (((unsigned long)(x) & 0x00ff0000U) >>  8) | \
555
        (((unsigned long)(x) & 0xff000000U) >> 24)))
556
 
557
#if defined(__BIG_ENDIAN)
558
#define H2DEV(x) SWAP_BYTE(x)
559
#else
560
#define H2DEV(x) (x)
561
#endif
562
 
563
#define DEV2H(x) H2DEV(x)
564
#define V2DEV(addr) ((addr) ? H2DEV(virt_to_bus((void *)addr)) : 0)
565
#define DEV2V(addr) ((addr) ? DEV2H(bus_to_virt((unsigned long)addr)) : 0)
566
 
567
static void do_interrupt_handler(int, void *, struct pt_regs *);
568
static void flush_dev(Scsi_Device *, unsigned long, unsigned int, unsigned int);
569
static int do_trace = FALSE;
570
static int setup_done = FALSE;
571
static int link_statistics = 0;
572
static int ext_tran = FALSE;
573
 
574
#if defined(HAVE_OLD_UX4F_FIRMWARE)
575
static int have_old_firmware = TRUE;
576
#else
577
static int have_old_firmware = FALSE;
578
#endif
579
 
580
#if defined(CONFIG_SCSI_U14_34F_LINKED_COMMANDS)
581
static int linked_comm = TRUE;
582
#else
583
static int linked_comm = FALSE;
584
#endif
585
 
586
#if defined(CONFIG_SCSI_U14_34F_MAX_TAGS)
587
static int max_queue_depth = CONFIG_SCSI_U14_34F_MAX_TAGS;
588
#else
589
static int max_queue_depth = MAX_CMD_PER_LUN;
590
#endif
591
 
592
static void select_queue_depths(struct Scsi_Host *host, Scsi_Device *devlist) {
593
   Scsi_Device *dev;
594
   int j, ntag = 0, nuntag = 0, tqd, utqd;
595
   IRQ_FLAGS
596
 
597
   IRQ_LOCK_SAVE
598
   j = ((struct hostdata *) host->hostdata)->board_number;
599
 
600
   for(dev = devlist; dev; dev = dev->next) {
601
 
602
      if (dev->host != host) continue;
603
 
604
      if (TLDEV(dev->type) && (dev->tagged_supported || linked_comm))
605
         ntag++;
606
      else
607
         nuntag++;
608
      }
609
 
610
   utqd = MAX_CMD_PER_LUN;
611
 
612
   tqd = (host->can_queue - utqd * nuntag) / (ntag ? ntag : 1);
613
 
614
   if (tqd > max_queue_depth) tqd = max_queue_depth;
615
 
616
   if (tqd < MAX_CMD_PER_LUN) tqd = MAX_CMD_PER_LUN;
617
 
618
   for(dev = devlist; dev; dev = dev->next) {
619
      char *tag_suffix = "", *link_suffix = "";
620
 
621
      if (dev->host != host) continue;
622
 
623
      if (TLDEV(dev->type) && (dev->tagged_supported || linked_comm))
624
         dev->queue_depth = tqd;
625
      else
626
         dev->queue_depth = utqd;
627
 
628
      if (TLDEV(dev->type)) {
629
         if (linked_comm && dev->queue_depth > 2)
630
            link_suffix = ", sorted";
631
         else
632
            link_suffix = ", unsorted";
633
         }
634
 
635
      if (dev->tagged_supported && TLDEV(dev->type) && dev->tagged_queue)
636
         tag_suffix = ", tagged";
637
      else if (dev->tagged_supported && TLDEV(dev->type))
638
         tag_suffix = ", untagged";
639
 
640
      printk("%s: scsi%d, channel %d, id %d, lun %d, cmds/lun %d%s%s.\n",
641
             BN(j), host->host_no, dev->channel, dev->id, dev->lun,
642
             dev->queue_depth, link_suffix, tag_suffix);
643
      }
644
 
645
   IRQ_UNLOCK_RESTORE
646
   return;
647
}
648
 
649
static inline int wait_on_busy(unsigned long iobase, unsigned int loop) {
650
 
651
   while (inb(iobase + REG_LCL_INTR) & BSY_ASSERTED) {
652
      udelay(1L);
653
      if (--loop == 0) return TRUE;
654
      }
655
 
656
   return FALSE;
657
}
658
 
659
static int board_inquiry(unsigned int j) {
660
   struct mscp *cpp;
661
   unsigned int time, limit = 0;
662
 
663
   cpp = &HD(j)->cp[0];
664
   memset(cpp, 0, sizeof(struct mscp));
665
   cpp->opcode = OP_HOST_ADAPTER;
666
   cpp->xdir = DTD_IN;
667
   cpp->data_address = V2DEV(HD(j)->board_id);
668
   cpp->data_len = H2DEV(sizeof(HD(j)->board_id));
669
   cpp->scsi_cdbs_len = 6;
670
   cpp->scsi_cdbs[0] = HA_CMD_INQUIRY;
671
 
672
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
673
      printk("%s: board_inquiry, adapter busy.\n", BN(j));
674
      return TRUE;
675
      }
676
 
677
   HD(j)->cp_stat[0] = IGNORE;
678
 
679
   /* Clear the interrupt indication */
680
   outb(CMD_CLR_INTR, sh[j]->io_port + REG_SYS_INTR);
681
 
682
   /* Store pointer in OGM address bytes */
683
   outl(V2DEV(cpp), sh[j]->io_port + REG_OGM);
684
 
685
   /* Issue OGM interrupt */
686
   outb(CMD_OGM_INTR, sh[j]->io_port + REG_LCL_INTR);
687
 
688
   SPIN_UNLOCK
689
   IRQ_UNLOCK
690
   time = jiffies;
691
   while ((jiffies - time) < HZ && limit++ < 20000) udelay(100L);
692
   IRQ_LOCK
693
   SPIN_LOCK
694
 
695
   if (cpp->adapter_status || HD(j)->cp_stat[0] != FREE) {
696
      HD(j)->cp_stat[0] = FREE;
697
      printk("%s: board_inquiry, err 0x%x.\n", BN(j), cpp->adapter_status);
698
      return TRUE;
699
      }
700
 
701
   return FALSE;
702
}
703
 
704
__initfunc (static inline int port_detect \
705
      (unsigned long port_base, unsigned int j, Scsi_Host_Template *tpnt)) {
706
   unsigned char irq, dma_channel, subversion, i;
707
   unsigned char in_byte;
708
   char *bus_type, dma_name[16];
709
 
710
   /* Allowed BIOS base addresses (NULL indicates reserved) */
711
   void *bios_segment_table[8] = {
712
      NULL,
713
      (void *) 0xc4000, (void *) 0xc8000, (void *) 0xcc000, (void *) 0xd0000,
714
      (void *) 0xd4000, (void *) 0xd8000, (void *) 0xdc000
715
      };
716
 
717
   /* Allowed IRQs */
718
   unsigned char interrupt_table[4] = { 15, 14, 11, 10 };
719
 
720
   /* Allowed DMA channels for ISA (0 indicates reserved) */
721
   unsigned char dma_channel_table[4] = { 5, 6, 7, 0 };
722
 
723
   /* Head/sector mappings */
724
   struct {
725
      unsigned char heads;
726
      unsigned char sectors;
727
      } mapping_table[4] = {
728
           { 16, 63 }, { 64, 32 }, { 64, 63 }, { 64, 32 }
729
           };
730
 
731
   struct config_1 {
732
      unsigned char bios_segment: 3;
733
      unsigned char removable_disks_as_fixed: 1;
734
      unsigned char interrupt: 2;
735
      unsigned char dma_channel: 2;
736
      } config_1;
737
 
738
   struct config_2 {
739
      unsigned char ha_scsi_id: 3;
740
      unsigned char mapping_mode: 2;
741
      unsigned char bios_drive_number: 1;
742
      unsigned char tfr_port: 2;
743
      } config_2;
744
 
745
   char name[16];
746
 
747
   sprintf(name, "%s%d", driver_name, j);
748
 
749
   if(check_region(port_base, REGION_SIZE)) {
750
      printk("%s: address 0x%03lx in use, skipping probe.\n", name, port_base);
751
      return FALSE;
752
      }
753
 
754
   if (inb(port_base + REG_PRODUCT_ID1) != PRODUCT_ID1) return FALSE;
755
 
756
   in_byte = inb(port_base + REG_PRODUCT_ID2);
757
 
758
   if ((in_byte & 0xf0) != PRODUCT_ID2) return FALSE;
759
 
760
   *(char *)&config_1 = inb(port_base + REG_CONFIG1);
761
   *(char *)&config_2 = inb(port_base + REG_CONFIG2);
762
 
763
   irq = interrupt_table[config_1.interrupt];
764
   dma_channel = dma_channel_table[config_1.dma_channel];
765
   subversion = (in_byte & 0x0f);
766
 
767
   /* Board detected, allocate its IRQ */
768
   if (request_irq(irq, do_interrupt_handler,
769
             SA_INTERRUPT | ((subversion == ESA) ? SA_SHIRQ : 0),
770
             driver_name, (void *) &sha[j])) {
771
      printk("%s: unable to allocate IRQ %u, detaching.\n", name, irq);
772
      return FALSE;
773
      }
774
 
775
   if (subversion == ISA && request_dma(dma_channel, driver_name)) {
776
      printk("%s: unable to allocate DMA channel %u, detaching.\n",
777
             name, dma_channel);
778
      free_irq(irq, &sha[j]);
779
      return FALSE;
780
      }
781
 
782
   if (have_old_firmware) tpnt->use_clustering = DISABLE_CLUSTERING;
783
 
784
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
785
   tpnt->use_new_eh_code = use_new_eh_code;
786
#else
787
   use_new_eh_code = FALSE;
788
#endif
789
 
790
   sh[j] = scsi_register(tpnt, sizeof(struct hostdata));
791
 
792
   if (sh[j] == NULL) {
793
      printk("%s: unable to register host, detaching.\n", name);
794
 
795
      free_irq(irq, &sha[j]);
796
 
797
      if (subversion == ISA) free_dma(dma_channel);
798
 
799
      return FALSE;
800
      }
801
 
802
   sh[j]->io_port = port_base;
803
   sh[j]->unique_id = port_base;
804
   sh[j]->n_io_port = REGION_SIZE;
805
   sh[j]->base = bios_segment_table[config_1.bios_segment];
806
   sh[j]->irq = irq;
807
   sh[j]->sg_tablesize = MAX_SGLIST;
808
   sh[j]->this_id = config_2.ha_scsi_id;
809
   sh[j]->can_queue = MAX_MAILBOXES;
810
   sh[j]->cmd_per_lun = MAX_CMD_PER_LUN;
811
   sh[j]->select_queue_depths = select_queue_depths;
812
 
813
#if defined(DEBUG_DETECT)
814
   {
815
   unsigned char sys_mask, lcl_mask;
816
 
817
   sys_mask = inb(sh[j]->io_port + REG_SYS_MASK);
818
   lcl_mask = inb(sh[j]->io_port + REG_LCL_MASK);
819
   printk("SYS_MASK 0x%x, LCL_MASK 0x%x.\n", sys_mask, lcl_mask);
820
   }
821
#endif
822
 
823
   /* Probably a bogus host scsi id, set it to the dummy value */
824
   if (sh[j]->this_id == 0) sh[j]->this_id = -1;
825
 
826
   /* If BIOS is disabled, force enable interrupts */
827
   if (sh[j]->base == 0) outb(CMD_ENA_INTR, sh[j]->io_port + REG_SYS_MASK);
828
 
829
   /* Register the I/O space that we use */
830
   request_region(sh[j]->io_port, sh[j]->n_io_port, driver_name);
831
 
832
   memset(HD(j), 0, sizeof(struct hostdata));
833
   HD(j)->heads = mapping_table[config_2.mapping_mode].heads;
834
   HD(j)->sectors = mapping_table[config_2.mapping_mode].sectors;
835
   HD(j)->subversion = subversion;
836
   HD(j)->board_number = j;
837
 
838
   if (have_old_firmware) sh[j]->sg_tablesize = MAX_SAFE_SGLIST;
839
 
840
   if (HD(j)->subversion == ESA) {
841
      sh[j]->unchecked_isa_dma = FALSE;
842
      sh[j]->dma_channel = NO_DMA;
843
      sprintf(BN(j), "U34F%d", j);
844
      bus_type = "VESA";
845
      }
846
   else {
847
      sh[j]->wish_block = TRUE;
848
      sh[j]->unchecked_isa_dma = TRUE;
849
      disable_dma(dma_channel);
850
      clear_dma_ff(dma_channel);
851
      set_dma_mode(dma_channel, DMA_MODE_CASCADE);
852
      enable_dma(dma_channel);
853
      sh[j]->dma_channel = dma_channel;
854
      sprintf(BN(j), "U14F%d", j);
855
      bus_type = "ISA";
856
      }
857
 
858
   sh[j]->max_channel = MAX_CHANNEL - 1;
859
   sh[j]->max_id = MAX_TARGET;
860
   sh[j]->max_lun = MAX_LUN;
861
 
862
   if (HD(j)->subversion == ISA && !board_inquiry(j)) {
863
      HD(j)->board_id[40] = 0;
864
 
865
      if (strcmp(&HD(j)->board_id[32], "06000600")) {
866
         printk("%s: %s.\n", BN(j), &HD(j)->board_id[8]);
867
         printk("%s: firmware %s is outdated, FW PROM should be 28004-006.\n",
868
                BN(j), &HD(j)->board_id[32]);
869
         sh[j]->hostt->use_clustering = DISABLE_CLUSTERING;
870
         sh[j]->sg_tablesize = MAX_SAFE_SGLIST;
871
         }
872
      }
873
 
874
   if (dma_channel == NO_DMA) sprintf(dma_name, "%s", "BMST");
875
   else                       sprintf(dma_name, "DMA %u", dma_channel);
876
 
877
   for (i = 0; i < sh[j]->can_queue; i++)
878
      if (! ((&HD(j)->cp[i])->sglist = kmalloc(
879
            sh[j]->sg_tablesize * sizeof(struct sg_list),
880
            (sh[j]->unchecked_isa_dma ? GFP_DMA : 0) | GFP_ATOMIC))) {
881
         printk("%s: kmalloc SGlist failed, mbox %d, detaching.\n", BN(j), i);
882
         u14_34f_release(sh[j]);
883
         return FALSE;
884
         }
885
 
886
   if (max_queue_depth > MAX_TAGGED_CMD_PER_LUN)
887
       max_queue_depth = MAX_TAGGED_CMD_PER_LUN;
888
 
889
   if (max_queue_depth < MAX_CMD_PER_LUN) max_queue_depth = MAX_CMD_PER_LUN;
890
 
891
   if (j == 0) {
892
      printk("UltraStor 14F/34F: Copyright (C) 1994-1998 Dario Ballabio.\n");
893
      printk("%s config options -> of:%c, lc:%c, mq:%d, eh:%c, et:%c.\n",
894
             driver_name, YESNO(have_old_firmware), YESNO(linked_comm),
895
             max_queue_depth, YESNO(use_new_eh_code), YESNO(ext_tran));
896
      }
897
 
898
   printk("%s: %s 0x%03lx, BIOS 0x%05x, IRQ %u, %s, SG %d, MB %d.\n",
899
          BN(j), bus_type, (unsigned long)sh[j]->io_port, (int)sh[j]->base,
900
          sh[j]->irq, dma_name, sh[j]->sg_tablesize, sh[j]->can_queue);
901
 
902
   if (sh[j]->max_id > 8 || sh[j]->max_lun > 8)
903
      printk("%s: wide SCSI support enabled, max_id %u, max_lun %u.\n",
904
             BN(j), sh[j]->max_id, sh[j]->max_lun);
905
 
906
   for (i = 0; i <= sh[j]->max_channel; i++)
907
      printk("%s: SCSI channel %u enabled, host target ID %d.\n",
908
             BN(j), i, sh[j]->this_id);
909
 
910
   return TRUE;
911
}
912
 
913
__initfunc (void u14_34f_setup(char *str, int *ints)) {
914
   int i, argc = ints[0];
915
   char *cur = str, *pc;
916
 
917
   if (argc > 0) {
918
 
919
      if (argc > MAX_INT_PARAM) argc = MAX_INT_PARAM;
920
 
921
      for (i = 0; i < argc; i++) io_port[i] = ints[i + 1];
922
 
923
      io_port[i] = 0;
924
      setup_done = TRUE;
925
      }
926
 
927
   while (cur && (pc = strchr(cur, ':'))) {
928
      int val = 0, c = *++pc;
929
 
930
      if (c == 'n' || c == 'N') val = FALSE;
931
      else if (c == 'y' || c == 'Y') val = TRUE;
932
      else val = (int) simple_strtoul(pc, NULL, 0);
933
 
934
      if (!strncmp(cur, "lc:", 3)) linked_comm = val;
935
      else if (!strncmp(cur, "of:", 3)) have_old_firmware = val;
936
      else if (!strncmp(cur, "mq:", 3))  max_queue_depth = val;
937
      else if (!strncmp(cur, "ls:", 3))  link_statistics = val;
938
      else if (!strncmp(cur, "eh:", 3))  use_new_eh_code = val;
939
      else if (!strncmp(cur, "et:", 3))  ext_tran = val;
940
 
941
      if ((cur = strchr(cur, ','))) ++cur;
942
      }
943
 
944
   return;
945
}
946
 
947
__initfunc (int u14_34f_detect(Scsi_Host_Template *tpnt)) {
948
   unsigned int j = 0, k;
949
   IRQ_FLAGS
950
 
951
   IRQ_LOCK_SAVE
952
   tpnt->proc_dir = &proc_scsi_u14_34f;
953
 
954
#if defined(MODULE)
955
   /* io_port could have been modified when loading as a module */
956
   if(io_port[0] != SKIP) {
957
      setup_done = TRUE;
958
      io_port[MAX_INT_PARAM] = 0;
959
      }
960
#endif
961
 
962
   for (k = 0; k < MAX_BOARDS + 1; k++) sh[k] = NULL;
963
 
964
   for (k = 0; io_port[k]; k++) {
965
 
966
      if (io_port[k] == SKIP) continue;
967
 
968
      if (j < MAX_BOARDS && port_detect(io_port[k], j, tpnt)) j++;
969
      }
970
 
971
   num_boards = j;
972
   IRQ_UNLOCK_RESTORE
973
   return j;
974
}
975
 
976
static inline void build_sg_list(struct mscp *cpp, Scsi_Cmnd *SCpnt) {
977
   unsigned int k, data_len = 0;
978
   struct scatterlist *sgpnt;
979
 
980
   sgpnt = (struct scatterlist *) SCpnt->request_buffer;
981
 
982
   for (k = 0; k < SCpnt->use_sg; k++) {
983
      cpp->sglist[k].address = V2DEV(sgpnt[k].address);
984
      cpp->sglist[k].num_bytes = H2DEV(sgpnt[k].length);
985
      data_len += sgpnt[k].length;
986
      }
987
 
988
   cpp->use_sg = SCpnt->use_sg;
989
   cpp->data_address = V2DEV(cpp->sglist);
990
   cpp->data_len = H2DEV(data_len);
991
}
992
 
993
static inline int do_qcomm(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
994
   unsigned int i, j, k;
995
   struct mscp *cpp;
996
 
997
   static const unsigned char data_out_cmds[] = {
998
      0x0a, 0x2a, 0x15, 0x55, 0x04, 0x07, 0x18, 0x1d, 0x24, 0x2e,
999
      0x30, 0x31, 0x32, 0x38, 0x39, 0x3a, 0x3b, 0x3d, 0x3f, 0x40,
1000
      0x41, 0x4c, 0xaa, 0xae, 0xb0, 0xb1, 0xb2, 0xb6, 0xea, 0x1b
1001
      };
1002
 
1003
   static const unsigned char data_none_cmds[] = {
1004
      0x01, 0x0b, 0x10, 0x11, 0x13, 0x16, 0x17, 0x19, 0x2b, 0x1e,
1005
      0x2c, 0xac, 0x2f, 0xaf, 0x33, 0xb3, 0x35, 0x36, 0x45, 0x47,
1006
      0x48, 0x49, 0xa9, 0x4b, 0xa5, 0xa6, 0xb5
1007
      };
1008
 
1009
   /* j is the board number */
1010
   j = ((struct hostdata *) SCpnt->host->hostdata)->board_number;
1011
 
1012
   if (SCpnt->host_scribble)
1013
      panic("%s: qcomm, pid %ld, SCpnt %p already active.\n",
1014
            BN(j), SCpnt->pid, SCpnt);
1015
 
1016
   /* i is the mailbox number, look for the first free mailbox
1017
      starting from last_cp_used */
1018
   i = HD(j)->last_cp_used + 1;
1019
 
1020
   for (k = 0; k < sh[j]->can_queue; k++, i++) {
1021
 
1022
      if (i >= sh[j]->can_queue) i = 0;
1023
 
1024
      if (HD(j)->cp_stat[i] == FREE) {
1025
         HD(j)->last_cp_used = i;
1026
         break;
1027
         }
1028
      }
1029
 
1030
   if (k == sh[j]->can_queue) {
1031
      printk("%s: qcomm, no free mailbox.\n", BN(j));
1032
      return 1;
1033
      }
1034
 
1035
   /* Set pointer to control packet structure */
1036
   cpp = &HD(j)->cp[i];
1037
 
1038
   memset(cpp, 0, sizeof(struct mscp) - sizeof(struct sg_list *));
1039
   SCpnt->scsi_done = done;
1040
   cpp->index = i;
1041
   SCpnt->host_scribble = (unsigned char *) &cpp->index;
1042
 
1043
   if (do_trace) printk("%s: qcomm, mbox %d, target %d.%d:%d, pid %ld.\n",
1044
                        BN(j), i, SCpnt->channel, SCpnt->target,
1045
                        SCpnt->lun, SCpnt->pid);
1046
 
1047
   cpp->xdir = DTD_IN;
1048
 
1049
   for (k = 0; k < ARRAY_SIZE(data_out_cmds); k++)
1050
      if (SCpnt->cmnd[0] == data_out_cmds[k]) {
1051
         cpp->xdir = DTD_OUT;
1052
         break;
1053
         }
1054
 
1055
   if (cpp->xdir == DTD_IN)
1056
      for (k = 0; k < ARRAY_SIZE(data_none_cmds); k++)
1057
         if (SCpnt->cmnd[0] == data_none_cmds[k]) {
1058
            cpp->xdir = DTD_NONE;
1059
            break;
1060
            }
1061
 
1062
   cpp->opcode = OP_SCSI;
1063
   cpp->channel = SCpnt->channel;
1064
   cpp->target = SCpnt->target;
1065
   cpp->lun = SCpnt->lun;
1066
   cpp->SCpnt = SCpnt;
1067
   cpp->sense_addr = V2DEV(SCpnt->sense_buffer);
1068
   cpp->sense_len = sizeof SCpnt->sense_buffer;
1069
 
1070
   if (SCpnt->use_sg) {
1071
      cpp->sg = TRUE;
1072
      build_sg_list(cpp, SCpnt);
1073
      }
1074
   else {
1075
      cpp->data_address = V2DEV(SCpnt->request_buffer);
1076
      cpp->data_len = H2DEV(SCpnt->request_bufflen);
1077
      }
1078
 
1079
   cpp->scsi_cdbs_len = SCpnt->cmd_len;
1080
   memcpy(cpp->scsi_cdbs, SCpnt->cmnd, cpp->scsi_cdbs_len);
1081
 
1082
   if (linked_comm && SCpnt->device->queue_depth > 2
1083
                                     && TLDEV(SCpnt->device->type)) {
1084
      HD(j)->cp_stat[i] = READY;
1085
      flush_dev(SCpnt->device, SCpnt->request.sector, j, FALSE);
1086
      return 0;
1087
      }
1088
 
1089
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1090
      SCpnt->host_scribble = NULL;
1091
      printk("%s: qcomm, target %d.%d:%d, pid %ld, adapter busy.\n",
1092
             BN(j), SCpnt->channel, SCpnt->target, SCpnt->lun, SCpnt->pid);
1093
      return 1;
1094
      }
1095
 
1096
   /* Store pointer in OGM address bytes */
1097
   outl(V2DEV(cpp), sh[j]->io_port + REG_OGM);
1098
 
1099
   /* Issue OGM interrupt */
1100
   outb(CMD_OGM_INTR, sh[j]->io_port + REG_LCL_INTR);
1101
 
1102
   HD(j)->cp_stat[i] = IN_USE;
1103
   return 0;
1104
}
1105
 
1106
int u14_34f_queuecommand(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
1107
   int rtn;
1108
   IRQ_FLAGS
1109
 
1110
   IRQ_LOCK_SAVE
1111
   rtn = do_qcomm(SCpnt, done);
1112
   IRQ_UNLOCK_RESTORE
1113
   return rtn;
1114
}
1115
 
1116
static inline int do_old_abort(Scsi_Cmnd *SCarg) {
1117
   unsigned int i, j;
1118
 
1119
   j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
1120
 
1121
   if (SCarg->host_scribble == NULL ||
1122
       (SCarg->serial_number_at_timeout &&
1123
       (SCarg->serial_number != SCarg->serial_number_at_timeout))) {
1124
      printk("%s: abort, target %d.%d:%d, pid %ld inactive.\n",
1125
             BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1126
      return SCSI_ABORT_NOT_RUNNING;
1127
      }
1128
 
1129
   i = *(unsigned int *)SCarg->host_scribble;
1130
   printk("%s: abort, mbox %d, target %d.%d:%d, pid %ld.\n",
1131
          BN(j), i, SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1132
 
1133
   if (i >= sh[j]->can_queue)
1134
      panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j));
1135
 
1136
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1137
      printk("%s: abort, timeout error.\n", BN(j));
1138
      return SCSI_ABORT_ERROR;
1139
      }
1140
 
1141
   if (HD(j)->cp_stat[i] == FREE) {
1142
      printk("%s: abort, mbox %d is free.\n", BN(j), i);
1143
      return SCSI_ABORT_NOT_RUNNING;
1144
      }
1145
 
1146
   if (HD(j)->cp_stat[i] == IN_USE) {
1147
      printk("%s: abort, mbox %d is in use.\n", BN(j), i);
1148
 
1149
      if (SCarg != HD(j)->cp[i].SCpnt)
1150
         panic("%s: abort, mbox %d, SCarg %p, cp SCpnt %p.\n",
1151
               BN(j), i, SCarg, HD(j)->cp[i].SCpnt);
1152
 
1153
      if (inb(sh[j]->io_port + REG_SYS_INTR) & IRQ_ASSERTED)
1154
         printk("%s: abort, mbox %d, interrupt pending.\n", BN(j), i);
1155
 
1156
      return SCSI_ABORT_SNOOZE;
1157
      }
1158
 
1159
   if (HD(j)->cp_stat[i] == IN_RESET) {
1160
      printk("%s: abort, mbox %d is in reset.\n", BN(j), i);
1161
      return SCSI_ABORT_ERROR;
1162
      }
1163
 
1164
   if (HD(j)->cp_stat[i] == LOCKED) {
1165
      printk("%s: abort, mbox %d is locked.\n", BN(j), i);
1166
      return SCSI_ABORT_NOT_RUNNING;
1167
      }
1168
 
1169
   if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
1170
      SCarg->result = DID_ABORT << 16;
1171
      SCarg->host_scribble = NULL;
1172
      HD(j)->cp_stat[i] = FREE;
1173
      printk("%s, abort, mbox %d ready, DID_ABORT, pid %ld done.\n",
1174
             BN(j), i, SCarg->pid);
1175
      SCarg->scsi_done(SCarg);
1176
      return SCSI_ABORT_SUCCESS;
1177
      }
1178
 
1179
   panic("%s: abort, mbox %d, invalid cp_stat.\n", BN(j), i);
1180
}
1181
 
1182
int u14_34f_old_abort(Scsi_Cmnd *SCarg) {
1183
   int rtn;
1184
   IRQ_FLAGS
1185
 
1186
   IRQ_LOCK_SAVE
1187
   rtn = do_old_abort(SCarg);
1188
   IRQ_UNLOCK_RESTORE
1189
   return rtn;
1190
}
1191
 
1192
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
1193
 
1194
static inline int do_abort(Scsi_Cmnd *SCarg) {
1195
   unsigned int i, j;
1196
 
1197
   j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
1198
 
1199
   if (SCarg->host_scribble == NULL) {
1200
      printk("%s: abort, target %d.%d:%d, pid %ld inactive.\n",
1201
             BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1202
      return SUCCESS;
1203
      }
1204
 
1205
   i = *(unsigned int *)SCarg->host_scribble;
1206
   printk("%s: abort, mbox %d, target %d.%d:%d, pid %ld.\n",
1207
          BN(j), i, SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1208
 
1209
   if (i >= sh[j]->can_queue)
1210
      panic("%s: abort, invalid SCarg->host_scribble.\n", BN(j));
1211
 
1212
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1213
      printk("%s: abort, timeout error.\n", BN(j));
1214
      return FAILED;
1215
      }
1216
 
1217
   if (HD(j)->cp_stat[i] == FREE) {
1218
      printk("%s: abort, mbox %d is free.\n", BN(j), i);
1219
      return SUCCESS;
1220
      }
1221
 
1222
   if (HD(j)->cp_stat[i] == IN_USE) {
1223
      printk("%s: abort, mbox %d is in use.\n", BN(j), i);
1224
 
1225
      if (SCarg != HD(j)->cp[i].SCpnt)
1226
         panic("%s: abort, mbox %d, SCarg %p, cp SCpnt %p.\n",
1227
               BN(j), i, SCarg, HD(j)->cp[i].SCpnt);
1228
 
1229
      if (inb(sh[j]->io_port + REG_SYS_INTR) & IRQ_ASSERTED)
1230
         printk("%s: abort, mbox %d, interrupt pending.\n", BN(j), i);
1231
 
1232
      if (SCarg->eh_state == SCSI_STATE_TIMEOUT) {
1233
         SCarg->host_scribble = NULL;
1234
         HD(j)->cp_stat[i] = FREE;
1235
         printk("%s, abort, mbox %d, eh_state timeout, pid %ld.\n",
1236
                BN(j), i, SCarg->pid);
1237
         return SUCCESS;
1238
         }
1239
 
1240
      return FAILED;
1241
      }
1242
 
1243
   if (HD(j)->cp_stat[i] == IN_RESET) {
1244
      printk("%s: abort, mbox %d is in reset.\n", BN(j), i);
1245
      return FAILED;
1246
      }
1247
 
1248
   if (HD(j)->cp_stat[i] == LOCKED) {
1249
      printk("%s: abort, mbox %d is locked.\n", BN(j), i);
1250
      return SUCCESS;
1251
      }
1252
 
1253
   if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
1254
      SCarg->result = DID_ABORT << 16;
1255
      SCarg->host_scribble = NULL;
1256
      HD(j)->cp_stat[i] = FREE;
1257
      printk("%s, abort, mbox %d ready, DID_ABORT, pid %ld done.\n",
1258
             BN(j), i, SCarg->pid);
1259
      SCarg->scsi_done(SCarg);
1260
      return SUCCESS;
1261
      }
1262
 
1263
   panic("%s: abort, mbox %d, invalid cp_stat.\n", BN(j), i);
1264
}
1265
 
1266
int u14_34f_abort(Scsi_Cmnd *SCarg) {
1267
 
1268
   return do_abort(SCarg);
1269
}
1270
 
1271
#endif /* new_eh_code */
1272
 
1273
static inline int do_old_reset(Scsi_Cmnd *SCarg) {
1274
   unsigned int i, j, time, k, c, limit = 0;
1275
   int arg_done = FALSE;
1276
   Scsi_Cmnd *SCpnt;
1277
 
1278
   j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
1279
   printk("%s: reset, enter, target %d.%d:%d, pid %ld.\n",
1280
          BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1281
 
1282
   if (SCarg->host_scribble == NULL)
1283
      printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
1284
 
1285
   if (SCarg->serial_number_at_timeout &&
1286
       (SCarg->serial_number != SCarg->serial_number_at_timeout)) {
1287
      printk("%s: reset, pid %ld, reset not running.\n", BN(j), SCarg->pid);
1288
      return SCSI_RESET_NOT_RUNNING;
1289
      }
1290
 
1291
   if (HD(j)->in_reset) {
1292
      printk("%s: reset, exit, already in reset.\n", BN(j));
1293
      return SCSI_RESET_ERROR;
1294
      }
1295
 
1296
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1297
      printk("%s: reset, exit, timeout error.\n", BN(j));
1298
      return SCSI_RESET_ERROR;
1299
      }
1300
 
1301
   HD(j)->retries = 0;
1302
 
1303
   for (c = 0; c <= sh[j]->max_channel; c++)
1304
      for (k = 0; k < sh[j]->max_id; k++) {
1305
         HD(j)->target_redo[k][c] = TRUE;
1306
         HD(j)->target_to[k][c] = 0;
1307
         }
1308
 
1309
   for (i = 0; i < sh[j]->can_queue; i++) {
1310
 
1311
      if (HD(j)->cp_stat[i] == FREE) continue;
1312
 
1313
      if (HD(j)->cp_stat[i] == LOCKED) {
1314
         HD(j)->cp_stat[i] = FREE;
1315
         printk("%s: reset, locked mbox %d forced free.\n", BN(j), i);
1316
         continue;
1317
         }
1318
 
1319
      if (!(SCpnt = HD(j)->cp[i].SCpnt))
1320
         panic("%s: reset, mbox %d, SCpnt == NULL.\n", BN(j), i);
1321
 
1322
      if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
1323
         HD(j)->cp_stat[i] = ABORTING;
1324
         printk("%s: reset, mbox %d aborting, pid %ld.\n",
1325
                BN(j), i, SCpnt->pid);
1326
         }
1327
 
1328
      else {
1329
         HD(j)->cp_stat[i] = IN_RESET;
1330
         printk("%s: reset, mbox %d in reset, pid %ld.\n",
1331
                BN(j), i, SCpnt->pid);
1332
         }
1333
 
1334
      if (SCpnt->host_scribble == NULL)
1335
         panic("%s: reset, mbox %d, garbled SCpnt.\n", BN(j), i);
1336
 
1337
      if (*(unsigned int *)SCpnt->host_scribble != i)
1338
         panic("%s: reset, mbox %d, index mismatch.\n", BN(j), i);
1339
 
1340
      if (SCpnt->scsi_done == NULL)
1341
         panic("%s: reset, mbox %d, SCpnt->scsi_done == NULL.\n", BN(j), i);
1342
 
1343
      if (SCpnt == SCarg) arg_done = TRUE;
1344
      }
1345
 
1346
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1347
      printk("%s: reset, cannot reset, timeout error.\n", BN(j));
1348
      return SCSI_RESET_ERROR;
1349
      }
1350
 
1351
   outb(CMD_RESET, sh[j]->io_port + REG_LCL_INTR);
1352
   printk("%s: reset, board reset done, enabling interrupts.\n", BN(j));
1353
 
1354
#if defined(DEBUG_RESET)
1355
   do_trace = TRUE;
1356
#endif
1357
 
1358
   HD(j)->in_reset = TRUE;
1359
   SPIN_UNLOCK
1360
   IRQ_UNLOCK
1361
   time = jiffies;
1362
   while ((jiffies - time) < (10 * HZ) && limit++ < 200000) udelay(100L);
1363
   IRQ_LOCK
1364
   SPIN_LOCK
1365
   printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
1366
 
1367
   for (i = 0; i < sh[j]->can_queue; i++) {
1368
 
1369
      if (HD(j)->cp_stat[i] == IN_RESET) {
1370
         SCpnt = HD(j)->cp[i].SCpnt;
1371
         SCpnt->result = DID_RESET << 16;
1372
         SCpnt->host_scribble = NULL;
1373
 
1374
         /* This mailbox is still waiting for its interrupt */
1375
         HD(j)->cp_stat[i] = LOCKED;
1376
 
1377
         printk("%s, reset, mbox %d locked, DID_RESET, pid %ld done.\n",
1378
                BN(j), i, SCpnt->pid);
1379
         }
1380
 
1381
      else if (HD(j)->cp_stat[i] == ABORTING) {
1382
         SCpnt = HD(j)->cp[i].SCpnt;
1383
         SCpnt->result = DID_RESET << 16;
1384
         SCpnt->host_scribble = NULL;
1385
 
1386
         /* This mailbox was never queued to the adapter */
1387
         HD(j)->cp_stat[i] = FREE;
1388
 
1389
         printk("%s, reset, mbox %d aborting, DID_RESET, pid %ld done.\n",
1390
                BN(j), i, SCpnt->pid);
1391
         }
1392
 
1393
      else
1394
 
1395
         /* Any other mailbox has already been set free by interrupt */
1396
         continue;
1397
 
1398
      SCpnt->scsi_done(SCpnt);
1399
      IRQ_LOCK
1400
      }
1401
 
1402
   HD(j)->in_reset = FALSE;
1403
   do_trace = FALSE;
1404
 
1405
   if (arg_done) {
1406
      printk("%s: reset, exit, success.\n", BN(j));
1407
      return SCSI_RESET_SUCCESS;
1408
      }
1409
   else {
1410
      printk("%s: reset, exit, wakeup.\n", BN(j));
1411
      return SCSI_RESET_PUNT;
1412
      }
1413
}
1414
 
1415
int u14_34f_old_reset(Scsi_Cmnd *SCarg, unsigned int reset_flags) {
1416
   int rtn;
1417
   IRQ_FLAGS
1418
 
1419
   IRQ_LOCK_SAVE
1420
   rtn = do_old_reset(SCarg);
1421
   IRQ_UNLOCK_RESTORE
1422
   return rtn;
1423
}
1424
 
1425
#if LINUX_VERSION_CODE >= LinuxVersionCode(2,1,101)
1426
 
1427
static inline int do_reset(Scsi_Cmnd *SCarg) {
1428
   unsigned int i, j, time, k, c, limit = 0;
1429
   int arg_done = FALSE;
1430
   Scsi_Cmnd *SCpnt;
1431
 
1432
   j = ((struct hostdata *) SCarg->host->hostdata)->board_number;
1433
   printk("%s: reset, enter, target %d.%d:%d, pid %ld.\n",
1434
          BN(j), SCarg->channel, SCarg->target, SCarg->lun, SCarg->pid);
1435
 
1436
   if (SCarg->host_scribble == NULL)
1437
      printk("%s: reset, pid %ld inactive.\n", BN(j), SCarg->pid);
1438
 
1439
   if (HD(j)->in_reset) {
1440
      printk("%s: reset, exit, already in reset.\n", BN(j));
1441
      return FAILED;
1442
      }
1443
 
1444
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1445
      printk("%s: reset, exit, timeout error.\n", BN(j));
1446
      return FAILED;
1447
      }
1448
 
1449
   HD(j)->retries = 0;
1450
 
1451
   for (c = 0; c <= sh[j]->max_channel; c++)
1452
      for (k = 0; k < sh[j]->max_id; k++) {
1453
         HD(j)->target_redo[k][c] = TRUE;
1454
         HD(j)->target_to[k][c] = 0;
1455
         }
1456
 
1457
   for (i = 0; i < sh[j]->can_queue; i++) {
1458
 
1459
      if (HD(j)->cp_stat[i] == FREE) continue;
1460
 
1461
      if (HD(j)->cp_stat[i] == LOCKED) {
1462
         HD(j)->cp_stat[i] = FREE;
1463
         printk("%s: reset, locked mbox %d forced free.\n", BN(j), i);
1464
         continue;
1465
         }
1466
 
1467
      if (!(SCpnt = HD(j)->cp[i].SCpnt))
1468
         panic("%s: reset, mbox %d, SCpnt == NULL.\n", BN(j), i);
1469
 
1470
      if (HD(j)->cp_stat[i] == READY || HD(j)->cp_stat[i] == ABORTING) {
1471
         HD(j)->cp_stat[i] = ABORTING;
1472
         printk("%s: reset, mbox %d aborting, pid %ld.\n",
1473
                BN(j), i, SCpnt->pid);
1474
         }
1475
 
1476
      else {
1477
         HD(j)->cp_stat[i] = IN_RESET;
1478
         printk("%s: reset, mbox %d in reset, pid %ld.\n",
1479
                BN(j), i, SCpnt->pid);
1480
         }
1481
 
1482
      if (SCpnt->host_scribble == NULL)
1483
         panic("%s: reset, mbox %d, garbled SCpnt.\n", BN(j), i);
1484
 
1485
      if (*(unsigned int *)SCpnt->host_scribble != i)
1486
         panic("%s: reset, mbox %d, index mismatch.\n", BN(j), i);
1487
 
1488
      if (SCpnt->scsi_done == NULL)
1489
         panic("%s: reset, mbox %d, SCpnt->scsi_done == NULL.\n", BN(j), i);
1490
 
1491
      if (SCpnt == SCarg) arg_done = TRUE;
1492
      }
1493
 
1494
   if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1495
      printk("%s: reset, cannot reset, timeout error.\n", BN(j));
1496
      return FAILED;
1497
      }
1498
 
1499
   outb(CMD_RESET, sh[j]->io_port + REG_LCL_INTR);
1500
   printk("%s: reset, board reset done, enabling interrupts.\n", BN(j));
1501
 
1502
#if defined(DEBUG_RESET)
1503
   do_trace = TRUE;
1504
#endif
1505
 
1506
   HD(j)->in_reset = TRUE;
1507
   SPIN_UNLOCK
1508
   IRQ_UNLOCK
1509
   time = jiffies;
1510
   while ((jiffies - time) < (10 * HZ) && limit++ < 200000) udelay(100L);
1511
   IRQ_LOCK
1512
   SPIN_LOCK
1513
   printk("%s: reset, interrupts disabled, loops %d.\n", BN(j), limit);
1514
 
1515
   for (i = 0; i < sh[j]->can_queue; i++) {
1516
 
1517
      if (HD(j)->cp_stat[i] == IN_RESET) {
1518
         SCpnt = HD(j)->cp[i].SCpnt;
1519
         SCpnt->result = DID_RESET << 16;
1520
         SCpnt->host_scribble = NULL;
1521
 
1522
         /* This mailbox is still waiting for its interrupt */
1523
         HD(j)->cp_stat[i] = LOCKED;
1524
 
1525
         printk("%s, reset, mbox %d locked, DID_RESET, pid %ld done.\n",
1526
                BN(j), i, SCpnt->pid);
1527
         }
1528
 
1529
      else if (HD(j)->cp_stat[i] == ABORTING) {
1530
         SCpnt = HD(j)->cp[i].SCpnt;
1531
         SCpnt->result = DID_RESET << 16;
1532
         SCpnt->host_scribble = NULL;
1533
 
1534
         /* This mailbox was never queued to the adapter */
1535
         HD(j)->cp_stat[i] = FREE;
1536
 
1537
         printk("%s, reset, mbox %d aborting, DID_RESET, pid %ld done.\n",
1538
                BN(j), i, SCpnt->pid);
1539
         }
1540
 
1541
      else
1542
 
1543
         /* Any other mailbox has already been set free by interrupt */
1544
         continue;
1545
 
1546
      SCpnt->scsi_done(SCpnt);
1547
      IRQ_LOCK
1548
      }
1549
 
1550
   HD(j)->in_reset = FALSE;
1551
   do_trace = FALSE;
1552
 
1553
   if (arg_done) printk("%s: reset, exit, pid %ld done.\n", BN(j), SCarg->pid);
1554
   else          printk("%s: reset, exit.\n", BN(j));
1555
 
1556
   return SUCCESS;
1557
}
1558
 
1559
int u14_34f_reset(Scsi_Cmnd *SCarg) {
1560
 
1561
   return do_reset(SCarg);
1562
}
1563
 
1564
#endif /* new_eh_code */
1565
 
1566
int u14_34f_biosparam(Disk *disk, kdev_t dev, int *dkinfo) {
1567
   unsigned int j = 0;
1568
   int size = disk->capacity;
1569
 
1570
   dkinfo[0] = HD(j)->heads;
1571
   dkinfo[1] = HD(j)->sectors;
1572
   dkinfo[2] = size / (HD(j)->heads * HD(j)->sectors);
1573
 
1574
   if (ext_tran && (scsicam_bios_param(disk, dev, dkinfo) < 0)) {
1575
      dkinfo[0] = 255;
1576
      dkinfo[1] = 63;
1577
      dkinfo[2] = size / (dkinfo[0] * dkinfo[1]);
1578
      }
1579
 
1580
#if defined (DEBUG_GEOMETRY)
1581
   printk ("%s: biosparam, head=%d, sec=%d, cyl=%d.\n", driver_name,
1582
           dkinfo[0], dkinfo[1], dkinfo[2]);
1583
#endif
1584
 
1585
   return FALSE;
1586
}
1587
 
1588
static void sort(unsigned long sk[], unsigned int da[], unsigned int n,
1589
                 unsigned int rev) {
1590
   unsigned int i, j, k, y;
1591
   unsigned long x;
1592
 
1593
   for (i = 0; i < n - 1; i++) {
1594
      k = i;
1595
 
1596
      for (j = k + 1; j < n; j++)
1597
         if (rev) {
1598
            if (sk[j] > sk[k]) k = j;
1599
            }
1600
         else {
1601
            if (sk[j] < sk[k]) k = j;
1602
            }
1603
 
1604
      if (k != i) {
1605
         x = sk[k]; sk[k] = sk[i]; sk[i] = x;
1606
         y = da[k]; da[k] = da[i]; da[i] = y;
1607
         }
1608
      }
1609
 
1610
   return;
1611
   }
1612
 
1613
static inline int reorder(unsigned int j, unsigned long cursec,
1614
                 unsigned int ihdlr, unsigned int il[], unsigned int n_ready) {
1615
   Scsi_Cmnd *SCpnt;
1616
   struct mscp *cpp;
1617
   unsigned int k, n;
1618
   unsigned int rev = FALSE, s = TRUE, r = TRUE;
1619
   unsigned int input_only = TRUE, overlap = FALSE;
1620
   unsigned long sl[n_ready], pl[n_ready], ll[n_ready];
1621
   unsigned long maxsec = 0, minsec = ULONG_MAX, seek = 0, iseek = 0;
1622
   unsigned long ioseek = 0;
1623
 
1624
   static unsigned int flushcount = 0, batchcount = 0, sortcount = 0;
1625
   static unsigned int readycount = 0, ovlcount = 0, inputcount = 0;
1626
   static unsigned int readysorted = 0, revcount = 0;
1627
   static unsigned long seeksorted = 0, seeknosort = 0;
1628
 
1629
   if (link_statistics && !(++flushcount % link_statistics))
1630
      printk("fc %d bc %d ic %d oc %d rc %d rs %d sc %d re %d"\
1631
             " av %ldK as %ldK.\n", flushcount, batchcount, inputcount,
1632
             ovlcount, readycount, readysorted, sortcount, revcount,
1633
             seeknosort / (readycount + 1),
1634
             seeksorted / (readycount + 1));
1635
 
1636
   if (n_ready <= 1) return FALSE;
1637
 
1638
   for (n = 0; n < n_ready; n++) {
1639
      k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
1640
 
1641
      if (!(cpp->xdir == DTD_IN)) input_only = FALSE;
1642
 
1643
      if (SCpnt->request.sector < minsec) minsec = SCpnt->request.sector;
1644
      if (SCpnt->request.sector > maxsec) maxsec = SCpnt->request.sector;
1645
 
1646
      sl[n] = SCpnt->request.sector;
1647
      ioseek += SCpnt->request.nr_sectors;
1648
 
1649
      if (!n) continue;
1650
 
1651
      if (sl[n] < sl[n - 1]) s = FALSE;
1652
      if (sl[n] > sl[n - 1]) r = FALSE;
1653
 
1654
      if (link_statistics) {
1655
         if (sl[n] > sl[n - 1])
1656
            seek += sl[n] - sl[n - 1];
1657
         else
1658
            seek += sl[n - 1] - sl[n];
1659
         }
1660
 
1661
      }
1662
 
1663
   if (link_statistics) {
1664
      if (cursec > sl[0]) seek += cursec - sl[0]; else seek += sl[0] - cursec;
1665
      }
1666
 
1667
   if (cursec > ((maxsec + minsec) / 2)) rev = TRUE;
1668
 
1669
   if (ioseek > ((maxsec - minsec) / 2)) rev = FALSE;
1670
 
1671
   if (!((rev && r) || (!rev && s))) sort(sl, il, n_ready, rev);
1672
 
1673
   if (!input_only) for (n = 0; n < n_ready; n++) {
1674
      k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
1675
      ll[n] = SCpnt->request.nr_sectors; pl[n] = SCpnt->pid;
1676
 
1677
      if (!n) continue;
1678
 
1679
      if ((sl[n] == sl[n - 1]) || (!rev && ((sl[n - 1] + ll[n - 1]) > sl[n]))
1680
          || (rev && ((sl[n] + ll[n]) > sl[n - 1]))) overlap = TRUE;
1681
      }
1682
 
1683
   if (overlap) sort(pl, il, n_ready, FALSE);
1684
 
1685
   if (link_statistics) {
1686
      if (cursec > sl[0]) iseek = cursec - sl[0]; else iseek = sl[0] - cursec;
1687
      batchcount++; readycount += n_ready, seeknosort += seek / 1024;
1688
      if (input_only) inputcount++;
1689
      if (overlap) { ovlcount++; seeksorted += iseek / 1024; }
1690
      else seeksorted += (iseek + maxsec - minsec) / 1024;
1691
      if (rev && !r)     {  revcount++; readysorted += n_ready; }
1692
      if (!rev && !s)    { sortcount++; readysorted += n_ready; }
1693
      }
1694
 
1695
#if defined(DEBUG_LINKED_COMMANDS)
1696
   if (link_statistics && (overlap || !(flushcount % link_statistics)))
1697
      for (n = 0; n < n_ready; n++) {
1698
         k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
1699
         printk("%s %d.%d:%d pid %ld mb %d fc %d nr %d sec %ld ns %ld"\
1700
                " cur %ld s:%c r:%c rev:%c in:%c ov:%c xd %d.\n",
1701
                (ihdlr ? "ihdlr" : "qcomm"), SCpnt->channel, SCpnt->target,
1702
                SCpnt->lun, SCpnt->pid, k, flushcount, n_ready,
1703
                SCpnt->request.sector, SCpnt->request.nr_sectors, cursec,
1704
                YESNO(s), YESNO(r), YESNO(rev), YESNO(input_only),
1705
                YESNO(overlap), cpp->xdir);
1706
         }
1707
#endif
1708
   return overlap;
1709
}
1710
 
1711
static void flush_dev(Scsi_Device *dev, unsigned long cursec, unsigned int j,
1712
                      unsigned int ihdlr) {
1713
   Scsi_Cmnd *SCpnt;
1714
   struct mscp *cpp;
1715
   unsigned int k, n, n_ready = 0, il[MAX_MAILBOXES];
1716
 
1717
   for (k = 0; k < sh[j]->can_queue; k++) {
1718
 
1719
      if (HD(j)->cp_stat[k] != READY && HD(j)->cp_stat[k] != IN_USE) continue;
1720
 
1721
      cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
1722
 
1723
      if (SCpnt->device != dev) continue;
1724
 
1725
      if (HD(j)->cp_stat[k] == IN_USE) return;
1726
 
1727
      il[n_ready++] = k;
1728
      }
1729
 
1730
   if (reorder(j, cursec, ihdlr, il, n_ready)) n_ready = 1;
1731
 
1732
   for (n = 0; n < n_ready; n++) {
1733
      k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
1734
 
1735
      if (wait_on_busy(sh[j]->io_port, MAXLOOP)) {
1736
         printk("%s: %s, target %d.%d:%d, pid %ld, mbox %d, adapter"\
1737
                " busy, will abort.\n", BN(j), (ihdlr ? "ihdlr" : "qcomm"),
1738
                SCpnt->channel, SCpnt->target, SCpnt->lun, SCpnt->pid, k);
1739
         HD(j)->cp_stat[k] = ABORTING;
1740
         continue;
1741
         }
1742
 
1743
      outl(V2DEV(cpp), sh[j]->io_port + REG_OGM);
1744
      outb(CMD_OGM_INTR, sh[j]->io_port + REG_LCL_INTR);
1745
      HD(j)->cp_stat[k] = IN_USE;
1746
      }
1747
 
1748
}
1749
 
1750
static inline void ihdlr(int irq, unsigned int j) {
1751
   Scsi_Cmnd *SCpnt;
1752
   unsigned int i, k, c, status, tstatus, reg, ret;
1753
   struct mscp *spp, *cpp;
1754
 
1755
   if (sh[j]->irq != irq)
1756
       panic("%s: ihdlr, irq %d, sh[j]->irq %d.\n", BN(j), irq, sh[j]->irq);
1757
 
1758
   /* Check if this board need to be serviced */
1759
   if (!((reg = inb(sh[j]->io_port + REG_SYS_INTR)) & IRQ_ASSERTED)) return;
1760
 
1761
   HD(j)->iocount++;
1762
 
1763
   if (do_trace) printk("%s: ihdlr, enter, irq %d, count %d.\n", BN(j), irq,
1764
                        HD(j)->iocount);
1765
 
1766
   /* Check if this board is still busy */
1767
   if (wait_on_busy(sh[j]->io_port, 20 * MAXLOOP)) {
1768
      outb(CMD_CLR_INTR, sh[j]->io_port + REG_SYS_INTR);
1769
      printk("%s: ihdlr, busy timeout error,  irq %d, reg 0x%x, count %d.\n",
1770
             BN(j), irq, reg, HD(j)->iocount);
1771
      return;
1772
      }
1773
 
1774
   spp = (struct mscp *)DEV2V(ret = inl(sh[j]->io_port + REG_ICM));
1775
   cpp = spp;
1776
 
1777
   /* Clear interrupt pending flag */
1778
   outb(CMD_CLR_INTR, sh[j]->io_port + REG_SYS_INTR);
1779
 
1780
#if defined(DEBUG_GENERATE_ABORTS)
1781
   if ((HD(j)->iocount > 500) && ((HD(j)->iocount % 500) < 3)) return;
1782
#endif
1783
 
1784
   /* Find the mailbox to be serviced on this board */
1785
   i = cpp - HD(j)->cp;
1786
 
1787
   if (cpp < HD(j)->cp || cpp >= HD(j)->cp + sh[j]->can_queue
1788
                                     || i >= sh[j]->can_queue)
1789
      panic("%s: ihdlr, invalid mscp bus address %p, cp0 %p.\n", BN(j),
1790
            (void *)ret, HD(j)->cp);
1791
 
1792
   if (HD(j)->cp_stat[i] == IGNORE) {
1793
      HD(j)->cp_stat[i] = FREE;
1794
      return;
1795
      }
1796
   else if (HD(j)->cp_stat[i] == LOCKED) {
1797
      HD(j)->cp_stat[i] = FREE;
1798
      printk("%s: ihdlr, mbox %d unlocked, count %d.\n", BN(j), i,
1799
             HD(j)->iocount);
1800
      return;
1801
      }
1802
   else if (HD(j)->cp_stat[i] == FREE) {
1803
      printk("%s: ihdlr, mbox %d is free, count %d.\n", BN(j), i,
1804
             HD(j)->iocount);
1805
      return;
1806
      }
1807
   else if (HD(j)->cp_stat[i] == IN_RESET)
1808
      printk("%s: ihdlr, mbox %d is in reset.\n", BN(j), i);
1809
   else if (HD(j)->cp_stat[i] != IN_USE)
1810
      panic("%s: ihdlr, mbox %d, invalid cp_stat: %d.\n",
1811
            BN(j), i, HD(j)->cp_stat[i]);
1812
 
1813
   HD(j)->cp_stat[i] = FREE;
1814
   SCpnt = cpp->SCpnt;
1815
 
1816
   if (SCpnt == NULL) panic("%s: ihdlr, mbox %d, SCpnt == NULL.\n", BN(j), i);
1817
 
1818
   if (SCpnt->host_scribble == NULL)
1819
      panic("%s: ihdlr, mbox %d, pid %ld, SCpnt %p garbled.\n", BN(j), i,
1820
            SCpnt->pid, SCpnt);
1821
 
1822
   if (*(unsigned int *)SCpnt->host_scribble != i)
1823
      panic("%s: ihdlr, mbox %d, pid %ld, index mismatch %d.\n",
1824
            BN(j), i, SCpnt->pid, *(unsigned int *)SCpnt->host_scribble);
1825
 
1826
   if (linked_comm && SCpnt->device->queue_depth > 2
1827
                                     && TLDEV(SCpnt->device->type))
1828
      flush_dev(SCpnt->device, SCpnt->request.sector, j, TRUE);
1829
 
1830
   tstatus = status_byte(spp->target_status);
1831
 
1832
#if defined(DEBUG_GENERATE_ERRORS)
1833
   if ((HD(j)->iocount > 500) && ((HD(j)->iocount % 200) < 2))
1834
                                           spp->adapter_status = 0x01;
1835
#endif
1836
 
1837
   switch (spp->adapter_status) {
1838
      case ASOK:     /* status OK */
1839
 
1840
         /* Forces a reset if a disk drive keeps returning BUSY */
1841
         if (tstatus == BUSY && SCpnt->device->type != TYPE_TAPE)
1842
            status = DID_ERROR << 16;
1843
 
1844
         /* If there was a bus reset, redo operation on each target */
1845
         else if (tstatus != GOOD && SCpnt->device->type == TYPE_DISK
1846
                  && HD(j)->target_redo[SCpnt->target][SCpnt->channel])
1847
            status = DID_BUS_BUSY << 16;
1848
 
1849
         /* Works around a flaw in scsi.c */
1850
         else if (tstatus == CHECK_CONDITION
1851
                  && SCpnt->device->type == TYPE_DISK
1852
                  && (SCpnt->sense_buffer[2] & 0xf) == RECOVERED_ERROR)
1853
            status = DID_BUS_BUSY << 16;
1854
 
1855
         else
1856
            status = DID_OK << 16;
1857
 
1858
         if (tstatus == GOOD)
1859
            HD(j)->target_redo[SCpnt->target][SCpnt->channel] = FALSE;
1860
 
1861
         if (spp->target_status && SCpnt->device->type == TYPE_DISK)
1862
            printk("%s: ihdlr, target %d.%d:%d, pid %ld, "\
1863
                   "target_status 0x%x, sense key 0x%x.\n", BN(j),
1864
                   SCpnt->channel, SCpnt->target, SCpnt->lun,
1865
                   SCpnt->pid, spp->target_status,
1866
                   SCpnt->sense_buffer[2]);
1867
 
1868
         HD(j)->target_to[SCpnt->target][SCpnt->channel] = 0;
1869
 
1870
         if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0;
1871
 
1872
         break;
1873
      case ASST:     /* Selection Time Out */
1874
 
1875
         if (HD(j)->target_to[SCpnt->target][SCpnt->channel] > 1)
1876
            status = DID_ERROR << 16;
1877
         else {
1878
            status = DID_TIME_OUT << 16;
1879
            HD(j)->target_to[SCpnt->target][SCpnt->channel]++;
1880
            }
1881
 
1882
         break;
1883
 
1884
      /* Perform a limited number of internal retries */
1885
      case 0x93:     /* Unexpected bus free */
1886
      case 0x94:     /* Target bus phase sequence failure */
1887
      case 0x96:     /* Illegal SCSI command */
1888
      case 0xa3:     /* SCSI bus reset error */
1889
 
1890
         for (c = 0; c <= sh[j]->max_channel; c++)
1891
            for (k = 0; k < sh[j]->max_id; k++)
1892
               HD(j)->target_redo[k][c] = TRUE;
1893
 
1894
 
1895
      case 0x92:     /* Data over/under-run */
1896
 
1897
         if (SCpnt->device->type != TYPE_TAPE
1898
             && HD(j)->retries < MAX_INTERNAL_RETRIES) {
1899
 
1900
#if defined(DID_SOFT_ERROR)
1901
            status = DID_SOFT_ERROR << 16;
1902
#else
1903
            status = DID_BUS_BUSY << 16;
1904
#endif
1905
 
1906
            HD(j)->retries++;
1907
            HD(j)->last_retried_pid = SCpnt->pid;
1908
            }
1909
         else
1910
            status = DID_ERROR << 16;
1911
 
1912
         break;
1913
      case 0x01:     /* Invalid command */
1914
      case 0x02:     /* Invalid parameters */
1915
      case 0x03:     /* Invalid data list */
1916
      case 0x84:     /* SCSI bus abort error */
1917
      case 0x9b:     /* Auto request sense error */
1918
      case 0x9f:     /* Unexpected command complete message error */
1919
      case 0xff:     /* Invalid parameter in the S/G list */
1920
      default:
1921
         status = DID_ERROR << 16;
1922
         break;
1923
      }
1924
 
1925
   SCpnt->result = status | spp->target_status;
1926
 
1927
#if defined(DEBUG_INTERRUPT)
1928
   if (SCpnt->result || do_trace)
1929
#else
1930
   if ((spp->adapter_status != ASOK && HD(j)->iocount >  1000) ||
1931
       (spp->adapter_status != ASOK &&
1932
        spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
1933
        do_trace || msg_byte(spp->target_status))
1934
#endif
1935
      printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\
1936
             " target %d.%d:%d, pid %ld, reg 0x%x, count %d.\n",
1937
             BN(j), i, spp->adapter_status, spp->target_status,
1938
             SCpnt->channel, SCpnt->target, SCpnt->lun, SCpnt->pid,
1939
             reg, HD(j)->iocount);
1940
 
1941
   /* Set the command state to inactive */
1942
   SCpnt->host_scribble = NULL;
1943
 
1944
   SCpnt->scsi_done(SCpnt);
1945
 
1946
   if (do_trace) printk("%s: ihdlr, exit, irq %d, count %d.\n", BN(j), irq,
1947
                        HD(j)->iocount);
1948
 
1949
   return;
1950
}
1951
 
1952
static void do_interrupt_handler(int irq, void *shap, struct pt_regs *regs) {
1953
   unsigned int j;
1954
   IRQ_FLAGS
1955
   SPIN_FLAGS
1956
 
1957
   /* Check if the interrupt must be processed by this handler */
1958
   if ((j = (unsigned int)((char *)shap - sha)) >= num_boards) return;
1959
 
1960
   SPIN_LOCK_SAVE
1961
   IRQ_LOCK_SAVE
1962
   ihdlr(irq, j);
1963
   IRQ_UNLOCK_RESTORE
1964
   SPIN_UNLOCK_RESTORE
1965
}
1966
 
1967
int u14_34f_release(struct Scsi_Host *shpnt) {
1968
   unsigned int i, j;
1969
   IRQ_FLAGS
1970
 
1971
   IRQ_LOCK_SAVE
1972
 
1973
   for (j = 0; sh[j] != NULL && sh[j] != shpnt; j++);
1974
 
1975
   if (sh[j] == NULL) panic("%s: release, invalid Scsi_Host pointer.\n",
1976
                            driver_name);
1977
 
1978
   for (i = 0; i < sh[j]->can_queue; i++)
1979
      if ((&HD(j)->cp[i])->sglist) kfree((&HD(j)->cp[i])->sglist);
1980
 
1981
   free_irq(sh[j]->irq, &sha[j]);
1982
 
1983
   if (sh[j]->dma_channel != NO_DMA) free_dma(sh[j]->dma_channel);
1984
 
1985
   release_region(sh[j]->io_port, sh[j]->n_io_port);
1986
   scsi_unregister(sh[j]);
1987
   IRQ_UNLOCK_RESTORE
1988
   return FALSE;
1989
}
1990
 
1991
#if defined(MODULE)
1992
Scsi_Host_Template driver_template = ULTRASTOR_14_34F;
1993
 
1994
#include "scsi_module.c"
1995
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.