3 Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
5 Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
6 Portions Copyright 2002 by Mylex (An IBM Business Unit)
8 This program is free software; you may redistribute and/or modify it under
9 the terms of the GNU General Public License Version 2 as published by the
10 Free Software Foundation.
12 This program is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
20 #define DAC960_DriverVersion "2.5.49"
21 #define DAC960_DriverDate "21 Aug 2007"
24 #include <linux/compiler.h>
25 #include <linux/module.h>
26 #include <linux/types.h>
27 #include <linux/miscdevice.h>
28 #include <linux/blkdev.h>
29 #include <linux/bio.h>
30 #include <linux/completion.h>
31 #include <linux/delay.h>
32 #include <linux/genhd.h>
33 #include <linux/hdreg.h>
34 #include <linux/blkpg.h>
35 #include <linux/dma-mapping.h>
36 #include <linux/interrupt.h>
37 #include <linux/ioport.h>
39 #include <linux/slab.h>
40 #include <linux/mutex.h>
41 #include <linux/proc_fs.h>
42 #include <linux/seq_file.h>
43 #include <linux/reboot.h>
44 #include <linux/spinlock.h>
45 #include <linux/timer.h>
46 #include <linux/pci.h>
47 #include <linux/init.h>
48 #include <linux/jiffies.h>
49 #include <linux/random.h>
50 #include <linux/scatterlist.h>
52 #include <linux/uaccess.h>
55 #define DAC960_GAM_MINOR 252
58 static DEFINE_MUTEX(DAC960_mutex
);
59 static DAC960_Controller_T
*DAC960_Controllers
[DAC960_MaxControllers
];
60 static int DAC960_ControllerCount
;
61 static struct proc_dir_entry
*DAC960_ProcDirectoryEntry
;
63 static long disk_size(DAC960_Controller_T
*p
, int drive_nr
)
65 if (p
->FirmwareType
== DAC960_V1_Controller
) {
66 if (drive_nr
>= p
->LogicalDriveCount
)
68 return p
->V1
.LogicalDriveInformation
[drive_nr
].
71 DAC960_V2_LogicalDeviceInfo_T
*i
=
72 p
->V2
.LogicalDeviceInformation
[drive_nr
];
75 return i
->ConfigurableDeviceSize
;
79 static int DAC960_open(struct block_device
*bdev
, fmode_t mode
)
81 struct gendisk
*disk
= bdev
->bd_disk
;
82 DAC960_Controller_T
*p
= disk
->queue
->queuedata
;
83 int drive_nr
= (long)disk
->private_data
;
86 mutex_lock(&DAC960_mutex
);
87 if (p
->FirmwareType
== DAC960_V1_Controller
) {
88 if (p
->V1
.LogicalDriveInformation
[drive_nr
].
89 LogicalDriveState
== DAC960_V1_LogicalDrive_Offline
)
92 DAC960_V2_LogicalDeviceInfo_T
*i
=
93 p
->V2
.LogicalDeviceInformation
[drive_nr
];
94 if (!i
|| i
->LogicalDeviceState
== DAC960_V2_LogicalDevice_Offline
)
98 check_disk_change(bdev
);
100 if (!get_capacity(p
->disks
[drive_nr
]))
104 mutex_unlock(&DAC960_mutex
);
108 static int DAC960_getgeo(struct block_device
*bdev
, struct hd_geometry
*geo
)
110 struct gendisk
*disk
= bdev
->bd_disk
;
111 DAC960_Controller_T
*p
= disk
->queue
->queuedata
;
112 int drive_nr
= (long)disk
->private_data
;
114 if (p
->FirmwareType
== DAC960_V1_Controller
) {
115 geo
->heads
= p
->V1
.GeometryTranslationHeads
;
116 geo
->sectors
= p
->V1
.GeometryTranslationSectors
;
117 geo
->cylinders
= p
->V1
.LogicalDriveInformation
[drive_nr
].
118 LogicalDriveSize
/ (geo
->heads
* geo
->sectors
);
120 DAC960_V2_LogicalDeviceInfo_T
*i
=
121 p
->V2
.LogicalDeviceInformation
[drive_nr
];
122 switch (i
->DriveGeometry
) {
123 case DAC960_V2_Geometry_128_32
:
127 case DAC960_V2_Geometry_255_63
:
132 DAC960_Error("Illegal Logical Device Geometry %d\n",
133 p
, i
->DriveGeometry
);
137 geo
->cylinders
= i
->ConfigurableDeviceSize
/
138 (geo
->heads
* geo
->sectors
);
144 static unsigned int DAC960_check_events(struct gendisk
*disk
,
145 unsigned int clearing
)
147 DAC960_Controller_T
*p
= disk
->queue
->queuedata
;
148 int drive_nr
= (long)disk
->private_data
;
150 if (!p
->LogicalDriveInitiallyAccessible
[drive_nr
])
151 return DISK_EVENT_MEDIA_CHANGE
;
155 static int DAC960_revalidate_disk(struct gendisk
*disk
)
157 DAC960_Controller_T
*p
= disk
->queue
->queuedata
;
158 int unit
= (long)disk
->private_data
;
160 set_capacity(disk
, disk_size(p
, unit
));
164 static const struct block_device_operations DAC960_BlockDeviceOperations
= {
165 .owner
= THIS_MODULE
,
167 .getgeo
= DAC960_getgeo
,
168 .check_events
= DAC960_check_events
,
169 .revalidate_disk
= DAC960_revalidate_disk
,
174 DAC960_AnnounceDriver announces the Driver Version and Date, Author's Name,
175 Copyright Notice, and Electronic Mail Address.
178 static void DAC960_AnnounceDriver(DAC960_Controller_T
*Controller
)
180 DAC960_Announce("***** DAC960 RAID Driver Version "
181 DAC960_DriverVersion
" of "
182 DAC960_DriverDate
" *****\n", Controller
);
183 DAC960_Announce("Copyright 1998-2001 by Leonard N. Zubkoff "
184 "<lnz@dandelion.com>\n", Controller
);
189 DAC960_Failure prints a standardized error message, and then returns false.
192 static bool DAC960_Failure(DAC960_Controller_T
*Controller
,
193 unsigned char *ErrorMessage
)
195 DAC960_Error("While configuring DAC960 PCI RAID Controller at\n",
197 if (Controller
->IO_Address
== 0)
198 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
199 "PCI Address 0x%X\n", Controller
,
200 Controller
->Bus
, Controller
->Device
,
201 Controller
->Function
, Controller
->PCI_Address
);
202 else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
203 "0x%X PCI Address 0x%X\n", Controller
,
204 Controller
->Bus
, Controller
->Device
,
205 Controller
->Function
, Controller
->IO_Address
,
206 Controller
->PCI_Address
);
207 DAC960_Error("%s FAILED - DETACHING\n", Controller
, ErrorMessage
);
212 init_dma_loaf() and slice_dma_loaf() are helper functions for
213 aggregating the dma-mapped memory for a well-known collection of
214 data structures that are of different lengths.
216 These routines don't guarantee any alignment. The caller must
217 include any space needed for alignment in the sizes of the structures
221 static bool init_dma_loaf(struct pci_dev
*dev
, struct dma_loaf
*loaf
,
225 dma_addr_t dma_handle
;
227 cpu_addr
= pci_alloc_consistent(dev
, len
, &dma_handle
);
228 if (cpu_addr
== NULL
)
231 loaf
->cpu_free
= loaf
->cpu_base
= cpu_addr
;
232 loaf
->dma_free
=loaf
->dma_base
= dma_handle
;
234 memset(cpu_addr
, 0, len
);
238 static void *slice_dma_loaf(struct dma_loaf
*loaf
, size_t len
,
239 dma_addr_t
*dma_handle
)
241 void *cpu_end
= loaf
->cpu_free
+ len
;
242 void *cpu_addr
= loaf
->cpu_free
;
244 BUG_ON(cpu_end
> loaf
->cpu_base
+ loaf
->length
);
245 *dma_handle
= loaf
->dma_free
;
246 loaf
->cpu_free
= cpu_end
;
247 loaf
->dma_free
+= len
;
251 static void free_dma_loaf(struct pci_dev
*dev
, struct dma_loaf
*loaf_handle
)
253 if (loaf_handle
->cpu_base
!= NULL
)
254 pci_free_consistent(dev
, loaf_handle
->length
,
255 loaf_handle
->cpu_base
, loaf_handle
->dma_base
);
260 DAC960_CreateAuxiliaryStructures allocates and initializes the auxiliary
261 data structures for Controller. It returns true on success and false on
265 static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T
*Controller
)
267 int CommandAllocationLength
, CommandAllocationGroupSize
;
268 int CommandsRemaining
= 0, CommandIdentifier
, CommandGroupByteCount
;
269 void *AllocationPointer
= NULL
;
270 void *ScatterGatherCPU
= NULL
;
271 dma_addr_t ScatterGatherDMA
;
272 struct dma_pool
*ScatterGatherPool
;
273 void *RequestSenseCPU
= NULL
;
274 dma_addr_t RequestSenseDMA
;
275 struct dma_pool
*RequestSensePool
= NULL
;
277 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
279 CommandAllocationLength
= offsetof(DAC960_Command_T
, V1
.EndMarker
);
280 CommandAllocationGroupSize
= DAC960_V1_CommandAllocationGroupSize
;
281 ScatterGatherPool
= dma_pool_create("DAC960_V1_ScatterGather",
282 &Controller
->PCIDevice
->dev
,
283 DAC960_V1_ScatterGatherLimit
* sizeof(DAC960_V1_ScatterGatherSegment_T
),
284 sizeof(DAC960_V1_ScatterGatherSegment_T
), 0);
285 if (ScatterGatherPool
== NULL
)
286 return DAC960_Failure(Controller
,
287 "AUXILIARY STRUCTURE CREATION (SG)");
288 Controller
->ScatterGatherPool
= ScatterGatherPool
;
292 CommandAllocationLength
= offsetof(DAC960_Command_T
, V2
.EndMarker
);
293 CommandAllocationGroupSize
= DAC960_V2_CommandAllocationGroupSize
;
294 ScatterGatherPool
= dma_pool_create("DAC960_V2_ScatterGather",
295 &Controller
->PCIDevice
->dev
,
296 DAC960_V2_ScatterGatherLimit
* sizeof(DAC960_V2_ScatterGatherSegment_T
),
297 sizeof(DAC960_V2_ScatterGatherSegment_T
), 0);
298 if (ScatterGatherPool
== NULL
)
299 return DAC960_Failure(Controller
,
300 "AUXILIARY STRUCTURE CREATION (SG)");
301 RequestSensePool
= dma_pool_create("DAC960_V2_RequestSense",
302 &Controller
->PCIDevice
->dev
, sizeof(DAC960_SCSI_RequestSense_T
),
304 if (RequestSensePool
== NULL
) {
305 dma_pool_destroy(ScatterGatherPool
);
306 return DAC960_Failure(Controller
,
307 "AUXILIARY STRUCTURE CREATION (SG)");
309 Controller
->ScatterGatherPool
= ScatterGatherPool
;
310 Controller
->V2
.RequestSensePool
= RequestSensePool
;
312 Controller
->CommandAllocationGroupSize
= CommandAllocationGroupSize
;
313 Controller
->FreeCommands
= NULL
;
314 for (CommandIdentifier
= 1;
315 CommandIdentifier
<= Controller
->DriverQueueDepth
;
318 DAC960_Command_T
*Command
;
319 if (--CommandsRemaining
<= 0)
322 Controller
->DriverQueueDepth
- CommandIdentifier
+ 1;
323 if (CommandsRemaining
> CommandAllocationGroupSize
)
324 CommandsRemaining
= CommandAllocationGroupSize
;
325 CommandGroupByteCount
=
326 CommandsRemaining
* CommandAllocationLength
;
327 AllocationPointer
= kzalloc(CommandGroupByteCount
, GFP_ATOMIC
);
328 if (AllocationPointer
== NULL
)
329 return DAC960_Failure(Controller
,
330 "AUXILIARY STRUCTURE CREATION");
332 Command
= (DAC960_Command_T
*) AllocationPointer
;
333 AllocationPointer
+= CommandAllocationLength
;
334 Command
->CommandIdentifier
= CommandIdentifier
;
335 Command
->Controller
= Controller
;
336 Command
->Next
= Controller
->FreeCommands
;
337 Controller
->FreeCommands
= Command
;
338 Controller
->Commands
[CommandIdentifier
-1] = Command
;
339 ScatterGatherCPU
= dma_pool_alloc(ScatterGatherPool
, GFP_ATOMIC
,
341 if (ScatterGatherCPU
== NULL
)
342 return DAC960_Failure(Controller
, "AUXILIARY STRUCTURE CREATION");
344 if (RequestSensePool
!= NULL
) {
345 RequestSenseCPU
= dma_pool_alloc(RequestSensePool
, GFP_ATOMIC
,
347 if (RequestSenseCPU
== NULL
) {
348 dma_pool_free(ScatterGatherPool
, ScatterGatherCPU
,
350 return DAC960_Failure(Controller
,
351 "AUXILIARY STRUCTURE CREATION");
354 if (Controller
->FirmwareType
== DAC960_V1_Controller
) {
355 Command
->cmd_sglist
= Command
->V1
.ScatterList
;
356 Command
->V1
.ScatterGatherList
=
357 (DAC960_V1_ScatterGatherSegment_T
*)ScatterGatherCPU
;
358 Command
->V1
.ScatterGatherListDMA
= ScatterGatherDMA
;
359 sg_init_table(Command
->cmd_sglist
, DAC960_V1_ScatterGatherLimit
);
361 Command
->cmd_sglist
= Command
->V2
.ScatterList
;
362 Command
->V2
.ScatterGatherList
=
363 (DAC960_V2_ScatterGatherSegment_T
*)ScatterGatherCPU
;
364 Command
->V2
.ScatterGatherListDMA
= ScatterGatherDMA
;
365 Command
->V2
.RequestSense
=
366 (DAC960_SCSI_RequestSense_T
*)RequestSenseCPU
;
367 Command
->V2
.RequestSenseDMA
= RequestSenseDMA
;
368 sg_init_table(Command
->cmd_sglist
, DAC960_V2_ScatterGatherLimit
);
376 DAC960_DestroyAuxiliaryStructures deallocates the auxiliary data
377 structures for Controller.
380 static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T
*Controller
)
383 struct dma_pool
*ScatterGatherPool
= Controller
->ScatterGatherPool
;
384 struct dma_pool
*RequestSensePool
= NULL
;
385 void *ScatterGatherCPU
;
386 dma_addr_t ScatterGatherDMA
;
387 void *RequestSenseCPU
;
388 dma_addr_t RequestSenseDMA
;
389 DAC960_Command_T
*CommandGroup
= NULL
;
392 if (Controller
->FirmwareType
== DAC960_V2_Controller
)
393 RequestSensePool
= Controller
->V2
.RequestSensePool
;
395 Controller
->FreeCommands
= NULL
;
396 for (i
= 0; i
< Controller
->DriverQueueDepth
; i
++)
398 DAC960_Command_T
*Command
= Controller
->Commands
[i
];
403 if (Controller
->FirmwareType
== DAC960_V1_Controller
) {
404 ScatterGatherCPU
= (void *)Command
->V1
.ScatterGatherList
;
405 ScatterGatherDMA
= Command
->V1
.ScatterGatherListDMA
;
406 RequestSenseCPU
= NULL
;
407 RequestSenseDMA
= (dma_addr_t
)0;
409 ScatterGatherCPU
= (void *)Command
->V2
.ScatterGatherList
;
410 ScatterGatherDMA
= Command
->V2
.ScatterGatherListDMA
;
411 RequestSenseCPU
= (void *)Command
->V2
.RequestSense
;
412 RequestSenseDMA
= Command
->V2
.RequestSenseDMA
;
414 if (ScatterGatherCPU
!= NULL
)
415 dma_pool_free(ScatterGatherPool
, ScatterGatherCPU
, ScatterGatherDMA
);
416 if (RequestSenseCPU
!= NULL
)
417 dma_pool_free(RequestSensePool
, RequestSenseCPU
, RequestSenseDMA
);
419 if ((Command
->CommandIdentifier
420 % Controller
->CommandAllocationGroupSize
) == 1) {
422 * We can't free the group of commands until all of the
423 * request sense and scatter gather dma structures are free.
424 * Remember the beginning of the group, but don't free it
425 * until we've reached the beginning of the next group.
428 CommandGroup
= Command
;
430 Controller
->Commands
[i
] = NULL
;
434 if (Controller
->CombinedStatusBuffer
!= NULL
)
436 kfree(Controller
->CombinedStatusBuffer
);
437 Controller
->CombinedStatusBuffer
= NULL
;
438 Controller
->CurrentStatusBuffer
= NULL
;
441 dma_pool_destroy(ScatterGatherPool
);
442 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
445 dma_pool_destroy(RequestSensePool
);
447 for (i
= 0; i
< DAC960_MaxLogicalDrives
; i
++) {
448 kfree(Controller
->V2
.LogicalDeviceInformation
[i
]);
449 Controller
->V2
.LogicalDeviceInformation
[i
] = NULL
;
452 for (i
= 0; i
< DAC960_V2_MaxPhysicalDevices
; i
++)
454 kfree(Controller
->V2
.PhysicalDeviceInformation
[i
]);
455 Controller
->V2
.PhysicalDeviceInformation
[i
] = NULL
;
456 kfree(Controller
->V2
.InquiryUnitSerialNumber
[i
]);
457 Controller
->V2
.InquiryUnitSerialNumber
[i
] = NULL
;
463 DAC960_V1_ClearCommand clears critical fields of Command for DAC960 V1
464 Firmware Controllers.
467 static inline void DAC960_V1_ClearCommand(DAC960_Command_T
*Command
)
469 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
470 memset(CommandMailbox
, 0, sizeof(DAC960_V1_CommandMailbox_T
));
471 Command
->V1
.CommandStatus
= 0;
476 DAC960_V2_ClearCommand clears critical fields of Command for DAC960 V2
477 Firmware Controllers.
480 static inline void DAC960_V2_ClearCommand(DAC960_Command_T
*Command
)
482 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
483 memset(CommandMailbox
, 0, sizeof(DAC960_V2_CommandMailbox_T
));
484 Command
->V2
.CommandStatus
= 0;
489 DAC960_AllocateCommand allocates a Command structure from Controller's
490 free list. During driver initialization, a special initialization command
491 has been placed on the free list to guarantee that command allocation can
495 static inline DAC960_Command_T
*DAC960_AllocateCommand(DAC960_Controller_T
498 DAC960_Command_T
*Command
= Controller
->FreeCommands
;
499 if (Command
== NULL
) return NULL
;
500 Controller
->FreeCommands
= Command
->Next
;
501 Command
->Next
= NULL
;
507 DAC960_DeallocateCommand deallocates Command, returning it to Controller's
511 static inline void DAC960_DeallocateCommand(DAC960_Command_T
*Command
)
513 DAC960_Controller_T
*Controller
= Command
->Controller
;
515 Command
->Request
= NULL
;
516 Command
->Next
= Controller
->FreeCommands
;
517 Controller
->FreeCommands
= Command
;
522 DAC960_WaitForCommand waits for a wake_up on Controller's Command Wait Queue.
525 static void DAC960_WaitForCommand(DAC960_Controller_T
*Controller
)
527 spin_unlock_irq(&Controller
->queue_lock
);
528 __wait_event(Controller
->CommandWaitQueue
, Controller
->FreeCommands
);
529 spin_lock_irq(&Controller
->queue_lock
);
533 DAC960_GEM_QueueCommand queues Command for DAC960 GEM Series Controllers.
536 static void DAC960_GEM_QueueCommand(DAC960_Command_T
*Command
)
538 DAC960_Controller_T
*Controller
= Command
->Controller
;
539 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
540 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
541 DAC960_V2_CommandMailbox_T
*NextCommandMailbox
=
542 Controller
->V2
.NextCommandMailbox
;
544 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
545 DAC960_GEM_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
547 if (Controller
->V2
.PreviousCommandMailbox1
->Words
[0] == 0 ||
548 Controller
->V2
.PreviousCommandMailbox2
->Words
[0] == 0)
549 DAC960_GEM_MemoryMailboxNewCommand(ControllerBaseAddress
);
551 Controller
->V2
.PreviousCommandMailbox2
=
552 Controller
->V2
.PreviousCommandMailbox1
;
553 Controller
->V2
.PreviousCommandMailbox1
= NextCommandMailbox
;
555 if (++NextCommandMailbox
> Controller
->V2
.LastCommandMailbox
)
556 NextCommandMailbox
= Controller
->V2
.FirstCommandMailbox
;
558 Controller
->V2
.NextCommandMailbox
= NextCommandMailbox
;
562 DAC960_BA_QueueCommand queues Command for DAC960 BA Series Controllers.
565 static void DAC960_BA_QueueCommand(DAC960_Command_T
*Command
)
567 DAC960_Controller_T
*Controller
= Command
->Controller
;
568 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
569 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
570 DAC960_V2_CommandMailbox_T
*NextCommandMailbox
=
571 Controller
->V2
.NextCommandMailbox
;
572 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
573 DAC960_BA_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
574 if (Controller
->V2
.PreviousCommandMailbox1
->Words
[0] == 0 ||
575 Controller
->V2
.PreviousCommandMailbox2
->Words
[0] == 0)
576 DAC960_BA_MemoryMailboxNewCommand(ControllerBaseAddress
);
577 Controller
->V2
.PreviousCommandMailbox2
=
578 Controller
->V2
.PreviousCommandMailbox1
;
579 Controller
->V2
.PreviousCommandMailbox1
= NextCommandMailbox
;
580 if (++NextCommandMailbox
> Controller
->V2
.LastCommandMailbox
)
581 NextCommandMailbox
= Controller
->V2
.FirstCommandMailbox
;
582 Controller
->V2
.NextCommandMailbox
= NextCommandMailbox
;
587 DAC960_LP_QueueCommand queues Command for DAC960 LP Series Controllers.
590 static void DAC960_LP_QueueCommand(DAC960_Command_T
*Command
)
592 DAC960_Controller_T
*Controller
= Command
->Controller
;
593 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
594 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
595 DAC960_V2_CommandMailbox_T
*NextCommandMailbox
=
596 Controller
->V2
.NextCommandMailbox
;
597 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
598 DAC960_LP_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
599 if (Controller
->V2
.PreviousCommandMailbox1
->Words
[0] == 0 ||
600 Controller
->V2
.PreviousCommandMailbox2
->Words
[0] == 0)
601 DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress
);
602 Controller
->V2
.PreviousCommandMailbox2
=
603 Controller
->V2
.PreviousCommandMailbox1
;
604 Controller
->V2
.PreviousCommandMailbox1
= NextCommandMailbox
;
605 if (++NextCommandMailbox
> Controller
->V2
.LastCommandMailbox
)
606 NextCommandMailbox
= Controller
->V2
.FirstCommandMailbox
;
607 Controller
->V2
.NextCommandMailbox
= NextCommandMailbox
;
612 DAC960_LA_QueueCommandDualMode queues Command for DAC960 LA Series
613 Controllers with Dual Mode Firmware.
616 static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T
*Command
)
618 DAC960_Controller_T
*Controller
= Command
->Controller
;
619 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
620 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
621 DAC960_V1_CommandMailbox_T
*NextCommandMailbox
=
622 Controller
->V1
.NextCommandMailbox
;
623 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
624 DAC960_LA_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
625 if (Controller
->V1
.PreviousCommandMailbox1
->Words
[0] == 0 ||
626 Controller
->V1
.PreviousCommandMailbox2
->Words
[0] == 0)
627 DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress
);
628 Controller
->V1
.PreviousCommandMailbox2
=
629 Controller
->V1
.PreviousCommandMailbox1
;
630 Controller
->V1
.PreviousCommandMailbox1
= NextCommandMailbox
;
631 if (++NextCommandMailbox
> Controller
->V1
.LastCommandMailbox
)
632 NextCommandMailbox
= Controller
->V1
.FirstCommandMailbox
;
633 Controller
->V1
.NextCommandMailbox
= NextCommandMailbox
;
638 DAC960_LA_QueueCommandSingleMode queues Command for DAC960 LA Series
639 Controllers with Single Mode Firmware.
642 static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T
*Command
)
644 DAC960_Controller_T
*Controller
= Command
->Controller
;
645 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
646 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
647 DAC960_V1_CommandMailbox_T
*NextCommandMailbox
=
648 Controller
->V1
.NextCommandMailbox
;
649 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
650 DAC960_LA_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
651 if (Controller
->V1
.PreviousCommandMailbox1
->Words
[0] == 0 ||
652 Controller
->V1
.PreviousCommandMailbox2
->Words
[0] == 0)
653 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress
);
654 Controller
->V1
.PreviousCommandMailbox2
=
655 Controller
->V1
.PreviousCommandMailbox1
;
656 Controller
->V1
.PreviousCommandMailbox1
= NextCommandMailbox
;
657 if (++NextCommandMailbox
> Controller
->V1
.LastCommandMailbox
)
658 NextCommandMailbox
= Controller
->V1
.FirstCommandMailbox
;
659 Controller
->V1
.NextCommandMailbox
= NextCommandMailbox
;
664 DAC960_PG_QueueCommandDualMode queues Command for DAC960 PG Series
665 Controllers with Dual Mode Firmware.
668 static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T
*Command
)
670 DAC960_Controller_T
*Controller
= Command
->Controller
;
671 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
672 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
673 DAC960_V1_CommandMailbox_T
*NextCommandMailbox
=
674 Controller
->V1
.NextCommandMailbox
;
675 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
676 DAC960_PG_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
677 if (Controller
->V1
.PreviousCommandMailbox1
->Words
[0] == 0 ||
678 Controller
->V1
.PreviousCommandMailbox2
->Words
[0] == 0)
679 DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress
);
680 Controller
->V1
.PreviousCommandMailbox2
=
681 Controller
->V1
.PreviousCommandMailbox1
;
682 Controller
->V1
.PreviousCommandMailbox1
= NextCommandMailbox
;
683 if (++NextCommandMailbox
> Controller
->V1
.LastCommandMailbox
)
684 NextCommandMailbox
= Controller
->V1
.FirstCommandMailbox
;
685 Controller
->V1
.NextCommandMailbox
= NextCommandMailbox
;
690 DAC960_PG_QueueCommandSingleMode queues Command for DAC960 PG Series
691 Controllers with Single Mode Firmware.
694 static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T
*Command
)
696 DAC960_Controller_T
*Controller
= Command
->Controller
;
697 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
698 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
699 DAC960_V1_CommandMailbox_T
*NextCommandMailbox
=
700 Controller
->V1
.NextCommandMailbox
;
701 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
702 DAC960_PG_WriteCommandMailbox(NextCommandMailbox
, CommandMailbox
);
703 if (Controller
->V1
.PreviousCommandMailbox1
->Words
[0] == 0 ||
704 Controller
->V1
.PreviousCommandMailbox2
->Words
[0] == 0)
705 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress
);
706 Controller
->V1
.PreviousCommandMailbox2
=
707 Controller
->V1
.PreviousCommandMailbox1
;
708 Controller
->V1
.PreviousCommandMailbox1
= NextCommandMailbox
;
709 if (++NextCommandMailbox
> Controller
->V1
.LastCommandMailbox
)
710 NextCommandMailbox
= Controller
->V1
.FirstCommandMailbox
;
711 Controller
->V1
.NextCommandMailbox
= NextCommandMailbox
;
716 DAC960_PD_QueueCommand queues Command for DAC960 PD Series Controllers.
719 static void DAC960_PD_QueueCommand(DAC960_Command_T
*Command
)
721 DAC960_Controller_T
*Controller
= Command
->Controller
;
722 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
723 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
724 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
725 while (DAC960_PD_MailboxFullP(ControllerBaseAddress
))
727 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress
, CommandMailbox
);
728 DAC960_PD_NewCommand(ControllerBaseAddress
);
733 DAC960_P_QueueCommand queues Command for DAC960 P Series Controllers.
736 static void DAC960_P_QueueCommand(DAC960_Command_T
*Command
)
738 DAC960_Controller_T
*Controller
= Command
->Controller
;
739 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
740 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
741 CommandMailbox
->Common
.CommandIdentifier
= Command
->CommandIdentifier
;
742 switch (CommandMailbox
->Common
.CommandOpcode
)
744 case DAC960_V1_Enquiry
:
745 CommandMailbox
->Common
.CommandOpcode
= DAC960_V1_Enquiry_Old
;
747 case DAC960_V1_GetDeviceState
:
748 CommandMailbox
->Common
.CommandOpcode
= DAC960_V1_GetDeviceState_Old
;
751 CommandMailbox
->Common
.CommandOpcode
= DAC960_V1_Read_Old
;
752 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox
);
754 case DAC960_V1_Write
:
755 CommandMailbox
->Common
.CommandOpcode
= DAC960_V1_Write_Old
;
756 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox
);
758 case DAC960_V1_ReadWithScatterGather
:
759 CommandMailbox
->Common
.CommandOpcode
=
760 DAC960_V1_ReadWithScatterGather_Old
;
761 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox
);
763 case DAC960_V1_WriteWithScatterGather
:
764 CommandMailbox
->Common
.CommandOpcode
=
765 DAC960_V1_WriteWithScatterGather_Old
;
766 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox
);
771 while (DAC960_PD_MailboxFullP(ControllerBaseAddress
))
773 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress
, CommandMailbox
);
774 DAC960_PD_NewCommand(ControllerBaseAddress
);
779 DAC960_ExecuteCommand executes Command and waits for completion.
782 static void DAC960_ExecuteCommand(DAC960_Command_T
*Command
)
784 DAC960_Controller_T
*Controller
= Command
->Controller
;
785 DECLARE_COMPLETION_ONSTACK(Completion
);
787 Command
->Completion
= &Completion
;
789 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
790 DAC960_QueueCommand(Command
);
791 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
795 wait_for_completion(&Completion
);
800 DAC960_V1_ExecuteType3 executes a DAC960 V1 Firmware Controller Type 3
801 Command and waits for completion. It returns true on success and false
805 static bool DAC960_V1_ExecuteType3(DAC960_Controller_T
*Controller
,
806 DAC960_V1_CommandOpcode_T CommandOpcode
,
809 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
810 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
811 DAC960_V1_CommandStatus_T CommandStatus
;
812 DAC960_V1_ClearCommand(Command
);
813 Command
->CommandType
= DAC960_ImmediateCommand
;
814 CommandMailbox
->Type3
.CommandOpcode
= CommandOpcode
;
815 CommandMailbox
->Type3
.BusAddress
= DataDMA
;
816 DAC960_ExecuteCommand(Command
);
817 CommandStatus
= Command
->V1
.CommandStatus
;
818 DAC960_DeallocateCommand(Command
);
819 return (CommandStatus
== DAC960_V1_NormalCompletion
);
824 DAC960_V1_ExecuteTypeB executes a DAC960 V1 Firmware Controller Type 3B
825 Command and waits for completion. It returns true on success and false
829 static bool DAC960_V1_ExecuteType3B(DAC960_Controller_T
*Controller
,
830 DAC960_V1_CommandOpcode_T CommandOpcode
,
831 unsigned char CommandOpcode2
,
834 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
835 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
836 DAC960_V1_CommandStatus_T CommandStatus
;
837 DAC960_V1_ClearCommand(Command
);
838 Command
->CommandType
= DAC960_ImmediateCommand
;
839 CommandMailbox
->Type3B
.CommandOpcode
= CommandOpcode
;
840 CommandMailbox
->Type3B
.CommandOpcode2
= CommandOpcode2
;
841 CommandMailbox
->Type3B
.BusAddress
= DataDMA
;
842 DAC960_ExecuteCommand(Command
);
843 CommandStatus
= Command
->V1
.CommandStatus
;
844 DAC960_DeallocateCommand(Command
);
845 return (CommandStatus
== DAC960_V1_NormalCompletion
);
850 DAC960_V1_ExecuteType3D executes a DAC960 V1 Firmware Controller Type 3D
851 Command and waits for completion. It returns true on success and false
855 static bool DAC960_V1_ExecuteType3D(DAC960_Controller_T
*Controller
,
856 DAC960_V1_CommandOpcode_T CommandOpcode
,
857 unsigned char Channel
,
858 unsigned char TargetID
,
861 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
862 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
863 DAC960_V1_CommandStatus_T CommandStatus
;
864 DAC960_V1_ClearCommand(Command
);
865 Command
->CommandType
= DAC960_ImmediateCommand
;
866 CommandMailbox
->Type3D
.CommandOpcode
= CommandOpcode
;
867 CommandMailbox
->Type3D
.Channel
= Channel
;
868 CommandMailbox
->Type3D
.TargetID
= TargetID
;
869 CommandMailbox
->Type3D
.BusAddress
= DataDMA
;
870 DAC960_ExecuteCommand(Command
);
871 CommandStatus
= Command
->V1
.CommandStatus
;
872 DAC960_DeallocateCommand(Command
);
873 return (CommandStatus
== DAC960_V1_NormalCompletion
);
878 DAC960_V2_GeneralInfo executes a DAC960 V2 Firmware General Information
879 Reading IOCTL Command and waits for completion. It returns true on success
880 and false on failure.
882 Return data in The controller's HealthStatusBuffer, which is dma-able memory
885 static bool DAC960_V2_GeneralInfo(DAC960_Controller_T
*Controller
)
887 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
888 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
889 DAC960_V2_CommandStatus_T CommandStatus
;
890 DAC960_V2_ClearCommand(Command
);
891 Command
->CommandType
= DAC960_ImmediateCommand
;
892 CommandMailbox
->Common
.CommandOpcode
= DAC960_V2_IOCTL
;
893 CommandMailbox
->Common
.CommandControlBits
894 .DataTransferControllerToHost
= true;
895 CommandMailbox
->Common
.CommandControlBits
896 .NoAutoRequestSense
= true;
897 CommandMailbox
->Common
.DataTransferSize
= sizeof(DAC960_V2_HealthStatusBuffer_T
);
898 CommandMailbox
->Common
.IOCTL_Opcode
= DAC960_V2_GetHealthStatus
;
899 CommandMailbox
->Common
.DataTransferMemoryAddress
900 .ScatterGatherSegments
[0]
901 .SegmentDataPointer
=
902 Controller
->V2
.HealthStatusBufferDMA
;
903 CommandMailbox
->Common
.DataTransferMemoryAddress
904 .ScatterGatherSegments
[0]
906 CommandMailbox
->Common
.DataTransferSize
;
907 DAC960_ExecuteCommand(Command
);
908 CommandStatus
= Command
->V2
.CommandStatus
;
909 DAC960_DeallocateCommand(Command
);
910 return (CommandStatus
== DAC960_V2_NormalCompletion
);
915 DAC960_V2_ControllerInfo executes a DAC960 V2 Firmware Controller
916 Information Reading IOCTL Command and waits for completion. It returns
917 true on success and false on failure.
919 Data is returned in the controller's V2.NewControllerInformation dma-able
923 static bool DAC960_V2_NewControllerInfo(DAC960_Controller_T
*Controller
)
925 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
926 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
927 DAC960_V2_CommandStatus_T CommandStatus
;
928 DAC960_V2_ClearCommand(Command
);
929 Command
->CommandType
= DAC960_ImmediateCommand
;
930 CommandMailbox
->ControllerInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
931 CommandMailbox
->ControllerInfo
.CommandControlBits
932 .DataTransferControllerToHost
= true;
933 CommandMailbox
->ControllerInfo
.CommandControlBits
934 .NoAutoRequestSense
= true;
935 CommandMailbox
->ControllerInfo
.DataTransferSize
= sizeof(DAC960_V2_ControllerInfo_T
);
936 CommandMailbox
->ControllerInfo
.ControllerNumber
= 0;
937 CommandMailbox
->ControllerInfo
.IOCTL_Opcode
= DAC960_V2_GetControllerInfo
;
938 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
939 .ScatterGatherSegments
[0]
940 .SegmentDataPointer
=
941 Controller
->V2
.NewControllerInformationDMA
;
942 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
943 .ScatterGatherSegments
[0]
945 CommandMailbox
->ControllerInfo
.DataTransferSize
;
946 DAC960_ExecuteCommand(Command
);
947 CommandStatus
= Command
->V2
.CommandStatus
;
948 DAC960_DeallocateCommand(Command
);
949 return (CommandStatus
== DAC960_V2_NormalCompletion
);
954 DAC960_V2_LogicalDeviceInfo executes a DAC960 V2 Firmware Controller Logical
955 Device Information Reading IOCTL Command and waits for completion. It
956 returns true on success and false on failure.
958 Data is returned in the controller's V2.NewLogicalDeviceInformation
961 static bool DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T
*Controller
,
962 unsigned short LogicalDeviceNumber
)
964 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
965 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
966 DAC960_V2_CommandStatus_T CommandStatus
;
968 DAC960_V2_ClearCommand(Command
);
969 Command
->CommandType
= DAC960_ImmediateCommand
;
970 CommandMailbox
->LogicalDeviceInfo
.CommandOpcode
=
972 CommandMailbox
->LogicalDeviceInfo
.CommandControlBits
973 .DataTransferControllerToHost
= true;
974 CommandMailbox
->LogicalDeviceInfo
.CommandControlBits
975 .NoAutoRequestSense
= true;
976 CommandMailbox
->LogicalDeviceInfo
.DataTransferSize
=
977 sizeof(DAC960_V2_LogicalDeviceInfo_T
);
978 CommandMailbox
->LogicalDeviceInfo
.LogicalDevice
.LogicalDeviceNumber
=
980 CommandMailbox
->LogicalDeviceInfo
.IOCTL_Opcode
= DAC960_V2_GetLogicalDeviceInfoValid
;
981 CommandMailbox
->LogicalDeviceInfo
.DataTransferMemoryAddress
982 .ScatterGatherSegments
[0]
983 .SegmentDataPointer
=
984 Controller
->V2
.NewLogicalDeviceInformationDMA
;
985 CommandMailbox
->LogicalDeviceInfo
.DataTransferMemoryAddress
986 .ScatterGatherSegments
[0]
988 CommandMailbox
->LogicalDeviceInfo
.DataTransferSize
;
989 DAC960_ExecuteCommand(Command
);
990 CommandStatus
= Command
->V2
.CommandStatus
;
991 DAC960_DeallocateCommand(Command
);
992 return (CommandStatus
== DAC960_V2_NormalCompletion
);
997 DAC960_V2_PhysicalDeviceInfo executes a DAC960 V2 Firmware Controller "Read
998 Physical Device Information" IOCTL Command and waits for completion. It
999 returns true on success and false on failure.
1001 The Channel, TargetID, LogicalUnit arguments should be 0 the first time
1002 this function is called for a given controller. This will return data
1003 for the "first" device on that controller. The returned data includes a
1004 Channel, TargetID, LogicalUnit that can be passed in to this routine to
1005 get data for the NEXT device on that controller.
1007 Data is stored in the controller's V2.NewPhysicalDeviceInfo dma-able
1012 static bool DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T
*Controller
,
1013 unsigned char Channel
,
1014 unsigned char TargetID
,
1015 unsigned char LogicalUnit
)
1017 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
1018 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
1019 DAC960_V2_CommandStatus_T CommandStatus
;
1021 DAC960_V2_ClearCommand(Command
);
1022 Command
->CommandType
= DAC960_ImmediateCommand
;
1023 CommandMailbox
->PhysicalDeviceInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
1024 CommandMailbox
->PhysicalDeviceInfo
.CommandControlBits
1025 .DataTransferControllerToHost
= true;
1026 CommandMailbox
->PhysicalDeviceInfo
.CommandControlBits
1027 .NoAutoRequestSense
= true;
1028 CommandMailbox
->PhysicalDeviceInfo
.DataTransferSize
=
1029 sizeof(DAC960_V2_PhysicalDeviceInfo_T
);
1030 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.LogicalUnit
= LogicalUnit
;
1031 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.TargetID
= TargetID
;
1032 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.Channel
= Channel
;
1033 CommandMailbox
->PhysicalDeviceInfo
.IOCTL_Opcode
=
1034 DAC960_V2_GetPhysicalDeviceInfoValid
;
1035 CommandMailbox
->PhysicalDeviceInfo
.DataTransferMemoryAddress
1036 .ScatterGatherSegments
[0]
1037 .SegmentDataPointer
=
1038 Controller
->V2
.NewPhysicalDeviceInformationDMA
;
1039 CommandMailbox
->PhysicalDeviceInfo
.DataTransferMemoryAddress
1040 .ScatterGatherSegments
[0]
1042 CommandMailbox
->PhysicalDeviceInfo
.DataTransferSize
;
1043 DAC960_ExecuteCommand(Command
);
1044 CommandStatus
= Command
->V2
.CommandStatus
;
1045 DAC960_DeallocateCommand(Command
);
1046 return (CommandStatus
== DAC960_V2_NormalCompletion
);
1050 static void DAC960_V2_ConstructNewUnitSerialNumber(
1051 DAC960_Controller_T
*Controller
,
1052 DAC960_V2_CommandMailbox_T
*CommandMailbox
, int Channel
, int TargetID
,
1055 CommandMailbox
->SCSI_10
.CommandOpcode
= DAC960_V2_SCSI_10_Passthru
;
1056 CommandMailbox
->SCSI_10
.CommandControlBits
1057 .DataTransferControllerToHost
= true;
1058 CommandMailbox
->SCSI_10
.CommandControlBits
1059 .NoAutoRequestSense
= true;
1060 CommandMailbox
->SCSI_10
.DataTransferSize
=
1061 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
1062 CommandMailbox
->SCSI_10
.PhysicalDevice
.LogicalUnit
= LogicalUnit
;
1063 CommandMailbox
->SCSI_10
.PhysicalDevice
.TargetID
= TargetID
;
1064 CommandMailbox
->SCSI_10
.PhysicalDevice
.Channel
= Channel
;
1065 CommandMailbox
->SCSI_10
.CDBLength
= 6;
1066 CommandMailbox
->SCSI_10
.SCSI_CDB
[0] = 0x12; /* INQUIRY */
1067 CommandMailbox
->SCSI_10
.SCSI_CDB
[1] = 1; /* EVPD = 1 */
1068 CommandMailbox
->SCSI_10
.SCSI_CDB
[2] = 0x80; /* Page Code */
1069 CommandMailbox
->SCSI_10
.SCSI_CDB
[3] = 0; /* Reserved */
1070 CommandMailbox
->SCSI_10
.SCSI_CDB
[4] =
1071 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
1072 CommandMailbox
->SCSI_10
.SCSI_CDB
[5] = 0; /* Control */
1073 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
1074 .ScatterGatherSegments
[0]
1075 .SegmentDataPointer
=
1076 Controller
->V2
.NewInquiryUnitSerialNumberDMA
;
1077 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
1078 .ScatterGatherSegments
[0]
1080 CommandMailbox
->SCSI_10
.DataTransferSize
;
1085 DAC960_V2_NewUnitSerialNumber executes an SCSI pass-through
1086 Inquiry command to a SCSI device identified by Channel number,
1087 Target id, Logical Unit Number. This function Waits for completion
1090 The return data includes Unit Serial Number information for the
1093 Data is stored in the controller's V2.NewPhysicalDeviceInfo dma-able
1097 static bool DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T
*Controller
,
1098 int Channel
, int TargetID
, int LogicalUnit
)
1100 DAC960_Command_T
*Command
;
1101 DAC960_V2_CommandMailbox_T
*CommandMailbox
;
1102 DAC960_V2_CommandStatus_T CommandStatus
;
1104 Command
= DAC960_AllocateCommand(Controller
);
1105 CommandMailbox
= &Command
->V2
.CommandMailbox
;
1106 DAC960_V2_ClearCommand(Command
);
1107 Command
->CommandType
= DAC960_ImmediateCommand
;
1109 DAC960_V2_ConstructNewUnitSerialNumber(Controller
, CommandMailbox
,
1110 Channel
, TargetID
, LogicalUnit
);
1112 DAC960_ExecuteCommand(Command
);
1113 CommandStatus
= Command
->V2
.CommandStatus
;
1114 DAC960_DeallocateCommand(Command
);
1115 return (CommandStatus
== DAC960_V2_NormalCompletion
);
1120 DAC960_V2_DeviceOperation executes a DAC960 V2 Firmware Controller Device
1121 Operation IOCTL Command and waits for completion. It returns true on
1122 success and false on failure.
1125 static bool DAC960_V2_DeviceOperation(DAC960_Controller_T
*Controller
,
1126 DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode
,
1127 DAC960_V2_OperationDevice_T
1130 DAC960_Command_T
*Command
= DAC960_AllocateCommand(Controller
);
1131 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
1132 DAC960_V2_CommandStatus_T CommandStatus
;
1133 DAC960_V2_ClearCommand(Command
);
1134 Command
->CommandType
= DAC960_ImmediateCommand
;
1135 CommandMailbox
->DeviceOperation
.CommandOpcode
= DAC960_V2_IOCTL
;
1136 CommandMailbox
->DeviceOperation
.CommandControlBits
1137 .DataTransferControllerToHost
= true;
1138 CommandMailbox
->DeviceOperation
.CommandControlBits
1139 .NoAutoRequestSense
= true;
1140 CommandMailbox
->DeviceOperation
.IOCTL_Opcode
= IOCTL_Opcode
;
1141 CommandMailbox
->DeviceOperation
.OperationDevice
= OperationDevice
;
1142 DAC960_ExecuteCommand(Command
);
1143 CommandStatus
= Command
->V2
.CommandStatus
;
1144 DAC960_DeallocateCommand(Command
);
1145 return (CommandStatus
== DAC960_V2_NormalCompletion
);
1150 DAC960_V1_EnableMemoryMailboxInterface enables the Memory Mailbox Interface
1151 for DAC960 V1 Firmware Controllers.
1153 PD and P controller types have no memory mailbox, but still need the
1154 other dma mapped memory.
1157 static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
1160 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
1161 DAC960_HardwareType_T hw_type
= Controller
->HardwareType
;
1162 struct pci_dev
*PCI_Device
= Controller
->PCIDevice
;
1163 struct dma_loaf
*DmaPages
= &Controller
->DmaPages
;
1164 size_t DmaPagesSize
;
1165 size_t CommandMailboxesSize
;
1166 size_t StatusMailboxesSize
;
1168 DAC960_V1_CommandMailbox_T
*CommandMailboxesMemory
;
1169 dma_addr_t CommandMailboxesMemoryDMA
;
1171 DAC960_V1_StatusMailbox_T
*StatusMailboxesMemory
;
1172 dma_addr_t StatusMailboxesMemoryDMA
;
1174 DAC960_V1_CommandMailbox_T CommandMailbox
;
1175 DAC960_V1_CommandStatus_T CommandStatus
;
1179 memset(&CommandMailbox
, 0, sizeof(DAC960_V1_CommandMailbox_T
));
1181 if (pci_set_dma_mask(Controller
->PCIDevice
, DMA_BIT_MASK(32)))
1182 return DAC960_Failure(Controller
, "DMA mask out of range");
1184 if ((hw_type
== DAC960_PD_Controller
) || (hw_type
== DAC960_P_Controller
)) {
1185 CommandMailboxesSize
= 0;
1186 StatusMailboxesSize
= 0;
1188 CommandMailboxesSize
= DAC960_V1_CommandMailboxCount
* sizeof(DAC960_V1_CommandMailbox_T
);
1189 StatusMailboxesSize
= DAC960_V1_StatusMailboxCount
* sizeof(DAC960_V1_StatusMailbox_T
);
1191 DmaPagesSize
= CommandMailboxesSize
+ StatusMailboxesSize
+
1192 sizeof(DAC960_V1_DCDB_T
) + sizeof(DAC960_V1_Enquiry_T
) +
1193 sizeof(DAC960_V1_ErrorTable_T
) + sizeof(DAC960_V1_EventLogEntry_T
) +
1194 sizeof(DAC960_V1_RebuildProgress_T
) +
1195 sizeof(DAC960_V1_LogicalDriveInformationArray_T
) +
1196 sizeof(DAC960_V1_BackgroundInitializationStatus_T
) +
1197 sizeof(DAC960_V1_DeviceState_T
) + sizeof(DAC960_SCSI_Inquiry_T
) +
1198 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
1200 if (!init_dma_loaf(PCI_Device
, DmaPages
, DmaPagesSize
))
1204 if ((hw_type
== DAC960_PD_Controller
) || (hw_type
== DAC960_P_Controller
))
1205 goto skip_mailboxes
;
1207 CommandMailboxesMemory
= slice_dma_loaf(DmaPages
,
1208 CommandMailboxesSize
, &CommandMailboxesMemoryDMA
);
1210 /* These are the base addresses for the command memory mailbox array */
1211 Controller
->V1
.FirstCommandMailbox
= CommandMailboxesMemory
;
1212 Controller
->V1
.FirstCommandMailboxDMA
= CommandMailboxesMemoryDMA
;
1214 CommandMailboxesMemory
+= DAC960_V1_CommandMailboxCount
- 1;
1215 Controller
->V1
.LastCommandMailbox
= CommandMailboxesMemory
;
1216 Controller
->V1
.NextCommandMailbox
= Controller
->V1
.FirstCommandMailbox
;
1217 Controller
->V1
.PreviousCommandMailbox1
= Controller
->V1
.LastCommandMailbox
;
1218 Controller
->V1
.PreviousCommandMailbox2
=
1219 Controller
->V1
.LastCommandMailbox
- 1;
1221 /* These are the base addresses for the status memory mailbox array */
1222 StatusMailboxesMemory
= slice_dma_loaf(DmaPages
,
1223 StatusMailboxesSize
, &StatusMailboxesMemoryDMA
);
1225 Controller
->V1
.FirstStatusMailbox
= StatusMailboxesMemory
;
1226 Controller
->V1
.FirstStatusMailboxDMA
= StatusMailboxesMemoryDMA
;
1227 StatusMailboxesMemory
+= DAC960_V1_StatusMailboxCount
- 1;
1228 Controller
->V1
.LastStatusMailbox
= StatusMailboxesMemory
;
1229 Controller
->V1
.NextStatusMailbox
= Controller
->V1
.FirstStatusMailbox
;
1232 Controller
->V1
.MonitoringDCDB
= slice_dma_loaf(DmaPages
,
1233 sizeof(DAC960_V1_DCDB_T
),
1234 &Controller
->V1
.MonitoringDCDB_DMA
);
1236 Controller
->V1
.NewEnquiry
= slice_dma_loaf(DmaPages
,
1237 sizeof(DAC960_V1_Enquiry_T
),
1238 &Controller
->V1
.NewEnquiryDMA
);
1240 Controller
->V1
.NewErrorTable
= slice_dma_loaf(DmaPages
,
1241 sizeof(DAC960_V1_ErrorTable_T
),
1242 &Controller
->V1
.NewErrorTableDMA
);
1244 Controller
->V1
.EventLogEntry
= slice_dma_loaf(DmaPages
,
1245 sizeof(DAC960_V1_EventLogEntry_T
),
1246 &Controller
->V1
.EventLogEntryDMA
);
1248 Controller
->V1
.RebuildProgress
= slice_dma_loaf(DmaPages
,
1249 sizeof(DAC960_V1_RebuildProgress_T
),
1250 &Controller
->V1
.RebuildProgressDMA
);
1252 Controller
->V1
.NewLogicalDriveInformation
= slice_dma_loaf(DmaPages
,
1253 sizeof(DAC960_V1_LogicalDriveInformationArray_T
),
1254 &Controller
->V1
.NewLogicalDriveInformationDMA
);
1256 Controller
->V1
.BackgroundInitializationStatus
= slice_dma_loaf(DmaPages
,
1257 sizeof(DAC960_V1_BackgroundInitializationStatus_T
),
1258 &Controller
->V1
.BackgroundInitializationStatusDMA
);
1260 Controller
->V1
.NewDeviceState
= slice_dma_loaf(DmaPages
,
1261 sizeof(DAC960_V1_DeviceState_T
),
1262 &Controller
->V1
.NewDeviceStateDMA
);
1264 Controller
->V1
.NewInquiryStandardData
= slice_dma_loaf(DmaPages
,
1265 sizeof(DAC960_SCSI_Inquiry_T
),
1266 &Controller
->V1
.NewInquiryStandardDataDMA
);
1268 Controller
->V1
.NewInquiryUnitSerialNumber
= slice_dma_loaf(DmaPages
,
1269 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
),
1270 &Controller
->V1
.NewInquiryUnitSerialNumberDMA
);
1272 if ((hw_type
== DAC960_PD_Controller
) || (hw_type
== DAC960_P_Controller
))
1275 /* Enable the Memory Mailbox Interface. */
1276 Controller
->V1
.DualModeMemoryMailboxInterface
= true;
1277 CommandMailbox
.TypeX
.CommandOpcode
= 0x2B;
1278 CommandMailbox
.TypeX
.CommandIdentifier
= 0;
1279 CommandMailbox
.TypeX
.CommandOpcode2
= 0x14;
1280 CommandMailbox
.TypeX
.CommandMailboxesBusAddress
=
1281 Controller
->V1
.FirstCommandMailboxDMA
;
1282 CommandMailbox
.TypeX
.StatusMailboxesBusAddress
=
1283 Controller
->V1
.FirstStatusMailboxDMA
;
1284 #define TIMEOUT_COUNT 1000000
1286 for (i
= 0; i
< 2; i
++)
1287 switch (Controller
->HardwareType
)
1289 case DAC960_LA_Controller
:
1290 TimeoutCounter
= TIMEOUT_COUNT
;
1291 while (--TimeoutCounter
>= 0)
1293 if (!DAC960_LA_HardwareMailboxFullP(ControllerBaseAddress
))
1297 if (TimeoutCounter
< 0) return false;
1298 DAC960_LA_WriteHardwareMailbox(ControllerBaseAddress
, &CommandMailbox
);
1299 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress
);
1300 TimeoutCounter
= TIMEOUT_COUNT
;
1301 while (--TimeoutCounter
>= 0)
1303 if (DAC960_LA_HardwareMailboxStatusAvailableP(
1304 ControllerBaseAddress
))
1308 if (TimeoutCounter
< 0) return false;
1309 CommandStatus
= DAC960_LA_ReadStatusRegister(ControllerBaseAddress
);
1310 DAC960_LA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress
);
1311 DAC960_LA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress
);
1312 if (CommandStatus
== DAC960_V1_NormalCompletion
) return true;
1313 Controller
->V1
.DualModeMemoryMailboxInterface
= false;
1314 CommandMailbox
.TypeX
.CommandOpcode2
= 0x10;
1316 case DAC960_PG_Controller
:
1317 TimeoutCounter
= TIMEOUT_COUNT
;
1318 while (--TimeoutCounter
>= 0)
1320 if (!DAC960_PG_HardwareMailboxFullP(ControllerBaseAddress
))
1324 if (TimeoutCounter
< 0) return false;
1325 DAC960_PG_WriteHardwareMailbox(ControllerBaseAddress
, &CommandMailbox
);
1326 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress
);
1328 TimeoutCounter
= TIMEOUT_COUNT
;
1329 while (--TimeoutCounter
>= 0)
1331 if (DAC960_PG_HardwareMailboxStatusAvailableP(
1332 ControllerBaseAddress
))
1336 if (TimeoutCounter
< 0) return false;
1337 CommandStatus
= DAC960_PG_ReadStatusRegister(ControllerBaseAddress
);
1338 DAC960_PG_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress
);
1339 DAC960_PG_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress
);
1340 if (CommandStatus
== DAC960_V1_NormalCompletion
) return true;
1341 Controller
->V1
.DualModeMemoryMailboxInterface
= false;
1342 CommandMailbox
.TypeX
.CommandOpcode2
= 0x10;
1345 DAC960_Failure(Controller
, "Unknown Controller Type\n");
1353 DAC960_V2_EnableMemoryMailboxInterface enables the Memory Mailbox Interface
1354 for DAC960 V2 Firmware Controllers.
1356 Aggregate the space needed for the controller's memory mailbox and
1357 the other data structures that will be targets of dma transfers with
1358 the controller. Allocate a dma-mapped region of memory to hold these
1359 structures. Then, save CPU pointers and dma_addr_t values to reference
1360 the structures that are contained in that region.
1363 static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
1366 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
1367 struct pci_dev
*PCI_Device
= Controller
->PCIDevice
;
1368 struct dma_loaf
*DmaPages
= &Controller
->DmaPages
;
1369 size_t DmaPagesSize
;
1370 size_t CommandMailboxesSize
;
1371 size_t StatusMailboxesSize
;
1373 DAC960_V2_CommandMailbox_T
*CommandMailboxesMemory
;
1374 dma_addr_t CommandMailboxesMemoryDMA
;
1376 DAC960_V2_StatusMailbox_T
*StatusMailboxesMemory
;
1377 dma_addr_t StatusMailboxesMemoryDMA
;
1379 DAC960_V2_CommandMailbox_T
*CommandMailbox
;
1380 dma_addr_t CommandMailboxDMA
;
1381 DAC960_V2_CommandStatus_T CommandStatus
;
1383 if (pci_set_dma_mask(Controller
->PCIDevice
, DMA_BIT_MASK(64)) &&
1384 pci_set_dma_mask(Controller
->PCIDevice
, DMA_BIT_MASK(32)))
1385 return DAC960_Failure(Controller
, "DMA mask out of range");
1387 /* This is a temporary dma mapping, used only in the scope of this function */
1388 CommandMailbox
= pci_alloc_consistent(PCI_Device
,
1389 sizeof(DAC960_V2_CommandMailbox_T
), &CommandMailboxDMA
);
1390 if (CommandMailbox
== NULL
)
1393 CommandMailboxesSize
= DAC960_V2_CommandMailboxCount
* sizeof(DAC960_V2_CommandMailbox_T
);
1394 StatusMailboxesSize
= DAC960_V2_StatusMailboxCount
* sizeof(DAC960_V2_StatusMailbox_T
);
1396 CommandMailboxesSize
+ StatusMailboxesSize
+
1397 sizeof(DAC960_V2_HealthStatusBuffer_T
) +
1398 sizeof(DAC960_V2_ControllerInfo_T
) +
1399 sizeof(DAC960_V2_LogicalDeviceInfo_T
) +
1400 sizeof(DAC960_V2_PhysicalDeviceInfo_T
) +
1401 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
) +
1402 sizeof(DAC960_V2_Event_T
) +
1403 sizeof(DAC960_V2_PhysicalToLogicalDevice_T
);
1405 if (!init_dma_loaf(PCI_Device
, DmaPages
, DmaPagesSize
)) {
1406 pci_free_consistent(PCI_Device
, sizeof(DAC960_V2_CommandMailbox_T
),
1407 CommandMailbox
, CommandMailboxDMA
);
1411 CommandMailboxesMemory
= slice_dma_loaf(DmaPages
,
1412 CommandMailboxesSize
, &CommandMailboxesMemoryDMA
);
1414 /* These are the base addresses for the command memory mailbox array */
1415 Controller
->V2
.FirstCommandMailbox
= CommandMailboxesMemory
;
1416 Controller
->V2
.FirstCommandMailboxDMA
= CommandMailboxesMemoryDMA
;
1418 CommandMailboxesMemory
+= DAC960_V2_CommandMailboxCount
- 1;
1419 Controller
->V2
.LastCommandMailbox
= CommandMailboxesMemory
;
1420 Controller
->V2
.NextCommandMailbox
= Controller
->V2
.FirstCommandMailbox
;
1421 Controller
->V2
.PreviousCommandMailbox1
= Controller
->V2
.LastCommandMailbox
;
1422 Controller
->V2
.PreviousCommandMailbox2
=
1423 Controller
->V2
.LastCommandMailbox
- 1;
1425 /* These are the base addresses for the status memory mailbox array */
1426 StatusMailboxesMemory
= slice_dma_loaf(DmaPages
,
1427 StatusMailboxesSize
, &StatusMailboxesMemoryDMA
);
1429 Controller
->V2
.FirstStatusMailbox
= StatusMailboxesMemory
;
1430 Controller
->V2
.FirstStatusMailboxDMA
= StatusMailboxesMemoryDMA
;
1431 StatusMailboxesMemory
+= DAC960_V2_StatusMailboxCount
- 1;
1432 Controller
->V2
.LastStatusMailbox
= StatusMailboxesMemory
;
1433 Controller
->V2
.NextStatusMailbox
= Controller
->V2
.FirstStatusMailbox
;
1435 Controller
->V2
.HealthStatusBuffer
= slice_dma_loaf(DmaPages
,
1436 sizeof(DAC960_V2_HealthStatusBuffer_T
),
1437 &Controller
->V2
.HealthStatusBufferDMA
);
1439 Controller
->V2
.NewControllerInformation
= slice_dma_loaf(DmaPages
,
1440 sizeof(DAC960_V2_ControllerInfo_T
),
1441 &Controller
->V2
.NewControllerInformationDMA
);
1443 Controller
->V2
.NewLogicalDeviceInformation
= slice_dma_loaf(DmaPages
,
1444 sizeof(DAC960_V2_LogicalDeviceInfo_T
),
1445 &Controller
->V2
.NewLogicalDeviceInformationDMA
);
1447 Controller
->V2
.NewPhysicalDeviceInformation
= slice_dma_loaf(DmaPages
,
1448 sizeof(DAC960_V2_PhysicalDeviceInfo_T
),
1449 &Controller
->V2
.NewPhysicalDeviceInformationDMA
);
1451 Controller
->V2
.NewInquiryUnitSerialNumber
= slice_dma_loaf(DmaPages
,
1452 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
),
1453 &Controller
->V2
.NewInquiryUnitSerialNumberDMA
);
1455 Controller
->V2
.Event
= slice_dma_loaf(DmaPages
,
1456 sizeof(DAC960_V2_Event_T
),
1457 &Controller
->V2
.EventDMA
);
1459 Controller
->V2
.PhysicalToLogicalDevice
= slice_dma_loaf(DmaPages
,
1460 sizeof(DAC960_V2_PhysicalToLogicalDevice_T
),
1461 &Controller
->V2
.PhysicalToLogicalDeviceDMA
);
1464 Enable the Memory Mailbox Interface.
1466 I don't know why we can't just use one of the memory mailboxes
1467 we just allocated to do this, instead of using this temporary one.
1468 Try this change later.
1470 memset(CommandMailbox
, 0, sizeof(DAC960_V2_CommandMailbox_T
));
1471 CommandMailbox
->SetMemoryMailbox
.CommandIdentifier
= 1;
1472 CommandMailbox
->SetMemoryMailbox
.CommandOpcode
= DAC960_V2_IOCTL
;
1473 CommandMailbox
->SetMemoryMailbox
.CommandControlBits
.NoAutoRequestSense
= true;
1474 CommandMailbox
->SetMemoryMailbox
.FirstCommandMailboxSizeKB
=
1475 (DAC960_V2_CommandMailboxCount
* sizeof(DAC960_V2_CommandMailbox_T
)) >> 10;
1476 CommandMailbox
->SetMemoryMailbox
.FirstStatusMailboxSizeKB
=
1477 (DAC960_V2_StatusMailboxCount
* sizeof(DAC960_V2_StatusMailbox_T
)) >> 10;
1478 CommandMailbox
->SetMemoryMailbox
.SecondCommandMailboxSizeKB
= 0;
1479 CommandMailbox
->SetMemoryMailbox
.SecondStatusMailboxSizeKB
= 0;
1480 CommandMailbox
->SetMemoryMailbox
.RequestSenseSize
= 0;
1481 CommandMailbox
->SetMemoryMailbox
.IOCTL_Opcode
= DAC960_V2_SetMemoryMailbox
;
1482 CommandMailbox
->SetMemoryMailbox
.HealthStatusBufferSizeKB
= 1;
1483 CommandMailbox
->SetMemoryMailbox
.HealthStatusBufferBusAddress
=
1484 Controller
->V2
.HealthStatusBufferDMA
;
1485 CommandMailbox
->SetMemoryMailbox
.FirstCommandMailboxBusAddress
=
1486 Controller
->V2
.FirstCommandMailboxDMA
;
1487 CommandMailbox
->SetMemoryMailbox
.FirstStatusMailboxBusAddress
=
1488 Controller
->V2
.FirstStatusMailboxDMA
;
1489 switch (Controller
->HardwareType
)
1491 case DAC960_GEM_Controller
:
1492 while (DAC960_GEM_HardwareMailboxFullP(ControllerBaseAddress
))
1494 DAC960_GEM_WriteHardwareMailbox(ControllerBaseAddress
, CommandMailboxDMA
);
1495 DAC960_GEM_HardwareMailboxNewCommand(ControllerBaseAddress
);
1496 while (!DAC960_GEM_HardwareMailboxStatusAvailableP(ControllerBaseAddress
))
1498 CommandStatus
= DAC960_GEM_ReadCommandStatus(ControllerBaseAddress
);
1499 DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress
);
1500 DAC960_GEM_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress
);
1502 case DAC960_BA_Controller
:
1503 while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress
))
1505 DAC960_BA_WriteHardwareMailbox(ControllerBaseAddress
, CommandMailboxDMA
);
1506 DAC960_BA_HardwareMailboxNewCommand(ControllerBaseAddress
);
1507 while (!DAC960_BA_HardwareMailboxStatusAvailableP(ControllerBaseAddress
))
1509 CommandStatus
= DAC960_BA_ReadCommandStatus(ControllerBaseAddress
);
1510 DAC960_BA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress
);
1511 DAC960_BA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress
);
1513 case DAC960_LP_Controller
:
1514 while (DAC960_LP_HardwareMailboxFullP(ControllerBaseAddress
))
1516 DAC960_LP_WriteHardwareMailbox(ControllerBaseAddress
, CommandMailboxDMA
);
1517 DAC960_LP_HardwareMailboxNewCommand(ControllerBaseAddress
);
1518 while (!DAC960_LP_HardwareMailboxStatusAvailableP(ControllerBaseAddress
))
1520 CommandStatus
= DAC960_LP_ReadCommandStatus(ControllerBaseAddress
);
1521 DAC960_LP_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress
);
1522 DAC960_LP_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress
);
1525 DAC960_Failure(Controller
, "Unknown Controller Type\n");
1526 CommandStatus
= DAC960_V2_AbormalCompletion
;
1529 pci_free_consistent(PCI_Device
, sizeof(DAC960_V2_CommandMailbox_T
),
1530 CommandMailbox
, CommandMailboxDMA
);
1531 return (CommandStatus
== DAC960_V2_NormalCompletion
);
1536 DAC960_V1_ReadControllerConfiguration reads the Configuration Information
1537 from DAC960 V1 Firmware Controllers and initializes the Controller structure.
1540 static bool DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
1543 DAC960_V1_Enquiry2_T
*Enquiry2
;
1544 dma_addr_t Enquiry2DMA
;
1545 DAC960_V1_Config2_T
*Config2
;
1546 dma_addr_t Config2DMA
;
1547 int LogicalDriveNumber
, Channel
, TargetID
;
1548 struct dma_loaf local_dma
;
1550 if (!init_dma_loaf(Controller
->PCIDevice
, &local_dma
,
1551 sizeof(DAC960_V1_Enquiry2_T
) + sizeof(DAC960_V1_Config2_T
)))
1552 return DAC960_Failure(Controller
, "LOGICAL DEVICE ALLOCATION");
1554 Enquiry2
= slice_dma_loaf(&local_dma
, sizeof(DAC960_V1_Enquiry2_T
), &Enquiry2DMA
);
1555 Config2
= slice_dma_loaf(&local_dma
, sizeof(DAC960_V1_Config2_T
), &Config2DMA
);
1557 if (!DAC960_V1_ExecuteType3(Controller
, DAC960_V1_Enquiry
,
1558 Controller
->V1
.NewEnquiryDMA
)) {
1559 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1560 return DAC960_Failure(Controller
, "ENQUIRY");
1562 memcpy(&Controller
->V1
.Enquiry
, Controller
->V1
.NewEnquiry
,
1563 sizeof(DAC960_V1_Enquiry_T
));
1565 if (!DAC960_V1_ExecuteType3(Controller
, DAC960_V1_Enquiry2
, Enquiry2DMA
)) {
1566 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1567 return DAC960_Failure(Controller
, "ENQUIRY2");
1570 if (!DAC960_V1_ExecuteType3(Controller
, DAC960_V1_ReadConfig2
, Config2DMA
)) {
1571 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1572 return DAC960_Failure(Controller
, "READ CONFIG2");
1575 if (!DAC960_V1_ExecuteType3(Controller
, DAC960_V1_GetLogicalDriveInformation
,
1576 Controller
->V1
.NewLogicalDriveInformationDMA
)) {
1577 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1578 return DAC960_Failure(Controller
, "GET LOGICAL DRIVE INFORMATION");
1580 memcpy(&Controller
->V1
.LogicalDriveInformation
,
1581 Controller
->V1
.NewLogicalDriveInformation
,
1582 sizeof(DAC960_V1_LogicalDriveInformationArray_T
));
1584 for (Channel
= 0; Channel
< Enquiry2
->ActualChannels
; Channel
++)
1585 for (TargetID
= 0; TargetID
< Enquiry2
->MaxTargets
; TargetID
++) {
1586 if (!DAC960_V1_ExecuteType3D(Controller
, DAC960_V1_GetDeviceState
,
1588 Controller
->V1
.NewDeviceStateDMA
)) {
1589 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1590 return DAC960_Failure(Controller
, "GET DEVICE STATE");
1592 memcpy(&Controller
->V1
.DeviceState
[Channel
][TargetID
],
1593 Controller
->V1
.NewDeviceState
, sizeof(DAC960_V1_DeviceState_T
));
1596 Initialize the Controller Model Name and Full Model Name fields.
1598 switch (Enquiry2
->HardwareID
.SubModel
)
1600 case DAC960_V1_P_PD_PU
:
1601 if (Enquiry2
->SCSICapability
.BusSpeed
== DAC960_V1_Ultra
)
1602 strcpy(Controller
->ModelName
, "DAC960PU");
1603 else strcpy(Controller
->ModelName
, "DAC960PD");
1606 strcpy(Controller
->ModelName
, "DAC960PL");
1609 strcpy(Controller
->ModelName
, "DAC960PG");
1612 strcpy(Controller
->ModelName
, "DAC960PJ");
1615 strcpy(Controller
->ModelName
, "DAC960PR");
1618 strcpy(Controller
->ModelName
, "DAC960PT");
1620 case DAC960_V1_PTL0
:
1621 strcpy(Controller
->ModelName
, "DAC960PTL0");
1624 strcpy(Controller
->ModelName
, "DAC960PRL");
1626 case DAC960_V1_PTL1
:
1627 strcpy(Controller
->ModelName
, "DAC960PTL1");
1629 case DAC960_V1_1164P
:
1630 strcpy(Controller
->ModelName
, "DAC1164P");
1633 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1634 return DAC960_Failure(Controller
, "MODEL VERIFICATION");
1636 strcpy(Controller
->FullModelName
, "Mylex ");
1637 strcat(Controller
->FullModelName
, Controller
->ModelName
);
1639 Initialize the Controller Firmware Version field and verify that it
1640 is a supported firmware version. The supported firmware versions are:
1642 DAC1164P 5.06 and above
1643 DAC960PTL/PRL/PJ/PG 4.06 and above
1644 DAC960PU/PD/PL 3.51 and above
1645 DAC960PU/PD/PL/P 2.73 and above
1647 #if defined(CONFIG_ALPHA)
1649 DEC Alpha machines were often equipped with DAC960 cards that were
1650 OEMed from Mylex, and had their own custom firmware. Version 2.70,
1651 the last custom FW revision to be released by DEC for these older
1652 controllers, appears to work quite well with this driver.
1654 Cards tested successfully were several versions each of the PD and
1655 PU, called by DEC the KZPSC and KZPAC, respectively, and having
1656 the Manufacturer Numbers (from Mylex), usually on a sticker on the
1657 back of the board, of:
1659 KZPSC: D040347 (1-channel) or D040348 (2-channel) or D040349 (3-channel)
1660 KZPAC: D040395 (1-channel) or D040396 (2-channel) or D040397 (3-channel)
1662 # define FIRMWARE_27X "2.70"
1664 # define FIRMWARE_27X "2.73"
1667 if (Enquiry2
->FirmwareID
.MajorVersion
== 0)
1669 Enquiry2
->FirmwareID
.MajorVersion
=
1670 Controller
->V1
.Enquiry
.MajorFirmwareVersion
;
1671 Enquiry2
->FirmwareID
.MinorVersion
=
1672 Controller
->V1
.Enquiry
.MinorFirmwareVersion
;
1673 Enquiry2
->FirmwareID
.FirmwareType
= '0';
1674 Enquiry2
->FirmwareID
.TurnID
= 0;
1676 snprintf(Controller
->FirmwareVersion
, sizeof(Controller
->FirmwareVersion
),
1678 Enquiry2
->FirmwareID
.MajorVersion
,
1679 Enquiry2
->FirmwareID
.MinorVersion
,
1680 Enquiry2
->FirmwareID
.FirmwareType
,
1681 Enquiry2
->FirmwareID
.TurnID
);
1682 if (!((Controller
->FirmwareVersion
[0] == '5' &&
1683 strcmp(Controller
->FirmwareVersion
, "5.06") >= 0) ||
1684 (Controller
->FirmwareVersion
[0] == '4' &&
1685 strcmp(Controller
->FirmwareVersion
, "4.06") >= 0) ||
1686 (Controller
->FirmwareVersion
[0] == '3' &&
1687 strcmp(Controller
->FirmwareVersion
, "3.51") >= 0) ||
1688 (Controller
->FirmwareVersion
[0] == '2' &&
1689 strcmp(Controller
->FirmwareVersion
, FIRMWARE_27X
) >= 0)))
1691 DAC960_Failure(Controller
, "FIRMWARE VERSION VERIFICATION");
1692 DAC960_Error("Firmware Version = '%s'\n", Controller
,
1693 Controller
->FirmwareVersion
);
1694 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1698 Initialize the Controller Channels, Targets, Memory Size, and SAF-TE
1699 Enclosure Management Enabled fields.
1701 Controller
->Channels
= Enquiry2
->ActualChannels
;
1702 Controller
->Targets
= Enquiry2
->MaxTargets
;
1703 Controller
->MemorySize
= Enquiry2
->MemorySize
>> 20;
1704 Controller
->V1
.SAFTE_EnclosureManagementEnabled
=
1705 (Enquiry2
->FaultManagementType
== DAC960_V1_SAFTE
);
1707 Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive
1708 Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and
1709 Driver Scatter/Gather Limit. The Driver Queue Depth must be at most one
1710 less than the Controller Queue Depth to allow for an automatic drive
1713 Controller
->ControllerQueueDepth
= Controller
->V1
.Enquiry
.MaxCommands
;
1714 Controller
->DriverQueueDepth
= Controller
->ControllerQueueDepth
- 1;
1715 if (Controller
->DriverQueueDepth
> DAC960_MaxDriverQueueDepth
)
1716 Controller
->DriverQueueDepth
= DAC960_MaxDriverQueueDepth
;
1717 Controller
->LogicalDriveCount
=
1718 Controller
->V1
.Enquiry
.NumberOfLogicalDrives
;
1719 Controller
->MaxBlocksPerCommand
= Enquiry2
->MaxBlocksPerCommand
;
1720 Controller
->ControllerScatterGatherLimit
= Enquiry2
->MaxScatterGatherEntries
;
1721 Controller
->DriverScatterGatherLimit
=
1722 Controller
->ControllerScatterGatherLimit
;
1723 if (Controller
->DriverScatterGatherLimit
> DAC960_V1_ScatterGatherLimit
)
1724 Controller
->DriverScatterGatherLimit
= DAC960_V1_ScatterGatherLimit
;
1726 Initialize the Stripe Size, Segment Size, and Geometry Translation.
1728 Controller
->V1
.StripeSize
= Config2
->BlocksPerStripe
* Config2
->BlockFactor
1729 >> (10 - DAC960_BlockSizeBits
);
1730 Controller
->V1
.SegmentSize
= Config2
->BlocksPerCacheLine
* Config2
->BlockFactor
1731 >> (10 - DAC960_BlockSizeBits
);
1732 switch (Config2
->DriveGeometry
)
1734 case DAC960_V1_Geometry_128_32
:
1735 Controller
->V1
.GeometryTranslationHeads
= 128;
1736 Controller
->V1
.GeometryTranslationSectors
= 32;
1738 case DAC960_V1_Geometry_255_63
:
1739 Controller
->V1
.GeometryTranslationHeads
= 255;
1740 Controller
->V1
.GeometryTranslationSectors
= 63;
1743 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1744 return DAC960_Failure(Controller
, "CONFIG2 DRIVE GEOMETRY");
1747 Initialize the Background Initialization Status.
1749 if ((Controller
->FirmwareVersion
[0] == '4' &&
1750 strcmp(Controller
->FirmwareVersion
, "4.08") >= 0) ||
1751 (Controller
->FirmwareVersion
[0] == '5' &&
1752 strcmp(Controller
->FirmwareVersion
, "5.08") >= 0))
1754 Controller
->V1
.BackgroundInitializationStatusSupported
= true;
1755 DAC960_V1_ExecuteType3B(Controller
,
1756 DAC960_V1_BackgroundInitializationControl
, 0x20,
1758 V1
.BackgroundInitializationStatusDMA
);
1759 memcpy(&Controller
->V1
.LastBackgroundInitializationStatus
,
1760 Controller
->V1
.BackgroundInitializationStatus
,
1761 sizeof(DAC960_V1_BackgroundInitializationStatus_T
));
1764 Initialize the Logical Drive Initially Accessible flag.
1766 for (LogicalDriveNumber
= 0;
1767 LogicalDriveNumber
< Controller
->LogicalDriveCount
;
1768 LogicalDriveNumber
++)
1769 if (Controller
->V1
.LogicalDriveInformation
1770 [LogicalDriveNumber
].LogicalDriveState
!=
1771 DAC960_V1_LogicalDrive_Offline
)
1772 Controller
->LogicalDriveInitiallyAccessible
[LogicalDriveNumber
] = true;
1773 Controller
->V1
.LastRebuildStatus
= DAC960_V1_NoRebuildOrCheckInProgress
;
1774 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
1780 DAC960_V2_ReadControllerConfiguration reads the Configuration Information
1781 from DAC960 V2 Firmware Controllers and initializes the Controller structure.
1784 static bool DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
1787 DAC960_V2_ControllerInfo_T
*ControllerInfo
=
1788 &Controller
->V2
.ControllerInformation
;
1789 unsigned short LogicalDeviceNumber
= 0;
1790 int ModelNameLength
;
1792 /* Get data into dma-able area, then copy into permanent location */
1793 if (!DAC960_V2_NewControllerInfo(Controller
))
1794 return DAC960_Failure(Controller
, "GET CONTROLLER INFO");
1795 memcpy(ControllerInfo
, Controller
->V2
.NewControllerInformation
,
1796 sizeof(DAC960_V2_ControllerInfo_T
));
1799 if (!DAC960_V2_GeneralInfo(Controller
))
1800 return DAC960_Failure(Controller
, "GET HEALTH STATUS");
1803 Initialize the Controller Model Name and Full Model Name fields.
1805 ModelNameLength
= sizeof(ControllerInfo
->ControllerName
);
1806 if (ModelNameLength
> sizeof(Controller
->ModelName
)-1)
1807 ModelNameLength
= sizeof(Controller
->ModelName
)-1;
1808 memcpy(Controller
->ModelName
, ControllerInfo
->ControllerName
,
1811 while (Controller
->ModelName
[ModelNameLength
] == ' ' ||
1812 Controller
->ModelName
[ModelNameLength
] == '\0')
1814 Controller
->ModelName
[++ModelNameLength
] = '\0';
1815 strcpy(Controller
->FullModelName
, "Mylex ");
1816 strcat(Controller
->FullModelName
, Controller
->ModelName
);
1818 Initialize the Controller Firmware Version field.
1820 sprintf(Controller
->FirmwareVersion
, "%d.%02d-%02d",
1821 ControllerInfo
->FirmwareMajorVersion
,
1822 ControllerInfo
->FirmwareMinorVersion
,
1823 ControllerInfo
->FirmwareTurnNumber
);
1824 if (ControllerInfo
->FirmwareMajorVersion
== 6 &&
1825 ControllerInfo
->FirmwareMinorVersion
== 0 &&
1826 ControllerInfo
->FirmwareTurnNumber
< 1)
1828 DAC960_Info("FIRMWARE VERSION %s DOES NOT PROVIDE THE CONTROLLER\n",
1829 Controller
, Controller
->FirmwareVersion
);
1830 DAC960_Info("STATUS MONITORING FUNCTIONALITY NEEDED BY THIS DRIVER.\n",
1832 DAC960_Info("PLEASE UPGRADE TO VERSION 6.00-01 OR ABOVE.\n",
1836 Initialize the Controller Channels, Targets, and Memory Size.
1838 Controller
->Channels
= ControllerInfo
->NumberOfPhysicalChannelsPresent
;
1839 Controller
->Targets
=
1840 ControllerInfo
->MaximumTargetsPerChannel
1841 [ControllerInfo
->NumberOfPhysicalChannelsPresent
-1];
1842 Controller
->MemorySize
= ControllerInfo
->MemorySizeMB
;
1844 Initialize the Controller Queue Depth, Driver Queue Depth, Logical Drive
1845 Count, Maximum Blocks per Command, Controller Scatter/Gather Limit, and
1846 Driver Scatter/Gather Limit. The Driver Queue Depth must be at most one
1847 less than the Controller Queue Depth to allow for an automatic drive
1850 Controller
->ControllerQueueDepth
= ControllerInfo
->MaximumParallelCommands
;
1851 Controller
->DriverQueueDepth
= Controller
->ControllerQueueDepth
- 1;
1852 if (Controller
->DriverQueueDepth
> DAC960_MaxDriverQueueDepth
)
1853 Controller
->DriverQueueDepth
= DAC960_MaxDriverQueueDepth
;
1854 Controller
->LogicalDriveCount
= ControllerInfo
->LogicalDevicesPresent
;
1855 Controller
->MaxBlocksPerCommand
=
1856 ControllerInfo
->MaximumDataTransferSizeInBlocks
;
1857 Controller
->ControllerScatterGatherLimit
=
1858 ControllerInfo
->MaximumScatterGatherEntries
;
1859 Controller
->DriverScatterGatherLimit
=
1860 Controller
->ControllerScatterGatherLimit
;
1861 if (Controller
->DriverScatterGatherLimit
> DAC960_V2_ScatterGatherLimit
)
1862 Controller
->DriverScatterGatherLimit
= DAC960_V2_ScatterGatherLimit
;
1864 Initialize the Logical Device Information.
1868 DAC960_V2_LogicalDeviceInfo_T
*NewLogicalDeviceInfo
=
1869 Controller
->V2
.NewLogicalDeviceInformation
;
1870 DAC960_V2_LogicalDeviceInfo_T
*LogicalDeviceInfo
;
1871 DAC960_V2_PhysicalDevice_T PhysicalDevice
;
1873 if (!DAC960_V2_NewLogicalDeviceInfo(Controller
, LogicalDeviceNumber
))
1875 LogicalDeviceNumber
= NewLogicalDeviceInfo
->LogicalDeviceNumber
;
1876 if (LogicalDeviceNumber
>= DAC960_MaxLogicalDrives
) {
1877 DAC960_Error("DAC960: Logical Drive Number %d not supported\n",
1878 Controller
, LogicalDeviceNumber
);
1881 if (NewLogicalDeviceInfo
->DeviceBlockSizeInBytes
!= DAC960_BlockSize
) {
1882 DAC960_Error("DAC960: Logical Drive Block Size %d not supported\n",
1883 Controller
, NewLogicalDeviceInfo
->DeviceBlockSizeInBytes
);
1884 LogicalDeviceNumber
++;
1887 PhysicalDevice
.Controller
= 0;
1888 PhysicalDevice
.Channel
= NewLogicalDeviceInfo
->Channel
;
1889 PhysicalDevice
.TargetID
= NewLogicalDeviceInfo
->TargetID
;
1890 PhysicalDevice
.LogicalUnit
= NewLogicalDeviceInfo
->LogicalUnit
;
1891 Controller
->V2
.LogicalDriveToVirtualDevice
[LogicalDeviceNumber
] =
1893 if (NewLogicalDeviceInfo
->LogicalDeviceState
!=
1894 DAC960_V2_LogicalDevice_Offline
)
1895 Controller
->LogicalDriveInitiallyAccessible
[LogicalDeviceNumber
] = true;
1896 LogicalDeviceInfo
= kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T
),
1898 if (LogicalDeviceInfo
== NULL
)
1899 return DAC960_Failure(Controller
, "LOGICAL DEVICE ALLOCATION");
1900 Controller
->V2
.LogicalDeviceInformation
[LogicalDeviceNumber
] =
1902 memcpy(LogicalDeviceInfo
, NewLogicalDeviceInfo
,
1903 sizeof(DAC960_V2_LogicalDeviceInfo_T
));
1904 LogicalDeviceNumber
++;
1911 DAC960_ReportControllerConfiguration reports the Configuration Information
1915 static bool DAC960_ReportControllerConfiguration(DAC960_Controller_T
1918 DAC960_Info("Configuring Mylex %s PCI RAID Controller\n",
1919 Controller
, Controller
->ModelName
);
1920 DAC960_Info(" Firmware Version: %s, Channels: %d, Memory Size: %dMB\n",
1921 Controller
, Controller
->FirmwareVersion
,
1922 Controller
->Channels
, Controller
->MemorySize
);
1923 DAC960_Info(" PCI Bus: %d, Device: %d, Function: %d, I/O Address: ",
1924 Controller
, Controller
->Bus
,
1925 Controller
->Device
, Controller
->Function
);
1926 if (Controller
->IO_Address
== 0)
1927 DAC960_Info("Unassigned\n", Controller
);
1928 else DAC960_Info("0x%X\n", Controller
, Controller
->IO_Address
);
1929 DAC960_Info(" PCI Address: 0x%X mapped at 0x%lX, IRQ Channel: %d\n",
1930 Controller
, Controller
->PCI_Address
,
1931 (unsigned long) Controller
->BaseAddress
,
1932 Controller
->IRQ_Channel
);
1933 DAC960_Info(" Controller Queue Depth: %d, "
1934 "Maximum Blocks per Command: %d\n",
1935 Controller
, Controller
->ControllerQueueDepth
,
1936 Controller
->MaxBlocksPerCommand
);
1937 DAC960_Info(" Driver Queue Depth: %d, "
1938 "Scatter/Gather Limit: %d of %d Segments\n",
1939 Controller
, Controller
->DriverQueueDepth
,
1940 Controller
->DriverScatterGatherLimit
,
1941 Controller
->ControllerScatterGatherLimit
);
1942 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
1944 DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, "
1945 "BIOS Geometry: %d/%d\n", Controller
,
1946 Controller
->V1
.StripeSize
,
1947 Controller
->V1
.SegmentSize
,
1948 Controller
->V1
.GeometryTranslationHeads
,
1949 Controller
->V1
.GeometryTranslationSectors
);
1950 if (Controller
->V1
.SAFTE_EnclosureManagementEnabled
)
1951 DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller
);
1958 DAC960_V1_ReadDeviceConfiguration reads the Device Configuration Information
1959 for DAC960 V1 Firmware Controllers by requesting the SCSI Inquiry and SCSI
1960 Inquiry Unit Serial Number information for each device connected to
1964 static bool DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
1967 struct dma_loaf local_dma
;
1969 dma_addr_t DCDBs_dma
[DAC960_V1_MaxChannels
];
1970 DAC960_V1_DCDB_T
*DCDBs_cpu
[DAC960_V1_MaxChannels
];
1972 dma_addr_t SCSI_Inquiry_dma
[DAC960_V1_MaxChannels
];
1973 DAC960_SCSI_Inquiry_T
*SCSI_Inquiry_cpu
[DAC960_V1_MaxChannels
];
1975 dma_addr_t SCSI_NewInquiryUnitSerialNumberDMA
[DAC960_V1_MaxChannels
];
1976 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*SCSI_NewInquiryUnitSerialNumberCPU
[DAC960_V1_MaxChannels
];
1978 struct completion Completions
[DAC960_V1_MaxChannels
];
1979 unsigned long flags
;
1980 int Channel
, TargetID
;
1982 if (!init_dma_loaf(Controller
->PCIDevice
, &local_dma
,
1983 DAC960_V1_MaxChannels
*(sizeof(DAC960_V1_DCDB_T
) +
1984 sizeof(DAC960_SCSI_Inquiry_T
) +
1985 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
))))
1986 return DAC960_Failure(Controller
,
1987 "DMA ALLOCATION FAILED IN ReadDeviceConfiguration");
1989 for (Channel
= 0; Channel
< Controller
->Channels
; Channel
++) {
1990 DCDBs_cpu
[Channel
] = slice_dma_loaf(&local_dma
,
1991 sizeof(DAC960_V1_DCDB_T
), DCDBs_dma
+ Channel
);
1992 SCSI_Inquiry_cpu
[Channel
] = slice_dma_loaf(&local_dma
,
1993 sizeof(DAC960_SCSI_Inquiry_T
),
1994 SCSI_Inquiry_dma
+ Channel
);
1995 SCSI_NewInquiryUnitSerialNumberCPU
[Channel
] = slice_dma_loaf(&local_dma
,
1996 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
),
1997 SCSI_NewInquiryUnitSerialNumberDMA
+ Channel
);
2000 for (TargetID
= 0; TargetID
< Controller
->Targets
; TargetID
++)
2003 * For each channel, submit a probe for a device on that channel.
2004 * The timeout interval for a device that is present is 10 seconds.
2005 * With this approach, the timeout periods can elapse in parallel
2008 for (Channel
= 0; Channel
< Controller
->Channels
; Channel
++)
2010 dma_addr_t NewInquiryStandardDataDMA
= SCSI_Inquiry_dma
[Channel
];
2011 DAC960_V1_DCDB_T
*DCDB
= DCDBs_cpu
[Channel
];
2012 dma_addr_t DCDB_dma
= DCDBs_dma
[Channel
];
2013 DAC960_Command_T
*Command
= Controller
->Commands
[Channel
];
2014 struct completion
*Completion
= &Completions
[Channel
];
2016 init_completion(Completion
);
2017 DAC960_V1_ClearCommand(Command
);
2018 Command
->CommandType
= DAC960_ImmediateCommand
;
2019 Command
->Completion
= Completion
;
2020 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
= DAC960_V1_DCDB
;
2021 Command
->V1
.CommandMailbox
.Type3
.BusAddress
= DCDB_dma
;
2022 DCDB
->Channel
= Channel
;
2023 DCDB
->TargetID
= TargetID
;
2024 DCDB
->Direction
= DAC960_V1_DCDB_DataTransferDeviceToSystem
;
2025 DCDB
->EarlyStatus
= false;
2026 DCDB
->Timeout
= DAC960_V1_DCDB_Timeout_10_seconds
;
2027 DCDB
->NoAutomaticRequestSense
= false;
2028 DCDB
->DisconnectPermitted
= true;
2029 DCDB
->TransferLength
= sizeof(DAC960_SCSI_Inquiry_T
);
2030 DCDB
->BusAddress
= NewInquiryStandardDataDMA
;
2031 DCDB
->CDBLength
= 6;
2032 DCDB
->TransferLengthHigh4
= 0;
2033 DCDB
->SenseLength
= sizeof(DCDB
->SenseData
);
2034 DCDB
->CDB
[0] = 0x12; /* INQUIRY */
2035 DCDB
->CDB
[1] = 0; /* EVPD = 0 */
2036 DCDB
->CDB
[2] = 0; /* Page Code */
2037 DCDB
->CDB
[3] = 0; /* Reserved */
2038 DCDB
->CDB
[4] = sizeof(DAC960_SCSI_Inquiry_T
);
2039 DCDB
->CDB
[5] = 0; /* Control */
2041 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
2042 DAC960_QueueCommand(Command
);
2043 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
2046 * Wait for the problems submitted in the previous loop
2047 * to complete. On the probes that are successful,
2048 * get the serial number of the device that was found.
2050 for (Channel
= 0; Channel
< Controller
->Channels
; Channel
++)
2052 DAC960_SCSI_Inquiry_T
*InquiryStandardData
=
2053 &Controller
->V1
.InquiryStandardData
[Channel
][TargetID
];
2054 DAC960_SCSI_Inquiry_T
*NewInquiryStandardData
= SCSI_Inquiry_cpu
[Channel
];
2055 dma_addr_t NewInquiryUnitSerialNumberDMA
=
2056 SCSI_NewInquiryUnitSerialNumberDMA
[Channel
];
2057 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*NewInquiryUnitSerialNumber
=
2058 SCSI_NewInquiryUnitSerialNumberCPU
[Channel
];
2059 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
2060 &Controller
->V1
.InquiryUnitSerialNumber
[Channel
][TargetID
];
2061 DAC960_Command_T
*Command
= Controller
->Commands
[Channel
];
2062 DAC960_V1_DCDB_T
*DCDB
= DCDBs_cpu
[Channel
];
2063 struct completion
*Completion
= &Completions
[Channel
];
2065 wait_for_completion(Completion
);
2067 if (Command
->V1
.CommandStatus
!= DAC960_V1_NormalCompletion
) {
2068 memset(InquiryStandardData
, 0, sizeof(DAC960_SCSI_Inquiry_T
));
2069 InquiryStandardData
->PeripheralDeviceType
= 0x1F;
2072 memcpy(InquiryStandardData
, NewInquiryStandardData
, sizeof(DAC960_SCSI_Inquiry_T
));
2074 /* Preserve Channel and TargetID values from the previous loop */
2075 Command
->Completion
= Completion
;
2076 DCDB
->TransferLength
= sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
2077 DCDB
->BusAddress
= NewInquiryUnitSerialNumberDMA
;
2078 DCDB
->SenseLength
= sizeof(DCDB
->SenseData
);
2079 DCDB
->CDB
[0] = 0x12; /* INQUIRY */
2080 DCDB
->CDB
[1] = 1; /* EVPD = 1 */
2081 DCDB
->CDB
[2] = 0x80; /* Page Code */
2082 DCDB
->CDB
[3] = 0; /* Reserved */
2083 DCDB
->CDB
[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
2084 DCDB
->CDB
[5] = 0; /* Control */
2086 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
2087 DAC960_QueueCommand(Command
);
2088 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
2089 wait_for_completion(Completion
);
2091 if (Command
->V1
.CommandStatus
!= DAC960_V1_NormalCompletion
) {
2092 memset(InquiryUnitSerialNumber
, 0,
2093 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
2094 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
2096 memcpy(InquiryUnitSerialNumber
, NewInquiryUnitSerialNumber
,
2097 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
2100 free_dma_loaf(Controller
->PCIDevice
, &local_dma
);
2106 DAC960_V2_ReadDeviceConfiguration reads the Device Configuration Information
2107 for DAC960 V2 Firmware Controllers by requesting the Physical Device
2108 Information and SCSI Inquiry Unit Serial Number information for each
2109 device connected to Controller.
2112 static bool DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
2115 unsigned char Channel
= 0, TargetID
= 0, LogicalUnit
= 0;
2116 unsigned short PhysicalDeviceIndex
= 0;
2120 DAC960_V2_PhysicalDeviceInfo_T
*NewPhysicalDeviceInfo
=
2121 Controller
->V2
.NewPhysicalDeviceInformation
;
2122 DAC960_V2_PhysicalDeviceInfo_T
*PhysicalDeviceInfo
;
2123 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*NewInquiryUnitSerialNumber
=
2124 Controller
->V2
.NewInquiryUnitSerialNumber
;
2125 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
;
2127 if (!DAC960_V2_NewPhysicalDeviceInfo(Controller
, Channel
, TargetID
, LogicalUnit
))
2130 PhysicalDeviceInfo
= kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T
),
2132 if (PhysicalDeviceInfo
== NULL
)
2133 return DAC960_Failure(Controller
, "PHYSICAL DEVICE ALLOCATION");
2134 Controller
->V2
.PhysicalDeviceInformation
[PhysicalDeviceIndex
] =
2136 memcpy(PhysicalDeviceInfo
, NewPhysicalDeviceInfo
,
2137 sizeof(DAC960_V2_PhysicalDeviceInfo_T
));
2139 InquiryUnitSerialNumber
= kmalloc(
2140 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
), GFP_ATOMIC
);
2141 if (InquiryUnitSerialNumber
== NULL
) {
2142 kfree(PhysicalDeviceInfo
);
2143 return DAC960_Failure(Controller
, "SERIAL NUMBER ALLOCATION");
2145 Controller
->V2
.InquiryUnitSerialNumber
[PhysicalDeviceIndex
] =
2146 InquiryUnitSerialNumber
;
2148 Channel
= NewPhysicalDeviceInfo
->Channel
;
2149 TargetID
= NewPhysicalDeviceInfo
->TargetID
;
2150 LogicalUnit
= NewPhysicalDeviceInfo
->LogicalUnit
;
2153 Some devices do NOT have Unit Serial Numbers.
2154 This command fails for them. But, we still want to
2155 remember those devices are there. Construct a
2156 UnitSerialNumber structure for the failure case.
2158 if (!DAC960_V2_NewInquiryUnitSerialNumber(Controller
, Channel
, TargetID
, LogicalUnit
)) {
2159 memset(InquiryUnitSerialNumber
, 0,
2160 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
2161 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
2163 memcpy(InquiryUnitSerialNumber
, NewInquiryUnitSerialNumber
,
2164 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
2166 PhysicalDeviceIndex
++;
2174 DAC960_SanitizeInquiryData sanitizes the Vendor, Model, Revision, and
2175 Product Serial Number fields of the Inquiry Standard Data and Inquiry
2176 Unit Serial Number structures.
2179 static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T
2180 *InquiryStandardData
,
2181 DAC960_SCSI_Inquiry_UnitSerialNumber_T
2182 *InquiryUnitSerialNumber
,
2183 unsigned char *Vendor
,
2184 unsigned char *Model
,
2185 unsigned char *Revision
,
2186 unsigned char *SerialNumber
)
2188 int SerialNumberLength
, i
;
2189 if (InquiryStandardData
->PeripheralDeviceType
== 0x1F) return;
2190 for (i
= 0; i
< sizeof(InquiryStandardData
->VendorIdentification
); i
++)
2192 unsigned char VendorCharacter
=
2193 InquiryStandardData
->VendorIdentification
[i
];
2194 Vendor
[i
] = (VendorCharacter
>= ' ' && VendorCharacter
<= '~'
2195 ? VendorCharacter
: ' ');
2197 Vendor
[sizeof(InquiryStandardData
->VendorIdentification
)] = '\0';
2198 for (i
= 0; i
< sizeof(InquiryStandardData
->ProductIdentification
); i
++)
2200 unsigned char ModelCharacter
=
2201 InquiryStandardData
->ProductIdentification
[i
];
2202 Model
[i
] = (ModelCharacter
>= ' ' && ModelCharacter
<= '~'
2203 ? ModelCharacter
: ' ');
2205 Model
[sizeof(InquiryStandardData
->ProductIdentification
)] = '\0';
2206 for (i
= 0; i
< sizeof(InquiryStandardData
->ProductRevisionLevel
); i
++)
2208 unsigned char RevisionCharacter
=
2209 InquiryStandardData
->ProductRevisionLevel
[i
];
2210 Revision
[i
] = (RevisionCharacter
>= ' ' && RevisionCharacter
<= '~'
2211 ? RevisionCharacter
: ' ');
2213 Revision
[sizeof(InquiryStandardData
->ProductRevisionLevel
)] = '\0';
2214 if (InquiryUnitSerialNumber
->PeripheralDeviceType
== 0x1F) return;
2215 SerialNumberLength
= InquiryUnitSerialNumber
->PageLength
;
2216 if (SerialNumberLength
>
2217 sizeof(InquiryUnitSerialNumber
->ProductSerialNumber
))
2218 SerialNumberLength
= sizeof(InquiryUnitSerialNumber
->ProductSerialNumber
);
2219 for (i
= 0; i
< SerialNumberLength
; i
++)
2221 unsigned char SerialNumberCharacter
=
2222 InquiryUnitSerialNumber
->ProductSerialNumber
[i
];
2224 (SerialNumberCharacter
>= ' ' && SerialNumberCharacter
<= '~'
2225 ? SerialNumberCharacter
: ' ');
2227 SerialNumber
[SerialNumberLength
] = '\0';
2232 DAC960_V1_ReportDeviceConfiguration reports the Device Configuration
2233 Information for DAC960 V1 Firmware Controllers.
2236 static bool DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
2239 int LogicalDriveNumber
, Channel
, TargetID
;
2240 DAC960_Info(" Physical Devices:\n", Controller
);
2241 for (Channel
= 0; Channel
< Controller
->Channels
; Channel
++)
2242 for (TargetID
= 0; TargetID
< Controller
->Targets
; TargetID
++)
2244 DAC960_SCSI_Inquiry_T
*InquiryStandardData
=
2245 &Controller
->V1
.InquiryStandardData
[Channel
][TargetID
];
2246 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
2247 &Controller
->V1
.InquiryUnitSerialNumber
[Channel
][TargetID
];
2248 DAC960_V1_DeviceState_T
*DeviceState
=
2249 &Controller
->V1
.DeviceState
[Channel
][TargetID
];
2250 DAC960_V1_ErrorTableEntry_T
*ErrorEntry
=
2251 &Controller
->V1
.ErrorTable
.ErrorTableEntries
[Channel
][TargetID
];
2252 char Vendor
[1+sizeof(InquiryStandardData
->VendorIdentification
)];
2253 char Model
[1+sizeof(InquiryStandardData
->ProductIdentification
)];
2254 char Revision
[1+sizeof(InquiryStandardData
->ProductRevisionLevel
)];
2255 char SerialNumber
[1+sizeof(InquiryUnitSerialNumber
2256 ->ProductSerialNumber
)];
2257 if (InquiryStandardData
->PeripheralDeviceType
== 0x1F) continue;
2258 DAC960_SanitizeInquiryData(InquiryStandardData
, InquiryUnitSerialNumber
,
2259 Vendor
, Model
, Revision
, SerialNumber
);
2260 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2261 Controller
, Channel
, TargetID
, (TargetID
< 10 ? " " : ""),
2262 Vendor
, Model
, Revision
);
2263 if (InquiryUnitSerialNumber
->PeripheralDeviceType
!= 0x1F)
2264 DAC960_Info(" Serial Number: %s\n", Controller
, SerialNumber
);
2265 if (DeviceState
->Present
&&
2266 DeviceState
->DeviceType
== DAC960_V1_DiskType
)
2268 if (Controller
->V1
.DeviceResetCount
[Channel
][TargetID
] > 0)
2269 DAC960_Info(" Disk Status: %s, %u blocks, %d resets\n",
2271 (DeviceState
->DeviceState
== DAC960_V1_Device_Dead
2273 : DeviceState
->DeviceState
2274 == DAC960_V1_Device_WriteOnly
2276 : DeviceState
->DeviceState
2277 == DAC960_V1_Device_Online
2278 ? "Online" : "Standby"),
2279 DeviceState
->DiskSize
,
2280 Controller
->V1
.DeviceResetCount
[Channel
][TargetID
]);
2282 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller
,
2283 (DeviceState
->DeviceState
== DAC960_V1_Device_Dead
2285 : DeviceState
->DeviceState
2286 == DAC960_V1_Device_WriteOnly
2288 : DeviceState
->DeviceState
2289 == DAC960_V1_Device_Online
2290 ? "Online" : "Standby"),
2291 DeviceState
->DiskSize
);
2293 if (ErrorEntry
->ParityErrorCount
> 0 ||
2294 ErrorEntry
->SoftErrorCount
> 0 ||
2295 ErrorEntry
->HardErrorCount
> 0 ||
2296 ErrorEntry
->MiscErrorCount
> 0)
2297 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2298 "Hard: %d, Misc: %d\n", Controller
,
2299 ErrorEntry
->ParityErrorCount
,
2300 ErrorEntry
->SoftErrorCount
,
2301 ErrorEntry
->HardErrorCount
,
2302 ErrorEntry
->MiscErrorCount
);
2304 DAC960_Info(" Logical Drives:\n", Controller
);
2305 for (LogicalDriveNumber
= 0;
2306 LogicalDriveNumber
< Controller
->LogicalDriveCount
;
2307 LogicalDriveNumber
++)
2309 DAC960_V1_LogicalDriveInformation_T
*LogicalDriveInformation
=
2310 &Controller
->V1
.LogicalDriveInformation
[LogicalDriveNumber
];
2311 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks, %s\n",
2312 Controller
, Controller
->ControllerNumber
, LogicalDriveNumber
,
2313 LogicalDriveInformation
->RAIDLevel
,
2314 (LogicalDriveInformation
->LogicalDriveState
2315 == DAC960_V1_LogicalDrive_Online
2317 : LogicalDriveInformation
->LogicalDriveState
2318 == DAC960_V1_LogicalDrive_Critical
2319 ? "Critical" : "Offline"),
2320 LogicalDriveInformation
->LogicalDriveSize
,
2321 (LogicalDriveInformation
->WriteBack
2322 ? "Write Back" : "Write Thru"));
2329 DAC960_V2_ReportDeviceConfiguration reports the Device Configuration
2330 Information for DAC960 V2 Firmware Controllers.
2333 static bool DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
2336 int PhysicalDeviceIndex
, LogicalDriveNumber
;
2337 DAC960_Info(" Physical Devices:\n", Controller
);
2338 for (PhysicalDeviceIndex
= 0;
2339 PhysicalDeviceIndex
< DAC960_V2_MaxPhysicalDevices
;
2340 PhysicalDeviceIndex
++)
2342 DAC960_V2_PhysicalDeviceInfo_T
*PhysicalDeviceInfo
=
2343 Controller
->V2
.PhysicalDeviceInformation
[PhysicalDeviceIndex
];
2344 DAC960_SCSI_Inquiry_T
*InquiryStandardData
=
2345 (DAC960_SCSI_Inquiry_T
*) &PhysicalDeviceInfo
->SCSI_InquiryData
;
2346 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
2347 Controller
->V2
.InquiryUnitSerialNumber
[PhysicalDeviceIndex
];
2348 char Vendor
[1+sizeof(InquiryStandardData
->VendorIdentification
)];
2349 char Model
[1+sizeof(InquiryStandardData
->ProductIdentification
)];
2350 char Revision
[1+sizeof(InquiryStandardData
->ProductRevisionLevel
)];
2351 char SerialNumber
[1+sizeof(InquiryUnitSerialNumber
->ProductSerialNumber
)];
2352 if (PhysicalDeviceInfo
== NULL
) break;
2353 DAC960_SanitizeInquiryData(InquiryStandardData
, InquiryUnitSerialNumber
,
2354 Vendor
, Model
, Revision
, SerialNumber
);
2355 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2357 PhysicalDeviceInfo
->Channel
,
2358 PhysicalDeviceInfo
->TargetID
,
2359 (PhysicalDeviceInfo
->TargetID
< 10 ? " " : ""),
2360 Vendor
, Model
, Revision
);
2361 if (PhysicalDeviceInfo
->NegotiatedSynchronousMegaTransfers
== 0)
2362 DAC960_Info(" %sAsynchronous\n", Controller
,
2363 (PhysicalDeviceInfo
->NegotiatedDataWidthBits
== 16
2366 DAC960_Info(" %sSynchronous at %d MB/sec\n", Controller
,
2367 (PhysicalDeviceInfo
->NegotiatedDataWidthBits
== 16
2369 (PhysicalDeviceInfo
->NegotiatedSynchronousMegaTransfers
2370 * PhysicalDeviceInfo
->NegotiatedDataWidthBits
/8));
2371 if (InquiryUnitSerialNumber
->PeripheralDeviceType
!= 0x1F)
2372 DAC960_Info(" Serial Number: %s\n", Controller
, SerialNumber
);
2373 if (PhysicalDeviceInfo
->PhysicalDeviceState
==
2374 DAC960_V2_Device_Unconfigured
)
2376 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller
,
2377 (PhysicalDeviceInfo
->PhysicalDeviceState
2378 == DAC960_V2_Device_Online
2380 : PhysicalDeviceInfo
->PhysicalDeviceState
2381 == DAC960_V2_Device_Rebuild
2383 : PhysicalDeviceInfo
->PhysicalDeviceState
2384 == DAC960_V2_Device_Missing
2386 : PhysicalDeviceInfo
->PhysicalDeviceState
2387 == DAC960_V2_Device_Critical
2389 : PhysicalDeviceInfo
->PhysicalDeviceState
2390 == DAC960_V2_Device_Dead
2392 : PhysicalDeviceInfo
->PhysicalDeviceState
2393 == DAC960_V2_Device_SuspectedDead
2395 : PhysicalDeviceInfo
->PhysicalDeviceState
2396 == DAC960_V2_Device_CommandedOffline
2397 ? "Commanded-Offline"
2398 : PhysicalDeviceInfo
->PhysicalDeviceState
2399 == DAC960_V2_Device_Standby
2400 ? "Standby" : "Unknown"),
2401 PhysicalDeviceInfo
->ConfigurableDeviceSize
);
2402 if (PhysicalDeviceInfo
->ParityErrors
== 0 &&
2403 PhysicalDeviceInfo
->SoftErrors
== 0 &&
2404 PhysicalDeviceInfo
->HardErrors
== 0 &&
2405 PhysicalDeviceInfo
->MiscellaneousErrors
== 0 &&
2406 PhysicalDeviceInfo
->CommandTimeouts
== 0 &&
2407 PhysicalDeviceInfo
->Retries
== 0 &&
2408 PhysicalDeviceInfo
->Aborts
== 0 &&
2409 PhysicalDeviceInfo
->PredictedFailuresDetected
== 0)
2411 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2412 "Hard: %d, Misc: %d\n", Controller
,
2413 PhysicalDeviceInfo
->ParityErrors
,
2414 PhysicalDeviceInfo
->SoftErrors
,
2415 PhysicalDeviceInfo
->HardErrors
,
2416 PhysicalDeviceInfo
->MiscellaneousErrors
);
2417 DAC960_Info(" Timeouts: %d, Retries: %d, "
2418 "Aborts: %d, Predicted: %d\n", Controller
,
2419 PhysicalDeviceInfo
->CommandTimeouts
,
2420 PhysicalDeviceInfo
->Retries
,
2421 PhysicalDeviceInfo
->Aborts
,
2422 PhysicalDeviceInfo
->PredictedFailuresDetected
);
2424 DAC960_Info(" Logical Drives:\n", Controller
);
2425 for (LogicalDriveNumber
= 0;
2426 LogicalDriveNumber
< DAC960_MaxLogicalDrives
;
2427 LogicalDriveNumber
++)
2429 DAC960_V2_LogicalDeviceInfo_T
*LogicalDeviceInfo
=
2430 Controller
->V2
.LogicalDeviceInformation
[LogicalDriveNumber
];
2431 static const unsigned char *ReadCacheStatus
[] = {
2432 "Read Cache Disabled",
2433 "Read Cache Enabled",
2434 "Read Ahead Enabled",
2435 "Intelligent Read Ahead Enabled",
2438 static const unsigned char *WriteCacheStatus
[] = {
2439 "Write Cache Disabled",
2440 "Logical Device Read Only",
2441 "Write Cache Enabled",
2442 "Intelligent Write Cache Enabled",
2445 unsigned char *GeometryTranslation
;
2446 if (LogicalDeviceInfo
== NULL
) continue;
2447 switch (LogicalDeviceInfo
->DriveGeometry
)
2449 case DAC960_V2_Geometry_128_32
:
2450 GeometryTranslation
= "128/32";
2452 case DAC960_V2_Geometry_255_63
:
2453 GeometryTranslation
= "255/63";
2456 GeometryTranslation
= "Invalid";
2457 DAC960_Error("Illegal Logical Device Geometry %d\n",
2458 Controller
, LogicalDeviceInfo
->DriveGeometry
);
2461 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks\n",
2462 Controller
, Controller
->ControllerNumber
, LogicalDriveNumber
,
2463 LogicalDeviceInfo
->RAIDLevel
,
2464 (LogicalDeviceInfo
->LogicalDeviceState
2465 == DAC960_V2_LogicalDevice_Online
2467 : LogicalDeviceInfo
->LogicalDeviceState
2468 == DAC960_V2_LogicalDevice_Critical
2469 ? "Critical" : "Offline"),
2470 LogicalDeviceInfo
->ConfigurableDeviceSize
);
2471 DAC960_Info(" Logical Device %s, BIOS Geometry: %s\n",
2473 (LogicalDeviceInfo
->LogicalDeviceControl
2474 .LogicalDeviceInitialized
2475 ? "Initialized" : "Uninitialized"),
2476 GeometryTranslation
);
2477 if (LogicalDeviceInfo
->StripeSize
== 0)
2479 if (LogicalDeviceInfo
->CacheLineSize
== 0)
2480 DAC960_Info(" Stripe Size: N/A, "
2481 "Segment Size: N/A\n", Controller
);
2483 DAC960_Info(" Stripe Size: N/A, "
2484 "Segment Size: %dKB\n", Controller
,
2485 1 << (LogicalDeviceInfo
->CacheLineSize
- 2));
2489 if (LogicalDeviceInfo
->CacheLineSize
== 0)
2490 DAC960_Info(" Stripe Size: %dKB, "
2491 "Segment Size: N/A\n", Controller
,
2492 1 << (LogicalDeviceInfo
->StripeSize
- 2));
2494 DAC960_Info(" Stripe Size: %dKB, "
2495 "Segment Size: %dKB\n", Controller
,
2496 1 << (LogicalDeviceInfo
->StripeSize
- 2),
2497 1 << (LogicalDeviceInfo
->CacheLineSize
- 2));
2499 DAC960_Info(" %s, %s\n", Controller
,
2501 LogicalDeviceInfo
->LogicalDeviceControl
.ReadCache
],
2503 LogicalDeviceInfo
->LogicalDeviceControl
.WriteCache
]);
2504 if (LogicalDeviceInfo
->SoftErrors
> 0 ||
2505 LogicalDeviceInfo
->CommandsFailed
> 0 ||
2506 LogicalDeviceInfo
->DeferredWriteErrors
)
2507 DAC960_Info(" Errors - Soft: %d, Failed: %d, "
2508 "Deferred Write: %d\n", Controller
,
2509 LogicalDeviceInfo
->SoftErrors
,
2510 LogicalDeviceInfo
->CommandsFailed
,
2511 LogicalDeviceInfo
->DeferredWriteErrors
);
2518 DAC960_RegisterBlockDevice registers the Block Device structures
2519 associated with Controller.
2522 static bool DAC960_RegisterBlockDevice(DAC960_Controller_T
*Controller
)
2524 int MajorNumber
= DAC960_MAJOR
+ Controller
->ControllerNumber
;
2528 Register the Block Device Major Number for this DAC960 Controller.
2530 if (register_blkdev(MajorNumber
, "dac960") < 0)
2533 for (n
= 0; n
< DAC960_MaxLogicalDrives
; n
++) {
2534 struct gendisk
*disk
= Controller
->disks
[n
];
2535 struct request_queue
*RequestQueue
;
2537 /* for now, let all request queues share controller's lock */
2538 RequestQueue
= blk_init_queue(DAC960_RequestFunction
,&Controller
->queue_lock
);
2539 if (!RequestQueue
) {
2540 printk("DAC960: failure to allocate request queue\n");
2543 Controller
->RequestQueue
[n
] = RequestQueue
;
2544 RequestQueue
->queuedata
= Controller
;
2545 blk_queue_max_segments(RequestQueue
, Controller
->DriverScatterGatherLimit
);
2546 blk_queue_max_hw_sectors(RequestQueue
, Controller
->MaxBlocksPerCommand
);
2547 disk
->queue
= RequestQueue
;
2548 sprintf(disk
->disk_name
, "rd/c%dd%d", Controller
->ControllerNumber
, n
);
2549 disk
->major
= MajorNumber
;
2550 disk
->first_minor
= n
<< DAC960_MaxPartitionsBits
;
2551 disk
->fops
= &DAC960_BlockDeviceOperations
;
2554 Indicate the Block Device Registration completed successfully,
2561 DAC960_UnregisterBlockDevice unregisters the Block Device structures
2562 associated with Controller.
2565 static void DAC960_UnregisterBlockDevice(DAC960_Controller_T
*Controller
)
2567 int MajorNumber
= DAC960_MAJOR
+ Controller
->ControllerNumber
;
2570 /* does order matter when deleting gendisk and cleanup in request queue? */
2571 for (disk
= 0; disk
< DAC960_MaxLogicalDrives
; disk
++) {
2572 del_gendisk(Controller
->disks
[disk
]);
2573 blk_cleanup_queue(Controller
->RequestQueue
[disk
]);
2574 Controller
->RequestQueue
[disk
] = NULL
;
2578 Unregister the Block Device Major Number for this DAC960 Controller.
2580 unregister_blkdev(MajorNumber
, "dac960");
2584 DAC960_ComputeGenericDiskInfo computes the values for the Generic Disk
2585 Information Partition Sector Counts and Block Sizes.
2588 static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T
*Controller
)
2591 for (disk
= 0; disk
< DAC960_MaxLogicalDrives
; disk
++)
2592 set_capacity(Controller
->disks
[disk
], disk_size(Controller
, disk
));
2596 DAC960_ReportErrorStatus reports Controller BIOS Messages passed through
2597 the Error Status Register when the driver performs the BIOS handshaking.
2598 It returns true for fatal errors and false otherwise.
2601 static bool DAC960_ReportErrorStatus(DAC960_Controller_T
*Controller
,
2602 unsigned char ErrorStatus
,
2603 unsigned char Parameter0
,
2604 unsigned char Parameter1
)
2606 switch (ErrorStatus
)
2609 DAC960_Notice("Physical Device %d:%d Not Responding\n",
2610 Controller
, Parameter1
, Parameter0
);
2613 if (Controller
->DriveSpinUpMessageDisplayed
) break;
2614 DAC960_Notice("Spinning Up Drives\n", Controller
);
2615 Controller
->DriveSpinUpMessageDisplayed
= true;
2618 DAC960_Notice("Configuration Checksum Error\n", Controller
);
2621 DAC960_Notice("Mirror Race Recovery Failed\n", Controller
);
2624 DAC960_Notice("Mirror Race Recovery In Progress\n", Controller
);
2627 DAC960_Notice("Physical Device %d:%d COD Mismatch\n",
2628 Controller
, Parameter1
, Parameter0
);
2631 DAC960_Notice("Logical Drive Installation Aborted\n", Controller
);
2634 DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller
);
2637 DAC960_Notice("New Controller Configuration Found\n", Controller
);
2640 DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller
);
2643 DAC960_Error("Unknown Initialization Error %02X for Controller at\n",
2644 Controller
, ErrorStatus
);
2652 * DAC960_DetectCleanup releases the resources that were allocated
2653 * during DAC960_DetectController(). DAC960_DetectController can
2654 * has several internal failure points, so not ALL resources may
2655 * have been allocated. It's important to free only
2656 * resources that HAVE been allocated. The code below always
2657 * tests that the resource has been allocated before attempting to
2660 static void DAC960_DetectCleanup(DAC960_Controller_T
*Controller
)
2664 /* Free the memory mailbox, status, and related structures */
2665 free_dma_loaf(Controller
->PCIDevice
, &Controller
->DmaPages
);
2666 if (Controller
->MemoryMappedAddress
) {
2667 switch(Controller
->HardwareType
)
2669 case DAC960_GEM_Controller
:
2670 DAC960_GEM_DisableInterrupts(Controller
->BaseAddress
);
2672 case DAC960_BA_Controller
:
2673 DAC960_BA_DisableInterrupts(Controller
->BaseAddress
);
2675 case DAC960_LP_Controller
:
2676 DAC960_LP_DisableInterrupts(Controller
->BaseAddress
);
2678 case DAC960_LA_Controller
:
2679 DAC960_LA_DisableInterrupts(Controller
->BaseAddress
);
2681 case DAC960_PG_Controller
:
2682 DAC960_PG_DisableInterrupts(Controller
->BaseAddress
);
2684 case DAC960_PD_Controller
:
2685 DAC960_PD_DisableInterrupts(Controller
->BaseAddress
);
2687 case DAC960_P_Controller
:
2688 DAC960_PD_DisableInterrupts(Controller
->BaseAddress
);
2691 iounmap(Controller
->MemoryMappedAddress
);
2693 if (Controller
->IRQ_Channel
)
2694 free_irq(Controller
->IRQ_Channel
, Controller
);
2695 if (Controller
->IO_Address
)
2696 release_region(Controller
->IO_Address
, 0x80);
2697 pci_disable_device(Controller
->PCIDevice
);
2698 for (i
= 0; (i
< DAC960_MaxLogicalDrives
) && Controller
->disks
[i
]; i
++)
2699 put_disk(Controller
->disks
[i
]);
2700 DAC960_Controllers
[Controller
->ControllerNumber
] = NULL
;
2706 DAC960_DetectController detects Mylex DAC960/AcceleRAID/eXtremeRAID
2707 PCI RAID Controllers by interrogating the PCI Configuration Space for
2711 static DAC960_Controller_T
*
2712 DAC960_DetectController(struct pci_dev
*PCI_Device
,
2713 const struct pci_device_id
*entry
)
2715 struct DAC960_privdata
*privdata
=
2716 (struct DAC960_privdata
*)entry
->driver_data
;
2717 irq_handler_t InterruptHandler
= privdata
->InterruptHandler
;
2718 unsigned int MemoryWindowSize
= privdata
->MemoryWindowSize
;
2719 DAC960_Controller_T
*Controller
= NULL
;
2720 unsigned char DeviceFunction
= PCI_Device
->devfn
;
2721 unsigned char ErrorStatus
, Parameter0
, Parameter1
;
2722 unsigned int IRQ_Channel
;
2723 void __iomem
*BaseAddress
;
2726 Controller
= kzalloc(sizeof(DAC960_Controller_T
), GFP_ATOMIC
);
2727 if (Controller
== NULL
) {
2728 DAC960_Error("Unable to allocate Controller structure for "
2729 "Controller at\n", NULL
);
2732 Controller
->ControllerNumber
= DAC960_ControllerCount
;
2733 DAC960_Controllers
[DAC960_ControllerCount
++] = Controller
;
2734 Controller
->Bus
= PCI_Device
->bus
->number
;
2735 Controller
->FirmwareType
= privdata
->FirmwareType
;
2736 Controller
->HardwareType
= privdata
->HardwareType
;
2737 Controller
->Device
= DeviceFunction
>> 3;
2738 Controller
->Function
= DeviceFunction
& 0x7;
2739 Controller
->PCIDevice
= PCI_Device
;
2740 strcpy(Controller
->FullModelName
, "DAC960");
2742 if (pci_enable_device(PCI_Device
))
2745 switch (Controller
->HardwareType
)
2747 case DAC960_GEM_Controller
:
2748 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 0);
2750 case DAC960_BA_Controller
:
2751 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 0);
2753 case DAC960_LP_Controller
:
2754 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 0);
2756 case DAC960_LA_Controller
:
2757 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 0);
2759 case DAC960_PG_Controller
:
2760 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 0);
2762 case DAC960_PD_Controller
:
2763 Controller
->IO_Address
= pci_resource_start(PCI_Device
, 0);
2764 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 1);
2766 case DAC960_P_Controller
:
2767 Controller
->IO_Address
= pci_resource_start(PCI_Device
, 0);
2768 Controller
->PCI_Address
= pci_resource_start(PCI_Device
, 1);
2772 pci_set_drvdata(PCI_Device
, (void *)((long)Controller
->ControllerNumber
));
2773 for (i
= 0; i
< DAC960_MaxLogicalDrives
; i
++) {
2774 Controller
->disks
[i
] = alloc_disk(1<<DAC960_MaxPartitionsBits
);
2775 if (!Controller
->disks
[i
])
2777 Controller
->disks
[i
]->private_data
= (void *)((long)i
);
2779 init_waitqueue_head(&Controller
->CommandWaitQueue
);
2780 init_waitqueue_head(&Controller
->HealthStatusWaitQueue
);
2781 spin_lock_init(&Controller
->queue_lock
);
2782 DAC960_AnnounceDriver(Controller
);
2784 Map the Controller Register Window.
2786 if (MemoryWindowSize
< PAGE_SIZE
)
2787 MemoryWindowSize
= PAGE_SIZE
;
2788 Controller
->MemoryMappedAddress
=
2789 ioremap_nocache(Controller
->PCI_Address
& PAGE_MASK
, MemoryWindowSize
);
2790 Controller
->BaseAddress
=
2791 Controller
->MemoryMappedAddress
+ (Controller
->PCI_Address
& ~PAGE_MASK
);
2792 if (Controller
->MemoryMappedAddress
== NULL
)
2794 DAC960_Error("Unable to map Controller Register Window for "
2795 "Controller at\n", Controller
);
2798 BaseAddress
= Controller
->BaseAddress
;
2799 switch (Controller
->HardwareType
)
2801 case DAC960_GEM_Controller
:
2802 DAC960_GEM_DisableInterrupts(BaseAddress
);
2803 DAC960_GEM_AcknowledgeHardwareMailboxStatus(BaseAddress
);
2805 while (DAC960_GEM_InitializationInProgressP(BaseAddress
))
2807 if (DAC960_GEM_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2808 &Parameter0
, &Parameter1
) &&
2809 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2810 Parameter0
, Parameter1
))
2814 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller
))
2816 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2817 "for Controller at\n", Controller
);
2820 DAC960_GEM_EnableInterrupts(BaseAddress
);
2821 Controller
->QueueCommand
= DAC960_GEM_QueueCommand
;
2822 Controller
->ReadControllerConfiguration
=
2823 DAC960_V2_ReadControllerConfiguration
;
2824 Controller
->ReadDeviceConfiguration
=
2825 DAC960_V2_ReadDeviceConfiguration
;
2826 Controller
->ReportDeviceConfiguration
=
2827 DAC960_V2_ReportDeviceConfiguration
;
2828 Controller
->QueueReadWriteCommand
=
2829 DAC960_V2_QueueReadWriteCommand
;
2831 case DAC960_BA_Controller
:
2832 DAC960_BA_DisableInterrupts(BaseAddress
);
2833 DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress
);
2835 while (DAC960_BA_InitializationInProgressP(BaseAddress
))
2837 if (DAC960_BA_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2838 &Parameter0
, &Parameter1
) &&
2839 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2840 Parameter0
, Parameter1
))
2844 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller
))
2846 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2847 "for Controller at\n", Controller
);
2850 DAC960_BA_EnableInterrupts(BaseAddress
);
2851 Controller
->QueueCommand
= DAC960_BA_QueueCommand
;
2852 Controller
->ReadControllerConfiguration
=
2853 DAC960_V2_ReadControllerConfiguration
;
2854 Controller
->ReadDeviceConfiguration
=
2855 DAC960_V2_ReadDeviceConfiguration
;
2856 Controller
->ReportDeviceConfiguration
=
2857 DAC960_V2_ReportDeviceConfiguration
;
2858 Controller
->QueueReadWriteCommand
=
2859 DAC960_V2_QueueReadWriteCommand
;
2861 case DAC960_LP_Controller
:
2862 DAC960_LP_DisableInterrupts(BaseAddress
);
2863 DAC960_LP_AcknowledgeHardwareMailboxStatus(BaseAddress
);
2865 while (DAC960_LP_InitializationInProgressP(BaseAddress
))
2867 if (DAC960_LP_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2868 &Parameter0
, &Parameter1
) &&
2869 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2870 Parameter0
, Parameter1
))
2874 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller
))
2876 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2877 "for Controller at\n", Controller
);
2880 DAC960_LP_EnableInterrupts(BaseAddress
);
2881 Controller
->QueueCommand
= DAC960_LP_QueueCommand
;
2882 Controller
->ReadControllerConfiguration
=
2883 DAC960_V2_ReadControllerConfiguration
;
2884 Controller
->ReadDeviceConfiguration
=
2885 DAC960_V2_ReadDeviceConfiguration
;
2886 Controller
->ReportDeviceConfiguration
=
2887 DAC960_V2_ReportDeviceConfiguration
;
2888 Controller
->QueueReadWriteCommand
=
2889 DAC960_V2_QueueReadWriteCommand
;
2891 case DAC960_LA_Controller
:
2892 DAC960_LA_DisableInterrupts(BaseAddress
);
2893 DAC960_LA_AcknowledgeHardwareMailboxStatus(BaseAddress
);
2895 while (DAC960_LA_InitializationInProgressP(BaseAddress
))
2897 if (DAC960_LA_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2898 &Parameter0
, &Parameter1
) &&
2899 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2900 Parameter0
, Parameter1
))
2904 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller
))
2906 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2907 "for Controller at\n", Controller
);
2910 DAC960_LA_EnableInterrupts(BaseAddress
);
2911 if (Controller
->V1
.DualModeMemoryMailboxInterface
)
2912 Controller
->QueueCommand
= DAC960_LA_QueueCommandDualMode
;
2913 else Controller
->QueueCommand
= DAC960_LA_QueueCommandSingleMode
;
2914 Controller
->ReadControllerConfiguration
=
2915 DAC960_V1_ReadControllerConfiguration
;
2916 Controller
->ReadDeviceConfiguration
=
2917 DAC960_V1_ReadDeviceConfiguration
;
2918 Controller
->ReportDeviceConfiguration
=
2919 DAC960_V1_ReportDeviceConfiguration
;
2920 Controller
->QueueReadWriteCommand
=
2921 DAC960_V1_QueueReadWriteCommand
;
2923 case DAC960_PG_Controller
:
2924 DAC960_PG_DisableInterrupts(BaseAddress
);
2925 DAC960_PG_AcknowledgeHardwareMailboxStatus(BaseAddress
);
2927 while (DAC960_PG_InitializationInProgressP(BaseAddress
))
2929 if (DAC960_PG_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2930 &Parameter0
, &Parameter1
) &&
2931 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2932 Parameter0
, Parameter1
))
2936 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller
))
2938 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2939 "for Controller at\n", Controller
);
2942 DAC960_PG_EnableInterrupts(BaseAddress
);
2943 if (Controller
->V1
.DualModeMemoryMailboxInterface
)
2944 Controller
->QueueCommand
= DAC960_PG_QueueCommandDualMode
;
2945 else Controller
->QueueCommand
= DAC960_PG_QueueCommandSingleMode
;
2946 Controller
->ReadControllerConfiguration
=
2947 DAC960_V1_ReadControllerConfiguration
;
2948 Controller
->ReadDeviceConfiguration
=
2949 DAC960_V1_ReadDeviceConfiguration
;
2950 Controller
->ReportDeviceConfiguration
=
2951 DAC960_V1_ReportDeviceConfiguration
;
2952 Controller
->QueueReadWriteCommand
=
2953 DAC960_V1_QueueReadWriteCommand
;
2955 case DAC960_PD_Controller
:
2956 if (!request_region(Controller
->IO_Address
, 0x80,
2957 Controller
->FullModelName
)) {
2958 DAC960_Error("IO port 0x%lx busy for Controller at\n",
2959 Controller
, Controller
->IO_Address
);
2962 DAC960_PD_DisableInterrupts(BaseAddress
);
2963 DAC960_PD_AcknowledgeStatus(BaseAddress
);
2965 while (DAC960_PD_InitializationInProgressP(BaseAddress
))
2967 if (DAC960_PD_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
2968 &Parameter0
, &Parameter1
) &&
2969 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
2970 Parameter0
, Parameter1
))
2974 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller
))
2976 DAC960_Error("Unable to allocate DMA mapped memory "
2977 "for Controller at\n", Controller
);
2980 DAC960_PD_EnableInterrupts(BaseAddress
);
2981 Controller
->QueueCommand
= DAC960_PD_QueueCommand
;
2982 Controller
->ReadControllerConfiguration
=
2983 DAC960_V1_ReadControllerConfiguration
;
2984 Controller
->ReadDeviceConfiguration
=
2985 DAC960_V1_ReadDeviceConfiguration
;
2986 Controller
->ReportDeviceConfiguration
=
2987 DAC960_V1_ReportDeviceConfiguration
;
2988 Controller
->QueueReadWriteCommand
=
2989 DAC960_V1_QueueReadWriteCommand
;
2991 case DAC960_P_Controller
:
2992 if (!request_region(Controller
->IO_Address
, 0x80,
2993 Controller
->FullModelName
)){
2994 DAC960_Error("IO port 0x%lx busy for Controller at\n",
2995 Controller
, Controller
->IO_Address
);
2998 DAC960_PD_DisableInterrupts(BaseAddress
);
2999 DAC960_PD_AcknowledgeStatus(BaseAddress
);
3001 while (DAC960_PD_InitializationInProgressP(BaseAddress
))
3003 if (DAC960_PD_ReadErrorStatus(BaseAddress
, &ErrorStatus
,
3004 &Parameter0
, &Parameter1
) &&
3005 DAC960_ReportErrorStatus(Controller
, ErrorStatus
,
3006 Parameter0
, Parameter1
))
3010 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller
))
3012 DAC960_Error("Unable to allocate DMA mapped memory"
3013 "for Controller at\n", Controller
);
3016 DAC960_PD_EnableInterrupts(BaseAddress
);
3017 Controller
->QueueCommand
= DAC960_P_QueueCommand
;
3018 Controller
->ReadControllerConfiguration
=
3019 DAC960_V1_ReadControllerConfiguration
;
3020 Controller
->ReadDeviceConfiguration
=
3021 DAC960_V1_ReadDeviceConfiguration
;
3022 Controller
->ReportDeviceConfiguration
=
3023 DAC960_V1_ReportDeviceConfiguration
;
3024 Controller
->QueueReadWriteCommand
=
3025 DAC960_V1_QueueReadWriteCommand
;
3029 Acquire shared access to the IRQ Channel.
3031 IRQ_Channel
= PCI_Device
->irq
;
3032 if (request_irq(IRQ_Channel
, InterruptHandler
, IRQF_SHARED
,
3033 Controller
->FullModelName
, Controller
) < 0)
3035 DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n",
3036 Controller
, Controller
->IRQ_Channel
);
3039 Controller
->IRQ_Channel
= IRQ_Channel
;
3040 Controller
->InitialCommand
.CommandIdentifier
= 1;
3041 Controller
->InitialCommand
.Controller
= Controller
;
3042 Controller
->Commands
[0] = &Controller
->InitialCommand
;
3043 Controller
->FreeCommands
= &Controller
->InitialCommand
;
3047 if (Controller
->IO_Address
== 0)
3048 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
3049 "PCI Address 0x%X\n", Controller
,
3050 Controller
->Bus
, Controller
->Device
,
3051 Controller
->Function
, Controller
->PCI_Address
);
3053 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
3054 "0x%X PCI Address 0x%X\n", Controller
,
3055 Controller
->Bus
, Controller
->Device
,
3056 Controller
->Function
, Controller
->IO_Address
,
3057 Controller
->PCI_Address
);
3058 DAC960_DetectCleanup(Controller
);
3059 DAC960_ControllerCount
--;
3064 DAC960_InitializeController initializes Controller.
3068 DAC960_InitializeController(DAC960_Controller_T
*Controller
)
3070 if (DAC960_ReadControllerConfiguration(Controller
) &&
3071 DAC960_ReportControllerConfiguration(Controller
) &&
3072 DAC960_CreateAuxiliaryStructures(Controller
) &&
3073 DAC960_ReadDeviceConfiguration(Controller
) &&
3074 DAC960_ReportDeviceConfiguration(Controller
) &&
3075 DAC960_RegisterBlockDevice(Controller
))
3078 Initialize the Monitoring Timer.
3080 timer_setup(&Controller
->MonitoringTimer
,
3081 DAC960_MonitoringTimerFunction
, 0);
3082 Controller
->MonitoringTimer
.expires
=
3083 jiffies
+ DAC960_MonitoringTimerInterval
;
3084 add_timer(&Controller
->MonitoringTimer
);
3085 Controller
->ControllerInitialized
= true;
3093 DAC960_FinalizeController finalizes Controller.
3096 static void DAC960_FinalizeController(DAC960_Controller_T
*Controller
)
3098 if (Controller
->ControllerInitialized
)
3100 unsigned long flags
;
3103 * Acquiring and releasing lock here eliminates
3104 * a very low probability race.
3106 * The code below allocates controller command structures
3107 * from the free list without holding the controller lock.
3108 * This is safe assuming there is no other activity on
3109 * the controller at the time.
3111 * But, there might be a monitoring command still
3112 * in progress. Setting the Shutdown flag while holding
3113 * the lock ensures that there is no monitoring command
3114 * in the interrupt handler currently, and any monitoring
3115 * commands that complete from this time on will NOT return
3116 * their command structure to the free list.
3119 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
3120 Controller
->ShutdownMonitoringTimer
= 1;
3121 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
3123 del_timer_sync(&Controller
->MonitoringTimer
);
3124 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
3126 DAC960_Notice("Flushing Cache...", Controller
);
3127 DAC960_V1_ExecuteType3(Controller
, DAC960_V1_Flush
, 0);
3128 DAC960_Notice("done\n", Controller
);
3130 if (Controller
->HardwareType
== DAC960_PD_Controller
)
3131 release_region(Controller
->IO_Address
, 0x80);
3135 DAC960_Notice("Flushing Cache...", Controller
);
3136 DAC960_V2_DeviceOperation(Controller
, DAC960_V2_PauseDevice
,
3137 DAC960_V2_RAID_Controller
);
3138 DAC960_Notice("done\n", Controller
);
3141 DAC960_UnregisterBlockDevice(Controller
);
3142 DAC960_DestroyAuxiliaryStructures(Controller
);
3143 DAC960_DestroyProcEntries(Controller
);
3144 DAC960_DetectCleanup(Controller
);
3149 DAC960_Probe verifies controller's existence and
3150 initializes the DAC960 Driver for that controller.
3154 DAC960_Probe(struct pci_dev
*dev
, const struct pci_device_id
*entry
)
3157 DAC960_Controller_T
*Controller
;
3159 if (DAC960_ControllerCount
== DAC960_MaxControllers
)
3161 DAC960_Error("More than %d DAC960 Controllers detected - "
3162 "ignoring from Controller at\n",
3163 NULL
, DAC960_MaxControllers
);
3167 Controller
= DAC960_DetectController(dev
, entry
);
3171 if (!DAC960_InitializeController(Controller
)) {
3172 DAC960_FinalizeController(Controller
);
3176 for (disk
= 0; disk
< DAC960_MaxLogicalDrives
; disk
++) {
3177 set_capacity(Controller
->disks
[disk
], disk_size(Controller
, disk
));
3178 add_disk(Controller
->disks
[disk
]);
3180 DAC960_CreateProcEntries(Controller
);
3186 DAC960_Finalize finalizes the DAC960 Driver.
3189 static void DAC960_Remove(struct pci_dev
*PCI_Device
)
3191 int Controller_Number
= (long)pci_get_drvdata(PCI_Device
);
3192 DAC960_Controller_T
*Controller
= DAC960_Controllers
[Controller_Number
];
3193 if (Controller
!= NULL
)
3194 DAC960_FinalizeController(Controller
);
3199 DAC960_V1_QueueReadWriteCommand prepares and queues a Read/Write Command for
3200 DAC960 V1 Firmware Controllers.
3203 static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T
*Command
)
3205 DAC960_Controller_T
*Controller
= Command
->Controller
;
3206 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
3207 DAC960_V1_ScatterGatherSegment_T
*ScatterGatherList
=
3208 Command
->V1
.ScatterGatherList
;
3209 struct scatterlist
*ScatterList
= Command
->V1
.ScatterList
;
3211 DAC960_V1_ClearCommand(Command
);
3213 if (Command
->SegmentCount
== 1)
3215 if (Command
->DmaDirection
== PCI_DMA_FROMDEVICE
)
3216 CommandMailbox
->Type5
.CommandOpcode
= DAC960_V1_Read
;
3218 CommandMailbox
->Type5
.CommandOpcode
= DAC960_V1_Write
;
3220 CommandMailbox
->Type5
.LD
.TransferLength
= Command
->BlockCount
;
3221 CommandMailbox
->Type5
.LD
.LogicalDriveNumber
= Command
->LogicalDriveNumber
;
3222 CommandMailbox
->Type5
.LogicalBlockAddress
= Command
->BlockNumber
;
3223 CommandMailbox
->Type5
.BusAddress
=
3224 (DAC960_BusAddress32_T
)sg_dma_address(ScatterList
);
3230 if (Command
->DmaDirection
== PCI_DMA_FROMDEVICE
)
3231 CommandMailbox
->Type5
.CommandOpcode
= DAC960_V1_ReadWithScatterGather
;
3233 CommandMailbox
->Type5
.CommandOpcode
= DAC960_V1_WriteWithScatterGather
;
3235 CommandMailbox
->Type5
.LD
.TransferLength
= Command
->BlockCount
;
3236 CommandMailbox
->Type5
.LD
.LogicalDriveNumber
= Command
->LogicalDriveNumber
;
3237 CommandMailbox
->Type5
.LogicalBlockAddress
= Command
->BlockNumber
;
3238 CommandMailbox
->Type5
.BusAddress
= Command
->V1
.ScatterGatherListDMA
;
3240 CommandMailbox
->Type5
.ScatterGatherCount
= Command
->SegmentCount
;
3242 for (i
= 0; i
< Command
->SegmentCount
; i
++, ScatterList
++, ScatterGatherList
++) {
3243 ScatterGatherList
->SegmentDataPointer
=
3244 (DAC960_BusAddress32_T
)sg_dma_address(ScatterList
);
3245 ScatterGatherList
->SegmentByteCount
=
3246 (DAC960_ByteCount32_T
)sg_dma_len(ScatterList
);
3249 DAC960_QueueCommand(Command
);
3254 DAC960_V2_QueueReadWriteCommand prepares and queues a Read/Write Command for
3255 DAC960 V2 Firmware Controllers.
3258 static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T
*Command
)
3260 DAC960_Controller_T
*Controller
= Command
->Controller
;
3261 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
3262 struct scatterlist
*ScatterList
= Command
->V2
.ScatterList
;
3264 DAC960_V2_ClearCommand(Command
);
3266 CommandMailbox
->SCSI_10
.CommandOpcode
= DAC960_V2_SCSI_10
;
3267 CommandMailbox
->SCSI_10
.CommandControlBits
.DataTransferControllerToHost
=
3268 (Command
->DmaDirection
== PCI_DMA_FROMDEVICE
);
3269 CommandMailbox
->SCSI_10
.DataTransferSize
=
3270 Command
->BlockCount
<< DAC960_BlockSizeBits
;
3271 CommandMailbox
->SCSI_10
.RequestSenseBusAddress
= Command
->V2
.RequestSenseDMA
;
3272 CommandMailbox
->SCSI_10
.PhysicalDevice
=
3273 Controller
->V2
.LogicalDriveToVirtualDevice
[Command
->LogicalDriveNumber
];
3274 CommandMailbox
->SCSI_10
.RequestSenseSize
= sizeof(DAC960_SCSI_RequestSense_T
);
3275 CommandMailbox
->SCSI_10
.CDBLength
= 10;
3276 CommandMailbox
->SCSI_10
.SCSI_CDB
[0] =
3277 (Command
->DmaDirection
== PCI_DMA_FROMDEVICE
? 0x28 : 0x2A);
3278 CommandMailbox
->SCSI_10
.SCSI_CDB
[2] = Command
->BlockNumber
>> 24;
3279 CommandMailbox
->SCSI_10
.SCSI_CDB
[3] = Command
->BlockNumber
>> 16;
3280 CommandMailbox
->SCSI_10
.SCSI_CDB
[4] = Command
->BlockNumber
>> 8;
3281 CommandMailbox
->SCSI_10
.SCSI_CDB
[5] = Command
->BlockNumber
;
3282 CommandMailbox
->SCSI_10
.SCSI_CDB
[7] = Command
->BlockCount
>> 8;
3283 CommandMailbox
->SCSI_10
.SCSI_CDB
[8] = Command
->BlockCount
;
3285 if (Command
->SegmentCount
== 1)
3287 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
3288 .ScatterGatherSegments
[0]
3289 .SegmentDataPointer
=
3290 (DAC960_BusAddress64_T
)sg_dma_address(ScatterList
);
3291 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
3292 .ScatterGatherSegments
[0]
3294 CommandMailbox
->SCSI_10
.DataTransferSize
;
3298 DAC960_V2_ScatterGatherSegment_T
*ScatterGatherList
;
3301 if (Command
->SegmentCount
> 2)
3303 ScatterGatherList
= Command
->V2
.ScatterGatherList
;
3304 CommandMailbox
->SCSI_10
.CommandControlBits
3305 .AdditionalScatterGatherListMemory
= true;
3306 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
3307 .ExtendedScatterGather
.ScatterGatherList0Length
= Command
->SegmentCount
;
3308 CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
3309 .ExtendedScatterGather
.ScatterGatherList0Address
=
3310 Command
->V2
.ScatterGatherListDMA
;
3313 ScatterGatherList
= CommandMailbox
->SCSI_10
.DataTransferMemoryAddress
3314 .ScatterGatherSegments
;
3316 for (i
= 0; i
< Command
->SegmentCount
; i
++, ScatterList
++, ScatterGatherList
++) {
3317 ScatterGatherList
->SegmentDataPointer
=
3318 (DAC960_BusAddress64_T
)sg_dma_address(ScatterList
);
3319 ScatterGatherList
->SegmentByteCount
=
3320 (DAC960_ByteCount64_T
)sg_dma_len(ScatterList
);
3323 DAC960_QueueCommand(Command
);
3327 static int DAC960_process_queue(DAC960_Controller_T
*Controller
, struct request_queue
*req_q
)
3329 struct request
*Request
;
3330 DAC960_Command_T
*Command
;
3333 Request
= blk_peek_request(req_q
);
3337 Command
= DAC960_AllocateCommand(Controller
);
3338 if (Command
== NULL
)
3341 if (rq_data_dir(Request
) == READ
) {
3342 Command
->DmaDirection
= PCI_DMA_FROMDEVICE
;
3343 Command
->CommandType
= DAC960_ReadCommand
;
3345 Command
->DmaDirection
= PCI_DMA_TODEVICE
;
3346 Command
->CommandType
= DAC960_WriteCommand
;
3348 Command
->Completion
= Request
->end_io_data
;
3349 Command
->LogicalDriveNumber
= (long)Request
->rq_disk
->private_data
;
3350 Command
->BlockNumber
= blk_rq_pos(Request
);
3351 Command
->BlockCount
= blk_rq_sectors(Request
);
3352 Command
->Request
= Request
;
3353 blk_start_request(Request
);
3354 Command
->SegmentCount
= blk_rq_map_sg(req_q
,
3355 Command
->Request
, Command
->cmd_sglist
);
3356 /* pci_map_sg MAY change the value of SegCount */
3357 Command
->SegmentCount
= pci_map_sg(Controller
->PCIDevice
, Command
->cmd_sglist
,
3358 Command
->SegmentCount
, Command
->DmaDirection
);
3360 DAC960_QueueReadWriteCommand(Command
);
3365 DAC960_ProcessRequest attempts to remove one I/O Request from Controller's
3366 I/O Request Queue and queues it to the Controller. WaitForCommand is true if
3367 this function should wait for a Command to become available if necessary.
3368 This function returns true if an I/O Request was queued and false otherwise.
3370 static void DAC960_ProcessRequest(DAC960_Controller_T
*controller
)
3374 if (!controller
->ControllerInitialized
)
3377 /* Do this better later! */
3378 for (i
= controller
->req_q_index
; i
< DAC960_MaxLogicalDrives
; i
++) {
3379 struct request_queue
*req_q
= controller
->RequestQueue
[i
];
3384 if (!DAC960_process_queue(controller
, req_q
)) {
3385 controller
->req_q_index
= i
;
3390 if (controller
->req_q_index
== 0)
3393 for (i
= 0; i
< controller
->req_q_index
; i
++) {
3394 struct request_queue
*req_q
= controller
->RequestQueue
[i
];
3399 if (!DAC960_process_queue(controller
, req_q
)) {
3400 controller
->req_q_index
= i
;
3408 DAC960_queue_partial_rw extracts one bio from the request already
3409 associated with argument command, and construct a new command block to retry I/O
3410 only on that bio. Queue that command to the controller.
3412 This function re-uses a previously-allocated Command,
3413 there is no failure mode from trying to allocate a command.
3416 static void DAC960_queue_partial_rw(DAC960_Command_T
*Command
)
3418 DAC960_Controller_T
*Controller
= Command
->Controller
;
3419 struct request
*Request
= Command
->Request
;
3420 struct request_queue
*req_q
= Controller
->RequestQueue
[Command
->LogicalDriveNumber
];
3422 if (Command
->DmaDirection
== PCI_DMA_FROMDEVICE
)
3423 Command
->CommandType
= DAC960_ReadRetryCommand
;
3425 Command
->CommandType
= DAC960_WriteRetryCommand
;
3428 * We could be more efficient with these mapping requests
3429 * and map only the portions that we need. But since this
3430 * code should almost never be called, just go with a
3433 (void)blk_rq_map_sg(req_q
, Command
->Request
, Command
->cmd_sglist
);
3435 (void)pci_map_sg(Controller
->PCIDevice
, Command
->cmd_sglist
, 1, Command
->DmaDirection
);
3437 * Resubmitting the request sector at a time is really tedious.
3438 * But, this should almost never happen. So, we're willing to pay
3439 * this price so that in the end, as much of the transfer is completed
3440 * successfully as possible.
3442 Command
->SegmentCount
= 1;
3443 Command
->BlockNumber
= blk_rq_pos(Request
);
3444 Command
->BlockCount
= 1;
3445 DAC960_QueueReadWriteCommand(Command
);
3450 DAC960_RequestFunction is the I/O Request Function for DAC960 Controllers.
3453 static void DAC960_RequestFunction(struct request_queue
*RequestQueue
)
3455 DAC960_ProcessRequest(RequestQueue
->queuedata
);
3459 DAC960_ProcessCompletedBuffer performs completion processing for an
3463 static inline bool DAC960_ProcessCompletedRequest(DAC960_Command_T
*Command
,
3466 struct request
*Request
= Command
->Request
;
3467 blk_status_t Error
= SuccessfulIO
? BLK_STS_OK
: BLK_STS_IOERR
;
3469 pci_unmap_sg(Command
->Controller
->PCIDevice
, Command
->cmd_sglist
,
3470 Command
->SegmentCount
, Command
->DmaDirection
);
3472 if (!__blk_end_request(Request
, Error
, Command
->BlockCount
<< 9)) {
3473 if (Command
->Completion
) {
3474 complete(Command
->Completion
);
3475 Command
->Completion
= NULL
;
3483 DAC960_V1_ReadWriteError prints an appropriate error message for Command
3484 when an error occurs on a Read or Write operation.
3487 static void DAC960_V1_ReadWriteError(DAC960_Command_T
*Command
)
3489 DAC960_Controller_T
*Controller
= Command
->Controller
;
3490 unsigned char *CommandName
= "UNKNOWN";
3491 switch (Command
->CommandType
)
3493 case DAC960_ReadCommand
:
3494 case DAC960_ReadRetryCommand
:
3495 CommandName
= "READ";
3497 case DAC960_WriteCommand
:
3498 case DAC960_WriteRetryCommand
:
3499 CommandName
= "WRITE";
3501 case DAC960_MonitoringCommand
:
3502 case DAC960_ImmediateCommand
:
3503 case DAC960_QueuedCommand
:
3506 switch (Command
->V1
.CommandStatus
)
3508 case DAC960_V1_IrrecoverableDataError
:
3509 DAC960_Error("Irrecoverable Data Error on %s:\n",
3510 Controller
, CommandName
);
3512 case DAC960_V1_LogicalDriveNonexistentOrOffline
:
3513 DAC960_Error("Logical Drive Nonexistent or Offline on %s:\n",
3514 Controller
, CommandName
);
3516 case DAC960_V1_AccessBeyondEndOfLogicalDrive
:
3517 DAC960_Error("Attempt to Access Beyond End of Logical Drive "
3518 "on %s:\n", Controller
, CommandName
);
3520 case DAC960_V1_BadDataEncountered
:
3521 DAC960_Error("Bad Data Encountered on %s:\n", Controller
, CommandName
);
3524 DAC960_Error("Unexpected Error Status %04X on %s:\n",
3525 Controller
, Command
->V1
.CommandStatus
, CommandName
);
3528 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
3529 Controller
, Controller
->ControllerNumber
,
3530 Command
->LogicalDriveNumber
, Command
->BlockNumber
,
3531 Command
->BlockNumber
+ Command
->BlockCount
- 1);
3536 DAC960_V1_ProcessCompletedCommand performs completion processing for Command
3537 for DAC960 V1 Firmware Controllers.
3540 static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T
*Command
)
3542 DAC960_Controller_T
*Controller
= Command
->Controller
;
3543 DAC960_CommandType_T CommandType
= Command
->CommandType
;
3544 DAC960_V1_CommandOpcode_T CommandOpcode
=
3545 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
;
3546 DAC960_V1_CommandStatus_T CommandStatus
= Command
->V1
.CommandStatus
;
3548 if (CommandType
== DAC960_ReadCommand
||
3549 CommandType
== DAC960_WriteCommand
)
3552 #ifdef FORCE_RETRY_DEBUG
3553 CommandStatus
= DAC960_V1_IrrecoverableDataError
;
3556 if (CommandStatus
== DAC960_V1_NormalCompletion
) {
3558 if (!DAC960_ProcessCompletedRequest(Command
, true))
3561 } else if (CommandStatus
== DAC960_V1_IrrecoverableDataError
||
3562 CommandStatus
== DAC960_V1_BadDataEncountered
)
3565 * break the command down into pieces and resubmit each
3566 * piece, hoping that some of them will succeed.
3568 DAC960_queue_partial_rw(Command
);
3573 if (CommandStatus
!= DAC960_V1_LogicalDriveNonexistentOrOffline
)
3574 DAC960_V1_ReadWriteError(Command
);
3576 if (!DAC960_ProcessCompletedRequest(Command
, false))
3580 else if (CommandType
== DAC960_ReadRetryCommand
||
3581 CommandType
== DAC960_WriteRetryCommand
)
3583 bool normal_completion
;
3584 #ifdef FORCE_RETRY_FAILURE_DEBUG
3585 static int retry_count
= 1;
3588 Perform completion processing for the portion that was
3589 retried, and submit the next portion, if any.
3591 normal_completion
= true;
3592 if (CommandStatus
!= DAC960_V1_NormalCompletion
) {
3593 normal_completion
= false;
3594 if (CommandStatus
!= DAC960_V1_LogicalDriveNonexistentOrOffline
)
3595 DAC960_V1_ReadWriteError(Command
);
3598 #ifdef FORCE_RETRY_FAILURE_DEBUG
3599 if (!(++retry_count
% 10000)) {
3600 printk("V1 error retry failure test\n");
3601 normal_completion
= false;
3602 DAC960_V1_ReadWriteError(Command
);
3606 if (!DAC960_ProcessCompletedRequest(Command
, normal_completion
)) {
3607 DAC960_queue_partial_rw(Command
);
3612 else if (CommandType
== DAC960_MonitoringCommand
)
3614 if (Controller
->ShutdownMonitoringTimer
)
3616 if (CommandOpcode
== DAC960_V1_Enquiry
)
3618 DAC960_V1_Enquiry_T
*OldEnquiry
= &Controller
->V1
.Enquiry
;
3619 DAC960_V1_Enquiry_T
*NewEnquiry
= Controller
->V1
.NewEnquiry
;
3620 unsigned int OldCriticalLogicalDriveCount
=
3621 OldEnquiry
->CriticalLogicalDriveCount
;
3622 unsigned int NewCriticalLogicalDriveCount
=
3623 NewEnquiry
->CriticalLogicalDriveCount
;
3624 if (NewEnquiry
->NumberOfLogicalDrives
> Controller
->LogicalDriveCount
)
3626 int LogicalDriveNumber
= Controller
->LogicalDriveCount
- 1;
3627 while (++LogicalDriveNumber
< NewEnquiry
->NumberOfLogicalDrives
)
3628 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3629 "Now Exists\n", Controller
,
3631 Controller
->ControllerNumber
,
3632 LogicalDriveNumber
);
3633 Controller
->LogicalDriveCount
= NewEnquiry
->NumberOfLogicalDrives
;
3634 DAC960_ComputeGenericDiskInfo(Controller
);
3636 if (NewEnquiry
->NumberOfLogicalDrives
< Controller
->LogicalDriveCount
)
3638 int LogicalDriveNumber
= NewEnquiry
->NumberOfLogicalDrives
- 1;
3639 while (++LogicalDriveNumber
< Controller
->LogicalDriveCount
)
3640 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3641 "No Longer Exists\n", Controller
,
3643 Controller
->ControllerNumber
,
3644 LogicalDriveNumber
);
3645 Controller
->LogicalDriveCount
= NewEnquiry
->NumberOfLogicalDrives
;
3646 DAC960_ComputeGenericDiskInfo(Controller
);
3648 if (NewEnquiry
->StatusFlags
.DeferredWriteError
!=
3649 OldEnquiry
->StatusFlags
.DeferredWriteError
)
3650 DAC960_Critical("Deferred Write Error Flag is now %s\n", Controller
,
3651 (NewEnquiry
->StatusFlags
.DeferredWriteError
3652 ? "TRUE" : "FALSE"));
3653 if ((NewCriticalLogicalDriveCount
> 0 ||
3654 NewCriticalLogicalDriveCount
!= OldCriticalLogicalDriveCount
) ||
3655 (NewEnquiry
->OfflineLogicalDriveCount
> 0 ||
3656 NewEnquiry
->OfflineLogicalDriveCount
!=
3657 OldEnquiry
->OfflineLogicalDriveCount
) ||
3658 (NewEnquiry
->DeadDriveCount
> 0 ||
3659 NewEnquiry
->DeadDriveCount
!=
3660 OldEnquiry
->DeadDriveCount
) ||
3661 (NewEnquiry
->EventLogSequenceNumber
!=
3662 OldEnquiry
->EventLogSequenceNumber
) ||
3663 Controller
->MonitoringTimerCount
== 0 ||
3664 time_after_eq(jiffies
, Controller
->SecondaryMonitoringTime
3665 + DAC960_SecondaryMonitoringInterval
))
3667 Controller
->V1
.NeedLogicalDriveInformation
= true;
3668 Controller
->V1
.NewEventLogSequenceNumber
=
3669 NewEnquiry
->EventLogSequenceNumber
;
3670 Controller
->V1
.NeedErrorTableInformation
= true;
3671 Controller
->V1
.NeedDeviceStateInformation
= true;
3672 Controller
->V1
.StartDeviceStateScan
= true;
3673 Controller
->V1
.NeedBackgroundInitializationStatus
=
3674 Controller
->V1
.BackgroundInitializationStatusSupported
;
3675 Controller
->SecondaryMonitoringTime
= jiffies
;
3677 if (NewEnquiry
->RebuildFlag
== DAC960_V1_StandbyRebuildInProgress
||
3678 NewEnquiry
->RebuildFlag
3679 == DAC960_V1_BackgroundRebuildInProgress
||
3680 OldEnquiry
->RebuildFlag
== DAC960_V1_StandbyRebuildInProgress
||
3681 OldEnquiry
->RebuildFlag
== DAC960_V1_BackgroundRebuildInProgress
)
3683 Controller
->V1
.NeedRebuildProgress
= true;
3684 Controller
->V1
.RebuildProgressFirst
=
3685 (NewEnquiry
->CriticalLogicalDriveCount
<
3686 OldEnquiry
->CriticalLogicalDriveCount
);
3688 if (OldEnquiry
->RebuildFlag
== DAC960_V1_BackgroundCheckInProgress
)
3689 switch (NewEnquiry
->RebuildFlag
)
3691 case DAC960_V1_NoStandbyRebuildOrCheckInProgress
:
3692 DAC960_Progress("Consistency Check Completed Successfully\n",
3695 case DAC960_V1_StandbyRebuildInProgress
:
3696 case DAC960_V1_BackgroundRebuildInProgress
:
3698 case DAC960_V1_BackgroundCheckInProgress
:
3699 Controller
->V1
.NeedConsistencyCheckProgress
= true;
3701 case DAC960_V1_StandbyRebuildCompletedWithError
:
3702 DAC960_Progress("Consistency Check Completed with Error\n",
3705 case DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed
:
3706 DAC960_Progress("Consistency Check Failed - "
3707 "Physical Device Failed\n", Controller
);
3709 case DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed
:
3710 DAC960_Progress("Consistency Check Failed - "
3711 "Logical Drive Failed\n", Controller
);
3713 case DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses
:
3714 DAC960_Progress("Consistency Check Failed - Other Causes\n",
3717 case DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated
:
3718 DAC960_Progress("Consistency Check Successfully Terminated\n",
3722 else if (NewEnquiry
->RebuildFlag
3723 == DAC960_V1_BackgroundCheckInProgress
)
3724 Controller
->V1
.NeedConsistencyCheckProgress
= true;
3725 Controller
->MonitoringAlertMode
=
3726 (NewEnquiry
->CriticalLogicalDriveCount
> 0 ||
3727 NewEnquiry
->OfflineLogicalDriveCount
> 0 ||
3728 NewEnquiry
->DeadDriveCount
> 0);
3729 if (NewEnquiry
->RebuildFlag
> DAC960_V1_BackgroundCheckInProgress
)
3731 Controller
->V1
.PendingRebuildFlag
= NewEnquiry
->RebuildFlag
;
3732 Controller
->V1
.RebuildFlagPending
= true;
3734 memcpy(&Controller
->V1
.Enquiry
, &Controller
->V1
.NewEnquiry
,
3735 sizeof(DAC960_V1_Enquiry_T
));
3737 else if (CommandOpcode
== DAC960_V1_PerformEventLogOperation
)
3740 *DAC960_EventMessages
[] =
3741 { "killed because write recovery failed",
3742 "killed because of SCSI bus reset failure",
3743 "killed because of double check condition",
3744 "killed because it was removed",
3745 "killed because of gross error on SCSI chip",
3746 "killed because of bad tag returned from drive",
3747 "killed because of timeout on SCSI command",
3748 "killed because of reset SCSI command issued from system",
3749 "killed because busy or parity error count exceeded limit",
3750 "killed because of 'kill drive' command from system",
3751 "killed because of selection timeout",
3752 "killed due to SCSI phase sequence error",
3753 "killed due to unknown status" };
3754 DAC960_V1_EventLogEntry_T
*EventLogEntry
=
3755 Controller
->V1
.EventLogEntry
;
3756 if (EventLogEntry
->SequenceNumber
==
3757 Controller
->V1
.OldEventLogSequenceNumber
)
3759 unsigned char SenseKey
= EventLogEntry
->SenseKey
;
3760 unsigned char AdditionalSenseCode
=
3761 EventLogEntry
->AdditionalSenseCode
;
3762 unsigned char AdditionalSenseCodeQualifier
=
3763 EventLogEntry
->AdditionalSenseCodeQualifier
;
3764 if (SenseKey
== DAC960_SenseKey_VendorSpecific
&&
3765 AdditionalSenseCode
== 0x80 &&
3766 AdditionalSenseCodeQualifier
<
3767 ARRAY_SIZE(DAC960_EventMessages
))
3768 DAC960_Critical("Physical Device %d:%d %s\n", Controller
,
3769 EventLogEntry
->Channel
,
3770 EventLogEntry
->TargetID
,
3771 DAC960_EventMessages
[
3772 AdditionalSenseCodeQualifier
]);
3773 else if (SenseKey
== DAC960_SenseKey_UnitAttention
&&
3774 AdditionalSenseCode
== 0x29)
3776 if (Controller
->MonitoringTimerCount
> 0)
3777 Controller
->V1
.DeviceResetCount
[EventLogEntry
->Channel
]
3778 [EventLogEntry
->TargetID
]++;
3780 else if (!(SenseKey
== DAC960_SenseKey_NoSense
||
3781 (SenseKey
== DAC960_SenseKey_NotReady
&&
3782 AdditionalSenseCode
== 0x04 &&
3783 (AdditionalSenseCodeQualifier
== 0x01 ||
3784 AdditionalSenseCodeQualifier
== 0x02))))
3786 DAC960_Critical("Physical Device %d:%d Error Log: "
3787 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
3789 EventLogEntry
->Channel
,
3790 EventLogEntry
->TargetID
,
3792 AdditionalSenseCode
,
3793 AdditionalSenseCodeQualifier
);
3794 DAC960_Critical("Physical Device %d:%d Error Log: "
3795 "Information = %02X%02X%02X%02X "
3796 "%02X%02X%02X%02X\n",
3798 EventLogEntry
->Channel
,
3799 EventLogEntry
->TargetID
,
3800 EventLogEntry
->Information
[0],
3801 EventLogEntry
->Information
[1],
3802 EventLogEntry
->Information
[2],
3803 EventLogEntry
->Information
[3],
3804 EventLogEntry
->CommandSpecificInformation
[0],
3805 EventLogEntry
->CommandSpecificInformation
[1],
3806 EventLogEntry
->CommandSpecificInformation
[2],
3807 EventLogEntry
->CommandSpecificInformation
[3]);
3810 Controller
->V1
.OldEventLogSequenceNumber
++;
3812 else if (CommandOpcode
== DAC960_V1_GetErrorTable
)
3814 DAC960_V1_ErrorTable_T
*OldErrorTable
= &Controller
->V1
.ErrorTable
;
3815 DAC960_V1_ErrorTable_T
*NewErrorTable
= Controller
->V1
.NewErrorTable
;
3816 int Channel
, TargetID
;
3817 for (Channel
= 0; Channel
< Controller
->Channels
; Channel
++)
3818 for (TargetID
= 0; TargetID
< Controller
->Targets
; TargetID
++)
3820 DAC960_V1_ErrorTableEntry_T
*NewErrorEntry
=
3821 &NewErrorTable
->ErrorTableEntries
[Channel
][TargetID
];
3822 DAC960_V1_ErrorTableEntry_T
*OldErrorEntry
=
3823 &OldErrorTable
->ErrorTableEntries
[Channel
][TargetID
];
3824 if ((NewErrorEntry
->ParityErrorCount
!=
3825 OldErrorEntry
->ParityErrorCount
) ||
3826 (NewErrorEntry
->SoftErrorCount
!=
3827 OldErrorEntry
->SoftErrorCount
) ||
3828 (NewErrorEntry
->HardErrorCount
!=
3829 OldErrorEntry
->HardErrorCount
) ||
3830 (NewErrorEntry
->MiscErrorCount
!=
3831 OldErrorEntry
->MiscErrorCount
))
3832 DAC960_Critical("Physical Device %d:%d Errors: "
3833 "Parity = %d, Soft = %d, "
3834 "Hard = %d, Misc = %d\n",
3835 Controller
, Channel
, TargetID
,
3836 NewErrorEntry
->ParityErrorCount
,
3837 NewErrorEntry
->SoftErrorCount
,
3838 NewErrorEntry
->HardErrorCount
,
3839 NewErrorEntry
->MiscErrorCount
);
3841 memcpy(&Controller
->V1
.ErrorTable
, Controller
->V1
.NewErrorTable
,
3842 sizeof(DAC960_V1_ErrorTable_T
));
3844 else if (CommandOpcode
== DAC960_V1_GetDeviceState
)
3846 DAC960_V1_DeviceState_T
*OldDeviceState
=
3847 &Controller
->V1
.DeviceState
[Controller
->V1
.DeviceStateChannel
]
3848 [Controller
->V1
.DeviceStateTargetID
];
3849 DAC960_V1_DeviceState_T
*NewDeviceState
=
3850 Controller
->V1
.NewDeviceState
;
3851 if (NewDeviceState
->DeviceState
!= OldDeviceState
->DeviceState
)
3852 DAC960_Critical("Physical Device %d:%d is now %s\n", Controller
,
3853 Controller
->V1
.DeviceStateChannel
,
3854 Controller
->V1
.DeviceStateTargetID
,
3855 (NewDeviceState
->DeviceState
3856 == DAC960_V1_Device_Dead
3858 : NewDeviceState
->DeviceState
3859 == DAC960_V1_Device_WriteOnly
3861 : NewDeviceState
->DeviceState
3862 == DAC960_V1_Device_Online
3863 ? "ONLINE" : "STANDBY"));
3864 if (OldDeviceState
->DeviceState
== DAC960_V1_Device_Dead
&&
3865 NewDeviceState
->DeviceState
!= DAC960_V1_Device_Dead
)
3867 Controller
->V1
.NeedDeviceInquiryInformation
= true;
3868 Controller
->V1
.NeedDeviceSerialNumberInformation
= true;
3869 Controller
->V1
.DeviceResetCount
3870 [Controller
->V1
.DeviceStateChannel
]
3871 [Controller
->V1
.DeviceStateTargetID
] = 0;
3873 memcpy(OldDeviceState
, NewDeviceState
,
3874 sizeof(DAC960_V1_DeviceState_T
));
3876 else if (CommandOpcode
== DAC960_V1_GetLogicalDriveInformation
)
3878 int LogicalDriveNumber
;
3879 for (LogicalDriveNumber
= 0;
3880 LogicalDriveNumber
< Controller
->LogicalDriveCount
;
3881 LogicalDriveNumber
++)
3883 DAC960_V1_LogicalDriveInformation_T
*OldLogicalDriveInformation
=
3884 &Controller
->V1
.LogicalDriveInformation
[LogicalDriveNumber
];
3885 DAC960_V1_LogicalDriveInformation_T
*NewLogicalDriveInformation
=
3886 &(*Controller
->V1
.NewLogicalDriveInformation
)[LogicalDriveNumber
];
3887 if (NewLogicalDriveInformation
->LogicalDriveState
!=
3888 OldLogicalDriveInformation
->LogicalDriveState
)
3889 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3890 "is now %s\n", Controller
,
3892 Controller
->ControllerNumber
,
3894 (NewLogicalDriveInformation
->LogicalDriveState
3895 == DAC960_V1_LogicalDrive_Online
3897 : NewLogicalDriveInformation
->LogicalDriveState
3898 == DAC960_V1_LogicalDrive_Critical
3899 ? "CRITICAL" : "OFFLINE"));
3900 if (NewLogicalDriveInformation
->WriteBack
!=
3901 OldLogicalDriveInformation
->WriteBack
)
3902 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3903 "is now %s\n", Controller
,
3905 Controller
->ControllerNumber
,
3907 (NewLogicalDriveInformation
->WriteBack
3908 ? "WRITE BACK" : "WRITE THRU"));
3910 memcpy(&Controller
->V1
.LogicalDriveInformation
,
3911 Controller
->V1
.NewLogicalDriveInformation
,
3912 sizeof(DAC960_V1_LogicalDriveInformationArray_T
));
3914 else if (CommandOpcode
== DAC960_V1_GetRebuildProgress
)
3916 unsigned int LogicalDriveNumber
=
3917 Controller
->V1
.RebuildProgress
->LogicalDriveNumber
;
3918 unsigned int LogicalDriveSize
=
3919 Controller
->V1
.RebuildProgress
->LogicalDriveSize
;
3920 unsigned int BlocksCompleted
=
3921 LogicalDriveSize
- Controller
->V1
.RebuildProgress
->RemainingBlocks
;
3922 if (CommandStatus
== DAC960_V1_NoRebuildOrCheckInProgress
&&
3923 Controller
->V1
.LastRebuildStatus
== DAC960_V1_NormalCompletion
)
3924 CommandStatus
= DAC960_V1_RebuildSuccessful
;
3925 switch (CommandStatus
)
3927 case DAC960_V1_NormalCompletion
:
3928 Controller
->EphemeralProgressMessage
= true;
3929 DAC960_Progress("Rebuild in Progress: "
3930 "Logical Drive %d (/dev/rd/c%dd%d) "
3932 Controller
, LogicalDriveNumber
,
3933 Controller
->ControllerNumber
,
3935 (100 * (BlocksCompleted
>> 7))
3936 / (LogicalDriveSize
>> 7));
3937 Controller
->EphemeralProgressMessage
= false;
3939 case DAC960_V1_RebuildFailed_LogicalDriveFailure
:
3940 DAC960_Progress("Rebuild Failed due to "
3941 "Logical Drive Failure\n", Controller
);
3943 case DAC960_V1_RebuildFailed_BadBlocksOnOther
:
3944 DAC960_Progress("Rebuild Failed due to "
3945 "Bad Blocks on Other Drives\n", Controller
);
3947 case DAC960_V1_RebuildFailed_NewDriveFailed
:
3948 DAC960_Progress("Rebuild Failed due to "
3949 "Failure of Drive Being Rebuilt\n", Controller
);
3951 case DAC960_V1_NoRebuildOrCheckInProgress
:
3953 case DAC960_V1_RebuildSuccessful
:
3954 DAC960_Progress("Rebuild Completed Successfully\n", Controller
);
3956 case DAC960_V1_RebuildSuccessfullyTerminated
:
3957 DAC960_Progress("Rebuild Successfully Terminated\n", Controller
);
3960 Controller
->V1
.LastRebuildStatus
= CommandStatus
;
3961 if (CommandType
!= DAC960_MonitoringCommand
&&
3962 Controller
->V1
.RebuildStatusPending
)
3964 Command
->V1
.CommandStatus
= Controller
->V1
.PendingRebuildStatus
;
3965 Controller
->V1
.RebuildStatusPending
= false;
3967 else if (CommandType
== DAC960_MonitoringCommand
&&
3968 CommandStatus
!= DAC960_V1_NormalCompletion
&&
3969 CommandStatus
!= DAC960_V1_NoRebuildOrCheckInProgress
)
3971 Controller
->V1
.PendingRebuildStatus
= CommandStatus
;
3972 Controller
->V1
.RebuildStatusPending
= true;
3975 else if (CommandOpcode
== DAC960_V1_RebuildStat
)
3977 unsigned int LogicalDriveNumber
=
3978 Controller
->V1
.RebuildProgress
->LogicalDriveNumber
;
3979 unsigned int LogicalDriveSize
=
3980 Controller
->V1
.RebuildProgress
->LogicalDriveSize
;
3981 unsigned int BlocksCompleted
=
3982 LogicalDriveSize
- Controller
->V1
.RebuildProgress
->RemainingBlocks
;
3983 if (CommandStatus
== DAC960_V1_NormalCompletion
)
3985 Controller
->EphemeralProgressMessage
= true;
3986 DAC960_Progress("Consistency Check in Progress: "
3987 "Logical Drive %d (/dev/rd/c%dd%d) "
3989 Controller
, LogicalDriveNumber
,
3990 Controller
->ControllerNumber
,
3992 (100 * (BlocksCompleted
>> 7))
3993 / (LogicalDriveSize
>> 7));
3994 Controller
->EphemeralProgressMessage
= false;
3997 else if (CommandOpcode
== DAC960_V1_BackgroundInitializationControl
)
3999 unsigned int LogicalDriveNumber
=
4000 Controller
->V1
.BackgroundInitializationStatus
->LogicalDriveNumber
;
4001 unsigned int LogicalDriveSize
=
4002 Controller
->V1
.BackgroundInitializationStatus
->LogicalDriveSize
;
4003 unsigned int BlocksCompleted
=
4004 Controller
->V1
.BackgroundInitializationStatus
->BlocksCompleted
;
4005 switch (CommandStatus
)
4007 case DAC960_V1_NormalCompletion
:
4008 switch (Controller
->V1
.BackgroundInitializationStatus
->Status
)
4010 case DAC960_V1_BackgroundInitializationInvalid
:
4012 case DAC960_V1_BackgroundInitializationStarted
:
4013 DAC960_Progress("Background Initialization Started\n",
4016 case DAC960_V1_BackgroundInitializationInProgress
:
4017 if (BlocksCompleted
==
4018 Controller
->V1
.LastBackgroundInitializationStatus
.
4020 LogicalDriveNumber
==
4021 Controller
->V1
.LastBackgroundInitializationStatus
.
4024 Controller
->EphemeralProgressMessage
= true;
4025 DAC960_Progress("Background Initialization in Progress: "
4026 "Logical Drive %d (/dev/rd/c%dd%d) "
4028 Controller
, LogicalDriveNumber
,
4029 Controller
->ControllerNumber
,
4031 (100 * (BlocksCompleted
>> 7))
4032 / (LogicalDriveSize
>> 7));
4033 Controller
->EphemeralProgressMessage
= false;
4035 case DAC960_V1_BackgroundInitializationSuspended
:
4036 DAC960_Progress("Background Initialization Suspended\n",
4039 case DAC960_V1_BackgroundInitializationCancelled
:
4040 DAC960_Progress("Background Initialization Cancelled\n",
4044 memcpy(&Controller
->V1
.LastBackgroundInitializationStatus
,
4045 Controller
->V1
.BackgroundInitializationStatus
,
4046 sizeof(DAC960_V1_BackgroundInitializationStatus_T
));
4048 case DAC960_V1_BackgroundInitSuccessful
:
4049 if (Controller
->V1
.BackgroundInitializationStatus
->Status
==
4050 DAC960_V1_BackgroundInitializationInProgress
)
4051 DAC960_Progress("Background Initialization "
4052 "Completed Successfully\n", Controller
);
4053 Controller
->V1
.BackgroundInitializationStatus
->Status
=
4054 DAC960_V1_BackgroundInitializationInvalid
;
4056 case DAC960_V1_BackgroundInitAborted
:
4057 if (Controller
->V1
.BackgroundInitializationStatus
->Status
==
4058 DAC960_V1_BackgroundInitializationInProgress
)
4059 DAC960_Progress("Background Initialization Aborted\n",
4061 Controller
->V1
.BackgroundInitializationStatus
->Status
=
4062 DAC960_V1_BackgroundInitializationInvalid
;
4064 case DAC960_V1_NoBackgroundInitInProgress
:
4068 else if (CommandOpcode
== DAC960_V1_DCDB
)
4073 The InquiryStandardData and
4074 the InquiryUntitSerialNumber information
4075 retrieval operations BOTH use the DAC960_V1_DCDB
4076 commands. the test above can't distinguish between
4079 Instead, we rely on the order of code later in this
4080 function to ensure that DeviceInquiryInformation commands
4081 are submitted before DeviceSerialNumber commands.
4083 if (Controller
->V1
.NeedDeviceInquiryInformation
)
4085 DAC960_SCSI_Inquiry_T
*InquiryStandardData
=
4086 &Controller
->V1
.InquiryStandardData
4087 [Controller
->V1
.DeviceStateChannel
]
4088 [Controller
->V1
.DeviceStateTargetID
];
4089 if (CommandStatus
!= DAC960_V1_NormalCompletion
)
4091 memset(InquiryStandardData
, 0,
4092 sizeof(DAC960_SCSI_Inquiry_T
));
4093 InquiryStandardData
->PeripheralDeviceType
= 0x1F;
4096 memcpy(InquiryStandardData
,
4097 Controller
->V1
.NewInquiryStandardData
,
4098 sizeof(DAC960_SCSI_Inquiry_T
));
4099 Controller
->V1
.NeedDeviceInquiryInformation
= false;
4101 else if (Controller
->V1
.NeedDeviceSerialNumberInformation
)
4103 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
4104 &Controller
->V1
.InquiryUnitSerialNumber
4105 [Controller
->V1
.DeviceStateChannel
]
4106 [Controller
->V1
.DeviceStateTargetID
];
4107 if (CommandStatus
!= DAC960_V1_NormalCompletion
)
4109 memset(InquiryUnitSerialNumber
, 0,
4110 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
4111 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
4114 memcpy(InquiryUnitSerialNumber
,
4115 Controller
->V1
.NewInquiryUnitSerialNumber
,
4116 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
4117 Controller
->V1
.NeedDeviceSerialNumberInformation
= false;
4121 Begin submitting new monitoring commands.
4123 if (Controller
->V1
.NewEventLogSequenceNumber
4124 - Controller
->V1
.OldEventLogSequenceNumber
> 0)
4126 Command
->V1
.CommandMailbox
.Type3E
.CommandOpcode
=
4127 DAC960_V1_PerformEventLogOperation
;
4128 Command
->V1
.CommandMailbox
.Type3E
.OperationType
=
4129 DAC960_V1_GetEventLogEntry
;
4130 Command
->V1
.CommandMailbox
.Type3E
.OperationQualifier
= 1;
4131 Command
->V1
.CommandMailbox
.Type3E
.SequenceNumber
=
4132 Controller
->V1
.OldEventLogSequenceNumber
;
4133 Command
->V1
.CommandMailbox
.Type3E
.BusAddress
=
4134 Controller
->V1
.EventLogEntryDMA
;
4135 DAC960_QueueCommand(Command
);
4138 if (Controller
->V1
.NeedErrorTableInformation
)
4140 Controller
->V1
.NeedErrorTableInformation
= false;
4141 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
=
4142 DAC960_V1_GetErrorTable
;
4143 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
4144 Controller
->V1
.NewErrorTableDMA
;
4145 DAC960_QueueCommand(Command
);
4148 if (Controller
->V1
.NeedRebuildProgress
&&
4149 Controller
->V1
.RebuildProgressFirst
)
4151 Controller
->V1
.NeedRebuildProgress
= false;
4152 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
=
4153 DAC960_V1_GetRebuildProgress
;
4154 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
4155 Controller
->V1
.RebuildProgressDMA
;
4156 DAC960_QueueCommand(Command
);
4159 if (Controller
->V1
.NeedDeviceStateInformation
)
4161 if (Controller
->V1
.NeedDeviceInquiryInformation
)
4163 DAC960_V1_DCDB_T
*DCDB
= Controller
->V1
.MonitoringDCDB
;
4164 dma_addr_t DCDB_DMA
= Controller
->V1
.MonitoringDCDB_DMA
;
4166 dma_addr_t NewInquiryStandardDataDMA
=
4167 Controller
->V1
.NewInquiryStandardDataDMA
;
4169 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
= DAC960_V1_DCDB
;
4170 Command
->V1
.CommandMailbox
.Type3
.BusAddress
= DCDB_DMA
;
4171 DCDB
->Channel
= Controller
->V1
.DeviceStateChannel
;
4172 DCDB
->TargetID
= Controller
->V1
.DeviceStateTargetID
;
4173 DCDB
->Direction
= DAC960_V1_DCDB_DataTransferDeviceToSystem
;
4174 DCDB
->EarlyStatus
= false;
4175 DCDB
->Timeout
= DAC960_V1_DCDB_Timeout_10_seconds
;
4176 DCDB
->NoAutomaticRequestSense
= false;
4177 DCDB
->DisconnectPermitted
= true;
4178 DCDB
->TransferLength
= sizeof(DAC960_SCSI_Inquiry_T
);
4179 DCDB
->BusAddress
= NewInquiryStandardDataDMA
;
4180 DCDB
->CDBLength
= 6;
4181 DCDB
->TransferLengthHigh4
= 0;
4182 DCDB
->SenseLength
= sizeof(DCDB
->SenseData
);
4183 DCDB
->CDB
[0] = 0x12; /* INQUIRY */
4184 DCDB
->CDB
[1] = 0; /* EVPD = 0 */
4185 DCDB
->CDB
[2] = 0; /* Page Code */
4186 DCDB
->CDB
[3] = 0; /* Reserved */
4187 DCDB
->CDB
[4] = sizeof(DAC960_SCSI_Inquiry_T
);
4188 DCDB
->CDB
[5] = 0; /* Control */
4189 DAC960_QueueCommand(Command
);
4192 if (Controller
->V1
.NeedDeviceSerialNumberInformation
)
4194 DAC960_V1_DCDB_T
*DCDB
= Controller
->V1
.MonitoringDCDB
;
4195 dma_addr_t DCDB_DMA
= Controller
->V1
.MonitoringDCDB_DMA
;
4196 dma_addr_t NewInquiryUnitSerialNumberDMA
=
4197 Controller
->V1
.NewInquiryUnitSerialNumberDMA
;
4199 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
= DAC960_V1_DCDB
;
4200 Command
->V1
.CommandMailbox
.Type3
.BusAddress
= DCDB_DMA
;
4201 DCDB
->Channel
= Controller
->V1
.DeviceStateChannel
;
4202 DCDB
->TargetID
= Controller
->V1
.DeviceStateTargetID
;
4203 DCDB
->Direction
= DAC960_V1_DCDB_DataTransferDeviceToSystem
;
4204 DCDB
->EarlyStatus
= false;
4205 DCDB
->Timeout
= DAC960_V1_DCDB_Timeout_10_seconds
;
4206 DCDB
->NoAutomaticRequestSense
= false;
4207 DCDB
->DisconnectPermitted
= true;
4208 DCDB
->TransferLength
=
4209 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
4210 DCDB
->BusAddress
= NewInquiryUnitSerialNumberDMA
;
4211 DCDB
->CDBLength
= 6;
4212 DCDB
->TransferLengthHigh4
= 0;
4213 DCDB
->SenseLength
= sizeof(DCDB
->SenseData
);
4214 DCDB
->CDB
[0] = 0x12; /* INQUIRY */
4215 DCDB
->CDB
[1] = 1; /* EVPD = 1 */
4216 DCDB
->CDB
[2] = 0x80; /* Page Code */
4217 DCDB
->CDB
[3] = 0; /* Reserved */
4218 DCDB
->CDB
[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
);
4219 DCDB
->CDB
[5] = 0; /* Control */
4220 DAC960_QueueCommand(Command
);
4223 if (Controller
->V1
.StartDeviceStateScan
)
4225 Controller
->V1
.DeviceStateChannel
= 0;
4226 Controller
->V1
.DeviceStateTargetID
= 0;
4227 Controller
->V1
.StartDeviceStateScan
= false;
4229 else if (++Controller
->V1
.DeviceStateTargetID
== Controller
->Targets
)
4231 Controller
->V1
.DeviceStateChannel
++;
4232 Controller
->V1
.DeviceStateTargetID
= 0;
4234 if (Controller
->V1
.DeviceStateChannel
< Controller
->Channels
)
4236 Controller
->V1
.NewDeviceState
->DeviceState
=
4237 DAC960_V1_Device_Dead
;
4238 Command
->V1
.CommandMailbox
.Type3D
.CommandOpcode
=
4239 DAC960_V1_GetDeviceState
;
4240 Command
->V1
.CommandMailbox
.Type3D
.Channel
=
4241 Controller
->V1
.DeviceStateChannel
;
4242 Command
->V1
.CommandMailbox
.Type3D
.TargetID
=
4243 Controller
->V1
.DeviceStateTargetID
;
4244 Command
->V1
.CommandMailbox
.Type3D
.BusAddress
=
4245 Controller
->V1
.NewDeviceStateDMA
;
4246 DAC960_QueueCommand(Command
);
4249 Controller
->V1
.NeedDeviceStateInformation
= false;
4251 if (Controller
->V1
.NeedLogicalDriveInformation
)
4253 Controller
->V1
.NeedLogicalDriveInformation
= false;
4254 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
=
4255 DAC960_V1_GetLogicalDriveInformation
;
4256 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
4257 Controller
->V1
.NewLogicalDriveInformationDMA
;
4258 DAC960_QueueCommand(Command
);
4261 if (Controller
->V1
.NeedRebuildProgress
)
4263 Controller
->V1
.NeedRebuildProgress
= false;
4264 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
=
4265 DAC960_V1_GetRebuildProgress
;
4266 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
4267 Controller
->V1
.RebuildProgressDMA
;
4268 DAC960_QueueCommand(Command
);
4271 if (Controller
->V1
.NeedConsistencyCheckProgress
)
4273 Controller
->V1
.NeedConsistencyCheckProgress
= false;
4274 Command
->V1
.CommandMailbox
.Type3
.CommandOpcode
=
4275 DAC960_V1_RebuildStat
;
4276 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
4277 Controller
->V1
.RebuildProgressDMA
;
4278 DAC960_QueueCommand(Command
);
4281 if (Controller
->V1
.NeedBackgroundInitializationStatus
)
4283 Controller
->V1
.NeedBackgroundInitializationStatus
= false;
4284 Command
->V1
.CommandMailbox
.Type3B
.CommandOpcode
=
4285 DAC960_V1_BackgroundInitializationControl
;
4286 Command
->V1
.CommandMailbox
.Type3B
.CommandOpcode2
= 0x20;
4287 Command
->V1
.CommandMailbox
.Type3B
.BusAddress
=
4288 Controller
->V1
.BackgroundInitializationStatusDMA
;
4289 DAC960_QueueCommand(Command
);
4292 Controller
->MonitoringTimerCount
++;
4293 Controller
->MonitoringTimer
.expires
=
4294 jiffies
+ DAC960_MonitoringTimerInterval
;
4295 add_timer(&Controller
->MonitoringTimer
);
4297 if (CommandType
== DAC960_ImmediateCommand
)
4299 complete(Command
->Completion
);
4300 Command
->Completion
= NULL
;
4303 if (CommandType
== DAC960_QueuedCommand
)
4305 DAC960_V1_KernelCommand_T
*KernelCommand
= Command
->V1
.KernelCommand
;
4306 KernelCommand
->CommandStatus
= Command
->V1
.CommandStatus
;
4307 Command
->V1
.KernelCommand
= NULL
;
4308 if (CommandOpcode
== DAC960_V1_DCDB
)
4309 Controller
->V1
.DirectCommandActive
[KernelCommand
->DCDB
->Channel
]
4310 [KernelCommand
->DCDB
->TargetID
] =
4312 DAC960_DeallocateCommand(Command
);
4313 KernelCommand
->CompletionFunction(KernelCommand
);
4317 Queue a Status Monitoring Command to the Controller using the just
4318 completed Command if one was deferred previously due to lack of a
4319 free Command when the Monitoring Timer Function was called.
4321 if (Controller
->MonitoringCommandDeferred
)
4323 Controller
->MonitoringCommandDeferred
= false;
4324 DAC960_V1_QueueMonitoringCommand(Command
);
4328 Deallocate the Command.
4330 DAC960_DeallocateCommand(Command
);
4332 Wake up any processes waiting on a free Command.
4334 wake_up(&Controller
->CommandWaitQueue
);
4339 DAC960_V2_ReadWriteError prints an appropriate error message for Command
4340 when an error occurs on a Read or Write operation.
4343 static void DAC960_V2_ReadWriteError(DAC960_Command_T
*Command
)
4345 DAC960_Controller_T
*Controller
= Command
->Controller
;
4346 static const unsigned char *SenseErrors
[] = {
4347 "NO SENSE", "RECOVERED ERROR",
4348 "NOT READY", "MEDIUM ERROR",
4349 "HARDWARE ERROR", "ILLEGAL REQUEST",
4350 "UNIT ATTENTION", "DATA PROTECT",
4351 "BLANK CHECK", "VENDOR-SPECIFIC",
4352 "COPY ABORTED", "ABORTED COMMAND",
4353 "EQUAL", "VOLUME OVERFLOW",
4354 "MISCOMPARE", "RESERVED"
4356 unsigned char *CommandName
= "UNKNOWN";
4357 switch (Command
->CommandType
)
4359 case DAC960_ReadCommand
:
4360 case DAC960_ReadRetryCommand
:
4361 CommandName
= "READ";
4363 case DAC960_WriteCommand
:
4364 case DAC960_WriteRetryCommand
:
4365 CommandName
= "WRITE";
4367 case DAC960_MonitoringCommand
:
4368 case DAC960_ImmediateCommand
:
4369 case DAC960_QueuedCommand
:
4372 DAC960_Error("Error Condition %s on %s:\n", Controller
,
4373 SenseErrors
[Command
->V2
.RequestSense
->SenseKey
], CommandName
);
4374 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
4375 Controller
, Controller
->ControllerNumber
,
4376 Command
->LogicalDriveNumber
, Command
->BlockNumber
,
4377 Command
->BlockNumber
+ Command
->BlockCount
- 1);
4382 DAC960_V2_ReportEvent prints an appropriate message when a Controller Event
4386 static void DAC960_V2_ReportEvent(DAC960_Controller_T
*Controller
,
4387 DAC960_V2_Event_T
*Event
)
4389 DAC960_SCSI_RequestSense_T
*RequestSense
=
4390 (DAC960_SCSI_RequestSense_T
*) &Event
->RequestSenseData
;
4391 unsigned char MessageBuffer
[DAC960_LineBufferSize
];
4392 static struct { int EventCode
; unsigned char *EventMessage
; } EventList
[] =
4393 { /* Physical Device Events (0x0000 - 0x007F) */
4394 { 0x0001, "P Online" },
4395 { 0x0002, "P Standby" },
4396 { 0x0005, "P Automatic Rebuild Started" },
4397 { 0x0006, "P Manual Rebuild Started" },
4398 { 0x0007, "P Rebuild Completed" },
4399 { 0x0008, "P Rebuild Cancelled" },
4400 { 0x0009, "P Rebuild Failed for Unknown Reasons" },
4401 { 0x000A, "P Rebuild Failed due to New Physical Device" },
4402 { 0x000B, "P Rebuild Failed due to Logical Drive Failure" },
4403 { 0x000C, "S Offline" },
4404 { 0x000D, "P Found" },
4405 { 0x000E, "P Removed" },
4406 { 0x000F, "P Unconfigured" },
4407 { 0x0010, "P Expand Capacity Started" },
4408 { 0x0011, "P Expand Capacity Completed" },
4409 { 0x0012, "P Expand Capacity Failed" },
4410 { 0x0013, "P Command Timed Out" },
4411 { 0x0014, "P Command Aborted" },
4412 { 0x0015, "P Command Retried" },
4413 { 0x0016, "P Parity Error" },
4414 { 0x0017, "P Soft Error" },
4415 { 0x0018, "P Miscellaneous Error" },
4416 { 0x0019, "P Reset" },
4417 { 0x001A, "P Active Spare Found" },
4418 { 0x001B, "P Warm Spare Found" },
4419 { 0x001C, "S Sense Data Received" },
4420 { 0x001D, "P Initialization Started" },
4421 { 0x001E, "P Initialization Completed" },
4422 { 0x001F, "P Initialization Failed" },
4423 { 0x0020, "P Initialization Cancelled" },
4424 { 0x0021, "P Failed because Write Recovery Failed" },
4425 { 0x0022, "P Failed because SCSI Bus Reset Failed" },
4426 { 0x0023, "P Failed because of Double Check Condition" },
4427 { 0x0024, "P Failed because Device Cannot Be Accessed" },
4428 { 0x0025, "P Failed because of Gross Error on SCSI Processor" },
4429 { 0x0026, "P Failed because of Bad Tag from Device" },
4430 { 0x0027, "P Failed because of Command Timeout" },
4431 { 0x0028, "P Failed because of System Reset" },
4432 { 0x0029, "P Failed because of Busy Status or Parity Error" },
4433 { 0x002A, "P Failed because Host Set Device to Failed State" },
4434 { 0x002B, "P Failed because of Selection Timeout" },
4435 { 0x002C, "P Failed because of SCSI Bus Phase Error" },
4436 { 0x002D, "P Failed because Device Returned Unknown Status" },
4437 { 0x002E, "P Failed because Device Not Ready" },
4438 { 0x002F, "P Failed because Device Not Found at Startup" },
4439 { 0x0030, "P Failed because COD Write Operation Failed" },
4440 { 0x0031, "P Failed because BDT Write Operation Failed" },
4441 { 0x0039, "P Missing at Startup" },
4442 { 0x003A, "P Start Rebuild Failed due to Physical Drive Too Small" },
4443 { 0x003C, "P Temporarily Offline Device Automatically Made Online" },
4444 { 0x003D, "P Standby Rebuild Started" },
4445 /* Logical Device Events (0x0080 - 0x00FF) */
4446 { 0x0080, "M Consistency Check Started" },
4447 { 0x0081, "M Consistency Check Completed" },
4448 { 0x0082, "M Consistency Check Cancelled" },
4449 { 0x0083, "M Consistency Check Completed With Errors" },
4450 { 0x0084, "M Consistency Check Failed due to Logical Drive Failure" },
4451 { 0x0085, "M Consistency Check Failed due to Physical Device Failure" },
4452 { 0x0086, "L Offline" },
4453 { 0x0087, "L Critical" },
4454 { 0x0088, "L Online" },
4455 { 0x0089, "M Automatic Rebuild Started" },
4456 { 0x008A, "M Manual Rebuild Started" },
4457 { 0x008B, "M Rebuild Completed" },
4458 { 0x008C, "M Rebuild Cancelled" },
4459 { 0x008D, "M Rebuild Failed for Unknown Reasons" },
4460 { 0x008E, "M Rebuild Failed due to New Physical Device" },
4461 { 0x008F, "M Rebuild Failed due to Logical Drive Failure" },
4462 { 0x0090, "M Initialization Started" },
4463 { 0x0091, "M Initialization Completed" },
4464 { 0x0092, "M Initialization Cancelled" },
4465 { 0x0093, "M Initialization Failed" },
4466 { 0x0094, "L Found" },
4467 { 0x0095, "L Deleted" },
4468 { 0x0096, "M Expand Capacity Started" },
4469 { 0x0097, "M Expand Capacity Completed" },
4470 { 0x0098, "M Expand Capacity Failed" },
4471 { 0x0099, "L Bad Block Found" },
4472 { 0x009A, "L Size Changed" },
4473 { 0x009B, "L Type Changed" },
4474 { 0x009C, "L Bad Data Block Found" },
4475 { 0x009E, "L Read of Data Block in BDT" },
4476 { 0x009F, "L Write Back Data for Disk Block Lost" },
4477 { 0x00A0, "L Temporarily Offline RAID-5/3 Drive Made Online" },
4478 { 0x00A1, "L Temporarily Offline RAID-6/1/0/7 Drive Made Online" },
4479 { 0x00A2, "L Standby Rebuild Started" },
4480 /* Fault Management Events (0x0100 - 0x017F) */
4481 { 0x0140, "E Fan %d Failed" },
4482 { 0x0141, "E Fan %d OK" },
4483 { 0x0142, "E Fan %d Not Present" },
4484 { 0x0143, "E Power Supply %d Failed" },
4485 { 0x0144, "E Power Supply %d OK" },
4486 { 0x0145, "E Power Supply %d Not Present" },
4487 { 0x0146, "E Temperature Sensor %d Temperature Exceeds Safe Limit" },
4488 { 0x0147, "E Temperature Sensor %d Temperature Exceeds Working Limit" },
4489 { 0x0148, "E Temperature Sensor %d Temperature Normal" },
4490 { 0x0149, "E Temperature Sensor %d Not Present" },
4491 { 0x014A, "E Enclosure Management Unit %d Access Critical" },
4492 { 0x014B, "E Enclosure Management Unit %d Access OK" },
4493 { 0x014C, "E Enclosure Management Unit %d Access Offline" },
4494 /* Controller Events (0x0180 - 0x01FF) */
4495 { 0x0181, "C Cache Write Back Error" },
4496 { 0x0188, "C Battery Backup Unit Found" },
4497 { 0x0189, "C Battery Backup Unit Charge Level Low" },
4498 { 0x018A, "C Battery Backup Unit Charge Level OK" },
4499 { 0x0193, "C Installation Aborted" },
4500 { 0x0195, "C Battery Backup Unit Physically Removed" },
4501 { 0x0196, "C Memory Error During Warm Boot" },
4502 { 0x019E, "C Memory Soft ECC Error Corrected" },
4503 { 0x019F, "C Memory Hard ECC Error Corrected" },
4504 { 0x01A2, "C Battery Backup Unit Failed" },
4505 { 0x01AB, "C Mirror Race Recovery Failed" },
4506 { 0x01AC, "C Mirror Race on Critical Drive" },
4507 /* Controller Internal Processor Events */
4508 { 0x0380, "C Internal Controller Hung" },
4509 { 0x0381, "C Internal Controller Firmware Breakpoint" },
4510 { 0x0390, "C Internal Controller i960 Processor Specific Error" },
4511 { 0x03A0, "C Internal Controller StrongARM Processor Specific Error" },
4513 int EventListIndex
= 0, EventCode
;
4514 unsigned char EventType
, *EventMessage
;
4515 if (Event
->EventCode
== 0x1C &&
4516 RequestSense
->SenseKey
== DAC960_SenseKey_VendorSpecific
&&
4517 (RequestSense
->AdditionalSenseCode
== 0x80 ||
4518 RequestSense
->AdditionalSenseCode
== 0x81))
4519 Event
->EventCode
= ((RequestSense
->AdditionalSenseCode
- 0x80) << 8) |
4520 RequestSense
->AdditionalSenseCodeQualifier
;
4523 EventCode
= EventList
[EventListIndex
].EventCode
;
4524 if (EventCode
== Event
->EventCode
|| EventCode
== 0) break;
4527 EventType
= EventList
[EventListIndex
].EventMessage
[0];
4528 EventMessage
= &EventList
[EventListIndex
].EventMessage
[2];
4531 DAC960_Critical("Unknown Controller Event Code %04X\n",
4532 Controller
, Event
->EventCode
);
4538 DAC960_Critical("Physical Device %d:%d %s\n", Controller
,
4539 Event
->Channel
, Event
->TargetID
, EventMessage
);
4542 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller
,
4543 Event
->LogicalUnit
, Controller
->ControllerNumber
,
4544 Event
->LogicalUnit
, EventMessage
);
4547 DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller
,
4548 Event
->LogicalUnit
, Controller
->ControllerNumber
,
4549 Event
->LogicalUnit
, EventMessage
);
4552 if (RequestSense
->SenseKey
== DAC960_SenseKey_NoSense
||
4553 (RequestSense
->SenseKey
== DAC960_SenseKey_NotReady
&&
4554 RequestSense
->AdditionalSenseCode
== 0x04 &&
4555 (RequestSense
->AdditionalSenseCodeQualifier
== 0x01 ||
4556 RequestSense
->AdditionalSenseCodeQualifier
== 0x02)))
4558 DAC960_Critical("Physical Device %d:%d %s\n", Controller
,
4559 Event
->Channel
, Event
->TargetID
, EventMessage
);
4560 DAC960_Critical("Physical Device %d:%d Request Sense: "
4561 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
4565 RequestSense
->SenseKey
,
4566 RequestSense
->AdditionalSenseCode
,
4567 RequestSense
->AdditionalSenseCodeQualifier
);
4568 DAC960_Critical("Physical Device %d:%d Request Sense: "
4569 "Information = %02X%02X%02X%02X "
4570 "%02X%02X%02X%02X\n",
4574 RequestSense
->Information
[0],
4575 RequestSense
->Information
[1],
4576 RequestSense
->Information
[2],
4577 RequestSense
->Information
[3],
4578 RequestSense
->CommandSpecificInformation
[0],
4579 RequestSense
->CommandSpecificInformation
[1],
4580 RequestSense
->CommandSpecificInformation
[2],
4581 RequestSense
->CommandSpecificInformation
[3]);
4584 if (Controller
->SuppressEnclosureMessages
) break;
4585 sprintf(MessageBuffer
, EventMessage
, Event
->LogicalUnit
);
4586 DAC960_Critical("Enclosure %d %s\n", Controller
,
4587 Event
->TargetID
, MessageBuffer
);
4590 DAC960_Critical("Controller %s\n", Controller
, EventMessage
);
4593 DAC960_Critical("Unknown Controller Event Code %04X\n",
4594 Controller
, Event
->EventCode
);
4601 DAC960_V2_ReportProgress prints an appropriate progress message for
4602 Logical Device Long Operations.
4605 static void DAC960_V2_ReportProgress(DAC960_Controller_T
*Controller
,
4606 unsigned char *MessageString
,
4607 unsigned int LogicalDeviceNumber
,
4608 unsigned long BlocksCompleted
,
4609 unsigned long LogicalDeviceSize
)
4611 Controller
->EphemeralProgressMessage
= true;
4612 DAC960_Progress("%s in Progress: Logical Drive %d (/dev/rd/c%dd%d) "
4613 "%d%% completed\n", Controller
,
4615 LogicalDeviceNumber
,
4616 Controller
->ControllerNumber
,
4617 LogicalDeviceNumber
,
4618 (100 * (BlocksCompleted
>> 7)) / (LogicalDeviceSize
>> 7));
4619 Controller
->EphemeralProgressMessage
= false;
4624 DAC960_V2_ProcessCompletedCommand performs completion processing for Command
4625 for DAC960 V2 Firmware Controllers.
4628 static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T
*Command
)
4630 DAC960_Controller_T
*Controller
= Command
->Controller
;
4631 DAC960_CommandType_T CommandType
= Command
->CommandType
;
4632 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
4633 DAC960_V2_IOCTL_Opcode_T IOCTLOpcode
= CommandMailbox
->Common
.IOCTL_Opcode
;
4634 DAC960_V2_CommandOpcode_T CommandOpcode
= CommandMailbox
->SCSI_10
.CommandOpcode
;
4635 DAC960_V2_CommandStatus_T CommandStatus
= Command
->V2
.CommandStatus
;
4637 if (CommandType
== DAC960_ReadCommand
||
4638 CommandType
== DAC960_WriteCommand
)
4641 #ifdef FORCE_RETRY_DEBUG
4642 CommandStatus
= DAC960_V2_AbormalCompletion
;
4644 Command
->V2
.RequestSense
->SenseKey
= DAC960_SenseKey_MediumError
;
4646 if (CommandStatus
== DAC960_V2_NormalCompletion
) {
4648 if (!DAC960_ProcessCompletedRequest(Command
, true))
4651 } else if (Command
->V2
.RequestSense
->SenseKey
== DAC960_SenseKey_MediumError
)
4654 * break the command down into pieces and resubmit each
4655 * piece, hoping that some of them will succeed.
4657 DAC960_queue_partial_rw(Command
);
4662 if (Command
->V2
.RequestSense
->SenseKey
!= DAC960_SenseKey_NotReady
)
4663 DAC960_V2_ReadWriteError(Command
);
4665 Perform completion processing for all buffers in this I/O Request.
4667 (void)DAC960_ProcessCompletedRequest(Command
, false);
4670 else if (CommandType
== DAC960_ReadRetryCommand
||
4671 CommandType
== DAC960_WriteRetryCommand
)
4673 bool normal_completion
;
4675 #ifdef FORCE_RETRY_FAILURE_DEBUG
4676 static int retry_count
= 1;
4679 Perform completion processing for the portion that was
4680 retried, and submit the next portion, if any.
4682 normal_completion
= true;
4683 if (CommandStatus
!= DAC960_V2_NormalCompletion
) {
4684 normal_completion
= false;
4685 if (Command
->V2
.RequestSense
->SenseKey
!= DAC960_SenseKey_NotReady
)
4686 DAC960_V2_ReadWriteError(Command
);
4689 #ifdef FORCE_RETRY_FAILURE_DEBUG
4690 if (!(++retry_count
% 10000)) {
4691 printk("V2 error retry failure test\n");
4692 normal_completion
= false;
4693 DAC960_V2_ReadWriteError(Command
);
4697 if (!DAC960_ProcessCompletedRequest(Command
, normal_completion
)) {
4698 DAC960_queue_partial_rw(Command
);
4702 else if (CommandType
== DAC960_MonitoringCommand
)
4704 if (Controller
->ShutdownMonitoringTimer
)
4706 if (IOCTLOpcode
== DAC960_V2_GetControllerInfo
)
4708 DAC960_V2_ControllerInfo_T
*NewControllerInfo
=
4709 Controller
->V2
.NewControllerInformation
;
4710 DAC960_V2_ControllerInfo_T
*ControllerInfo
=
4711 &Controller
->V2
.ControllerInformation
;
4712 Controller
->LogicalDriveCount
=
4713 NewControllerInfo
->LogicalDevicesPresent
;
4714 Controller
->V2
.NeedLogicalDeviceInformation
= true;
4715 Controller
->V2
.NeedPhysicalDeviceInformation
= true;
4716 Controller
->V2
.StartLogicalDeviceInformationScan
= true;
4717 Controller
->V2
.StartPhysicalDeviceInformationScan
= true;
4718 Controller
->MonitoringAlertMode
=
4719 (NewControllerInfo
->LogicalDevicesCritical
> 0 ||
4720 NewControllerInfo
->LogicalDevicesOffline
> 0 ||
4721 NewControllerInfo
->PhysicalDisksCritical
> 0 ||
4722 NewControllerInfo
->PhysicalDisksOffline
> 0);
4723 memcpy(ControllerInfo
, NewControllerInfo
,
4724 sizeof(DAC960_V2_ControllerInfo_T
));
4726 else if (IOCTLOpcode
== DAC960_V2_GetEvent
)
4728 if (CommandStatus
== DAC960_V2_NormalCompletion
) {
4729 DAC960_V2_ReportEvent(Controller
, Controller
->V2
.Event
);
4731 Controller
->V2
.NextEventSequenceNumber
++;
4733 else if (IOCTLOpcode
== DAC960_V2_GetPhysicalDeviceInfoValid
&&
4734 CommandStatus
== DAC960_V2_NormalCompletion
)
4736 DAC960_V2_PhysicalDeviceInfo_T
*NewPhysicalDeviceInfo
=
4737 Controller
->V2
.NewPhysicalDeviceInformation
;
4738 unsigned int PhysicalDeviceIndex
= Controller
->V2
.PhysicalDeviceIndex
;
4739 DAC960_V2_PhysicalDeviceInfo_T
*PhysicalDeviceInfo
=
4740 Controller
->V2
.PhysicalDeviceInformation
[PhysicalDeviceIndex
];
4741 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
4742 Controller
->V2
.InquiryUnitSerialNumber
[PhysicalDeviceIndex
];
4743 unsigned int DeviceIndex
;
4744 while (PhysicalDeviceInfo
!= NULL
&&
4745 (NewPhysicalDeviceInfo
->Channel
>
4746 PhysicalDeviceInfo
->Channel
||
4747 (NewPhysicalDeviceInfo
->Channel
==
4748 PhysicalDeviceInfo
->Channel
&&
4749 (NewPhysicalDeviceInfo
->TargetID
>
4750 PhysicalDeviceInfo
->TargetID
||
4751 (NewPhysicalDeviceInfo
->TargetID
==
4752 PhysicalDeviceInfo
->TargetID
&&
4753 NewPhysicalDeviceInfo
->LogicalUnit
>
4754 PhysicalDeviceInfo
->LogicalUnit
)))))
4756 DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4758 PhysicalDeviceInfo
->Channel
,
4759 PhysicalDeviceInfo
->TargetID
);
4760 Controller
->V2
.PhysicalDeviceInformation
4761 [PhysicalDeviceIndex
] = NULL
;
4762 Controller
->V2
.InquiryUnitSerialNumber
4763 [PhysicalDeviceIndex
] = NULL
;
4764 kfree(PhysicalDeviceInfo
);
4765 kfree(InquiryUnitSerialNumber
);
4766 for (DeviceIndex
= PhysicalDeviceIndex
;
4767 DeviceIndex
< DAC960_V2_MaxPhysicalDevices
- 1;
4770 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
] =
4771 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
+1];
4772 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
] =
4773 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
+1];
4775 Controller
->V2
.PhysicalDeviceInformation
4776 [DAC960_V2_MaxPhysicalDevices
-1] = NULL
;
4777 Controller
->V2
.InquiryUnitSerialNumber
4778 [DAC960_V2_MaxPhysicalDevices
-1] = NULL
;
4779 PhysicalDeviceInfo
=
4780 Controller
->V2
.PhysicalDeviceInformation
[PhysicalDeviceIndex
];
4781 InquiryUnitSerialNumber
=
4782 Controller
->V2
.InquiryUnitSerialNumber
[PhysicalDeviceIndex
];
4784 if (PhysicalDeviceInfo
== NULL
||
4785 (NewPhysicalDeviceInfo
->Channel
!=
4786 PhysicalDeviceInfo
->Channel
) ||
4787 (NewPhysicalDeviceInfo
->TargetID
!=
4788 PhysicalDeviceInfo
->TargetID
) ||
4789 (NewPhysicalDeviceInfo
->LogicalUnit
!=
4790 PhysicalDeviceInfo
->LogicalUnit
))
4792 PhysicalDeviceInfo
=
4793 kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T
), GFP_ATOMIC
);
4794 InquiryUnitSerialNumber
=
4795 kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
),
4797 if (InquiryUnitSerialNumber
== NULL
||
4798 PhysicalDeviceInfo
== NULL
)
4800 kfree(InquiryUnitSerialNumber
);
4801 InquiryUnitSerialNumber
= NULL
;
4802 kfree(PhysicalDeviceInfo
);
4803 PhysicalDeviceInfo
= NULL
;
4805 DAC960_Critical("Physical Device %d:%d Now Exists%s\n",
4807 NewPhysicalDeviceInfo
->Channel
,
4808 NewPhysicalDeviceInfo
->TargetID
,
4809 (PhysicalDeviceInfo
!= NULL
4810 ? "" : " - Allocation Failed"));
4811 if (PhysicalDeviceInfo
!= NULL
)
4813 memset(PhysicalDeviceInfo
, 0,
4814 sizeof(DAC960_V2_PhysicalDeviceInfo_T
));
4815 PhysicalDeviceInfo
->PhysicalDeviceState
=
4816 DAC960_V2_Device_InvalidState
;
4817 memset(InquiryUnitSerialNumber
, 0,
4818 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
4819 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
4820 for (DeviceIndex
= DAC960_V2_MaxPhysicalDevices
- 1;
4821 DeviceIndex
> PhysicalDeviceIndex
;
4824 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
] =
4825 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
-1];
4826 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
] =
4827 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
-1];
4829 Controller
->V2
.PhysicalDeviceInformation
4830 [PhysicalDeviceIndex
] =
4832 Controller
->V2
.InquiryUnitSerialNumber
4833 [PhysicalDeviceIndex
] =
4834 InquiryUnitSerialNumber
;
4835 Controller
->V2
.NeedDeviceSerialNumberInformation
= true;
4838 if (PhysicalDeviceInfo
!= NULL
)
4840 if (NewPhysicalDeviceInfo
->PhysicalDeviceState
!=
4841 PhysicalDeviceInfo
->PhysicalDeviceState
)
4843 "Physical Device %d:%d is now %s\n", Controller
,
4844 NewPhysicalDeviceInfo
->Channel
,
4845 NewPhysicalDeviceInfo
->TargetID
,
4846 (NewPhysicalDeviceInfo
->PhysicalDeviceState
4847 == DAC960_V2_Device_Online
4849 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4850 == DAC960_V2_Device_Rebuild
4852 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4853 == DAC960_V2_Device_Missing
4855 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4856 == DAC960_V2_Device_Critical
4858 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4859 == DAC960_V2_Device_Dead
4861 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4862 == DAC960_V2_Device_SuspectedDead
4864 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4865 == DAC960_V2_Device_CommandedOffline
4866 ? "COMMANDED-OFFLINE"
4867 : NewPhysicalDeviceInfo
->PhysicalDeviceState
4868 == DAC960_V2_Device_Standby
4869 ? "STANDBY" : "UNKNOWN"));
4870 if ((NewPhysicalDeviceInfo
->ParityErrors
!=
4871 PhysicalDeviceInfo
->ParityErrors
) ||
4872 (NewPhysicalDeviceInfo
->SoftErrors
!=
4873 PhysicalDeviceInfo
->SoftErrors
) ||
4874 (NewPhysicalDeviceInfo
->HardErrors
!=
4875 PhysicalDeviceInfo
->HardErrors
) ||
4876 (NewPhysicalDeviceInfo
->MiscellaneousErrors
!=
4877 PhysicalDeviceInfo
->MiscellaneousErrors
) ||
4878 (NewPhysicalDeviceInfo
->CommandTimeouts
!=
4879 PhysicalDeviceInfo
->CommandTimeouts
) ||
4880 (NewPhysicalDeviceInfo
->Retries
!=
4881 PhysicalDeviceInfo
->Retries
) ||
4882 (NewPhysicalDeviceInfo
->Aborts
!=
4883 PhysicalDeviceInfo
->Aborts
) ||
4884 (NewPhysicalDeviceInfo
->PredictedFailuresDetected
!=
4885 PhysicalDeviceInfo
->PredictedFailuresDetected
))
4887 DAC960_Critical("Physical Device %d:%d Errors: "
4888 "Parity = %d, Soft = %d, "
4889 "Hard = %d, Misc = %d\n",
4891 NewPhysicalDeviceInfo
->Channel
,
4892 NewPhysicalDeviceInfo
->TargetID
,
4893 NewPhysicalDeviceInfo
->ParityErrors
,
4894 NewPhysicalDeviceInfo
->SoftErrors
,
4895 NewPhysicalDeviceInfo
->HardErrors
,
4896 NewPhysicalDeviceInfo
->MiscellaneousErrors
);
4897 DAC960_Critical("Physical Device %d:%d Errors: "
4898 "Timeouts = %d, Retries = %d, "
4899 "Aborts = %d, Predicted = %d\n",
4901 NewPhysicalDeviceInfo
->Channel
,
4902 NewPhysicalDeviceInfo
->TargetID
,
4903 NewPhysicalDeviceInfo
->CommandTimeouts
,
4904 NewPhysicalDeviceInfo
->Retries
,
4905 NewPhysicalDeviceInfo
->Aborts
,
4906 NewPhysicalDeviceInfo
4907 ->PredictedFailuresDetected
);
4909 if ((PhysicalDeviceInfo
->PhysicalDeviceState
4910 == DAC960_V2_Device_Dead
||
4911 PhysicalDeviceInfo
->PhysicalDeviceState
4912 == DAC960_V2_Device_InvalidState
) &&
4913 NewPhysicalDeviceInfo
->PhysicalDeviceState
4914 != DAC960_V2_Device_Dead
)
4915 Controller
->V2
.NeedDeviceSerialNumberInformation
= true;
4916 memcpy(PhysicalDeviceInfo
, NewPhysicalDeviceInfo
,
4917 sizeof(DAC960_V2_PhysicalDeviceInfo_T
));
4919 NewPhysicalDeviceInfo
->LogicalUnit
++;
4920 Controller
->V2
.PhysicalDeviceIndex
++;
4922 else if (IOCTLOpcode
== DAC960_V2_GetPhysicalDeviceInfoValid
)
4924 unsigned int DeviceIndex
;
4925 for (DeviceIndex
= Controller
->V2
.PhysicalDeviceIndex
;
4926 DeviceIndex
< DAC960_V2_MaxPhysicalDevices
;
4929 DAC960_V2_PhysicalDeviceInfo_T
*PhysicalDeviceInfo
=
4930 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
];
4931 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
4932 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
];
4933 if (PhysicalDeviceInfo
== NULL
) break;
4934 DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4936 PhysicalDeviceInfo
->Channel
,
4937 PhysicalDeviceInfo
->TargetID
);
4938 Controller
->V2
.PhysicalDeviceInformation
[DeviceIndex
] = NULL
;
4939 Controller
->V2
.InquiryUnitSerialNumber
[DeviceIndex
] = NULL
;
4940 kfree(PhysicalDeviceInfo
);
4941 kfree(InquiryUnitSerialNumber
);
4943 Controller
->V2
.NeedPhysicalDeviceInformation
= false;
4945 else if (IOCTLOpcode
== DAC960_V2_GetLogicalDeviceInfoValid
&&
4946 CommandStatus
== DAC960_V2_NormalCompletion
)
4948 DAC960_V2_LogicalDeviceInfo_T
*NewLogicalDeviceInfo
=
4949 Controller
->V2
.NewLogicalDeviceInformation
;
4950 unsigned short LogicalDeviceNumber
=
4951 NewLogicalDeviceInfo
->LogicalDeviceNumber
;
4952 DAC960_V2_LogicalDeviceInfo_T
*LogicalDeviceInfo
=
4953 Controller
->V2
.LogicalDeviceInformation
[LogicalDeviceNumber
];
4954 if (LogicalDeviceInfo
== NULL
)
4956 DAC960_V2_PhysicalDevice_T PhysicalDevice
;
4957 PhysicalDevice
.Controller
= 0;
4958 PhysicalDevice
.Channel
= NewLogicalDeviceInfo
->Channel
;
4959 PhysicalDevice
.TargetID
= NewLogicalDeviceInfo
->TargetID
;
4960 PhysicalDevice
.LogicalUnit
= NewLogicalDeviceInfo
->LogicalUnit
;
4961 Controller
->V2
.LogicalDriveToVirtualDevice
[LogicalDeviceNumber
] =
4963 LogicalDeviceInfo
= kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T
),
4965 Controller
->V2
.LogicalDeviceInformation
[LogicalDeviceNumber
] =
4967 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4968 "Now Exists%s\n", Controller
,
4969 LogicalDeviceNumber
,
4970 Controller
->ControllerNumber
,
4971 LogicalDeviceNumber
,
4972 (LogicalDeviceInfo
!= NULL
4973 ? "" : " - Allocation Failed"));
4974 if (LogicalDeviceInfo
!= NULL
)
4976 memset(LogicalDeviceInfo
, 0,
4977 sizeof(DAC960_V2_LogicalDeviceInfo_T
));
4978 DAC960_ComputeGenericDiskInfo(Controller
);
4981 if (LogicalDeviceInfo
!= NULL
)
4983 unsigned long LogicalDeviceSize
=
4984 NewLogicalDeviceInfo
->ConfigurableDeviceSize
;
4985 if (NewLogicalDeviceInfo
->LogicalDeviceState
!=
4986 LogicalDeviceInfo
->LogicalDeviceState
)
4987 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4988 "is now %s\n", Controller
,
4989 LogicalDeviceNumber
,
4990 Controller
->ControllerNumber
,
4991 LogicalDeviceNumber
,
4992 (NewLogicalDeviceInfo
->LogicalDeviceState
4993 == DAC960_V2_LogicalDevice_Online
4995 : NewLogicalDeviceInfo
->LogicalDeviceState
4996 == DAC960_V2_LogicalDevice_Critical
4997 ? "CRITICAL" : "OFFLINE"));
4998 if ((NewLogicalDeviceInfo
->SoftErrors
!=
4999 LogicalDeviceInfo
->SoftErrors
) ||
5000 (NewLogicalDeviceInfo
->CommandsFailed
!=
5001 LogicalDeviceInfo
->CommandsFailed
) ||
5002 (NewLogicalDeviceInfo
->DeferredWriteErrors
!=
5003 LogicalDeviceInfo
->DeferredWriteErrors
))
5004 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) Errors: "
5005 "Soft = %d, Failed = %d, Deferred Write = %d\n",
5006 Controller
, LogicalDeviceNumber
,
5007 Controller
->ControllerNumber
,
5008 LogicalDeviceNumber
,
5009 NewLogicalDeviceInfo
->SoftErrors
,
5010 NewLogicalDeviceInfo
->CommandsFailed
,
5011 NewLogicalDeviceInfo
->DeferredWriteErrors
);
5012 if (NewLogicalDeviceInfo
->ConsistencyCheckInProgress
)
5013 DAC960_V2_ReportProgress(Controller
,
5014 "Consistency Check",
5015 LogicalDeviceNumber
,
5016 NewLogicalDeviceInfo
5017 ->ConsistencyCheckBlockNumber
,
5019 else if (NewLogicalDeviceInfo
->RebuildInProgress
)
5020 DAC960_V2_ReportProgress(Controller
,
5022 LogicalDeviceNumber
,
5023 NewLogicalDeviceInfo
5024 ->RebuildBlockNumber
,
5026 else if (NewLogicalDeviceInfo
->BackgroundInitializationInProgress
)
5027 DAC960_V2_ReportProgress(Controller
,
5028 "Background Initialization",
5029 LogicalDeviceNumber
,
5030 NewLogicalDeviceInfo
5031 ->BackgroundInitializationBlockNumber
,
5033 else if (NewLogicalDeviceInfo
->ForegroundInitializationInProgress
)
5034 DAC960_V2_ReportProgress(Controller
,
5035 "Foreground Initialization",
5036 LogicalDeviceNumber
,
5037 NewLogicalDeviceInfo
5038 ->ForegroundInitializationBlockNumber
,
5040 else if (NewLogicalDeviceInfo
->DataMigrationInProgress
)
5041 DAC960_V2_ReportProgress(Controller
,
5043 LogicalDeviceNumber
,
5044 NewLogicalDeviceInfo
5045 ->DataMigrationBlockNumber
,
5047 else if (NewLogicalDeviceInfo
->PatrolOperationInProgress
)
5048 DAC960_V2_ReportProgress(Controller
,
5050 LogicalDeviceNumber
,
5051 NewLogicalDeviceInfo
5052 ->PatrolOperationBlockNumber
,
5054 if (LogicalDeviceInfo
->BackgroundInitializationInProgress
&&
5055 !NewLogicalDeviceInfo
->BackgroundInitializationInProgress
)
5056 DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) "
5057 "Background Initialization %s\n",
5059 LogicalDeviceNumber
,
5060 Controller
->ControllerNumber
,
5061 LogicalDeviceNumber
,
5062 (NewLogicalDeviceInfo
->LogicalDeviceControl
5063 .LogicalDeviceInitialized
5064 ? "Completed" : "Failed"));
5065 memcpy(LogicalDeviceInfo
, NewLogicalDeviceInfo
,
5066 sizeof(DAC960_V2_LogicalDeviceInfo_T
));
5068 Controller
->V2
.LogicalDriveFoundDuringScan
5069 [LogicalDeviceNumber
] = true;
5070 NewLogicalDeviceInfo
->LogicalDeviceNumber
++;
5072 else if (IOCTLOpcode
== DAC960_V2_GetLogicalDeviceInfoValid
)
5074 int LogicalDriveNumber
;
5075 for (LogicalDriveNumber
= 0;
5076 LogicalDriveNumber
< DAC960_MaxLogicalDrives
;
5077 LogicalDriveNumber
++)
5079 DAC960_V2_LogicalDeviceInfo_T
*LogicalDeviceInfo
=
5080 Controller
->V2
.LogicalDeviceInformation
[LogicalDriveNumber
];
5081 if (LogicalDeviceInfo
== NULL
||
5082 Controller
->V2
.LogicalDriveFoundDuringScan
5083 [LogicalDriveNumber
])
5085 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
5086 "No Longer Exists\n", Controller
,
5088 Controller
->ControllerNumber
,
5089 LogicalDriveNumber
);
5090 Controller
->V2
.LogicalDeviceInformation
5091 [LogicalDriveNumber
] = NULL
;
5092 kfree(LogicalDeviceInfo
);
5093 Controller
->LogicalDriveInitiallyAccessible
5094 [LogicalDriveNumber
] = false;
5095 DAC960_ComputeGenericDiskInfo(Controller
);
5097 Controller
->V2
.NeedLogicalDeviceInformation
= false;
5099 else if (CommandOpcode
== DAC960_V2_SCSI_10_Passthru
)
5101 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
5102 Controller
->V2
.InquiryUnitSerialNumber
[Controller
->V2
.PhysicalDeviceIndex
- 1];
5104 if (CommandStatus
!= DAC960_V2_NormalCompletion
) {
5105 memset(InquiryUnitSerialNumber
,
5106 0, sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
5107 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
5109 memcpy(InquiryUnitSerialNumber
,
5110 Controller
->V2
.NewInquiryUnitSerialNumber
,
5111 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T
));
5113 Controller
->V2
.NeedDeviceSerialNumberInformation
= false;
5116 if (Controller
->V2
.HealthStatusBuffer
->NextEventSequenceNumber
5117 - Controller
->V2
.NextEventSequenceNumber
> 0)
5119 CommandMailbox
->GetEvent
.CommandOpcode
= DAC960_V2_IOCTL
;
5120 CommandMailbox
->GetEvent
.DataTransferSize
= sizeof(DAC960_V2_Event_T
);
5121 CommandMailbox
->GetEvent
.EventSequenceNumberHigh16
=
5122 Controller
->V2
.NextEventSequenceNumber
>> 16;
5123 CommandMailbox
->GetEvent
.ControllerNumber
= 0;
5124 CommandMailbox
->GetEvent
.IOCTL_Opcode
=
5126 CommandMailbox
->GetEvent
.EventSequenceNumberLow16
=
5127 Controller
->V2
.NextEventSequenceNumber
& 0xFFFF;
5128 CommandMailbox
->GetEvent
.DataTransferMemoryAddress
5129 .ScatterGatherSegments
[0]
5130 .SegmentDataPointer
=
5131 Controller
->V2
.EventDMA
;
5132 CommandMailbox
->GetEvent
.DataTransferMemoryAddress
5133 .ScatterGatherSegments
[0]
5135 CommandMailbox
->GetEvent
.DataTransferSize
;
5136 DAC960_QueueCommand(Command
);
5139 if (Controller
->V2
.NeedPhysicalDeviceInformation
)
5141 if (Controller
->V2
.NeedDeviceSerialNumberInformation
)
5143 DAC960_SCSI_Inquiry_UnitSerialNumber_T
*InquiryUnitSerialNumber
=
5144 Controller
->V2
.NewInquiryUnitSerialNumber
;
5145 InquiryUnitSerialNumber
->PeripheralDeviceType
= 0x1F;
5147 DAC960_V2_ConstructNewUnitSerialNumber(Controller
, CommandMailbox
,
5148 Controller
->V2
.NewPhysicalDeviceInformation
->Channel
,
5149 Controller
->V2
.NewPhysicalDeviceInformation
->TargetID
,
5150 Controller
->V2
.NewPhysicalDeviceInformation
->LogicalUnit
- 1);
5153 DAC960_QueueCommand(Command
);
5156 if (Controller
->V2
.StartPhysicalDeviceInformationScan
)
5158 Controller
->V2
.PhysicalDeviceIndex
= 0;
5159 Controller
->V2
.NewPhysicalDeviceInformation
->Channel
= 0;
5160 Controller
->V2
.NewPhysicalDeviceInformation
->TargetID
= 0;
5161 Controller
->V2
.NewPhysicalDeviceInformation
->LogicalUnit
= 0;
5162 Controller
->V2
.StartPhysicalDeviceInformationScan
= false;
5164 CommandMailbox
->PhysicalDeviceInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
5165 CommandMailbox
->PhysicalDeviceInfo
.DataTransferSize
=
5166 sizeof(DAC960_V2_PhysicalDeviceInfo_T
);
5167 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.LogicalUnit
=
5168 Controller
->V2
.NewPhysicalDeviceInformation
->LogicalUnit
;
5169 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.TargetID
=
5170 Controller
->V2
.NewPhysicalDeviceInformation
->TargetID
;
5171 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.Channel
=
5172 Controller
->V2
.NewPhysicalDeviceInformation
->Channel
;
5173 CommandMailbox
->PhysicalDeviceInfo
.IOCTL_Opcode
=
5174 DAC960_V2_GetPhysicalDeviceInfoValid
;
5175 CommandMailbox
->PhysicalDeviceInfo
.DataTransferMemoryAddress
5176 .ScatterGatherSegments
[0]
5177 .SegmentDataPointer
=
5178 Controller
->V2
.NewPhysicalDeviceInformationDMA
;
5179 CommandMailbox
->PhysicalDeviceInfo
.DataTransferMemoryAddress
5180 .ScatterGatherSegments
[0]
5182 CommandMailbox
->PhysicalDeviceInfo
.DataTransferSize
;
5183 DAC960_QueueCommand(Command
);
5186 if (Controller
->V2
.NeedLogicalDeviceInformation
)
5188 if (Controller
->V2
.StartLogicalDeviceInformationScan
)
5190 int LogicalDriveNumber
;
5191 for (LogicalDriveNumber
= 0;
5192 LogicalDriveNumber
< DAC960_MaxLogicalDrives
;
5193 LogicalDriveNumber
++)
5194 Controller
->V2
.LogicalDriveFoundDuringScan
5195 [LogicalDriveNumber
] = false;
5196 Controller
->V2
.NewLogicalDeviceInformation
->LogicalDeviceNumber
= 0;
5197 Controller
->V2
.StartLogicalDeviceInformationScan
= false;
5199 CommandMailbox
->LogicalDeviceInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
5200 CommandMailbox
->LogicalDeviceInfo
.DataTransferSize
=
5201 sizeof(DAC960_V2_LogicalDeviceInfo_T
);
5202 CommandMailbox
->LogicalDeviceInfo
.LogicalDevice
.LogicalDeviceNumber
=
5203 Controller
->V2
.NewLogicalDeviceInformation
->LogicalDeviceNumber
;
5204 CommandMailbox
->LogicalDeviceInfo
.IOCTL_Opcode
=
5205 DAC960_V2_GetLogicalDeviceInfoValid
;
5206 CommandMailbox
->LogicalDeviceInfo
.DataTransferMemoryAddress
5207 .ScatterGatherSegments
[0]
5208 .SegmentDataPointer
=
5209 Controller
->V2
.NewLogicalDeviceInformationDMA
;
5210 CommandMailbox
->LogicalDeviceInfo
.DataTransferMemoryAddress
5211 .ScatterGatherSegments
[0]
5213 CommandMailbox
->LogicalDeviceInfo
.DataTransferSize
;
5214 DAC960_QueueCommand(Command
);
5217 Controller
->MonitoringTimerCount
++;
5218 Controller
->MonitoringTimer
.expires
=
5219 jiffies
+ DAC960_HealthStatusMonitoringInterval
;
5220 add_timer(&Controller
->MonitoringTimer
);
5222 if (CommandType
== DAC960_ImmediateCommand
)
5224 complete(Command
->Completion
);
5225 Command
->Completion
= NULL
;
5228 if (CommandType
== DAC960_QueuedCommand
)
5230 DAC960_V2_KernelCommand_T
*KernelCommand
= Command
->V2
.KernelCommand
;
5231 KernelCommand
->CommandStatus
= CommandStatus
;
5232 KernelCommand
->RequestSenseLength
= Command
->V2
.RequestSenseLength
;
5233 KernelCommand
->DataTransferLength
= Command
->V2
.DataTransferResidue
;
5234 Command
->V2
.KernelCommand
= NULL
;
5235 DAC960_DeallocateCommand(Command
);
5236 KernelCommand
->CompletionFunction(KernelCommand
);
5240 Queue a Status Monitoring Command to the Controller using the just
5241 completed Command if one was deferred previously due to lack of a
5242 free Command when the Monitoring Timer Function was called.
5244 if (Controller
->MonitoringCommandDeferred
)
5246 Controller
->MonitoringCommandDeferred
= false;
5247 DAC960_V2_QueueMonitoringCommand(Command
);
5251 Deallocate the Command.
5253 DAC960_DeallocateCommand(Command
);
5255 Wake up any processes waiting on a free Command.
5257 wake_up(&Controller
->CommandWaitQueue
);
5261 DAC960_GEM_InterruptHandler handles hardware interrupts from DAC960 GEM Series
5265 static irqreturn_t
DAC960_GEM_InterruptHandler(int IRQ_Channel
,
5266 void *DeviceIdentifier
)
5268 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5269 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5270 DAC960_V2_StatusMailbox_T
*NextStatusMailbox
;
5271 unsigned long flags
;
5273 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5274 DAC960_GEM_AcknowledgeInterrupt(ControllerBaseAddress
);
5275 NextStatusMailbox
= Controller
->V2
.NextStatusMailbox
;
5276 while (NextStatusMailbox
->Fields
.CommandIdentifier
> 0)
5278 DAC960_V2_CommandIdentifier_T CommandIdentifier
=
5279 NextStatusMailbox
->Fields
.CommandIdentifier
;
5280 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5281 Command
->V2
.CommandStatus
= NextStatusMailbox
->Fields
.CommandStatus
;
5282 Command
->V2
.RequestSenseLength
=
5283 NextStatusMailbox
->Fields
.RequestSenseLength
;
5284 Command
->V2
.DataTransferResidue
=
5285 NextStatusMailbox
->Fields
.DataTransferResidue
;
5286 NextStatusMailbox
->Words
[0] = 0;
5287 if (++NextStatusMailbox
> Controller
->V2
.LastStatusMailbox
)
5288 NextStatusMailbox
= Controller
->V2
.FirstStatusMailbox
;
5289 DAC960_V2_ProcessCompletedCommand(Command
);
5291 Controller
->V2
.NextStatusMailbox
= NextStatusMailbox
;
5293 Attempt to remove additional I/O Requests from the Controller's
5294 I/O Request Queue and queue them to the Controller.
5296 DAC960_ProcessRequest(Controller
);
5297 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5302 DAC960_BA_InterruptHandler handles hardware interrupts from DAC960 BA Series
5306 static irqreturn_t
DAC960_BA_InterruptHandler(int IRQ_Channel
,
5307 void *DeviceIdentifier
)
5309 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5310 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5311 DAC960_V2_StatusMailbox_T
*NextStatusMailbox
;
5312 unsigned long flags
;
5314 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5315 DAC960_BA_AcknowledgeInterrupt(ControllerBaseAddress
);
5316 NextStatusMailbox
= Controller
->V2
.NextStatusMailbox
;
5317 while (NextStatusMailbox
->Fields
.CommandIdentifier
> 0)
5319 DAC960_V2_CommandIdentifier_T CommandIdentifier
=
5320 NextStatusMailbox
->Fields
.CommandIdentifier
;
5321 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5322 Command
->V2
.CommandStatus
= NextStatusMailbox
->Fields
.CommandStatus
;
5323 Command
->V2
.RequestSenseLength
=
5324 NextStatusMailbox
->Fields
.RequestSenseLength
;
5325 Command
->V2
.DataTransferResidue
=
5326 NextStatusMailbox
->Fields
.DataTransferResidue
;
5327 NextStatusMailbox
->Words
[0] = 0;
5328 if (++NextStatusMailbox
> Controller
->V2
.LastStatusMailbox
)
5329 NextStatusMailbox
= Controller
->V2
.FirstStatusMailbox
;
5330 DAC960_V2_ProcessCompletedCommand(Command
);
5332 Controller
->V2
.NextStatusMailbox
= NextStatusMailbox
;
5334 Attempt to remove additional I/O Requests from the Controller's
5335 I/O Request Queue and queue them to the Controller.
5337 DAC960_ProcessRequest(Controller
);
5338 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5344 DAC960_LP_InterruptHandler handles hardware interrupts from DAC960 LP Series
5348 static irqreturn_t
DAC960_LP_InterruptHandler(int IRQ_Channel
,
5349 void *DeviceIdentifier
)
5351 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5352 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5353 DAC960_V2_StatusMailbox_T
*NextStatusMailbox
;
5354 unsigned long flags
;
5356 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5357 DAC960_LP_AcknowledgeInterrupt(ControllerBaseAddress
);
5358 NextStatusMailbox
= Controller
->V2
.NextStatusMailbox
;
5359 while (NextStatusMailbox
->Fields
.CommandIdentifier
> 0)
5361 DAC960_V2_CommandIdentifier_T CommandIdentifier
=
5362 NextStatusMailbox
->Fields
.CommandIdentifier
;
5363 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5364 Command
->V2
.CommandStatus
= NextStatusMailbox
->Fields
.CommandStatus
;
5365 Command
->V2
.RequestSenseLength
=
5366 NextStatusMailbox
->Fields
.RequestSenseLength
;
5367 Command
->V2
.DataTransferResidue
=
5368 NextStatusMailbox
->Fields
.DataTransferResidue
;
5369 NextStatusMailbox
->Words
[0] = 0;
5370 if (++NextStatusMailbox
> Controller
->V2
.LastStatusMailbox
)
5371 NextStatusMailbox
= Controller
->V2
.FirstStatusMailbox
;
5372 DAC960_V2_ProcessCompletedCommand(Command
);
5374 Controller
->V2
.NextStatusMailbox
= NextStatusMailbox
;
5376 Attempt to remove additional I/O Requests from the Controller's
5377 I/O Request Queue and queue them to the Controller.
5379 DAC960_ProcessRequest(Controller
);
5380 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5386 DAC960_LA_InterruptHandler handles hardware interrupts from DAC960 LA Series
5390 static irqreturn_t
DAC960_LA_InterruptHandler(int IRQ_Channel
,
5391 void *DeviceIdentifier
)
5393 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5394 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5395 DAC960_V1_StatusMailbox_T
*NextStatusMailbox
;
5396 unsigned long flags
;
5398 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5399 DAC960_LA_AcknowledgeInterrupt(ControllerBaseAddress
);
5400 NextStatusMailbox
= Controller
->V1
.NextStatusMailbox
;
5401 while (NextStatusMailbox
->Fields
.Valid
)
5403 DAC960_V1_CommandIdentifier_T CommandIdentifier
=
5404 NextStatusMailbox
->Fields
.CommandIdentifier
;
5405 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5406 Command
->V1
.CommandStatus
= NextStatusMailbox
->Fields
.CommandStatus
;
5407 NextStatusMailbox
->Word
= 0;
5408 if (++NextStatusMailbox
> Controller
->V1
.LastStatusMailbox
)
5409 NextStatusMailbox
= Controller
->V1
.FirstStatusMailbox
;
5410 DAC960_V1_ProcessCompletedCommand(Command
);
5412 Controller
->V1
.NextStatusMailbox
= NextStatusMailbox
;
5414 Attempt to remove additional I/O Requests from the Controller's
5415 I/O Request Queue and queue them to the Controller.
5417 DAC960_ProcessRequest(Controller
);
5418 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5424 DAC960_PG_InterruptHandler handles hardware interrupts from DAC960 PG Series
5428 static irqreturn_t
DAC960_PG_InterruptHandler(int IRQ_Channel
,
5429 void *DeviceIdentifier
)
5431 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5432 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5433 DAC960_V1_StatusMailbox_T
*NextStatusMailbox
;
5434 unsigned long flags
;
5436 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5437 DAC960_PG_AcknowledgeInterrupt(ControllerBaseAddress
);
5438 NextStatusMailbox
= Controller
->V1
.NextStatusMailbox
;
5439 while (NextStatusMailbox
->Fields
.Valid
)
5441 DAC960_V1_CommandIdentifier_T CommandIdentifier
=
5442 NextStatusMailbox
->Fields
.CommandIdentifier
;
5443 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5444 Command
->V1
.CommandStatus
= NextStatusMailbox
->Fields
.CommandStatus
;
5445 NextStatusMailbox
->Word
= 0;
5446 if (++NextStatusMailbox
> Controller
->V1
.LastStatusMailbox
)
5447 NextStatusMailbox
= Controller
->V1
.FirstStatusMailbox
;
5448 DAC960_V1_ProcessCompletedCommand(Command
);
5450 Controller
->V1
.NextStatusMailbox
= NextStatusMailbox
;
5452 Attempt to remove additional I/O Requests from the Controller's
5453 I/O Request Queue and queue them to the Controller.
5455 DAC960_ProcessRequest(Controller
);
5456 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5462 DAC960_PD_InterruptHandler handles hardware interrupts from DAC960 PD Series
5466 static irqreturn_t
DAC960_PD_InterruptHandler(int IRQ_Channel
,
5467 void *DeviceIdentifier
)
5469 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5470 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5471 unsigned long flags
;
5473 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5474 while (DAC960_PD_StatusAvailableP(ControllerBaseAddress
))
5476 DAC960_V1_CommandIdentifier_T CommandIdentifier
=
5477 DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress
);
5478 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5479 Command
->V1
.CommandStatus
=
5480 DAC960_PD_ReadStatusRegister(ControllerBaseAddress
);
5481 DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress
);
5482 DAC960_PD_AcknowledgeStatus(ControllerBaseAddress
);
5483 DAC960_V1_ProcessCompletedCommand(Command
);
5486 Attempt to remove additional I/O Requests from the Controller's
5487 I/O Request Queue and queue them to the Controller.
5489 DAC960_ProcessRequest(Controller
);
5490 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5496 DAC960_P_InterruptHandler handles hardware interrupts from DAC960 P Series
5499 Translations of DAC960_V1_Enquiry and DAC960_V1_GetDeviceState rely
5500 on the data having been placed into DAC960_Controller_T, rather than
5501 an arbitrary buffer.
5504 static irqreturn_t
DAC960_P_InterruptHandler(int IRQ_Channel
,
5505 void *DeviceIdentifier
)
5507 DAC960_Controller_T
*Controller
= DeviceIdentifier
;
5508 void __iomem
*ControllerBaseAddress
= Controller
->BaseAddress
;
5509 unsigned long flags
;
5511 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5512 while (DAC960_PD_StatusAvailableP(ControllerBaseAddress
))
5514 DAC960_V1_CommandIdentifier_T CommandIdentifier
=
5515 DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress
);
5516 DAC960_Command_T
*Command
= Controller
->Commands
[CommandIdentifier
-1];
5517 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
5518 DAC960_V1_CommandOpcode_T CommandOpcode
=
5519 CommandMailbox
->Common
.CommandOpcode
;
5520 Command
->V1
.CommandStatus
=
5521 DAC960_PD_ReadStatusRegister(ControllerBaseAddress
);
5522 DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress
);
5523 DAC960_PD_AcknowledgeStatus(ControllerBaseAddress
);
5524 switch (CommandOpcode
)
5526 case DAC960_V1_Enquiry_Old
:
5527 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
= DAC960_V1_Enquiry
;
5528 DAC960_P_To_PD_TranslateEnquiry(Controller
->V1
.NewEnquiry
);
5530 case DAC960_V1_GetDeviceState_Old
:
5531 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
=
5532 DAC960_V1_GetDeviceState
;
5533 DAC960_P_To_PD_TranslateDeviceState(Controller
->V1
.NewDeviceState
);
5535 case DAC960_V1_Read_Old
:
5536 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
= DAC960_V1_Read
;
5537 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox
);
5539 case DAC960_V1_Write_Old
:
5540 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
= DAC960_V1_Write
;
5541 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox
);
5543 case DAC960_V1_ReadWithScatterGather_Old
:
5544 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
=
5545 DAC960_V1_ReadWithScatterGather
;
5546 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox
);
5548 case DAC960_V1_WriteWithScatterGather_Old
:
5549 Command
->V1
.CommandMailbox
.Common
.CommandOpcode
=
5550 DAC960_V1_WriteWithScatterGather
;
5551 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox
);
5556 DAC960_V1_ProcessCompletedCommand(Command
);
5559 Attempt to remove additional I/O Requests from the Controller's
5560 I/O Request Queue and queue them to the Controller.
5562 DAC960_ProcessRequest(Controller
);
5563 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5569 DAC960_V1_QueueMonitoringCommand queues a Monitoring Command to DAC960 V1
5570 Firmware Controllers.
5573 static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T
*Command
)
5575 DAC960_Controller_T
*Controller
= Command
->Controller
;
5576 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
5577 DAC960_V1_ClearCommand(Command
);
5578 Command
->CommandType
= DAC960_MonitoringCommand
;
5579 CommandMailbox
->Type3
.CommandOpcode
= DAC960_V1_Enquiry
;
5580 CommandMailbox
->Type3
.BusAddress
= Controller
->V1
.NewEnquiryDMA
;
5581 DAC960_QueueCommand(Command
);
5586 DAC960_V2_QueueMonitoringCommand queues a Monitoring Command to DAC960 V2
5587 Firmware Controllers.
5590 static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T
*Command
)
5592 DAC960_Controller_T
*Controller
= Command
->Controller
;
5593 DAC960_V2_CommandMailbox_T
*CommandMailbox
= &Command
->V2
.CommandMailbox
;
5594 DAC960_V2_ClearCommand(Command
);
5595 Command
->CommandType
= DAC960_MonitoringCommand
;
5596 CommandMailbox
->ControllerInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
5597 CommandMailbox
->ControllerInfo
.CommandControlBits
5598 .DataTransferControllerToHost
= true;
5599 CommandMailbox
->ControllerInfo
.CommandControlBits
5600 .NoAutoRequestSense
= true;
5601 CommandMailbox
->ControllerInfo
.DataTransferSize
=
5602 sizeof(DAC960_V2_ControllerInfo_T
);
5603 CommandMailbox
->ControllerInfo
.ControllerNumber
= 0;
5604 CommandMailbox
->ControllerInfo
.IOCTL_Opcode
= DAC960_V2_GetControllerInfo
;
5605 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
5606 .ScatterGatherSegments
[0]
5607 .SegmentDataPointer
=
5608 Controller
->V2
.NewControllerInformationDMA
;
5609 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
5610 .ScatterGatherSegments
[0]
5612 CommandMailbox
->ControllerInfo
.DataTransferSize
;
5613 DAC960_QueueCommand(Command
);
5618 DAC960_MonitoringTimerFunction is the timer function for monitoring
5619 the status of DAC960 Controllers.
5622 static void DAC960_MonitoringTimerFunction(struct timer_list
*t
)
5624 DAC960_Controller_T
*Controller
= from_timer(Controller
, t
, MonitoringTimer
);
5625 DAC960_Command_T
*Command
;
5626 unsigned long flags
;
5628 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
5630 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5632 Queue a Status Monitoring Command to Controller.
5634 Command
= DAC960_AllocateCommand(Controller
);
5635 if (Command
!= NULL
)
5636 DAC960_V1_QueueMonitoringCommand(Command
);
5637 else Controller
->MonitoringCommandDeferred
= true;
5638 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5642 DAC960_V2_ControllerInfo_T
*ControllerInfo
=
5643 &Controller
->V2
.ControllerInformation
;
5644 unsigned int StatusChangeCounter
=
5645 Controller
->V2
.HealthStatusBuffer
->StatusChangeCounter
;
5646 bool ForceMonitoringCommand
= false;
5647 if (time_after(jiffies
, Controller
->SecondaryMonitoringTime
5648 + DAC960_SecondaryMonitoringInterval
))
5650 int LogicalDriveNumber
;
5651 for (LogicalDriveNumber
= 0;
5652 LogicalDriveNumber
< DAC960_MaxLogicalDrives
;
5653 LogicalDriveNumber
++)
5655 DAC960_V2_LogicalDeviceInfo_T
*LogicalDeviceInfo
=
5656 Controller
->V2
.LogicalDeviceInformation
[LogicalDriveNumber
];
5657 if (LogicalDeviceInfo
== NULL
) continue;
5658 if (!LogicalDeviceInfo
->LogicalDeviceControl
5659 .LogicalDeviceInitialized
)
5661 ForceMonitoringCommand
= true;
5665 Controller
->SecondaryMonitoringTime
= jiffies
;
5667 if (StatusChangeCounter
== Controller
->V2
.StatusChangeCounter
&&
5668 Controller
->V2
.HealthStatusBuffer
->NextEventSequenceNumber
5669 == Controller
->V2
.NextEventSequenceNumber
&&
5670 (ControllerInfo
->BackgroundInitializationsActive
+
5671 ControllerInfo
->LogicalDeviceInitializationsActive
+
5672 ControllerInfo
->PhysicalDeviceInitializationsActive
+
5673 ControllerInfo
->ConsistencyChecksActive
+
5674 ControllerInfo
->RebuildsActive
+
5675 ControllerInfo
->OnlineExpansionsActive
== 0 ||
5676 time_before(jiffies
, Controller
->PrimaryMonitoringTime
5677 + DAC960_MonitoringTimerInterval
)) &&
5678 !ForceMonitoringCommand
)
5680 Controller
->MonitoringTimer
.expires
=
5681 jiffies
+ DAC960_HealthStatusMonitoringInterval
;
5682 add_timer(&Controller
->MonitoringTimer
);
5685 Controller
->V2
.StatusChangeCounter
= StatusChangeCounter
;
5686 Controller
->PrimaryMonitoringTime
= jiffies
;
5688 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5690 Queue a Status Monitoring Command to Controller.
5692 Command
= DAC960_AllocateCommand(Controller
);
5693 if (Command
!= NULL
)
5694 DAC960_V2_QueueMonitoringCommand(Command
);
5695 else Controller
->MonitoringCommandDeferred
= true;
5696 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5698 Wake up any processes waiting on a Health Status Buffer change.
5700 wake_up(&Controller
->HealthStatusWaitQueue
);
5705 DAC960_CheckStatusBuffer verifies that there is room to hold ByteCount
5706 additional bytes in the Combined Status Buffer and grows the buffer if
5707 necessary. It returns true if there is enough room and false otherwise.
5710 static bool DAC960_CheckStatusBuffer(DAC960_Controller_T
*Controller
,
5711 unsigned int ByteCount
)
5713 unsigned char *NewStatusBuffer
;
5714 if (Controller
->InitialStatusLength
+ 1 +
5715 Controller
->CurrentStatusLength
+ ByteCount
+ 1 <=
5716 Controller
->CombinedStatusBufferLength
)
5718 if (Controller
->CombinedStatusBufferLength
== 0)
5720 unsigned int NewStatusBufferLength
= DAC960_InitialStatusBufferSize
;
5721 while (NewStatusBufferLength
< ByteCount
)
5722 NewStatusBufferLength
*= 2;
5723 Controller
->CombinedStatusBuffer
= kmalloc(NewStatusBufferLength
,
5725 if (Controller
->CombinedStatusBuffer
== NULL
) return false;
5726 Controller
->CombinedStatusBufferLength
= NewStatusBufferLength
;
5729 NewStatusBuffer
= kmalloc_array(2, Controller
->CombinedStatusBufferLength
,
5731 if (NewStatusBuffer
== NULL
)
5733 DAC960_Warning("Unable to expand Combined Status Buffer - Truncating\n",
5737 memcpy(NewStatusBuffer
, Controller
->CombinedStatusBuffer
,
5738 Controller
->CombinedStatusBufferLength
);
5739 kfree(Controller
->CombinedStatusBuffer
);
5740 Controller
->CombinedStatusBuffer
= NewStatusBuffer
;
5741 Controller
->CombinedStatusBufferLength
*= 2;
5742 Controller
->CurrentStatusBuffer
=
5743 &NewStatusBuffer
[Controller
->InitialStatusLength
+ 1];
5749 DAC960_Message prints Driver Messages.
5752 static void DAC960_Message(DAC960_MessageLevel_T MessageLevel
,
5753 unsigned char *Format
,
5754 DAC960_Controller_T
*Controller
,
5757 static unsigned char Buffer
[DAC960_LineBufferSize
];
5758 static bool BeginningOfLine
= true;
5761 va_start(Arguments
, Controller
);
5762 Length
= vsprintf(Buffer
, Format
, Arguments
);
5764 if (Controller
== NULL
)
5765 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap
[MessageLevel
],
5766 DAC960_ControllerCount
, Buffer
);
5767 else if (MessageLevel
== DAC960_AnnounceLevel
||
5768 MessageLevel
== DAC960_InfoLevel
)
5770 if (!Controller
->ControllerInitialized
)
5772 if (DAC960_CheckStatusBuffer(Controller
, Length
))
5774 strcpy(&Controller
->CombinedStatusBuffer
5775 [Controller
->InitialStatusLength
],
5777 Controller
->InitialStatusLength
+= Length
;
5778 Controller
->CurrentStatusBuffer
=
5779 &Controller
->CombinedStatusBuffer
5780 [Controller
->InitialStatusLength
+ 1];
5782 if (MessageLevel
== DAC960_AnnounceLevel
)
5784 static int AnnouncementLines
= 0;
5785 if (++AnnouncementLines
<= 2)
5786 printk("%sDAC960: %s", DAC960_MessageLevelMap
[MessageLevel
],
5791 if (BeginningOfLine
)
5793 if (Buffer
[0] != '\n' || Length
> 1)
5794 printk("%sDAC960#%d: %s",
5795 DAC960_MessageLevelMap
[MessageLevel
],
5796 Controller
->ControllerNumber
, Buffer
);
5798 else printk("%s", Buffer
);
5801 else if (DAC960_CheckStatusBuffer(Controller
, Length
))
5803 strcpy(&Controller
->CurrentStatusBuffer
[
5804 Controller
->CurrentStatusLength
], Buffer
);
5805 Controller
->CurrentStatusLength
+= Length
;
5808 else if (MessageLevel
== DAC960_ProgressLevel
)
5810 strcpy(Controller
->ProgressBuffer
, Buffer
);
5811 Controller
->ProgressBufferLength
= Length
;
5812 if (Controller
->EphemeralProgressMessage
)
5814 if (time_after_eq(jiffies
, Controller
->LastProgressReportTime
5815 + DAC960_ProgressReportingInterval
))
5817 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap
[MessageLevel
],
5818 Controller
->ControllerNumber
, Buffer
);
5819 Controller
->LastProgressReportTime
= jiffies
;
5822 else printk("%sDAC960#%d: %s", DAC960_MessageLevelMap
[MessageLevel
],
5823 Controller
->ControllerNumber
, Buffer
);
5825 else if (MessageLevel
== DAC960_UserCriticalLevel
)
5827 strcpy(&Controller
->UserStatusBuffer
[Controller
->UserStatusLength
],
5829 Controller
->UserStatusLength
+= Length
;
5830 if (Buffer
[0] != '\n' || Length
> 1)
5831 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap
[MessageLevel
],
5832 Controller
->ControllerNumber
, Buffer
);
5836 if (BeginningOfLine
)
5837 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap
[MessageLevel
],
5838 Controller
->ControllerNumber
, Buffer
);
5839 else printk("%s", Buffer
);
5841 BeginningOfLine
= (Buffer
[Length
-1] == '\n');
5846 DAC960_ParsePhysicalDevice parses spaces followed by a Physical Device
5847 Channel:TargetID specification from a User Command string. It updates
5848 Channel and TargetID and returns true on success and false on failure.
5851 static bool DAC960_ParsePhysicalDevice(DAC960_Controller_T
*Controller
,
5852 char *UserCommandString
,
5853 unsigned char *Channel
,
5854 unsigned char *TargetID
)
5856 char *NewUserCommandString
= UserCommandString
;
5857 unsigned long XChannel
, XTargetID
;
5858 while (*UserCommandString
== ' ') UserCommandString
++;
5859 if (UserCommandString
== NewUserCommandString
)
5861 XChannel
= simple_strtoul(UserCommandString
, &NewUserCommandString
, 10);
5862 if (NewUserCommandString
== UserCommandString
||
5863 *NewUserCommandString
!= ':' ||
5864 XChannel
>= Controller
->Channels
)
5866 UserCommandString
= ++NewUserCommandString
;
5867 XTargetID
= simple_strtoul(UserCommandString
, &NewUserCommandString
, 10);
5868 if (NewUserCommandString
== UserCommandString
||
5869 *NewUserCommandString
!= '\0' ||
5870 XTargetID
>= Controller
->Targets
)
5872 *Channel
= XChannel
;
5873 *TargetID
= XTargetID
;
5879 DAC960_ParseLogicalDrive parses spaces followed by a Logical Drive Number
5880 specification from a User Command string. It updates LogicalDriveNumber and
5881 returns true on success and false on failure.
5884 static bool DAC960_ParseLogicalDrive(DAC960_Controller_T
*Controller
,
5885 char *UserCommandString
,
5886 unsigned char *LogicalDriveNumber
)
5888 char *NewUserCommandString
= UserCommandString
;
5889 unsigned long XLogicalDriveNumber
;
5890 while (*UserCommandString
== ' ') UserCommandString
++;
5891 if (UserCommandString
== NewUserCommandString
)
5893 XLogicalDriveNumber
=
5894 simple_strtoul(UserCommandString
, &NewUserCommandString
, 10);
5895 if (NewUserCommandString
== UserCommandString
||
5896 *NewUserCommandString
!= '\0' ||
5897 XLogicalDriveNumber
> DAC960_MaxLogicalDrives
- 1)
5899 *LogicalDriveNumber
= XLogicalDriveNumber
;
5905 DAC960_V1_SetDeviceState sets the Device State for a Physical Device for
5906 DAC960 V1 Firmware Controllers.
5909 static void DAC960_V1_SetDeviceState(DAC960_Controller_T
*Controller
,
5910 DAC960_Command_T
*Command
,
5911 unsigned char Channel
,
5912 unsigned char TargetID
,
5913 DAC960_V1_PhysicalDeviceState_T
5915 const unsigned char *DeviceStateString
)
5917 DAC960_V1_CommandMailbox_T
*CommandMailbox
= &Command
->V1
.CommandMailbox
;
5918 CommandMailbox
->Type3D
.CommandOpcode
= DAC960_V1_StartDevice
;
5919 CommandMailbox
->Type3D
.Channel
= Channel
;
5920 CommandMailbox
->Type3D
.TargetID
= TargetID
;
5921 CommandMailbox
->Type3D
.DeviceState
= DeviceState
;
5922 CommandMailbox
->Type3D
.Modifier
= 0;
5923 DAC960_ExecuteCommand(Command
);
5924 switch (Command
->V1
.CommandStatus
)
5926 case DAC960_V1_NormalCompletion
:
5927 DAC960_UserCritical("%s of Physical Device %d:%d Succeeded\n", Controller
,
5928 DeviceStateString
, Channel
, TargetID
);
5930 case DAC960_V1_UnableToStartDevice
:
5931 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5932 "Unable to Start Device\n", Controller
,
5933 DeviceStateString
, Channel
, TargetID
);
5935 case DAC960_V1_NoDeviceAtAddress
:
5936 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5937 "No Device at Address\n", Controller
,
5938 DeviceStateString
, Channel
, TargetID
);
5940 case DAC960_V1_InvalidChannelOrTargetOrModifier
:
5941 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5942 "Invalid Channel or Target or Modifier\n",
5943 Controller
, DeviceStateString
, Channel
, TargetID
);
5945 case DAC960_V1_ChannelBusy
:
5946 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5947 "Channel Busy\n", Controller
,
5948 DeviceStateString
, Channel
, TargetID
);
5951 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5952 "Unexpected Status %04X\n", Controller
,
5953 DeviceStateString
, Channel
, TargetID
,
5954 Command
->V1
.CommandStatus
);
5961 DAC960_V1_ExecuteUserCommand executes a User Command for DAC960 V1 Firmware
5965 static bool DAC960_V1_ExecuteUserCommand(DAC960_Controller_T
*Controller
,
5966 unsigned char *UserCommand
)
5968 DAC960_Command_T
*Command
;
5969 DAC960_V1_CommandMailbox_T
*CommandMailbox
;
5970 unsigned long flags
;
5971 unsigned char Channel
, TargetID
, LogicalDriveNumber
;
5973 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
5974 while ((Command
= DAC960_AllocateCommand(Controller
)) == NULL
)
5975 DAC960_WaitForCommand(Controller
);
5976 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
5977 Controller
->UserStatusLength
= 0;
5978 DAC960_V1_ClearCommand(Command
);
5979 Command
->CommandType
= DAC960_ImmediateCommand
;
5980 CommandMailbox
= &Command
->V1
.CommandMailbox
;
5981 if (strcmp(UserCommand
, "flush-cache") == 0)
5983 CommandMailbox
->Type3
.CommandOpcode
= DAC960_V1_Flush
;
5984 DAC960_ExecuteCommand(Command
);
5985 DAC960_UserCritical("Cache Flush Completed\n", Controller
);
5987 else if (strncmp(UserCommand
, "kill", 4) == 0 &&
5988 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[4],
5989 &Channel
, &TargetID
))
5991 DAC960_V1_DeviceState_T
*DeviceState
=
5992 &Controller
->V1
.DeviceState
[Channel
][TargetID
];
5993 if (DeviceState
->Present
&&
5994 DeviceState
->DeviceType
== DAC960_V1_DiskType
&&
5995 DeviceState
->DeviceState
!= DAC960_V1_Device_Dead
)
5996 DAC960_V1_SetDeviceState(Controller
, Command
, Channel
, TargetID
,
5997 DAC960_V1_Device_Dead
, "Kill");
5998 else DAC960_UserCritical("Kill of Physical Device %d:%d Illegal\n",
5999 Controller
, Channel
, TargetID
);
6001 else if (strncmp(UserCommand
, "make-online", 11) == 0 &&
6002 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[11],
6003 &Channel
, &TargetID
))
6005 DAC960_V1_DeviceState_T
*DeviceState
=
6006 &Controller
->V1
.DeviceState
[Channel
][TargetID
];
6007 if (DeviceState
->Present
&&
6008 DeviceState
->DeviceType
== DAC960_V1_DiskType
&&
6009 DeviceState
->DeviceState
== DAC960_V1_Device_Dead
)
6010 DAC960_V1_SetDeviceState(Controller
, Command
, Channel
, TargetID
,
6011 DAC960_V1_Device_Online
, "Make Online");
6012 else DAC960_UserCritical("Make Online of Physical Device %d:%d Illegal\n",
6013 Controller
, Channel
, TargetID
);
6016 else if (strncmp(UserCommand
, "make-standby", 12) == 0 &&
6017 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[12],
6018 &Channel
, &TargetID
))
6020 DAC960_V1_DeviceState_T
*DeviceState
=
6021 &Controller
->V1
.DeviceState
[Channel
][TargetID
];
6022 if (DeviceState
->Present
&&
6023 DeviceState
->DeviceType
== DAC960_V1_DiskType
&&
6024 DeviceState
->DeviceState
== DAC960_V1_Device_Dead
)
6025 DAC960_V1_SetDeviceState(Controller
, Command
, Channel
, TargetID
,
6026 DAC960_V1_Device_Standby
, "Make Standby");
6027 else DAC960_UserCritical("Make Standby of Physical "
6028 "Device %d:%d Illegal\n",
6029 Controller
, Channel
, TargetID
);
6031 else if (strncmp(UserCommand
, "rebuild", 7) == 0 &&
6032 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[7],
6033 &Channel
, &TargetID
))
6035 CommandMailbox
->Type3D
.CommandOpcode
= DAC960_V1_RebuildAsync
;
6036 CommandMailbox
->Type3D
.Channel
= Channel
;
6037 CommandMailbox
->Type3D
.TargetID
= TargetID
;
6038 DAC960_ExecuteCommand(Command
);
6039 switch (Command
->V1
.CommandStatus
)
6041 case DAC960_V1_NormalCompletion
:
6042 DAC960_UserCritical("Rebuild of Physical Device %d:%d Initiated\n",
6043 Controller
, Channel
, TargetID
);
6045 case DAC960_V1_AttemptToRebuildOnlineDrive
:
6046 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6047 "Attempt to Rebuild Online or "
6048 "Unresponsive Drive\n",
6049 Controller
, Channel
, TargetID
);
6051 case DAC960_V1_NewDiskFailedDuringRebuild
:
6052 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6053 "New Disk Failed During Rebuild\n",
6054 Controller
, Channel
, TargetID
);
6056 case DAC960_V1_InvalidDeviceAddress
:
6057 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6058 "Invalid Device Address\n",
6059 Controller
, Channel
, TargetID
);
6061 case DAC960_V1_RebuildOrCheckAlreadyInProgress
:
6062 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6063 "Rebuild or Consistency Check Already "
6064 "in Progress\n", Controller
, Channel
, TargetID
);
6067 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6068 "Unexpected Status %04X\n", Controller
,
6069 Channel
, TargetID
, Command
->V1
.CommandStatus
);
6073 else if (strncmp(UserCommand
, "check-consistency", 17) == 0 &&
6074 DAC960_ParseLogicalDrive(Controller
, &UserCommand
[17],
6075 &LogicalDriveNumber
))
6077 CommandMailbox
->Type3C
.CommandOpcode
= DAC960_V1_CheckConsistencyAsync
;
6078 CommandMailbox
->Type3C
.LogicalDriveNumber
= LogicalDriveNumber
;
6079 CommandMailbox
->Type3C
.AutoRestore
= true;
6080 DAC960_ExecuteCommand(Command
);
6081 switch (Command
->V1
.CommandStatus
)
6083 case DAC960_V1_NormalCompletion
:
6084 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6085 "(/dev/rd/c%dd%d) Initiated\n",
6086 Controller
, LogicalDriveNumber
,
6087 Controller
->ControllerNumber
,
6088 LogicalDriveNumber
);
6090 case DAC960_V1_DependentDiskIsDead
:
6091 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6092 "(/dev/rd/c%dd%d) Failed - "
6093 "Dependent Physical Device is DEAD\n",
6094 Controller
, LogicalDriveNumber
,
6095 Controller
->ControllerNumber
,
6096 LogicalDriveNumber
);
6098 case DAC960_V1_InvalidOrNonredundantLogicalDrive
:
6099 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6100 "(/dev/rd/c%dd%d) Failed - "
6101 "Invalid or Nonredundant Logical Drive\n",
6102 Controller
, LogicalDriveNumber
,
6103 Controller
->ControllerNumber
,
6104 LogicalDriveNumber
);
6106 case DAC960_V1_RebuildOrCheckAlreadyInProgress
:
6107 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6108 "(/dev/rd/c%dd%d) Failed - Rebuild or "
6109 "Consistency Check Already in Progress\n",
6110 Controller
, LogicalDriveNumber
,
6111 Controller
->ControllerNumber
,
6112 LogicalDriveNumber
);
6115 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6116 "(/dev/rd/c%dd%d) Failed - "
6117 "Unexpected Status %04X\n",
6118 Controller
, LogicalDriveNumber
,
6119 Controller
->ControllerNumber
,
6120 LogicalDriveNumber
, Command
->V1
.CommandStatus
);
6124 else if (strcmp(UserCommand
, "cancel-rebuild") == 0 ||
6125 strcmp(UserCommand
, "cancel-consistency-check") == 0)
6128 the OldRebuildRateConstant is never actually used
6129 once its value is retrieved from the controller.
6131 unsigned char *OldRebuildRateConstant
;
6132 dma_addr_t OldRebuildRateConstantDMA
;
6134 OldRebuildRateConstant
= pci_alloc_consistent( Controller
->PCIDevice
,
6135 sizeof(char), &OldRebuildRateConstantDMA
);
6136 if (OldRebuildRateConstant
== NULL
) {
6137 DAC960_UserCritical("Cancellation of Rebuild or "
6138 "Consistency Check Failed - "
6143 CommandMailbox
->Type3R
.CommandOpcode
= DAC960_V1_RebuildControl
;
6144 CommandMailbox
->Type3R
.RebuildRateConstant
= 0xFF;
6145 CommandMailbox
->Type3R
.BusAddress
= OldRebuildRateConstantDMA
;
6146 DAC960_ExecuteCommand(Command
);
6147 switch (Command
->V1
.CommandStatus
)
6149 case DAC960_V1_NormalCompletion
:
6150 DAC960_UserCritical("Rebuild or Consistency Check Cancelled\n",
6154 DAC960_UserCritical("Cancellation of Rebuild or "
6155 "Consistency Check Failed - "
6156 "Unexpected Status %04X\n",
6157 Controller
, Command
->V1
.CommandStatus
);
6161 pci_free_consistent(Controller
->PCIDevice
, sizeof(char),
6162 OldRebuildRateConstant
, OldRebuildRateConstantDMA
);
6164 else DAC960_UserCritical("Illegal User Command: '%s'\n",
6165 Controller
, UserCommand
);
6167 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6168 DAC960_DeallocateCommand(Command
);
6169 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6175 DAC960_V2_TranslatePhysicalDevice translates a Physical Device Channel and
6176 TargetID into a Logical Device. It returns true on success and false
6180 static bool DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T
*Command
,
6181 unsigned char Channel
,
6182 unsigned char TargetID
,
6184 *LogicalDeviceNumber
)
6186 DAC960_V2_CommandMailbox_T SavedCommandMailbox
, *CommandMailbox
;
6187 DAC960_Controller_T
*Controller
= Command
->Controller
;
6189 CommandMailbox
= &Command
->V2
.CommandMailbox
;
6190 memcpy(&SavedCommandMailbox
, CommandMailbox
,
6191 sizeof(DAC960_V2_CommandMailbox_T
));
6193 CommandMailbox
->PhysicalDeviceInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
6194 CommandMailbox
->PhysicalDeviceInfo
.CommandControlBits
6195 .DataTransferControllerToHost
= true;
6196 CommandMailbox
->PhysicalDeviceInfo
.CommandControlBits
6197 .NoAutoRequestSense
= true;
6198 CommandMailbox
->PhysicalDeviceInfo
.DataTransferSize
=
6199 sizeof(DAC960_V2_PhysicalToLogicalDevice_T
);
6200 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.TargetID
= TargetID
;
6201 CommandMailbox
->PhysicalDeviceInfo
.PhysicalDevice
.Channel
= Channel
;
6202 CommandMailbox
->PhysicalDeviceInfo
.IOCTL_Opcode
=
6203 DAC960_V2_TranslatePhysicalToLogicalDevice
;
6204 CommandMailbox
->Common
.DataTransferMemoryAddress
6205 .ScatterGatherSegments
[0]
6206 .SegmentDataPointer
=
6207 Controller
->V2
.PhysicalToLogicalDeviceDMA
;
6208 CommandMailbox
->Common
.DataTransferMemoryAddress
6209 .ScatterGatherSegments
[0]
6211 CommandMailbox
->Common
.DataTransferSize
;
6213 DAC960_ExecuteCommand(Command
);
6214 *LogicalDeviceNumber
= Controller
->V2
.PhysicalToLogicalDevice
->LogicalDeviceNumber
;
6216 memcpy(CommandMailbox
, &SavedCommandMailbox
,
6217 sizeof(DAC960_V2_CommandMailbox_T
));
6218 return (Command
->V2
.CommandStatus
== DAC960_V2_NormalCompletion
);
6223 DAC960_V2_ExecuteUserCommand executes a User Command for DAC960 V2 Firmware
6227 static bool DAC960_V2_ExecuteUserCommand(DAC960_Controller_T
*Controller
,
6228 unsigned char *UserCommand
)
6230 DAC960_Command_T
*Command
;
6231 DAC960_V2_CommandMailbox_T
*CommandMailbox
;
6232 unsigned long flags
;
6233 unsigned char Channel
, TargetID
, LogicalDriveNumber
;
6234 unsigned short LogicalDeviceNumber
;
6236 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6237 while ((Command
= DAC960_AllocateCommand(Controller
)) == NULL
)
6238 DAC960_WaitForCommand(Controller
);
6239 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6240 Controller
->UserStatusLength
= 0;
6241 DAC960_V2_ClearCommand(Command
);
6242 Command
->CommandType
= DAC960_ImmediateCommand
;
6243 CommandMailbox
= &Command
->V2
.CommandMailbox
;
6244 CommandMailbox
->Common
.CommandOpcode
= DAC960_V2_IOCTL
;
6245 CommandMailbox
->Common
.CommandControlBits
.DataTransferControllerToHost
= true;
6246 CommandMailbox
->Common
.CommandControlBits
.NoAutoRequestSense
= true;
6247 if (strcmp(UserCommand
, "flush-cache") == 0)
6249 CommandMailbox
->DeviceOperation
.IOCTL_Opcode
= DAC960_V2_PauseDevice
;
6250 CommandMailbox
->DeviceOperation
.OperationDevice
=
6251 DAC960_V2_RAID_Controller
;
6252 DAC960_ExecuteCommand(Command
);
6253 DAC960_UserCritical("Cache Flush Completed\n", Controller
);
6255 else if (strncmp(UserCommand
, "kill", 4) == 0 &&
6256 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[4],
6257 &Channel
, &TargetID
) &&
6258 DAC960_V2_TranslatePhysicalDevice(Command
, Channel
, TargetID
,
6259 &LogicalDeviceNumber
))
6261 CommandMailbox
->SetDeviceState
.LogicalDevice
.LogicalDeviceNumber
=
6262 LogicalDeviceNumber
;
6263 CommandMailbox
->SetDeviceState
.IOCTL_Opcode
=
6264 DAC960_V2_SetDeviceState
;
6265 CommandMailbox
->SetDeviceState
.DeviceState
.PhysicalDeviceState
=
6266 DAC960_V2_Device_Dead
;
6267 DAC960_ExecuteCommand(Command
);
6268 DAC960_UserCritical("Kill of Physical Device %d:%d %s\n",
6269 Controller
, Channel
, TargetID
,
6270 (Command
->V2
.CommandStatus
6271 == DAC960_V2_NormalCompletion
6272 ? "Succeeded" : "Failed"));
6274 else if (strncmp(UserCommand
, "make-online", 11) == 0 &&
6275 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[11],
6276 &Channel
, &TargetID
) &&
6277 DAC960_V2_TranslatePhysicalDevice(Command
, Channel
, TargetID
,
6278 &LogicalDeviceNumber
))
6280 CommandMailbox
->SetDeviceState
.LogicalDevice
.LogicalDeviceNumber
=
6281 LogicalDeviceNumber
;
6282 CommandMailbox
->SetDeviceState
.IOCTL_Opcode
=
6283 DAC960_V2_SetDeviceState
;
6284 CommandMailbox
->SetDeviceState
.DeviceState
.PhysicalDeviceState
=
6285 DAC960_V2_Device_Online
;
6286 DAC960_ExecuteCommand(Command
);
6287 DAC960_UserCritical("Make Online of Physical Device %d:%d %s\n",
6288 Controller
, Channel
, TargetID
,
6289 (Command
->V2
.CommandStatus
6290 == DAC960_V2_NormalCompletion
6291 ? "Succeeded" : "Failed"));
6293 else if (strncmp(UserCommand
, "make-standby", 12) == 0 &&
6294 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[12],
6295 &Channel
, &TargetID
) &&
6296 DAC960_V2_TranslatePhysicalDevice(Command
, Channel
, TargetID
,
6297 &LogicalDeviceNumber
))
6299 CommandMailbox
->SetDeviceState
.LogicalDevice
.LogicalDeviceNumber
=
6300 LogicalDeviceNumber
;
6301 CommandMailbox
->SetDeviceState
.IOCTL_Opcode
=
6302 DAC960_V2_SetDeviceState
;
6303 CommandMailbox
->SetDeviceState
.DeviceState
.PhysicalDeviceState
=
6304 DAC960_V2_Device_Standby
;
6305 DAC960_ExecuteCommand(Command
);
6306 DAC960_UserCritical("Make Standby of Physical Device %d:%d %s\n",
6307 Controller
, Channel
, TargetID
,
6308 (Command
->V2
.CommandStatus
6309 == DAC960_V2_NormalCompletion
6310 ? "Succeeded" : "Failed"));
6312 else if (strncmp(UserCommand
, "rebuild", 7) == 0 &&
6313 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[7],
6314 &Channel
, &TargetID
) &&
6315 DAC960_V2_TranslatePhysicalDevice(Command
, Channel
, TargetID
,
6316 &LogicalDeviceNumber
))
6318 CommandMailbox
->LogicalDeviceInfo
.LogicalDevice
.LogicalDeviceNumber
=
6319 LogicalDeviceNumber
;
6320 CommandMailbox
->LogicalDeviceInfo
.IOCTL_Opcode
=
6321 DAC960_V2_RebuildDeviceStart
;
6322 DAC960_ExecuteCommand(Command
);
6323 DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6324 Controller
, Channel
, TargetID
,
6325 (Command
->V2
.CommandStatus
6326 == DAC960_V2_NormalCompletion
6327 ? "Initiated" : "Not Initiated"));
6329 else if (strncmp(UserCommand
, "cancel-rebuild", 14) == 0 &&
6330 DAC960_ParsePhysicalDevice(Controller
, &UserCommand
[14],
6331 &Channel
, &TargetID
) &&
6332 DAC960_V2_TranslatePhysicalDevice(Command
, Channel
, TargetID
,
6333 &LogicalDeviceNumber
))
6335 CommandMailbox
->LogicalDeviceInfo
.LogicalDevice
.LogicalDeviceNumber
=
6336 LogicalDeviceNumber
;
6337 CommandMailbox
->LogicalDeviceInfo
.IOCTL_Opcode
=
6338 DAC960_V2_RebuildDeviceStop
;
6339 DAC960_ExecuteCommand(Command
);
6340 DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6341 Controller
, Channel
, TargetID
,
6342 (Command
->V2
.CommandStatus
6343 == DAC960_V2_NormalCompletion
6344 ? "Cancelled" : "Not Cancelled"));
6346 else if (strncmp(UserCommand
, "check-consistency", 17) == 0 &&
6347 DAC960_ParseLogicalDrive(Controller
, &UserCommand
[17],
6348 &LogicalDriveNumber
))
6350 CommandMailbox
->ConsistencyCheck
.LogicalDevice
.LogicalDeviceNumber
=
6352 CommandMailbox
->ConsistencyCheck
.IOCTL_Opcode
=
6353 DAC960_V2_ConsistencyCheckStart
;
6354 CommandMailbox
->ConsistencyCheck
.RestoreConsistency
= true;
6355 CommandMailbox
->ConsistencyCheck
.InitializedAreaOnly
= false;
6356 DAC960_ExecuteCommand(Command
);
6357 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6358 "(/dev/rd/c%dd%d) %s\n",
6359 Controller
, LogicalDriveNumber
,
6360 Controller
->ControllerNumber
,
6362 (Command
->V2
.CommandStatus
6363 == DAC960_V2_NormalCompletion
6364 ? "Initiated" : "Not Initiated"));
6366 else if (strncmp(UserCommand
, "cancel-consistency-check", 24) == 0 &&
6367 DAC960_ParseLogicalDrive(Controller
, &UserCommand
[24],
6368 &LogicalDriveNumber
))
6370 CommandMailbox
->ConsistencyCheck
.LogicalDevice
.LogicalDeviceNumber
=
6372 CommandMailbox
->ConsistencyCheck
.IOCTL_Opcode
=
6373 DAC960_V2_ConsistencyCheckStop
;
6374 DAC960_ExecuteCommand(Command
);
6375 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6376 "(/dev/rd/c%dd%d) %s\n",
6377 Controller
, LogicalDriveNumber
,
6378 Controller
->ControllerNumber
,
6380 (Command
->V2
.CommandStatus
6381 == DAC960_V2_NormalCompletion
6382 ? "Cancelled" : "Not Cancelled"));
6384 else if (strcmp(UserCommand
, "perform-discovery") == 0)
6386 CommandMailbox
->Common
.IOCTL_Opcode
= DAC960_V2_StartDiscovery
;
6387 DAC960_ExecuteCommand(Command
);
6388 DAC960_UserCritical("Discovery %s\n", Controller
,
6389 (Command
->V2
.CommandStatus
6390 == DAC960_V2_NormalCompletion
6391 ? "Initiated" : "Not Initiated"));
6392 if (Command
->V2
.CommandStatus
== DAC960_V2_NormalCompletion
)
6394 CommandMailbox
->ControllerInfo
.CommandOpcode
= DAC960_V2_IOCTL
;
6395 CommandMailbox
->ControllerInfo
.CommandControlBits
6396 .DataTransferControllerToHost
= true;
6397 CommandMailbox
->ControllerInfo
.CommandControlBits
6398 .NoAutoRequestSense
= true;
6399 CommandMailbox
->ControllerInfo
.DataTransferSize
=
6400 sizeof(DAC960_V2_ControllerInfo_T
);
6401 CommandMailbox
->ControllerInfo
.ControllerNumber
= 0;
6402 CommandMailbox
->ControllerInfo
.IOCTL_Opcode
=
6403 DAC960_V2_GetControllerInfo
;
6405 * How does this NOT race with the queued Monitoring
6406 * usage of this structure?
6408 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
6409 .ScatterGatherSegments
[0]
6410 .SegmentDataPointer
=
6411 Controller
->V2
.NewControllerInformationDMA
;
6412 CommandMailbox
->ControllerInfo
.DataTransferMemoryAddress
6413 .ScatterGatherSegments
[0]
6415 CommandMailbox
->ControllerInfo
.DataTransferSize
;
6417 DAC960_ExecuteCommand(Command
);
6418 if (!Controller
->V2
.NewControllerInformation
->PhysicalScanActive
)
6422 DAC960_UserCritical("Discovery Completed\n", Controller
);
6425 else if (strcmp(UserCommand
, "suppress-enclosure-messages") == 0)
6426 Controller
->SuppressEnclosureMessages
= true;
6427 else DAC960_UserCritical("Illegal User Command: '%s'\n",
6428 Controller
, UserCommand
);
6430 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6431 DAC960_DeallocateCommand(Command
);
6432 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6436 static int __maybe_unused
dac960_proc_show(struct seq_file
*m
, void *v
)
6438 unsigned char *StatusMessage
= "OK\n";
6439 int ControllerNumber
;
6440 for (ControllerNumber
= 0;
6441 ControllerNumber
< DAC960_ControllerCount
;
6444 DAC960_Controller_T
*Controller
= DAC960_Controllers
[ControllerNumber
];
6445 if (Controller
== NULL
) continue;
6446 if (Controller
->MonitoringAlertMode
)
6448 StatusMessage
= "ALERT\n";
6452 seq_puts(m
, StatusMessage
);
6456 static int __maybe_unused
dac960_initial_status_proc_show(struct seq_file
*m
,
6459 DAC960_Controller_T
*Controller
= (DAC960_Controller_T
*)m
->private;
6460 seq_printf(m
, "%.*s", Controller
->InitialStatusLength
, Controller
->CombinedStatusBuffer
);
6464 static int __maybe_unused
dac960_current_status_proc_show(struct seq_file
*m
,
6467 DAC960_Controller_T
*Controller
= (DAC960_Controller_T
*) m
->private;
6468 unsigned char *StatusMessage
=
6469 "No Rebuild or Consistency Check in Progress\n";
6470 int ProgressMessageLength
= strlen(StatusMessage
);
6471 if (jiffies
!= Controller
->LastCurrentStatusTime
)
6473 Controller
->CurrentStatusLength
= 0;
6474 DAC960_AnnounceDriver(Controller
);
6475 DAC960_ReportControllerConfiguration(Controller
);
6476 DAC960_ReportDeviceConfiguration(Controller
);
6477 if (Controller
->ProgressBufferLength
> 0)
6478 ProgressMessageLength
= Controller
->ProgressBufferLength
;
6479 if (DAC960_CheckStatusBuffer(Controller
, 2 + ProgressMessageLength
))
6481 unsigned char *CurrentStatusBuffer
= Controller
->CurrentStatusBuffer
;
6482 CurrentStatusBuffer
[Controller
->CurrentStatusLength
++] = ' ';
6483 CurrentStatusBuffer
[Controller
->CurrentStatusLength
++] = ' ';
6484 if (Controller
->ProgressBufferLength
> 0)
6485 strcpy(&CurrentStatusBuffer
[Controller
->CurrentStatusLength
],
6486 Controller
->ProgressBuffer
);
6488 strcpy(&CurrentStatusBuffer
[Controller
->CurrentStatusLength
],
6490 Controller
->CurrentStatusLength
+= ProgressMessageLength
;
6492 Controller
->LastCurrentStatusTime
= jiffies
;
6494 seq_printf(m
, "%.*s", Controller
->CurrentStatusLength
, Controller
->CurrentStatusBuffer
);
6498 static int dac960_user_command_proc_show(struct seq_file
*m
, void *v
)
6500 DAC960_Controller_T
*Controller
= (DAC960_Controller_T
*)m
->private;
6502 seq_printf(m
, "%.*s", Controller
->UserStatusLength
, Controller
->UserStatusBuffer
);
6506 static int dac960_user_command_proc_open(struct inode
*inode
, struct file
*file
)
6508 return single_open(file
, dac960_user_command_proc_show
, PDE_DATA(inode
));
6511 static ssize_t
dac960_user_command_proc_write(struct file
*file
,
6512 const char __user
*Buffer
,
6513 size_t Count
, loff_t
*pos
)
6515 DAC960_Controller_T
*Controller
= PDE_DATA(file_inode(file
));
6516 unsigned char CommandBuffer
[80];
6518 if (Count
> sizeof(CommandBuffer
)-1) return -EINVAL
;
6519 if (copy_from_user(CommandBuffer
, Buffer
, Count
)) return -EFAULT
;
6520 CommandBuffer
[Count
] = '\0';
6521 Length
= strlen(CommandBuffer
);
6522 if (Length
> 0 && CommandBuffer
[Length
-1] == '\n')
6523 CommandBuffer
[--Length
] = '\0';
6524 if (Controller
->FirmwareType
== DAC960_V1_Controller
)
6525 return (DAC960_V1_ExecuteUserCommand(Controller
, CommandBuffer
)
6528 return (DAC960_V2_ExecuteUserCommand(Controller
, CommandBuffer
)
6532 static const struct file_operations dac960_user_command_proc_fops
= {
6533 .owner
= THIS_MODULE
,
6534 .open
= dac960_user_command_proc_open
,
6536 .llseek
= seq_lseek
,
6537 .release
= single_release
,
6538 .write
= dac960_user_command_proc_write
,
6542 DAC960_CreateProcEntries creates the /proc/rd/... entries for the
6546 static void DAC960_CreateProcEntries(DAC960_Controller_T
*Controller
)
6548 struct proc_dir_entry
*ControllerProcEntry
;
6550 if (DAC960_ProcDirectoryEntry
== NULL
) {
6551 DAC960_ProcDirectoryEntry
= proc_mkdir("rd", NULL
);
6552 proc_create_single("status", 0, DAC960_ProcDirectoryEntry
,
6556 snprintf(Controller
->ControllerName
, sizeof(Controller
->ControllerName
),
6557 "c%d", Controller
->ControllerNumber
);
6558 ControllerProcEntry
= proc_mkdir(Controller
->ControllerName
,
6559 DAC960_ProcDirectoryEntry
);
6560 proc_create_single_data("initial_status", 0, ControllerProcEntry
,
6561 dac960_initial_status_proc_show
, Controller
);
6562 proc_create_single_data("current_status", 0, ControllerProcEntry
,
6563 dac960_current_status_proc_show
, Controller
);
6564 proc_create_data("user_command", 0600, ControllerProcEntry
, &dac960_user_command_proc_fops
, Controller
);
6565 Controller
->ControllerProcEntry
= ControllerProcEntry
;
6570 DAC960_DestroyProcEntries destroys the /proc/rd/... entries for the
6574 static void DAC960_DestroyProcEntries(DAC960_Controller_T
*Controller
)
6576 if (Controller
->ControllerProcEntry
== NULL
)
6578 remove_proc_entry("initial_status", Controller
->ControllerProcEntry
);
6579 remove_proc_entry("current_status", Controller
->ControllerProcEntry
);
6580 remove_proc_entry("user_command", Controller
->ControllerProcEntry
);
6581 remove_proc_entry(Controller
->ControllerName
, DAC960_ProcDirectoryEntry
);
6582 Controller
->ControllerProcEntry
= NULL
;
6585 #ifdef DAC960_GAM_MINOR
6587 static long DAC960_gam_get_controller_info(DAC960_ControllerInfo_T __user
*UserSpaceControllerInfo
)
6589 DAC960_ControllerInfo_T ControllerInfo
;
6590 DAC960_Controller_T
*Controller
;
6591 int ControllerNumber
;
6594 if (UserSpaceControllerInfo
== NULL
)
6595 ErrorCode
= -EINVAL
;
6596 else ErrorCode
= get_user(ControllerNumber
,
6597 &UserSpaceControllerInfo
->ControllerNumber
);
6601 if (ControllerNumber
< 0 ||
6602 ControllerNumber
> DAC960_ControllerCount
- 1) {
6605 Controller
= DAC960_Controllers
[ControllerNumber
];
6606 if (Controller
== NULL
)
6608 memset(&ControllerInfo
, 0, sizeof(DAC960_ControllerInfo_T
));
6609 ControllerInfo
.ControllerNumber
= ControllerNumber
;
6610 ControllerInfo
.FirmwareType
= Controller
->FirmwareType
;
6611 ControllerInfo
.Channels
= Controller
->Channels
;
6612 ControllerInfo
.Targets
= Controller
->Targets
;
6613 ControllerInfo
.PCI_Bus
= Controller
->Bus
;
6614 ControllerInfo
.PCI_Device
= Controller
->Device
;
6615 ControllerInfo
.PCI_Function
= Controller
->Function
;
6616 ControllerInfo
.IRQ_Channel
= Controller
->IRQ_Channel
;
6617 ControllerInfo
.PCI_Address
= Controller
->PCI_Address
;
6618 strcpy(ControllerInfo
.ModelName
, Controller
->ModelName
);
6619 strcpy(ControllerInfo
.FirmwareVersion
, Controller
->FirmwareVersion
);
6620 ErrorCode
= (copy_to_user(UserSpaceControllerInfo
, &ControllerInfo
,
6621 sizeof(DAC960_ControllerInfo_T
)) ? -EFAULT
: 0);
6626 static long DAC960_gam_v1_execute_command(DAC960_V1_UserCommand_T __user
*UserSpaceUserCommand
)
6628 DAC960_V1_UserCommand_T UserCommand
;
6629 DAC960_Controller_T
*Controller
;
6630 DAC960_Command_T
*Command
= NULL
;
6631 DAC960_V1_CommandOpcode_T CommandOpcode
;
6632 DAC960_V1_CommandStatus_T CommandStatus
;
6633 DAC960_V1_DCDB_T DCDB
;
6634 DAC960_V1_DCDB_T
*DCDB_IOBUF
= NULL
;
6635 dma_addr_t DCDB_IOBUFDMA
;
6636 unsigned long flags
;
6637 int ControllerNumber
, DataTransferLength
;
6638 unsigned char *DataTransferBuffer
= NULL
;
6639 dma_addr_t DataTransferBufferDMA
;
6642 if (UserSpaceUserCommand
== NULL
) {
6643 ErrorCode
= -EINVAL
;
6646 if (copy_from_user(&UserCommand
, UserSpaceUserCommand
,
6647 sizeof(DAC960_V1_UserCommand_T
))) {
6648 ErrorCode
= -EFAULT
;
6651 ControllerNumber
= UserCommand
.ControllerNumber
;
6653 if (ControllerNumber
< 0 ||
6654 ControllerNumber
> DAC960_ControllerCount
- 1)
6656 Controller
= DAC960_Controllers
[ControllerNumber
];
6657 if (Controller
== NULL
)
6659 ErrorCode
= -EINVAL
;
6660 if (Controller
->FirmwareType
!= DAC960_V1_Controller
)
6662 CommandOpcode
= UserCommand
.CommandMailbox
.Common
.CommandOpcode
;
6663 DataTransferLength
= UserCommand
.DataTransferLength
;
6664 if (CommandOpcode
& 0x80)
6666 if (CommandOpcode
== DAC960_V1_DCDB
)
6668 if (copy_from_user(&DCDB
, UserCommand
.DCDB
,
6669 sizeof(DAC960_V1_DCDB_T
))) {
6670 ErrorCode
= -EFAULT
;
6673 if (DCDB
.Channel
>= DAC960_V1_MaxChannels
)
6675 if (!((DataTransferLength
== 0 &&
6677 == DAC960_V1_DCDB_NoDataTransfer
) ||
6678 (DataTransferLength
> 0 &&
6680 == DAC960_V1_DCDB_DataTransferDeviceToSystem
) ||
6681 (DataTransferLength
< 0 &&
6683 == DAC960_V1_DCDB_DataTransferSystemToDevice
)))
6685 if (((DCDB
.TransferLengthHigh4
<< 16) | DCDB
.TransferLength
)
6686 != abs(DataTransferLength
))
6688 DCDB_IOBUF
= pci_alloc_consistent(Controller
->PCIDevice
,
6689 sizeof(DAC960_V1_DCDB_T
), &DCDB_IOBUFDMA
);
6690 if (DCDB_IOBUF
== NULL
) {
6691 ErrorCode
= -ENOMEM
;
6695 ErrorCode
= -ENOMEM
;
6696 if (DataTransferLength
> 0)
6698 DataTransferBuffer
= pci_zalloc_consistent(Controller
->PCIDevice
,
6700 &DataTransferBufferDMA
);
6701 if (DataTransferBuffer
== NULL
)
6704 else if (DataTransferLength
< 0)
6706 DataTransferBuffer
= pci_alloc_consistent(Controller
->PCIDevice
,
6707 -DataTransferLength
, &DataTransferBufferDMA
);
6708 if (DataTransferBuffer
== NULL
)
6710 if (copy_from_user(DataTransferBuffer
,
6711 UserCommand
.DataTransferBuffer
,
6712 -DataTransferLength
)) {
6713 ErrorCode
= -EFAULT
;
6717 if (CommandOpcode
== DAC960_V1_DCDB
)
6719 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6720 while ((Command
= DAC960_AllocateCommand(Controller
)) == NULL
)
6721 DAC960_WaitForCommand(Controller
);
6722 while (Controller
->V1
.DirectCommandActive
[DCDB
.Channel
]
6725 spin_unlock_irq(&Controller
->queue_lock
);
6726 __wait_event(Controller
->CommandWaitQueue
,
6727 !Controller
->V1
.DirectCommandActive
6728 [DCDB
.Channel
][DCDB
.TargetID
]);
6729 spin_lock_irq(&Controller
->queue_lock
);
6731 Controller
->V1
.DirectCommandActive
[DCDB
.Channel
]
6732 [DCDB
.TargetID
] = true;
6733 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6734 DAC960_V1_ClearCommand(Command
);
6735 Command
->CommandType
= DAC960_ImmediateCommand
;
6736 memcpy(&Command
->V1
.CommandMailbox
, &UserCommand
.CommandMailbox
,
6737 sizeof(DAC960_V1_CommandMailbox_T
));
6738 Command
->V1
.CommandMailbox
.Type3
.BusAddress
= DCDB_IOBUFDMA
;
6739 DCDB
.BusAddress
= DataTransferBufferDMA
;
6740 memcpy(DCDB_IOBUF
, &DCDB
, sizeof(DAC960_V1_DCDB_T
));
6744 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6745 while ((Command
= DAC960_AllocateCommand(Controller
)) == NULL
)
6746 DAC960_WaitForCommand(Controller
);
6747 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6748 DAC960_V1_ClearCommand(Command
);
6749 Command
->CommandType
= DAC960_ImmediateCommand
;
6750 memcpy(&Command
->V1
.CommandMailbox
, &UserCommand
.CommandMailbox
,
6751 sizeof(DAC960_V1_CommandMailbox_T
));
6752 if (DataTransferBuffer
!= NULL
)
6753 Command
->V1
.CommandMailbox
.Type3
.BusAddress
=
6754 DataTransferBufferDMA
;
6756 DAC960_ExecuteCommand(Command
);
6757 CommandStatus
= Command
->V1
.CommandStatus
;
6758 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6759 DAC960_DeallocateCommand(Command
);
6760 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6761 if (DataTransferLength
> 0)
6763 if (copy_to_user(UserCommand
.DataTransferBuffer
,
6764 DataTransferBuffer
, DataTransferLength
)) {
6765 ErrorCode
= -EFAULT
;
6769 if (CommandOpcode
== DAC960_V1_DCDB
)
6772 I don't believe Target or Channel in the DCDB_IOBUF
6773 should be any different from the contents of DCDB.
6775 Controller
->V1
.DirectCommandActive
[DCDB
.Channel
]
6776 [DCDB
.TargetID
] = false;
6777 if (copy_to_user(UserCommand
.DCDB
, DCDB_IOBUF
,
6778 sizeof(DAC960_V1_DCDB_T
))) {
6779 ErrorCode
= -EFAULT
;
6783 ErrorCode
= CommandStatus
;
6785 if (DataTransferBuffer
!= NULL
)
6786 pci_free_consistent(Controller
->PCIDevice
, abs(DataTransferLength
),
6787 DataTransferBuffer
, DataTransferBufferDMA
);
6788 if (DCDB_IOBUF
!= NULL
)
6789 pci_free_consistent(Controller
->PCIDevice
, sizeof(DAC960_V1_DCDB_T
),
6790 DCDB_IOBUF
, DCDB_IOBUFDMA
);
6795 static long DAC960_gam_v2_execute_command(DAC960_V2_UserCommand_T __user
*UserSpaceUserCommand
)
6797 DAC960_V2_UserCommand_T UserCommand
;
6798 DAC960_Controller_T
*Controller
;
6799 DAC960_Command_T
*Command
= NULL
;
6800 DAC960_V2_CommandMailbox_T
*CommandMailbox
;
6801 DAC960_V2_CommandStatus_T CommandStatus
;
6802 unsigned long flags
;
6803 int ControllerNumber
, DataTransferLength
;
6804 int DataTransferResidue
, RequestSenseLength
;
6805 unsigned char *DataTransferBuffer
= NULL
;
6806 dma_addr_t DataTransferBufferDMA
;
6807 unsigned char *RequestSenseBuffer
= NULL
;
6808 dma_addr_t RequestSenseBufferDMA
;
6809 long ErrorCode
= -EINVAL
;
6811 if (UserSpaceUserCommand
== NULL
)
6813 if (copy_from_user(&UserCommand
, UserSpaceUserCommand
,
6814 sizeof(DAC960_V2_UserCommand_T
))) {
6815 ErrorCode
= -EFAULT
;
6819 ControllerNumber
= UserCommand
.ControllerNumber
;
6820 if (ControllerNumber
< 0 ||
6821 ControllerNumber
> DAC960_ControllerCount
- 1)
6823 Controller
= DAC960_Controllers
[ControllerNumber
];
6824 if (Controller
== NULL
)
6826 if (Controller
->FirmwareType
!= DAC960_V2_Controller
){
6827 ErrorCode
= -EINVAL
;
6830 DataTransferLength
= UserCommand
.DataTransferLength
;
6831 ErrorCode
= -ENOMEM
;
6832 if (DataTransferLength
> 0)
6834 DataTransferBuffer
= pci_zalloc_consistent(Controller
->PCIDevice
,
6836 &DataTransferBufferDMA
);
6837 if (DataTransferBuffer
== NULL
)
6840 else if (DataTransferLength
< 0)
6842 DataTransferBuffer
= pci_alloc_consistent(Controller
->PCIDevice
,
6843 -DataTransferLength
, &DataTransferBufferDMA
);
6844 if (DataTransferBuffer
== NULL
)
6846 if (copy_from_user(DataTransferBuffer
,
6847 UserCommand
.DataTransferBuffer
,
6848 -DataTransferLength
)) {
6849 ErrorCode
= -EFAULT
;
6853 RequestSenseLength
= UserCommand
.RequestSenseLength
;
6854 if (RequestSenseLength
> 0)
6856 RequestSenseBuffer
= pci_zalloc_consistent(Controller
->PCIDevice
,
6858 &RequestSenseBufferDMA
);
6859 if (RequestSenseBuffer
== NULL
)
6861 ErrorCode
= -ENOMEM
;
6865 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6866 while ((Command
= DAC960_AllocateCommand(Controller
)) == NULL
)
6867 DAC960_WaitForCommand(Controller
);
6868 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6869 DAC960_V2_ClearCommand(Command
);
6870 Command
->CommandType
= DAC960_ImmediateCommand
;
6871 CommandMailbox
= &Command
->V2
.CommandMailbox
;
6872 memcpy(CommandMailbox
, &UserCommand
.CommandMailbox
,
6873 sizeof(DAC960_V2_CommandMailbox_T
));
6874 CommandMailbox
->Common
.CommandControlBits
6875 .AdditionalScatterGatherListMemory
= false;
6876 CommandMailbox
->Common
.CommandControlBits
6877 .NoAutoRequestSense
= true;
6878 CommandMailbox
->Common
.DataTransferSize
= 0;
6879 CommandMailbox
->Common
.DataTransferPageNumber
= 0;
6880 memset(&CommandMailbox
->Common
.DataTransferMemoryAddress
, 0,
6881 sizeof(DAC960_V2_DataTransferMemoryAddress_T
));
6882 if (DataTransferLength
!= 0)
6884 if (DataTransferLength
> 0)
6886 CommandMailbox
->Common
.CommandControlBits
6887 .DataTransferControllerToHost
= true;
6888 CommandMailbox
->Common
.DataTransferSize
= DataTransferLength
;
6892 CommandMailbox
->Common
.CommandControlBits
6893 .DataTransferControllerToHost
= false;
6894 CommandMailbox
->Common
.DataTransferSize
= -DataTransferLength
;
6896 CommandMailbox
->Common
.DataTransferMemoryAddress
6897 .ScatterGatherSegments
[0]
6898 .SegmentDataPointer
= DataTransferBufferDMA
;
6899 CommandMailbox
->Common
.DataTransferMemoryAddress
6900 .ScatterGatherSegments
[0]
6902 CommandMailbox
->Common
.DataTransferSize
;
6904 if (RequestSenseLength
> 0)
6906 CommandMailbox
->Common
.CommandControlBits
6907 .NoAutoRequestSense
= false;
6908 CommandMailbox
->Common
.RequestSenseSize
= RequestSenseLength
;
6909 CommandMailbox
->Common
.RequestSenseBusAddress
=
6910 RequestSenseBufferDMA
;
6912 DAC960_ExecuteCommand(Command
);
6913 CommandStatus
= Command
->V2
.CommandStatus
;
6914 RequestSenseLength
= Command
->V2
.RequestSenseLength
;
6915 DataTransferResidue
= Command
->V2
.DataTransferResidue
;
6916 spin_lock_irqsave(&Controller
->queue_lock
, flags
);
6917 DAC960_DeallocateCommand(Command
);
6918 spin_unlock_irqrestore(&Controller
->queue_lock
, flags
);
6919 if (RequestSenseLength
> UserCommand
.RequestSenseLength
)
6920 RequestSenseLength
= UserCommand
.RequestSenseLength
;
6921 if (copy_to_user(&UserSpaceUserCommand
->DataTransferLength
,
6922 &DataTransferResidue
,
6923 sizeof(DataTransferResidue
))) {
6924 ErrorCode
= -EFAULT
;
6927 if (copy_to_user(&UserSpaceUserCommand
->RequestSenseLength
,
6928 &RequestSenseLength
, sizeof(RequestSenseLength
))) {
6929 ErrorCode
= -EFAULT
;
6932 if (DataTransferLength
> 0)
6934 if (copy_to_user(UserCommand
.DataTransferBuffer
,
6935 DataTransferBuffer
, DataTransferLength
)) {
6936 ErrorCode
= -EFAULT
;
6940 if (RequestSenseLength
> 0)
6942 if (copy_to_user(UserCommand
.RequestSenseBuffer
,
6943 RequestSenseBuffer
, RequestSenseLength
)) {
6944 ErrorCode
= -EFAULT
;
6948 ErrorCode
= CommandStatus
;
6950 pci_free_consistent(Controller
->PCIDevice
, abs(DataTransferLength
),
6951 DataTransferBuffer
, DataTransferBufferDMA
);
6952 if (RequestSenseBuffer
!= NULL
)
6953 pci_free_consistent(Controller
->PCIDevice
, RequestSenseLength
,
6954 RequestSenseBuffer
, RequestSenseBufferDMA
);
6959 static long DAC960_gam_v2_get_health_status(DAC960_V2_GetHealthStatus_T __user
*UserSpaceGetHealthStatus
)
6961 DAC960_V2_GetHealthStatus_T GetHealthStatus
;
6962 DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer
;
6963 DAC960_Controller_T
*Controller
;
6964 int ControllerNumber
;
6967 if (UserSpaceGetHealthStatus
== NULL
) {
6968 ErrorCode
= -EINVAL
;
6971 if (copy_from_user(&GetHealthStatus
, UserSpaceGetHealthStatus
,
6972 sizeof(DAC960_V2_GetHealthStatus_T
))) {
6973 ErrorCode
= -EFAULT
;
6977 ControllerNumber
= GetHealthStatus
.ControllerNumber
;
6978 if (ControllerNumber
< 0 ||
6979 ControllerNumber
> DAC960_ControllerCount
- 1)
6981 Controller
= DAC960_Controllers
[ControllerNumber
];
6982 if (Controller
== NULL
)
6984 if (Controller
->FirmwareType
!= DAC960_V2_Controller
) {
6985 ErrorCode
= -EINVAL
;
6988 if (copy_from_user(&HealthStatusBuffer
,
6989 GetHealthStatus
.HealthStatusBuffer
,
6990 sizeof(DAC960_V2_HealthStatusBuffer_T
))) {
6991 ErrorCode
= -EFAULT
;
6994 ErrorCode
= wait_event_interruptible_timeout(Controller
->HealthStatusWaitQueue
,
6995 !(Controller
->V2
.HealthStatusBuffer
->StatusChangeCounter
6996 == HealthStatusBuffer
.StatusChangeCounter
&&
6997 Controller
->V2
.HealthStatusBuffer
->NextEventSequenceNumber
6998 == HealthStatusBuffer
.NextEventSequenceNumber
),
6999 DAC960_MonitoringTimerInterval
);
7000 if (ErrorCode
== -ERESTARTSYS
) {
7004 if (copy_to_user(GetHealthStatus
.HealthStatusBuffer
,
7005 Controller
->V2
.HealthStatusBuffer
,
7006 sizeof(DAC960_V2_HealthStatusBuffer_T
)))
7007 ErrorCode
= -EFAULT
;
7016 * DAC960_gam_ioctl is the ioctl function for performing RAID operations.
7019 static long DAC960_gam_ioctl(struct file
*file
, unsigned int Request
,
7020 unsigned long Argument
)
7023 void __user
*argp
= (void __user
*)Argument
;
7024 if (!capable(CAP_SYS_ADMIN
)) return -EACCES
;
7026 mutex_lock(&DAC960_mutex
);
7029 case DAC960_IOCTL_GET_CONTROLLER_COUNT
:
7030 ErrorCode
= DAC960_ControllerCount
;
7032 case DAC960_IOCTL_GET_CONTROLLER_INFO
:
7033 ErrorCode
= DAC960_gam_get_controller_info(argp
);
7035 case DAC960_IOCTL_V1_EXECUTE_COMMAND
:
7036 ErrorCode
= DAC960_gam_v1_execute_command(argp
);
7038 case DAC960_IOCTL_V2_EXECUTE_COMMAND
:
7039 ErrorCode
= DAC960_gam_v2_execute_command(argp
);
7041 case DAC960_IOCTL_V2_GET_HEALTH_STATUS
:
7042 ErrorCode
= DAC960_gam_v2_get_health_status(argp
);
7045 ErrorCode
= -ENOTTY
;
7047 mutex_unlock(&DAC960_mutex
);
7051 static const struct file_operations DAC960_gam_fops
= {
7052 .owner
= THIS_MODULE
,
7053 .unlocked_ioctl
= DAC960_gam_ioctl
,
7054 .llseek
= noop_llseek
,
7057 static struct miscdevice DAC960_gam_dev
= {
7063 static int DAC960_gam_init(void)
7067 ret
= misc_register(&DAC960_gam_dev
);
7069 printk(KERN_ERR
"DAC960_gam: can't misc_register on minor %d\n", DAC960_GAM_MINOR
);
7073 static void DAC960_gam_cleanup(void)
7075 misc_deregister(&DAC960_gam_dev
);
7078 #endif /* DAC960_GAM_MINOR */
7080 static struct DAC960_privdata DAC960_GEM_privdata
= {
7081 .HardwareType
= DAC960_GEM_Controller
,
7082 .FirmwareType
= DAC960_V2_Controller
,
7083 .InterruptHandler
= DAC960_GEM_InterruptHandler
,
7084 .MemoryWindowSize
= DAC960_GEM_RegisterWindowSize
,
7088 static struct DAC960_privdata DAC960_BA_privdata
= {
7089 .HardwareType
= DAC960_BA_Controller
,
7090 .FirmwareType
= DAC960_V2_Controller
,
7091 .InterruptHandler
= DAC960_BA_InterruptHandler
,
7092 .MemoryWindowSize
= DAC960_BA_RegisterWindowSize
,
7095 static struct DAC960_privdata DAC960_LP_privdata
= {
7096 .HardwareType
= DAC960_LP_Controller
,
7097 .FirmwareType
= DAC960_V2_Controller
,
7098 .InterruptHandler
= DAC960_LP_InterruptHandler
,
7099 .MemoryWindowSize
= DAC960_LP_RegisterWindowSize
,
7102 static struct DAC960_privdata DAC960_LA_privdata
= {
7103 .HardwareType
= DAC960_LA_Controller
,
7104 .FirmwareType
= DAC960_V1_Controller
,
7105 .InterruptHandler
= DAC960_LA_InterruptHandler
,
7106 .MemoryWindowSize
= DAC960_LA_RegisterWindowSize
,
7109 static struct DAC960_privdata DAC960_PG_privdata
= {
7110 .HardwareType
= DAC960_PG_Controller
,
7111 .FirmwareType
= DAC960_V1_Controller
,
7112 .InterruptHandler
= DAC960_PG_InterruptHandler
,
7113 .MemoryWindowSize
= DAC960_PG_RegisterWindowSize
,
7116 static struct DAC960_privdata DAC960_PD_privdata
= {
7117 .HardwareType
= DAC960_PD_Controller
,
7118 .FirmwareType
= DAC960_V1_Controller
,
7119 .InterruptHandler
= DAC960_PD_InterruptHandler
,
7120 .MemoryWindowSize
= DAC960_PD_RegisterWindowSize
,
7123 static struct DAC960_privdata DAC960_P_privdata
= {
7124 .HardwareType
= DAC960_P_Controller
,
7125 .FirmwareType
= DAC960_V1_Controller
,
7126 .InterruptHandler
= DAC960_P_InterruptHandler
,
7127 .MemoryWindowSize
= DAC960_PD_RegisterWindowSize
,
7130 static const struct pci_device_id DAC960_id_table
[] = {
7132 .vendor
= PCI_VENDOR_ID_MYLEX
,
7133 .device
= PCI_DEVICE_ID_MYLEX_DAC960_GEM
,
7134 .subvendor
= PCI_VENDOR_ID_MYLEX
,
7135 .subdevice
= PCI_ANY_ID
,
7136 .driver_data
= (unsigned long) &DAC960_GEM_privdata
,
7139 .vendor
= PCI_VENDOR_ID_MYLEX
,
7140 .device
= PCI_DEVICE_ID_MYLEX_DAC960_BA
,
7141 .subvendor
= PCI_ANY_ID
,
7142 .subdevice
= PCI_ANY_ID
,
7143 .driver_data
= (unsigned long) &DAC960_BA_privdata
,
7146 .vendor
= PCI_VENDOR_ID_MYLEX
,
7147 .device
= PCI_DEVICE_ID_MYLEX_DAC960_LP
,
7148 .subvendor
= PCI_ANY_ID
,
7149 .subdevice
= PCI_ANY_ID
,
7150 .driver_data
= (unsigned long) &DAC960_LP_privdata
,
7153 .vendor
= PCI_VENDOR_ID_DEC
,
7154 .device
= PCI_DEVICE_ID_DEC_21285
,
7155 .subvendor
= PCI_VENDOR_ID_MYLEX
,
7156 .subdevice
= PCI_DEVICE_ID_MYLEX_DAC960_LA
,
7157 .driver_data
= (unsigned long) &DAC960_LA_privdata
,
7160 .vendor
= PCI_VENDOR_ID_MYLEX
,
7161 .device
= PCI_DEVICE_ID_MYLEX_DAC960_PG
,
7162 .subvendor
= PCI_ANY_ID
,
7163 .subdevice
= PCI_ANY_ID
,
7164 .driver_data
= (unsigned long) &DAC960_PG_privdata
,
7167 .vendor
= PCI_VENDOR_ID_MYLEX
,
7168 .device
= PCI_DEVICE_ID_MYLEX_DAC960_PD
,
7169 .subvendor
= PCI_ANY_ID
,
7170 .subdevice
= PCI_ANY_ID
,
7171 .driver_data
= (unsigned long) &DAC960_PD_privdata
,
7174 .vendor
= PCI_VENDOR_ID_MYLEX
,
7175 .device
= PCI_DEVICE_ID_MYLEX_DAC960_P
,
7176 .subvendor
= PCI_ANY_ID
,
7177 .subdevice
= PCI_ANY_ID
,
7178 .driver_data
= (unsigned long) &DAC960_P_privdata
,
7183 MODULE_DEVICE_TABLE(pci
, DAC960_id_table
);
7185 static struct pci_driver DAC960_pci_driver
= {
7187 .id_table
= DAC960_id_table
,
7188 .probe
= DAC960_Probe
,
7189 .remove
= DAC960_Remove
,
7192 static int __init
DAC960_init_module(void)
7196 ret
= pci_register_driver(&DAC960_pci_driver
);
7197 #ifdef DAC960_GAM_MINOR
7204 static void __exit
DAC960_cleanup_module(void)
7208 #ifdef DAC960_GAM_MINOR
7209 DAC960_gam_cleanup();
7212 for (i
= 0; i
< DAC960_ControllerCount
; i
++) {
7213 DAC960_Controller_T
*Controller
= DAC960_Controllers
[i
];
7214 if (Controller
== NULL
)
7216 DAC960_FinalizeController(Controller
);
7218 if (DAC960_ProcDirectoryEntry
!= NULL
) {
7219 remove_proc_entry("rd/status", NULL
);
7220 remove_proc_entry("rd", NULL
);
7222 DAC960_ControllerCount
= 0;
7223 pci_unregister_driver(&DAC960_pci_driver
);
7226 module_init(DAC960_init_module
);
7227 module_exit(DAC960_cleanup_module
);
7229 MODULE_LICENSE("GPL");