1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#define DAC960_DriverVersion "2.5.49"
21#define DAC960_DriverDate "21 Aug 2007"
22
23
24#include <linux/module.h>
25#include <linux/types.h>
26#include <linux/miscdevice.h>
27#include <linux/blkdev.h>
28#include <linux/bio.h>
29#include <linux/completion.h>
30#include <linux/delay.h>
31#include <linux/genhd.h>
32#include <linux/hdreg.h>
33#include <linux/blkpg.h>
34#include <linux/dma-mapping.h>
35#include <linux/interrupt.h>
36#include <linux/ioport.h>
37#include <linux/mm.h>
38#include <linux/slab.h>
39#include <linux/smp_lock.h>
40#include <linux/proc_fs.h>
41#include <linux/seq_file.h>
42#include <linux/reboot.h>
43#include <linux/spinlock.h>
44#include <linux/timer.h>
45#include <linux/pci.h>
46#include <linux/init.h>
47#include <linux/jiffies.h>
48#include <linux/random.h>
49#include <linux/scatterlist.h>
50#include <asm/io.h>
51#include <asm/uaccess.h>
52#include "DAC960.h"
53
54#define DAC960_GAM_MINOR 252
55
56
57static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers];
58static int DAC960_ControllerCount;
59static struct proc_dir_entry *DAC960_ProcDirectoryEntry;
60
61static long disk_size(DAC960_Controller_T *p, int drive_nr)
62{
63 if (p->FirmwareType == DAC960_V1_Controller) {
64 if (drive_nr >= p->LogicalDriveCount)
65 return 0;
66 return p->V1.LogicalDriveInformation[drive_nr].
67 LogicalDriveSize;
68 } else {
69 DAC960_V2_LogicalDeviceInfo_T *i =
70 p->V2.LogicalDeviceInformation[drive_nr];
71 if (i == NULL)
72 return 0;
73 return i->ConfigurableDeviceSize;
74 }
75}
76
77static int DAC960_open(struct block_device *bdev, fmode_t mode)
78{
79 struct gendisk *disk = bdev->bd_disk;
80 DAC960_Controller_T *p = disk->queue->queuedata;
81 int drive_nr = (long)disk->private_data;
82
83 if (p->FirmwareType == DAC960_V1_Controller) {
84 if (p->V1.LogicalDriveInformation[drive_nr].
85 LogicalDriveState == DAC960_V1_LogicalDrive_Offline)
86 return -ENXIO;
87 } else {
88 DAC960_V2_LogicalDeviceInfo_T *i =
89 p->V2.LogicalDeviceInformation[drive_nr];
90 if (!i || i->LogicalDeviceState == DAC960_V2_LogicalDevice_Offline)
91 return -ENXIO;
92 }
93
94 check_disk_change(bdev);
95
96 if (!get_capacity(p->disks[drive_nr]))
97 return -ENXIO;
98 return 0;
99}
100
101static int DAC960_getgeo(struct block_device *bdev, struct hd_geometry *geo)
102{
103 struct gendisk *disk = bdev->bd_disk;
104 DAC960_Controller_T *p = disk->queue->queuedata;
105 int drive_nr = (long)disk->private_data;
106
107 if (p->FirmwareType == DAC960_V1_Controller) {
108 geo->heads = p->V1.GeometryTranslationHeads;
109 geo->sectors = p->V1.GeometryTranslationSectors;
110 geo->cylinders = p->V1.LogicalDriveInformation[drive_nr].
111 LogicalDriveSize / (geo->heads * geo->sectors);
112 } else {
113 DAC960_V2_LogicalDeviceInfo_T *i =
114 p->V2.LogicalDeviceInformation[drive_nr];
115 switch (i->DriveGeometry) {
116 case DAC960_V2_Geometry_128_32:
117 geo->heads = 128;
118 geo->sectors = 32;
119 break;
120 case DAC960_V2_Geometry_255_63:
121 geo->heads = 255;
122 geo->sectors = 63;
123 break;
124 default:
125 DAC960_Error("Illegal Logical Device Geometry %d\n",
126 p, i->DriveGeometry);
127 return -EINVAL;
128 }
129
130 geo->cylinders = i->ConfigurableDeviceSize /
131 (geo->heads * geo->sectors);
132 }
133
134 return 0;
135}
136
137static int DAC960_media_changed(struct gendisk *disk)
138{
139 DAC960_Controller_T *p = disk->queue->queuedata;
140 int drive_nr = (long)disk->private_data;
141
142 if (!p->LogicalDriveInitiallyAccessible[drive_nr])
143 return 1;
144 return 0;
145}
146
147static int DAC960_revalidate_disk(struct gendisk *disk)
148{
149 DAC960_Controller_T *p = disk->queue->queuedata;
150 int unit = (long)disk->private_data;
151
152 set_capacity(disk, disk_size(p, unit));
153 return 0;
154}
155
156static const struct block_device_operations DAC960_BlockDeviceOperations = {
157 .owner = THIS_MODULE,
158 .open = DAC960_open,
159 .getgeo = DAC960_getgeo,
160 .media_changed = DAC960_media_changed,
161 .revalidate_disk = DAC960_revalidate_disk,
162};
163
164
165
166
167
168
169
170static void DAC960_AnnounceDriver(DAC960_Controller_T *Controller)
171{
172 DAC960_Announce("***** DAC960 RAID Driver Version "
173 DAC960_DriverVersion " of "
174 DAC960_DriverDate " *****\n", Controller);
175 DAC960_Announce("Copyright 1998-2001 by Leonard N. Zubkoff "
176 "<lnz@dandelion.com>\n", Controller);
177}
178
179
180
181
182
183
184static bool DAC960_Failure(DAC960_Controller_T *Controller,
185 unsigned char *ErrorMessage)
186{
187 DAC960_Error("While configuring DAC960 PCI RAID Controller at\n",
188 Controller);
189 if (Controller->IO_Address == 0)
190 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
191 "PCI Address 0x%X\n", Controller,
192 Controller->Bus, Controller->Device,
193 Controller->Function, Controller->PCI_Address);
194 else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
195 "0x%X PCI Address 0x%X\n", Controller,
196 Controller->Bus, Controller->Device,
197 Controller->Function, Controller->IO_Address,
198 Controller->PCI_Address);
199 DAC960_Error("%s FAILED - DETACHING\n", Controller, ErrorMessage);
200 return false;
201}
202
203
204
205
206
207
208
209
210
211
212
213static bool init_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf,
214 size_t len)
215{
216 void *cpu_addr;
217 dma_addr_t dma_handle;
218
219 cpu_addr = pci_alloc_consistent(dev, len, &dma_handle);
220 if (cpu_addr == NULL)
221 return false;
222
223 loaf->cpu_free = loaf->cpu_base = cpu_addr;
224 loaf->dma_free =loaf->dma_base = dma_handle;
225 loaf->length = len;
226 memset(cpu_addr, 0, len);
227 return true;
228}
229
230static void *slice_dma_loaf(struct dma_loaf *loaf, size_t len,
231 dma_addr_t *dma_handle)
232{
233 void *cpu_end = loaf->cpu_free + len;
234 void *cpu_addr = loaf->cpu_free;
235
236 BUG_ON(cpu_end > loaf->cpu_base + loaf->length);
237 *dma_handle = loaf->dma_free;
238 loaf->cpu_free = cpu_end;
239 loaf->dma_free += len;
240 return cpu_addr;
241}
242
243static void free_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf_handle)
244{
245 if (loaf_handle->cpu_base != NULL)
246 pci_free_consistent(dev, loaf_handle->length,
247 loaf_handle->cpu_base, loaf_handle->dma_base);
248}
249
250
251
252
253
254
255
256
257static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller)
258{
259 int CommandAllocationLength, CommandAllocationGroupSize;
260 int CommandsRemaining = 0, CommandIdentifier, CommandGroupByteCount;
261 void *AllocationPointer = NULL;
262 void *ScatterGatherCPU = NULL;
263 dma_addr_t ScatterGatherDMA;
264 struct pci_pool *ScatterGatherPool;
265 void *RequestSenseCPU = NULL;
266 dma_addr_t RequestSenseDMA;
267 struct pci_pool *RequestSensePool = NULL;
268
269 if (Controller->FirmwareType == DAC960_V1_Controller)
270 {
271 CommandAllocationLength = offsetof(DAC960_Command_T, V1.EndMarker);
272 CommandAllocationGroupSize = DAC960_V1_CommandAllocationGroupSize;
273 ScatterGatherPool = pci_pool_create("DAC960_V1_ScatterGather",
274 Controller->PCIDevice,
275 DAC960_V1_ScatterGatherLimit * sizeof(DAC960_V1_ScatterGatherSegment_T),
276 sizeof(DAC960_V1_ScatterGatherSegment_T), 0);
277 if (ScatterGatherPool == NULL)
278 return DAC960_Failure(Controller,
279 "AUXILIARY STRUCTURE CREATION (SG)");
280 Controller->ScatterGatherPool = ScatterGatherPool;
281 }
282 else
283 {
284 CommandAllocationLength = offsetof(DAC960_Command_T, V2.EndMarker);
285 CommandAllocationGroupSize = DAC960_V2_CommandAllocationGroupSize;
286 ScatterGatherPool = pci_pool_create("DAC960_V2_ScatterGather",
287 Controller->PCIDevice,
288 DAC960_V2_ScatterGatherLimit * sizeof(DAC960_V2_ScatterGatherSegment_T),
289 sizeof(DAC960_V2_ScatterGatherSegment_T), 0);
290 if (ScatterGatherPool == NULL)
291 return DAC960_Failure(Controller,
292 "AUXILIARY STRUCTURE CREATION (SG)");
293 RequestSensePool = pci_pool_create("DAC960_V2_RequestSense",
294 Controller->PCIDevice, sizeof(DAC960_SCSI_RequestSense_T),
295 sizeof(int), 0);
296 if (RequestSensePool == NULL) {
297 pci_pool_destroy(ScatterGatherPool);
298 return DAC960_Failure(Controller,
299 "AUXILIARY STRUCTURE CREATION (SG)");
300 }
301 Controller->ScatterGatherPool = ScatterGatherPool;
302 Controller->V2.RequestSensePool = RequestSensePool;
303 }
304 Controller->CommandAllocationGroupSize = CommandAllocationGroupSize;
305 Controller->FreeCommands = NULL;
306 for (CommandIdentifier = 1;
307 CommandIdentifier <= Controller->DriverQueueDepth;
308 CommandIdentifier++)
309 {
310 DAC960_Command_T *Command;
311 if (--CommandsRemaining <= 0)
312 {
313 CommandsRemaining =
314 Controller->DriverQueueDepth - CommandIdentifier + 1;
315 if (CommandsRemaining > CommandAllocationGroupSize)
316 CommandsRemaining = CommandAllocationGroupSize;
317 CommandGroupByteCount =
318 CommandsRemaining * CommandAllocationLength;
319 AllocationPointer = kzalloc(CommandGroupByteCount, GFP_ATOMIC);
320 if (AllocationPointer == NULL)
321 return DAC960_Failure(Controller,
322 "AUXILIARY STRUCTURE CREATION");
323 }
324 Command = (DAC960_Command_T *) AllocationPointer;
325 AllocationPointer += CommandAllocationLength;
326 Command->CommandIdentifier = CommandIdentifier;
327 Command->Controller = Controller;
328 Command->Next = Controller->FreeCommands;
329 Controller->FreeCommands = Command;
330 Controller->Commands[CommandIdentifier-1] = Command;
331 ScatterGatherCPU = pci_pool_alloc(ScatterGatherPool, GFP_ATOMIC,
332 &ScatterGatherDMA);
333 if (ScatterGatherCPU == NULL)
334 return DAC960_Failure(Controller, "AUXILIARY STRUCTURE CREATION");
335
336 if (RequestSensePool != NULL) {
337 RequestSenseCPU = pci_pool_alloc(RequestSensePool, GFP_ATOMIC,
338 &RequestSenseDMA);
339 if (RequestSenseCPU == NULL) {
340 pci_pool_free(ScatterGatherPool, ScatterGatherCPU,
341 ScatterGatherDMA);
342 return DAC960_Failure(Controller,
343 "AUXILIARY STRUCTURE CREATION");
344 }
345 }
346 if (Controller->FirmwareType == DAC960_V1_Controller) {
347 Command->cmd_sglist = Command->V1.ScatterList;
348 Command->V1.ScatterGatherList =
349 (DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU;
350 Command->V1.ScatterGatherListDMA = ScatterGatherDMA;
351 sg_init_table(Command->cmd_sglist, DAC960_V1_ScatterGatherLimit);
352 } else {
353 Command->cmd_sglist = Command->V2.ScatterList;
354 Command->V2.ScatterGatherList =
355 (DAC960_V2_ScatterGatherSegment_T *)ScatterGatherCPU;
356 Command->V2.ScatterGatherListDMA = ScatterGatherDMA;
357 Command->V2.RequestSense =
358 (DAC960_SCSI_RequestSense_T *)RequestSenseCPU;
359 Command->V2.RequestSenseDMA = RequestSenseDMA;
360 sg_init_table(Command->cmd_sglist, DAC960_V2_ScatterGatherLimit);
361 }
362 }
363 return true;
364}
365
366
367
368
369
370
371
372static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T *Controller)
373{
374 int i;
375 struct pci_pool *ScatterGatherPool = Controller->ScatterGatherPool;
376 struct pci_pool *RequestSensePool = NULL;
377 void *ScatterGatherCPU;
378 dma_addr_t ScatterGatherDMA;
379 void *RequestSenseCPU;
380 dma_addr_t RequestSenseDMA;
381 DAC960_Command_T *CommandGroup = NULL;
382
383
384 if (Controller->FirmwareType == DAC960_V2_Controller)
385 RequestSensePool = Controller->V2.RequestSensePool;
386
387 Controller->FreeCommands = NULL;
388 for (i = 0; i < Controller->DriverQueueDepth; i++)
389 {
390 DAC960_Command_T *Command = Controller->Commands[i];
391
392 if (Command == NULL)
393 continue;
394
395 if (Controller->FirmwareType == DAC960_V1_Controller) {
396 ScatterGatherCPU = (void *)Command->V1.ScatterGatherList;
397 ScatterGatherDMA = Command->V1.ScatterGatherListDMA;
398 RequestSenseCPU = NULL;
399 RequestSenseDMA = (dma_addr_t)0;
400 } else {
401 ScatterGatherCPU = (void *)Command->V2.ScatterGatherList;
402 ScatterGatherDMA = Command->V2.ScatterGatherListDMA;
403 RequestSenseCPU = (void *)Command->V2.RequestSense;
404 RequestSenseDMA = Command->V2.RequestSenseDMA;
405 }
406 if (ScatterGatherCPU != NULL)
407 pci_pool_free(ScatterGatherPool, ScatterGatherCPU, ScatterGatherDMA);
408 if (RequestSenseCPU != NULL)
409 pci_pool_free(RequestSensePool, RequestSenseCPU, RequestSenseDMA);
410
411 if ((Command->CommandIdentifier
412 % Controller->CommandAllocationGroupSize) == 1) {
413
414
415
416
417
418
419 kfree(CommandGroup);
420 CommandGroup = Command;
421 }
422 Controller->Commands[i] = NULL;
423 }
424 kfree(CommandGroup);
425
426 if (Controller->CombinedStatusBuffer != NULL)
427 {
428 kfree(Controller->CombinedStatusBuffer);
429 Controller->CombinedStatusBuffer = NULL;
430 Controller->CurrentStatusBuffer = NULL;
431 }
432
433 if (ScatterGatherPool != NULL)
434 pci_pool_destroy(ScatterGatherPool);
435 if (Controller->FirmwareType == DAC960_V1_Controller)
436 return;
437
438 if (RequestSensePool != NULL)
439 pci_pool_destroy(RequestSensePool);
440
441 for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
442 kfree(Controller->V2.LogicalDeviceInformation[i]);
443 Controller->V2.LogicalDeviceInformation[i] = NULL;
444 }
445
446 for (i = 0; i < DAC960_V2_MaxPhysicalDevices; i++)
447 {
448 kfree(Controller->V2.PhysicalDeviceInformation[i]);
449 Controller->V2.PhysicalDeviceInformation[i] = NULL;
450 kfree(Controller->V2.InquiryUnitSerialNumber[i]);
451 Controller->V2.InquiryUnitSerialNumber[i] = NULL;
452 }
453}
454
455
456
457
458
459
460
461static inline void DAC960_V1_ClearCommand(DAC960_Command_T *Command)
462{
463 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
464 memset(CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
465 Command->V1.CommandStatus = 0;
466}
467
468
469
470
471
472
473
474static inline void DAC960_V2_ClearCommand(DAC960_Command_T *Command)
475{
476 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
477 memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
478 Command->V2.CommandStatus = 0;
479}
480
481
482
483
484
485
486
487
488
489static inline DAC960_Command_T *DAC960_AllocateCommand(DAC960_Controller_T
490 *Controller)
491{
492 DAC960_Command_T *Command = Controller->FreeCommands;
493 if (Command == NULL) return NULL;
494 Controller->FreeCommands = Command->Next;
495 Command->Next = NULL;
496 return Command;
497}
498
499
500
501
502
503
504
505static inline void DAC960_DeallocateCommand(DAC960_Command_T *Command)
506{
507 DAC960_Controller_T *Controller = Command->Controller;
508
509 Command->Request = NULL;
510 Command->Next = Controller->FreeCommands;
511 Controller->FreeCommands = Command;
512}
513
514
515
516
517
518
519static void DAC960_WaitForCommand(DAC960_Controller_T *Controller)
520{
521 spin_unlock_irq(&Controller->queue_lock);
522 __wait_event(Controller->CommandWaitQueue, Controller->FreeCommands);
523 spin_lock_irq(&Controller->queue_lock);
524}
525
526
527
528
529
530static void DAC960_GEM_QueueCommand(DAC960_Command_T *Command)
531{
532 DAC960_Controller_T *Controller = Command->Controller;
533 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
534 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
535 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
536 Controller->V2.NextCommandMailbox;
537
538 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
539 DAC960_GEM_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
540
541 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
542 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
543 DAC960_GEM_MemoryMailboxNewCommand(ControllerBaseAddress);
544
545 Controller->V2.PreviousCommandMailbox2 =
546 Controller->V2.PreviousCommandMailbox1;
547 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
548
549 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
550 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
551
552 Controller->V2.NextCommandMailbox = NextCommandMailbox;
553}
554
555
556
557
558
559static void DAC960_BA_QueueCommand(DAC960_Command_T *Command)
560{
561 DAC960_Controller_T *Controller = Command->Controller;
562 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
563 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
564 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
565 Controller->V2.NextCommandMailbox;
566 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
567 DAC960_BA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
568 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
569 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
570 DAC960_BA_MemoryMailboxNewCommand(ControllerBaseAddress);
571 Controller->V2.PreviousCommandMailbox2 =
572 Controller->V2.PreviousCommandMailbox1;
573 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
574 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
575 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
576 Controller->V2.NextCommandMailbox = NextCommandMailbox;
577}
578
579
580
581
582
583
584static void DAC960_LP_QueueCommand(DAC960_Command_T *Command)
585{
586 DAC960_Controller_T *Controller = Command->Controller;
587 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
588 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
589 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
590 Controller->V2.NextCommandMailbox;
591 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
592 DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
593 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
594 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
595 DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress);
596 Controller->V2.PreviousCommandMailbox2 =
597 Controller->V2.PreviousCommandMailbox1;
598 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
599 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
600 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
601 Controller->V2.NextCommandMailbox = NextCommandMailbox;
602}
603
604
605
606
607
608
609
610static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command)
611{
612 DAC960_Controller_T *Controller = Command->Controller;
613 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
614 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
615 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
616 Controller->V1.NextCommandMailbox;
617 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
618 DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
619 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
620 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
621 DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress);
622 Controller->V1.PreviousCommandMailbox2 =
623 Controller->V1.PreviousCommandMailbox1;
624 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
625 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
626 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
627 Controller->V1.NextCommandMailbox = NextCommandMailbox;
628}
629
630
631
632
633
634
635
636static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command)
637{
638 DAC960_Controller_T *Controller = Command->Controller;
639 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
640 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
641 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
642 Controller->V1.NextCommandMailbox;
643 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
644 DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
645 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
646 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
647 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
648 Controller->V1.PreviousCommandMailbox2 =
649 Controller->V1.PreviousCommandMailbox1;
650 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
651 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
652 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
653 Controller->V1.NextCommandMailbox = NextCommandMailbox;
654}
655
656
657
658
659
660
661
662static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command)
663{
664 DAC960_Controller_T *Controller = Command->Controller;
665 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
666 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
667 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
668 Controller->V1.NextCommandMailbox;
669 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
670 DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
671 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
672 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
673 DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress);
674 Controller->V1.PreviousCommandMailbox2 =
675 Controller->V1.PreviousCommandMailbox1;
676 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
677 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
678 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
679 Controller->V1.NextCommandMailbox = NextCommandMailbox;
680}
681
682
683
684
685
686
687
688static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command)
689{
690 DAC960_Controller_T *Controller = Command->Controller;
691 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
692 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
693 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
694 Controller->V1.NextCommandMailbox;
695 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
696 DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
697 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
698 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
699 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
700 Controller->V1.PreviousCommandMailbox2 =
701 Controller->V1.PreviousCommandMailbox1;
702 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
703 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
704 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
705 Controller->V1.NextCommandMailbox = NextCommandMailbox;
706}
707
708
709
710
711
712
713static void DAC960_PD_QueueCommand(DAC960_Command_T *Command)
714{
715 DAC960_Controller_T *Controller = Command->Controller;
716 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
717 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
718 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
719 while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
720 udelay(1);
721 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
722 DAC960_PD_NewCommand(ControllerBaseAddress);
723}
724
725
726
727
728
729
730static void DAC960_P_QueueCommand(DAC960_Command_T *Command)
731{
732 DAC960_Controller_T *Controller = Command->Controller;
733 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
734 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
735 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
736 switch (CommandMailbox->Common.CommandOpcode)
737 {
738 case DAC960_V1_Enquiry:
739 CommandMailbox->Common.CommandOpcode = DAC960_V1_Enquiry_Old;
740 break;
741 case DAC960_V1_GetDeviceState:
742 CommandMailbox->Common.CommandOpcode = DAC960_V1_GetDeviceState_Old;
743 break;
744 case DAC960_V1_Read:
745 CommandMailbox->Common.CommandOpcode = DAC960_V1_Read_Old;
746 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
747 break;
748 case DAC960_V1_Write:
749 CommandMailbox->Common.CommandOpcode = DAC960_V1_Write_Old;
750 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
751 break;
752 case DAC960_V1_ReadWithScatterGather:
753 CommandMailbox->Common.CommandOpcode =
754 DAC960_V1_ReadWithScatterGather_Old;
755 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
756 break;
757 case DAC960_V1_WriteWithScatterGather:
758 CommandMailbox->Common.CommandOpcode =
759 DAC960_V1_WriteWithScatterGather_Old;
760 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
761 break;
762 default:
763 break;
764 }
765 while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
766 udelay(1);
767 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
768 DAC960_PD_NewCommand(ControllerBaseAddress);
769}
770
771
772
773
774
775
776static void DAC960_ExecuteCommand(DAC960_Command_T *Command)
777{
778 DAC960_Controller_T *Controller = Command->Controller;
779 DECLARE_COMPLETION_ONSTACK(Completion);
780 unsigned long flags;
781 Command->Completion = &Completion;
782
783 spin_lock_irqsave(&Controller->queue_lock, flags);
784 DAC960_QueueCommand(Command);
785 spin_unlock_irqrestore(&Controller->queue_lock, flags);
786
787 if (in_interrupt())
788 return;
789 wait_for_completion(&Completion);
790}
791
792
793
794
795
796
797
798
799static bool DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
800 DAC960_V1_CommandOpcode_T CommandOpcode,
801 dma_addr_t DataDMA)
802{
803 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
804 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
805 DAC960_V1_CommandStatus_T CommandStatus;
806 DAC960_V1_ClearCommand(Command);
807 Command->CommandType = DAC960_ImmediateCommand;
808 CommandMailbox->Type3.CommandOpcode = CommandOpcode;
809 CommandMailbox->Type3.BusAddress = DataDMA;
810 DAC960_ExecuteCommand(Command);
811 CommandStatus = Command->V1.CommandStatus;
812 DAC960_DeallocateCommand(Command);
813 return (CommandStatus == DAC960_V1_NormalCompletion);
814}
815
816
817
818
819
820
821
822
823static bool DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
824 DAC960_V1_CommandOpcode_T CommandOpcode,
825 unsigned char CommandOpcode2,
826 dma_addr_t DataDMA)
827{
828 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
829 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
830 DAC960_V1_CommandStatus_T CommandStatus;
831 DAC960_V1_ClearCommand(Command);
832 Command->CommandType = DAC960_ImmediateCommand;
833 CommandMailbox->Type3B.CommandOpcode = CommandOpcode;
834 CommandMailbox->Type3B.CommandOpcode2 = CommandOpcode2;
835 CommandMailbox->Type3B.BusAddress = DataDMA;
836 DAC960_ExecuteCommand(Command);
837 CommandStatus = Command->V1.CommandStatus;
838 DAC960_DeallocateCommand(Command);
839 return (CommandStatus == DAC960_V1_NormalCompletion);
840}
841
842
843
844
845
846
847
848
849static bool DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
850 DAC960_V1_CommandOpcode_T CommandOpcode,
851 unsigned char Channel,
852 unsigned char TargetID,
853 dma_addr_t DataDMA)
854{
855 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
856 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
857 DAC960_V1_CommandStatus_T CommandStatus;
858 DAC960_V1_ClearCommand(Command);
859 Command->CommandType = DAC960_ImmediateCommand;
860 CommandMailbox->Type3D.CommandOpcode = CommandOpcode;
861 CommandMailbox->Type3D.Channel = Channel;
862 CommandMailbox->Type3D.TargetID = TargetID;
863 CommandMailbox->Type3D.BusAddress = DataDMA;
864 DAC960_ExecuteCommand(Command);
865 CommandStatus = Command->V1.CommandStatus;
866 DAC960_DeallocateCommand(Command);
867 return (CommandStatus == DAC960_V1_NormalCompletion);
868}
869
870
871
872
873
874
875
876
877
878
879static bool DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
880{
881 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
882 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
883 DAC960_V2_CommandStatus_T CommandStatus;
884 DAC960_V2_ClearCommand(Command);
885 Command->CommandType = DAC960_ImmediateCommand;
886 CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL;
887 CommandMailbox->Common.CommandControlBits
888 .DataTransferControllerToHost = true;
889 CommandMailbox->Common.CommandControlBits
890 .NoAutoRequestSense = true;
891 CommandMailbox->Common.DataTransferSize = sizeof(DAC960_V2_HealthStatusBuffer_T);
892 CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_GetHealthStatus;
893 CommandMailbox->Common.DataTransferMemoryAddress
894 .ScatterGatherSegments[0]
895 .SegmentDataPointer =
896 Controller->V2.HealthStatusBufferDMA;
897 CommandMailbox->Common.DataTransferMemoryAddress
898 .ScatterGatherSegments[0]
899 .SegmentByteCount =
900 CommandMailbox->Common.DataTransferSize;
901 DAC960_ExecuteCommand(Command);
902 CommandStatus = Command->V2.CommandStatus;
903 DAC960_DeallocateCommand(Command);
904 return (CommandStatus == DAC960_V2_NormalCompletion);
905}
906
907
908
909
910
911
912
913
914
915
916
917static bool DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
918{
919 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
920 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
921 DAC960_V2_CommandStatus_T CommandStatus;
922 DAC960_V2_ClearCommand(Command);
923 Command->CommandType = DAC960_ImmediateCommand;
924 CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
925 CommandMailbox->ControllerInfo.CommandControlBits
926 .DataTransferControllerToHost = true;
927 CommandMailbox->ControllerInfo.CommandControlBits
928 .NoAutoRequestSense = true;
929 CommandMailbox->ControllerInfo.DataTransferSize = sizeof(DAC960_V2_ControllerInfo_T);
930 CommandMailbox->ControllerInfo.ControllerNumber = 0;
931 CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo;
932 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
933 .ScatterGatherSegments[0]
934 .SegmentDataPointer =
935 Controller->V2.NewControllerInformationDMA;
936 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
937 .ScatterGatherSegments[0]
938 .SegmentByteCount =
939 CommandMailbox->ControllerInfo.DataTransferSize;
940 DAC960_ExecuteCommand(Command);
941 CommandStatus = Command->V2.CommandStatus;
942 DAC960_DeallocateCommand(Command);
943 return (CommandStatus == DAC960_V2_NormalCompletion);
944}
945
946
947
948
949
950
951
952
953
954
955static bool DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
956 unsigned short LogicalDeviceNumber)
957{
958 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
959 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
960 DAC960_V2_CommandStatus_T CommandStatus;
961
962 DAC960_V2_ClearCommand(Command);
963 Command->CommandType = DAC960_ImmediateCommand;
964 CommandMailbox->LogicalDeviceInfo.CommandOpcode =
965 DAC960_V2_IOCTL;
966 CommandMailbox->LogicalDeviceInfo.CommandControlBits
967 .DataTransferControllerToHost = true;
968 CommandMailbox->LogicalDeviceInfo.CommandControlBits
969 .NoAutoRequestSense = true;
970 CommandMailbox->LogicalDeviceInfo.DataTransferSize =
971 sizeof(DAC960_V2_LogicalDeviceInfo_T);
972 CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
973 LogicalDeviceNumber;
974 CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = DAC960_V2_GetLogicalDeviceInfoValid;
975 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
976 .ScatterGatherSegments[0]
977 .SegmentDataPointer =
978 Controller->V2.NewLogicalDeviceInformationDMA;
979 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
980 .ScatterGatherSegments[0]
981 .SegmentByteCount =
982 CommandMailbox->LogicalDeviceInfo.DataTransferSize;
983 DAC960_ExecuteCommand(Command);
984 CommandStatus = Command->V2.CommandStatus;
985 DAC960_DeallocateCommand(Command);
986 return (CommandStatus == DAC960_V2_NormalCompletion);
987}
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006static bool DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller,
1007 unsigned char Channel,
1008 unsigned char TargetID,
1009 unsigned char LogicalUnit)
1010{
1011 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1012 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1013 DAC960_V2_CommandStatus_T CommandStatus;
1014
1015 DAC960_V2_ClearCommand(Command);
1016 Command->CommandType = DAC960_ImmediateCommand;
1017 CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
1018 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1019 .DataTransferControllerToHost = true;
1020 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1021 .NoAutoRequestSense = true;
1022 CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
1023 sizeof(DAC960_V2_PhysicalDeviceInfo_T);
1024 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = LogicalUnit;
1025 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID;
1026 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel;
1027 CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
1028 DAC960_V2_GetPhysicalDeviceInfoValid;
1029 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1030 .ScatterGatherSegments[0]
1031 .SegmentDataPointer =
1032 Controller->V2.NewPhysicalDeviceInformationDMA;
1033 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1034 .ScatterGatherSegments[0]
1035 .SegmentByteCount =
1036 CommandMailbox->PhysicalDeviceInfo.DataTransferSize;
1037 DAC960_ExecuteCommand(Command);
1038 CommandStatus = Command->V2.CommandStatus;
1039 DAC960_DeallocateCommand(Command);
1040 return (CommandStatus == DAC960_V2_NormalCompletion);
1041}
1042
1043
1044static void DAC960_V2_ConstructNewUnitSerialNumber(
1045 DAC960_Controller_T *Controller,
1046 DAC960_V2_CommandMailbox_T *CommandMailbox, int Channel, int TargetID,
1047 int LogicalUnit)
1048{
1049 CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru;
1050 CommandMailbox->SCSI_10.CommandControlBits
1051 .DataTransferControllerToHost = true;
1052 CommandMailbox->SCSI_10.CommandControlBits
1053 .NoAutoRequestSense = true;
1054 CommandMailbox->SCSI_10.DataTransferSize =
1055 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1056 CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit;
1057 CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID;
1058 CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel;
1059 CommandMailbox->SCSI_10.CDBLength = 6;
1060 CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12;
1061 CommandMailbox->SCSI_10.SCSI_CDB[1] = 1;
1062 CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80;
1063 CommandMailbox->SCSI_10.SCSI_CDB[3] = 0;
1064 CommandMailbox->SCSI_10.SCSI_CDB[4] =
1065 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1066 CommandMailbox->SCSI_10.SCSI_CDB[5] = 0;
1067 CommandMailbox->SCSI_10.DataTransferMemoryAddress
1068 .ScatterGatherSegments[0]
1069 .SegmentDataPointer =
1070 Controller->V2.NewInquiryUnitSerialNumberDMA;
1071 CommandMailbox->SCSI_10.DataTransferMemoryAddress
1072 .ScatterGatherSegments[0]
1073 .SegmentByteCount =
1074 CommandMailbox->SCSI_10.DataTransferSize;
1075}
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091static bool DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Controller,
1092 int Channel, int TargetID, int LogicalUnit)
1093{
1094 DAC960_Command_T *Command;
1095 DAC960_V2_CommandMailbox_T *CommandMailbox;
1096 DAC960_V2_CommandStatus_T CommandStatus;
1097
1098 Command = DAC960_AllocateCommand(Controller);
1099 CommandMailbox = &Command->V2.CommandMailbox;
1100 DAC960_V2_ClearCommand(Command);
1101 Command->CommandType = DAC960_ImmediateCommand;
1102
1103 DAC960_V2_ConstructNewUnitSerialNumber(Controller, CommandMailbox,
1104 Channel, TargetID, LogicalUnit);
1105
1106 DAC960_ExecuteCommand(Command);
1107 CommandStatus = Command->V2.CommandStatus;
1108 DAC960_DeallocateCommand(Command);
1109 return (CommandStatus == DAC960_V2_NormalCompletion);
1110}
1111
1112
1113
1114
1115
1116
1117
1118
1119static bool DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
1120 DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode,
1121 DAC960_V2_OperationDevice_T
1122 OperationDevice)
1123{
1124 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1125 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1126 DAC960_V2_CommandStatus_T CommandStatus;
1127 DAC960_V2_ClearCommand(Command);
1128 Command->CommandType = DAC960_ImmediateCommand;
1129 CommandMailbox->DeviceOperation.CommandOpcode = DAC960_V2_IOCTL;
1130 CommandMailbox->DeviceOperation.CommandControlBits
1131 .DataTransferControllerToHost = true;
1132 CommandMailbox->DeviceOperation.CommandControlBits
1133 .NoAutoRequestSense = true;
1134 CommandMailbox->DeviceOperation.IOCTL_Opcode = IOCTL_Opcode;
1135 CommandMailbox->DeviceOperation.OperationDevice = OperationDevice;
1136 DAC960_ExecuteCommand(Command);
1137 CommandStatus = Command->V2.CommandStatus;
1138 DAC960_DeallocateCommand(Command);
1139 return (CommandStatus == DAC960_V2_NormalCompletion);
1140}
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
1152 *Controller)
1153{
1154 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1155 DAC960_HardwareType_T hw_type = Controller->HardwareType;
1156 struct pci_dev *PCI_Device = Controller->PCIDevice;
1157 struct dma_loaf *DmaPages = &Controller->DmaPages;
1158 size_t DmaPagesSize;
1159 size_t CommandMailboxesSize;
1160 size_t StatusMailboxesSize;
1161
1162 DAC960_V1_CommandMailbox_T *CommandMailboxesMemory;
1163 dma_addr_t CommandMailboxesMemoryDMA;
1164
1165 DAC960_V1_StatusMailbox_T *StatusMailboxesMemory;
1166 dma_addr_t StatusMailboxesMemoryDMA;
1167
1168 DAC960_V1_CommandMailbox_T CommandMailbox;
1169 DAC960_V1_CommandStatus_T CommandStatus;
1170 int TimeoutCounter;
1171 int i;
1172
1173
1174 if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1175 return DAC960_Failure(Controller, "DMA mask out of range");
1176 Controller->BounceBufferLimit = DMA_BIT_MASK(32);
1177
1178 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) {
1179 CommandMailboxesSize = 0;
1180 StatusMailboxesSize = 0;
1181 } else {
1182 CommandMailboxesSize = DAC960_V1_CommandMailboxCount * sizeof(DAC960_V1_CommandMailbox_T);
1183 StatusMailboxesSize = DAC960_V1_StatusMailboxCount * sizeof(DAC960_V1_StatusMailbox_T);
1184 }
1185 DmaPagesSize = CommandMailboxesSize + StatusMailboxesSize +
1186 sizeof(DAC960_V1_DCDB_T) + sizeof(DAC960_V1_Enquiry_T) +
1187 sizeof(DAC960_V1_ErrorTable_T) + sizeof(DAC960_V1_EventLogEntry_T) +
1188 sizeof(DAC960_V1_RebuildProgress_T) +
1189 sizeof(DAC960_V1_LogicalDriveInformationArray_T) +
1190 sizeof(DAC960_V1_BackgroundInitializationStatus_T) +
1191 sizeof(DAC960_V1_DeviceState_T) + sizeof(DAC960_SCSI_Inquiry_T) +
1192 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1193
1194 if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize))
1195 return false;
1196
1197
1198 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller))
1199 goto skip_mailboxes;
1200
1201 CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1202 CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1203
1204
1205 Controller->V1.FirstCommandMailbox = CommandMailboxesMemory;
1206 Controller->V1.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1207
1208 CommandMailboxesMemory += DAC960_V1_CommandMailboxCount - 1;
1209 Controller->V1.LastCommandMailbox = CommandMailboxesMemory;
1210 Controller->V1.NextCommandMailbox = Controller->V1.FirstCommandMailbox;
1211 Controller->V1.PreviousCommandMailbox1 = Controller->V1.LastCommandMailbox;
1212 Controller->V1.PreviousCommandMailbox2 =
1213 Controller->V1.LastCommandMailbox - 1;
1214
1215
1216 StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1217 StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1218
1219 Controller->V1.FirstStatusMailbox = StatusMailboxesMemory;
1220 Controller->V1.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1221 StatusMailboxesMemory += DAC960_V1_StatusMailboxCount - 1;
1222 Controller->V1.LastStatusMailbox = StatusMailboxesMemory;
1223 Controller->V1.NextStatusMailbox = Controller->V1.FirstStatusMailbox;
1224
1225skip_mailboxes:
1226 Controller->V1.MonitoringDCDB = slice_dma_loaf(DmaPages,
1227 sizeof(DAC960_V1_DCDB_T),
1228 &Controller->V1.MonitoringDCDB_DMA);
1229
1230 Controller->V1.NewEnquiry = slice_dma_loaf(DmaPages,
1231 sizeof(DAC960_V1_Enquiry_T),
1232 &Controller->V1.NewEnquiryDMA);
1233
1234 Controller->V1.NewErrorTable = slice_dma_loaf(DmaPages,
1235 sizeof(DAC960_V1_ErrorTable_T),
1236 &Controller->V1.NewErrorTableDMA);
1237
1238 Controller->V1.EventLogEntry = slice_dma_loaf(DmaPages,
1239 sizeof(DAC960_V1_EventLogEntry_T),
1240 &Controller->V1.EventLogEntryDMA);
1241
1242 Controller->V1.RebuildProgress = slice_dma_loaf(DmaPages,
1243 sizeof(DAC960_V1_RebuildProgress_T),
1244 &Controller->V1.RebuildProgressDMA);
1245
1246 Controller->V1.NewLogicalDriveInformation = slice_dma_loaf(DmaPages,
1247 sizeof(DAC960_V1_LogicalDriveInformationArray_T),
1248 &Controller->V1.NewLogicalDriveInformationDMA);
1249
1250 Controller->V1.BackgroundInitializationStatus = slice_dma_loaf(DmaPages,
1251 sizeof(DAC960_V1_BackgroundInitializationStatus_T),
1252 &Controller->V1.BackgroundInitializationStatusDMA);
1253
1254 Controller->V1.NewDeviceState = slice_dma_loaf(DmaPages,
1255 sizeof(DAC960_V1_DeviceState_T),
1256 &Controller->V1.NewDeviceStateDMA);
1257
1258 Controller->V1.NewInquiryStandardData = slice_dma_loaf(DmaPages,
1259 sizeof(DAC960_SCSI_Inquiry_T),
1260 &Controller->V1.NewInquiryStandardDataDMA);
1261
1262 Controller->V1.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1263 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1264 &Controller->V1.NewInquiryUnitSerialNumberDMA);
1265
1266 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller))
1267 return true;
1268
1269
1270 Controller->V1.DualModeMemoryMailboxInterface = true;
1271 CommandMailbox.TypeX.CommandOpcode = 0x2B;
1272 CommandMailbox.TypeX.CommandIdentifier = 0;
1273 CommandMailbox.TypeX.CommandOpcode2 = 0x14;
1274 CommandMailbox.TypeX.CommandMailboxesBusAddress =
1275 Controller->V1.FirstCommandMailboxDMA;
1276 CommandMailbox.TypeX.StatusMailboxesBusAddress =
1277 Controller->V1.FirstStatusMailboxDMA;
1278#define TIMEOUT_COUNT 1000000
1279
1280 for (i = 0; i < 2; i++)
1281 switch (Controller->HardwareType)
1282 {
1283 case DAC960_LA_Controller:
1284 TimeoutCounter = TIMEOUT_COUNT;
1285 while (--TimeoutCounter >= 0)
1286 {
1287 if (!DAC960_LA_HardwareMailboxFullP(ControllerBaseAddress))
1288 break;
1289 udelay(10);
1290 }
1291 if (TimeoutCounter < 0) return false;
1292 DAC960_LA_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1293 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
1294 TimeoutCounter = TIMEOUT_COUNT;
1295 while (--TimeoutCounter >= 0)
1296 {
1297 if (DAC960_LA_HardwareMailboxStatusAvailableP(
1298 ControllerBaseAddress))
1299 break;
1300 udelay(10);
1301 }
1302 if (TimeoutCounter < 0) return false;
1303 CommandStatus = DAC960_LA_ReadStatusRegister(ControllerBaseAddress);
1304 DAC960_LA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1305 DAC960_LA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1306 if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1307 Controller->V1.DualModeMemoryMailboxInterface = false;
1308 CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1309 break;
1310 case DAC960_PG_Controller:
1311 TimeoutCounter = TIMEOUT_COUNT;
1312 while (--TimeoutCounter >= 0)
1313 {
1314 if (!DAC960_PG_HardwareMailboxFullP(ControllerBaseAddress))
1315 break;
1316 udelay(10);
1317 }
1318 if (TimeoutCounter < 0) return false;
1319 DAC960_PG_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1320 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
1321
1322 TimeoutCounter = TIMEOUT_COUNT;
1323 while (--TimeoutCounter >= 0)
1324 {
1325 if (DAC960_PG_HardwareMailboxStatusAvailableP(
1326 ControllerBaseAddress))
1327 break;
1328 udelay(10);
1329 }
1330 if (TimeoutCounter < 0) return false;
1331 CommandStatus = DAC960_PG_ReadStatusRegister(ControllerBaseAddress);
1332 DAC960_PG_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1333 DAC960_PG_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1334 if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1335 Controller->V1.DualModeMemoryMailboxInterface = false;
1336 CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1337 break;
1338 default:
1339 DAC960_Failure(Controller, "Unknown Controller Type\n");
1340 break;
1341 }
1342 return false;
1343}
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
1358 *Controller)
1359{
1360 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1361 struct pci_dev *PCI_Device = Controller->PCIDevice;
1362 struct dma_loaf *DmaPages = &Controller->DmaPages;
1363 size_t DmaPagesSize;
1364 size_t CommandMailboxesSize;
1365 size_t StatusMailboxesSize;
1366
1367 DAC960_V2_CommandMailbox_T *CommandMailboxesMemory;
1368 dma_addr_t CommandMailboxesMemoryDMA;
1369
1370 DAC960_V2_StatusMailbox_T *StatusMailboxesMemory;
1371 dma_addr_t StatusMailboxesMemoryDMA;
1372
1373 DAC960_V2_CommandMailbox_T *CommandMailbox;
1374 dma_addr_t CommandMailboxDMA;
1375 DAC960_V2_CommandStatus_T CommandStatus;
1376
1377 if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(64)))
1378 Controller->BounceBufferLimit = DMA_BIT_MASK(64);
1379 else if (!pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1380 Controller->BounceBufferLimit = DMA_BIT_MASK(32);
1381 else
1382 return DAC960_Failure(Controller, "DMA mask out of range");
1383
1384
1385 CommandMailbox = pci_alloc_consistent(PCI_Device,
1386 sizeof(DAC960_V2_CommandMailbox_T), &CommandMailboxDMA);
1387 if (CommandMailbox == NULL)
1388 return false;
1389
1390 CommandMailboxesSize = DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T);
1391 StatusMailboxesSize = DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T);
1392 DmaPagesSize =
1393 CommandMailboxesSize + StatusMailboxesSize +
1394 sizeof(DAC960_V2_HealthStatusBuffer_T) +
1395 sizeof(DAC960_V2_ControllerInfo_T) +
1396 sizeof(DAC960_V2_LogicalDeviceInfo_T) +
1397 sizeof(DAC960_V2_PhysicalDeviceInfo_T) +
1398 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T) +
1399 sizeof(DAC960_V2_Event_T) +
1400 sizeof(DAC960_V2_PhysicalToLogicalDevice_T);
1401
1402 if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize)) {
1403 pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1404 CommandMailbox, CommandMailboxDMA);
1405 return false;
1406 }
1407
1408 CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1409 CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1410
1411
1412 Controller->V2.FirstCommandMailbox = CommandMailboxesMemory;
1413 Controller->V2.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1414
1415 CommandMailboxesMemory += DAC960_V2_CommandMailboxCount - 1;
1416 Controller->V2.LastCommandMailbox = CommandMailboxesMemory;
1417 Controller->V2.NextCommandMailbox = Controller->V2.FirstCommandMailbox;
1418 Controller->V2.PreviousCommandMailbox1 = Controller->V2.LastCommandMailbox;
1419 Controller->V2.PreviousCommandMailbox2 =
1420 Controller->V2.LastCommandMailbox - 1;
1421
1422
1423 StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1424 StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1425
1426 Controller->V2.FirstStatusMailbox = StatusMailboxesMemory;
1427 Controller->V2.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1428 StatusMailboxesMemory += DAC960_V2_StatusMailboxCount - 1;
1429 Controller->V2.LastStatusMailbox = StatusMailboxesMemory;
1430 Controller->V2.NextStatusMailbox = Controller->V2.FirstStatusMailbox;
1431
1432 Controller->V2.HealthStatusBuffer = slice_dma_loaf(DmaPages,
1433 sizeof(DAC960_V2_HealthStatusBuffer_T),
1434 &Controller->V2.HealthStatusBufferDMA);
1435
1436 Controller->V2.NewControllerInformation = slice_dma_loaf(DmaPages,
1437 sizeof(DAC960_V2_ControllerInfo_T),
1438 &Controller->V2.NewControllerInformationDMA);
1439
1440 Controller->V2.NewLogicalDeviceInformation = slice_dma_loaf(DmaPages,
1441 sizeof(DAC960_V2_LogicalDeviceInfo_T),
1442 &Controller->V2.NewLogicalDeviceInformationDMA);
1443
1444 Controller->V2.NewPhysicalDeviceInformation = slice_dma_loaf(DmaPages,
1445 sizeof(DAC960_V2_PhysicalDeviceInfo_T),
1446 &Controller->V2.NewPhysicalDeviceInformationDMA);
1447
1448 Controller->V2.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1449 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1450 &Controller->V2.NewInquiryUnitSerialNumberDMA);
1451
1452 Controller->V2.Event = slice_dma_loaf(DmaPages,
1453 sizeof(DAC960_V2_Event_T),
1454 &Controller->V2.EventDMA);
1455
1456 Controller->V2.PhysicalToLogicalDevice = slice_dma_loaf(DmaPages,
1457 sizeof(DAC960_V2_PhysicalToLogicalDevice_T),
1458 &Controller->V2.PhysicalToLogicalDeviceDMA);
1459
1460
1461
1462
1463
1464
1465
1466
1467 memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
1468 CommandMailbox->SetMemoryMailbox.CommandIdentifier = 1;
1469 CommandMailbox->SetMemoryMailbox.CommandOpcode = DAC960_V2_IOCTL;
1470 CommandMailbox->SetMemoryMailbox.CommandControlBits.NoAutoRequestSense = true;
1471 CommandMailbox->SetMemoryMailbox.FirstCommandMailboxSizeKB =
1472 (DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T)) >> 10;
1473 CommandMailbox->SetMemoryMailbox.FirstStatusMailboxSizeKB =
1474 (DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T)) >> 10;
1475 CommandMailbox->SetMemoryMailbox.SecondCommandMailboxSizeKB = 0;
1476 CommandMailbox->SetMemoryMailbox.SecondStatusMailboxSizeKB = 0;
1477 CommandMailbox->SetMemoryMailbox.RequestSenseSize = 0;
1478 CommandMailbox->SetMemoryMailbox.IOCTL_Opcode = DAC960_V2_SetMemoryMailbox;
1479 CommandMailbox->SetMemoryMailbox.HealthStatusBufferSizeKB = 1;
1480 CommandMailbox->SetMemoryMailbox.HealthStatusBufferBusAddress =
1481 Controller->V2.HealthStatusBufferDMA;
1482 CommandMailbox->SetMemoryMailbox.FirstCommandMailboxBusAddress =
1483 Controller->V2.FirstCommandMailboxDMA;
1484 CommandMailbox->SetMemoryMailbox.FirstStatusMailboxBusAddress =
1485 Controller->V2.FirstStatusMailboxDMA;
1486 switch (Controller->HardwareType)
1487 {
1488 case DAC960_GEM_Controller:
1489 while (DAC960_GEM_HardwareMailboxFullP(ControllerBaseAddress))
1490 udelay(1);
1491 DAC960_GEM_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1492 DAC960_GEM_HardwareMailboxNewCommand(ControllerBaseAddress);
1493 while (!DAC960_GEM_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1494 udelay(1);
1495 CommandStatus = DAC960_GEM_ReadCommandStatus(ControllerBaseAddress);
1496 DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1497 DAC960_GEM_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1498 break;
1499 case DAC960_BA_Controller:
1500 while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress))
1501 udelay(1);
1502 DAC960_BA_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1503 DAC960_BA_HardwareMailboxNewCommand(ControllerBaseAddress);
1504 while (!DAC960_BA_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1505 udelay(1);
1506 CommandStatus = DAC960_BA_ReadCommandStatus(ControllerBaseAddress);
1507 DAC960_BA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1508 DAC960_BA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1509 break;
1510 case DAC960_LP_Controller:
1511 while (DAC960_LP_HardwareMailboxFullP(ControllerBaseAddress))
1512 udelay(1);
1513 DAC960_LP_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1514 DAC960_LP_HardwareMailboxNewCommand(ControllerBaseAddress);
1515 while (!DAC960_LP_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1516 udelay(1);
1517 CommandStatus = DAC960_LP_ReadCommandStatus(ControllerBaseAddress);
1518 DAC960_LP_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1519 DAC960_LP_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1520 break;
1521 default:
1522 DAC960_Failure(Controller, "Unknown Controller Type\n");
1523 CommandStatus = DAC960_V2_AbormalCompletion;
1524 break;
1525 }
1526 pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1527 CommandMailbox, CommandMailboxDMA);
1528 return (CommandStatus == DAC960_V2_NormalCompletion);
1529}
1530
1531
1532
1533
1534
1535
1536
1537static bool DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
1538 *Controller)
1539{
1540 DAC960_V1_Enquiry2_T *Enquiry2;
1541 dma_addr_t Enquiry2DMA;
1542 DAC960_V1_Config2_T *Config2;
1543 dma_addr_t Config2DMA;
1544 int LogicalDriveNumber, Channel, TargetID;
1545 struct dma_loaf local_dma;
1546
1547 if (!init_dma_loaf(Controller->PCIDevice, &local_dma,
1548 sizeof(DAC960_V1_Enquiry2_T) + sizeof(DAC960_V1_Config2_T)))
1549 return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1550
1551 Enquiry2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Enquiry2_T), &Enquiry2DMA);
1552 Config2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Config2_T), &Config2DMA);
1553
1554 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry,
1555 Controller->V1.NewEnquiryDMA)) {
1556 free_dma_loaf(Controller->PCIDevice, &local_dma);
1557 return DAC960_Failure(Controller, "ENQUIRY");
1558 }
1559 memcpy(&Controller->V1.Enquiry, Controller->V1.NewEnquiry,
1560 sizeof(DAC960_V1_Enquiry_T));
1561
1562 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry2, Enquiry2DMA)) {
1563 free_dma_loaf(Controller->PCIDevice, &local_dma);
1564 return DAC960_Failure(Controller, "ENQUIRY2");
1565 }
1566
1567 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_ReadConfig2, Config2DMA)) {
1568 free_dma_loaf(Controller->PCIDevice, &local_dma);
1569 return DAC960_Failure(Controller, "READ CONFIG2");
1570 }
1571
1572 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_GetLogicalDriveInformation,
1573 Controller->V1.NewLogicalDriveInformationDMA)) {
1574 free_dma_loaf(Controller->PCIDevice, &local_dma);
1575 return DAC960_Failure(Controller, "GET LOGICAL DRIVE INFORMATION");
1576 }
1577 memcpy(&Controller->V1.LogicalDriveInformation,
1578 Controller->V1.NewLogicalDriveInformation,
1579 sizeof(DAC960_V1_LogicalDriveInformationArray_T));
1580
1581 for (Channel = 0; Channel < Enquiry2->ActualChannels; Channel++)
1582 for (TargetID = 0; TargetID < Enquiry2->MaxTargets; TargetID++) {
1583 if (!DAC960_V1_ExecuteType3D(Controller, DAC960_V1_GetDeviceState,
1584 Channel, TargetID,
1585 Controller->V1.NewDeviceStateDMA)) {
1586 free_dma_loaf(Controller->PCIDevice, &local_dma);
1587 return DAC960_Failure(Controller, "GET DEVICE STATE");
1588 }
1589 memcpy(&Controller->V1.DeviceState[Channel][TargetID],
1590 Controller->V1.NewDeviceState, sizeof(DAC960_V1_DeviceState_T));
1591 }
1592
1593
1594
1595 switch (Enquiry2->HardwareID.SubModel)
1596 {
1597 case DAC960_V1_P_PD_PU:
1598 if (Enquiry2->SCSICapability.BusSpeed == DAC960_V1_Ultra)
1599 strcpy(Controller->ModelName, "DAC960PU");
1600 else strcpy(Controller->ModelName, "DAC960PD");
1601 break;
1602 case DAC960_V1_PL:
1603 strcpy(Controller->ModelName, "DAC960PL");
1604 break;
1605 case DAC960_V1_PG:
1606 strcpy(Controller->ModelName, "DAC960PG");
1607 break;
1608 case DAC960_V1_PJ:
1609 strcpy(Controller->ModelName, "DAC960PJ");
1610 break;
1611 case DAC960_V1_PR:
1612 strcpy(Controller->ModelName, "DAC960PR");
1613 break;
1614 case DAC960_V1_PT:
1615 strcpy(Controller->ModelName, "DAC960PT");
1616 break;
1617 case DAC960_V1_PTL0:
1618 strcpy(Controller->ModelName, "DAC960PTL0");
1619 break;
1620 case DAC960_V1_PRL:
1621 strcpy(Controller->ModelName, "DAC960PRL");
1622 break;
1623 case DAC960_V1_PTL1:
1624 strcpy(Controller->ModelName, "DAC960PTL1");
1625 break;
1626 case DAC960_V1_1164P:
1627 strcpy(Controller->ModelName, "DAC1164P");
1628 break;
1629 default:
1630 free_dma_loaf(Controller->PCIDevice, &local_dma);
1631 return DAC960_Failure(Controller, "MODEL VERIFICATION");
1632 }
1633 strcpy(Controller->FullModelName, "Mylex ");
1634 strcat(Controller->FullModelName, Controller->ModelName);
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644#if defined(CONFIG_ALPHA)
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659# define FIRMWARE_27X "2.70"
1660#else
1661# define FIRMWARE_27X "2.73"
1662#endif
1663
1664 if (Enquiry2->FirmwareID.MajorVersion == 0)
1665 {
1666 Enquiry2->FirmwareID.MajorVersion =
1667 Controller->V1.Enquiry.MajorFirmwareVersion;
1668 Enquiry2->FirmwareID.MinorVersion =
1669 Controller->V1.Enquiry.MinorFirmwareVersion;
1670 Enquiry2->FirmwareID.FirmwareType = '0';
1671 Enquiry2->FirmwareID.TurnID = 0;
1672 }
1673 sprintf(Controller->FirmwareVersion, "%d.%02d-%c-%02d",
1674 Enquiry2->FirmwareID.MajorVersion, Enquiry2->FirmwareID.MinorVersion,
1675 Enquiry2->FirmwareID.FirmwareType, Enquiry2->FirmwareID.TurnID);
1676 if (!((Controller->FirmwareVersion[0] == '5' &&
1677 strcmp(Controller->FirmwareVersion, "5.06") >= 0) ||
1678 (Controller->FirmwareVersion[0] == '4' &&
1679 strcmp(Controller->FirmwareVersion, "4.06") >= 0) ||
1680 (Controller->FirmwareVersion[0] == '3' &&
1681 strcmp(Controller->FirmwareVersion, "3.51") >= 0) ||
1682 (Controller->FirmwareVersion[0] == '2' &&
1683 strcmp(Controller->FirmwareVersion, FIRMWARE_27X) >= 0)))
1684 {
1685 DAC960_Failure(Controller, "FIRMWARE VERSION VERIFICATION");
1686 DAC960_Error("Firmware Version = '%s'\n", Controller,
1687 Controller->FirmwareVersion);
1688 free_dma_loaf(Controller->PCIDevice, &local_dma);
1689 return false;
1690 }
1691
1692
1693
1694
1695 Controller->Channels = Enquiry2->ActualChannels;
1696 Controller->Targets = Enquiry2->MaxTargets;
1697 Controller->MemorySize = Enquiry2->MemorySize >> 20;
1698 Controller->V1.SAFTE_EnclosureManagementEnabled =
1699 (Enquiry2->FaultManagementType == DAC960_V1_SAFTE);
1700
1701
1702
1703
1704
1705
1706
1707 Controller->ControllerQueueDepth = Controller->V1.Enquiry.MaxCommands;
1708 Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1709 if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1710 Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1711 Controller->LogicalDriveCount =
1712 Controller->V1.Enquiry.NumberOfLogicalDrives;
1713 Controller->MaxBlocksPerCommand = Enquiry2->MaxBlocksPerCommand;
1714 Controller->ControllerScatterGatherLimit = Enquiry2->MaxScatterGatherEntries;
1715 Controller->DriverScatterGatherLimit =
1716 Controller->ControllerScatterGatherLimit;
1717 if (Controller->DriverScatterGatherLimit > DAC960_V1_ScatterGatherLimit)
1718 Controller->DriverScatterGatherLimit = DAC960_V1_ScatterGatherLimit;
1719
1720
1721
1722 Controller->V1.StripeSize = Config2->BlocksPerStripe * Config2->BlockFactor
1723 >> (10 - DAC960_BlockSizeBits);
1724 Controller->V1.SegmentSize = Config2->BlocksPerCacheLine * Config2->BlockFactor
1725 >> (10 - DAC960_BlockSizeBits);
1726 switch (Config2->DriveGeometry)
1727 {
1728 case DAC960_V1_Geometry_128_32:
1729 Controller->V1.GeometryTranslationHeads = 128;
1730 Controller->V1.GeometryTranslationSectors = 32;
1731 break;
1732 case DAC960_V1_Geometry_255_63:
1733 Controller->V1.GeometryTranslationHeads = 255;
1734 Controller->V1.GeometryTranslationSectors = 63;
1735 break;
1736 default:
1737 free_dma_loaf(Controller->PCIDevice, &local_dma);
1738 return DAC960_Failure(Controller, "CONFIG2 DRIVE GEOMETRY");
1739 }
1740
1741
1742
1743 if ((Controller->FirmwareVersion[0] == '4' &&
1744 strcmp(Controller->FirmwareVersion, "4.08") >= 0) ||
1745 (Controller->FirmwareVersion[0] == '5' &&
1746 strcmp(Controller->FirmwareVersion, "5.08") >= 0))
1747 {
1748 Controller->V1.BackgroundInitializationStatusSupported = true;
1749 DAC960_V1_ExecuteType3B(Controller,
1750 DAC960_V1_BackgroundInitializationControl, 0x20,
1751 Controller->
1752 V1.BackgroundInitializationStatusDMA);
1753 memcpy(&Controller->V1.LastBackgroundInitializationStatus,
1754 Controller->V1.BackgroundInitializationStatus,
1755 sizeof(DAC960_V1_BackgroundInitializationStatus_T));
1756 }
1757
1758
1759
1760 for (LogicalDriveNumber = 0;
1761 LogicalDriveNumber < Controller->LogicalDriveCount;
1762 LogicalDriveNumber++)
1763 if (Controller->V1.LogicalDriveInformation
1764 [LogicalDriveNumber].LogicalDriveState !=
1765 DAC960_V1_LogicalDrive_Offline)
1766 Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber] = true;
1767 Controller->V1.LastRebuildStatus = DAC960_V1_NoRebuildOrCheckInProgress;
1768 free_dma_loaf(Controller->PCIDevice, &local_dma);
1769 return true;
1770}
1771
1772
1773
1774
1775
1776
1777
1778static bool DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
1779 *Controller)
1780{
1781 DAC960_V2_ControllerInfo_T *ControllerInfo =
1782 &Controller->V2.ControllerInformation;
1783 unsigned short LogicalDeviceNumber = 0;
1784 int ModelNameLength;
1785
1786
1787 if (!DAC960_V2_NewControllerInfo(Controller))
1788 return DAC960_Failure(Controller, "GET CONTROLLER INFO");
1789 memcpy(ControllerInfo, Controller->V2.NewControllerInformation,
1790 sizeof(DAC960_V2_ControllerInfo_T));
1791
1792
1793 if (!DAC960_V2_GeneralInfo(Controller))
1794 return DAC960_Failure(Controller, "GET HEALTH STATUS");
1795
1796
1797
1798
1799 ModelNameLength = sizeof(ControllerInfo->ControllerName);
1800 if (ModelNameLength > sizeof(Controller->ModelName)-1)
1801 ModelNameLength = sizeof(Controller->ModelName)-1;
1802 memcpy(Controller->ModelName, ControllerInfo->ControllerName,
1803 ModelNameLength);
1804 ModelNameLength--;
1805 while (Controller->ModelName[ModelNameLength] == ' ' ||
1806 Controller->ModelName[ModelNameLength] == '\0')
1807 ModelNameLength--;
1808 Controller->ModelName[++ModelNameLength] = '\0';
1809 strcpy(Controller->FullModelName, "Mylex ");
1810 strcat(Controller->FullModelName, Controller->ModelName);
1811
1812
1813
1814 sprintf(Controller->FirmwareVersion, "%d.%02d-%02d",
1815 ControllerInfo->FirmwareMajorVersion,
1816 ControllerInfo->FirmwareMinorVersion,
1817 ControllerInfo->FirmwareTurnNumber);
1818 if (ControllerInfo->FirmwareMajorVersion == 6 &&
1819 ControllerInfo->FirmwareMinorVersion == 0 &&
1820 ControllerInfo->FirmwareTurnNumber < 1)
1821 {
1822 DAC960_Info("FIRMWARE VERSION %s DOES NOT PROVIDE THE CONTROLLER\n",
1823 Controller, Controller->FirmwareVersion);
1824 DAC960_Info("STATUS MONITORING FUNCTIONALITY NEEDED BY THIS DRIVER.\n",
1825 Controller);
1826 DAC960_Info("PLEASE UPGRADE TO VERSION 6.00-01 OR ABOVE.\n",
1827 Controller);
1828 }
1829
1830
1831
1832 Controller->Channels = ControllerInfo->NumberOfPhysicalChannelsPresent;
1833 Controller->Targets =
1834 ControllerInfo->MaximumTargetsPerChannel
1835 [ControllerInfo->NumberOfPhysicalChannelsPresent-1];
1836 Controller->MemorySize = ControllerInfo->MemorySizeMB;
1837
1838
1839
1840
1841
1842
1843
1844 Controller->ControllerQueueDepth = ControllerInfo->MaximumParallelCommands;
1845 Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1846 if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1847 Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1848 Controller->LogicalDriveCount = ControllerInfo->LogicalDevicesPresent;
1849 Controller->MaxBlocksPerCommand =
1850 ControllerInfo->MaximumDataTransferSizeInBlocks;
1851 Controller->ControllerScatterGatherLimit =
1852 ControllerInfo->MaximumScatterGatherEntries;
1853 Controller->DriverScatterGatherLimit =
1854 Controller->ControllerScatterGatherLimit;
1855 if (Controller->DriverScatterGatherLimit > DAC960_V2_ScatterGatherLimit)
1856 Controller->DriverScatterGatherLimit = DAC960_V2_ScatterGatherLimit;
1857
1858
1859
1860 while (true)
1861 {
1862 DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
1863 Controller->V2.NewLogicalDeviceInformation;
1864 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo;
1865 DAC960_V2_PhysicalDevice_T PhysicalDevice;
1866
1867 if (!DAC960_V2_NewLogicalDeviceInfo(Controller, LogicalDeviceNumber))
1868 break;
1869 LogicalDeviceNumber = NewLogicalDeviceInfo->LogicalDeviceNumber;
1870 if (LogicalDeviceNumber >= DAC960_MaxLogicalDrives) {
1871 DAC960_Error("DAC960: Logical Drive Number %d not supported\n",
1872 Controller, LogicalDeviceNumber);
1873 break;
1874 }
1875 if (NewLogicalDeviceInfo->DeviceBlockSizeInBytes != DAC960_BlockSize) {
1876 DAC960_Error("DAC960: Logical Drive Block Size %d not supported\n",
1877 Controller, NewLogicalDeviceInfo->DeviceBlockSizeInBytes);
1878 LogicalDeviceNumber++;
1879 continue;
1880 }
1881 PhysicalDevice.Controller = 0;
1882 PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel;
1883 PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID;
1884 PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
1885 Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
1886 PhysicalDevice;
1887 if (NewLogicalDeviceInfo->LogicalDeviceState !=
1888 DAC960_V2_LogicalDevice_Offline)
1889 Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true;
1890 LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
1891 GFP_ATOMIC);
1892 if (LogicalDeviceInfo == NULL)
1893 return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1894 Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
1895 LogicalDeviceInfo;
1896 memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo,
1897 sizeof(DAC960_V2_LogicalDeviceInfo_T));
1898 LogicalDeviceNumber++;
1899 }
1900 return true;
1901}
1902
1903
1904
1905
1906
1907
1908
1909static bool DAC960_ReportControllerConfiguration(DAC960_Controller_T
1910 *Controller)
1911{
1912 DAC960_Info("Configuring Mylex %s PCI RAID Controller\n",
1913 Controller, Controller->ModelName);
1914 DAC960_Info(" Firmware Version: %s, Channels: %d, Memory Size: %dMB\n",
1915 Controller, Controller->FirmwareVersion,
1916 Controller->Channels, Controller->MemorySize);
1917 DAC960_Info(" PCI Bus: %d, Device: %d, Function: %d, I/O Address: ",
1918 Controller, Controller->Bus,
1919 Controller->Device, Controller->Function);
1920 if (Controller->IO_Address == 0)
1921 DAC960_Info("Unassigned\n", Controller);
1922 else DAC960_Info("0x%X\n", Controller, Controller->IO_Address);
1923 DAC960_Info(" PCI Address: 0x%X mapped at 0x%lX, IRQ Channel: %d\n",
1924 Controller, Controller->PCI_Address,
1925 (unsigned long) Controller->BaseAddress,
1926 Controller->IRQ_Channel);
1927 DAC960_Info(" Controller Queue Depth: %d, "
1928 "Maximum Blocks per Command: %d\n",
1929 Controller, Controller->ControllerQueueDepth,
1930 Controller->MaxBlocksPerCommand);
1931 DAC960_Info(" Driver Queue Depth: %d, "
1932 "Scatter/Gather Limit: %d of %d Segments\n",
1933 Controller, Controller->DriverQueueDepth,
1934 Controller->DriverScatterGatherLimit,
1935 Controller->ControllerScatterGatherLimit);
1936 if (Controller->FirmwareType == DAC960_V1_Controller)
1937 {
1938 DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, "
1939 "BIOS Geometry: %d/%d\n", Controller,
1940 Controller->V1.StripeSize,
1941 Controller->V1.SegmentSize,
1942 Controller->V1.GeometryTranslationHeads,
1943 Controller->V1.GeometryTranslationSectors);
1944 if (Controller->V1.SAFTE_EnclosureManagementEnabled)
1945 DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller);
1946 }
1947 return true;
1948}
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958static bool DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
1959 *Controller)
1960{
1961 struct dma_loaf local_dma;
1962
1963 dma_addr_t DCDBs_dma[DAC960_V1_MaxChannels];
1964 DAC960_V1_DCDB_T *DCDBs_cpu[DAC960_V1_MaxChannels];
1965
1966 dma_addr_t SCSI_Inquiry_dma[DAC960_V1_MaxChannels];
1967 DAC960_SCSI_Inquiry_T *SCSI_Inquiry_cpu[DAC960_V1_MaxChannels];
1968
1969 dma_addr_t SCSI_NewInquiryUnitSerialNumberDMA[DAC960_V1_MaxChannels];
1970 DAC960_SCSI_Inquiry_UnitSerialNumber_T *SCSI_NewInquiryUnitSerialNumberCPU[DAC960_V1_MaxChannels];
1971
1972 struct completion Completions[DAC960_V1_MaxChannels];
1973 unsigned long flags;
1974 int Channel, TargetID;
1975
1976 if (!init_dma_loaf(Controller->PCIDevice, &local_dma,
1977 DAC960_V1_MaxChannels*(sizeof(DAC960_V1_DCDB_T) +
1978 sizeof(DAC960_SCSI_Inquiry_T) +
1979 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T))))
1980 return DAC960_Failure(Controller,
1981 "DMA ALLOCATION FAILED IN ReadDeviceConfiguration");
1982
1983 for (Channel = 0; Channel < Controller->Channels; Channel++) {
1984 DCDBs_cpu[Channel] = slice_dma_loaf(&local_dma,
1985 sizeof(DAC960_V1_DCDB_T), DCDBs_dma + Channel);
1986 SCSI_Inquiry_cpu[Channel] = slice_dma_loaf(&local_dma,
1987 sizeof(DAC960_SCSI_Inquiry_T),
1988 SCSI_Inquiry_dma + Channel);
1989 SCSI_NewInquiryUnitSerialNumberCPU[Channel] = slice_dma_loaf(&local_dma,
1990 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1991 SCSI_NewInquiryUnitSerialNumberDMA + Channel);
1992 }
1993
1994 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
1995 {
1996
1997
1998
1999
2000
2001
2002 for (Channel = 0; Channel < Controller->Channels; Channel++)
2003 {
2004 dma_addr_t NewInquiryStandardDataDMA = SCSI_Inquiry_dma[Channel];
2005 DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2006 dma_addr_t DCDB_dma = DCDBs_dma[Channel];
2007 DAC960_Command_T *Command = Controller->Commands[Channel];
2008 struct completion *Completion = &Completions[Channel];
2009
2010 init_completion(Completion);
2011 DAC960_V1_ClearCommand(Command);
2012 Command->CommandType = DAC960_ImmediateCommand;
2013 Command->Completion = Completion;
2014 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
2015 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_dma;
2016 DCDB->Channel = Channel;
2017 DCDB->TargetID = TargetID;
2018 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
2019 DCDB->EarlyStatus = false;
2020 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
2021 DCDB->NoAutomaticRequestSense = false;
2022 DCDB->DisconnectPermitted = true;
2023 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
2024 DCDB->BusAddress = NewInquiryStandardDataDMA;
2025 DCDB->CDBLength = 6;
2026 DCDB->TransferLengthHigh4 = 0;
2027 DCDB->SenseLength = sizeof(DCDB->SenseData);
2028 DCDB->CDB[0] = 0x12;
2029 DCDB->CDB[1] = 0;
2030 DCDB->CDB[2] = 0;
2031 DCDB->CDB[3] = 0;
2032 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
2033 DCDB->CDB[5] = 0;
2034
2035 spin_lock_irqsave(&Controller->queue_lock, flags);
2036 DAC960_QueueCommand(Command);
2037 spin_unlock_irqrestore(&Controller->queue_lock, flags);
2038 }
2039
2040
2041
2042
2043
2044 for (Channel = 0; Channel < Controller->Channels; Channel++)
2045 {
2046 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2047 &Controller->V1.InquiryStandardData[Channel][TargetID];
2048 DAC960_SCSI_Inquiry_T *NewInquiryStandardData = SCSI_Inquiry_cpu[Channel];
2049 dma_addr_t NewInquiryUnitSerialNumberDMA =
2050 SCSI_NewInquiryUnitSerialNumberDMA[Channel];
2051 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2052 SCSI_NewInquiryUnitSerialNumberCPU[Channel];
2053 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2054 &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2055 DAC960_Command_T *Command = Controller->Commands[Channel];
2056 DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2057 struct completion *Completion = &Completions[Channel];
2058
2059 wait_for_completion(Completion);
2060
2061 if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2062 memset(InquiryStandardData, 0, sizeof(DAC960_SCSI_Inquiry_T));
2063 InquiryStandardData->PeripheralDeviceType = 0x1F;
2064 continue;
2065 } else
2066 memcpy(InquiryStandardData, NewInquiryStandardData, sizeof(DAC960_SCSI_Inquiry_T));
2067
2068
2069 Command->Completion = Completion;
2070 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2071 DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
2072 DCDB->SenseLength = sizeof(DCDB->SenseData);
2073 DCDB->CDB[0] = 0x12;
2074 DCDB->CDB[1] = 1;
2075 DCDB->CDB[2] = 0x80;
2076 DCDB->CDB[3] = 0;
2077 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2078 DCDB->CDB[5] = 0;
2079
2080 spin_lock_irqsave(&Controller->queue_lock, flags);
2081 DAC960_QueueCommand(Command);
2082 spin_unlock_irqrestore(&Controller->queue_lock, flags);
2083 wait_for_completion(Completion);
2084
2085 if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2086 memset(InquiryUnitSerialNumber, 0,
2087 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2088 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2089 } else
2090 memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2091 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2092 }
2093 }
2094 free_dma_loaf(Controller->PCIDevice, &local_dma);
2095 return true;
2096}
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106static bool DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
2107 *Controller)
2108{
2109 unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0;
2110 unsigned short PhysicalDeviceIndex = 0;
2111
2112 while (true)
2113 {
2114 DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
2115 Controller->V2.NewPhysicalDeviceInformation;
2116 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo;
2117 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2118 Controller->V2.NewInquiryUnitSerialNumber;
2119 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber;
2120
2121 if (!DAC960_V2_NewPhysicalDeviceInfo(Controller, Channel, TargetID, LogicalUnit))
2122 break;
2123
2124 PhysicalDeviceInfo = kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T),
2125 GFP_ATOMIC);
2126 if (PhysicalDeviceInfo == NULL)
2127 return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION");
2128 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] =
2129 PhysicalDeviceInfo;
2130 memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
2131 sizeof(DAC960_V2_PhysicalDeviceInfo_T));
2132
2133 InquiryUnitSerialNumber = kmalloc(
2134 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);
2135 if (InquiryUnitSerialNumber == NULL) {
2136 kfree(PhysicalDeviceInfo);
2137 return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION");
2138 }
2139 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] =
2140 InquiryUnitSerialNumber;
2141
2142 Channel = NewPhysicalDeviceInfo->Channel;
2143 TargetID = NewPhysicalDeviceInfo->TargetID;
2144 LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit;
2145
2146
2147
2148
2149
2150
2151
2152 if (!DAC960_V2_NewInquiryUnitSerialNumber(Controller, Channel, TargetID, LogicalUnit)) {
2153 memset(InquiryUnitSerialNumber, 0,
2154 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2155 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2156 } else
2157 memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2158 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2159
2160 PhysicalDeviceIndex++;
2161 LogicalUnit++;
2162 }
2163 return true;
2164}
2165
2166
2167
2168
2169
2170
2171
2172
2173static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T
2174 *InquiryStandardData,
2175 DAC960_SCSI_Inquiry_UnitSerialNumber_T
2176 *InquiryUnitSerialNumber,
2177 unsigned char *Vendor,
2178 unsigned char *Model,
2179 unsigned char *Revision,
2180 unsigned char *SerialNumber)
2181{
2182 int SerialNumberLength, i;
2183 if (InquiryStandardData->PeripheralDeviceType == 0x1F) return;
2184 for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++)
2185 {
2186 unsigned char VendorCharacter =
2187 InquiryStandardData->VendorIdentification[i];
2188 Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~'
2189 ? VendorCharacter : ' ');
2190 }
2191 Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0';
2192 for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++)
2193 {
2194 unsigned char ModelCharacter =
2195 InquiryStandardData->ProductIdentification[i];
2196 Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~'
2197 ? ModelCharacter : ' ');
2198 }
2199 Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0';
2200 for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++)
2201 {
2202 unsigned char RevisionCharacter =
2203 InquiryStandardData->ProductRevisionLevel[i];
2204 Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~'
2205 ? RevisionCharacter : ' ');
2206 }
2207 Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0';
2208 if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return;
2209 SerialNumberLength = InquiryUnitSerialNumber->PageLength;
2210 if (SerialNumberLength >
2211 sizeof(InquiryUnitSerialNumber->ProductSerialNumber))
2212 SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber);
2213 for (i = 0; i < SerialNumberLength; i++)
2214 {
2215 unsigned char SerialNumberCharacter =
2216 InquiryUnitSerialNumber->ProductSerialNumber[i];
2217 SerialNumber[i] =
2218 (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~'
2219 ? SerialNumberCharacter : ' ');
2220 }
2221 SerialNumber[SerialNumberLength] = '\0';
2222}
2223
2224
2225
2226
2227
2228
2229
2230static bool DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
2231 *Controller)
2232{
2233 int LogicalDriveNumber, Channel, TargetID;
2234 DAC960_Info(" Physical Devices:\n", Controller);
2235 for (Channel = 0; Channel < Controller->Channels; Channel++)
2236 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
2237 {
2238 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2239 &Controller->V1.InquiryStandardData[Channel][TargetID];
2240 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2241 &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2242 DAC960_V1_DeviceState_T *DeviceState =
2243 &Controller->V1.DeviceState[Channel][TargetID];
2244 DAC960_V1_ErrorTableEntry_T *ErrorEntry =
2245 &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID];
2246 char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2247 char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2248 char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2249 char SerialNumber[1+sizeof(InquiryUnitSerialNumber
2250 ->ProductSerialNumber)];
2251 if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue;
2252 DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2253 Vendor, Model, Revision, SerialNumber);
2254 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2255 Controller, Channel, TargetID, (TargetID < 10 ? " " : ""),
2256 Vendor, Model, Revision);
2257 if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2258 DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber);
2259 if (DeviceState->Present &&
2260 DeviceState->DeviceType == DAC960_V1_DiskType)
2261 {
2262 if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0)
2263 DAC960_Info(" Disk Status: %s, %u blocks, %d resets\n",
2264 Controller,
2265 (DeviceState->DeviceState == DAC960_V1_Device_Dead
2266 ? "Dead"
2267 : DeviceState->DeviceState
2268 == DAC960_V1_Device_WriteOnly
2269 ? "Write-Only"
2270 : DeviceState->DeviceState
2271 == DAC960_V1_Device_Online
2272 ? "Online" : "Standby"),
2273 DeviceState->DiskSize,
2274 Controller->V1.DeviceResetCount[Channel][TargetID]);
2275 else
2276 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller,
2277 (DeviceState->DeviceState == DAC960_V1_Device_Dead
2278 ? "Dead"
2279 : DeviceState->DeviceState
2280 == DAC960_V1_Device_WriteOnly
2281 ? "Write-Only"
2282 : DeviceState->DeviceState
2283 == DAC960_V1_Device_Online
2284 ? "Online" : "Standby"),
2285 DeviceState->DiskSize);
2286 }
2287 if (ErrorEntry->ParityErrorCount > 0 ||
2288 ErrorEntry->SoftErrorCount > 0 ||
2289 ErrorEntry->HardErrorCount > 0 ||
2290 ErrorEntry->MiscErrorCount > 0)
2291 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2292 "Hard: %d, Misc: %d\n", Controller,
2293 ErrorEntry->ParityErrorCount,
2294 ErrorEntry->SoftErrorCount,
2295 ErrorEntry->HardErrorCount,
2296 ErrorEntry->MiscErrorCount);
2297 }
2298 DAC960_Info(" Logical Drives:\n", Controller);
2299 for (LogicalDriveNumber = 0;
2300 LogicalDriveNumber < Controller->LogicalDriveCount;
2301 LogicalDriveNumber++)
2302 {
2303 DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation =
2304 &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
2305 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks, %s\n",
2306 Controller, Controller->ControllerNumber, LogicalDriveNumber,
2307 LogicalDriveInformation->RAIDLevel,
2308 (LogicalDriveInformation->LogicalDriveState
2309 == DAC960_V1_LogicalDrive_Online
2310 ? "Online"
2311 : LogicalDriveInformation->LogicalDriveState
2312 == DAC960_V1_LogicalDrive_Critical
2313 ? "Critical" : "Offline"),
2314 LogicalDriveInformation->LogicalDriveSize,
2315 (LogicalDriveInformation->WriteBack
2316 ? "Write Back" : "Write Thru"));
2317 }
2318 return true;
2319}
2320
2321
2322
2323
2324
2325
2326
2327static bool DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
2328 *Controller)
2329{
2330 int PhysicalDeviceIndex, LogicalDriveNumber;
2331 DAC960_Info(" Physical Devices:\n", Controller);
2332 for (PhysicalDeviceIndex = 0;
2333 PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices;
2334 PhysicalDeviceIndex++)
2335 {
2336 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
2337 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
2338 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2339 (DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData;
2340 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2341 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
2342 char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2343 char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2344 char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2345 char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)];
2346 if (PhysicalDeviceInfo == NULL) break;
2347 DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2348 Vendor, Model, Revision, SerialNumber);
2349 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2350 Controller,
2351 PhysicalDeviceInfo->Channel,
2352 PhysicalDeviceInfo->TargetID,
2353 (PhysicalDeviceInfo->TargetID < 10 ? " " : ""),
2354 Vendor, Model, Revision);
2355 if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0)
2356 DAC960_Info(" %sAsynchronous\n", Controller,
2357 (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2358 ? "Wide " :""));
2359 else
2360 DAC960_Info(" %sSynchronous at %d MB/sec\n", Controller,
2361 (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2362 ? "Wide " :""),
2363 (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers
2364 * PhysicalDeviceInfo->NegotiatedDataWidthBits/8));
2365 if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2366 DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber);
2367 if (PhysicalDeviceInfo->PhysicalDeviceState ==
2368 DAC960_V2_Device_Unconfigured)
2369 continue;
2370 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller,
2371 (PhysicalDeviceInfo->PhysicalDeviceState
2372 == DAC960_V2_Device_Online
2373 ? "Online"
2374 : PhysicalDeviceInfo->PhysicalDeviceState
2375 == DAC960_V2_Device_Rebuild
2376 ? "Rebuild"
2377 : PhysicalDeviceInfo->PhysicalDeviceState
2378 == DAC960_V2_Device_Missing
2379 ? "Missing"
2380 : PhysicalDeviceInfo->PhysicalDeviceState
2381 == DAC960_V2_Device_Critical
2382 ? "Critical"
2383 : PhysicalDeviceInfo->PhysicalDeviceState
2384 == DAC960_V2_Device_Dead
2385 ? "Dead"
2386 : PhysicalDeviceInfo->PhysicalDeviceState
2387 == DAC960_V2_Device_SuspectedDead
2388 ? "Suspected-Dead"
2389 : PhysicalDeviceInfo->PhysicalDeviceState
2390 == DAC960_V2_Device_CommandedOffline
2391 ? "Commanded-Offline"
2392 : PhysicalDeviceInfo->PhysicalDeviceState
2393 == DAC960_V2_Device_Standby
2394 ? "Standby" : "Unknown"),
2395 PhysicalDeviceInfo->ConfigurableDeviceSize);
2396 if (PhysicalDeviceInfo->ParityErrors == 0 &&
2397 PhysicalDeviceInfo->SoftErrors == 0 &&
2398 PhysicalDeviceInfo->HardErrors == 0 &&
2399 PhysicalDeviceInfo->MiscellaneousErrors == 0 &&
2400 PhysicalDeviceInfo->CommandTimeouts == 0 &&
2401 PhysicalDeviceInfo->Retries == 0 &&
2402 PhysicalDeviceInfo->Aborts == 0 &&
2403 PhysicalDeviceInfo->PredictedFailuresDetected == 0)
2404 continue;
2405 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2406 "Hard: %d, Misc: %d\n", Controller,
2407 PhysicalDeviceInfo->ParityErrors,
2408 PhysicalDeviceInfo->SoftErrors,
2409 PhysicalDeviceInfo->HardErrors,
2410 PhysicalDeviceInfo->MiscellaneousErrors);
2411 DAC960_Info(" Timeouts: %d, Retries: %d, "
2412 "Aborts: %d, Predicted: %d\n", Controller,
2413 PhysicalDeviceInfo->CommandTimeouts,
2414 PhysicalDeviceInfo->Retries,
2415 PhysicalDeviceInfo->Aborts,
2416 PhysicalDeviceInfo->PredictedFailuresDetected);
2417 }
2418 DAC960_Info(" Logical Drives:\n", Controller);
2419 for (LogicalDriveNumber = 0;
2420 LogicalDriveNumber < DAC960_MaxLogicalDrives;
2421 LogicalDriveNumber++)
2422 {
2423 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
2424 Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
2425 unsigned char *ReadCacheStatus[] = { "Read Cache Disabled",
2426 "Read Cache Enabled",
2427 "Read Ahead Enabled",
2428 "Intelligent Read Ahead Enabled",
2429 "-", "-", "-", "-" };
2430 unsigned char *WriteCacheStatus[] = { "Write Cache Disabled",
2431 "Logical Device Read Only",
2432 "Write Cache Enabled",
2433 "Intelligent Write Cache Enabled",
2434 "-", "-", "-", "-" };
2435 unsigned char *GeometryTranslation;
2436 if (LogicalDeviceInfo == NULL) continue;
2437 switch (LogicalDeviceInfo->DriveGeometry)
2438 {
2439 case DAC960_V2_Geometry_128_32:
2440 GeometryTranslation = "128/32";
2441 break;
2442 case DAC960_V2_Geometry_255_63:
2443 GeometryTranslation = "255/63";
2444 break;
2445 default:
2446 GeometryTranslation = "Invalid";
2447 DAC960_Error("Illegal Logical Device Geometry %d\n",
2448 Controller, LogicalDeviceInfo->DriveGeometry);
2449 break;
2450 }
2451 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks\n",
2452 Controller, Controller->ControllerNumber, LogicalDriveNumber,
2453 LogicalDeviceInfo->RAIDLevel,
2454 (LogicalDeviceInfo->LogicalDeviceState
2455 == DAC960_V2_LogicalDevice_Online
2456 ? "Online"
2457 : LogicalDeviceInfo->LogicalDeviceState
2458 == DAC960_V2_LogicalDevice_Critical
2459 ? "Critical" : "Offline"),
2460 LogicalDeviceInfo->ConfigurableDeviceSize);
2461 DAC960_Info(" Logical Device %s, BIOS Geometry: %s\n",
2462 Controller,
2463 (LogicalDeviceInfo->LogicalDeviceControl
2464 .LogicalDeviceInitialized
2465 ? "Initialized" : "Uninitialized"),
2466 GeometryTranslation);
2467 if (LogicalDeviceInfo->StripeSize == 0)
2468 {
2469 if (LogicalDeviceInfo->CacheLineSize == 0)
2470 DAC960_Info(" Stripe Size: N/A, "
2471 "Segment Size: N/A\n", Controller);
2472 else
2473 DAC960_Info(" Stripe Size: N/A, "
2474 "Segment Size: %dKB\n", Controller,
2475 1 << (LogicalDeviceInfo->CacheLineSize - 2));
2476 }
2477 else
2478 {
2479 if (LogicalDeviceInfo->CacheLineSize == 0)
2480 DAC960_Info(" Stripe Size: %dKB, "
2481 "Segment Size: N/A\n", Controller,
2482 1 << (LogicalDeviceInfo->StripeSize - 2));
2483 else
2484 DAC960_Info(" Stripe Size: %dKB, "
2485 "Segment Size: %dKB\n", Controller,
2486 1 << (LogicalDeviceInfo->StripeSize - 2),
2487 1 << (LogicalDeviceInfo->CacheLineSize - 2));
2488 }
2489 DAC960_Info(" %s, %s\n", Controller,
2490 ReadCacheStatus[
2491 LogicalDeviceInfo->LogicalDeviceControl.ReadCache],
2492 WriteCacheStatus[
2493 LogicalDeviceInfo->LogicalDeviceControl.WriteCache]);
2494 if (LogicalDeviceInfo->SoftErrors > 0 ||
2495 LogicalDeviceInfo->CommandsFailed > 0 ||
2496 LogicalDeviceInfo->DeferredWriteErrors)
2497 DAC960_Info(" Errors - Soft: %d, Failed: %d, "
2498 "Deferred Write: %d\n", Controller,
2499 LogicalDeviceInfo->SoftErrors,
2500 LogicalDeviceInfo->CommandsFailed,
2501 LogicalDeviceInfo->DeferredWriteErrors);
2502
2503 }
2504 return true;
2505}
2506
2507
2508
2509
2510
2511
2512static bool DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
2513{
2514 int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2515 int n;
2516
2517
2518
2519
2520 if (register_blkdev(MajorNumber, "dac960") < 0)
2521 return false;
2522
2523 for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
2524 struct gendisk *disk = Controller->disks[n];
2525 struct request_queue *RequestQueue;
2526
2527
2528 RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
2529 if (!RequestQueue) {
2530 printk("DAC960: failure to allocate request queue\n");
2531 continue;
2532 }
2533 Controller->RequestQueue[n] = RequestQueue;
2534 blk_queue_bounce_limit(RequestQueue, Controller->BounceBufferLimit);
2535 RequestQueue->queuedata = Controller;
2536 blk_queue_max_segments(RequestQueue, Controller->DriverScatterGatherLimit);
2537 blk_queue_max_hw_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
2538 disk->queue = RequestQueue;
2539 sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
2540 disk->major = MajorNumber;
2541 disk->first_minor = n << DAC960_MaxPartitionsBits;
2542 disk->fops = &DAC960_BlockDeviceOperations;
2543 }
2544
2545
2546
2547 return true;
2548}
2549
2550
2551
2552
2553
2554
2555
2556static void DAC960_UnregisterBlockDevice(DAC960_Controller_T *Controller)
2557{
2558 int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2559 int disk;
2560
2561
2562 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
2563 del_gendisk(Controller->disks[disk]);
2564 blk_cleanup_queue(Controller->RequestQueue[disk]);
2565 Controller->RequestQueue[disk] = NULL;
2566 }
2567
2568
2569
2570
2571 unregister_blkdev(MajorNumber, "dac960");
2572}
2573
2574
2575
2576
2577
2578
2579static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
2580{
2581 int disk;
2582 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
2583 set_capacity(Controller->disks[disk], disk_size(Controller, disk));
2584}
2585
2586
2587
2588
2589
2590
2591
2592static bool DAC960_ReportErrorStatus(DAC960_Controller_T *Controller,
2593 unsigned char ErrorStatus,
2594 unsigned char Parameter0,
2595 unsigned char Parameter1)
2596{
2597 switch (ErrorStatus)
2598 {
2599 case 0x00:
2600 DAC960_Notice("Physical Device %d:%d Not Responding\n",
2601 Controller, Parameter1, Parameter0);
2602 break;
2603 case 0x08:
2604 if (Controller->DriveSpinUpMessageDisplayed) break;
2605 DAC960_Notice("Spinning Up Drives\n", Controller);
2606 Controller->DriveSpinUpMessageDisplayed = true;
2607 break;
2608 case 0x30:
2609 DAC960_Notice("Configuration Checksum Error\n", Controller);
2610 break;
2611 case 0x60:
2612 DAC960_Notice("Mirror Race Recovery Failed\n", Controller);
2613 break;
2614 case 0x70:
2615 DAC960_Notice("Mirror Race Recovery In Progress\n", Controller);
2616 break;
2617 case 0x90:
2618 DAC960_Notice("Physical Device %d:%d COD Mismatch\n",
2619 Controller, Parameter1, Parameter0);
2620 break;
2621 case 0xA0:
2622 DAC960_Notice("Logical Drive Installation Aborted\n", Controller);
2623 break;
2624 case 0xB0:
2625 DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller);
2626 break;
2627 case 0xD0:
2628 DAC960_Notice("New Controller Configuration Found\n", Controller);
2629 break;
2630 case 0xF0:
2631 DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller);
2632 return true;
2633 default:
2634 DAC960_Error("Unknown Initialization Error %02X for Controller at\n",
2635 Controller, ErrorStatus);
2636 return true;
2637 }
2638 return false;
2639}
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651static void DAC960_DetectCleanup(DAC960_Controller_T *Controller)
2652{
2653 int i;
2654
2655
2656 free_dma_loaf(Controller->PCIDevice, &Controller->DmaPages);
2657 if (Controller->MemoryMappedAddress) {
2658 switch(Controller->HardwareType)
2659 {
2660 case DAC960_GEM_Controller:
2661 DAC960_GEM_DisableInterrupts(Controller->BaseAddress);
2662 break;
2663 case DAC960_BA_Controller:
2664 DAC960_BA_DisableInterrupts(Controller->BaseAddress);
2665 break;
2666 case DAC960_LP_Controller:
2667 DAC960_LP_DisableInterrupts(Controller->BaseAddress);
2668 break;
2669 case DAC960_LA_Controller:
2670 DAC960_LA_DisableInterrupts(Controller->BaseAddress);
2671 break;
2672 case DAC960_PG_Controller:
2673 DAC960_PG_DisableInterrupts(Controller->BaseAddress);
2674 break;
2675 case DAC960_PD_Controller:
2676 DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2677 break;
2678 case DAC960_P_Controller:
2679 DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2680 break;
2681 }
2682 iounmap(Controller->MemoryMappedAddress);
2683 }
2684 if (Controller->IRQ_Channel)
2685 free_irq(Controller->IRQ_Channel, Controller);
2686 if (Controller->IO_Address)
2687 release_region(Controller->IO_Address, 0x80);
2688 pci_disable_device(Controller->PCIDevice);
2689 for (i = 0; (i < DAC960_MaxLogicalDrives) && Controller->disks[i]; i++)
2690 put_disk(Controller->disks[i]);
2691 DAC960_Controllers[Controller->ControllerNumber] = NULL;
2692 kfree(Controller);
2693}
2694
2695
2696
2697
2698
2699
2700
2701
2702static DAC960_Controller_T *
2703DAC960_DetectController(struct pci_dev *PCI_Device,
2704 const struct pci_device_id *entry)
2705{
2706 struct DAC960_privdata *privdata =
2707 (struct DAC960_privdata *)entry->driver_data;
2708 irq_handler_t InterruptHandler = privdata->InterruptHandler;
2709 unsigned int MemoryWindowSize = privdata->MemoryWindowSize;
2710 DAC960_Controller_T *Controller = NULL;
2711 unsigned char DeviceFunction = PCI_Device->devfn;
2712 unsigned char ErrorStatus, Parameter0, Parameter1;
2713 unsigned int IRQ_Channel;
2714 void __iomem *BaseAddress;
2715 int i;
2716
2717 Controller = kzalloc(sizeof(DAC960_Controller_T), GFP_ATOMIC);
2718 if (Controller == NULL) {
2719 DAC960_Error("Unable to allocate Controller structure for "
2720 "Controller at\n", NULL);
2721 return NULL;
2722 }
2723 Controller->ControllerNumber = DAC960_ControllerCount;
2724 DAC960_Controllers[DAC960_ControllerCount++] = Controller;
2725 Controller->Bus = PCI_Device->bus->number;
2726 Controller->FirmwareType = privdata->FirmwareType;
2727 Controller->HardwareType = privdata->HardwareType;
2728 Controller->Device = DeviceFunction >> 3;
2729 Controller->Function = DeviceFunction & 0x7;
2730 Controller->PCIDevice = PCI_Device;
2731 strcpy(Controller->FullModelName, "DAC960");
2732
2733 if (pci_enable_device(PCI_Device))
2734 goto Failure;
2735
2736 switch (Controller->HardwareType)
2737 {
2738 case DAC960_GEM_Controller:
2739 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2740 break;
2741 case DAC960_BA_Controller:
2742 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2743 break;
2744 case DAC960_LP_Controller:
2745 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2746 break;
2747 case DAC960_LA_Controller:
2748 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2749 break;
2750 case DAC960_PG_Controller:
2751 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2752 break;
2753 case DAC960_PD_Controller:
2754 Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2755 Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2756 break;
2757 case DAC960_P_Controller:
2758 Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2759 Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2760 break;
2761 }
2762
2763 pci_set_drvdata(PCI_Device, (void *)((long)Controller->ControllerNumber));
2764 for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
2765 Controller->disks[i] = alloc_disk(1<<DAC960_MaxPartitionsBits);
2766 if (!Controller->disks[i])
2767 goto Failure;
2768 Controller->disks[i]->private_data = (void *)((long)i);
2769 }
2770 init_waitqueue_head(&Controller->CommandWaitQueue);
2771 init_waitqueue_head(&Controller->HealthStatusWaitQueue);
2772 spin_lock_init(&Controller->queue_lock);
2773 DAC960_AnnounceDriver(Controller);
2774
2775
2776
2777 if (MemoryWindowSize < PAGE_SIZE)
2778 MemoryWindowSize = PAGE_SIZE;
2779 Controller->MemoryMappedAddress =
2780 ioremap_nocache(Controller->PCI_Address & PAGE_MASK, MemoryWindowSize);
2781 Controller->BaseAddress =
2782 Controller->MemoryMappedAddress + (Controller->PCI_Address & ~PAGE_MASK);
2783 if (Controller->MemoryMappedAddress == NULL)
2784 {
2785 DAC960_Error("Unable to map Controller Register Window for "
2786 "Controller at\n", Controller);
2787 goto Failure;
2788 }
2789 BaseAddress = Controller->BaseAddress;
2790 switch (Controller->HardwareType)
2791 {
2792 case DAC960_GEM_Controller:
2793 DAC960_GEM_DisableInterrupts(BaseAddress);
2794 DAC960_GEM_AcknowledgeHardwareMailboxStatus(BaseAddress);
2795 udelay(1000);
2796 while (DAC960_GEM_InitializationInProgressP(BaseAddress))
2797 {
2798 if (DAC960_GEM_ReadErrorStatus(BaseAddress, &ErrorStatus,
2799 &Parameter0, &Parameter1) &&
2800 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2801 Parameter0, Parameter1))
2802 goto Failure;
2803 udelay(10);
2804 }
2805 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2806 {
2807 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2808 "for Controller at\n", Controller);
2809 goto Failure;
2810 }
2811 DAC960_GEM_EnableInterrupts(BaseAddress);
2812 Controller->QueueCommand = DAC960_GEM_QueueCommand;
2813 Controller->ReadControllerConfiguration =
2814 DAC960_V2_ReadControllerConfiguration;
2815 Controller->ReadDeviceConfiguration =
2816 DAC960_V2_ReadDeviceConfiguration;
2817 Controller->ReportDeviceConfiguration =
2818 DAC960_V2_ReportDeviceConfiguration;
2819 Controller->QueueReadWriteCommand =
2820 DAC960_V2_QueueReadWriteCommand;
2821 break;
2822 case DAC960_BA_Controller:
2823 DAC960_BA_DisableInterrupts(BaseAddress);
2824 DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2825 udelay(1000);
2826 while (DAC960_BA_InitializationInProgressP(BaseAddress))
2827 {
2828 if (DAC960_BA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2829 &Parameter0, &Parameter1) &&
2830 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2831 Parameter0, Parameter1))
2832 goto Failure;
2833 udelay(10);
2834 }
2835 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2836 {
2837 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2838 "for Controller at\n", Controller);
2839 goto Failure;
2840 }
2841 DAC960_BA_EnableInterrupts(BaseAddress);
2842 Controller->QueueCommand = DAC960_BA_QueueCommand;
2843 Controller->ReadControllerConfiguration =
2844 DAC960_V2_ReadControllerConfiguration;
2845 Controller->ReadDeviceConfiguration =
2846 DAC960_V2_ReadDeviceConfiguration;
2847 Controller->ReportDeviceConfiguration =
2848 DAC960_V2_ReportDeviceConfiguration;
2849 Controller->QueueReadWriteCommand =
2850 DAC960_V2_QueueReadWriteCommand;
2851 break;
2852 case DAC960_LP_Controller:
2853 DAC960_LP_DisableInterrupts(BaseAddress);
2854 DAC960_LP_AcknowledgeHardwareMailboxStatus(BaseAddress);
2855 udelay(1000);
2856 while (DAC960_LP_InitializationInProgressP(BaseAddress))
2857 {
2858 if (DAC960_LP_ReadErrorStatus(BaseAddress, &ErrorStatus,
2859 &Parameter0, &Parameter1) &&
2860 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2861 Parameter0, Parameter1))
2862 goto Failure;
2863 udelay(10);
2864 }
2865 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2866 {
2867 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2868 "for Controller at\n", Controller);
2869 goto Failure;
2870 }
2871 DAC960_LP_EnableInterrupts(BaseAddress);
2872 Controller->QueueCommand = DAC960_LP_QueueCommand;
2873 Controller->ReadControllerConfiguration =
2874 DAC960_V2_ReadControllerConfiguration;
2875 Controller->ReadDeviceConfiguration =
2876 DAC960_V2_ReadDeviceConfiguration;
2877 Controller->ReportDeviceConfiguration =
2878 DAC960_V2_ReportDeviceConfiguration;
2879 Controller->QueueReadWriteCommand =
2880 DAC960_V2_QueueReadWriteCommand;
2881 break;
2882 case DAC960_LA_Controller:
2883 DAC960_LA_DisableInterrupts(BaseAddress);
2884 DAC960_LA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2885 udelay(1000);
2886 while (DAC960_LA_InitializationInProgressP(BaseAddress))
2887 {
2888 if (DAC960_LA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2889 &Parameter0, &Parameter1) &&
2890 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2891 Parameter0, Parameter1))
2892 goto Failure;
2893 udelay(10);
2894 }
2895 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2896 {
2897 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2898 "for Controller at\n", Controller);
2899 goto Failure;
2900 }
2901 DAC960_LA_EnableInterrupts(BaseAddress);
2902 if (Controller->V1.DualModeMemoryMailboxInterface)
2903 Controller->QueueCommand = DAC960_LA_QueueCommandDualMode;
2904 else Controller->QueueCommand = DAC960_LA_QueueCommandSingleMode;
2905 Controller->ReadControllerConfiguration =
2906 DAC960_V1_ReadControllerConfiguration;
2907 Controller->ReadDeviceConfiguration =
2908 DAC960_V1_ReadDeviceConfiguration;
2909 Controller->ReportDeviceConfiguration =
2910 DAC960_V1_ReportDeviceConfiguration;
2911 Controller->QueueReadWriteCommand =
2912 DAC960_V1_QueueReadWriteCommand;
2913 break;
2914 case DAC960_PG_Controller:
2915 DAC960_PG_DisableInterrupts(BaseAddress);
2916 DAC960_PG_AcknowledgeHardwareMailboxStatus(BaseAddress);
2917 udelay(1000);
2918 while (DAC960_PG_InitializationInProgressP(BaseAddress))
2919 {
2920 if (DAC960_PG_ReadErrorStatus(BaseAddress, &ErrorStatus,
2921 &Parameter0, &Parameter1) &&
2922 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2923 Parameter0, Parameter1))
2924 goto Failure;
2925 udelay(10);
2926 }
2927 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2928 {
2929 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2930 "for Controller at\n", Controller);
2931 goto Failure;
2932 }
2933 DAC960_PG_EnableInterrupts(BaseAddress);
2934 if (Controller->V1.DualModeMemoryMailboxInterface)
2935 Controller->QueueCommand = DAC960_PG_QueueCommandDualMode;
2936 else Controller->QueueCommand = DAC960_PG_QueueCommandSingleMode;
2937 Controller->ReadControllerConfiguration =
2938 DAC960_V1_ReadControllerConfiguration;
2939 Controller->ReadDeviceConfiguration =
2940 DAC960_V1_ReadDeviceConfiguration;
2941 Controller->ReportDeviceConfiguration =
2942 DAC960_V1_ReportDeviceConfiguration;
2943 Controller->QueueReadWriteCommand =
2944 DAC960_V1_QueueReadWriteCommand;
2945 break;
2946 case DAC960_PD_Controller:
2947 if (!request_region(Controller->IO_Address, 0x80,
2948 Controller->FullModelName)) {
2949 DAC960_Error("IO port 0x%d busy for Controller at\n",
2950 Controller, Controller->IO_Address);
2951 goto Failure;
2952 }
2953 DAC960_PD_DisableInterrupts(BaseAddress);
2954 DAC960_PD_AcknowledgeStatus(BaseAddress);
2955 udelay(1000);
2956 while (DAC960_PD_InitializationInProgressP(BaseAddress))
2957 {
2958 if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
2959 &Parameter0, &Parameter1) &&
2960 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2961 Parameter0, Parameter1))
2962 goto Failure;
2963 udelay(10);
2964 }
2965 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2966 {
2967 DAC960_Error("Unable to allocate DMA mapped memory "
2968 "for Controller at\n", Controller);
2969 goto Failure;
2970 }
2971 DAC960_PD_EnableInterrupts(BaseAddress);
2972 Controller->QueueCommand = DAC960_PD_QueueCommand;
2973 Controller->ReadControllerConfiguration =
2974 DAC960_V1_ReadControllerConfiguration;
2975 Controller->ReadDeviceConfiguration =
2976 DAC960_V1_ReadDeviceConfiguration;
2977 Controller->ReportDeviceConfiguration =
2978 DAC960_V1_ReportDeviceConfiguration;
2979 Controller->QueueReadWriteCommand =
2980 DAC960_V1_QueueReadWriteCommand;
2981 break;
2982 case DAC960_P_Controller:
2983 if (!request_region(Controller->IO_Address, 0x80,
2984 Controller->FullModelName)){
2985 DAC960_Error("IO port 0x%d busy for Controller at\n",
2986 Controller, Controller->IO_Address);
2987 goto Failure;
2988 }
2989 DAC960_PD_DisableInterrupts(BaseAddress);
2990 DAC960_PD_AcknowledgeStatus(BaseAddress);
2991 udelay(1000);
2992 while (DAC960_PD_InitializationInProgressP(BaseAddress))
2993 {
2994 if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
2995 &Parameter0, &Parameter1) &&
2996 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2997 Parameter0, Parameter1))
2998 goto Failure;
2999 udelay(10);
3000 }
3001 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
3002 {
3003 DAC960_Error("Unable to allocate DMA mapped memory"
3004 "for Controller at\n", Controller);
3005 goto Failure;
3006 }
3007 DAC960_PD_EnableInterrupts(BaseAddress);
3008 Controller->QueueCommand = DAC960_P_QueueCommand;
3009 Controller->ReadControllerConfiguration =
3010 DAC960_V1_ReadControllerConfiguration;
3011 Controller->ReadDeviceConfiguration =
3012 DAC960_V1_ReadDeviceConfiguration;
3013 Controller->ReportDeviceConfiguration =
3014 DAC960_V1_ReportDeviceConfiguration;
3015 Controller->QueueReadWriteCommand =
3016 DAC960_V1_QueueReadWriteCommand;
3017 break;
3018 }
3019
3020
3021
3022 IRQ_Channel = PCI_Device->irq;
3023 if (request_irq(IRQ_Channel, InterruptHandler, IRQF_SHARED,
3024 Controller->FullModelName, Controller) < 0)
3025 {
3026 DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n",
3027 Controller, Controller->IRQ_Channel);
3028 goto Failure;
3029 }
3030 Controller->IRQ_Channel = IRQ_Channel;
3031 Controller->InitialCommand.CommandIdentifier = 1;
3032 Controller->InitialCommand.Controller = Controller;
3033 Controller->Commands[0] = &Controller->InitialCommand;
3034 Controller->FreeCommands = &Controller->InitialCommand;
3035 return Controller;
3036
3037Failure:
3038 if (Controller->IO_Address == 0)
3039 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
3040 "PCI Address 0x%X\n", Controller,
3041 Controller->Bus, Controller->Device,
3042 Controller->Function, Controller->PCI_Address);
3043 else
3044 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
3045 "0x%X PCI Address 0x%X\n", Controller,
3046 Controller->Bus, Controller->Device,
3047 Controller->Function, Controller->IO_Address,
3048 Controller->PCI_Address);
3049 DAC960_DetectCleanup(Controller);
3050 DAC960_ControllerCount--;
3051 return NULL;
3052}
3053
3054
3055
3056
3057
3058static bool
3059DAC960_InitializeController(DAC960_Controller_T *Controller)
3060{
3061 if (DAC960_ReadControllerConfiguration(Controller) &&
3062 DAC960_ReportControllerConfiguration(Controller) &&
3063 DAC960_CreateAuxiliaryStructures(Controller) &&
3064 DAC960_ReadDeviceConfiguration(Controller) &&
3065 DAC960_ReportDeviceConfiguration(Controller) &&
3066 DAC960_RegisterBlockDevice(Controller))
3067 {
3068
3069
3070
3071 init_timer(&Controller->MonitoringTimer);
3072 Controller->MonitoringTimer.expires =
3073 jiffies + DAC960_MonitoringTimerInterval;
3074 Controller->MonitoringTimer.data = (unsigned long) Controller;
3075 Controller->MonitoringTimer.function = DAC960_MonitoringTimerFunction;
3076 add_timer(&Controller->MonitoringTimer);
3077 Controller->ControllerInitialized = true;
3078 return true;
3079 }
3080 return false;
3081}
3082
3083
3084
3085
3086
3087
3088static void DAC960_FinalizeController(DAC960_Controller_T *Controller)
3089{
3090 if (Controller->ControllerInitialized)
3091 {
3092 unsigned long flags;
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111 spin_lock_irqsave(&Controller->queue_lock, flags);
3112 Controller->ShutdownMonitoringTimer = 1;
3113 spin_unlock_irqrestore(&Controller->queue_lock, flags);
3114
3115 del_timer_sync(&Controller->MonitoringTimer);
3116 if (Controller->FirmwareType == DAC960_V1_Controller)
3117 {
3118 DAC960_Notice("Flushing Cache...", Controller);
3119 DAC960_V1_ExecuteType3(Controller, DAC960_V1_Flush, 0);
3120 DAC960_Notice("done\n", Controller);
3121
3122 if (Controller->HardwareType == DAC960_PD_Controller)
3123 release_region(Controller->IO_Address, 0x80);
3124 }
3125 else
3126 {
3127 DAC960_Notice("Flushing Cache...", Controller);
3128 DAC960_V2_DeviceOperation(Controller, DAC960_V2_PauseDevice,
3129 DAC960_V2_RAID_Controller);
3130 DAC960_Notice("done\n", Controller);
3131 }
3132 }
3133 DAC960_UnregisterBlockDevice(Controller);
3134 DAC960_DestroyAuxiliaryStructures(Controller);
3135 DAC960_DestroyProcEntries(Controller);
3136 DAC960_DetectCleanup(Controller);
3137}
3138
3139
3140
3141
3142
3143
3144
3145static int
3146DAC960_Probe(struct pci_dev *dev, const struct pci_device_id *entry)
3147{
3148 int disk;
3149 DAC960_Controller_T *Controller;
3150
3151 if (DAC960_ControllerCount == DAC960_MaxControllers)
3152 {
3153 DAC960_Error("More than %d DAC960 Controllers detected - "
3154 "ignoring from Controller at\n",
3155 NULL, DAC960_MaxControllers);
3156 return -ENODEV;
3157 }
3158
3159 Controller = DAC960_DetectController(dev, entry);
3160 if (!Controller)
3161 return -ENODEV;
3162
3163 if (!DAC960_InitializeController(Controller)) {
3164 DAC960_FinalizeController(Controller);
3165 return -ENODEV;
3166 }
3167
3168 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
3169 set_capacity(Controller->disks[disk], disk_size(Controller, disk));
3170 add_disk(Controller->disks[disk]);
3171 }
3172 DAC960_CreateProcEntries(Controller);
3173 return 0;
3174}
3175
3176
3177
3178
3179
3180
3181static void DAC960_Remove(struct pci_dev *PCI_Device)
3182{
3183 int Controller_Number = (long)pci_get_drvdata(PCI_Device);
3184 DAC960_Controller_T *Controller = DAC960_Controllers[Controller_Number];
3185 if (Controller != NULL)
3186 DAC960_FinalizeController(Controller);
3187}
3188
3189
3190
3191
3192
3193
3194
3195static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *Command)
3196{
3197 DAC960_Controller_T *Controller = Command->Controller;
3198 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
3199 DAC960_V1_ScatterGatherSegment_T *ScatterGatherList =
3200 Command->V1.ScatterGatherList;
3201 struct scatterlist *ScatterList = Command->V1.ScatterList;
3202
3203 DAC960_V1_ClearCommand(Command);
3204
3205 if (Command->SegmentCount == 1)
3206 {
3207 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3208 CommandMailbox->Type5.CommandOpcode = DAC960_V1_Read;
3209 else
3210 CommandMailbox->Type5.CommandOpcode = DAC960_V1_Write;
3211
3212 CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3213 CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3214 CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3215 CommandMailbox->Type5.BusAddress =
3216 (DAC960_BusAddress32_T)sg_dma_address(ScatterList);
3217 }
3218 else
3219 {
3220 int i;
3221
3222 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3223 CommandMailbox->Type5.CommandOpcode = DAC960_V1_ReadWithScatterGather;
3224 else
3225 CommandMailbox->Type5.CommandOpcode = DAC960_V1_WriteWithScatterGather;
3226
3227 CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3228 CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3229 CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3230 CommandMailbox->Type5.BusAddress = Command->V1.ScatterGatherListDMA;
3231
3232 CommandMailbox->Type5.ScatterGatherCount = Command->SegmentCount;
3233
3234 for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3235 ScatterGatherList->SegmentDataPointer =
3236 (DAC960_BusAddress32_T)sg_dma_address(ScatterList);
3237 ScatterGatherList->SegmentByteCount =
3238 (DAC960_ByteCount32_T)sg_dma_len(ScatterList);
3239 }
3240 }
3241 DAC960_QueueCommand(Command);
3242}
3243
3244
3245
3246
3247
3248
3249
3250static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *Command)
3251{
3252 DAC960_Controller_T *Controller = Command->Controller;
3253 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
3254 struct scatterlist *ScatterList = Command->V2.ScatterList;
3255
3256 DAC960_V2_ClearCommand(Command);
3257
3258 CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10;
3259 CommandMailbox->SCSI_10.CommandControlBits.DataTransferControllerToHost =
3260 (Command->DmaDirection == PCI_DMA_FROMDEVICE);
3261 CommandMailbox->SCSI_10.DataTransferSize =
3262 Command->BlockCount << DAC960_BlockSizeBits;
3263 CommandMailbox->SCSI_10.RequestSenseBusAddress = Command->V2.RequestSenseDMA;
3264 CommandMailbox->SCSI_10.PhysicalDevice =
3265 Controller->V2.LogicalDriveToVirtualDevice[Command->LogicalDriveNumber];
3266 CommandMailbox->SCSI_10.RequestSenseSize = sizeof(DAC960_SCSI_RequestSense_T);
3267 CommandMailbox->SCSI_10.CDBLength = 10;
3268 CommandMailbox->SCSI_10.SCSI_CDB[0] =
3269 (Command->DmaDirection == PCI_DMA_FROMDEVICE ? 0x28 : 0x2A);
3270 CommandMailbox->SCSI_10.SCSI_CDB[2] = Command->BlockNumber >> 24;
3271 CommandMailbox->SCSI_10.SCSI_CDB[3] = Command->BlockNumber >> 16;
3272 CommandMailbox->SCSI_10.SCSI_CDB[4] = Command->BlockNumber >> 8;
3273 CommandMailbox->SCSI_10.SCSI_CDB[5] = Command->BlockNumber;
3274 CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8;
3275 CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount;
3276
3277 if (Command->SegmentCount == 1)
3278 {
3279 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3280 .ScatterGatherSegments[0]
3281 .SegmentDataPointer =
3282 (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3283 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3284 .ScatterGatherSegments[0]
3285 .SegmentByteCount =
3286 CommandMailbox->SCSI_10.DataTransferSize;
3287 }
3288 else
3289 {
3290 DAC960_V2_ScatterGatherSegment_T *ScatterGatherList;
3291 int i;
3292
3293 if (Command->SegmentCount > 2)
3294 {
3295 ScatterGatherList = Command->V2.ScatterGatherList;
3296 CommandMailbox->SCSI_10.CommandControlBits
3297 .AdditionalScatterGatherListMemory = true;
3298 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3299 .ExtendedScatterGather.ScatterGatherList0Length = Command->SegmentCount;
3300 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3301 .ExtendedScatterGather.ScatterGatherList0Address =
3302 Command->V2.ScatterGatherListDMA;
3303 }
3304 else
3305 ScatterGatherList = CommandMailbox->SCSI_10.DataTransferMemoryAddress
3306 .ScatterGatherSegments;
3307
3308 for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3309 ScatterGatherList->SegmentDataPointer =
3310 (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3311 ScatterGatherList->SegmentByteCount =
3312 (DAC960_ByteCount64_T)sg_dma_len(ScatterList);
3313 }
3314 }
3315 DAC960_QueueCommand(Command);
3316}
3317
3318
3319static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
3320{
3321 struct request *Request;
3322 DAC960_Command_T *Command;
3323
3324 while(1) {
3325 Request = blk_peek_request(req_q);
3326 if (!Request)
3327 return 1;
3328
3329 Command = DAC960_AllocateCommand(Controller);
3330 if (Command == NULL)
3331 return 0;
3332
3333 if (rq_data_dir(Request) == READ) {
3334 Command->DmaDirection = PCI_DMA_FROMDEVICE;
3335 Command->CommandType = DAC960_ReadCommand;
3336 } else {
3337 Command->DmaDirection = PCI_DMA_TODEVICE;
3338 Command->CommandType = DAC960_WriteCommand;
3339 }
3340 Command->Completion = Request->end_io_data;
3341 Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
3342 Command->BlockNumber = blk_rq_pos(Request);
3343 Command->BlockCount = blk_rq_sectors(Request);
3344 Command->Request = Request;
3345 blk_start_request(Request);
3346 Command->SegmentCount = blk_rq_map_sg(req_q,
3347 Command->Request, Command->cmd_sglist);
3348
3349 Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
3350 Command->SegmentCount, Command->DmaDirection);
3351
3352 DAC960_QueueReadWriteCommand(Command);
3353 }
3354}
3355
3356
3357
3358
3359
3360
3361
3362static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
3363{
3364 int i;
3365
3366 if (!controller->ControllerInitialized)
3367 return;
3368
3369
3370 for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
3371 struct request_queue *req_q = controller->RequestQueue[i];
3372
3373 if (req_q == NULL)
3374 continue;
3375
3376 if (!DAC960_process_queue(controller, req_q)) {
3377 controller->req_q_index = i;
3378 return;
3379 }
3380 }
3381
3382 if (controller->req_q_index == 0)
3383 return;
3384
3385 for (i = 0; i < controller->req_q_index; i++) {
3386 struct request_queue *req_q = controller->RequestQueue[i];
3387
3388 if (req_q == NULL)
3389 continue;
3390
3391 if (!DAC960_process_queue(controller, req_q)) {
3392 controller->req_q_index = i;
3393 return;
3394 }
3395 }
3396}
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408static void DAC960_queue_partial_rw(DAC960_Command_T *Command)
3409{
3410 DAC960_Controller_T *Controller = Command->Controller;
3411 struct request *Request = Command->Request;
3412 struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
3413
3414 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3415 Command->CommandType = DAC960_ReadRetryCommand;
3416 else
3417 Command->CommandType = DAC960_WriteRetryCommand;
3418
3419
3420
3421
3422
3423
3424
3425 (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
3426
3427 (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
3428
3429
3430
3431
3432
3433
3434 Command->SegmentCount = 1;
3435 Command->BlockNumber = blk_rq_pos(Request);
3436 Command->BlockCount = 1;
3437 DAC960_QueueReadWriteCommand(Command);
3438 return;
3439}
3440
3441
3442
3443
3444
3445static void DAC960_RequestFunction(struct request_queue *RequestQueue)
3446{
3447 DAC960_ProcessRequest(RequestQueue->queuedata);
3448}
3449
3450
3451
3452
3453
3454
3455static inline bool DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
3456 bool SuccessfulIO)
3457{
3458 struct request *Request = Command->Request;
3459 int Error = SuccessfulIO ? 0 : -EIO;
3460
3461 pci_unmap_sg(Command->Controller->PCIDevice, Command->cmd_sglist,
3462 Command->SegmentCount, Command->DmaDirection);
3463
3464 if (!__blk_end_request(Request, Error, Command->BlockCount << 9)) {
3465 if (Command->Completion) {
3466 complete(Command->Completion);
3467 Command->Completion = NULL;
3468 }
3469 return true;
3470 }
3471 return false;
3472}
3473
3474
3475
3476
3477
3478
3479static void DAC960_V1_ReadWriteError(DAC960_Command_T *Command)
3480{
3481 DAC960_Controller_T *Controller = Command->Controller;
3482 unsigned char *CommandName = "UNKNOWN";
3483 switch (Command->CommandType)
3484 {
3485 case DAC960_ReadCommand:
3486 case DAC960_ReadRetryCommand:
3487 CommandName = "READ";
3488 break;
3489 case DAC960_WriteCommand:
3490 case DAC960_WriteRetryCommand:
3491 CommandName = "WRITE";
3492 break;
3493 case DAC960_MonitoringCommand:
3494 case DAC960_ImmediateCommand:
3495 case DAC960_QueuedCommand:
3496 break;
3497 }
3498 switch (Command->V1.CommandStatus)
3499 {
3500 case DAC960_V1_IrrecoverableDataError:
3501 DAC960_Error("Irrecoverable Data Error on %s:\n",
3502 Controller, CommandName);
3503 break;
3504 case DAC960_V1_LogicalDriveNonexistentOrOffline:
3505 DAC960_Error("Logical Drive Nonexistent or Offline on %s:\n",
3506 Controller, CommandName);
3507 break;
3508 case DAC960_V1_AccessBeyondEndOfLogicalDrive:
3509 DAC960_Error("Attempt to Access Beyond End of Logical Drive "
3510 "on %s:\n", Controller, CommandName);
3511 break;
3512 case DAC960_V1_BadDataEncountered:
3513 DAC960_Error("Bad Data Encountered on %s:\n", Controller, CommandName);
3514 break;
3515 default:
3516 DAC960_Error("Unexpected Error Status %04X on %s:\n",
3517 Controller, Command->V1.CommandStatus, CommandName);
3518 break;
3519 }
3520 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
3521 Controller, Controller->ControllerNumber,
3522 Command->LogicalDriveNumber, Command->BlockNumber,
3523 Command->BlockNumber + Command->BlockCount - 1);
3524}
3525
3526
3527
3528
3529
3530
3531
3532static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T *Command)
3533{
3534 DAC960_Controller_T *Controller = Command->Controller;
3535 DAC960_CommandType_T CommandType = Command->CommandType;
3536 DAC960_V1_CommandOpcode_T CommandOpcode =
3537 Command->V1.CommandMailbox.Common.CommandOpcode;
3538 DAC960_V1_CommandStatus_T CommandStatus = Command->V1.CommandStatus;
3539
3540 if (CommandType == DAC960_ReadCommand ||
3541 CommandType == DAC960_WriteCommand)
3542 {
3543
3544#ifdef FORCE_RETRY_DEBUG
3545 CommandStatus = DAC960_V1_IrrecoverableDataError;
3546#endif
3547
3548 if (CommandStatus == DAC960_V1_NormalCompletion) {
3549
3550 if (!DAC960_ProcessCompletedRequest(Command, true))
3551 BUG();
3552
3553 } else if (CommandStatus == DAC960_V1_IrrecoverableDataError ||
3554 CommandStatus == DAC960_V1_BadDataEncountered)
3555 {
3556
3557
3558
3559
3560 DAC960_queue_partial_rw(Command);
3561 return;
3562 }
3563 else
3564 {
3565 if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3566 DAC960_V1_ReadWriteError(Command);
3567
3568 if (!DAC960_ProcessCompletedRequest(Command, false))
3569 BUG();
3570 }
3571 }
3572 else if (CommandType == DAC960_ReadRetryCommand ||
3573 CommandType == DAC960_WriteRetryCommand)
3574 {
3575 bool normal_completion;
3576#ifdef FORCE_RETRY_FAILURE_DEBUG
3577 static int retry_count = 1;
3578#endif
3579
3580
3581
3582
3583 normal_completion = true;
3584 if (CommandStatus != DAC960_V1_NormalCompletion) {
3585 normal_completion = false;
3586 if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3587 DAC960_V1_ReadWriteError(Command);
3588 }
3589
3590#ifdef FORCE_RETRY_FAILURE_DEBUG
3591 if (!(++retry_count % 10000)) {
3592 printk("V1 error retry failure test\n");
3593 normal_completion = false;
3594 DAC960_V1_ReadWriteError(Command);
3595 }
3596#endif
3597
3598 if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
3599 DAC960_queue_partial_rw(Command);
3600 return;
3601 }
3602 }
3603
3604 else if (CommandType == DAC960_MonitoringCommand)
3605 {
3606 if (Controller->ShutdownMonitoringTimer)
3607 return;
3608 if (CommandOpcode == DAC960_V1_Enquiry)
3609 {
3610 DAC960_V1_Enquiry_T *OldEnquiry = &Controller->V1.Enquiry;
3611 DAC960_V1_Enquiry_T *NewEnquiry = Controller->V1.NewEnquiry;
3612 unsigned int OldCriticalLogicalDriveCount =
3613 OldEnquiry->CriticalLogicalDriveCount;
3614 unsigned int NewCriticalLogicalDriveCount =
3615 NewEnquiry->CriticalLogicalDriveCount;
3616 if (NewEnquiry->NumberOfLogicalDrives > Controller->LogicalDriveCount)
3617 {
3618 int LogicalDriveNumber = Controller->LogicalDriveCount - 1;
3619 while (++LogicalDriveNumber < NewEnquiry->NumberOfLogicalDrives)
3620 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3621 "Now Exists\n", Controller,
3622 LogicalDriveNumber,
3623 Controller->ControllerNumber,
3624 LogicalDriveNumber);
3625 Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3626 DAC960_ComputeGenericDiskInfo(Controller);
3627 }
3628 if (NewEnquiry->NumberOfLogicalDrives < Controller->LogicalDriveCount)
3629 {
3630 int LogicalDriveNumber = NewEnquiry->NumberOfLogicalDrives - 1;
3631 while (++LogicalDriveNumber < Controller->LogicalDriveCount)
3632 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3633 "No Longer Exists\n", Controller,
3634 LogicalDriveNumber,
3635 Controller->ControllerNumber,
3636 LogicalDriveNumber);
3637 Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3638 DAC960_ComputeGenericDiskInfo(Controller);
3639 }
3640 if (NewEnquiry->StatusFlags.DeferredWriteError !=
3641 OldEnquiry->StatusFlags.DeferredWriteError)
3642 DAC960_Critical("Deferred Write Error Flag is now %s\n", Controller,
3643 (NewEnquiry->StatusFlags.DeferredWriteError
3644 ? "TRUE" : "FALSE"));
3645 if ((NewCriticalLogicalDriveCount > 0 ||
3646 NewCriticalLogicalDriveCount != OldCriticalLogicalDriveCount) ||
3647 (NewEnquiry->OfflineLogicalDriveCount > 0 ||
3648 NewEnquiry->OfflineLogicalDriveCount !=
3649 OldEnquiry->OfflineLogicalDriveCount) ||
3650 (NewEnquiry->DeadDriveCount > 0 ||
3651 NewEnquiry->DeadDriveCount !=
3652 OldEnquiry->DeadDriveCount) ||
3653 (NewEnquiry->EventLogSequenceNumber !=
3654 OldEnquiry->EventLogSequenceNumber) ||
3655 Controller->MonitoringTimerCount == 0 ||
3656 time_after_eq(jiffies, Controller->SecondaryMonitoringTime
3657 + DAC960_SecondaryMonitoringInterval))
3658 {
3659 Controller->V1.NeedLogicalDriveInformation = true;
3660 Controller->V1.NewEventLogSequenceNumber =
3661 NewEnquiry->EventLogSequenceNumber;
3662 Controller->V1.NeedErrorTableInformation = true;
3663 Controller->V1.NeedDeviceStateInformation = true;
3664 Controller->V1.StartDeviceStateScan = true;
3665 Controller->V1.NeedBackgroundInitializationStatus =
3666 Controller->V1.BackgroundInitializationStatusSupported;
3667 Controller->SecondaryMonitoringTime = jiffies;
3668 }
3669 if (NewEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3670 NewEnquiry->RebuildFlag
3671 == DAC960_V1_BackgroundRebuildInProgress ||
3672 OldEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3673 OldEnquiry->RebuildFlag == DAC960_V1_BackgroundRebuildInProgress)
3674 {
3675 Controller->V1.NeedRebuildProgress = true;
3676 Controller->V1.RebuildProgressFirst =
3677 (NewEnquiry->CriticalLogicalDriveCount <
3678 OldEnquiry->CriticalLogicalDriveCount);
3679 }
3680 if (OldEnquiry->RebuildFlag == DAC960_V1_BackgroundCheckInProgress)
3681 switch (NewEnquiry->RebuildFlag)
3682 {
3683 case DAC960_V1_NoStandbyRebuildOrCheckInProgress:
3684 DAC960_Progress("Consistency Check Completed Successfully\n",
3685 Controller);
3686 break;
3687 case DAC960_V1_StandbyRebuildInProgress:
3688 case DAC960_V1_BackgroundRebuildInProgress:
3689 break;
3690 case DAC960_V1_BackgroundCheckInProgress:
3691 Controller->V1.NeedConsistencyCheckProgress = true;
3692 break;
3693 case DAC960_V1_StandbyRebuildCompletedWithError:
3694 DAC960_Progress("Consistency Check Completed with Error\n",
3695 Controller);
3696 break;
3697 case DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed:
3698 DAC960_Progress("Consistency Check Failed - "
3699 "Physical Device Failed\n", Controller);
3700 break;
3701 case DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed:
3702 DAC960_Progress("Consistency Check Failed - "
3703 "Logical Drive Failed\n", Controller);
3704 break;
3705 case DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses:
3706 DAC960_Progress("Consistency Check Failed - Other Causes\n",
3707 Controller);
3708 break;
3709 case DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated:
3710 DAC960_Progress("Consistency Check Successfully Terminated\n",
3711 Controller);
3712 break;
3713 }
3714 else if (NewEnquiry->RebuildFlag
3715 == DAC960_V1_BackgroundCheckInProgress)
3716 Controller->V1.NeedConsistencyCheckProgress = true;
3717 Controller->MonitoringAlertMode =
3718 (NewEnquiry->CriticalLogicalDriveCount > 0 ||
3719 NewEnquiry->OfflineLogicalDriveCount > 0 ||
3720 NewEnquiry->DeadDriveCount > 0);
3721 if (NewEnquiry->RebuildFlag > DAC960_V1_BackgroundCheckInProgress)
3722 {
3723 Controller->V1.PendingRebuildFlag = NewEnquiry->RebuildFlag;
3724 Controller->V1.RebuildFlagPending = true;
3725 }
3726 memcpy(&Controller->V1.Enquiry, &Controller->V1.NewEnquiry,
3727 sizeof(DAC960_V1_Enquiry_T));
3728 }
3729 else if (CommandOpcode == DAC960_V1_PerformEventLogOperation)
3730 {
3731 static char
3732 *DAC960_EventMessages[] =
3733 { "killed because write recovery failed",
3734 "killed because of SCSI bus reset failure",
3735 "killed because of double check condition",
3736 "killed because it was removed",
3737 "killed because of gross error on SCSI chip",
3738 "killed because of bad tag returned from drive",
3739 "killed because of timeout on SCSI command",
3740 "killed because of reset SCSI command issued from system",
3741 "killed because busy or parity error count exceeded limit",
3742 "killed because of 'kill drive' command from system",
3743 "killed because of selection timeout",
3744 "killed due to SCSI phase sequence error",
3745 "killed due to unknown status" };
3746 DAC960_V1_EventLogEntry_T *EventLogEntry =
3747 Controller->V1.EventLogEntry;
3748 if (EventLogEntry->SequenceNumber ==
3749 Controller->V1.OldEventLogSequenceNumber)
3750 {
3751 unsigned char SenseKey = EventLogEntry->SenseKey;
3752 unsigned char AdditionalSenseCode =
3753 EventLogEntry->AdditionalSenseCode;
3754 unsigned char AdditionalSenseCodeQualifier =
3755 EventLogEntry->AdditionalSenseCodeQualifier;
3756 if (SenseKey == DAC960_SenseKey_VendorSpecific &&
3757 AdditionalSenseCode == 0x80 &&
3758 AdditionalSenseCodeQualifier <
3759 ARRAY_SIZE(DAC960_EventMessages))
3760 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
3761 EventLogEntry->Channel,
3762 EventLogEntry->TargetID,
3763 DAC960_EventMessages[
3764 AdditionalSenseCodeQualifier]);
3765 else if (SenseKey == DAC960_SenseKey_UnitAttention &&
3766 AdditionalSenseCode == 0x29)
3767 {
3768 if (Controller->MonitoringTimerCount > 0)
3769 Controller->V1.DeviceResetCount[EventLogEntry->Channel]
3770 [EventLogEntry->TargetID]++;
3771 }
3772 else if (!(SenseKey == DAC960_SenseKey_NoSense ||
3773 (SenseKey == DAC960_SenseKey_NotReady &&
3774 AdditionalSenseCode == 0x04 &&
3775 (AdditionalSenseCodeQualifier == 0x01 ||
3776 AdditionalSenseCodeQualifier == 0x02))))
3777 {
3778 DAC960_Critical("Physical Device %d:%d Error Log: "
3779 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
3780 Controller,
3781 EventLogEntry->Channel,
3782 EventLogEntry->TargetID,
3783 SenseKey,
3784 AdditionalSenseCode,
3785 AdditionalSenseCodeQualifier);
3786 DAC960_Critical("Physical Device %d:%d Error Log: "
3787 "Information = %02X%02X%02X%02X "
3788 "%02X%02X%02X%02X\n",
3789 Controller,
3790 EventLogEntry->Channel,
3791 EventLogEntry->TargetID,
3792 EventLogEntry->Information[0],
3793 EventLogEntry->Information[1],
3794 EventLogEntry->Information[2],
3795 EventLogEntry->Information[3],
3796 EventLogEntry->CommandSpecificInformation[0],
3797 EventLogEntry->CommandSpecificInformation[1],
3798 EventLogEntry->CommandSpecificInformation[2],
3799 EventLogEntry->CommandSpecificInformation[3]);
3800 }
3801 }
3802 Controller->V1.OldEventLogSequenceNumber++;
3803 }
3804 else if (CommandOpcode == DAC960_V1_GetErrorTable)
3805 {
3806 DAC960_V1_ErrorTable_T *OldErrorTable = &Controller->V1.ErrorTable;
3807 DAC960_V1_ErrorTable_T *NewErrorTable = Controller->V1.NewErrorTable;
3808 int Channel, TargetID;
3809 for (Channel = 0; Channel < Controller->Channels; Channel++)
3810 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
3811 {
3812 DAC960_V1_ErrorTableEntry_T *NewErrorEntry =
3813 &NewErrorTable->ErrorTableEntries[Channel][TargetID];
3814 DAC960_V1_ErrorTableEntry_T *OldErrorEntry =
3815 &OldErrorTable->ErrorTableEntries[Channel][TargetID];
3816 if ((NewErrorEntry->ParityErrorCount !=
3817 OldErrorEntry->ParityErrorCount) ||
3818 (NewErrorEntry->SoftErrorCount !=
3819 OldErrorEntry->SoftErrorCount) ||
3820 (NewErrorEntry->HardErrorCount !=
3821 OldErrorEntry->HardErrorCount) ||
3822 (NewErrorEntry->MiscErrorCount !=
3823 OldErrorEntry->MiscErrorCount))
3824 DAC960_Critical("Physical Device %d:%d Errors: "
3825 "Parity = %d, Soft = %d, "
3826 "Hard = %d, Misc = %d\n",
3827 Controller, Channel, TargetID,
3828 NewErrorEntry->ParityErrorCount,
3829 NewErrorEntry->SoftErrorCount,
3830 NewErrorEntry->HardErrorCount,
3831 NewErrorEntry->MiscErrorCount);
3832 }
3833 memcpy(&Controller->V1.ErrorTable, Controller->V1.NewErrorTable,
3834 sizeof(DAC960_V1_ErrorTable_T));
3835 }
3836 else if (CommandOpcode == DAC960_V1_GetDeviceState)
3837 {
3838 DAC960_V1_DeviceState_T *OldDeviceState =
3839 &Controller->V1.DeviceState[Controller->V1.DeviceStateChannel]
3840 [Controller->V1.DeviceStateTargetID];
3841 DAC960_V1_DeviceState_T *NewDeviceState =
3842 Controller->V1.NewDeviceState;
3843 if (NewDeviceState->DeviceState != OldDeviceState->DeviceState)
3844 DAC960_Critical("Physical Device %d:%d is now %s\n", Controller,
3845 Controller->V1.DeviceStateChannel,
3846 Controller->V1.DeviceStateTargetID,
3847 (NewDeviceState->DeviceState
3848 == DAC960_V1_Device_Dead
3849 ? "DEAD"
3850 : NewDeviceState->DeviceState
3851 == DAC960_V1_Device_WriteOnly
3852 ? "WRITE-ONLY"
3853 : NewDeviceState->DeviceState
3854 == DAC960_V1_Device_Online
3855 ? "ONLINE" : "STANDBY"));
3856 if (OldDeviceState->DeviceState == DAC960_V1_Device_Dead &&
3857 NewDeviceState->DeviceState != DAC960_V1_Device_Dead)
3858 {
3859 Controller->V1.NeedDeviceInquiryInformation = true;
3860 Controller->V1.NeedDeviceSerialNumberInformation = true;
3861 Controller->V1.DeviceResetCount
3862 [Controller->V1.DeviceStateChannel]
3863 [Controller->V1.DeviceStateTargetID] = 0;
3864 }
3865 memcpy(OldDeviceState, NewDeviceState,
3866 sizeof(DAC960_V1_DeviceState_T));
3867 }
3868 else if (CommandOpcode == DAC960_V1_GetLogicalDriveInformation)
3869 {
3870 int LogicalDriveNumber;
3871 for (LogicalDriveNumber = 0;
3872 LogicalDriveNumber < Controller->LogicalDriveCount;
3873 LogicalDriveNumber++)
3874 {
3875 DAC960_V1_LogicalDriveInformation_T *OldLogicalDriveInformation =
3876 &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
3877 DAC960_V1_LogicalDriveInformation_T *NewLogicalDriveInformation =
3878 &(*Controller->V1.NewLogicalDriveInformation)[LogicalDriveNumber];
3879 if (NewLogicalDriveInformation->LogicalDriveState !=
3880 OldLogicalDriveInformation->LogicalDriveState)
3881 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3882 "is now %s\n", Controller,
3883 LogicalDriveNumber,
3884 Controller->ControllerNumber,
3885 LogicalDriveNumber,
3886 (NewLogicalDriveInformation->LogicalDriveState
3887 == DAC960_V1_LogicalDrive_Online
3888 ? "ONLINE"
3889 : NewLogicalDriveInformation->LogicalDriveState
3890 == DAC960_V1_LogicalDrive_Critical
3891 ? "CRITICAL" : "OFFLINE"));
3892 if (NewLogicalDriveInformation->WriteBack !=
3893 OldLogicalDriveInformation->WriteBack)
3894 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3895 "is now %s\n", Controller,
3896 LogicalDriveNumber,
3897 Controller->ControllerNumber,
3898 LogicalDriveNumber,
3899 (NewLogicalDriveInformation->WriteBack
3900 ? "WRITE BACK" : "WRITE THRU"));
3901 }
3902 memcpy(&Controller->V1.LogicalDriveInformation,
3903 Controller->V1.NewLogicalDriveInformation,
3904 sizeof(DAC960_V1_LogicalDriveInformationArray_T));
3905 }
3906 else if (CommandOpcode == DAC960_V1_GetRebuildProgress)
3907 {
3908 unsigned int LogicalDriveNumber =
3909 Controller->V1.RebuildProgress->LogicalDriveNumber;
3910 unsigned int LogicalDriveSize =
3911 Controller->V1.RebuildProgress->LogicalDriveSize;
3912 unsigned int BlocksCompleted =
3913 LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3914 if (CommandStatus == DAC960_V1_NoRebuildOrCheckInProgress &&
3915 Controller->V1.LastRebuildStatus == DAC960_V1_NormalCompletion)
3916 CommandStatus = DAC960_V1_RebuildSuccessful;
3917 switch (CommandStatus)
3918 {
3919 case DAC960_V1_NormalCompletion:
3920 Controller->EphemeralProgressMessage = true;
3921 DAC960_Progress("Rebuild in Progress: "
3922 "Logical Drive %d (/dev/rd/c%dd%d) "
3923 "%d%% completed\n",
3924 Controller, LogicalDriveNumber,
3925 Controller->ControllerNumber,
3926 LogicalDriveNumber,
3927 (100 * (BlocksCompleted >> 7))
3928 / (LogicalDriveSize >> 7));
3929 Controller->EphemeralProgressMessage = false;
3930 break;
3931 case DAC960_V1_RebuildFailed_LogicalDriveFailure:
3932 DAC960_Progress("Rebuild Failed due to "
3933 "Logical Drive Failure\n", Controller);
3934 break;
3935 case DAC960_V1_RebuildFailed_BadBlocksOnOther:
3936 DAC960_Progress("Rebuild Failed due to "
3937 "Bad Blocks on Other Drives\n", Controller);
3938 break;
3939 case DAC960_V1_RebuildFailed_NewDriveFailed:
3940 DAC960_Progress("Rebuild Failed due to "
3941 "Failure of Drive Being Rebuilt\n", Controller);
3942 break;
3943 case DAC960_V1_NoRebuildOrCheckInProgress:
3944 break;
3945 case DAC960_V1_RebuildSuccessful:
3946 DAC960_Progress("Rebuild Completed Successfully\n", Controller);
3947 break;
3948 case DAC960_V1_RebuildSuccessfullyTerminated:
3949 DAC960_Progress("Rebuild Successfully Terminated\n", Controller);
3950 break;
3951 }
3952 Controller->V1.LastRebuildStatus = CommandStatus;
3953 if (CommandType != DAC960_MonitoringCommand &&
3954 Controller->V1.RebuildStatusPending)
3955 {
3956 Command->V1.CommandStatus = Controller->V1.PendingRebuildStatus;
3957 Controller->V1.RebuildStatusPending = false;
3958 }
3959 else if (CommandType == DAC960_MonitoringCommand &&
3960 CommandStatus != DAC960_V1_NormalCompletion &&
3961 CommandStatus != DAC960_V1_NoRebuildOrCheckInProgress)
3962 {
3963 Controller->V1.PendingRebuildStatus = CommandStatus;
3964 Controller->V1.RebuildStatusPending = true;
3965 }
3966 }
3967 else if (CommandOpcode == DAC960_V1_RebuildStat)
3968 {
3969 unsigned int LogicalDriveNumber =
3970 Controller->V1.RebuildProgress->LogicalDriveNumber;
3971 unsigned int LogicalDriveSize =
3972 Controller->V1.RebuildProgress->LogicalDriveSize;
3973 unsigned int BlocksCompleted =
3974 LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3975 if (CommandStatus == DAC960_V1_NormalCompletion)
3976 {
3977 Controller->EphemeralProgressMessage = true;
3978 DAC960_Progress("Consistency Check in Progress: "
3979 "Logical Drive %d (/dev/rd/c%dd%d) "
3980 "%d%% completed\n",
3981 Controller, LogicalDriveNumber,
3982 Controller->ControllerNumber,
3983 LogicalDriveNumber,
3984 (100 * (BlocksCompleted >> 7))
3985 / (LogicalDriveSize >> 7));
3986 Controller->EphemeralProgressMessage = false;
3987 }
3988 }
3989 else if (CommandOpcode == DAC960_V1_BackgroundInitializationControl)
3990 {
3991 unsigned int LogicalDriveNumber =
3992 Controller->V1.BackgroundInitializationStatus->LogicalDriveNumber;
3993 unsigned int LogicalDriveSize =
3994 Controller->V1.BackgroundInitializationStatus->LogicalDriveSize;
3995 unsigned int BlocksCompleted =
3996 Controller->V1.BackgroundInitializationStatus->BlocksCompleted;
3997 switch (CommandStatus)
3998 {
3999 case DAC960_V1_NormalCompletion:
4000 switch (Controller->V1.BackgroundInitializationStatus->Status)
4001 {
4002 case DAC960_V1_BackgroundInitializationInvalid:
4003 break;
4004 case DAC960_V1_BackgroundInitializationStarted:
4005 DAC960_Progress("Background Initialization Started\n",
4006 Controller);
4007 break;
4008 case DAC960_V1_BackgroundInitializationInProgress:
4009 if (BlocksCompleted ==
4010 Controller->V1.LastBackgroundInitializationStatus.
4011 BlocksCompleted &&
4012 LogicalDriveNumber ==
4013 Controller->V1.LastBackgroundInitializationStatus.
4014 LogicalDriveNumber)
4015 break;
4016 Controller->EphemeralProgressMessage = true;
4017 DAC960_Progress("Background Initialization in Progress: "
4018 "Logical Drive %d (/dev/rd/c%dd%d) "
4019 "%d%% completed\n",
4020 Controller, LogicalDriveNumber,
4021 Controller->ControllerNumber,
4022 LogicalDriveNumber,
4023 (100 * (BlocksCompleted >> 7))
4024 / (LogicalDriveSize >> 7));
4025 Controller->EphemeralProgressMessage = false;
4026 break;
4027 case DAC960_V1_BackgroundInitializationSuspended:
4028 DAC960_Progress("Background Initialization Suspended\n",
4029 Controller);
4030 break;
4031 case DAC960_V1_BackgroundInitializationCancelled:
4032 DAC960_Progress("Background Initialization Cancelled\n",
4033 Controller);
4034 break;
4035 }
4036 memcpy(&Controller->V1.LastBackgroundInitializationStatus,
4037 Controller->V1.BackgroundInitializationStatus,
4038 sizeof(DAC960_V1_BackgroundInitializationStatus_T));
4039 break;
4040 case DAC960_V1_BackgroundInitSuccessful:
4041 if (Controller->V1.BackgroundInitializationStatus->Status ==
4042 DAC960_V1_BackgroundInitializationInProgress)
4043 DAC960_Progress("Background Initialization "
4044 "Completed Successfully\n", Controller);
4045 Controller->V1.BackgroundInitializationStatus->Status =
4046 DAC960_V1_BackgroundInitializationInvalid;
4047 break;
4048 case DAC960_V1_BackgroundInitAborted:
4049 if (Controller->V1.BackgroundInitializationStatus->Status ==
4050 DAC960_V1_BackgroundInitializationInProgress)
4051 DAC960_Progress("Background Initialization Aborted\n",
4052 Controller);
4053 Controller->V1.BackgroundInitializationStatus->Status =
4054 DAC960_V1_BackgroundInitializationInvalid;
4055 break;
4056 case DAC960_V1_NoBackgroundInitInProgress:
4057 break;
4058 }
4059 }
4060 else if (CommandOpcode == DAC960_V1_DCDB)
4061 {
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075 if (Controller->V1.NeedDeviceInquiryInformation)
4076 {
4077 DAC960_SCSI_Inquiry_T *InquiryStandardData =
4078 &Controller->V1.InquiryStandardData
4079 [Controller->V1.DeviceStateChannel]
4080 [Controller->V1.DeviceStateTargetID];
4081 if (CommandStatus != DAC960_V1_NormalCompletion)
4082 {
4083 memset(InquiryStandardData, 0,
4084 sizeof(DAC960_SCSI_Inquiry_T));
4085 InquiryStandardData->PeripheralDeviceType = 0x1F;
4086 }
4087 else
4088 memcpy(InquiryStandardData,
4089 Controller->V1.NewInquiryStandardData,
4090 sizeof(DAC960_SCSI_Inquiry_T));
4091 Controller->V1.NeedDeviceInquiryInformation = false;
4092 }
4093 else if (Controller->V1.NeedDeviceSerialNumberInformation)
4094 {
4095 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4096 &Controller->V1.InquiryUnitSerialNumber
4097 [Controller->V1.DeviceStateChannel]
4098 [Controller->V1.DeviceStateTargetID];
4099 if (CommandStatus != DAC960_V1_NormalCompletion)
4100 {
4101 memset(InquiryUnitSerialNumber, 0,
4102 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4103 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
4104 }
4105 else
4106 memcpy(InquiryUnitSerialNumber,
4107 Controller->V1.NewInquiryUnitSerialNumber,
4108 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4109 Controller->V1.NeedDeviceSerialNumberInformation = false;
4110 }
4111 }
4112
4113
4114
4115 if (Controller->V1.NewEventLogSequenceNumber
4116 - Controller->V1.OldEventLogSequenceNumber > 0)
4117 {
4118 Command->V1.CommandMailbox.Type3E.CommandOpcode =
4119 DAC960_V1_PerformEventLogOperation;
4120 Command->V1.CommandMailbox.Type3E.OperationType =
4121 DAC960_V1_GetEventLogEntry;
4122 Command->V1.CommandMailbox.Type3E.OperationQualifier = 1;
4123 Command->V1.CommandMailbox.Type3E.SequenceNumber =
4124 Controller->V1.OldEventLogSequenceNumber;
4125 Command->V1.CommandMailbox.Type3E.BusAddress =
4126 Controller->V1.EventLogEntryDMA;
4127 DAC960_QueueCommand(Command);
4128 return;
4129 }
4130 if (Controller->V1.NeedErrorTableInformation)
4131 {
4132 Controller->V1.NeedErrorTableInformation = false;
4133 Command->V1.CommandMailbox.Type3.CommandOpcode =
4134 DAC960_V1_GetErrorTable;
4135 Command->V1.CommandMailbox.Type3.BusAddress =
4136 Controller->V1.NewErrorTableDMA;
4137 DAC960_QueueCommand(Command);
4138 return;
4139 }
4140 if (Controller->V1.NeedRebuildProgress &&
4141 Controller->V1.RebuildProgressFirst)
4142 {
4143 Controller->V1.NeedRebuildProgress = false;
4144 Command->V1.CommandMailbox.Type3.CommandOpcode =
4145 DAC960_V1_GetRebuildProgress;
4146 Command->V1.CommandMailbox.Type3.BusAddress =
4147 Controller->V1.RebuildProgressDMA;
4148 DAC960_QueueCommand(Command);
4149 return;
4150 }
4151 if (Controller->V1.NeedDeviceStateInformation)
4152 {
4153 if (Controller->V1.NeedDeviceInquiryInformation)
4154 {
4155 DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4156 dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4157
4158 dma_addr_t NewInquiryStandardDataDMA =
4159 Controller->V1.NewInquiryStandardDataDMA;
4160
4161 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4162 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4163 DCDB->Channel = Controller->V1.DeviceStateChannel;
4164 DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4165 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4166 DCDB->EarlyStatus = false;
4167 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4168 DCDB->NoAutomaticRequestSense = false;
4169 DCDB->DisconnectPermitted = true;
4170 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
4171 DCDB->BusAddress = NewInquiryStandardDataDMA;
4172 DCDB->CDBLength = 6;
4173 DCDB->TransferLengthHigh4 = 0;
4174 DCDB->SenseLength = sizeof(DCDB->SenseData);
4175 DCDB->CDB[0] = 0x12;
4176 DCDB->CDB[1] = 0;
4177 DCDB->CDB[2] = 0;
4178 DCDB->CDB[3] = 0;
4179 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
4180 DCDB->CDB[5] = 0;
4181 DAC960_QueueCommand(Command);
4182 return;
4183 }
4184 if (Controller->V1.NeedDeviceSerialNumberInformation)
4185 {
4186 DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4187 dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4188 dma_addr_t NewInquiryUnitSerialNumberDMA =
4189 Controller->V1.NewInquiryUnitSerialNumberDMA;
4190
4191 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4192 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4193 DCDB->Channel = Controller->V1.DeviceStateChannel;
4194 DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4195 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4196 DCDB->EarlyStatus = false;
4197 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4198 DCDB->NoAutomaticRequestSense = false;
4199 DCDB->DisconnectPermitted = true;
4200 DCDB->TransferLength =
4201 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4202 DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
4203 DCDB->CDBLength = 6;
4204 DCDB->TransferLengthHigh4 = 0;
4205 DCDB->SenseLength = sizeof(DCDB->SenseData);
4206 DCDB->CDB[0] = 0x12;
4207 DCDB->CDB[1] = 1;
4208 DCDB->CDB[2] = 0x80;
4209 DCDB->CDB[3] = 0;
4210 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4211 DCDB->CDB[5] = 0;
4212 DAC960_QueueCommand(Command);
4213 return;
4214 }
4215 if (Controller->V1.StartDeviceStateScan)
4216 {
4217 Controller->V1.DeviceStateChannel = 0;
4218 Controller->V1.DeviceStateTargetID = 0;
4219 Controller->V1.StartDeviceStateScan = false;
4220 }
4221 else if (++Controller->V1.DeviceStateTargetID == Controller->Targets)
4222 {
4223 Controller->V1.DeviceStateChannel++;
4224 Controller->V1.DeviceStateTargetID = 0;
4225 }
4226 if (Controller->V1.DeviceStateChannel < Controller->Channels)
4227 {
4228 Controller->V1.NewDeviceState->DeviceState =
4229 DAC960_V1_Device_Dead;
4230 Command->V1.CommandMailbox.Type3D.CommandOpcode =
4231 DAC960_V1_GetDeviceState;
4232 Command->V1.CommandMailbox.Type3D.Channel =
4233 Controller->V1.DeviceStateChannel;
4234 Command->V1.CommandMailbox.Type3D.TargetID =
4235 Controller->V1.DeviceStateTargetID;
4236 Command->V1.CommandMailbox.Type3D.BusAddress =
4237 Controller->V1.NewDeviceStateDMA;
4238 DAC960_QueueCommand(Command);
4239 return;
4240 }
4241 Controller->V1.NeedDeviceStateInformation = false;
4242 }
4243 if (Controller->V1.NeedLogicalDriveInformation)
4244 {
4245 Controller->V1.NeedLogicalDriveInformation = false;
4246 Command->V1.CommandMailbox.Type3.CommandOpcode =
4247 DAC960_V1_GetLogicalDriveInformation;
4248 Command->V1.CommandMailbox.Type3.BusAddress =
4249 Controller->V1.NewLogicalDriveInformationDMA;
4250 DAC960_QueueCommand(Command);
4251 return;
4252 }
4253 if (Controller->V1.NeedRebuildProgress)
4254 {
4255 Controller->V1.NeedRebuildProgress = false;
4256 Command->V1.CommandMailbox.Type3.CommandOpcode =
4257 DAC960_V1_GetRebuildProgress;
4258 Command->V1.CommandMailbox.Type3.BusAddress =
4259 Controller->V1.RebuildProgressDMA;
4260 DAC960_QueueCommand(Command);
4261 return;
4262 }
4263 if (Controller->V1.NeedConsistencyCheckProgress)
4264 {
4265 Controller->V1.NeedConsistencyCheckProgress = false;
4266 Command->V1.CommandMailbox.Type3.CommandOpcode =
4267 DAC960_V1_RebuildStat;
4268 Command->V1.CommandMailbox.Type3.BusAddress =
4269 Controller->V1.RebuildProgressDMA;
4270 DAC960_QueueCommand(Command);
4271 return;
4272 }
4273 if (Controller->V1.NeedBackgroundInitializationStatus)
4274 {
4275 Controller->V1.NeedBackgroundInitializationStatus = false;
4276 Command->V1.CommandMailbox.Type3B.CommandOpcode =
4277 DAC960_V1_BackgroundInitializationControl;
4278 Command->V1.CommandMailbox.Type3B.CommandOpcode2 = 0x20;
4279 Command->V1.CommandMailbox.Type3B.BusAddress =
4280 Controller->V1.BackgroundInitializationStatusDMA;
4281 DAC960_QueueCommand(Command);
4282 return;
4283 }
4284 Controller->MonitoringTimerCount++;
4285 Controller->MonitoringTimer.expires =
4286 jiffies + DAC960_MonitoringTimerInterval;
4287 add_timer(&Controller->MonitoringTimer);
4288 }
4289 if (CommandType == DAC960_ImmediateCommand)
4290 {
4291 complete(Command->Completion);
4292 Command->Completion = NULL;
4293 return;
4294 }
4295 if (CommandType == DAC960_QueuedCommand)
4296 {
4297 DAC960_V1_KernelCommand_T *KernelCommand = Command->V1.KernelCommand;
4298 KernelCommand->CommandStatus = Command->V1.CommandStatus;
4299 Command->V1.KernelCommand = NULL;
4300 if (CommandOpcode == DAC960_V1_DCDB)
4301 Controller->V1.DirectCommandActive[KernelCommand->DCDB->Channel]
4302 [KernelCommand->DCDB->TargetID] =
4303 false;
4304 DAC960_DeallocateCommand(Command);
4305 KernelCommand->CompletionFunction(KernelCommand);
4306 return;
4307 }
4308
4309
4310
4311
4312
4313 if (Controller->MonitoringCommandDeferred)
4314 {
4315 Controller->MonitoringCommandDeferred = false;
4316 DAC960_V1_QueueMonitoringCommand(Command);
4317 return;
4318 }
4319
4320
4321
4322 DAC960_DeallocateCommand(Command);
4323
4324
4325
4326 wake_up(&Controller->CommandWaitQueue);
4327}
4328
4329
4330
4331
4332
4333
4334
4335static void DAC960_V2_ReadWriteError(DAC960_Command_T *Command)
4336{
4337 DAC960_Controller_T *Controller = Command->Controller;
4338 unsigned char *SenseErrors[] = { "NO SENSE", "RECOVERED ERROR",
4339 "NOT READY", "MEDIUM ERROR",
4340 "HARDWARE ERROR", "ILLEGAL REQUEST",
4341 "UNIT ATTENTION", "DATA PROTECT",
4342 "BLANK CHECK", "VENDOR-SPECIFIC",
4343 "COPY ABORTED", "ABORTED COMMAND",
4344 "EQUAL", "VOLUME OVERFLOW",
4345 "MISCOMPARE", "RESERVED" };
4346 unsigned char *CommandName = "UNKNOWN";
4347 switch (Command->CommandType)
4348 {
4349 case DAC960_ReadCommand:
4350 case DAC960_ReadRetryCommand:
4351 CommandName = "READ";
4352 break;
4353 case DAC960_WriteCommand:
4354 case DAC960_WriteRetryCommand:
4355 CommandName = "WRITE";
4356 break;
4357 case DAC960_MonitoringCommand:
4358 case DAC960_ImmediateCommand:
4359 case DAC960_QueuedCommand:
4360 break;
4361 }
4362 DAC960_Error("Error Condition %s on %s:\n", Controller,
4363 SenseErrors[Command->V2.RequestSense->SenseKey], CommandName);
4364 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
4365 Controller, Controller->ControllerNumber,
4366 Command->LogicalDriveNumber, Command->BlockNumber,
4367 Command->BlockNumber + Command->BlockCount - 1);
4368}
4369
4370
4371
4372
4373
4374
4375
4376static void DAC960_V2_ReportEvent(DAC960_Controller_T *Controller,
4377 DAC960_V2_Event_T *Event)
4378{
4379 DAC960_SCSI_RequestSense_T *RequestSense =
4380 (DAC960_SCSI_RequestSense_T *) &Event->RequestSenseData;
4381 unsigned char MessageBuffer[DAC960_LineBufferSize];
4382 static struct { int EventCode; unsigned char *EventMessage; } EventList[] =
4383 {
4384 { 0x0001, "P Online" },
4385 { 0x0002, "P Standby" },
4386 { 0x0005, "P Automatic Rebuild Started" },
4387 { 0x0006, "P Manual Rebuild Started" },
4388 { 0x0007, "P Rebuild Completed" },
4389 { 0x0008, "P Rebuild Cancelled" },
4390 { 0x0009, "P Rebuild Failed for Unknown Reasons" },
4391 { 0x000A, "P Rebuild Failed due to New Physical Device" },
4392 { 0x000B, "P Rebuild Failed due to Logical Drive Failure" },
4393 { 0x000C, "S Offline" },
4394 { 0x000D, "P Found" },
4395 { 0x000E, "P Removed" },
4396 { 0x000F, "P Unconfigured" },
4397 { 0x0010, "P Expand Capacity Started" },
4398 { 0x0011, "P Expand Capacity Completed" },
4399 { 0x0012, "P Expand Capacity Failed" },
4400 { 0x0013, "P Command Timed Out" },
4401 { 0x0014, "P Command Aborted" },
4402 { 0x0015, "P Command Retried" },
4403 { 0x0016, "P Parity Error" },
4404 { 0x0017, "P Soft Error" },
4405 { 0x0018, "P Miscellaneous Error" },
4406 { 0x0019, "P Reset" },
4407 { 0x001A, "P Active Spare Found" },
4408 { 0x001B, "P Warm Spare Found" },
4409 { 0x001C, "S Sense Data Received" },
4410 { 0x001D, "P Initialization Started" },
4411 { 0x001E, "P Initialization Completed" },
4412 { 0x001F, "P Initialization Failed" },
4413 { 0x0020, "P Initialization Cancelled" },
4414 { 0x0021, "P Failed because Write Recovery Failed" },
4415 { 0x0022, "P Failed because SCSI Bus Reset Failed" },
4416 { 0x0023, "P Failed because of Double Check Condition" },
4417 { 0x0024, "P Failed because Device Cannot Be Accessed" },
4418 { 0x0025, "P Failed because of Gross Error on SCSI Processor" },
4419 { 0x0026, "P Failed because of Bad Tag from Device" },
4420 { 0x0027, "P Failed because of Command Timeout" },
4421 { 0x0028, "P Failed because of System Reset" },
4422 { 0x0029, "P Failed because of Busy Status or Parity Error" },
4423 { 0x002A, "P Failed because Host Set Device to Failed State" },
4424 { 0x002B, "P Failed because of Selection Timeout" },
4425 { 0x002C, "P Failed because of SCSI Bus Phase Error" },
4426 { 0x002D, "P Failed because Device Returned Unknown Status" },
4427 { 0x002E, "P Failed because Device Not Ready" },
4428 { 0x002F, "P Failed because Device Not Found at Startup" },
4429 { 0x0030, "P Failed because COD Write Operation Failed" },
4430 { 0x0031, "P Failed because BDT Write Operation Failed" },
4431 { 0x0039, "P Missing at Startup" },
4432 { 0x003A, "P Start Rebuild Failed due to Physical Drive Too Small" },
4433 { 0x003C, "P Temporarily Offline Device Automatically Made Online" },
4434 { 0x003D, "P Standby Rebuild Started" },
4435
4436 { 0x0080, "M Consistency Check Started" },
4437 { 0x0081, "M Consistency Check Completed" },
4438 { 0x0082, "M Consistency Check Cancelled" },
4439 { 0x0083, "M Consistency Check Completed With Errors" },
4440 { 0x0084, "M Consistency Check Failed due to Logical Drive Failure" },
4441 { 0x0085, "M Consistency Check Failed due to Physical Device Failure" },
4442 { 0x0086, "L Offline" },
4443 { 0x0087, "L Critical" },
4444 { 0x0088, "L Online" },
4445 { 0x0089, "M Automatic Rebuild Started" },
4446 { 0x008A, "M Manual Rebuild Started" },
4447 { 0x008B, "M Rebuild Completed" },
4448 { 0x008C, "M Rebuild Cancelled" },
4449 { 0x008D, "M Rebuild Failed for Unknown Reasons" },
4450 { 0x008E, "M Rebuild Failed due to New Physical Device" },
4451 { 0x008F, "M Rebuild Failed due to Logical Drive Failure" },
4452 { 0x0090, "M Initialization Started" },
4453 { 0x0091, "M Initialization Completed" },
4454 { 0x0092, "M Initialization Cancelled" },
4455 { 0x0093, "M Initialization Failed" },
4456 { 0x0094, "L Found" },
4457 { 0x0095, "L Deleted" },
4458 { 0x0096, "M Expand Capacity Started" },
4459 { 0x0097, "M Expand Capacity Completed" },
4460 { 0x0098, "M Expand Capacity Failed" },
4461 { 0x0099, "L Bad Block Found" },
4462 { 0x009A, "L Size Changed" },
4463 { 0x009B, "L Type Changed" },
4464 { 0x009C, "L Bad Data Block Found" },
4465 { 0x009E, "L Read of Data Block in BDT" },
4466 { 0x009F, "L Write Back Data for Disk Block Lost" },
4467 { 0x00A0, "L Temporarily Offline RAID-5/3 Drive Made Online" },
4468 { 0x00A1, "L Temporarily Offline RAID-6/1/0/7 Drive Made Online" },
4469 { 0x00A2, "L Standby Rebuild Started" },
4470
4471 { 0x0140, "E Fan %d Failed" },
4472 { 0x0141, "E Fan %d OK" },
4473 { 0x0142, "E Fan %d Not Present" },
4474 { 0x0143, "E Power Supply %d Failed" },
4475 { 0x0144, "E Power Supply %d OK" },
4476 { 0x0145, "E Power Supply %d Not Present" },
4477 { 0x0146, "E Temperature Sensor %d Temperature Exceeds Safe Limit" },
4478 { 0x0147, "E Temperature Sensor %d Temperature Exceeds Working Limit" },
4479 { 0x0148, "E Temperature Sensor %d Temperature Normal" },
4480 { 0x0149, "E Temperature Sensor %d Not Present" },
4481 { 0x014A, "E Enclosure Management Unit %d Access Critical" },
4482 { 0x014B, "E Enclosure Management Unit %d Access OK" },
4483 { 0x014C, "E Enclosure Management Unit %d Access Offline" },
4484
4485 { 0x0181, "C Cache Write Back Error" },
4486 { 0x0188, "C Battery Backup Unit Found" },
4487 { 0x0189, "C Battery Backup Unit Charge Level Low" },
4488 { 0x018A, "C Battery Backup Unit Charge Level OK" },
4489 { 0x0193, "C Installation Aborted" },
4490 { 0x0195, "C Battery Backup Unit Physically Removed" },
4491 { 0x0196, "C Memory Error During Warm Boot" },
4492 { 0x019E, "C Memory Soft ECC Error Corrected" },
4493 { 0x019F, "C Memory Hard ECC Error Corrected" },
4494 { 0x01A2, "C Battery Backup Unit Failed" },
4495 { 0x01AB, "C Mirror Race Recovery Failed" },
4496 { 0x01AC, "C Mirror Race on Critical Drive" },
4497
4498 { 0x0380, "C Internal Controller Hung" },
4499 { 0x0381, "C Internal Controller Firmware Breakpoint" },
4500 { 0x0390, "C Internal Controller i960 Processor Specific Error" },
4501 { 0x03A0, "C Internal Controller StrongARM Processor Specific Error" },
4502 { 0, "" } };
4503 int EventListIndex = 0, EventCode;
4504 unsigned char EventType, *EventMessage;
4505 if (Event->EventCode == 0x1C &&
4506 RequestSense->SenseKey == DAC960_SenseKey_VendorSpecific &&
4507 (RequestSense->AdditionalSenseCode == 0x80 ||
4508 RequestSense->AdditionalSenseCode == 0x81))
4509 Event->EventCode = ((RequestSense->AdditionalSenseCode - 0x80) << 8) |
4510 RequestSense->AdditionalSenseCodeQualifier;
4511 while (true)
4512 {
4513 EventCode = EventList[EventListIndex].EventCode;
4514 if (EventCode == Event->EventCode || EventCode == 0) break;
4515 EventListIndex++;
4516 }
4517 EventType = EventList[EventListIndex].EventMessage[0];
4518 EventMessage = &EventList[EventListIndex].EventMessage[2];
4519 if (EventCode == 0)
4520 {
4521 DAC960_Critical("Unknown Controller Event Code %04X\n",
4522 Controller, Event->EventCode);
4523 return;
4524 }
4525 switch (EventType)
4526 {
4527 case 'P':
4528 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4529 Event->Channel, Event->TargetID, EventMessage);
4530 break;
4531 case 'L':
4532 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4533 Event->LogicalUnit, Controller->ControllerNumber,
4534 Event->LogicalUnit, EventMessage);
4535 break;
4536 case 'M':
4537 DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4538 Event->LogicalUnit, Controller->ControllerNumber,
4539 Event->LogicalUnit, EventMessage);
4540 break;
4541 case 'S':
4542 if (RequestSense->SenseKey == DAC960_SenseKey_NoSense ||
4543 (RequestSense->SenseKey == DAC960_SenseKey_NotReady &&
4544 RequestSense->AdditionalSenseCode == 0x04 &&
4545 (RequestSense->AdditionalSenseCodeQualifier == 0x01 ||
4546 RequestSense->AdditionalSenseCodeQualifier == 0x02)))
4547 break;
4548 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4549 Event->Channel, Event->TargetID, EventMessage);
4550 DAC960_Critical("Physical Device %d:%d Request Sense: "
4551 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
4552 Controller,
4553 Event->Channel,
4554 Event->TargetID,
4555 RequestSense->SenseKey,
4556 RequestSense->AdditionalSenseCode,
4557 RequestSense->AdditionalSenseCodeQualifier);
4558 DAC960_Critical("Physical Device %d:%d Request Sense: "
4559 "Information = %02X%02X%02X%02X "
4560 "%02X%02X%02X%02X\n",
4561 Controller,
4562 Event->Channel,
4563 Event->TargetID,
4564 RequestSense->Information[0],
4565 RequestSense->Information[1],
4566 RequestSense->Information[2],
4567 RequestSense->Information[3],
4568 RequestSense->CommandSpecificInformation[0],
4569 RequestSense->CommandSpecificInformation[1],
4570 RequestSense->CommandSpecificInformation[2],
4571 RequestSense->CommandSpecificInformation[3]);
4572 break;
4573 case 'E':
4574 if (Controller->SuppressEnclosureMessages) break;
4575 sprintf(MessageBuffer, EventMessage, Event->LogicalUnit);
4576 DAC960_Critical("Enclosure %d %s\n", Controller,
4577 Event->TargetID, MessageBuffer);
4578 break;
4579 case 'C':
4580 DAC960_Critical("Controller %s\n", Controller, EventMessage);
4581 break;
4582 default:
4583 DAC960_Critical("Unknown Controller Event Code %04X\n",
4584 Controller, Event->EventCode);
4585 break;
4586 }
4587}
4588
4589
4590
4591
4592
4593
4594
4595static void DAC960_V2_ReportProgress(DAC960_Controller_T *Controller,
4596 unsigned char *MessageString,
4597 unsigned int LogicalDeviceNumber,
4598 unsigned long BlocksCompleted,
4599 unsigned long LogicalDeviceSize)
4600{
4601 Controller->EphemeralProgressMessage = true;
4602 DAC960_Progress("%s in Progress: Logical Drive %d (/dev/rd/c%dd%d) "
4603 "%d%% completed\n", Controller,
4604 MessageString,
4605 LogicalDeviceNumber,
4606 Controller->ControllerNumber,
4607 LogicalDeviceNumber,
4608 (100 * (BlocksCompleted >> 7)) / (LogicalDeviceSize >> 7));
4609 Controller->EphemeralProgressMessage = false;
4610}
4611
4612
4613
4614
4615
4616
4617
4618static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
4619{
4620 DAC960_Controller_T *Controller = Command->Controller;
4621 DAC960_CommandType_T CommandType = Command->CommandType;
4622 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
4623 DAC960_V2_IOCTL_Opcode_T CommandOpcode = CommandMailbox->Common.IOCTL_Opcode;
4624 DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus;
4625
4626 if (CommandType == DAC960_ReadCommand ||
4627 CommandType == DAC960_WriteCommand)
4628 {
4629
4630#ifdef FORCE_RETRY_DEBUG
4631 CommandStatus = DAC960_V2_AbormalCompletion;
4632#endif
4633 Command->V2.RequestSense->SenseKey = DAC960_SenseKey_MediumError;
4634
4635 if (CommandStatus == DAC960_V2_NormalCompletion) {
4636
4637 if (!DAC960_ProcessCompletedRequest(Command, true))
4638 BUG();
4639
4640 } else if (Command->V2.RequestSense->SenseKey == DAC960_SenseKey_MediumError)
4641 {
4642
4643
4644
4645
4646 DAC960_queue_partial_rw(Command);
4647 return;
4648 }
4649 else
4650 {
4651 if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4652 DAC960_V2_ReadWriteError(Command);
4653
4654
4655
4656 (void)DAC960_ProcessCompletedRequest(Command, false);
4657 }
4658 }
4659 else if (CommandType == DAC960_ReadRetryCommand ||
4660 CommandType == DAC960_WriteRetryCommand)
4661 {
4662 bool normal_completion;
4663
4664#ifdef FORCE_RETRY_FAILURE_DEBUG
4665 static int retry_count = 1;
4666#endif
4667
4668
4669
4670
4671 normal_completion = true;
4672 if (CommandStatus != DAC960_V2_NormalCompletion) {
4673 normal_completion = false;
4674 if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4675 DAC960_V2_ReadWriteError(Command);
4676 }
4677
4678#ifdef FORCE_RETRY_FAILURE_DEBUG
4679 if (!(++retry_count % 10000)) {
4680 printk("V2 error retry failure test\n");
4681 normal_completion = false;
4682 DAC960_V2_ReadWriteError(Command);
4683 }
4684#endif
4685
4686 if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
4687 DAC960_queue_partial_rw(Command);
4688 return;
4689 }
4690 }
4691 else if (CommandType == DAC960_MonitoringCommand)
4692 {
4693 if (Controller->ShutdownMonitoringTimer)
4694 return;
4695 if (CommandOpcode == DAC960_V2_GetControllerInfo)
4696 {
4697 DAC960_V2_ControllerInfo_T *NewControllerInfo =
4698 Controller->V2.NewControllerInformation;
4699 DAC960_V2_ControllerInfo_T *ControllerInfo =
4700 &Controller->V2.ControllerInformation;
4701 Controller->LogicalDriveCount =
4702 NewControllerInfo->LogicalDevicesPresent;
4703 Controller->V2.NeedLogicalDeviceInformation = true;
4704 Controller->V2.NeedPhysicalDeviceInformation = true;
4705 Controller->V2.StartLogicalDeviceInformationScan = true;
4706 Controller->V2.StartPhysicalDeviceInformationScan = true;
4707 Controller->MonitoringAlertMode =
4708 (NewControllerInfo->LogicalDevicesCritical > 0 ||
4709 NewControllerInfo->LogicalDevicesOffline > 0 ||
4710 NewControllerInfo->PhysicalDisksCritical > 0 ||
4711 NewControllerInfo->PhysicalDisksOffline > 0);
4712 memcpy(ControllerInfo, NewControllerInfo,
4713 sizeof(DAC960_V2_ControllerInfo_T));
4714 }
4715 else if (CommandOpcode == DAC960_V2_GetEvent)
4716 {
4717 if (CommandStatus == DAC960_V2_NormalCompletion) {
4718 DAC960_V2_ReportEvent(Controller, Controller->V2.Event);
4719 }
4720 Controller->V2.NextEventSequenceNumber++;
4721 }
4722 else if (CommandOpcode == DAC960_V2_GetPhysicalDeviceInfoValid &&
4723 CommandStatus == DAC960_V2_NormalCompletion)
4724 {
4725 DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
4726 Controller->V2.NewPhysicalDeviceInformation;
4727 unsigned int PhysicalDeviceIndex = Controller->V2.PhysicalDeviceIndex;
4728 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
4729 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
4730 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4731 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
4732 unsigned int DeviceIndex;
4733 while (PhysicalDeviceInfo != NULL &&
4734 (NewPhysicalDeviceInfo->Channel >
4735 PhysicalDeviceInfo->Channel ||
4736 (NewPhysicalDeviceInfo->Channel ==
4737 PhysicalDeviceInfo->Channel &&
4738 (NewPhysicalDeviceInfo->TargetID >
4739 PhysicalDeviceInfo->TargetID ||
4740 (NewPhysicalDeviceInfo->TargetID ==
4741 PhysicalDeviceInfo->TargetID &&
4742 NewPhysicalDeviceInfo->LogicalUnit >
4743 PhysicalDeviceInfo->LogicalUnit)))))
4744 {
4745 DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4746 Controller,
4747 PhysicalDeviceInfo->Channel,
4748 PhysicalDeviceInfo->TargetID);
4749 Controller->V2.PhysicalDeviceInformation
4750 [PhysicalDeviceIndex] = NULL;
4751 Controller->V2.InquiryUnitSerialNumber
4752 [PhysicalDeviceIndex] = NULL;
4753 kfree(PhysicalDeviceInfo);
4754 kfree(InquiryUnitSerialNumber);
4755 for (DeviceIndex = PhysicalDeviceIndex;