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/compiler.h>
25#include <linux/module.h>
26#include <linux/types.h>
27#include <linux/miscdevice.h>
28#include <linux/blkdev.h>
29#include <linux/bio.h>
30#include <linux/completion.h>
31#include <linux/delay.h>
32#include <linux/genhd.h>
33#include <linux/hdreg.h>
34#include <linux/blkpg.h>
35#include <linux/dma-mapping.h>
36#include <linux/interrupt.h>
37#include <linux/ioport.h>
38#include <linux/mm.h>
39#include <linux/slab.h>
40#include <linux/mutex.h>
41#include <linux/proc_fs.h>
42#include <linux/seq_file.h>
43#include <linux/reboot.h>
44#include <linux/spinlock.h>
45#include <linux/timer.h>
46#include <linux/pci.h>
47#include <linux/init.h>
48#include <linux/jiffies.h>
49#include <linux/random.h>
50#include <linux/scatterlist.h>
51#include <asm/io.h>
52#include <linux/uaccess.h>
53#include "DAC960.h"
54
55#define DAC960_GAM_MINOR 252
56
57
58static DEFINE_MUTEX(DAC960_mutex);
59static DAC960_Controller_T *DAC960_Controllers[DAC960_MaxControllers];
60static int DAC960_ControllerCount;
61static struct proc_dir_entry *DAC960_ProcDirectoryEntry;
62
63static long disk_size(DAC960_Controller_T *p, int drive_nr)
64{
65 if (p->FirmwareType == DAC960_V1_Controller) {
66 if (drive_nr >= p->LogicalDriveCount)
67 return 0;
68 return p->V1.LogicalDriveInformation[drive_nr].
69 LogicalDriveSize;
70 } else {
71 DAC960_V2_LogicalDeviceInfo_T *i =
72 p->V2.LogicalDeviceInformation[drive_nr];
73 if (i == NULL)
74 return 0;
75 return i->ConfigurableDeviceSize;
76 }
77}
78
79static int DAC960_open(struct block_device *bdev, fmode_t mode)
80{
81 struct gendisk *disk = bdev->bd_disk;
82 DAC960_Controller_T *p = disk->queue->queuedata;
83 int drive_nr = (long)disk->private_data;
84 int ret = -ENXIO;
85
86 mutex_lock(&DAC960_mutex);
87 if (p->FirmwareType == DAC960_V1_Controller) {
88 if (p->V1.LogicalDriveInformation[drive_nr].
89 LogicalDriveState == DAC960_V1_LogicalDrive_Offline)
90 goto out;
91 } else {
92 DAC960_V2_LogicalDeviceInfo_T *i =
93 p->V2.LogicalDeviceInformation[drive_nr];
94 if (!i || i->LogicalDeviceState == DAC960_V2_LogicalDevice_Offline)
95 goto out;
96 }
97
98 check_disk_change(bdev);
99
100 if (!get_capacity(p->disks[drive_nr]))
101 goto out;
102 ret = 0;
103out:
104 mutex_unlock(&DAC960_mutex);
105 return ret;
106}
107
108static int DAC960_getgeo(struct block_device *bdev, struct hd_geometry *geo)
109{
110 struct gendisk *disk = bdev->bd_disk;
111 DAC960_Controller_T *p = disk->queue->queuedata;
112 int drive_nr = (long)disk->private_data;
113
114 if (p->FirmwareType == DAC960_V1_Controller) {
115 geo->heads = p->V1.GeometryTranslationHeads;
116 geo->sectors = p->V1.GeometryTranslationSectors;
117 geo->cylinders = p->V1.LogicalDriveInformation[drive_nr].
118 LogicalDriveSize / (geo->heads * geo->sectors);
119 } else {
120 DAC960_V2_LogicalDeviceInfo_T *i =
121 p->V2.LogicalDeviceInformation[drive_nr];
122 switch (i->DriveGeometry) {
123 case DAC960_V2_Geometry_128_32:
124 geo->heads = 128;
125 geo->sectors = 32;
126 break;
127 case DAC960_V2_Geometry_255_63:
128 geo->heads = 255;
129 geo->sectors = 63;
130 break;
131 default:
132 DAC960_Error("Illegal Logical Device Geometry %d\n",
133 p, i->DriveGeometry);
134 return -EINVAL;
135 }
136
137 geo->cylinders = i->ConfigurableDeviceSize /
138 (geo->heads * geo->sectors);
139 }
140
141 return 0;
142}
143
144static unsigned int DAC960_check_events(struct gendisk *disk,
145 unsigned int clearing)
146{
147 DAC960_Controller_T *p = disk->queue->queuedata;
148 int drive_nr = (long)disk->private_data;
149
150 if (!p->LogicalDriveInitiallyAccessible[drive_nr])
151 return DISK_EVENT_MEDIA_CHANGE;
152 return 0;
153}
154
155static int DAC960_revalidate_disk(struct gendisk *disk)
156{
157 DAC960_Controller_T *p = disk->queue->queuedata;
158 int unit = (long)disk->private_data;
159
160 set_capacity(disk, disk_size(p, unit));
161 return 0;
162}
163
164static const struct block_device_operations DAC960_BlockDeviceOperations = {
165 .owner = THIS_MODULE,
166 .open = DAC960_open,
167 .getgeo = DAC960_getgeo,
168 .check_events = DAC960_check_events,
169 .revalidate_disk = DAC960_revalidate_disk,
170};
171
172
173
174
175
176
177
178static void DAC960_AnnounceDriver(DAC960_Controller_T *Controller)
179{
180 DAC960_Announce("***** DAC960 RAID Driver Version "
181 DAC960_DriverVersion " of "
182 DAC960_DriverDate " *****\n", Controller);
183 DAC960_Announce("Copyright 1998-2001 by Leonard N. Zubkoff "
184 "<lnz@dandelion.com>\n", Controller);
185}
186
187
188
189
190
191
192static bool DAC960_Failure(DAC960_Controller_T *Controller,
193 unsigned char *ErrorMessage)
194{
195 DAC960_Error("While configuring DAC960 PCI RAID Controller at\n",
196 Controller);
197 if (Controller->IO_Address == 0)
198 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
199 "PCI Address 0x%X\n", Controller,
200 Controller->Bus, Controller->Device,
201 Controller->Function, Controller->PCI_Address);
202 else DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
203 "0x%X PCI Address 0x%X\n", Controller,
204 Controller->Bus, Controller->Device,
205 Controller->Function, Controller->IO_Address,
206 Controller->PCI_Address);
207 DAC960_Error("%s FAILED - DETACHING\n", Controller, ErrorMessage);
208 return false;
209}
210
211
212
213
214
215
216
217
218
219
220
221static bool init_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf,
222 size_t len)
223{
224 void *cpu_addr;
225 dma_addr_t dma_handle;
226
227 cpu_addr = pci_alloc_consistent(dev, len, &dma_handle);
228 if (cpu_addr == NULL)
229 return false;
230
231 loaf->cpu_free = loaf->cpu_base = cpu_addr;
232 loaf->dma_free =loaf->dma_base = dma_handle;
233 loaf->length = len;
234 memset(cpu_addr, 0, len);
235 return true;
236}
237
238static void *slice_dma_loaf(struct dma_loaf *loaf, size_t len,
239 dma_addr_t *dma_handle)
240{
241 void *cpu_end = loaf->cpu_free + len;
242 void *cpu_addr = loaf->cpu_free;
243
244 BUG_ON(cpu_end > loaf->cpu_base + loaf->length);
245 *dma_handle = loaf->dma_free;
246 loaf->cpu_free = cpu_end;
247 loaf->dma_free += len;
248 return cpu_addr;
249}
250
251static void free_dma_loaf(struct pci_dev *dev, struct dma_loaf *loaf_handle)
252{
253 if (loaf_handle->cpu_base != NULL)
254 pci_free_consistent(dev, loaf_handle->length,
255 loaf_handle->cpu_base, loaf_handle->dma_base);
256}
257
258
259
260
261
262
263
264
265static bool DAC960_CreateAuxiliaryStructures(DAC960_Controller_T *Controller)
266{
267 int CommandAllocationLength, CommandAllocationGroupSize;
268 int CommandsRemaining = 0, CommandIdentifier, CommandGroupByteCount;
269 void *AllocationPointer = NULL;
270 void *ScatterGatherCPU = NULL;
271 dma_addr_t ScatterGatherDMA;
272 struct dma_pool *ScatterGatherPool;
273 void *RequestSenseCPU = NULL;
274 dma_addr_t RequestSenseDMA;
275 struct dma_pool *RequestSensePool = NULL;
276
277 if (Controller->FirmwareType == DAC960_V1_Controller)
278 {
279 CommandAllocationLength = offsetof(DAC960_Command_T, V1.EndMarker);
280 CommandAllocationGroupSize = DAC960_V1_CommandAllocationGroupSize;
281 ScatterGatherPool = dma_pool_create("DAC960_V1_ScatterGather",
282 &Controller->PCIDevice->dev,
283 DAC960_V1_ScatterGatherLimit * sizeof(DAC960_V1_ScatterGatherSegment_T),
284 sizeof(DAC960_V1_ScatterGatherSegment_T), 0);
285 if (ScatterGatherPool == NULL)
286 return DAC960_Failure(Controller,
287 "AUXILIARY STRUCTURE CREATION (SG)");
288 Controller->ScatterGatherPool = ScatterGatherPool;
289 }
290 else
291 {
292 CommandAllocationLength = offsetof(DAC960_Command_T, V2.EndMarker);
293 CommandAllocationGroupSize = DAC960_V2_CommandAllocationGroupSize;
294 ScatterGatherPool = dma_pool_create("DAC960_V2_ScatterGather",
295 &Controller->PCIDevice->dev,
296 DAC960_V2_ScatterGatherLimit * sizeof(DAC960_V2_ScatterGatherSegment_T),
297 sizeof(DAC960_V2_ScatterGatherSegment_T), 0);
298 if (ScatterGatherPool == NULL)
299 return DAC960_Failure(Controller,
300 "AUXILIARY STRUCTURE CREATION (SG)");
301 RequestSensePool = dma_pool_create("DAC960_V2_RequestSense",
302 &Controller->PCIDevice->dev, sizeof(DAC960_SCSI_RequestSense_T),
303 sizeof(int), 0);
304 if (RequestSensePool == NULL) {
305 dma_pool_destroy(ScatterGatherPool);
306 return DAC960_Failure(Controller,
307 "AUXILIARY STRUCTURE CREATION (SG)");
308 }
309 Controller->ScatterGatherPool = ScatterGatherPool;
310 Controller->V2.RequestSensePool = RequestSensePool;
311 }
312 Controller->CommandAllocationGroupSize = CommandAllocationGroupSize;
313 Controller->FreeCommands = NULL;
314 for (CommandIdentifier = 1;
315 CommandIdentifier <= Controller->DriverQueueDepth;
316 CommandIdentifier++)
317 {
318 DAC960_Command_T *Command;
319 if (--CommandsRemaining <= 0)
320 {
321 CommandsRemaining =
322 Controller->DriverQueueDepth - CommandIdentifier + 1;
323 if (CommandsRemaining > CommandAllocationGroupSize)
324 CommandsRemaining = CommandAllocationGroupSize;
325 CommandGroupByteCount =
326 CommandsRemaining * CommandAllocationLength;
327 AllocationPointer = kzalloc(CommandGroupByteCount, GFP_ATOMIC);
328 if (AllocationPointer == NULL)
329 return DAC960_Failure(Controller,
330 "AUXILIARY STRUCTURE CREATION");
331 }
332 Command = (DAC960_Command_T *) AllocationPointer;
333 AllocationPointer += CommandAllocationLength;
334 Command->CommandIdentifier = CommandIdentifier;
335 Command->Controller = Controller;
336 Command->Next = Controller->FreeCommands;
337 Controller->FreeCommands = Command;
338 Controller->Commands[CommandIdentifier-1] = Command;
339 ScatterGatherCPU = dma_pool_alloc(ScatterGatherPool, GFP_ATOMIC,
340 &ScatterGatherDMA);
341 if (ScatterGatherCPU == NULL)
342 return DAC960_Failure(Controller, "AUXILIARY STRUCTURE CREATION");
343
344 if (RequestSensePool != NULL) {
345 RequestSenseCPU = dma_pool_alloc(RequestSensePool, GFP_ATOMIC,
346 &RequestSenseDMA);
347 if (RequestSenseCPU == NULL) {
348 dma_pool_free(ScatterGatherPool, ScatterGatherCPU,
349 ScatterGatherDMA);
350 return DAC960_Failure(Controller,
351 "AUXILIARY STRUCTURE CREATION");
352 }
353 }
354 if (Controller->FirmwareType == DAC960_V1_Controller) {
355 Command->cmd_sglist = Command->V1.ScatterList;
356 Command->V1.ScatterGatherList =
357 (DAC960_V1_ScatterGatherSegment_T *)ScatterGatherCPU;
358 Command->V1.ScatterGatherListDMA = ScatterGatherDMA;
359 sg_init_table(Command->cmd_sglist, DAC960_V1_ScatterGatherLimit);
360 } else {
361 Command->cmd_sglist = Command->V2.ScatterList;
362 Command->V2.ScatterGatherList =
363 (DAC960_V2_ScatterGatherSegment_T *)ScatterGatherCPU;
364 Command->V2.ScatterGatherListDMA = ScatterGatherDMA;
365 Command->V2.RequestSense =
366 (DAC960_SCSI_RequestSense_T *)RequestSenseCPU;
367 Command->V2.RequestSenseDMA = RequestSenseDMA;
368 sg_init_table(Command->cmd_sglist, DAC960_V2_ScatterGatherLimit);
369 }
370 }
371 return true;
372}
373
374
375
376
377
378
379
380static void DAC960_DestroyAuxiliaryStructures(DAC960_Controller_T *Controller)
381{
382 int i;
383 struct dma_pool *ScatterGatherPool = Controller->ScatterGatherPool;
384 struct dma_pool *RequestSensePool = NULL;
385 void *ScatterGatherCPU;
386 dma_addr_t ScatterGatherDMA;
387 void *RequestSenseCPU;
388 dma_addr_t RequestSenseDMA;
389 DAC960_Command_T *CommandGroup = NULL;
390
391
392 if (Controller->FirmwareType == DAC960_V2_Controller)
393 RequestSensePool = Controller->V2.RequestSensePool;
394
395 Controller->FreeCommands = NULL;
396 for (i = 0; i < Controller->DriverQueueDepth; i++)
397 {
398 DAC960_Command_T *Command = Controller->Commands[i];
399
400 if (Command == NULL)
401 continue;
402
403 if (Controller->FirmwareType == DAC960_V1_Controller) {
404 ScatterGatherCPU = (void *)Command->V1.ScatterGatherList;
405 ScatterGatherDMA = Command->V1.ScatterGatherListDMA;
406 RequestSenseCPU = NULL;
407 RequestSenseDMA = (dma_addr_t)0;
408 } else {
409 ScatterGatherCPU = (void *)Command->V2.ScatterGatherList;
410 ScatterGatherDMA = Command->V2.ScatterGatherListDMA;
411 RequestSenseCPU = (void *)Command->V2.RequestSense;
412 RequestSenseDMA = Command->V2.RequestSenseDMA;
413 }
414 if (ScatterGatherCPU != NULL)
415 dma_pool_free(ScatterGatherPool, ScatterGatherCPU, ScatterGatherDMA);
416 if (RequestSenseCPU != NULL)
417 dma_pool_free(RequestSensePool, RequestSenseCPU, RequestSenseDMA);
418
419 if ((Command->CommandIdentifier
420 % Controller->CommandAllocationGroupSize) == 1) {
421
422
423
424
425
426
427 kfree(CommandGroup);
428 CommandGroup = Command;
429 }
430 Controller->Commands[i] = NULL;
431 }
432 kfree(CommandGroup);
433
434 if (Controller->CombinedStatusBuffer != NULL)
435 {
436 kfree(Controller->CombinedStatusBuffer);
437 Controller->CombinedStatusBuffer = NULL;
438 Controller->CurrentStatusBuffer = NULL;
439 }
440
441 dma_pool_destroy(ScatterGatherPool);
442 if (Controller->FirmwareType == DAC960_V1_Controller)
443 return;
444
445 dma_pool_destroy(RequestSensePool);
446
447 for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
448 kfree(Controller->V2.LogicalDeviceInformation[i]);
449 Controller->V2.LogicalDeviceInformation[i] = NULL;
450 }
451
452 for (i = 0; i < DAC960_V2_MaxPhysicalDevices; i++)
453 {
454 kfree(Controller->V2.PhysicalDeviceInformation[i]);
455 Controller->V2.PhysicalDeviceInformation[i] = NULL;
456 kfree(Controller->V2.InquiryUnitSerialNumber[i]);
457 Controller->V2.InquiryUnitSerialNumber[i] = NULL;
458 }
459}
460
461
462
463
464
465
466
467static inline void DAC960_V1_ClearCommand(DAC960_Command_T *Command)
468{
469 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
470 memset(CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
471 Command->V1.CommandStatus = 0;
472}
473
474
475
476
477
478
479
480static inline void DAC960_V2_ClearCommand(DAC960_Command_T *Command)
481{
482 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
483 memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
484 Command->V2.CommandStatus = 0;
485}
486
487
488
489
490
491
492
493
494
495static inline DAC960_Command_T *DAC960_AllocateCommand(DAC960_Controller_T
496 *Controller)
497{
498 DAC960_Command_T *Command = Controller->FreeCommands;
499 if (Command == NULL) return NULL;
500 Controller->FreeCommands = Command->Next;
501 Command->Next = NULL;
502 return Command;
503}
504
505
506
507
508
509
510
511static inline void DAC960_DeallocateCommand(DAC960_Command_T *Command)
512{
513 DAC960_Controller_T *Controller = Command->Controller;
514
515 Command->Request = NULL;
516 Command->Next = Controller->FreeCommands;
517 Controller->FreeCommands = Command;
518}
519
520
521
522
523
524
525static void DAC960_WaitForCommand(DAC960_Controller_T *Controller)
526{
527 spin_unlock_irq(&Controller->queue_lock);
528 __wait_event(Controller->CommandWaitQueue, Controller->FreeCommands);
529 spin_lock_irq(&Controller->queue_lock);
530}
531
532
533
534
535
536static void DAC960_GEM_QueueCommand(DAC960_Command_T *Command)
537{
538 DAC960_Controller_T *Controller = Command->Controller;
539 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
540 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
541 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
542 Controller->V2.NextCommandMailbox;
543
544 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
545 DAC960_GEM_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
546
547 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
548 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
549 DAC960_GEM_MemoryMailboxNewCommand(ControllerBaseAddress);
550
551 Controller->V2.PreviousCommandMailbox2 =
552 Controller->V2.PreviousCommandMailbox1;
553 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
554
555 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
556 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
557
558 Controller->V2.NextCommandMailbox = NextCommandMailbox;
559}
560
561
562
563
564
565static void DAC960_BA_QueueCommand(DAC960_Command_T *Command)
566{
567 DAC960_Controller_T *Controller = Command->Controller;
568 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
569 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
570 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
571 Controller->V2.NextCommandMailbox;
572 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
573 DAC960_BA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
574 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
575 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
576 DAC960_BA_MemoryMailboxNewCommand(ControllerBaseAddress);
577 Controller->V2.PreviousCommandMailbox2 =
578 Controller->V2.PreviousCommandMailbox1;
579 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
580 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
581 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
582 Controller->V2.NextCommandMailbox = NextCommandMailbox;
583}
584
585
586
587
588
589
590static void DAC960_LP_QueueCommand(DAC960_Command_T *Command)
591{
592 DAC960_Controller_T *Controller = Command->Controller;
593 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
594 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
595 DAC960_V2_CommandMailbox_T *NextCommandMailbox =
596 Controller->V2.NextCommandMailbox;
597 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
598 DAC960_LP_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
599 if (Controller->V2.PreviousCommandMailbox1->Words[0] == 0 ||
600 Controller->V2.PreviousCommandMailbox2->Words[0] == 0)
601 DAC960_LP_MemoryMailboxNewCommand(ControllerBaseAddress);
602 Controller->V2.PreviousCommandMailbox2 =
603 Controller->V2.PreviousCommandMailbox1;
604 Controller->V2.PreviousCommandMailbox1 = NextCommandMailbox;
605 if (++NextCommandMailbox > Controller->V2.LastCommandMailbox)
606 NextCommandMailbox = Controller->V2.FirstCommandMailbox;
607 Controller->V2.NextCommandMailbox = NextCommandMailbox;
608}
609
610
611
612
613
614
615
616static void DAC960_LA_QueueCommandDualMode(DAC960_Command_T *Command)
617{
618 DAC960_Controller_T *Controller = Command->Controller;
619 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
620 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
621 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
622 Controller->V1.NextCommandMailbox;
623 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
624 DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
625 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
626 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
627 DAC960_LA_MemoryMailboxNewCommand(ControllerBaseAddress);
628 Controller->V1.PreviousCommandMailbox2 =
629 Controller->V1.PreviousCommandMailbox1;
630 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
631 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
632 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
633 Controller->V1.NextCommandMailbox = NextCommandMailbox;
634}
635
636
637
638
639
640
641
642static void DAC960_LA_QueueCommandSingleMode(DAC960_Command_T *Command)
643{
644 DAC960_Controller_T *Controller = Command->Controller;
645 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
646 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
647 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
648 Controller->V1.NextCommandMailbox;
649 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
650 DAC960_LA_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
651 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
652 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
653 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
654 Controller->V1.PreviousCommandMailbox2 =
655 Controller->V1.PreviousCommandMailbox1;
656 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
657 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
658 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
659 Controller->V1.NextCommandMailbox = NextCommandMailbox;
660}
661
662
663
664
665
666
667
668static void DAC960_PG_QueueCommandDualMode(DAC960_Command_T *Command)
669{
670 DAC960_Controller_T *Controller = Command->Controller;
671 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
672 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
673 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
674 Controller->V1.NextCommandMailbox;
675 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
676 DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
677 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
678 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
679 DAC960_PG_MemoryMailboxNewCommand(ControllerBaseAddress);
680 Controller->V1.PreviousCommandMailbox2 =
681 Controller->V1.PreviousCommandMailbox1;
682 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
683 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
684 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
685 Controller->V1.NextCommandMailbox = NextCommandMailbox;
686}
687
688
689
690
691
692
693
694static void DAC960_PG_QueueCommandSingleMode(DAC960_Command_T *Command)
695{
696 DAC960_Controller_T *Controller = Command->Controller;
697 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
698 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
699 DAC960_V1_CommandMailbox_T *NextCommandMailbox =
700 Controller->V1.NextCommandMailbox;
701 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
702 DAC960_PG_WriteCommandMailbox(NextCommandMailbox, CommandMailbox);
703 if (Controller->V1.PreviousCommandMailbox1->Words[0] == 0 ||
704 Controller->V1.PreviousCommandMailbox2->Words[0] == 0)
705 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
706 Controller->V1.PreviousCommandMailbox2 =
707 Controller->V1.PreviousCommandMailbox1;
708 Controller->V1.PreviousCommandMailbox1 = NextCommandMailbox;
709 if (++NextCommandMailbox > Controller->V1.LastCommandMailbox)
710 NextCommandMailbox = Controller->V1.FirstCommandMailbox;
711 Controller->V1.NextCommandMailbox = NextCommandMailbox;
712}
713
714
715
716
717
718
719static void DAC960_PD_QueueCommand(DAC960_Command_T *Command)
720{
721 DAC960_Controller_T *Controller = Command->Controller;
722 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
723 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
724 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
725 while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
726 udelay(1);
727 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
728 DAC960_PD_NewCommand(ControllerBaseAddress);
729}
730
731
732
733
734
735
736static void DAC960_P_QueueCommand(DAC960_Command_T *Command)
737{
738 DAC960_Controller_T *Controller = Command->Controller;
739 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
740 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
741 CommandMailbox->Common.CommandIdentifier = Command->CommandIdentifier;
742 switch (CommandMailbox->Common.CommandOpcode)
743 {
744 case DAC960_V1_Enquiry:
745 CommandMailbox->Common.CommandOpcode = DAC960_V1_Enquiry_Old;
746 break;
747 case DAC960_V1_GetDeviceState:
748 CommandMailbox->Common.CommandOpcode = DAC960_V1_GetDeviceState_Old;
749 break;
750 case DAC960_V1_Read:
751 CommandMailbox->Common.CommandOpcode = DAC960_V1_Read_Old;
752 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
753 break;
754 case DAC960_V1_Write:
755 CommandMailbox->Common.CommandOpcode = DAC960_V1_Write_Old;
756 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
757 break;
758 case DAC960_V1_ReadWithScatterGather:
759 CommandMailbox->Common.CommandOpcode =
760 DAC960_V1_ReadWithScatterGather_Old;
761 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
762 break;
763 case DAC960_V1_WriteWithScatterGather:
764 CommandMailbox->Common.CommandOpcode =
765 DAC960_V1_WriteWithScatterGather_Old;
766 DAC960_PD_To_P_TranslateReadWriteCommand(CommandMailbox);
767 break;
768 default:
769 break;
770 }
771 while (DAC960_PD_MailboxFullP(ControllerBaseAddress))
772 udelay(1);
773 DAC960_PD_WriteCommandMailbox(ControllerBaseAddress, CommandMailbox);
774 DAC960_PD_NewCommand(ControllerBaseAddress);
775}
776
777
778
779
780
781
782static void DAC960_ExecuteCommand(DAC960_Command_T *Command)
783{
784 DAC960_Controller_T *Controller = Command->Controller;
785 DECLARE_COMPLETION_ONSTACK(Completion);
786 unsigned long flags;
787 Command->Completion = &Completion;
788
789 spin_lock_irqsave(&Controller->queue_lock, flags);
790 DAC960_QueueCommand(Command);
791 spin_unlock_irqrestore(&Controller->queue_lock, flags);
792
793 if (in_interrupt())
794 return;
795 wait_for_completion(&Completion);
796}
797
798
799
800
801
802
803
804
805static bool DAC960_V1_ExecuteType3(DAC960_Controller_T *Controller,
806 DAC960_V1_CommandOpcode_T CommandOpcode,
807 dma_addr_t DataDMA)
808{
809 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
810 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
811 DAC960_V1_CommandStatus_T CommandStatus;
812 DAC960_V1_ClearCommand(Command);
813 Command->CommandType = DAC960_ImmediateCommand;
814 CommandMailbox->Type3.CommandOpcode = CommandOpcode;
815 CommandMailbox->Type3.BusAddress = DataDMA;
816 DAC960_ExecuteCommand(Command);
817 CommandStatus = Command->V1.CommandStatus;
818 DAC960_DeallocateCommand(Command);
819 return (CommandStatus == DAC960_V1_NormalCompletion);
820}
821
822
823
824
825
826
827
828
829static bool DAC960_V1_ExecuteType3B(DAC960_Controller_T *Controller,
830 DAC960_V1_CommandOpcode_T CommandOpcode,
831 unsigned char CommandOpcode2,
832 dma_addr_t DataDMA)
833{
834 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
835 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
836 DAC960_V1_CommandStatus_T CommandStatus;
837 DAC960_V1_ClearCommand(Command);
838 Command->CommandType = DAC960_ImmediateCommand;
839 CommandMailbox->Type3B.CommandOpcode = CommandOpcode;
840 CommandMailbox->Type3B.CommandOpcode2 = CommandOpcode2;
841 CommandMailbox->Type3B.BusAddress = DataDMA;
842 DAC960_ExecuteCommand(Command);
843 CommandStatus = Command->V1.CommandStatus;
844 DAC960_DeallocateCommand(Command);
845 return (CommandStatus == DAC960_V1_NormalCompletion);
846}
847
848
849
850
851
852
853
854
855static bool DAC960_V1_ExecuteType3D(DAC960_Controller_T *Controller,
856 DAC960_V1_CommandOpcode_T CommandOpcode,
857 unsigned char Channel,
858 unsigned char TargetID,
859 dma_addr_t DataDMA)
860{
861 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
862 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
863 DAC960_V1_CommandStatus_T CommandStatus;
864 DAC960_V1_ClearCommand(Command);
865 Command->CommandType = DAC960_ImmediateCommand;
866 CommandMailbox->Type3D.CommandOpcode = CommandOpcode;
867 CommandMailbox->Type3D.Channel = Channel;
868 CommandMailbox->Type3D.TargetID = TargetID;
869 CommandMailbox->Type3D.BusAddress = DataDMA;
870 DAC960_ExecuteCommand(Command);
871 CommandStatus = Command->V1.CommandStatus;
872 DAC960_DeallocateCommand(Command);
873 return (CommandStatus == DAC960_V1_NormalCompletion);
874}
875
876
877
878
879
880
881
882
883
884
885static bool DAC960_V2_GeneralInfo(DAC960_Controller_T *Controller)
886{
887 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
888 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
889 DAC960_V2_CommandStatus_T CommandStatus;
890 DAC960_V2_ClearCommand(Command);
891 Command->CommandType = DAC960_ImmediateCommand;
892 CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL;
893 CommandMailbox->Common.CommandControlBits
894 .DataTransferControllerToHost = true;
895 CommandMailbox->Common.CommandControlBits
896 .NoAutoRequestSense = true;
897 CommandMailbox->Common.DataTransferSize = sizeof(DAC960_V2_HealthStatusBuffer_T);
898 CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_GetHealthStatus;
899 CommandMailbox->Common.DataTransferMemoryAddress
900 .ScatterGatherSegments[0]
901 .SegmentDataPointer =
902 Controller->V2.HealthStatusBufferDMA;
903 CommandMailbox->Common.DataTransferMemoryAddress
904 .ScatterGatherSegments[0]
905 .SegmentByteCount =
906 CommandMailbox->Common.DataTransferSize;
907 DAC960_ExecuteCommand(Command);
908 CommandStatus = Command->V2.CommandStatus;
909 DAC960_DeallocateCommand(Command);
910 return (CommandStatus == DAC960_V2_NormalCompletion);
911}
912
913
914
915
916
917
918
919
920
921
922
923static bool DAC960_V2_NewControllerInfo(DAC960_Controller_T *Controller)
924{
925 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
926 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
927 DAC960_V2_CommandStatus_T CommandStatus;
928 DAC960_V2_ClearCommand(Command);
929 Command->CommandType = DAC960_ImmediateCommand;
930 CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
931 CommandMailbox->ControllerInfo.CommandControlBits
932 .DataTransferControllerToHost = true;
933 CommandMailbox->ControllerInfo.CommandControlBits
934 .NoAutoRequestSense = true;
935 CommandMailbox->ControllerInfo.DataTransferSize = sizeof(DAC960_V2_ControllerInfo_T);
936 CommandMailbox->ControllerInfo.ControllerNumber = 0;
937 CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo;
938 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
939 .ScatterGatherSegments[0]
940 .SegmentDataPointer =
941 Controller->V2.NewControllerInformationDMA;
942 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
943 .ScatterGatherSegments[0]
944 .SegmentByteCount =
945 CommandMailbox->ControllerInfo.DataTransferSize;
946 DAC960_ExecuteCommand(Command);
947 CommandStatus = Command->V2.CommandStatus;
948 DAC960_DeallocateCommand(Command);
949 return (CommandStatus == DAC960_V2_NormalCompletion);
950}
951
952
953
954
955
956
957
958
959
960
961static bool DAC960_V2_NewLogicalDeviceInfo(DAC960_Controller_T *Controller,
962 unsigned short LogicalDeviceNumber)
963{
964 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
965 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
966 DAC960_V2_CommandStatus_T CommandStatus;
967
968 DAC960_V2_ClearCommand(Command);
969 Command->CommandType = DAC960_ImmediateCommand;
970 CommandMailbox->LogicalDeviceInfo.CommandOpcode =
971 DAC960_V2_IOCTL;
972 CommandMailbox->LogicalDeviceInfo.CommandControlBits
973 .DataTransferControllerToHost = true;
974 CommandMailbox->LogicalDeviceInfo.CommandControlBits
975 .NoAutoRequestSense = true;
976 CommandMailbox->LogicalDeviceInfo.DataTransferSize =
977 sizeof(DAC960_V2_LogicalDeviceInfo_T);
978 CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
979 LogicalDeviceNumber;
980 CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode = DAC960_V2_GetLogicalDeviceInfoValid;
981 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
982 .ScatterGatherSegments[0]
983 .SegmentDataPointer =
984 Controller->V2.NewLogicalDeviceInformationDMA;
985 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
986 .ScatterGatherSegments[0]
987 .SegmentByteCount =
988 CommandMailbox->LogicalDeviceInfo.DataTransferSize;
989 DAC960_ExecuteCommand(Command);
990 CommandStatus = Command->V2.CommandStatus;
991 DAC960_DeallocateCommand(Command);
992 return (CommandStatus == DAC960_V2_NormalCompletion);
993}
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012static bool DAC960_V2_NewPhysicalDeviceInfo(DAC960_Controller_T *Controller,
1013 unsigned char Channel,
1014 unsigned char TargetID,
1015 unsigned char LogicalUnit)
1016{
1017 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1018 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1019 DAC960_V2_CommandStatus_T CommandStatus;
1020
1021 DAC960_V2_ClearCommand(Command);
1022 Command->CommandType = DAC960_ImmediateCommand;
1023 CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
1024 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1025 .DataTransferControllerToHost = true;
1026 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
1027 .NoAutoRequestSense = true;
1028 CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
1029 sizeof(DAC960_V2_PhysicalDeviceInfo_T);
1030 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit = LogicalUnit;
1031 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID;
1032 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel;
1033 CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
1034 DAC960_V2_GetPhysicalDeviceInfoValid;
1035 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1036 .ScatterGatherSegments[0]
1037 .SegmentDataPointer =
1038 Controller->V2.NewPhysicalDeviceInformationDMA;
1039 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
1040 .ScatterGatherSegments[0]
1041 .SegmentByteCount =
1042 CommandMailbox->PhysicalDeviceInfo.DataTransferSize;
1043 DAC960_ExecuteCommand(Command);
1044 CommandStatus = Command->V2.CommandStatus;
1045 DAC960_DeallocateCommand(Command);
1046 return (CommandStatus == DAC960_V2_NormalCompletion);
1047}
1048
1049
1050static void DAC960_V2_ConstructNewUnitSerialNumber(
1051 DAC960_Controller_T *Controller,
1052 DAC960_V2_CommandMailbox_T *CommandMailbox, int Channel, int TargetID,
1053 int LogicalUnit)
1054{
1055 CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10_Passthru;
1056 CommandMailbox->SCSI_10.CommandControlBits
1057 .DataTransferControllerToHost = true;
1058 CommandMailbox->SCSI_10.CommandControlBits
1059 .NoAutoRequestSense = true;
1060 CommandMailbox->SCSI_10.DataTransferSize =
1061 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1062 CommandMailbox->SCSI_10.PhysicalDevice.LogicalUnit = LogicalUnit;
1063 CommandMailbox->SCSI_10.PhysicalDevice.TargetID = TargetID;
1064 CommandMailbox->SCSI_10.PhysicalDevice.Channel = Channel;
1065 CommandMailbox->SCSI_10.CDBLength = 6;
1066 CommandMailbox->SCSI_10.SCSI_CDB[0] = 0x12;
1067 CommandMailbox->SCSI_10.SCSI_CDB[1] = 1;
1068 CommandMailbox->SCSI_10.SCSI_CDB[2] = 0x80;
1069 CommandMailbox->SCSI_10.SCSI_CDB[3] = 0;
1070 CommandMailbox->SCSI_10.SCSI_CDB[4] =
1071 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1072 CommandMailbox->SCSI_10.SCSI_CDB[5] = 0;
1073 CommandMailbox->SCSI_10.DataTransferMemoryAddress
1074 .ScatterGatherSegments[0]
1075 .SegmentDataPointer =
1076 Controller->V2.NewInquiryUnitSerialNumberDMA;
1077 CommandMailbox->SCSI_10.DataTransferMemoryAddress
1078 .ScatterGatherSegments[0]
1079 .SegmentByteCount =
1080 CommandMailbox->SCSI_10.DataTransferSize;
1081}
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097static bool DAC960_V2_NewInquiryUnitSerialNumber(DAC960_Controller_T *Controller,
1098 int Channel, int TargetID, int LogicalUnit)
1099{
1100 DAC960_Command_T *Command;
1101 DAC960_V2_CommandMailbox_T *CommandMailbox;
1102 DAC960_V2_CommandStatus_T CommandStatus;
1103
1104 Command = DAC960_AllocateCommand(Controller);
1105 CommandMailbox = &Command->V2.CommandMailbox;
1106 DAC960_V2_ClearCommand(Command);
1107 Command->CommandType = DAC960_ImmediateCommand;
1108
1109 DAC960_V2_ConstructNewUnitSerialNumber(Controller, CommandMailbox,
1110 Channel, TargetID, LogicalUnit);
1111
1112 DAC960_ExecuteCommand(Command);
1113 CommandStatus = Command->V2.CommandStatus;
1114 DAC960_DeallocateCommand(Command);
1115 return (CommandStatus == DAC960_V2_NormalCompletion);
1116}
1117
1118
1119
1120
1121
1122
1123
1124
1125static bool DAC960_V2_DeviceOperation(DAC960_Controller_T *Controller,
1126 DAC960_V2_IOCTL_Opcode_T IOCTL_Opcode,
1127 DAC960_V2_OperationDevice_T
1128 OperationDevice)
1129{
1130 DAC960_Command_T *Command = DAC960_AllocateCommand(Controller);
1131 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
1132 DAC960_V2_CommandStatus_T CommandStatus;
1133 DAC960_V2_ClearCommand(Command);
1134 Command->CommandType = DAC960_ImmediateCommand;
1135 CommandMailbox->DeviceOperation.CommandOpcode = DAC960_V2_IOCTL;
1136 CommandMailbox->DeviceOperation.CommandControlBits
1137 .DataTransferControllerToHost = true;
1138 CommandMailbox->DeviceOperation.CommandControlBits
1139 .NoAutoRequestSense = true;
1140 CommandMailbox->DeviceOperation.IOCTL_Opcode = IOCTL_Opcode;
1141 CommandMailbox->DeviceOperation.OperationDevice = OperationDevice;
1142 DAC960_ExecuteCommand(Command);
1143 CommandStatus = Command->V2.CommandStatus;
1144 DAC960_DeallocateCommand(Command);
1145 return (CommandStatus == DAC960_V2_NormalCompletion);
1146}
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157static bool DAC960_V1_EnableMemoryMailboxInterface(DAC960_Controller_T
1158 *Controller)
1159{
1160 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1161 DAC960_HardwareType_T hw_type = Controller->HardwareType;
1162 struct pci_dev *PCI_Device = Controller->PCIDevice;
1163 struct dma_loaf *DmaPages = &Controller->DmaPages;
1164 size_t DmaPagesSize;
1165 size_t CommandMailboxesSize;
1166 size_t StatusMailboxesSize;
1167
1168 DAC960_V1_CommandMailbox_T *CommandMailboxesMemory;
1169 dma_addr_t CommandMailboxesMemoryDMA;
1170
1171 DAC960_V1_StatusMailbox_T *StatusMailboxesMemory;
1172 dma_addr_t StatusMailboxesMemoryDMA;
1173
1174 DAC960_V1_CommandMailbox_T CommandMailbox;
1175 DAC960_V1_CommandStatus_T CommandStatus;
1176 int TimeoutCounter;
1177 int i;
1178
1179 memset(&CommandMailbox, 0, sizeof(DAC960_V1_CommandMailbox_T));
1180
1181 if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1182 return DAC960_Failure(Controller, "DMA mask out of range");
1183
1184 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller)) {
1185 CommandMailboxesSize = 0;
1186 StatusMailboxesSize = 0;
1187 } else {
1188 CommandMailboxesSize = DAC960_V1_CommandMailboxCount * sizeof(DAC960_V1_CommandMailbox_T);
1189 StatusMailboxesSize = DAC960_V1_StatusMailboxCount * sizeof(DAC960_V1_StatusMailbox_T);
1190 }
1191 DmaPagesSize = CommandMailboxesSize + StatusMailboxesSize +
1192 sizeof(DAC960_V1_DCDB_T) + sizeof(DAC960_V1_Enquiry_T) +
1193 sizeof(DAC960_V1_ErrorTable_T) + sizeof(DAC960_V1_EventLogEntry_T) +
1194 sizeof(DAC960_V1_RebuildProgress_T) +
1195 sizeof(DAC960_V1_LogicalDriveInformationArray_T) +
1196 sizeof(DAC960_V1_BackgroundInitializationStatus_T) +
1197 sizeof(DAC960_V1_DeviceState_T) + sizeof(DAC960_SCSI_Inquiry_T) +
1198 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
1199
1200 if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize))
1201 return false;
1202
1203
1204 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller))
1205 goto skip_mailboxes;
1206
1207 CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1208 CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1209
1210
1211 Controller->V1.FirstCommandMailbox = CommandMailboxesMemory;
1212 Controller->V1.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1213
1214 CommandMailboxesMemory += DAC960_V1_CommandMailboxCount - 1;
1215 Controller->V1.LastCommandMailbox = CommandMailboxesMemory;
1216 Controller->V1.NextCommandMailbox = Controller->V1.FirstCommandMailbox;
1217 Controller->V1.PreviousCommandMailbox1 = Controller->V1.LastCommandMailbox;
1218 Controller->V1.PreviousCommandMailbox2 =
1219 Controller->V1.LastCommandMailbox - 1;
1220
1221
1222 StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1223 StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1224
1225 Controller->V1.FirstStatusMailbox = StatusMailboxesMemory;
1226 Controller->V1.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1227 StatusMailboxesMemory += DAC960_V1_StatusMailboxCount - 1;
1228 Controller->V1.LastStatusMailbox = StatusMailboxesMemory;
1229 Controller->V1.NextStatusMailbox = Controller->V1.FirstStatusMailbox;
1230
1231skip_mailboxes:
1232 Controller->V1.MonitoringDCDB = slice_dma_loaf(DmaPages,
1233 sizeof(DAC960_V1_DCDB_T),
1234 &Controller->V1.MonitoringDCDB_DMA);
1235
1236 Controller->V1.NewEnquiry = slice_dma_loaf(DmaPages,
1237 sizeof(DAC960_V1_Enquiry_T),
1238 &Controller->V1.NewEnquiryDMA);
1239
1240 Controller->V1.NewErrorTable = slice_dma_loaf(DmaPages,
1241 sizeof(DAC960_V1_ErrorTable_T),
1242 &Controller->V1.NewErrorTableDMA);
1243
1244 Controller->V1.EventLogEntry = slice_dma_loaf(DmaPages,
1245 sizeof(DAC960_V1_EventLogEntry_T),
1246 &Controller->V1.EventLogEntryDMA);
1247
1248 Controller->V1.RebuildProgress = slice_dma_loaf(DmaPages,
1249 sizeof(DAC960_V1_RebuildProgress_T),
1250 &Controller->V1.RebuildProgressDMA);
1251
1252 Controller->V1.NewLogicalDriveInformation = slice_dma_loaf(DmaPages,
1253 sizeof(DAC960_V1_LogicalDriveInformationArray_T),
1254 &Controller->V1.NewLogicalDriveInformationDMA);
1255
1256 Controller->V1.BackgroundInitializationStatus = slice_dma_loaf(DmaPages,
1257 sizeof(DAC960_V1_BackgroundInitializationStatus_T),
1258 &Controller->V1.BackgroundInitializationStatusDMA);
1259
1260 Controller->V1.NewDeviceState = slice_dma_loaf(DmaPages,
1261 sizeof(DAC960_V1_DeviceState_T),
1262 &Controller->V1.NewDeviceStateDMA);
1263
1264 Controller->V1.NewInquiryStandardData = slice_dma_loaf(DmaPages,
1265 sizeof(DAC960_SCSI_Inquiry_T),
1266 &Controller->V1.NewInquiryStandardDataDMA);
1267
1268 Controller->V1.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1269 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1270 &Controller->V1.NewInquiryUnitSerialNumberDMA);
1271
1272 if ((hw_type == DAC960_PD_Controller) || (hw_type == DAC960_P_Controller))
1273 return true;
1274
1275
1276 Controller->V1.DualModeMemoryMailboxInterface = true;
1277 CommandMailbox.TypeX.CommandOpcode = 0x2B;
1278 CommandMailbox.TypeX.CommandIdentifier = 0;
1279 CommandMailbox.TypeX.CommandOpcode2 = 0x14;
1280 CommandMailbox.TypeX.CommandMailboxesBusAddress =
1281 Controller->V1.FirstCommandMailboxDMA;
1282 CommandMailbox.TypeX.StatusMailboxesBusAddress =
1283 Controller->V1.FirstStatusMailboxDMA;
1284#define TIMEOUT_COUNT 1000000
1285
1286 for (i = 0; i < 2; i++)
1287 switch (Controller->HardwareType)
1288 {
1289 case DAC960_LA_Controller:
1290 TimeoutCounter = TIMEOUT_COUNT;
1291 while (--TimeoutCounter >= 0)
1292 {
1293 if (!DAC960_LA_HardwareMailboxFullP(ControllerBaseAddress))
1294 break;
1295 udelay(10);
1296 }
1297 if (TimeoutCounter < 0) return false;
1298 DAC960_LA_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1299 DAC960_LA_HardwareMailboxNewCommand(ControllerBaseAddress);
1300 TimeoutCounter = TIMEOUT_COUNT;
1301 while (--TimeoutCounter >= 0)
1302 {
1303 if (DAC960_LA_HardwareMailboxStatusAvailableP(
1304 ControllerBaseAddress))
1305 break;
1306 udelay(10);
1307 }
1308 if (TimeoutCounter < 0) return false;
1309 CommandStatus = DAC960_LA_ReadStatusRegister(ControllerBaseAddress);
1310 DAC960_LA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1311 DAC960_LA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1312 if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1313 Controller->V1.DualModeMemoryMailboxInterface = false;
1314 CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1315 break;
1316 case DAC960_PG_Controller:
1317 TimeoutCounter = TIMEOUT_COUNT;
1318 while (--TimeoutCounter >= 0)
1319 {
1320 if (!DAC960_PG_HardwareMailboxFullP(ControllerBaseAddress))
1321 break;
1322 udelay(10);
1323 }
1324 if (TimeoutCounter < 0) return false;
1325 DAC960_PG_WriteHardwareMailbox(ControllerBaseAddress, &CommandMailbox);
1326 DAC960_PG_HardwareMailboxNewCommand(ControllerBaseAddress);
1327
1328 TimeoutCounter = TIMEOUT_COUNT;
1329 while (--TimeoutCounter >= 0)
1330 {
1331 if (DAC960_PG_HardwareMailboxStatusAvailableP(
1332 ControllerBaseAddress))
1333 break;
1334 udelay(10);
1335 }
1336 if (TimeoutCounter < 0) return false;
1337 CommandStatus = DAC960_PG_ReadStatusRegister(ControllerBaseAddress);
1338 DAC960_PG_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1339 DAC960_PG_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1340 if (CommandStatus == DAC960_V1_NormalCompletion) return true;
1341 Controller->V1.DualModeMemoryMailboxInterface = false;
1342 CommandMailbox.TypeX.CommandOpcode2 = 0x10;
1343 break;
1344 default:
1345 DAC960_Failure(Controller, "Unknown Controller Type\n");
1346 break;
1347 }
1348 return false;
1349}
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363static bool DAC960_V2_EnableMemoryMailboxInterface(DAC960_Controller_T
1364 *Controller)
1365{
1366 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
1367 struct pci_dev *PCI_Device = Controller->PCIDevice;
1368 struct dma_loaf *DmaPages = &Controller->DmaPages;
1369 size_t DmaPagesSize;
1370 size_t CommandMailboxesSize;
1371 size_t StatusMailboxesSize;
1372
1373 DAC960_V2_CommandMailbox_T *CommandMailboxesMemory;
1374 dma_addr_t CommandMailboxesMemoryDMA;
1375
1376 DAC960_V2_StatusMailbox_T *StatusMailboxesMemory;
1377 dma_addr_t StatusMailboxesMemoryDMA;
1378
1379 DAC960_V2_CommandMailbox_T *CommandMailbox;
1380 dma_addr_t CommandMailboxDMA;
1381 DAC960_V2_CommandStatus_T CommandStatus;
1382
1383 if (pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(64)) &&
1384 pci_set_dma_mask(Controller->PCIDevice, DMA_BIT_MASK(32)))
1385 return DAC960_Failure(Controller, "DMA mask out of range");
1386
1387
1388 CommandMailbox = pci_alloc_consistent(PCI_Device,
1389 sizeof(DAC960_V2_CommandMailbox_T), &CommandMailboxDMA);
1390 if (CommandMailbox == NULL)
1391 return false;
1392
1393 CommandMailboxesSize = DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T);
1394 StatusMailboxesSize = DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T);
1395 DmaPagesSize =
1396 CommandMailboxesSize + StatusMailboxesSize +
1397 sizeof(DAC960_V2_HealthStatusBuffer_T) +
1398 sizeof(DAC960_V2_ControllerInfo_T) +
1399 sizeof(DAC960_V2_LogicalDeviceInfo_T) +
1400 sizeof(DAC960_V2_PhysicalDeviceInfo_T) +
1401 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T) +
1402 sizeof(DAC960_V2_Event_T) +
1403 sizeof(DAC960_V2_PhysicalToLogicalDevice_T);
1404
1405 if (!init_dma_loaf(PCI_Device, DmaPages, DmaPagesSize)) {
1406 pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1407 CommandMailbox, CommandMailboxDMA);
1408 return false;
1409 }
1410
1411 CommandMailboxesMemory = slice_dma_loaf(DmaPages,
1412 CommandMailboxesSize, &CommandMailboxesMemoryDMA);
1413
1414
1415 Controller->V2.FirstCommandMailbox = CommandMailboxesMemory;
1416 Controller->V2.FirstCommandMailboxDMA = CommandMailboxesMemoryDMA;
1417
1418 CommandMailboxesMemory += DAC960_V2_CommandMailboxCount - 1;
1419 Controller->V2.LastCommandMailbox = CommandMailboxesMemory;
1420 Controller->V2.NextCommandMailbox = Controller->V2.FirstCommandMailbox;
1421 Controller->V2.PreviousCommandMailbox1 = Controller->V2.LastCommandMailbox;
1422 Controller->V2.PreviousCommandMailbox2 =
1423 Controller->V2.LastCommandMailbox - 1;
1424
1425
1426 StatusMailboxesMemory = slice_dma_loaf(DmaPages,
1427 StatusMailboxesSize, &StatusMailboxesMemoryDMA);
1428
1429 Controller->V2.FirstStatusMailbox = StatusMailboxesMemory;
1430 Controller->V2.FirstStatusMailboxDMA = StatusMailboxesMemoryDMA;
1431 StatusMailboxesMemory += DAC960_V2_StatusMailboxCount - 1;
1432 Controller->V2.LastStatusMailbox = StatusMailboxesMemory;
1433 Controller->V2.NextStatusMailbox = Controller->V2.FirstStatusMailbox;
1434
1435 Controller->V2.HealthStatusBuffer = slice_dma_loaf(DmaPages,
1436 sizeof(DAC960_V2_HealthStatusBuffer_T),
1437 &Controller->V2.HealthStatusBufferDMA);
1438
1439 Controller->V2.NewControllerInformation = slice_dma_loaf(DmaPages,
1440 sizeof(DAC960_V2_ControllerInfo_T),
1441 &Controller->V2.NewControllerInformationDMA);
1442
1443 Controller->V2.NewLogicalDeviceInformation = slice_dma_loaf(DmaPages,
1444 sizeof(DAC960_V2_LogicalDeviceInfo_T),
1445 &Controller->V2.NewLogicalDeviceInformationDMA);
1446
1447 Controller->V2.NewPhysicalDeviceInformation = slice_dma_loaf(DmaPages,
1448 sizeof(DAC960_V2_PhysicalDeviceInfo_T),
1449 &Controller->V2.NewPhysicalDeviceInformationDMA);
1450
1451 Controller->V2.NewInquiryUnitSerialNumber = slice_dma_loaf(DmaPages,
1452 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1453 &Controller->V2.NewInquiryUnitSerialNumberDMA);
1454
1455 Controller->V2.Event = slice_dma_loaf(DmaPages,
1456 sizeof(DAC960_V2_Event_T),
1457 &Controller->V2.EventDMA);
1458
1459 Controller->V2.PhysicalToLogicalDevice = slice_dma_loaf(DmaPages,
1460 sizeof(DAC960_V2_PhysicalToLogicalDevice_T),
1461 &Controller->V2.PhysicalToLogicalDeviceDMA);
1462
1463
1464
1465
1466
1467
1468
1469
1470 memset(CommandMailbox, 0, sizeof(DAC960_V2_CommandMailbox_T));
1471 CommandMailbox->SetMemoryMailbox.CommandIdentifier = 1;
1472 CommandMailbox->SetMemoryMailbox.CommandOpcode = DAC960_V2_IOCTL;
1473 CommandMailbox->SetMemoryMailbox.CommandControlBits.NoAutoRequestSense = true;
1474 CommandMailbox->SetMemoryMailbox.FirstCommandMailboxSizeKB =
1475 (DAC960_V2_CommandMailboxCount * sizeof(DAC960_V2_CommandMailbox_T)) >> 10;
1476 CommandMailbox->SetMemoryMailbox.FirstStatusMailboxSizeKB =
1477 (DAC960_V2_StatusMailboxCount * sizeof(DAC960_V2_StatusMailbox_T)) >> 10;
1478 CommandMailbox->SetMemoryMailbox.SecondCommandMailboxSizeKB = 0;
1479 CommandMailbox->SetMemoryMailbox.SecondStatusMailboxSizeKB = 0;
1480 CommandMailbox->SetMemoryMailbox.RequestSenseSize = 0;
1481 CommandMailbox->SetMemoryMailbox.IOCTL_Opcode = DAC960_V2_SetMemoryMailbox;
1482 CommandMailbox->SetMemoryMailbox.HealthStatusBufferSizeKB = 1;
1483 CommandMailbox->SetMemoryMailbox.HealthStatusBufferBusAddress =
1484 Controller->V2.HealthStatusBufferDMA;
1485 CommandMailbox->SetMemoryMailbox.FirstCommandMailboxBusAddress =
1486 Controller->V2.FirstCommandMailboxDMA;
1487 CommandMailbox->SetMemoryMailbox.FirstStatusMailboxBusAddress =
1488 Controller->V2.FirstStatusMailboxDMA;
1489 switch (Controller->HardwareType)
1490 {
1491 case DAC960_GEM_Controller:
1492 while (DAC960_GEM_HardwareMailboxFullP(ControllerBaseAddress))
1493 udelay(1);
1494 DAC960_GEM_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1495 DAC960_GEM_HardwareMailboxNewCommand(ControllerBaseAddress);
1496 while (!DAC960_GEM_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1497 udelay(1);
1498 CommandStatus = DAC960_GEM_ReadCommandStatus(ControllerBaseAddress);
1499 DAC960_GEM_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1500 DAC960_GEM_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1501 break;
1502 case DAC960_BA_Controller:
1503 while (DAC960_BA_HardwareMailboxFullP(ControllerBaseAddress))
1504 udelay(1);
1505 DAC960_BA_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1506 DAC960_BA_HardwareMailboxNewCommand(ControllerBaseAddress);
1507 while (!DAC960_BA_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1508 udelay(1);
1509 CommandStatus = DAC960_BA_ReadCommandStatus(ControllerBaseAddress);
1510 DAC960_BA_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1511 DAC960_BA_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1512 break;
1513 case DAC960_LP_Controller:
1514 while (DAC960_LP_HardwareMailboxFullP(ControllerBaseAddress))
1515 udelay(1);
1516 DAC960_LP_WriteHardwareMailbox(ControllerBaseAddress, CommandMailboxDMA);
1517 DAC960_LP_HardwareMailboxNewCommand(ControllerBaseAddress);
1518 while (!DAC960_LP_HardwareMailboxStatusAvailableP(ControllerBaseAddress))
1519 udelay(1);
1520 CommandStatus = DAC960_LP_ReadCommandStatus(ControllerBaseAddress);
1521 DAC960_LP_AcknowledgeHardwareMailboxInterrupt(ControllerBaseAddress);
1522 DAC960_LP_AcknowledgeHardwareMailboxStatus(ControllerBaseAddress);
1523 break;
1524 default:
1525 DAC960_Failure(Controller, "Unknown Controller Type\n");
1526 CommandStatus = DAC960_V2_AbormalCompletion;
1527 break;
1528 }
1529 pci_free_consistent(PCI_Device, sizeof(DAC960_V2_CommandMailbox_T),
1530 CommandMailbox, CommandMailboxDMA);
1531 return (CommandStatus == DAC960_V2_NormalCompletion);
1532}
1533
1534
1535
1536
1537
1538
1539
1540static bool DAC960_V1_ReadControllerConfiguration(DAC960_Controller_T
1541 *Controller)
1542{
1543 DAC960_V1_Enquiry2_T *Enquiry2;
1544 dma_addr_t Enquiry2DMA;
1545 DAC960_V1_Config2_T *Config2;
1546 dma_addr_t Config2DMA;
1547 int LogicalDriveNumber, Channel, TargetID;
1548 struct dma_loaf local_dma;
1549
1550 if (!init_dma_loaf(Controller->PCIDevice, &local_dma,
1551 sizeof(DAC960_V1_Enquiry2_T) + sizeof(DAC960_V1_Config2_T)))
1552 return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1553
1554 Enquiry2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Enquiry2_T), &Enquiry2DMA);
1555 Config2 = slice_dma_loaf(&local_dma, sizeof(DAC960_V1_Config2_T), &Config2DMA);
1556
1557 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry,
1558 Controller->V1.NewEnquiryDMA)) {
1559 free_dma_loaf(Controller->PCIDevice, &local_dma);
1560 return DAC960_Failure(Controller, "ENQUIRY");
1561 }
1562 memcpy(&Controller->V1.Enquiry, Controller->V1.NewEnquiry,
1563 sizeof(DAC960_V1_Enquiry_T));
1564
1565 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_Enquiry2, Enquiry2DMA)) {
1566 free_dma_loaf(Controller->PCIDevice, &local_dma);
1567 return DAC960_Failure(Controller, "ENQUIRY2");
1568 }
1569
1570 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_ReadConfig2, Config2DMA)) {
1571 free_dma_loaf(Controller->PCIDevice, &local_dma);
1572 return DAC960_Failure(Controller, "READ CONFIG2");
1573 }
1574
1575 if (!DAC960_V1_ExecuteType3(Controller, DAC960_V1_GetLogicalDriveInformation,
1576 Controller->V1.NewLogicalDriveInformationDMA)) {
1577 free_dma_loaf(Controller->PCIDevice, &local_dma);
1578 return DAC960_Failure(Controller, "GET LOGICAL DRIVE INFORMATION");
1579 }
1580 memcpy(&Controller->V1.LogicalDriveInformation,
1581 Controller->V1.NewLogicalDriveInformation,
1582 sizeof(DAC960_V1_LogicalDriveInformationArray_T));
1583
1584 for (Channel = 0; Channel < Enquiry2->ActualChannels; Channel++)
1585 for (TargetID = 0; TargetID < Enquiry2->MaxTargets; TargetID++) {
1586 if (!DAC960_V1_ExecuteType3D(Controller, DAC960_V1_GetDeviceState,
1587 Channel, TargetID,
1588 Controller->V1.NewDeviceStateDMA)) {
1589 free_dma_loaf(Controller->PCIDevice, &local_dma);
1590 return DAC960_Failure(Controller, "GET DEVICE STATE");
1591 }
1592 memcpy(&Controller->V1.DeviceState[Channel][TargetID],
1593 Controller->V1.NewDeviceState, sizeof(DAC960_V1_DeviceState_T));
1594 }
1595
1596
1597
1598 switch (Enquiry2->HardwareID.SubModel)
1599 {
1600 case DAC960_V1_P_PD_PU:
1601 if (Enquiry2->SCSICapability.BusSpeed == DAC960_V1_Ultra)
1602 strcpy(Controller->ModelName, "DAC960PU");
1603 else strcpy(Controller->ModelName, "DAC960PD");
1604 break;
1605 case DAC960_V1_PL:
1606 strcpy(Controller->ModelName, "DAC960PL");
1607 break;
1608 case DAC960_V1_PG:
1609 strcpy(Controller->ModelName, "DAC960PG");
1610 break;
1611 case DAC960_V1_PJ:
1612 strcpy(Controller->ModelName, "DAC960PJ");
1613 break;
1614 case DAC960_V1_PR:
1615 strcpy(Controller->ModelName, "DAC960PR");
1616 break;
1617 case DAC960_V1_PT:
1618 strcpy(Controller->ModelName, "DAC960PT");
1619 break;
1620 case DAC960_V1_PTL0:
1621 strcpy(Controller->ModelName, "DAC960PTL0");
1622 break;
1623 case DAC960_V1_PRL:
1624 strcpy(Controller->ModelName, "DAC960PRL");
1625 break;
1626 case DAC960_V1_PTL1:
1627 strcpy(Controller->ModelName, "DAC960PTL1");
1628 break;
1629 case DAC960_V1_1164P:
1630 strcpy(Controller->ModelName, "DAC1164P");
1631 break;
1632 default:
1633 free_dma_loaf(Controller->PCIDevice, &local_dma);
1634 return DAC960_Failure(Controller, "MODEL VERIFICATION");
1635 }
1636 strcpy(Controller->FullModelName, "Mylex ");
1637 strcat(Controller->FullModelName, Controller->ModelName);
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647#if defined(CONFIG_ALPHA)
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662# define FIRMWARE_27X "2.70"
1663#else
1664# define FIRMWARE_27X "2.73"
1665#endif
1666
1667 if (Enquiry2->FirmwareID.MajorVersion == 0)
1668 {
1669 Enquiry2->FirmwareID.MajorVersion =
1670 Controller->V1.Enquiry.MajorFirmwareVersion;
1671 Enquiry2->FirmwareID.MinorVersion =
1672 Controller->V1.Enquiry.MinorFirmwareVersion;
1673 Enquiry2->FirmwareID.FirmwareType = '0';
1674 Enquiry2->FirmwareID.TurnID = 0;
1675 }
1676 snprintf(Controller->FirmwareVersion, sizeof(Controller->FirmwareVersion),
1677 "%d.%02d-%c-%02d",
1678 Enquiry2->FirmwareID.MajorVersion,
1679 Enquiry2->FirmwareID.MinorVersion,
1680 Enquiry2->FirmwareID.FirmwareType,
1681 Enquiry2->FirmwareID.TurnID);
1682 if (!((Controller->FirmwareVersion[0] == '5' &&
1683 strcmp(Controller->FirmwareVersion, "5.06") >= 0) ||
1684 (Controller->FirmwareVersion[0] == '4' &&
1685 strcmp(Controller->FirmwareVersion, "4.06") >= 0) ||
1686 (Controller->FirmwareVersion[0] == '3' &&
1687 strcmp(Controller->FirmwareVersion, "3.51") >= 0) ||
1688 (Controller->FirmwareVersion[0] == '2' &&
1689 strcmp(Controller->FirmwareVersion, FIRMWARE_27X) >= 0)))
1690 {
1691 DAC960_Failure(Controller, "FIRMWARE VERSION VERIFICATION");
1692 DAC960_Error("Firmware Version = '%s'\n", Controller,
1693 Controller->FirmwareVersion);
1694 free_dma_loaf(Controller->PCIDevice, &local_dma);
1695 return false;
1696 }
1697
1698
1699
1700
1701 Controller->Channels = Enquiry2->ActualChannels;
1702 Controller->Targets = Enquiry2->MaxTargets;
1703 Controller->MemorySize = Enquiry2->MemorySize >> 20;
1704 Controller->V1.SAFTE_EnclosureManagementEnabled =
1705 (Enquiry2->FaultManagementType == DAC960_V1_SAFTE);
1706
1707
1708
1709
1710
1711
1712
1713 Controller->ControllerQueueDepth = Controller->V1.Enquiry.MaxCommands;
1714 Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1715 if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1716 Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1717 Controller->LogicalDriveCount =
1718 Controller->V1.Enquiry.NumberOfLogicalDrives;
1719 Controller->MaxBlocksPerCommand = Enquiry2->MaxBlocksPerCommand;
1720 Controller->ControllerScatterGatherLimit = Enquiry2->MaxScatterGatherEntries;
1721 Controller->DriverScatterGatherLimit =
1722 Controller->ControllerScatterGatherLimit;
1723 if (Controller->DriverScatterGatherLimit > DAC960_V1_ScatterGatherLimit)
1724 Controller->DriverScatterGatherLimit = DAC960_V1_ScatterGatherLimit;
1725
1726
1727
1728 Controller->V1.StripeSize = Config2->BlocksPerStripe * Config2->BlockFactor
1729 >> (10 - DAC960_BlockSizeBits);
1730 Controller->V1.SegmentSize = Config2->BlocksPerCacheLine * Config2->BlockFactor
1731 >> (10 - DAC960_BlockSizeBits);
1732 switch (Config2->DriveGeometry)
1733 {
1734 case DAC960_V1_Geometry_128_32:
1735 Controller->V1.GeometryTranslationHeads = 128;
1736 Controller->V1.GeometryTranslationSectors = 32;
1737 break;
1738 case DAC960_V1_Geometry_255_63:
1739 Controller->V1.GeometryTranslationHeads = 255;
1740 Controller->V1.GeometryTranslationSectors = 63;
1741 break;
1742 default:
1743 free_dma_loaf(Controller->PCIDevice, &local_dma);
1744 return DAC960_Failure(Controller, "CONFIG2 DRIVE GEOMETRY");
1745 }
1746
1747
1748
1749 if ((Controller->FirmwareVersion[0] == '4' &&
1750 strcmp(Controller->FirmwareVersion, "4.08") >= 0) ||
1751 (Controller->FirmwareVersion[0] == '5' &&
1752 strcmp(Controller->FirmwareVersion, "5.08") >= 0))
1753 {
1754 Controller->V1.BackgroundInitializationStatusSupported = true;
1755 DAC960_V1_ExecuteType3B(Controller,
1756 DAC960_V1_BackgroundInitializationControl, 0x20,
1757 Controller->
1758 V1.BackgroundInitializationStatusDMA);
1759 memcpy(&Controller->V1.LastBackgroundInitializationStatus,
1760 Controller->V1.BackgroundInitializationStatus,
1761 sizeof(DAC960_V1_BackgroundInitializationStatus_T));
1762 }
1763
1764
1765
1766 for (LogicalDriveNumber = 0;
1767 LogicalDriveNumber < Controller->LogicalDriveCount;
1768 LogicalDriveNumber++)
1769 if (Controller->V1.LogicalDriveInformation
1770 [LogicalDriveNumber].LogicalDriveState !=
1771 DAC960_V1_LogicalDrive_Offline)
1772 Controller->LogicalDriveInitiallyAccessible[LogicalDriveNumber] = true;
1773 Controller->V1.LastRebuildStatus = DAC960_V1_NoRebuildOrCheckInProgress;
1774 free_dma_loaf(Controller->PCIDevice, &local_dma);
1775 return true;
1776}
1777
1778
1779
1780
1781
1782
1783
1784static bool DAC960_V2_ReadControllerConfiguration(DAC960_Controller_T
1785 *Controller)
1786{
1787 DAC960_V2_ControllerInfo_T *ControllerInfo =
1788 &Controller->V2.ControllerInformation;
1789 unsigned short LogicalDeviceNumber = 0;
1790 int ModelNameLength;
1791
1792
1793 if (!DAC960_V2_NewControllerInfo(Controller))
1794 return DAC960_Failure(Controller, "GET CONTROLLER INFO");
1795 memcpy(ControllerInfo, Controller->V2.NewControllerInformation,
1796 sizeof(DAC960_V2_ControllerInfo_T));
1797
1798
1799 if (!DAC960_V2_GeneralInfo(Controller))
1800 return DAC960_Failure(Controller, "GET HEALTH STATUS");
1801
1802
1803
1804
1805 ModelNameLength = sizeof(ControllerInfo->ControllerName);
1806 if (ModelNameLength > sizeof(Controller->ModelName)-1)
1807 ModelNameLength = sizeof(Controller->ModelName)-1;
1808 memcpy(Controller->ModelName, ControllerInfo->ControllerName,
1809 ModelNameLength);
1810 ModelNameLength--;
1811 while (Controller->ModelName[ModelNameLength] == ' ' ||
1812 Controller->ModelName[ModelNameLength] == '\0')
1813 ModelNameLength--;
1814 Controller->ModelName[++ModelNameLength] = '\0';
1815 strcpy(Controller->FullModelName, "Mylex ");
1816 strcat(Controller->FullModelName, Controller->ModelName);
1817
1818
1819
1820 sprintf(Controller->FirmwareVersion, "%d.%02d-%02d",
1821 ControllerInfo->FirmwareMajorVersion,
1822 ControllerInfo->FirmwareMinorVersion,
1823 ControllerInfo->FirmwareTurnNumber);
1824 if (ControllerInfo->FirmwareMajorVersion == 6 &&
1825 ControllerInfo->FirmwareMinorVersion == 0 &&
1826 ControllerInfo->FirmwareTurnNumber < 1)
1827 {
1828 DAC960_Info("FIRMWARE VERSION %s DOES NOT PROVIDE THE CONTROLLER\n",
1829 Controller, Controller->FirmwareVersion);
1830 DAC960_Info("STATUS MONITORING FUNCTIONALITY NEEDED BY THIS DRIVER.\n",
1831 Controller);
1832 DAC960_Info("PLEASE UPGRADE TO VERSION 6.00-01 OR ABOVE.\n",
1833 Controller);
1834 }
1835
1836
1837
1838 Controller->Channels = ControllerInfo->NumberOfPhysicalChannelsPresent;
1839 Controller->Targets =
1840 ControllerInfo->MaximumTargetsPerChannel
1841 [ControllerInfo->NumberOfPhysicalChannelsPresent-1];
1842 Controller->MemorySize = ControllerInfo->MemorySizeMB;
1843
1844
1845
1846
1847
1848
1849
1850 Controller->ControllerQueueDepth = ControllerInfo->MaximumParallelCommands;
1851 Controller->DriverQueueDepth = Controller->ControllerQueueDepth - 1;
1852 if (Controller->DriverQueueDepth > DAC960_MaxDriverQueueDepth)
1853 Controller->DriverQueueDepth = DAC960_MaxDriverQueueDepth;
1854 Controller->LogicalDriveCount = ControllerInfo->LogicalDevicesPresent;
1855 Controller->MaxBlocksPerCommand =
1856 ControllerInfo->MaximumDataTransferSizeInBlocks;
1857 Controller->ControllerScatterGatherLimit =
1858 ControllerInfo->MaximumScatterGatherEntries;
1859 Controller->DriverScatterGatherLimit =
1860 Controller->ControllerScatterGatherLimit;
1861 if (Controller->DriverScatterGatherLimit > DAC960_V2_ScatterGatherLimit)
1862 Controller->DriverScatterGatherLimit = DAC960_V2_ScatterGatherLimit;
1863
1864
1865
1866 while (true)
1867 {
1868 DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
1869 Controller->V2.NewLogicalDeviceInformation;
1870 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo;
1871 DAC960_V2_PhysicalDevice_T PhysicalDevice;
1872
1873 if (!DAC960_V2_NewLogicalDeviceInfo(Controller, LogicalDeviceNumber))
1874 break;
1875 LogicalDeviceNumber = NewLogicalDeviceInfo->LogicalDeviceNumber;
1876 if (LogicalDeviceNumber >= DAC960_MaxLogicalDrives) {
1877 DAC960_Error("DAC960: Logical Drive Number %d not supported\n",
1878 Controller, LogicalDeviceNumber);
1879 break;
1880 }
1881 if (NewLogicalDeviceInfo->DeviceBlockSizeInBytes != DAC960_BlockSize) {
1882 DAC960_Error("DAC960: Logical Drive Block Size %d not supported\n",
1883 Controller, NewLogicalDeviceInfo->DeviceBlockSizeInBytes);
1884 LogicalDeviceNumber++;
1885 continue;
1886 }
1887 PhysicalDevice.Controller = 0;
1888 PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel;
1889 PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID;
1890 PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
1891 Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
1892 PhysicalDevice;
1893 if (NewLogicalDeviceInfo->LogicalDeviceState !=
1894 DAC960_V2_LogicalDevice_Offline)
1895 Controller->LogicalDriveInitiallyAccessible[LogicalDeviceNumber] = true;
1896 LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
1897 GFP_ATOMIC);
1898 if (LogicalDeviceInfo == NULL)
1899 return DAC960_Failure(Controller, "LOGICAL DEVICE ALLOCATION");
1900 Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
1901 LogicalDeviceInfo;
1902 memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo,
1903 sizeof(DAC960_V2_LogicalDeviceInfo_T));
1904 LogicalDeviceNumber++;
1905 }
1906 return true;
1907}
1908
1909
1910
1911
1912
1913
1914
1915static bool DAC960_ReportControllerConfiguration(DAC960_Controller_T
1916 *Controller)
1917{
1918 DAC960_Info("Configuring Mylex %s PCI RAID Controller\n",
1919 Controller, Controller->ModelName);
1920 DAC960_Info(" Firmware Version: %s, Channels: %d, Memory Size: %dMB\n",
1921 Controller, Controller->FirmwareVersion,
1922 Controller->Channels, Controller->MemorySize);
1923 DAC960_Info(" PCI Bus: %d, Device: %d, Function: %d, I/O Address: ",
1924 Controller, Controller->Bus,
1925 Controller->Device, Controller->Function);
1926 if (Controller->IO_Address == 0)
1927 DAC960_Info("Unassigned\n", Controller);
1928 else DAC960_Info("0x%X\n", Controller, Controller->IO_Address);
1929 DAC960_Info(" PCI Address: 0x%X mapped at 0x%lX, IRQ Channel: %d\n",
1930 Controller, Controller->PCI_Address,
1931 (unsigned long) Controller->BaseAddress,
1932 Controller->IRQ_Channel);
1933 DAC960_Info(" Controller Queue Depth: %d, "
1934 "Maximum Blocks per Command: %d\n",
1935 Controller, Controller->ControllerQueueDepth,
1936 Controller->MaxBlocksPerCommand);
1937 DAC960_Info(" Driver Queue Depth: %d, "
1938 "Scatter/Gather Limit: %d of %d Segments\n",
1939 Controller, Controller->DriverQueueDepth,
1940 Controller->DriverScatterGatherLimit,
1941 Controller->ControllerScatterGatherLimit);
1942 if (Controller->FirmwareType == DAC960_V1_Controller)
1943 {
1944 DAC960_Info(" Stripe Size: %dKB, Segment Size: %dKB, "
1945 "BIOS Geometry: %d/%d\n", Controller,
1946 Controller->V1.StripeSize,
1947 Controller->V1.SegmentSize,
1948 Controller->V1.GeometryTranslationHeads,
1949 Controller->V1.GeometryTranslationSectors);
1950 if (Controller->V1.SAFTE_EnclosureManagementEnabled)
1951 DAC960_Info(" SAF-TE Enclosure Management Enabled\n", Controller);
1952 }
1953 return true;
1954}
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964static bool DAC960_V1_ReadDeviceConfiguration(DAC960_Controller_T
1965 *Controller)
1966{
1967 struct dma_loaf local_dma;
1968
1969 dma_addr_t DCDBs_dma[DAC960_V1_MaxChannels];
1970 DAC960_V1_DCDB_T *DCDBs_cpu[DAC960_V1_MaxChannels];
1971
1972 dma_addr_t SCSI_Inquiry_dma[DAC960_V1_MaxChannels];
1973 DAC960_SCSI_Inquiry_T *SCSI_Inquiry_cpu[DAC960_V1_MaxChannels];
1974
1975 dma_addr_t SCSI_NewInquiryUnitSerialNumberDMA[DAC960_V1_MaxChannels];
1976 DAC960_SCSI_Inquiry_UnitSerialNumber_T *SCSI_NewInquiryUnitSerialNumberCPU[DAC960_V1_MaxChannels];
1977
1978 struct completion Completions[DAC960_V1_MaxChannels];
1979 unsigned long flags;
1980 int Channel, TargetID;
1981
1982 if (!init_dma_loaf(Controller->PCIDevice, &local_dma,
1983 DAC960_V1_MaxChannels*(sizeof(DAC960_V1_DCDB_T) +
1984 sizeof(DAC960_SCSI_Inquiry_T) +
1985 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T))))
1986 return DAC960_Failure(Controller,
1987 "DMA ALLOCATION FAILED IN ReadDeviceConfiguration");
1988
1989 for (Channel = 0; Channel < Controller->Channels; Channel++) {
1990 DCDBs_cpu[Channel] = slice_dma_loaf(&local_dma,
1991 sizeof(DAC960_V1_DCDB_T), DCDBs_dma + Channel);
1992 SCSI_Inquiry_cpu[Channel] = slice_dma_loaf(&local_dma,
1993 sizeof(DAC960_SCSI_Inquiry_T),
1994 SCSI_Inquiry_dma + Channel);
1995 SCSI_NewInquiryUnitSerialNumberCPU[Channel] = slice_dma_loaf(&local_dma,
1996 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
1997 SCSI_NewInquiryUnitSerialNumberDMA + Channel);
1998 }
1999
2000 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
2001 {
2002
2003
2004
2005
2006
2007
2008 for (Channel = 0; Channel < Controller->Channels; Channel++)
2009 {
2010 dma_addr_t NewInquiryStandardDataDMA = SCSI_Inquiry_dma[Channel];
2011 DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2012 dma_addr_t DCDB_dma = DCDBs_dma[Channel];
2013 DAC960_Command_T *Command = Controller->Commands[Channel];
2014 struct completion *Completion = &Completions[Channel];
2015
2016 init_completion(Completion);
2017 DAC960_V1_ClearCommand(Command);
2018 Command->CommandType = DAC960_ImmediateCommand;
2019 Command->Completion = Completion;
2020 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
2021 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_dma;
2022 DCDB->Channel = Channel;
2023 DCDB->TargetID = TargetID;
2024 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
2025 DCDB->EarlyStatus = false;
2026 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
2027 DCDB->NoAutomaticRequestSense = false;
2028 DCDB->DisconnectPermitted = true;
2029 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
2030 DCDB->BusAddress = NewInquiryStandardDataDMA;
2031 DCDB->CDBLength = 6;
2032 DCDB->TransferLengthHigh4 = 0;
2033 DCDB->SenseLength = sizeof(DCDB->SenseData);
2034 DCDB->CDB[0] = 0x12;
2035 DCDB->CDB[1] = 0;
2036 DCDB->CDB[2] = 0;
2037 DCDB->CDB[3] = 0;
2038 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
2039 DCDB->CDB[5] = 0;
2040
2041 spin_lock_irqsave(&Controller->queue_lock, flags);
2042 DAC960_QueueCommand(Command);
2043 spin_unlock_irqrestore(&Controller->queue_lock, flags);
2044 }
2045
2046
2047
2048
2049
2050 for (Channel = 0; Channel < Controller->Channels; Channel++)
2051 {
2052 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2053 &Controller->V1.InquiryStandardData[Channel][TargetID];
2054 DAC960_SCSI_Inquiry_T *NewInquiryStandardData = SCSI_Inquiry_cpu[Channel];
2055 dma_addr_t NewInquiryUnitSerialNumberDMA =
2056 SCSI_NewInquiryUnitSerialNumberDMA[Channel];
2057 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2058 SCSI_NewInquiryUnitSerialNumberCPU[Channel];
2059 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2060 &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2061 DAC960_Command_T *Command = Controller->Commands[Channel];
2062 DAC960_V1_DCDB_T *DCDB = DCDBs_cpu[Channel];
2063 struct completion *Completion = &Completions[Channel];
2064
2065 wait_for_completion(Completion);
2066
2067 if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2068 memset(InquiryStandardData, 0, sizeof(DAC960_SCSI_Inquiry_T));
2069 InquiryStandardData->PeripheralDeviceType = 0x1F;
2070 continue;
2071 } else
2072 memcpy(InquiryStandardData, NewInquiryStandardData, sizeof(DAC960_SCSI_Inquiry_T));
2073
2074
2075 Command->Completion = Completion;
2076 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2077 DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
2078 DCDB->SenseLength = sizeof(DCDB->SenseData);
2079 DCDB->CDB[0] = 0x12;
2080 DCDB->CDB[1] = 1;
2081 DCDB->CDB[2] = 0x80;
2082 DCDB->CDB[3] = 0;
2083 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
2084 DCDB->CDB[5] = 0;
2085
2086 spin_lock_irqsave(&Controller->queue_lock, flags);
2087 DAC960_QueueCommand(Command);
2088 spin_unlock_irqrestore(&Controller->queue_lock, flags);
2089 wait_for_completion(Completion);
2090
2091 if (Command->V1.CommandStatus != DAC960_V1_NormalCompletion) {
2092 memset(InquiryUnitSerialNumber, 0,
2093 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2094 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2095 } else
2096 memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2097 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2098 }
2099 }
2100 free_dma_loaf(Controller->PCIDevice, &local_dma);
2101 return true;
2102}
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112static bool DAC960_V2_ReadDeviceConfiguration(DAC960_Controller_T
2113 *Controller)
2114{
2115 unsigned char Channel = 0, TargetID = 0, LogicalUnit = 0;
2116 unsigned short PhysicalDeviceIndex = 0;
2117
2118 while (true)
2119 {
2120 DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
2121 Controller->V2.NewPhysicalDeviceInformation;
2122 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo;
2123 DAC960_SCSI_Inquiry_UnitSerialNumber_T *NewInquiryUnitSerialNumber =
2124 Controller->V2.NewInquiryUnitSerialNumber;
2125 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber;
2126
2127 if (!DAC960_V2_NewPhysicalDeviceInfo(Controller, Channel, TargetID, LogicalUnit))
2128 break;
2129
2130 PhysicalDeviceInfo = kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T),
2131 GFP_ATOMIC);
2132 if (PhysicalDeviceInfo == NULL)
2133 return DAC960_Failure(Controller, "PHYSICAL DEVICE ALLOCATION");
2134 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex] =
2135 PhysicalDeviceInfo;
2136 memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
2137 sizeof(DAC960_V2_PhysicalDeviceInfo_T));
2138
2139 InquiryUnitSerialNumber = kmalloc(
2140 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T), GFP_ATOMIC);
2141 if (InquiryUnitSerialNumber == NULL) {
2142 kfree(PhysicalDeviceInfo);
2143 return DAC960_Failure(Controller, "SERIAL NUMBER ALLOCATION");
2144 }
2145 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex] =
2146 InquiryUnitSerialNumber;
2147
2148 Channel = NewPhysicalDeviceInfo->Channel;
2149 TargetID = NewPhysicalDeviceInfo->TargetID;
2150 LogicalUnit = NewPhysicalDeviceInfo->LogicalUnit;
2151
2152
2153
2154
2155
2156
2157
2158 if (!DAC960_V2_NewInquiryUnitSerialNumber(Controller, Channel, TargetID, LogicalUnit)) {
2159 memset(InquiryUnitSerialNumber, 0,
2160 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2161 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
2162 } else
2163 memcpy(InquiryUnitSerialNumber, NewInquiryUnitSerialNumber,
2164 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
2165
2166 PhysicalDeviceIndex++;
2167 LogicalUnit++;
2168 }
2169 return true;
2170}
2171
2172
2173
2174
2175
2176
2177
2178
2179static void DAC960_SanitizeInquiryData(DAC960_SCSI_Inquiry_T
2180 *InquiryStandardData,
2181 DAC960_SCSI_Inquiry_UnitSerialNumber_T
2182 *InquiryUnitSerialNumber,
2183 unsigned char *Vendor,
2184 unsigned char *Model,
2185 unsigned char *Revision,
2186 unsigned char *SerialNumber)
2187{
2188 int SerialNumberLength, i;
2189 if (InquiryStandardData->PeripheralDeviceType == 0x1F) return;
2190 for (i = 0; i < sizeof(InquiryStandardData->VendorIdentification); i++)
2191 {
2192 unsigned char VendorCharacter =
2193 InquiryStandardData->VendorIdentification[i];
2194 Vendor[i] = (VendorCharacter >= ' ' && VendorCharacter <= '~'
2195 ? VendorCharacter : ' ');
2196 }
2197 Vendor[sizeof(InquiryStandardData->VendorIdentification)] = '\0';
2198 for (i = 0; i < sizeof(InquiryStandardData->ProductIdentification); i++)
2199 {
2200 unsigned char ModelCharacter =
2201 InquiryStandardData->ProductIdentification[i];
2202 Model[i] = (ModelCharacter >= ' ' && ModelCharacter <= '~'
2203 ? ModelCharacter : ' ');
2204 }
2205 Model[sizeof(InquiryStandardData->ProductIdentification)] = '\0';
2206 for (i = 0; i < sizeof(InquiryStandardData->ProductRevisionLevel); i++)
2207 {
2208 unsigned char RevisionCharacter =
2209 InquiryStandardData->ProductRevisionLevel[i];
2210 Revision[i] = (RevisionCharacter >= ' ' && RevisionCharacter <= '~'
2211 ? RevisionCharacter : ' ');
2212 }
2213 Revision[sizeof(InquiryStandardData->ProductRevisionLevel)] = '\0';
2214 if (InquiryUnitSerialNumber->PeripheralDeviceType == 0x1F) return;
2215 SerialNumberLength = InquiryUnitSerialNumber->PageLength;
2216 if (SerialNumberLength >
2217 sizeof(InquiryUnitSerialNumber->ProductSerialNumber))
2218 SerialNumberLength = sizeof(InquiryUnitSerialNumber->ProductSerialNumber);
2219 for (i = 0; i < SerialNumberLength; i++)
2220 {
2221 unsigned char SerialNumberCharacter =
2222 InquiryUnitSerialNumber->ProductSerialNumber[i];
2223 SerialNumber[i] =
2224 (SerialNumberCharacter >= ' ' && SerialNumberCharacter <= '~'
2225 ? SerialNumberCharacter : ' ');
2226 }
2227 SerialNumber[SerialNumberLength] = '\0';
2228}
2229
2230
2231
2232
2233
2234
2235
2236static bool DAC960_V1_ReportDeviceConfiguration(DAC960_Controller_T
2237 *Controller)
2238{
2239 int LogicalDriveNumber, Channel, TargetID;
2240 DAC960_Info(" Physical Devices:\n", Controller);
2241 for (Channel = 0; Channel < Controller->Channels; Channel++)
2242 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
2243 {
2244 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2245 &Controller->V1.InquiryStandardData[Channel][TargetID];
2246 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2247 &Controller->V1.InquiryUnitSerialNumber[Channel][TargetID];
2248 DAC960_V1_DeviceState_T *DeviceState =
2249 &Controller->V1.DeviceState[Channel][TargetID];
2250 DAC960_V1_ErrorTableEntry_T *ErrorEntry =
2251 &Controller->V1.ErrorTable.ErrorTableEntries[Channel][TargetID];
2252 char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2253 char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2254 char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2255 char SerialNumber[1+sizeof(InquiryUnitSerialNumber
2256 ->ProductSerialNumber)];
2257 if (InquiryStandardData->PeripheralDeviceType == 0x1F) continue;
2258 DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2259 Vendor, Model, Revision, SerialNumber);
2260 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2261 Controller, Channel, TargetID, (TargetID < 10 ? " " : ""),
2262 Vendor, Model, Revision);
2263 if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2264 DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber);
2265 if (DeviceState->Present &&
2266 DeviceState->DeviceType == DAC960_V1_DiskType)
2267 {
2268 if (Controller->V1.DeviceResetCount[Channel][TargetID] > 0)
2269 DAC960_Info(" Disk Status: %s, %u blocks, %d resets\n",
2270 Controller,
2271 (DeviceState->DeviceState == DAC960_V1_Device_Dead
2272 ? "Dead"
2273 : DeviceState->DeviceState
2274 == DAC960_V1_Device_WriteOnly
2275 ? "Write-Only"
2276 : DeviceState->DeviceState
2277 == DAC960_V1_Device_Online
2278 ? "Online" : "Standby"),
2279 DeviceState->DiskSize,
2280 Controller->V1.DeviceResetCount[Channel][TargetID]);
2281 else
2282 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller,
2283 (DeviceState->DeviceState == DAC960_V1_Device_Dead
2284 ? "Dead"
2285 : DeviceState->DeviceState
2286 == DAC960_V1_Device_WriteOnly
2287 ? "Write-Only"
2288 : DeviceState->DeviceState
2289 == DAC960_V1_Device_Online
2290 ? "Online" : "Standby"),
2291 DeviceState->DiskSize);
2292 }
2293 if (ErrorEntry->ParityErrorCount > 0 ||
2294 ErrorEntry->SoftErrorCount > 0 ||
2295 ErrorEntry->HardErrorCount > 0 ||
2296 ErrorEntry->MiscErrorCount > 0)
2297 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2298 "Hard: %d, Misc: %d\n", Controller,
2299 ErrorEntry->ParityErrorCount,
2300 ErrorEntry->SoftErrorCount,
2301 ErrorEntry->HardErrorCount,
2302 ErrorEntry->MiscErrorCount);
2303 }
2304 DAC960_Info(" Logical Drives:\n", Controller);
2305 for (LogicalDriveNumber = 0;
2306 LogicalDriveNumber < Controller->LogicalDriveCount;
2307 LogicalDriveNumber++)
2308 {
2309 DAC960_V1_LogicalDriveInformation_T *LogicalDriveInformation =
2310 &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
2311 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks, %s\n",
2312 Controller, Controller->ControllerNumber, LogicalDriveNumber,
2313 LogicalDriveInformation->RAIDLevel,
2314 (LogicalDriveInformation->LogicalDriveState
2315 == DAC960_V1_LogicalDrive_Online
2316 ? "Online"
2317 : LogicalDriveInformation->LogicalDriveState
2318 == DAC960_V1_LogicalDrive_Critical
2319 ? "Critical" : "Offline"),
2320 LogicalDriveInformation->LogicalDriveSize,
2321 (LogicalDriveInformation->WriteBack
2322 ? "Write Back" : "Write Thru"));
2323 }
2324 return true;
2325}
2326
2327
2328
2329
2330
2331
2332
2333static bool DAC960_V2_ReportDeviceConfiguration(DAC960_Controller_T
2334 *Controller)
2335{
2336 int PhysicalDeviceIndex, LogicalDriveNumber;
2337 DAC960_Info(" Physical Devices:\n", Controller);
2338 for (PhysicalDeviceIndex = 0;
2339 PhysicalDeviceIndex < DAC960_V2_MaxPhysicalDevices;
2340 PhysicalDeviceIndex++)
2341 {
2342 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
2343 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
2344 DAC960_SCSI_Inquiry_T *InquiryStandardData =
2345 (DAC960_SCSI_Inquiry_T *) &PhysicalDeviceInfo->SCSI_InquiryData;
2346 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
2347 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
2348 char Vendor[1+sizeof(InquiryStandardData->VendorIdentification)];
2349 char Model[1+sizeof(InquiryStandardData->ProductIdentification)];
2350 char Revision[1+sizeof(InquiryStandardData->ProductRevisionLevel)];
2351 char SerialNumber[1+sizeof(InquiryUnitSerialNumber->ProductSerialNumber)];
2352 if (PhysicalDeviceInfo == NULL) break;
2353 DAC960_SanitizeInquiryData(InquiryStandardData, InquiryUnitSerialNumber,
2354 Vendor, Model, Revision, SerialNumber);
2355 DAC960_Info(" %d:%d%s Vendor: %s Model: %s Revision: %s\n",
2356 Controller,
2357 PhysicalDeviceInfo->Channel,
2358 PhysicalDeviceInfo->TargetID,
2359 (PhysicalDeviceInfo->TargetID < 10 ? " " : ""),
2360 Vendor, Model, Revision);
2361 if (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers == 0)
2362 DAC960_Info(" %sAsynchronous\n", Controller,
2363 (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2364 ? "Wide " :""));
2365 else
2366 DAC960_Info(" %sSynchronous at %d MB/sec\n", Controller,
2367 (PhysicalDeviceInfo->NegotiatedDataWidthBits == 16
2368 ? "Wide " :""),
2369 (PhysicalDeviceInfo->NegotiatedSynchronousMegaTransfers
2370 * PhysicalDeviceInfo->NegotiatedDataWidthBits/8));
2371 if (InquiryUnitSerialNumber->PeripheralDeviceType != 0x1F)
2372 DAC960_Info(" Serial Number: %s\n", Controller, SerialNumber);
2373 if (PhysicalDeviceInfo->PhysicalDeviceState ==
2374 DAC960_V2_Device_Unconfigured)
2375 continue;
2376 DAC960_Info(" Disk Status: %s, %u blocks\n", Controller,
2377 (PhysicalDeviceInfo->PhysicalDeviceState
2378 == DAC960_V2_Device_Online
2379 ? "Online"
2380 : PhysicalDeviceInfo->PhysicalDeviceState
2381 == DAC960_V2_Device_Rebuild
2382 ? "Rebuild"
2383 : PhysicalDeviceInfo->PhysicalDeviceState
2384 == DAC960_V2_Device_Missing
2385 ? "Missing"
2386 : PhysicalDeviceInfo->PhysicalDeviceState
2387 == DAC960_V2_Device_Critical
2388 ? "Critical"
2389 : PhysicalDeviceInfo->PhysicalDeviceState
2390 == DAC960_V2_Device_Dead
2391 ? "Dead"
2392 : PhysicalDeviceInfo->PhysicalDeviceState
2393 == DAC960_V2_Device_SuspectedDead
2394 ? "Suspected-Dead"
2395 : PhysicalDeviceInfo->PhysicalDeviceState
2396 == DAC960_V2_Device_CommandedOffline
2397 ? "Commanded-Offline"
2398 : PhysicalDeviceInfo->PhysicalDeviceState
2399 == DAC960_V2_Device_Standby
2400 ? "Standby" : "Unknown"),
2401 PhysicalDeviceInfo->ConfigurableDeviceSize);
2402 if (PhysicalDeviceInfo->ParityErrors == 0 &&
2403 PhysicalDeviceInfo->SoftErrors == 0 &&
2404 PhysicalDeviceInfo->HardErrors == 0 &&
2405 PhysicalDeviceInfo->MiscellaneousErrors == 0 &&
2406 PhysicalDeviceInfo->CommandTimeouts == 0 &&
2407 PhysicalDeviceInfo->Retries == 0 &&
2408 PhysicalDeviceInfo->Aborts == 0 &&
2409 PhysicalDeviceInfo->PredictedFailuresDetected == 0)
2410 continue;
2411 DAC960_Info(" Errors - Parity: %d, Soft: %d, "
2412 "Hard: %d, Misc: %d\n", Controller,
2413 PhysicalDeviceInfo->ParityErrors,
2414 PhysicalDeviceInfo->SoftErrors,
2415 PhysicalDeviceInfo->HardErrors,
2416 PhysicalDeviceInfo->MiscellaneousErrors);
2417 DAC960_Info(" Timeouts: %d, Retries: %d, "
2418 "Aborts: %d, Predicted: %d\n", Controller,
2419 PhysicalDeviceInfo->CommandTimeouts,
2420 PhysicalDeviceInfo->Retries,
2421 PhysicalDeviceInfo->Aborts,
2422 PhysicalDeviceInfo->PredictedFailuresDetected);
2423 }
2424 DAC960_Info(" Logical Drives:\n", Controller);
2425 for (LogicalDriveNumber = 0;
2426 LogicalDriveNumber < DAC960_MaxLogicalDrives;
2427 LogicalDriveNumber++)
2428 {
2429 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
2430 Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
2431 static const unsigned char *ReadCacheStatus[] = {
2432 "Read Cache Disabled",
2433 "Read Cache Enabled",
2434 "Read Ahead Enabled",
2435 "Intelligent Read Ahead Enabled",
2436 "-", "-", "-", "-"
2437 };
2438 static const unsigned char *WriteCacheStatus[] = {
2439 "Write Cache Disabled",
2440 "Logical Device Read Only",
2441 "Write Cache Enabled",
2442 "Intelligent Write Cache Enabled",
2443 "-", "-", "-", "-"
2444 };
2445 unsigned char *GeometryTranslation;
2446 if (LogicalDeviceInfo == NULL) continue;
2447 switch (LogicalDeviceInfo->DriveGeometry)
2448 {
2449 case DAC960_V2_Geometry_128_32:
2450 GeometryTranslation = "128/32";
2451 break;
2452 case DAC960_V2_Geometry_255_63:
2453 GeometryTranslation = "255/63";
2454 break;
2455 default:
2456 GeometryTranslation = "Invalid";
2457 DAC960_Error("Illegal Logical Device Geometry %d\n",
2458 Controller, LogicalDeviceInfo->DriveGeometry);
2459 break;
2460 }
2461 DAC960_Info(" /dev/rd/c%dd%d: RAID-%d, %s, %u blocks\n",
2462 Controller, Controller->ControllerNumber, LogicalDriveNumber,
2463 LogicalDeviceInfo->RAIDLevel,
2464 (LogicalDeviceInfo->LogicalDeviceState
2465 == DAC960_V2_LogicalDevice_Online
2466 ? "Online"
2467 : LogicalDeviceInfo->LogicalDeviceState
2468 == DAC960_V2_LogicalDevice_Critical
2469 ? "Critical" : "Offline"),
2470 LogicalDeviceInfo->ConfigurableDeviceSize);
2471 DAC960_Info(" Logical Device %s, BIOS Geometry: %s\n",
2472 Controller,
2473 (LogicalDeviceInfo->LogicalDeviceControl
2474 .LogicalDeviceInitialized
2475 ? "Initialized" : "Uninitialized"),
2476 GeometryTranslation);
2477 if (LogicalDeviceInfo->StripeSize == 0)
2478 {
2479 if (LogicalDeviceInfo->CacheLineSize == 0)
2480 DAC960_Info(" Stripe Size: N/A, "
2481 "Segment Size: N/A\n", Controller);
2482 else
2483 DAC960_Info(" Stripe Size: N/A, "
2484 "Segment Size: %dKB\n", Controller,
2485 1 << (LogicalDeviceInfo->CacheLineSize - 2));
2486 }
2487 else
2488 {
2489 if (LogicalDeviceInfo->CacheLineSize == 0)
2490 DAC960_Info(" Stripe Size: %dKB, "
2491 "Segment Size: N/A\n", Controller,
2492 1 << (LogicalDeviceInfo->StripeSize - 2));
2493 else
2494 DAC960_Info(" Stripe Size: %dKB, "
2495 "Segment Size: %dKB\n", Controller,
2496 1 << (LogicalDeviceInfo->StripeSize - 2),
2497 1 << (LogicalDeviceInfo->CacheLineSize - 2));
2498 }
2499 DAC960_Info(" %s, %s\n", Controller,
2500 ReadCacheStatus[
2501 LogicalDeviceInfo->LogicalDeviceControl.ReadCache],
2502 WriteCacheStatus[
2503 LogicalDeviceInfo->LogicalDeviceControl.WriteCache]);
2504 if (LogicalDeviceInfo->SoftErrors > 0 ||
2505 LogicalDeviceInfo->CommandsFailed > 0 ||
2506 LogicalDeviceInfo->DeferredWriteErrors)
2507 DAC960_Info(" Errors - Soft: %d, Failed: %d, "
2508 "Deferred Write: %d\n", Controller,
2509 LogicalDeviceInfo->SoftErrors,
2510 LogicalDeviceInfo->CommandsFailed,
2511 LogicalDeviceInfo->DeferredWriteErrors);
2512
2513 }
2514 return true;
2515}
2516
2517
2518
2519
2520
2521
2522static bool DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller)
2523{
2524 int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2525 int n;
2526
2527
2528
2529
2530 if (register_blkdev(MajorNumber, "dac960") < 0)
2531 return false;
2532
2533 for (n = 0; n < DAC960_MaxLogicalDrives; n++) {
2534 struct gendisk *disk = Controller->disks[n];
2535 struct request_queue *RequestQueue;
2536
2537
2538 RequestQueue = blk_init_queue(DAC960_RequestFunction,&Controller->queue_lock);
2539 if (!RequestQueue) {
2540 printk("DAC960: failure to allocate request queue\n");
2541 continue;
2542 }
2543 Controller->RequestQueue[n] = RequestQueue;
2544 RequestQueue->queuedata = Controller;
2545 blk_queue_max_segments(RequestQueue, Controller->DriverScatterGatherLimit);
2546 blk_queue_max_hw_sectors(RequestQueue, Controller->MaxBlocksPerCommand);
2547 disk->queue = RequestQueue;
2548 sprintf(disk->disk_name, "rd/c%dd%d", Controller->ControllerNumber, n);
2549 disk->major = MajorNumber;
2550 disk->first_minor = n << DAC960_MaxPartitionsBits;
2551 disk->fops = &DAC960_BlockDeviceOperations;
2552 }
2553
2554
2555
2556 return true;
2557}
2558
2559
2560
2561
2562
2563
2564
2565static void DAC960_UnregisterBlockDevice(DAC960_Controller_T *Controller)
2566{
2567 int MajorNumber = DAC960_MAJOR + Controller->ControllerNumber;
2568 int disk;
2569
2570
2571 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
2572 del_gendisk(Controller->disks[disk]);
2573 blk_cleanup_queue(Controller->RequestQueue[disk]);
2574 Controller->RequestQueue[disk] = NULL;
2575 }
2576
2577
2578
2579
2580 unregister_blkdev(MajorNumber, "dac960");
2581}
2582
2583
2584
2585
2586
2587
2588static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller)
2589{
2590 int disk;
2591 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++)
2592 set_capacity(Controller->disks[disk], disk_size(Controller, disk));
2593}
2594
2595
2596
2597
2598
2599
2600
2601static bool DAC960_ReportErrorStatus(DAC960_Controller_T *Controller,
2602 unsigned char ErrorStatus,
2603 unsigned char Parameter0,
2604 unsigned char Parameter1)
2605{
2606 switch (ErrorStatus)
2607 {
2608 case 0x00:
2609 DAC960_Notice("Physical Device %d:%d Not Responding\n",
2610 Controller, Parameter1, Parameter0);
2611 break;
2612 case 0x08:
2613 if (Controller->DriveSpinUpMessageDisplayed) break;
2614 DAC960_Notice("Spinning Up Drives\n", Controller);
2615 Controller->DriveSpinUpMessageDisplayed = true;
2616 break;
2617 case 0x30:
2618 DAC960_Notice("Configuration Checksum Error\n", Controller);
2619 break;
2620 case 0x60:
2621 DAC960_Notice("Mirror Race Recovery Failed\n", Controller);
2622 break;
2623 case 0x70:
2624 DAC960_Notice("Mirror Race Recovery In Progress\n", Controller);
2625 break;
2626 case 0x90:
2627 DAC960_Notice("Physical Device %d:%d COD Mismatch\n",
2628 Controller, Parameter1, Parameter0);
2629 break;
2630 case 0xA0:
2631 DAC960_Notice("Logical Drive Installation Aborted\n", Controller);
2632 break;
2633 case 0xB0:
2634 DAC960_Notice("Mirror Race On A Critical Logical Drive\n", Controller);
2635 break;
2636 case 0xD0:
2637 DAC960_Notice("New Controller Configuration Found\n", Controller);
2638 break;
2639 case 0xF0:
2640 DAC960_Error("Fatal Memory Parity Error for Controller at\n", Controller);
2641 return true;
2642 default:
2643 DAC960_Error("Unknown Initialization Error %02X for Controller at\n",
2644 Controller, ErrorStatus);
2645 return true;
2646 }
2647 return false;
2648}
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660static void DAC960_DetectCleanup(DAC960_Controller_T *Controller)
2661{
2662 int i;
2663
2664
2665 free_dma_loaf(Controller->PCIDevice, &Controller->DmaPages);
2666 if (Controller->MemoryMappedAddress) {
2667 switch(Controller->HardwareType)
2668 {
2669 case DAC960_GEM_Controller:
2670 DAC960_GEM_DisableInterrupts(Controller->BaseAddress);
2671 break;
2672 case DAC960_BA_Controller:
2673 DAC960_BA_DisableInterrupts(Controller->BaseAddress);
2674 break;
2675 case DAC960_LP_Controller:
2676 DAC960_LP_DisableInterrupts(Controller->BaseAddress);
2677 break;
2678 case DAC960_LA_Controller:
2679 DAC960_LA_DisableInterrupts(Controller->BaseAddress);
2680 break;
2681 case DAC960_PG_Controller:
2682 DAC960_PG_DisableInterrupts(Controller->BaseAddress);
2683 break;
2684 case DAC960_PD_Controller:
2685 DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2686 break;
2687 case DAC960_P_Controller:
2688 DAC960_PD_DisableInterrupts(Controller->BaseAddress);
2689 break;
2690 }
2691 iounmap(Controller->MemoryMappedAddress);
2692 }
2693 if (Controller->IRQ_Channel)
2694 free_irq(Controller->IRQ_Channel, Controller);
2695 if (Controller->IO_Address)
2696 release_region(Controller->IO_Address, 0x80);
2697 pci_disable_device(Controller->PCIDevice);
2698 for (i = 0; (i < DAC960_MaxLogicalDrives) && Controller->disks[i]; i++)
2699 put_disk(Controller->disks[i]);
2700 DAC960_Controllers[Controller->ControllerNumber] = NULL;
2701 kfree(Controller);
2702}
2703
2704
2705
2706
2707
2708
2709
2710
2711static DAC960_Controller_T *
2712DAC960_DetectController(struct pci_dev *PCI_Device,
2713 const struct pci_device_id *entry)
2714{
2715 struct DAC960_privdata *privdata =
2716 (struct DAC960_privdata *)entry->driver_data;
2717 irq_handler_t InterruptHandler = privdata->InterruptHandler;
2718 unsigned int MemoryWindowSize = privdata->MemoryWindowSize;
2719 DAC960_Controller_T *Controller = NULL;
2720 unsigned char DeviceFunction = PCI_Device->devfn;
2721 unsigned char ErrorStatus, Parameter0, Parameter1;
2722 unsigned int IRQ_Channel;
2723 void __iomem *BaseAddress;
2724 int i;
2725
2726 Controller = kzalloc(sizeof(DAC960_Controller_T), GFP_ATOMIC);
2727 if (Controller == NULL) {
2728 DAC960_Error("Unable to allocate Controller structure for "
2729 "Controller at\n", NULL);
2730 return NULL;
2731 }
2732 Controller->ControllerNumber = DAC960_ControllerCount;
2733 DAC960_Controllers[DAC960_ControllerCount++] = Controller;
2734 Controller->Bus = PCI_Device->bus->number;
2735 Controller->FirmwareType = privdata->FirmwareType;
2736 Controller->HardwareType = privdata->HardwareType;
2737 Controller->Device = DeviceFunction >> 3;
2738 Controller->Function = DeviceFunction & 0x7;
2739 Controller->PCIDevice = PCI_Device;
2740 strcpy(Controller->FullModelName, "DAC960");
2741
2742 if (pci_enable_device(PCI_Device))
2743 goto Failure;
2744
2745 switch (Controller->HardwareType)
2746 {
2747 case DAC960_GEM_Controller:
2748 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2749 break;
2750 case DAC960_BA_Controller:
2751 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2752 break;
2753 case DAC960_LP_Controller:
2754 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2755 break;
2756 case DAC960_LA_Controller:
2757 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2758 break;
2759 case DAC960_PG_Controller:
2760 Controller->PCI_Address = pci_resource_start(PCI_Device, 0);
2761 break;
2762 case DAC960_PD_Controller:
2763 Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2764 Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2765 break;
2766 case DAC960_P_Controller:
2767 Controller->IO_Address = pci_resource_start(PCI_Device, 0);
2768 Controller->PCI_Address = pci_resource_start(PCI_Device, 1);
2769 break;
2770 }
2771
2772 pci_set_drvdata(PCI_Device, (void *)((long)Controller->ControllerNumber));
2773 for (i = 0; i < DAC960_MaxLogicalDrives; i++) {
2774 Controller->disks[i] = alloc_disk(1<<DAC960_MaxPartitionsBits);
2775 if (!Controller->disks[i])
2776 goto Failure;
2777 Controller->disks[i]->private_data = (void *)((long)i);
2778 }
2779 init_waitqueue_head(&Controller->CommandWaitQueue);
2780 init_waitqueue_head(&Controller->HealthStatusWaitQueue);
2781 spin_lock_init(&Controller->queue_lock);
2782 DAC960_AnnounceDriver(Controller);
2783
2784
2785
2786 if (MemoryWindowSize < PAGE_SIZE)
2787 MemoryWindowSize = PAGE_SIZE;
2788 Controller->MemoryMappedAddress =
2789 ioremap_nocache(Controller->PCI_Address & PAGE_MASK, MemoryWindowSize);
2790 Controller->BaseAddress =
2791 Controller->MemoryMappedAddress + (Controller->PCI_Address & ~PAGE_MASK);
2792 if (Controller->MemoryMappedAddress == NULL)
2793 {
2794 DAC960_Error("Unable to map Controller Register Window for "
2795 "Controller at\n", Controller);
2796 goto Failure;
2797 }
2798 BaseAddress = Controller->BaseAddress;
2799 switch (Controller->HardwareType)
2800 {
2801 case DAC960_GEM_Controller:
2802 DAC960_GEM_DisableInterrupts(BaseAddress);
2803 DAC960_GEM_AcknowledgeHardwareMailboxStatus(BaseAddress);
2804 udelay(1000);
2805 while (DAC960_GEM_InitializationInProgressP(BaseAddress))
2806 {
2807 if (DAC960_GEM_ReadErrorStatus(BaseAddress, &ErrorStatus,
2808 &Parameter0, &Parameter1) &&
2809 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2810 Parameter0, Parameter1))
2811 goto Failure;
2812 udelay(10);
2813 }
2814 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2815 {
2816 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2817 "for Controller at\n", Controller);
2818 goto Failure;
2819 }
2820 DAC960_GEM_EnableInterrupts(BaseAddress);
2821 Controller->QueueCommand = DAC960_GEM_QueueCommand;
2822 Controller->ReadControllerConfiguration =
2823 DAC960_V2_ReadControllerConfiguration;
2824 Controller->ReadDeviceConfiguration =
2825 DAC960_V2_ReadDeviceConfiguration;
2826 Controller->ReportDeviceConfiguration =
2827 DAC960_V2_ReportDeviceConfiguration;
2828 Controller->QueueReadWriteCommand =
2829 DAC960_V2_QueueReadWriteCommand;
2830 break;
2831 case DAC960_BA_Controller:
2832 DAC960_BA_DisableInterrupts(BaseAddress);
2833 DAC960_BA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2834 udelay(1000);
2835 while (DAC960_BA_InitializationInProgressP(BaseAddress))
2836 {
2837 if (DAC960_BA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2838 &Parameter0, &Parameter1) &&
2839 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2840 Parameter0, Parameter1))
2841 goto Failure;
2842 udelay(10);
2843 }
2844 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2845 {
2846 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2847 "for Controller at\n", Controller);
2848 goto Failure;
2849 }
2850 DAC960_BA_EnableInterrupts(BaseAddress);
2851 Controller->QueueCommand = DAC960_BA_QueueCommand;
2852 Controller->ReadControllerConfiguration =
2853 DAC960_V2_ReadControllerConfiguration;
2854 Controller->ReadDeviceConfiguration =
2855 DAC960_V2_ReadDeviceConfiguration;
2856 Controller->ReportDeviceConfiguration =
2857 DAC960_V2_ReportDeviceConfiguration;
2858 Controller->QueueReadWriteCommand =
2859 DAC960_V2_QueueReadWriteCommand;
2860 break;
2861 case DAC960_LP_Controller:
2862 DAC960_LP_DisableInterrupts(BaseAddress);
2863 DAC960_LP_AcknowledgeHardwareMailboxStatus(BaseAddress);
2864 udelay(1000);
2865 while (DAC960_LP_InitializationInProgressP(BaseAddress))
2866 {
2867 if (DAC960_LP_ReadErrorStatus(BaseAddress, &ErrorStatus,
2868 &Parameter0, &Parameter1) &&
2869 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2870 Parameter0, Parameter1))
2871 goto Failure;
2872 udelay(10);
2873 }
2874 if (!DAC960_V2_EnableMemoryMailboxInterface(Controller))
2875 {
2876 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2877 "for Controller at\n", Controller);
2878 goto Failure;
2879 }
2880 DAC960_LP_EnableInterrupts(BaseAddress);
2881 Controller->QueueCommand = DAC960_LP_QueueCommand;
2882 Controller->ReadControllerConfiguration =
2883 DAC960_V2_ReadControllerConfiguration;
2884 Controller->ReadDeviceConfiguration =
2885 DAC960_V2_ReadDeviceConfiguration;
2886 Controller->ReportDeviceConfiguration =
2887 DAC960_V2_ReportDeviceConfiguration;
2888 Controller->QueueReadWriteCommand =
2889 DAC960_V2_QueueReadWriteCommand;
2890 break;
2891 case DAC960_LA_Controller:
2892 DAC960_LA_DisableInterrupts(BaseAddress);
2893 DAC960_LA_AcknowledgeHardwareMailboxStatus(BaseAddress);
2894 udelay(1000);
2895 while (DAC960_LA_InitializationInProgressP(BaseAddress))
2896 {
2897 if (DAC960_LA_ReadErrorStatus(BaseAddress, &ErrorStatus,
2898 &Parameter0, &Parameter1) &&
2899 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2900 Parameter0, Parameter1))
2901 goto Failure;
2902 udelay(10);
2903 }
2904 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2905 {
2906 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2907 "for Controller at\n", Controller);
2908 goto Failure;
2909 }
2910 DAC960_LA_EnableInterrupts(BaseAddress);
2911 if (Controller->V1.DualModeMemoryMailboxInterface)
2912 Controller->QueueCommand = DAC960_LA_QueueCommandDualMode;
2913 else Controller->QueueCommand = DAC960_LA_QueueCommandSingleMode;
2914 Controller->ReadControllerConfiguration =
2915 DAC960_V1_ReadControllerConfiguration;
2916 Controller->ReadDeviceConfiguration =
2917 DAC960_V1_ReadDeviceConfiguration;
2918 Controller->ReportDeviceConfiguration =
2919 DAC960_V1_ReportDeviceConfiguration;
2920 Controller->QueueReadWriteCommand =
2921 DAC960_V1_QueueReadWriteCommand;
2922 break;
2923 case DAC960_PG_Controller:
2924 DAC960_PG_DisableInterrupts(BaseAddress);
2925 DAC960_PG_AcknowledgeHardwareMailboxStatus(BaseAddress);
2926 udelay(1000);
2927 while (DAC960_PG_InitializationInProgressP(BaseAddress))
2928 {
2929 if (DAC960_PG_ReadErrorStatus(BaseAddress, &ErrorStatus,
2930 &Parameter0, &Parameter1) &&
2931 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2932 Parameter0, Parameter1))
2933 goto Failure;
2934 udelay(10);
2935 }
2936 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2937 {
2938 DAC960_Error("Unable to Enable Memory Mailbox Interface "
2939 "for Controller at\n", Controller);
2940 goto Failure;
2941 }
2942 DAC960_PG_EnableInterrupts(BaseAddress);
2943 if (Controller->V1.DualModeMemoryMailboxInterface)
2944 Controller->QueueCommand = DAC960_PG_QueueCommandDualMode;
2945 else Controller->QueueCommand = DAC960_PG_QueueCommandSingleMode;
2946 Controller->ReadControllerConfiguration =
2947 DAC960_V1_ReadControllerConfiguration;
2948 Controller->ReadDeviceConfiguration =
2949 DAC960_V1_ReadDeviceConfiguration;
2950 Controller->ReportDeviceConfiguration =
2951 DAC960_V1_ReportDeviceConfiguration;
2952 Controller->QueueReadWriteCommand =
2953 DAC960_V1_QueueReadWriteCommand;
2954 break;
2955 case DAC960_PD_Controller:
2956 if (!request_region(Controller->IO_Address, 0x80,
2957 Controller->FullModelName)) {
2958 DAC960_Error("IO port 0x%lx busy for Controller at\n",
2959 Controller, Controller->IO_Address);
2960 goto Failure;
2961 }
2962 DAC960_PD_DisableInterrupts(BaseAddress);
2963 DAC960_PD_AcknowledgeStatus(BaseAddress);
2964 udelay(1000);
2965 while (DAC960_PD_InitializationInProgressP(BaseAddress))
2966 {
2967 if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
2968 &Parameter0, &Parameter1) &&
2969 DAC960_ReportErrorStatus(Controller, ErrorStatus,
2970 Parameter0, Parameter1))
2971 goto Failure;
2972 udelay(10);
2973 }
2974 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
2975 {
2976 DAC960_Error("Unable to allocate DMA mapped memory "
2977 "for Controller at\n", Controller);
2978 goto Failure;
2979 }
2980 DAC960_PD_EnableInterrupts(BaseAddress);
2981 Controller->QueueCommand = DAC960_PD_QueueCommand;
2982 Controller->ReadControllerConfiguration =
2983 DAC960_V1_ReadControllerConfiguration;
2984 Controller->ReadDeviceConfiguration =
2985 DAC960_V1_ReadDeviceConfiguration;
2986 Controller->ReportDeviceConfiguration =
2987 DAC960_V1_ReportDeviceConfiguration;
2988 Controller->QueueReadWriteCommand =
2989 DAC960_V1_QueueReadWriteCommand;
2990 break;
2991 case DAC960_P_Controller:
2992 if (!request_region(Controller->IO_Address, 0x80,
2993 Controller->FullModelName)){
2994 DAC960_Error("IO port 0x%lx busy for Controller at\n",
2995 Controller, Controller->IO_Address);
2996 goto Failure;
2997 }
2998 DAC960_PD_DisableInterrupts(BaseAddress);
2999 DAC960_PD_AcknowledgeStatus(BaseAddress);
3000 udelay(1000);
3001 while (DAC960_PD_InitializationInProgressP(BaseAddress))
3002 {
3003 if (DAC960_PD_ReadErrorStatus(BaseAddress, &ErrorStatus,
3004 &Parameter0, &Parameter1) &&
3005 DAC960_ReportErrorStatus(Controller, ErrorStatus,
3006 Parameter0, Parameter1))
3007 goto Failure;
3008 udelay(10);
3009 }
3010 if (!DAC960_V1_EnableMemoryMailboxInterface(Controller))
3011 {
3012 DAC960_Error("Unable to allocate DMA mapped memory"
3013 "for Controller at\n", Controller);
3014 goto Failure;
3015 }
3016 DAC960_PD_EnableInterrupts(BaseAddress);
3017 Controller->QueueCommand = DAC960_P_QueueCommand;
3018 Controller->ReadControllerConfiguration =
3019 DAC960_V1_ReadControllerConfiguration;
3020 Controller->ReadDeviceConfiguration =
3021 DAC960_V1_ReadDeviceConfiguration;
3022 Controller->ReportDeviceConfiguration =
3023 DAC960_V1_ReportDeviceConfiguration;
3024 Controller->QueueReadWriteCommand =
3025 DAC960_V1_QueueReadWriteCommand;
3026 break;
3027 }
3028
3029
3030
3031 IRQ_Channel = PCI_Device->irq;
3032 if (request_irq(IRQ_Channel, InterruptHandler, IRQF_SHARED,
3033 Controller->FullModelName, Controller) < 0)
3034 {
3035 DAC960_Error("Unable to acquire IRQ Channel %d for Controller at\n",
3036 Controller, Controller->IRQ_Channel);
3037 goto Failure;
3038 }
3039 Controller->IRQ_Channel = IRQ_Channel;
3040 Controller->InitialCommand.CommandIdentifier = 1;
3041 Controller->InitialCommand.Controller = Controller;
3042 Controller->Commands[0] = &Controller->InitialCommand;
3043 Controller->FreeCommands = &Controller->InitialCommand;
3044 return Controller;
3045
3046Failure:
3047 if (Controller->IO_Address == 0)
3048 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address N/A "
3049 "PCI Address 0x%X\n", Controller,
3050 Controller->Bus, Controller->Device,
3051 Controller->Function, Controller->PCI_Address);
3052 else
3053 DAC960_Error("PCI Bus %d Device %d Function %d I/O Address "
3054 "0x%X PCI Address 0x%X\n", Controller,
3055 Controller->Bus, Controller->Device,
3056 Controller->Function, Controller->IO_Address,
3057 Controller->PCI_Address);
3058 DAC960_DetectCleanup(Controller);
3059 DAC960_ControllerCount--;
3060 return NULL;
3061}
3062
3063
3064
3065
3066
3067static bool
3068DAC960_InitializeController(DAC960_Controller_T *Controller)
3069{
3070 if (DAC960_ReadControllerConfiguration(Controller) &&
3071 DAC960_ReportControllerConfiguration(Controller) &&
3072 DAC960_CreateAuxiliaryStructures(Controller) &&
3073 DAC960_ReadDeviceConfiguration(Controller) &&
3074 DAC960_ReportDeviceConfiguration(Controller) &&
3075 DAC960_RegisterBlockDevice(Controller))
3076 {
3077
3078
3079
3080 timer_setup(&Controller->MonitoringTimer,
3081 DAC960_MonitoringTimerFunction, 0);
3082 Controller->MonitoringTimer.expires =
3083 jiffies + DAC960_MonitoringTimerInterval;
3084 add_timer(&Controller->MonitoringTimer);
3085 Controller->ControllerInitialized = true;
3086 return true;
3087 }
3088 return false;
3089}
3090
3091
3092
3093
3094
3095
3096static void DAC960_FinalizeController(DAC960_Controller_T *Controller)
3097{
3098 if (Controller->ControllerInitialized)
3099 {
3100 unsigned long flags;
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119 spin_lock_irqsave(&Controller->queue_lock, flags);
3120 Controller->ShutdownMonitoringTimer = 1;
3121 spin_unlock_irqrestore(&Controller->queue_lock, flags);
3122
3123 del_timer_sync(&Controller->MonitoringTimer);
3124 if (Controller->FirmwareType == DAC960_V1_Controller)
3125 {
3126 DAC960_Notice("Flushing Cache...", Controller);
3127 DAC960_V1_ExecuteType3(Controller, DAC960_V1_Flush, 0);
3128 DAC960_Notice("done\n", Controller);
3129
3130 if (Controller->HardwareType == DAC960_PD_Controller)
3131 release_region(Controller->IO_Address, 0x80);
3132 }
3133 else
3134 {
3135 DAC960_Notice("Flushing Cache...", Controller);
3136 DAC960_V2_DeviceOperation(Controller, DAC960_V2_PauseDevice,
3137 DAC960_V2_RAID_Controller);
3138 DAC960_Notice("done\n", Controller);
3139 }
3140 }
3141 DAC960_UnregisterBlockDevice(Controller);
3142 DAC960_DestroyAuxiliaryStructures(Controller);
3143 DAC960_DestroyProcEntries(Controller);
3144 DAC960_DetectCleanup(Controller);
3145}
3146
3147
3148
3149
3150
3151
3152
3153static int
3154DAC960_Probe(struct pci_dev *dev, const struct pci_device_id *entry)
3155{
3156 int disk;
3157 DAC960_Controller_T *Controller;
3158
3159 if (DAC960_ControllerCount == DAC960_MaxControllers)
3160 {
3161 DAC960_Error("More than %d DAC960 Controllers detected - "
3162 "ignoring from Controller at\n",
3163 NULL, DAC960_MaxControllers);
3164 return -ENODEV;
3165 }
3166
3167 Controller = DAC960_DetectController(dev, entry);
3168 if (!Controller)
3169 return -ENODEV;
3170
3171 if (!DAC960_InitializeController(Controller)) {
3172 DAC960_FinalizeController(Controller);
3173 return -ENODEV;
3174 }
3175
3176 for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) {
3177 set_capacity(Controller->disks[disk], disk_size(Controller, disk));
3178 add_disk(Controller->disks[disk]);
3179 }
3180 DAC960_CreateProcEntries(Controller);
3181 return 0;
3182}
3183
3184
3185
3186
3187
3188
3189static void DAC960_Remove(struct pci_dev *PCI_Device)
3190{
3191 int Controller_Number = (long)pci_get_drvdata(PCI_Device);
3192 DAC960_Controller_T *Controller = DAC960_Controllers[Controller_Number];
3193 if (Controller != NULL)
3194 DAC960_FinalizeController(Controller);
3195}
3196
3197
3198
3199
3200
3201
3202
3203static void DAC960_V1_QueueReadWriteCommand(DAC960_Command_T *Command)
3204{
3205 DAC960_Controller_T *Controller = Command->Controller;
3206 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
3207 DAC960_V1_ScatterGatherSegment_T *ScatterGatherList =
3208 Command->V1.ScatterGatherList;
3209 struct scatterlist *ScatterList = Command->V1.ScatterList;
3210
3211 DAC960_V1_ClearCommand(Command);
3212
3213 if (Command->SegmentCount == 1)
3214 {
3215 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3216 CommandMailbox->Type5.CommandOpcode = DAC960_V1_Read;
3217 else
3218 CommandMailbox->Type5.CommandOpcode = DAC960_V1_Write;
3219
3220 CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3221 CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3222 CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3223 CommandMailbox->Type5.BusAddress =
3224 (DAC960_BusAddress32_T)sg_dma_address(ScatterList);
3225 }
3226 else
3227 {
3228 int i;
3229
3230 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3231 CommandMailbox->Type5.CommandOpcode = DAC960_V1_ReadWithScatterGather;
3232 else
3233 CommandMailbox->Type5.CommandOpcode = DAC960_V1_WriteWithScatterGather;
3234
3235 CommandMailbox->Type5.LD.TransferLength = Command->BlockCount;
3236 CommandMailbox->Type5.LD.LogicalDriveNumber = Command->LogicalDriveNumber;
3237 CommandMailbox->Type5.LogicalBlockAddress = Command->BlockNumber;
3238 CommandMailbox->Type5.BusAddress = Command->V1.ScatterGatherListDMA;
3239
3240 CommandMailbox->Type5.ScatterGatherCount = Command->SegmentCount;
3241
3242 for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3243 ScatterGatherList->SegmentDataPointer =
3244 (DAC960_BusAddress32_T)sg_dma_address(ScatterList);
3245 ScatterGatherList->SegmentByteCount =
3246 (DAC960_ByteCount32_T)sg_dma_len(ScatterList);
3247 }
3248 }
3249 DAC960_QueueCommand(Command);
3250}
3251
3252
3253
3254
3255
3256
3257
3258static void DAC960_V2_QueueReadWriteCommand(DAC960_Command_T *Command)
3259{
3260 DAC960_Controller_T *Controller = Command->Controller;
3261 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
3262 struct scatterlist *ScatterList = Command->V2.ScatterList;
3263
3264 DAC960_V2_ClearCommand(Command);
3265
3266 CommandMailbox->SCSI_10.CommandOpcode = DAC960_V2_SCSI_10;
3267 CommandMailbox->SCSI_10.CommandControlBits.DataTransferControllerToHost =
3268 (Command->DmaDirection == PCI_DMA_FROMDEVICE);
3269 CommandMailbox->SCSI_10.DataTransferSize =
3270 Command->BlockCount << DAC960_BlockSizeBits;
3271 CommandMailbox->SCSI_10.RequestSenseBusAddress = Command->V2.RequestSenseDMA;
3272 CommandMailbox->SCSI_10.PhysicalDevice =
3273 Controller->V2.LogicalDriveToVirtualDevice[Command->LogicalDriveNumber];
3274 CommandMailbox->SCSI_10.RequestSenseSize = sizeof(DAC960_SCSI_RequestSense_T);
3275 CommandMailbox->SCSI_10.CDBLength = 10;
3276 CommandMailbox->SCSI_10.SCSI_CDB[0] =
3277 (Command->DmaDirection == PCI_DMA_FROMDEVICE ? 0x28 : 0x2A);
3278 CommandMailbox->SCSI_10.SCSI_CDB[2] = Command->BlockNumber >> 24;
3279 CommandMailbox->SCSI_10.SCSI_CDB[3] = Command->BlockNumber >> 16;
3280 CommandMailbox->SCSI_10.SCSI_CDB[4] = Command->BlockNumber >> 8;
3281 CommandMailbox->SCSI_10.SCSI_CDB[5] = Command->BlockNumber;
3282 CommandMailbox->SCSI_10.SCSI_CDB[7] = Command->BlockCount >> 8;
3283 CommandMailbox->SCSI_10.SCSI_CDB[8] = Command->BlockCount;
3284
3285 if (Command->SegmentCount == 1)
3286 {
3287 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3288 .ScatterGatherSegments[0]
3289 .SegmentDataPointer =
3290 (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3291 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3292 .ScatterGatherSegments[0]
3293 .SegmentByteCount =
3294 CommandMailbox->SCSI_10.DataTransferSize;
3295 }
3296 else
3297 {
3298 DAC960_V2_ScatterGatherSegment_T *ScatterGatherList;
3299 int i;
3300
3301 if (Command->SegmentCount > 2)
3302 {
3303 ScatterGatherList = Command->V2.ScatterGatherList;
3304 CommandMailbox->SCSI_10.CommandControlBits
3305 .AdditionalScatterGatherListMemory = true;
3306 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3307 .ExtendedScatterGather.ScatterGatherList0Length = Command->SegmentCount;
3308 CommandMailbox->SCSI_10.DataTransferMemoryAddress
3309 .ExtendedScatterGather.ScatterGatherList0Address =
3310 Command->V2.ScatterGatherListDMA;
3311 }
3312 else
3313 ScatterGatherList = CommandMailbox->SCSI_10.DataTransferMemoryAddress
3314 .ScatterGatherSegments;
3315
3316 for (i = 0; i < Command->SegmentCount; i++, ScatterList++, ScatterGatherList++) {
3317 ScatterGatherList->SegmentDataPointer =
3318 (DAC960_BusAddress64_T)sg_dma_address(ScatterList);
3319 ScatterGatherList->SegmentByteCount =
3320 (DAC960_ByteCount64_T)sg_dma_len(ScatterList);
3321 }
3322 }
3323 DAC960_QueueCommand(Command);
3324}
3325
3326
3327static int DAC960_process_queue(DAC960_Controller_T *Controller, struct request_queue *req_q)
3328{
3329 struct request *Request;
3330 DAC960_Command_T *Command;
3331
3332 while(1) {
3333 Request = blk_peek_request(req_q);
3334 if (!Request)
3335 return 1;
3336
3337 Command = DAC960_AllocateCommand(Controller);
3338 if (Command == NULL)
3339 return 0;
3340
3341 if (rq_data_dir(Request) == READ) {
3342 Command->DmaDirection = PCI_DMA_FROMDEVICE;
3343 Command->CommandType = DAC960_ReadCommand;
3344 } else {
3345 Command->DmaDirection = PCI_DMA_TODEVICE;
3346 Command->CommandType = DAC960_WriteCommand;
3347 }
3348 Command->Completion = Request->end_io_data;
3349 Command->LogicalDriveNumber = (long)Request->rq_disk->private_data;
3350 Command->BlockNumber = blk_rq_pos(Request);
3351 Command->BlockCount = blk_rq_sectors(Request);
3352 Command->Request = Request;
3353 blk_start_request(Request);
3354 Command->SegmentCount = blk_rq_map_sg(req_q,
3355 Command->Request, Command->cmd_sglist);
3356
3357 Command->SegmentCount = pci_map_sg(Controller->PCIDevice, Command->cmd_sglist,
3358 Command->SegmentCount, Command->DmaDirection);
3359
3360 DAC960_QueueReadWriteCommand(Command);
3361 }
3362}
3363
3364
3365
3366
3367
3368
3369
3370static void DAC960_ProcessRequest(DAC960_Controller_T *controller)
3371{
3372 int i;
3373
3374 if (!controller->ControllerInitialized)
3375 return;
3376
3377
3378 for (i = controller->req_q_index; i < DAC960_MaxLogicalDrives; i++) {
3379 struct request_queue *req_q = controller->RequestQueue[i];
3380
3381 if (req_q == NULL)
3382 continue;
3383
3384 if (!DAC960_process_queue(controller, req_q)) {
3385 controller->req_q_index = i;
3386 return;
3387 }
3388 }
3389
3390 if (controller->req_q_index == 0)
3391 return;
3392
3393 for (i = 0; i < controller->req_q_index; i++) {
3394 struct request_queue *req_q = controller->RequestQueue[i];
3395
3396 if (req_q == NULL)
3397 continue;
3398
3399 if (!DAC960_process_queue(controller, req_q)) {
3400 controller->req_q_index = i;
3401 return;
3402 }
3403 }
3404}
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416static void DAC960_queue_partial_rw(DAC960_Command_T *Command)
3417{
3418 DAC960_Controller_T *Controller = Command->Controller;
3419 struct request *Request = Command->Request;
3420 struct request_queue *req_q = Controller->RequestQueue[Command->LogicalDriveNumber];
3421
3422 if (Command->DmaDirection == PCI_DMA_FROMDEVICE)
3423 Command->CommandType = DAC960_ReadRetryCommand;
3424 else
3425 Command->CommandType = DAC960_WriteRetryCommand;
3426
3427
3428
3429
3430
3431
3432
3433 (void)blk_rq_map_sg(req_q, Command->Request, Command->cmd_sglist);
3434
3435 (void)pci_map_sg(Controller->PCIDevice, Command->cmd_sglist, 1, Command->DmaDirection);
3436
3437
3438
3439
3440
3441
3442 Command->SegmentCount = 1;
3443 Command->BlockNumber = blk_rq_pos(Request);
3444 Command->BlockCount = 1;
3445 DAC960_QueueReadWriteCommand(Command);
3446 return;
3447}
3448
3449
3450
3451
3452
3453static void DAC960_RequestFunction(struct request_queue *RequestQueue)
3454{
3455 DAC960_ProcessRequest(RequestQueue->queuedata);
3456}
3457
3458
3459
3460
3461
3462
3463static inline bool DAC960_ProcessCompletedRequest(DAC960_Command_T *Command,
3464 bool SuccessfulIO)
3465{
3466 struct request *Request = Command->Request;
3467 blk_status_t Error = SuccessfulIO ? BLK_STS_OK : BLK_STS_IOERR;
3468
3469 pci_unmap_sg(Command->Controller->PCIDevice, Command->cmd_sglist,
3470 Command->SegmentCount, Command->DmaDirection);
3471
3472 if (!__blk_end_request(Request, Error, Command->BlockCount << 9)) {
3473 if (Command->Completion) {
3474 complete(Command->Completion);
3475 Command->Completion = NULL;
3476 }
3477 return true;
3478 }
3479 return false;
3480}
3481
3482
3483
3484
3485
3486
3487static void DAC960_V1_ReadWriteError(DAC960_Command_T *Command)
3488{
3489 DAC960_Controller_T *Controller = Command->Controller;
3490 unsigned char *CommandName = "UNKNOWN";
3491 switch (Command->CommandType)
3492 {
3493 case DAC960_ReadCommand:
3494 case DAC960_ReadRetryCommand:
3495 CommandName = "READ";
3496 break;
3497 case DAC960_WriteCommand:
3498 case DAC960_WriteRetryCommand:
3499 CommandName = "WRITE";
3500 break;
3501 case DAC960_MonitoringCommand:
3502 case DAC960_ImmediateCommand:
3503 case DAC960_QueuedCommand:
3504 break;
3505 }
3506 switch (Command->V1.CommandStatus)
3507 {
3508 case DAC960_V1_IrrecoverableDataError:
3509 DAC960_Error("Irrecoverable Data Error on %s:\n",
3510 Controller, CommandName);
3511 break;
3512 case DAC960_V1_LogicalDriveNonexistentOrOffline:
3513 DAC960_Error("Logical Drive Nonexistent or Offline on %s:\n",
3514 Controller, CommandName);
3515 break;
3516 case DAC960_V1_AccessBeyondEndOfLogicalDrive:
3517 DAC960_Error("Attempt to Access Beyond End of Logical Drive "
3518 "on %s:\n", Controller, CommandName);
3519 break;
3520 case DAC960_V1_BadDataEncountered:
3521 DAC960_Error("Bad Data Encountered on %s:\n", Controller, CommandName);
3522 break;
3523 default:
3524 DAC960_Error("Unexpected Error Status %04X on %s:\n",
3525 Controller, Command->V1.CommandStatus, CommandName);
3526 break;
3527 }
3528 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
3529 Controller, Controller->ControllerNumber,
3530 Command->LogicalDriveNumber, Command->BlockNumber,
3531 Command->BlockNumber + Command->BlockCount - 1);
3532}
3533
3534
3535
3536
3537
3538
3539
3540static void DAC960_V1_ProcessCompletedCommand(DAC960_Command_T *Command)
3541{
3542 DAC960_Controller_T *Controller = Command->Controller;
3543 DAC960_CommandType_T CommandType = Command->CommandType;
3544 DAC960_V1_CommandOpcode_T CommandOpcode =
3545 Command->V1.CommandMailbox.Common.CommandOpcode;
3546 DAC960_V1_CommandStatus_T CommandStatus = Command->V1.CommandStatus;
3547
3548 if (CommandType == DAC960_ReadCommand ||
3549 CommandType == DAC960_WriteCommand)
3550 {
3551
3552#ifdef FORCE_RETRY_DEBUG
3553 CommandStatus = DAC960_V1_IrrecoverableDataError;
3554#endif
3555
3556 if (CommandStatus == DAC960_V1_NormalCompletion) {
3557
3558 if (!DAC960_ProcessCompletedRequest(Command, true))
3559 BUG();
3560
3561 } else if (CommandStatus == DAC960_V1_IrrecoverableDataError ||
3562 CommandStatus == DAC960_V1_BadDataEncountered)
3563 {
3564
3565
3566
3567
3568 DAC960_queue_partial_rw(Command);
3569 return;
3570 }
3571 else
3572 {
3573 if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3574 DAC960_V1_ReadWriteError(Command);
3575
3576 if (!DAC960_ProcessCompletedRequest(Command, false))
3577 BUG();
3578 }
3579 }
3580 else if (CommandType == DAC960_ReadRetryCommand ||
3581 CommandType == DAC960_WriteRetryCommand)
3582 {
3583 bool normal_completion;
3584#ifdef FORCE_RETRY_FAILURE_DEBUG
3585 static int retry_count = 1;
3586#endif
3587
3588
3589
3590
3591 normal_completion = true;
3592 if (CommandStatus != DAC960_V1_NormalCompletion) {
3593 normal_completion = false;
3594 if (CommandStatus != DAC960_V1_LogicalDriveNonexistentOrOffline)
3595 DAC960_V1_ReadWriteError(Command);
3596 }
3597
3598#ifdef FORCE_RETRY_FAILURE_DEBUG
3599 if (!(++retry_count % 10000)) {
3600 printk("V1 error retry failure test\n");
3601 normal_completion = false;
3602 DAC960_V1_ReadWriteError(Command);
3603 }
3604#endif
3605
3606 if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
3607 DAC960_queue_partial_rw(Command);
3608 return;
3609 }
3610 }
3611
3612 else if (CommandType == DAC960_MonitoringCommand)
3613 {
3614 if (Controller->ShutdownMonitoringTimer)
3615 return;
3616 if (CommandOpcode == DAC960_V1_Enquiry)
3617 {
3618 DAC960_V1_Enquiry_T *OldEnquiry = &Controller->V1.Enquiry;
3619 DAC960_V1_Enquiry_T *NewEnquiry = Controller->V1.NewEnquiry;
3620 unsigned int OldCriticalLogicalDriveCount =
3621 OldEnquiry->CriticalLogicalDriveCount;
3622 unsigned int NewCriticalLogicalDriveCount =
3623 NewEnquiry->CriticalLogicalDriveCount;
3624 if (NewEnquiry->NumberOfLogicalDrives > Controller->LogicalDriveCount)
3625 {
3626 int LogicalDriveNumber = Controller->LogicalDriveCount - 1;
3627 while (++LogicalDriveNumber < NewEnquiry->NumberOfLogicalDrives)
3628 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3629 "Now Exists\n", Controller,
3630 LogicalDriveNumber,
3631 Controller->ControllerNumber,
3632 LogicalDriveNumber);
3633 Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3634 DAC960_ComputeGenericDiskInfo(Controller);
3635 }
3636 if (NewEnquiry->NumberOfLogicalDrives < Controller->LogicalDriveCount)
3637 {
3638 int LogicalDriveNumber = NewEnquiry->NumberOfLogicalDrives - 1;
3639 while (++LogicalDriveNumber < Controller->LogicalDriveCount)
3640 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3641 "No Longer Exists\n", Controller,
3642 LogicalDriveNumber,
3643 Controller->ControllerNumber,
3644 LogicalDriveNumber);
3645 Controller->LogicalDriveCount = NewEnquiry->NumberOfLogicalDrives;
3646 DAC960_ComputeGenericDiskInfo(Controller);
3647 }
3648 if (NewEnquiry->StatusFlags.DeferredWriteError !=
3649 OldEnquiry->StatusFlags.DeferredWriteError)
3650 DAC960_Critical("Deferred Write Error Flag is now %s\n", Controller,
3651 (NewEnquiry->StatusFlags.DeferredWriteError
3652 ? "TRUE" : "FALSE"));
3653 if ((NewCriticalLogicalDriveCount > 0 ||
3654 NewCriticalLogicalDriveCount != OldCriticalLogicalDriveCount) ||
3655 (NewEnquiry->OfflineLogicalDriveCount > 0 ||
3656 NewEnquiry->OfflineLogicalDriveCount !=
3657 OldEnquiry->OfflineLogicalDriveCount) ||
3658 (NewEnquiry->DeadDriveCount > 0 ||
3659 NewEnquiry->DeadDriveCount !=
3660 OldEnquiry->DeadDriveCount) ||
3661 (NewEnquiry->EventLogSequenceNumber !=
3662 OldEnquiry->EventLogSequenceNumber) ||
3663 Controller->MonitoringTimerCount == 0 ||
3664 time_after_eq(jiffies, Controller->SecondaryMonitoringTime
3665 + DAC960_SecondaryMonitoringInterval))
3666 {
3667 Controller->V1.NeedLogicalDriveInformation = true;
3668 Controller->V1.NewEventLogSequenceNumber =
3669 NewEnquiry->EventLogSequenceNumber;
3670 Controller->V1.NeedErrorTableInformation = true;
3671 Controller->V1.NeedDeviceStateInformation = true;
3672 Controller->V1.StartDeviceStateScan = true;
3673 Controller->V1.NeedBackgroundInitializationStatus =
3674 Controller->V1.BackgroundInitializationStatusSupported;
3675 Controller->SecondaryMonitoringTime = jiffies;
3676 }
3677 if (NewEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3678 NewEnquiry->RebuildFlag
3679 == DAC960_V1_BackgroundRebuildInProgress ||
3680 OldEnquiry->RebuildFlag == DAC960_V1_StandbyRebuildInProgress ||
3681 OldEnquiry->RebuildFlag == DAC960_V1_BackgroundRebuildInProgress)
3682 {
3683 Controller->V1.NeedRebuildProgress = true;
3684 Controller->V1.RebuildProgressFirst =
3685 (NewEnquiry->CriticalLogicalDriveCount <
3686 OldEnquiry->CriticalLogicalDriveCount);
3687 }
3688 if (OldEnquiry->RebuildFlag == DAC960_V1_BackgroundCheckInProgress)
3689 switch (NewEnquiry->RebuildFlag)
3690 {
3691 case DAC960_V1_NoStandbyRebuildOrCheckInProgress:
3692 DAC960_Progress("Consistency Check Completed Successfully\n",
3693 Controller);
3694 break;
3695 case DAC960_V1_StandbyRebuildInProgress:
3696 case DAC960_V1_BackgroundRebuildInProgress:
3697 break;
3698 case DAC960_V1_BackgroundCheckInProgress:
3699 Controller->V1.NeedConsistencyCheckProgress = true;
3700 break;
3701 case DAC960_V1_StandbyRebuildCompletedWithError:
3702 DAC960_Progress("Consistency Check Completed with Error\n",
3703 Controller);
3704 break;
3705 case DAC960_V1_BackgroundRebuildOrCheckFailed_DriveFailed:
3706 DAC960_Progress("Consistency Check Failed - "
3707 "Physical Device Failed\n", Controller);
3708 break;
3709 case DAC960_V1_BackgroundRebuildOrCheckFailed_LogicalDriveFailed:
3710 DAC960_Progress("Consistency Check Failed - "
3711 "Logical Drive Failed\n", Controller);
3712 break;
3713 case DAC960_V1_BackgroundRebuildOrCheckFailed_OtherCauses:
3714 DAC960_Progress("Consistency Check Failed - Other Causes\n",
3715 Controller);
3716 break;
3717 case DAC960_V1_BackgroundRebuildOrCheckSuccessfullyTerminated:
3718 DAC960_Progress("Consistency Check Successfully Terminated\n",
3719 Controller);
3720 break;
3721 }
3722 else if (NewEnquiry->RebuildFlag
3723 == DAC960_V1_BackgroundCheckInProgress)
3724 Controller->V1.NeedConsistencyCheckProgress = true;
3725 Controller->MonitoringAlertMode =
3726 (NewEnquiry->CriticalLogicalDriveCount > 0 ||
3727 NewEnquiry->OfflineLogicalDriveCount > 0 ||
3728 NewEnquiry->DeadDriveCount > 0);
3729 if (NewEnquiry->RebuildFlag > DAC960_V1_BackgroundCheckInProgress)
3730 {
3731 Controller->V1.PendingRebuildFlag = NewEnquiry->RebuildFlag;
3732 Controller->V1.RebuildFlagPending = true;
3733 }
3734 memcpy(&Controller->V1.Enquiry, &Controller->V1.NewEnquiry,
3735 sizeof(DAC960_V1_Enquiry_T));
3736 }
3737 else if (CommandOpcode == DAC960_V1_PerformEventLogOperation)
3738 {
3739 static char
3740 *DAC960_EventMessages[] =
3741 { "killed because write recovery failed",
3742 "killed because of SCSI bus reset failure",
3743 "killed because of double check condition",
3744 "killed because it was removed",
3745 "killed because of gross error on SCSI chip",
3746 "killed because of bad tag returned from drive",
3747 "killed because of timeout on SCSI command",
3748 "killed because of reset SCSI command issued from system",
3749 "killed because busy or parity error count exceeded limit",
3750 "killed because of 'kill drive' command from system",
3751 "killed because of selection timeout",
3752 "killed due to SCSI phase sequence error",
3753 "killed due to unknown status" };
3754 DAC960_V1_EventLogEntry_T *EventLogEntry =
3755 Controller->V1.EventLogEntry;
3756 if (EventLogEntry->SequenceNumber ==
3757 Controller->V1.OldEventLogSequenceNumber)
3758 {
3759 unsigned char SenseKey = EventLogEntry->SenseKey;
3760 unsigned char AdditionalSenseCode =
3761 EventLogEntry->AdditionalSenseCode;
3762 unsigned char AdditionalSenseCodeQualifier =
3763 EventLogEntry->AdditionalSenseCodeQualifier;
3764 if (SenseKey == DAC960_SenseKey_VendorSpecific &&
3765 AdditionalSenseCode == 0x80 &&
3766 AdditionalSenseCodeQualifier <
3767 ARRAY_SIZE(DAC960_EventMessages))
3768 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
3769 EventLogEntry->Channel,
3770 EventLogEntry->TargetID,
3771 DAC960_EventMessages[
3772 AdditionalSenseCodeQualifier]);
3773 else if (SenseKey == DAC960_SenseKey_UnitAttention &&
3774 AdditionalSenseCode == 0x29)
3775 {
3776 if (Controller->MonitoringTimerCount > 0)
3777 Controller->V1.DeviceResetCount[EventLogEntry->Channel]
3778 [EventLogEntry->TargetID]++;
3779 }
3780 else if (!(SenseKey == DAC960_SenseKey_NoSense ||
3781 (SenseKey == DAC960_SenseKey_NotReady &&
3782 AdditionalSenseCode == 0x04 &&
3783 (AdditionalSenseCodeQualifier == 0x01 ||
3784 AdditionalSenseCodeQualifier == 0x02))))
3785 {
3786 DAC960_Critical("Physical Device %d:%d Error Log: "
3787 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
3788 Controller,
3789 EventLogEntry->Channel,
3790 EventLogEntry->TargetID,
3791 SenseKey,
3792 AdditionalSenseCode,
3793 AdditionalSenseCodeQualifier);
3794 DAC960_Critical("Physical Device %d:%d Error Log: "
3795 "Information = %02X%02X%02X%02X "
3796 "%02X%02X%02X%02X\n",
3797 Controller,
3798 EventLogEntry->Channel,
3799 EventLogEntry->TargetID,
3800 EventLogEntry->Information[0],
3801 EventLogEntry->Information[1],
3802 EventLogEntry->Information[2],
3803 EventLogEntry->Information[3],
3804 EventLogEntry->CommandSpecificInformation[0],
3805 EventLogEntry->CommandSpecificInformation[1],
3806 EventLogEntry->CommandSpecificInformation[2],
3807 EventLogEntry->CommandSpecificInformation[3]);
3808 }
3809 }
3810 Controller->V1.OldEventLogSequenceNumber++;
3811 }
3812 else if (CommandOpcode == DAC960_V1_GetErrorTable)
3813 {
3814 DAC960_V1_ErrorTable_T *OldErrorTable = &Controller->V1.ErrorTable;
3815 DAC960_V1_ErrorTable_T *NewErrorTable = Controller->V1.NewErrorTable;
3816 int Channel, TargetID;
3817 for (Channel = 0; Channel < Controller->Channels; Channel++)
3818 for (TargetID = 0; TargetID < Controller->Targets; TargetID++)
3819 {
3820 DAC960_V1_ErrorTableEntry_T *NewErrorEntry =
3821 &NewErrorTable->ErrorTableEntries[Channel][TargetID];
3822 DAC960_V1_ErrorTableEntry_T *OldErrorEntry =
3823 &OldErrorTable->ErrorTableEntries[Channel][TargetID];
3824 if ((NewErrorEntry->ParityErrorCount !=
3825 OldErrorEntry->ParityErrorCount) ||
3826 (NewErrorEntry->SoftErrorCount !=
3827 OldErrorEntry->SoftErrorCount) ||
3828 (NewErrorEntry->HardErrorCount !=
3829 OldErrorEntry->HardErrorCount) ||
3830 (NewErrorEntry->MiscErrorCount !=
3831 OldErrorEntry->MiscErrorCount))
3832 DAC960_Critical("Physical Device %d:%d Errors: "
3833 "Parity = %d, Soft = %d, "
3834 "Hard = %d, Misc = %d\n",
3835 Controller, Channel, TargetID,
3836 NewErrorEntry->ParityErrorCount,
3837 NewErrorEntry->SoftErrorCount,
3838 NewErrorEntry->HardErrorCount,
3839 NewErrorEntry->MiscErrorCount);
3840 }
3841 memcpy(&Controller->V1.ErrorTable, Controller->V1.NewErrorTable,
3842 sizeof(DAC960_V1_ErrorTable_T));
3843 }
3844 else if (CommandOpcode == DAC960_V1_GetDeviceState)
3845 {
3846 DAC960_V1_DeviceState_T *OldDeviceState =
3847 &Controller->V1.DeviceState[Controller->V1.DeviceStateChannel]
3848 [Controller->V1.DeviceStateTargetID];
3849 DAC960_V1_DeviceState_T *NewDeviceState =
3850 Controller->V1.NewDeviceState;
3851 if (NewDeviceState->DeviceState != OldDeviceState->DeviceState)
3852 DAC960_Critical("Physical Device %d:%d is now %s\n", Controller,
3853 Controller->V1.DeviceStateChannel,
3854 Controller->V1.DeviceStateTargetID,
3855 (NewDeviceState->DeviceState
3856 == DAC960_V1_Device_Dead
3857 ? "DEAD"
3858 : NewDeviceState->DeviceState
3859 == DAC960_V1_Device_WriteOnly
3860 ? "WRITE-ONLY"
3861 : NewDeviceState->DeviceState
3862 == DAC960_V1_Device_Online
3863 ? "ONLINE" : "STANDBY"));
3864 if (OldDeviceState->DeviceState == DAC960_V1_Device_Dead &&
3865 NewDeviceState->DeviceState != DAC960_V1_Device_Dead)
3866 {
3867 Controller->V1.NeedDeviceInquiryInformation = true;
3868 Controller->V1.NeedDeviceSerialNumberInformation = true;
3869 Controller->V1.DeviceResetCount
3870 [Controller->V1.DeviceStateChannel]
3871 [Controller->V1.DeviceStateTargetID] = 0;
3872 }
3873 memcpy(OldDeviceState, NewDeviceState,
3874 sizeof(DAC960_V1_DeviceState_T));
3875 }
3876 else if (CommandOpcode == DAC960_V1_GetLogicalDriveInformation)
3877 {
3878 int LogicalDriveNumber;
3879 for (LogicalDriveNumber = 0;
3880 LogicalDriveNumber < Controller->LogicalDriveCount;
3881 LogicalDriveNumber++)
3882 {
3883 DAC960_V1_LogicalDriveInformation_T *OldLogicalDriveInformation =
3884 &Controller->V1.LogicalDriveInformation[LogicalDriveNumber];
3885 DAC960_V1_LogicalDriveInformation_T *NewLogicalDriveInformation =
3886 &(*Controller->V1.NewLogicalDriveInformation)[LogicalDriveNumber];
3887 if (NewLogicalDriveInformation->LogicalDriveState !=
3888 OldLogicalDriveInformation->LogicalDriveState)
3889 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3890 "is now %s\n", Controller,
3891 LogicalDriveNumber,
3892 Controller->ControllerNumber,
3893 LogicalDriveNumber,
3894 (NewLogicalDriveInformation->LogicalDriveState
3895 == DAC960_V1_LogicalDrive_Online
3896 ? "ONLINE"
3897 : NewLogicalDriveInformation->LogicalDriveState
3898 == DAC960_V1_LogicalDrive_Critical
3899 ? "CRITICAL" : "OFFLINE"));
3900 if (NewLogicalDriveInformation->WriteBack !=
3901 OldLogicalDriveInformation->WriteBack)
3902 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
3903 "is now %s\n", Controller,
3904 LogicalDriveNumber,
3905 Controller->ControllerNumber,
3906 LogicalDriveNumber,
3907 (NewLogicalDriveInformation->WriteBack
3908 ? "WRITE BACK" : "WRITE THRU"));
3909 }
3910 memcpy(&Controller->V1.LogicalDriveInformation,
3911 Controller->V1.NewLogicalDriveInformation,
3912 sizeof(DAC960_V1_LogicalDriveInformationArray_T));
3913 }
3914 else if (CommandOpcode == DAC960_V1_GetRebuildProgress)
3915 {
3916 unsigned int LogicalDriveNumber =
3917 Controller->V1.RebuildProgress->LogicalDriveNumber;
3918 unsigned int LogicalDriveSize =
3919 Controller->V1.RebuildProgress->LogicalDriveSize;
3920 unsigned int BlocksCompleted =
3921 LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3922 if (CommandStatus == DAC960_V1_NoRebuildOrCheckInProgress &&
3923 Controller->V1.LastRebuildStatus == DAC960_V1_NormalCompletion)
3924 CommandStatus = DAC960_V1_RebuildSuccessful;
3925 switch (CommandStatus)
3926 {
3927 case DAC960_V1_NormalCompletion:
3928 Controller->EphemeralProgressMessage = true;
3929 DAC960_Progress("Rebuild in Progress: "
3930 "Logical Drive %d (/dev/rd/c%dd%d) "
3931 "%d%% completed\n",
3932 Controller, LogicalDriveNumber,
3933 Controller->ControllerNumber,
3934 LogicalDriveNumber,
3935 (100 * (BlocksCompleted >> 7))
3936 / (LogicalDriveSize >> 7));
3937 Controller->EphemeralProgressMessage = false;
3938 break;
3939 case DAC960_V1_RebuildFailed_LogicalDriveFailure:
3940 DAC960_Progress("Rebuild Failed due to "
3941 "Logical Drive Failure\n", Controller);
3942 break;
3943 case DAC960_V1_RebuildFailed_BadBlocksOnOther:
3944 DAC960_Progress("Rebuild Failed due to "
3945 "Bad Blocks on Other Drives\n", Controller);
3946 break;
3947 case DAC960_V1_RebuildFailed_NewDriveFailed:
3948 DAC960_Progress("Rebuild Failed due to "
3949 "Failure of Drive Being Rebuilt\n", Controller);
3950 break;
3951 case DAC960_V1_NoRebuildOrCheckInProgress:
3952 break;
3953 case DAC960_V1_RebuildSuccessful:
3954 DAC960_Progress("Rebuild Completed Successfully\n", Controller);
3955 break;
3956 case DAC960_V1_RebuildSuccessfullyTerminated:
3957 DAC960_Progress("Rebuild Successfully Terminated\n", Controller);
3958 break;
3959 }
3960 Controller->V1.LastRebuildStatus = CommandStatus;
3961 if (CommandType != DAC960_MonitoringCommand &&
3962 Controller->V1.RebuildStatusPending)
3963 {
3964 Command->V1.CommandStatus = Controller->V1.PendingRebuildStatus;
3965 Controller->V1.RebuildStatusPending = false;
3966 }
3967 else if (CommandType == DAC960_MonitoringCommand &&
3968 CommandStatus != DAC960_V1_NormalCompletion &&
3969 CommandStatus != DAC960_V1_NoRebuildOrCheckInProgress)
3970 {
3971 Controller->V1.PendingRebuildStatus = CommandStatus;
3972 Controller->V1.RebuildStatusPending = true;
3973 }
3974 }
3975 else if (CommandOpcode == DAC960_V1_RebuildStat)
3976 {
3977 unsigned int LogicalDriveNumber =
3978 Controller->V1.RebuildProgress->LogicalDriveNumber;
3979 unsigned int LogicalDriveSize =
3980 Controller->V1.RebuildProgress->LogicalDriveSize;
3981 unsigned int BlocksCompleted =
3982 LogicalDriveSize - Controller->V1.RebuildProgress->RemainingBlocks;
3983 if (CommandStatus == DAC960_V1_NormalCompletion)
3984 {
3985 Controller->EphemeralProgressMessage = true;
3986 DAC960_Progress("Consistency Check in Progress: "
3987 "Logical Drive %d (/dev/rd/c%dd%d) "
3988 "%d%% completed\n",
3989 Controller, LogicalDriveNumber,
3990 Controller->ControllerNumber,
3991 LogicalDriveNumber,
3992 (100 * (BlocksCompleted >> 7))
3993 / (LogicalDriveSize >> 7));
3994 Controller->EphemeralProgressMessage = false;
3995 }
3996 }
3997 else if (CommandOpcode == DAC960_V1_BackgroundInitializationControl)
3998 {
3999 unsigned int LogicalDriveNumber =
4000 Controller->V1.BackgroundInitializationStatus->LogicalDriveNumber;
4001 unsigned int LogicalDriveSize =
4002 Controller->V1.BackgroundInitializationStatus->LogicalDriveSize;
4003 unsigned int BlocksCompleted =
4004 Controller->V1.BackgroundInitializationStatus->BlocksCompleted;
4005 switch (CommandStatus)
4006 {
4007 case DAC960_V1_NormalCompletion:
4008 switch (Controller->V1.BackgroundInitializationStatus->Status)
4009 {
4010 case DAC960_V1_BackgroundInitializationInvalid:
4011 break;
4012 case DAC960_V1_BackgroundInitializationStarted:
4013 DAC960_Progress("Background Initialization Started\n",
4014 Controller);
4015 break;
4016 case DAC960_V1_BackgroundInitializationInProgress:
4017 if (BlocksCompleted ==
4018 Controller->V1.LastBackgroundInitializationStatus.
4019 BlocksCompleted &&
4020 LogicalDriveNumber ==
4021 Controller->V1.LastBackgroundInitializationStatus.
4022 LogicalDriveNumber)
4023 break;
4024 Controller->EphemeralProgressMessage = true;
4025 DAC960_Progress("Background Initialization in Progress: "
4026 "Logical Drive %d (/dev/rd/c%dd%d) "
4027 "%d%% completed\n",
4028 Controller, LogicalDriveNumber,
4029 Controller->ControllerNumber,
4030 LogicalDriveNumber,
4031 (100 * (BlocksCompleted >> 7))
4032 / (LogicalDriveSize >> 7));
4033 Controller->EphemeralProgressMessage = false;
4034 break;
4035 case DAC960_V1_BackgroundInitializationSuspended:
4036 DAC960_Progress("Background Initialization Suspended\n",
4037 Controller);
4038 break;
4039 case DAC960_V1_BackgroundInitializationCancelled:
4040 DAC960_Progress("Background Initialization Cancelled\n",
4041 Controller);
4042 break;
4043 }
4044 memcpy(&Controller->V1.LastBackgroundInitializationStatus,
4045 Controller->V1.BackgroundInitializationStatus,
4046 sizeof(DAC960_V1_BackgroundInitializationStatus_T));
4047 break;
4048 case DAC960_V1_BackgroundInitSuccessful:
4049 if (Controller->V1.BackgroundInitializationStatus->Status ==
4050 DAC960_V1_BackgroundInitializationInProgress)
4051 DAC960_Progress("Background Initialization "
4052 "Completed Successfully\n", Controller);
4053 Controller->V1.BackgroundInitializationStatus->Status =
4054 DAC960_V1_BackgroundInitializationInvalid;
4055 break;
4056 case DAC960_V1_BackgroundInitAborted:
4057 if (Controller->V1.BackgroundInitializationStatus->Status ==
4058 DAC960_V1_BackgroundInitializationInProgress)
4059 DAC960_Progress("Background Initialization Aborted\n",
4060 Controller);
4061 Controller->V1.BackgroundInitializationStatus->Status =
4062 DAC960_V1_BackgroundInitializationInvalid;
4063 break;
4064 case DAC960_V1_NoBackgroundInitInProgress:
4065 break;
4066 }
4067 }
4068 else if (CommandOpcode == DAC960_V1_DCDB)
4069 {
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083 if (Controller->V1.NeedDeviceInquiryInformation)
4084 {
4085 DAC960_SCSI_Inquiry_T *InquiryStandardData =
4086 &Controller->V1.InquiryStandardData
4087 [Controller->V1.DeviceStateChannel]
4088 [Controller->V1.DeviceStateTargetID];
4089 if (CommandStatus != DAC960_V1_NormalCompletion)
4090 {
4091 memset(InquiryStandardData, 0,
4092 sizeof(DAC960_SCSI_Inquiry_T));
4093 InquiryStandardData->PeripheralDeviceType = 0x1F;
4094 }
4095 else
4096 memcpy(InquiryStandardData,
4097 Controller->V1.NewInquiryStandardData,
4098 sizeof(DAC960_SCSI_Inquiry_T));
4099 Controller->V1.NeedDeviceInquiryInformation = false;
4100 }
4101 else if (Controller->V1.NeedDeviceSerialNumberInformation)
4102 {
4103 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4104 &Controller->V1.InquiryUnitSerialNumber
4105 [Controller->V1.DeviceStateChannel]
4106 [Controller->V1.DeviceStateTargetID];
4107 if (CommandStatus != DAC960_V1_NormalCompletion)
4108 {
4109 memset(InquiryUnitSerialNumber, 0,
4110 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4111 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
4112 }
4113 else
4114 memcpy(InquiryUnitSerialNumber,
4115 Controller->V1.NewInquiryUnitSerialNumber,
4116 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4117 Controller->V1.NeedDeviceSerialNumberInformation = false;
4118 }
4119 }
4120
4121
4122
4123 if (Controller->V1.NewEventLogSequenceNumber
4124 - Controller->V1.OldEventLogSequenceNumber > 0)
4125 {
4126 Command->V1.CommandMailbox.Type3E.CommandOpcode =
4127 DAC960_V1_PerformEventLogOperation;
4128 Command->V1.CommandMailbox.Type3E.OperationType =
4129 DAC960_V1_GetEventLogEntry;
4130 Command->V1.CommandMailbox.Type3E.OperationQualifier = 1;
4131 Command->V1.CommandMailbox.Type3E.SequenceNumber =
4132 Controller->V1.OldEventLogSequenceNumber;
4133 Command->V1.CommandMailbox.Type3E.BusAddress =
4134 Controller->V1.EventLogEntryDMA;
4135 DAC960_QueueCommand(Command);
4136 return;
4137 }
4138 if (Controller->V1.NeedErrorTableInformation)
4139 {
4140 Controller->V1.NeedErrorTableInformation = false;
4141 Command->V1.CommandMailbox.Type3.CommandOpcode =
4142 DAC960_V1_GetErrorTable;
4143 Command->V1.CommandMailbox.Type3.BusAddress =
4144 Controller->V1.NewErrorTableDMA;
4145 DAC960_QueueCommand(Command);
4146 return;
4147 }
4148 if (Controller->V1.NeedRebuildProgress &&
4149 Controller->V1.RebuildProgressFirst)
4150 {
4151 Controller->V1.NeedRebuildProgress = false;
4152 Command->V1.CommandMailbox.Type3.CommandOpcode =
4153 DAC960_V1_GetRebuildProgress;
4154 Command->V1.CommandMailbox.Type3.BusAddress =
4155 Controller->V1.RebuildProgressDMA;
4156 DAC960_QueueCommand(Command);
4157 return;
4158 }
4159 if (Controller->V1.NeedDeviceStateInformation)
4160 {
4161 if (Controller->V1.NeedDeviceInquiryInformation)
4162 {
4163 DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4164 dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4165
4166 dma_addr_t NewInquiryStandardDataDMA =
4167 Controller->V1.NewInquiryStandardDataDMA;
4168
4169 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4170 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4171 DCDB->Channel = Controller->V1.DeviceStateChannel;
4172 DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4173 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4174 DCDB->EarlyStatus = false;
4175 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4176 DCDB->NoAutomaticRequestSense = false;
4177 DCDB->DisconnectPermitted = true;
4178 DCDB->TransferLength = sizeof(DAC960_SCSI_Inquiry_T);
4179 DCDB->BusAddress = NewInquiryStandardDataDMA;
4180 DCDB->CDBLength = 6;
4181 DCDB->TransferLengthHigh4 = 0;
4182 DCDB->SenseLength = sizeof(DCDB->SenseData);
4183 DCDB->CDB[0] = 0x12;
4184 DCDB->CDB[1] = 0;
4185 DCDB->CDB[2] = 0;
4186 DCDB->CDB[3] = 0;
4187 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_T);
4188 DCDB->CDB[5] = 0;
4189 DAC960_QueueCommand(Command);
4190 return;
4191 }
4192 if (Controller->V1.NeedDeviceSerialNumberInformation)
4193 {
4194 DAC960_V1_DCDB_T *DCDB = Controller->V1.MonitoringDCDB;
4195 dma_addr_t DCDB_DMA = Controller->V1.MonitoringDCDB_DMA;
4196 dma_addr_t NewInquiryUnitSerialNumberDMA =
4197 Controller->V1.NewInquiryUnitSerialNumberDMA;
4198
4199 Command->V1.CommandMailbox.Type3.CommandOpcode = DAC960_V1_DCDB;
4200 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_DMA;
4201 DCDB->Channel = Controller->V1.DeviceStateChannel;
4202 DCDB->TargetID = Controller->V1.DeviceStateTargetID;
4203 DCDB->Direction = DAC960_V1_DCDB_DataTransferDeviceToSystem;
4204 DCDB->EarlyStatus = false;
4205 DCDB->Timeout = DAC960_V1_DCDB_Timeout_10_seconds;
4206 DCDB->NoAutomaticRequestSense = false;
4207 DCDB->DisconnectPermitted = true;
4208 DCDB->TransferLength =
4209 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4210 DCDB->BusAddress = NewInquiryUnitSerialNumberDMA;
4211 DCDB->CDBLength = 6;
4212 DCDB->TransferLengthHigh4 = 0;
4213 DCDB->SenseLength = sizeof(DCDB->SenseData);
4214 DCDB->CDB[0] = 0x12;
4215 DCDB->CDB[1] = 1;
4216 DCDB->CDB[2] = 0x80;
4217 DCDB->CDB[3] = 0;
4218 DCDB->CDB[4] = sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T);
4219 DCDB->CDB[5] = 0;
4220 DAC960_QueueCommand(Command);
4221 return;
4222 }
4223 if (Controller->V1.StartDeviceStateScan)
4224 {
4225 Controller->V1.DeviceStateChannel = 0;
4226 Controller->V1.DeviceStateTargetID = 0;
4227 Controller->V1.StartDeviceStateScan = false;
4228 }
4229 else if (++Controller->V1.DeviceStateTargetID == Controller->Targets)
4230 {
4231 Controller->V1.DeviceStateChannel++;
4232 Controller->V1.DeviceStateTargetID = 0;
4233 }
4234 if (Controller->V1.DeviceStateChannel < Controller->Channels)
4235 {
4236 Controller->V1.NewDeviceState->DeviceState =
4237 DAC960_V1_Device_Dead;
4238 Command->V1.CommandMailbox.Type3D.CommandOpcode =
4239 DAC960_V1_GetDeviceState;
4240 Command->V1.CommandMailbox.Type3D.Channel =
4241 Controller->V1.DeviceStateChannel;
4242 Command->V1.CommandMailbox.Type3D.TargetID =
4243 Controller->V1.DeviceStateTargetID;
4244 Command->V1.CommandMailbox.Type3D.BusAddress =
4245 Controller->V1.NewDeviceStateDMA;
4246 DAC960_QueueCommand(Command);
4247 return;
4248 }
4249 Controller->V1.NeedDeviceStateInformation = false;
4250 }
4251 if (Controller->V1.NeedLogicalDriveInformation)
4252 {
4253 Controller->V1.NeedLogicalDriveInformation = false;
4254 Command->V1.CommandMailbox.Type3.CommandOpcode =
4255 DAC960_V1_GetLogicalDriveInformation;
4256 Command->V1.CommandMailbox.Type3.BusAddress =
4257 Controller->V1.NewLogicalDriveInformationDMA;
4258 DAC960_QueueCommand(Command);
4259 return;
4260 }
4261 if (Controller->V1.NeedRebuildProgress)
4262 {
4263 Controller->V1.NeedRebuildProgress = false;
4264 Command->V1.CommandMailbox.Type3.CommandOpcode =
4265 DAC960_V1_GetRebuildProgress;
4266 Command->V1.CommandMailbox.Type3.BusAddress =
4267 Controller->V1.RebuildProgressDMA;
4268 DAC960_QueueCommand(Command);
4269 return;
4270 }
4271 if (Controller->V1.NeedConsistencyCheckProgress)
4272 {
4273 Controller->V1.NeedConsistencyCheckProgress = false;
4274 Command->V1.CommandMailbox.Type3.CommandOpcode =
4275 DAC960_V1_RebuildStat;
4276 Command->V1.CommandMailbox.Type3.BusAddress =
4277 Controller->V1.RebuildProgressDMA;
4278 DAC960_QueueCommand(Command);
4279 return;
4280 }
4281 if (Controller->V1.NeedBackgroundInitializationStatus)
4282 {
4283 Controller->V1.NeedBackgroundInitializationStatus = false;
4284 Command->V1.CommandMailbox.Type3B.CommandOpcode =
4285 DAC960_V1_BackgroundInitializationControl;
4286 Command->V1.CommandMailbox.Type3B.CommandOpcode2 = 0x20;
4287 Command->V1.CommandMailbox.Type3B.BusAddress =
4288 Controller->V1.BackgroundInitializationStatusDMA;
4289 DAC960_QueueCommand(Command);
4290 return;
4291 }
4292 Controller->MonitoringTimerCount++;
4293 Controller->MonitoringTimer.expires =
4294 jiffies + DAC960_MonitoringTimerInterval;
4295 add_timer(&Controller->MonitoringTimer);
4296 }
4297 if (CommandType == DAC960_ImmediateCommand)
4298 {
4299 complete(Command->Completion);
4300 Command->Completion = NULL;
4301 return;
4302 }
4303 if (CommandType == DAC960_QueuedCommand)
4304 {
4305 DAC960_V1_KernelCommand_T *KernelCommand = Command->V1.KernelCommand;
4306 KernelCommand->CommandStatus = Command->V1.CommandStatus;
4307 Command->V1.KernelCommand = NULL;
4308 if (CommandOpcode == DAC960_V1_DCDB)
4309 Controller->V1.DirectCommandActive[KernelCommand->DCDB->Channel]
4310 [KernelCommand->DCDB->TargetID] =
4311 false;
4312 DAC960_DeallocateCommand(Command);
4313 KernelCommand->CompletionFunction(KernelCommand);
4314 return;
4315 }
4316
4317
4318
4319
4320
4321 if (Controller->MonitoringCommandDeferred)
4322 {
4323 Controller->MonitoringCommandDeferred = false;
4324 DAC960_V1_QueueMonitoringCommand(Command);
4325 return;
4326 }
4327
4328
4329
4330 DAC960_DeallocateCommand(Command);
4331
4332
4333
4334 wake_up(&Controller->CommandWaitQueue);
4335}
4336
4337
4338
4339
4340
4341
4342
4343static void DAC960_V2_ReadWriteError(DAC960_Command_T *Command)
4344{
4345 DAC960_Controller_T *Controller = Command->Controller;
4346 static const unsigned char *SenseErrors[] = {
4347 "NO SENSE", "RECOVERED ERROR",
4348 "NOT READY", "MEDIUM ERROR",
4349 "HARDWARE ERROR", "ILLEGAL REQUEST",
4350 "UNIT ATTENTION", "DATA PROTECT",
4351 "BLANK CHECK", "VENDOR-SPECIFIC",
4352 "COPY ABORTED", "ABORTED COMMAND",
4353 "EQUAL", "VOLUME OVERFLOW",
4354 "MISCOMPARE", "RESERVED"
4355 };
4356 unsigned char *CommandName = "UNKNOWN";
4357 switch (Command->CommandType)
4358 {
4359 case DAC960_ReadCommand:
4360 case DAC960_ReadRetryCommand:
4361 CommandName = "READ";
4362 break;
4363 case DAC960_WriteCommand:
4364 case DAC960_WriteRetryCommand:
4365 CommandName = "WRITE";
4366 break;
4367 case DAC960_MonitoringCommand:
4368 case DAC960_ImmediateCommand:
4369 case DAC960_QueuedCommand:
4370 break;
4371 }
4372 DAC960_Error("Error Condition %s on %s:\n", Controller,
4373 SenseErrors[Command->V2.RequestSense->SenseKey], CommandName);
4374 DAC960_Error(" /dev/rd/c%dd%d: absolute blocks %u..%u\n",
4375 Controller, Controller->ControllerNumber,
4376 Command->LogicalDriveNumber, Command->BlockNumber,
4377 Command->BlockNumber + Command->BlockCount - 1);
4378}
4379
4380
4381
4382
4383
4384
4385
4386static void DAC960_V2_ReportEvent(DAC960_Controller_T *Controller,
4387 DAC960_V2_Event_T *Event)
4388{
4389 DAC960_SCSI_RequestSense_T *RequestSense =
4390 (DAC960_SCSI_RequestSense_T *) &Event->RequestSenseData;
4391 unsigned char MessageBuffer[DAC960_LineBufferSize];
4392 static struct { int EventCode; unsigned char *EventMessage; } EventList[] =
4393 {
4394 { 0x0001, "P Online" },
4395 { 0x0002, "P Standby" },
4396 { 0x0005, "P Automatic Rebuild Started" },
4397 { 0x0006, "P Manual Rebuild Started" },
4398 { 0x0007, "P Rebuild Completed" },
4399 { 0x0008, "P Rebuild Cancelled" },
4400 { 0x0009, "P Rebuild Failed for Unknown Reasons" },
4401 { 0x000A, "P Rebuild Failed due to New Physical Device" },
4402 { 0x000B, "P Rebuild Failed due to Logical Drive Failure" },
4403 { 0x000C, "S Offline" },
4404 { 0x000D, "P Found" },
4405 { 0x000E, "P Removed" },
4406 { 0x000F, "P Unconfigured" },
4407 { 0x0010, "P Expand Capacity Started" },
4408 { 0x0011, "P Expand Capacity Completed" },
4409 { 0x0012, "P Expand Capacity Failed" },
4410 { 0x0013, "P Command Timed Out" },
4411 { 0x0014, "P Command Aborted" },
4412 { 0x0015, "P Command Retried" },
4413 { 0x0016, "P Parity Error" },
4414 { 0x0017, "P Soft Error" },
4415 { 0x0018, "P Miscellaneous Error" },
4416 { 0x0019, "P Reset" },
4417 { 0x001A, "P Active Spare Found" },
4418 { 0x001B, "P Warm Spare Found" },
4419 { 0x001C, "S Sense Data Received" },
4420 { 0x001D, "P Initialization Started" },
4421 { 0x001E, "P Initialization Completed" },
4422 { 0x001F, "P Initialization Failed" },
4423 { 0x0020, "P Initialization Cancelled" },
4424 { 0x0021, "P Failed because Write Recovery Failed" },
4425 { 0x0022, "P Failed because SCSI Bus Reset Failed" },
4426 { 0x0023, "P Failed because of Double Check Condition" },
4427 { 0x0024, "P Failed because Device Cannot Be Accessed" },
4428 { 0x0025, "P Failed because of Gross Error on SCSI Processor" },
4429 { 0x0026, "P Failed because of Bad Tag from Device" },
4430 { 0x0027, "P Failed because of Command Timeout" },
4431 { 0x0028, "P Failed because of System Reset" },
4432 { 0x0029, "P Failed because of Busy Status or Parity Error" },
4433 { 0x002A, "P Failed because Host Set Device to Failed State" },
4434 { 0x002B, "P Failed because of Selection Timeout" },
4435 { 0x002C, "P Failed because of SCSI Bus Phase Error" },
4436 { 0x002D, "P Failed because Device Returned Unknown Status" },
4437 { 0x002E, "P Failed because Device Not Ready" },
4438 { 0x002F, "P Failed because Device Not Found at Startup" },
4439 { 0x0030, "P Failed because COD Write Operation Failed" },
4440 { 0x0031, "P Failed because BDT Write Operation Failed" },
4441 { 0x0039, "P Missing at Startup" },
4442 { 0x003A, "P Start Rebuild Failed due to Physical Drive Too Small" },
4443 { 0x003C, "P Temporarily Offline Device Automatically Made Online" },
4444 { 0x003D, "P Standby Rebuild Started" },
4445
4446 { 0x0080, "M Consistency Check Started" },
4447 { 0x0081, "M Consistency Check Completed" },
4448 { 0x0082, "M Consistency Check Cancelled" },
4449 { 0x0083, "M Consistency Check Completed With Errors" },
4450 { 0x0084, "M Consistency Check Failed due to Logical Drive Failure" },
4451 { 0x0085, "M Consistency Check Failed due to Physical Device Failure" },
4452 { 0x0086, "L Offline" },
4453 { 0x0087, "L Critical" },
4454 { 0x0088, "L Online" },
4455 { 0x0089, "M Automatic Rebuild Started" },
4456 { 0x008A, "M Manual Rebuild Started" },
4457 { 0x008B, "M Rebuild Completed" },
4458 { 0x008C, "M Rebuild Cancelled" },
4459 { 0x008D, "M Rebuild Failed for Unknown Reasons" },
4460 { 0x008E, "M Rebuild Failed due to New Physical Device" },
4461 { 0x008F, "M Rebuild Failed due to Logical Drive Failure" },
4462 { 0x0090, "M Initialization Started" },
4463 { 0x0091, "M Initialization Completed" },
4464 { 0x0092, "M Initialization Cancelled" },
4465 { 0x0093, "M Initialization Failed" },
4466 { 0x0094, "L Found" },
4467 { 0x0095, "L Deleted" },
4468 { 0x0096, "M Expand Capacity Started" },
4469 { 0x0097, "M Expand Capacity Completed" },
4470 { 0x0098, "M Expand Capacity Failed" },
4471 { 0x0099, "L Bad Block Found" },
4472 { 0x009A, "L Size Changed" },
4473 { 0x009B, "L Type Changed" },
4474 { 0x009C, "L Bad Data Block Found" },
4475 { 0x009E, "L Read of Data Block in BDT" },
4476 { 0x009F, "L Write Back Data for Disk Block Lost" },
4477 { 0x00A0, "L Temporarily Offline RAID-5/3 Drive Made Online" },
4478 { 0x00A1, "L Temporarily Offline RAID-6/1/0/7 Drive Made Online" },
4479 { 0x00A2, "L Standby Rebuild Started" },
4480
4481 { 0x0140, "E Fan %d Failed" },
4482 { 0x0141, "E Fan %d OK" },
4483 { 0x0142, "E Fan %d Not Present" },
4484 { 0x0143, "E Power Supply %d Failed" },
4485 { 0x0144, "E Power Supply %d OK" },
4486 { 0x0145, "E Power Supply %d Not Present" },
4487 { 0x0146, "E Temperature Sensor %d Temperature Exceeds Safe Limit" },
4488 { 0x0147, "E Temperature Sensor %d Temperature Exceeds Working Limit" },
4489 { 0x0148, "E Temperature Sensor %d Temperature Normal" },
4490 { 0x0149, "E Temperature Sensor %d Not Present" },
4491 { 0x014A, "E Enclosure Management Unit %d Access Critical" },
4492 { 0x014B, "E Enclosure Management Unit %d Access OK" },
4493 { 0x014C, "E Enclosure Management Unit %d Access Offline" },
4494
4495 { 0x0181, "C Cache Write Back Error" },
4496 { 0x0188, "C Battery Backup Unit Found" },
4497 { 0x0189, "C Battery Backup Unit Charge Level Low" },
4498 { 0x018A, "C Battery Backup Unit Charge Level OK" },
4499 { 0x0193, "C Installation Aborted" },
4500 { 0x0195, "C Battery Backup Unit Physically Removed" },
4501 { 0x0196, "C Memory Error During Warm Boot" },
4502 { 0x019E, "C Memory Soft ECC Error Corrected" },
4503 { 0x019F, "C Memory Hard ECC Error Corrected" },
4504 { 0x01A2, "C Battery Backup Unit Failed" },
4505 { 0x01AB, "C Mirror Race Recovery Failed" },
4506 { 0x01AC, "C Mirror Race on Critical Drive" },
4507
4508 { 0x0380, "C Internal Controller Hung" },
4509 { 0x0381, "C Internal Controller Firmware Breakpoint" },
4510 { 0x0390, "C Internal Controller i960 Processor Specific Error" },
4511 { 0x03A0, "C Internal Controller StrongARM Processor Specific Error" },
4512 { 0, "" } };
4513 int EventListIndex = 0, EventCode;
4514 unsigned char EventType, *EventMessage;
4515 if (Event->EventCode == 0x1C &&
4516 RequestSense->SenseKey == DAC960_SenseKey_VendorSpecific &&
4517 (RequestSense->AdditionalSenseCode == 0x80 ||
4518 RequestSense->AdditionalSenseCode == 0x81))
4519 Event->EventCode = ((RequestSense->AdditionalSenseCode - 0x80) << 8) |
4520 RequestSense->AdditionalSenseCodeQualifier;
4521 while (true)
4522 {
4523 EventCode = EventList[EventListIndex].EventCode;
4524 if (EventCode == Event->EventCode || EventCode == 0) break;
4525 EventListIndex++;
4526 }
4527 EventType = EventList[EventListIndex].EventMessage[0];
4528 EventMessage = &EventList[EventListIndex].EventMessage[2];
4529 if (EventCode == 0)
4530 {
4531 DAC960_Critical("Unknown Controller Event Code %04X\n",
4532 Controller, Event->EventCode);
4533 return;
4534 }
4535 switch (EventType)
4536 {
4537 case 'P':
4538 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4539 Event->Channel, Event->TargetID, EventMessage);
4540 break;
4541 case 'L':
4542 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4543 Event->LogicalUnit, Controller->ControllerNumber,
4544 Event->LogicalUnit, EventMessage);
4545 break;
4546 case 'M':
4547 DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) %s\n", Controller,
4548 Event->LogicalUnit, Controller->ControllerNumber,
4549 Event->LogicalUnit, EventMessage);
4550 break;
4551 case 'S':
4552 if (RequestSense->SenseKey == DAC960_SenseKey_NoSense ||
4553 (RequestSense->SenseKey == DAC960_SenseKey_NotReady &&
4554 RequestSense->AdditionalSenseCode == 0x04 &&
4555 (RequestSense->AdditionalSenseCodeQualifier == 0x01 ||
4556 RequestSense->AdditionalSenseCodeQualifier == 0x02)))
4557 break;
4558 DAC960_Critical("Physical Device %d:%d %s\n", Controller,
4559 Event->Channel, Event->TargetID, EventMessage);
4560 DAC960_Critical("Physical Device %d:%d Request Sense: "
4561 "Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
4562 Controller,
4563 Event->Channel,
4564 Event->TargetID,
4565 RequestSense->SenseKey,
4566 RequestSense->AdditionalSenseCode,
4567 RequestSense->AdditionalSenseCodeQualifier);
4568 DAC960_Critical("Physical Device %d:%d Request Sense: "
4569 "Information = %02X%02X%02X%02X "
4570 "%02X%02X%02X%02X\n",
4571 Controller,
4572 Event->Channel,
4573 Event->TargetID,
4574 RequestSense->Information[0],
4575 RequestSense->Information[1],
4576 RequestSense->Information[2],
4577 RequestSense->Information[3],
4578 RequestSense->CommandSpecificInformation[0],
4579 RequestSense->CommandSpecificInformation[1],
4580 RequestSense->CommandSpecificInformation[2],
4581 RequestSense->CommandSpecificInformation[3]);
4582 break;
4583 case 'E':
4584 if (Controller->SuppressEnclosureMessages) break;
4585 sprintf(MessageBuffer, EventMessage, Event->LogicalUnit);
4586 DAC960_Critical("Enclosure %d %s\n", Controller,
4587 Event->TargetID, MessageBuffer);
4588 break;
4589 case 'C':
4590 DAC960_Critical("Controller %s\n", Controller, EventMessage);
4591 break;
4592 default:
4593 DAC960_Critical("Unknown Controller Event Code %04X\n",
4594 Controller, Event->EventCode);
4595 break;
4596 }
4597}
4598
4599
4600
4601
4602
4603
4604
4605static void DAC960_V2_ReportProgress(DAC960_Controller_T *Controller,
4606 unsigned char *MessageString,
4607 unsigned int LogicalDeviceNumber,
4608 unsigned long BlocksCompleted,
4609 unsigned long LogicalDeviceSize)
4610{
4611 Controller->EphemeralProgressMessage = true;
4612 DAC960_Progress("%s in Progress: Logical Drive %d (/dev/rd/c%dd%d) "
4613 "%d%% completed\n", Controller,
4614 MessageString,
4615 LogicalDeviceNumber,
4616 Controller->ControllerNumber,
4617 LogicalDeviceNumber,
4618 (100 * (BlocksCompleted >> 7)) / (LogicalDeviceSize >> 7));
4619 Controller->EphemeralProgressMessage = false;
4620}
4621
4622
4623
4624
4625
4626
4627
4628static void DAC960_V2_ProcessCompletedCommand(DAC960_Command_T *Command)
4629{
4630 DAC960_Controller_T *Controller = Command->Controller;
4631 DAC960_CommandType_T CommandType = Command->CommandType;
4632 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
4633 DAC960_V2_IOCTL_Opcode_T IOCTLOpcode = CommandMailbox->Common.IOCTL_Opcode;
4634 DAC960_V2_CommandOpcode_T CommandOpcode = CommandMailbox->SCSI_10.CommandOpcode;
4635 DAC960_V2_CommandStatus_T CommandStatus = Command->V2.CommandStatus;
4636
4637 if (CommandType == DAC960_ReadCommand ||
4638 CommandType == DAC960_WriteCommand)
4639 {
4640
4641#ifdef FORCE_RETRY_DEBUG
4642 CommandStatus = DAC960_V2_AbormalCompletion;
4643#endif
4644 Command->V2.RequestSense->SenseKey = DAC960_SenseKey_MediumError;
4645
4646 if (CommandStatus == DAC960_V2_NormalCompletion) {
4647
4648 if (!DAC960_ProcessCompletedRequest(Command, true))
4649 BUG();
4650
4651 } else if (Command->V2.RequestSense->SenseKey == DAC960_SenseKey_MediumError)
4652 {
4653
4654
4655
4656
4657 DAC960_queue_partial_rw(Command);
4658 return;
4659 }
4660 else
4661 {
4662 if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4663 DAC960_V2_ReadWriteError(Command);
4664
4665
4666
4667 (void)DAC960_ProcessCompletedRequest(Command, false);
4668 }
4669 }
4670 else if (CommandType == DAC960_ReadRetryCommand ||
4671 CommandType == DAC960_WriteRetryCommand)
4672 {
4673 bool normal_completion;
4674
4675#ifdef FORCE_RETRY_FAILURE_DEBUG
4676 static int retry_count = 1;
4677#endif
4678
4679
4680
4681
4682 normal_completion = true;
4683 if (CommandStatus != DAC960_V2_NormalCompletion) {
4684 normal_completion = false;
4685 if (Command->V2.RequestSense->SenseKey != DAC960_SenseKey_NotReady)
4686 DAC960_V2_ReadWriteError(Command);
4687 }
4688
4689#ifdef FORCE_RETRY_FAILURE_DEBUG
4690 if (!(++retry_count % 10000)) {
4691 printk("V2 error retry failure test\n");
4692 normal_completion = false;
4693 DAC960_V2_ReadWriteError(Command);
4694 }
4695#endif
4696
4697 if (!DAC960_ProcessCompletedRequest(Command, normal_completion)) {
4698 DAC960_queue_partial_rw(Command);
4699 return;
4700 }
4701 }
4702 else if (CommandType == DAC960_MonitoringCommand)
4703 {
4704 if (Controller->ShutdownMonitoringTimer)
4705 return;
4706 if (IOCTLOpcode == DAC960_V2_GetControllerInfo)
4707 {
4708 DAC960_V2_ControllerInfo_T *NewControllerInfo =
4709 Controller->V2.NewControllerInformation;
4710 DAC960_V2_ControllerInfo_T *ControllerInfo =
4711 &Controller->V2.ControllerInformation;
4712 Controller->LogicalDriveCount =
4713 NewControllerInfo->LogicalDevicesPresent;
4714 Controller->V2.NeedLogicalDeviceInformation = true;
4715 Controller->V2.NeedPhysicalDeviceInformation = true;
4716 Controller->V2.StartLogicalDeviceInformationScan = true;
4717 Controller->V2.StartPhysicalDeviceInformationScan = true;
4718 Controller->MonitoringAlertMode =
4719 (NewControllerInfo->LogicalDevicesCritical > 0 ||
4720 NewControllerInfo->LogicalDevicesOffline > 0 ||
4721 NewControllerInfo->PhysicalDisksCritical > 0 ||
4722 NewControllerInfo->PhysicalDisksOffline > 0);
4723 memcpy(ControllerInfo, NewControllerInfo,
4724 sizeof(DAC960_V2_ControllerInfo_T));
4725 }
4726 else if (IOCTLOpcode == DAC960_V2_GetEvent)
4727 {
4728 if (CommandStatus == DAC960_V2_NormalCompletion) {
4729 DAC960_V2_ReportEvent(Controller, Controller->V2.Event);
4730 }
4731 Controller->V2.NextEventSequenceNumber++;
4732 }
4733 else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid &&
4734 CommandStatus == DAC960_V2_NormalCompletion)
4735 {
4736 DAC960_V2_PhysicalDeviceInfo_T *NewPhysicalDeviceInfo =
4737 Controller->V2.NewPhysicalDeviceInformation;
4738 unsigned int PhysicalDeviceIndex = Controller->V2.PhysicalDeviceIndex;
4739 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
4740 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
4741 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4742 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
4743 unsigned int DeviceIndex;
4744 while (PhysicalDeviceInfo != NULL &&
4745 (NewPhysicalDeviceInfo->Channel >
4746 PhysicalDeviceInfo->Channel ||
4747 (NewPhysicalDeviceInfo->Channel ==
4748 PhysicalDeviceInfo->Channel &&
4749 (NewPhysicalDeviceInfo->TargetID >
4750 PhysicalDeviceInfo->TargetID ||
4751 (NewPhysicalDeviceInfo->TargetID ==
4752 PhysicalDeviceInfo->TargetID &&
4753 NewPhysicalDeviceInfo->LogicalUnit >
4754 PhysicalDeviceInfo->LogicalUnit)))))
4755 {
4756 DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4757 Controller,
4758 PhysicalDeviceInfo->Channel,
4759 PhysicalDeviceInfo->TargetID);
4760 Controller->V2.PhysicalDeviceInformation
4761 [PhysicalDeviceIndex] = NULL;
4762 Controller->V2.InquiryUnitSerialNumber
4763 [PhysicalDeviceIndex] = NULL;
4764 kfree(PhysicalDeviceInfo);
4765 kfree(InquiryUnitSerialNumber);
4766 for (DeviceIndex = PhysicalDeviceIndex;
4767 DeviceIndex < DAC960_V2_MaxPhysicalDevices - 1;
4768 DeviceIndex++)
4769 {
4770 Controller->V2.PhysicalDeviceInformation[DeviceIndex] =
4771 Controller->V2.PhysicalDeviceInformation[DeviceIndex+1];
4772 Controller->V2.InquiryUnitSerialNumber[DeviceIndex] =
4773 Controller->V2.InquiryUnitSerialNumber[DeviceIndex+1];
4774 }
4775 Controller->V2.PhysicalDeviceInformation
4776 [DAC960_V2_MaxPhysicalDevices-1] = NULL;
4777 Controller->V2.InquiryUnitSerialNumber
4778 [DAC960_V2_MaxPhysicalDevices-1] = NULL;
4779 PhysicalDeviceInfo =
4780 Controller->V2.PhysicalDeviceInformation[PhysicalDeviceIndex];
4781 InquiryUnitSerialNumber =
4782 Controller->V2.InquiryUnitSerialNumber[PhysicalDeviceIndex];
4783 }
4784 if (PhysicalDeviceInfo == NULL ||
4785 (NewPhysicalDeviceInfo->Channel !=
4786 PhysicalDeviceInfo->Channel) ||
4787 (NewPhysicalDeviceInfo->TargetID !=
4788 PhysicalDeviceInfo->TargetID) ||
4789 (NewPhysicalDeviceInfo->LogicalUnit !=
4790 PhysicalDeviceInfo->LogicalUnit))
4791 {
4792 PhysicalDeviceInfo =
4793 kmalloc(sizeof(DAC960_V2_PhysicalDeviceInfo_T), GFP_ATOMIC);
4794 InquiryUnitSerialNumber =
4795 kmalloc(sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T),
4796 GFP_ATOMIC);
4797 if (InquiryUnitSerialNumber == NULL ||
4798 PhysicalDeviceInfo == NULL)
4799 {
4800 kfree(InquiryUnitSerialNumber);
4801 InquiryUnitSerialNumber = NULL;
4802 kfree(PhysicalDeviceInfo);
4803 PhysicalDeviceInfo = NULL;
4804 }
4805 DAC960_Critical("Physical Device %d:%d Now Exists%s\n",
4806 Controller,
4807 NewPhysicalDeviceInfo->Channel,
4808 NewPhysicalDeviceInfo->TargetID,
4809 (PhysicalDeviceInfo != NULL
4810 ? "" : " - Allocation Failed"));
4811 if (PhysicalDeviceInfo != NULL)
4812 {
4813 memset(PhysicalDeviceInfo, 0,
4814 sizeof(DAC960_V2_PhysicalDeviceInfo_T));
4815 PhysicalDeviceInfo->PhysicalDeviceState =
4816 DAC960_V2_Device_InvalidState;
4817 memset(InquiryUnitSerialNumber, 0,
4818 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
4819 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
4820 for (DeviceIndex = DAC960_V2_MaxPhysicalDevices - 1;
4821 DeviceIndex > PhysicalDeviceIndex;
4822 DeviceIndex--)
4823 {
4824 Controller->V2.PhysicalDeviceInformation[DeviceIndex] =
4825 Controller->V2.PhysicalDeviceInformation[DeviceIndex-1];
4826 Controller->V2.InquiryUnitSerialNumber[DeviceIndex] =
4827 Controller->V2.InquiryUnitSerialNumber[DeviceIndex-1];
4828 }
4829 Controller->V2.PhysicalDeviceInformation
4830 [PhysicalDeviceIndex] =
4831 PhysicalDeviceInfo;
4832 Controller->V2.InquiryUnitSerialNumber
4833 [PhysicalDeviceIndex] =
4834 InquiryUnitSerialNumber;
4835 Controller->V2.NeedDeviceSerialNumberInformation = true;
4836 }
4837 }
4838 if (PhysicalDeviceInfo != NULL)
4839 {
4840 if (NewPhysicalDeviceInfo->PhysicalDeviceState !=
4841 PhysicalDeviceInfo->PhysicalDeviceState)
4842 DAC960_Critical(
4843 "Physical Device %d:%d is now %s\n", Controller,
4844 NewPhysicalDeviceInfo->Channel,
4845 NewPhysicalDeviceInfo->TargetID,
4846 (NewPhysicalDeviceInfo->PhysicalDeviceState
4847 == DAC960_V2_Device_Online
4848 ? "ONLINE"
4849 : NewPhysicalDeviceInfo->PhysicalDeviceState
4850 == DAC960_V2_Device_Rebuild
4851 ? "REBUILD"
4852 : NewPhysicalDeviceInfo->PhysicalDeviceState
4853 == DAC960_V2_Device_Missing
4854 ? "MISSING"
4855 : NewPhysicalDeviceInfo->PhysicalDeviceState
4856 == DAC960_V2_Device_Critical
4857 ? "CRITICAL"
4858 : NewPhysicalDeviceInfo->PhysicalDeviceState
4859 == DAC960_V2_Device_Dead
4860 ? "DEAD"
4861 : NewPhysicalDeviceInfo->PhysicalDeviceState
4862 == DAC960_V2_Device_SuspectedDead
4863 ? "SUSPECTED-DEAD"
4864 : NewPhysicalDeviceInfo->PhysicalDeviceState
4865 == DAC960_V2_Device_CommandedOffline
4866 ? "COMMANDED-OFFLINE"
4867 : NewPhysicalDeviceInfo->PhysicalDeviceState
4868 == DAC960_V2_Device_Standby
4869 ? "STANDBY" : "UNKNOWN"));
4870 if ((NewPhysicalDeviceInfo->ParityErrors !=
4871 PhysicalDeviceInfo->ParityErrors) ||
4872 (NewPhysicalDeviceInfo->SoftErrors !=
4873 PhysicalDeviceInfo->SoftErrors) ||
4874 (NewPhysicalDeviceInfo->HardErrors !=
4875 PhysicalDeviceInfo->HardErrors) ||
4876 (NewPhysicalDeviceInfo->MiscellaneousErrors !=
4877 PhysicalDeviceInfo->MiscellaneousErrors) ||
4878 (NewPhysicalDeviceInfo->CommandTimeouts !=
4879 PhysicalDeviceInfo->CommandTimeouts) ||
4880 (NewPhysicalDeviceInfo->Retries !=
4881 PhysicalDeviceInfo->Retries) ||
4882 (NewPhysicalDeviceInfo->Aborts !=
4883 PhysicalDeviceInfo->Aborts) ||
4884 (NewPhysicalDeviceInfo->PredictedFailuresDetected !=
4885 PhysicalDeviceInfo->PredictedFailuresDetected))
4886 {
4887 DAC960_Critical("Physical Device %d:%d Errors: "
4888 "Parity = %d, Soft = %d, "
4889 "Hard = %d, Misc = %d\n",
4890 Controller,
4891 NewPhysicalDeviceInfo->Channel,
4892 NewPhysicalDeviceInfo->TargetID,
4893 NewPhysicalDeviceInfo->ParityErrors,
4894 NewPhysicalDeviceInfo->SoftErrors,
4895 NewPhysicalDeviceInfo->HardErrors,
4896 NewPhysicalDeviceInfo->MiscellaneousErrors);
4897 DAC960_Critical("Physical Device %d:%d Errors: "
4898 "Timeouts = %d, Retries = %d, "
4899 "Aborts = %d, Predicted = %d\n",
4900 Controller,
4901 NewPhysicalDeviceInfo->Channel,
4902 NewPhysicalDeviceInfo->TargetID,
4903 NewPhysicalDeviceInfo->CommandTimeouts,
4904 NewPhysicalDeviceInfo->Retries,
4905 NewPhysicalDeviceInfo->Aborts,
4906 NewPhysicalDeviceInfo
4907 ->PredictedFailuresDetected);
4908 }
4909 if ((PhysicalDeviceInfo->PhysicalDeviceState
4910 == DAC960_V2_Device_Dead ||
4911 PhysicalDeviceInfo->PhysicalDeviceState
4912 == DAC960_V2_Device_InvalidState) &&
4913 NewPhysicalDeviceInfo->PhysicalDeviceState
4914 != DAC960_V2_Device_Dead)
4915 Controller->V2.NeedDeviceSerialNumberInformation = true;
4916 memcpy(PhysicalDeviceInfo, NewPhysicalDeviceInfo,
4917 sizeof(DAC960_V2_PhysicalDeviceInfo_T));
4918 }
4919 NewPhysicalDeviceInfo->LogicalUnit++;
4920 Controller->V2.PhysicalDeviceIndex++;
4921 }
4922 else if (IOCTLOpcode == DAC960_V2_GetPhysicalDeviceInfoValid)
4923 {
4924 unsigned int DeviceIndex;
4925 for (DeviceIndex = Controller->V2.PhysicalDeviceIndex;
4926 DeviceIndex < DAC960_V2_MaxPhysicalDevices;
4927 DeviceIndex++)
4928 {
4929 DAC960_V2_PhysicalDeviceInfo_T *PhysicalDeviceInfo =
4930 Controller->V2.PhysicalDeviceInformation[DeviceIndex];
4931 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
4932 Controller->V2.InquiryUnitSerialNumber[DeviceIndex];
4933 if (PhysicalDeviceInfo == NULL) break;
4934 DAC960_Critical("Physical Device %d:%d No Longer Exists\n",
4935 Controller,
4936 PhysicalDeviceInfo->Channel,
4937 PhysicalDeviceInfo->TargetID);
4938 Controller->V2.PhysicalDeviceInformation[DeviceIndex] = NULL;
4939 Controller->V2.InquiryUnitSerialNumber[DeviceIndex] = NULL;
4940 kfree(PhysicalDeviceInfo);
4941 kfree(InquiryUnitSerialNumber);
4942 }
4943 Controller->V2.NeedPhysicalDeviceInformation = false;
4944 }
4945 else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid &&
4946 CommandStatus == DAC960_V2_NormalCompletion)
4947 {
4948 DAC960_V2_LogicalDeviceInfo_T *NewLogicalDeviceInfo =
4949 Controller->V2.NewLogicalDeviceInformation;
4950 unsigned short LogicalDeviceNumber =
4951 NewLogicalDeviceInfo->LogicalDeviceNumber;
4952 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
4953 Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber];
4954 if (LogicalDeviceInfo == NULL)
4955 {
4956 DAC960_V2_PhysicalDevice_T PhysicalDevice;
4957 PhysicalDevice.Controller = 0;
4958 PhysicalDevice.Channel = NewLogicalDeviceInfo->Channel;
4959 PhysicalDevice.TargetID = NewLogicalDeviceInfo->TargetID;
4960 PhysicalDevice.LogicalUnit = NewLogicalDeviceInfo->LogicalUnit;
4961 Controller->V2.LogicalDriveToVirtualDevice[LogicalDeviceNumber] =
4962 PhysicalDevice;
4963 LogicalDeviceInfo = kmalloc(sizeof(DAC960_V2_LogicalDeviceInfo_T),
4964 GFP_ATOMIC);
4965 Controller->V2.LogicalDeviceInformation[LogicalDeviceNumber] =
4966 LogicalDeviceInfo;
4967 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4968 "Now Exists%s\n", Controller,
4969 LogicalDeviceNumber,
4970 Controller->ControllerNumber,
4971 LogicalDeviceNumber,
4972 (LogicalDeviceInfo != NULL
4973 ? "" : " - Allocation Failed"));
4974 if (LogicalDeviceInfo != NULL)
4975 {
4976 memset(LogicalDeviceInfo, 0,
4977 sizeof(DAC960_V2_LogicalDeviceInfo_T));
4978 DAC960_ComputeGenericDiskInfo(Controller);
4979 }
4980 }
4981 if (LogicalDeviceInfo != NULL)
4982 {
4983 unsigned long LogicalDeviceSize =
4984 NewLogicalDeviceInfo->ConfigurableDeviceSize;
4985 if (NewLogicalDeviceInfo->LogicalDeviceState !=
4986 LogicalDeviceInfo->LogicalDeviceState)
4987 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
4988 "is now %s\n", Controller,
4989 LogicalDeviceNumber,
4990 Controller->ControllerNumber,
4991 LogicalDeviceNumber,
4992 (NewLogicalDeviceInfo->LogicalDeviceState
4993 == DAC960_V2_LogicalDevice_Online
4994 ? "ONLINE"
4995 : NewLogicalDeviceInfo->LogicalDeviceState
4996 == DAC960_V2_LogicalDevice_Critical
4997 ? "CRITICAL" : "OFFLINE"));
4998 if ((NewLogicalDeviceInfo->SoftErrors !=
4999 LogicalDeviceInfo->SoftErrors) ||
5000 (NewLogicalDeviceInfo->CommandsFailed !=
5001 LogicalDeviceInfo->CommandsFailed) ||
5002 (NewLogicalDeviceInfo->DeferredWriteErrors !=
5003 LogicalDeviceInfo->DeferredWriteErrors))
5004 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) Errors: "
5005 "Soft = %d, Failed = %d, Deferred Write = %d\n",
5006 Controller, LogicalDeviceNumber,
5007 Controller->ControllerNumber,
5008 LogicalDeviceNumber,
5009 NewLogicalDeviceInfo->SoftErrors,
5010 NewLogicalDeviceInfo->CommandsFailed,
5011 NewLogicalDeviceInfo->DeferredWriteErrors);
5012 if (NewLogicalDeviceInfo->ConsistencyCheckInProgress)
5013 DAC960_V2_ReportProgress(Controller,
5014 "Consistency Check",
5015 LogicalDeviceNumber,
5016 NewLogicalDeviceInfo
5017 ->ConsistencyCheckBlockNumber,
5018 LogicalDeviceSize);
5019 else if (NewLogicalDeviceInfo->RebuildInProgress)
5020 DAC960_V2_ReportProgress(Controller,
5021 "Rebuild",
5022 LogicalDeviceNumber,
5023 NewLogicalDeviceInfo
5024 ->RebuildBlockNumber,
5025 LogicalDeviceSize);
5026 else if (NewLogicalDeviceInfo->BackgroundInitializationInProgress)
5027 DAC960_V2_ReportProgress(Controller,
5028 "Background Initialization",
5029 LogicalDeviceNumber,
5030 NewLogicalDeviceInfo
5031 ->BackgroundInitializationBlockNumber,
5032 LogicalDeviceSize);
5033 else if (NewLogicalDeviceInfo->ForegroundInitializationInProgress)
5034 DAC960_V2_ReportProgress(Controller,
5035 "Foreground Initialization",
5036 LogicalDeviceNumber,
5037 NewLogicalDeviceInfo
5038 ->ForegroundInitializationBlockNumber,
5039 LogicalDeviceSize);
5040 else if (NewLogicalDeviceInfo->DataMigrationInProgress)
5041 DAC960_V2_ReportProgress(Controller,
5042 "Data Migration",
5043 LogicalDeviceNumber,
5044 NewLogicalDeviceInfo
5045 ->DataMigrationBlockNumber,
5046 LogicalDeviceSize);
5047 else if (NewLogicalDeviceInfo->PatrolOperationInProgress)
5048 DAC960_V2_ReportProgress(Controller,
5049 "Patrol Operation",
5050 LogicalDeviceNumber,
5051 NewLogicalDeviceInfo
5052 ->PatrolOperationBlockNumber,
5053 LogicalDeviceSize);
5054 if (LogicalDeviceInfo->BackgroundInitializationInProgress &&
5055 !NewLogicalDeviceInfo->BackgroundInitializationInProgress)
5056 DAC960_Progress("Logical Drive %d (/dev/rd/c%dd%d) "
5057 "Background Initialization %s\n",
5058 Controller,
5059 LogicalDeviceNumber,
5060 Controller->ControllerNumber,
5061 LogicalDeviceNumber,
5062 (NewLogicalDeviceInfo->LogicalDeviceControl
5063 .LogicalDeviceInitialized
5064 ? "Completed" : "Failed"));
5065 memcpy(LogicalDeviceInfo, NewLogicalDeviceInfo,
5066 sizeof(DAC960_V2_LogicalDeviceInfo_T));
5067 }
5068 Controller->V2.LogicalDriveFoundDuringScan
5069 [LogicalDeviceNumber] = true;
5070 NewLogicalDeviceInfo->LogicalDeviceNumber++;
5071 }
5072 else if (IOCTLOpcode == DAC960_V2_GetLogicalDeviceInfoValid)
5073 {
5074 int LogicalDriveNumber;
5075 for (LogicalDriveNumber = 0;
5076 LogicalDriveNumber < DAC960_MaxLogicalDrives;
5077 LogicalDriveNumber++)
5078 {
5079 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
5080 Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
5081 if (LogicalDeviceInfo == NULL ||
5082 Controller->V2.LogicalDriveFoundDuringScan
5083 [LogicalDriveNumber])
5084 continue;
5085 DAC960_Critical("Logical Drive %d (/dev/rd/c%dd%d) "
5086 "No Longer Exists\n", Controller,
5087 LogicalDriveNumber,
5088 Controller->ControllerNumber,
5089 LogicalDriveNumber);
5090 Controller->V2.LogicalDeviceInformation
5091 [LogicalDriveNumber] = NULL;
5092 kfree(LogicalDeviceInfo);
5093 Controller->LogicalDriveInitiallyAccessible
5094 [LogicalDriveNumber] = false;
5095 DAC960_ComputeGenericDiskInfo(Controller);
5096 }
5097 Controller->V2.NeedLogicalDeviceInformation = false;
5098 }
5099 else if (CommandOpcode == DAC960_V2_SCSI_10_Passthru)
5100 {
5101 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
5102 Controller->V2.InquiryUnitSerialNumber[Controller->V2.PhysicalDeviceIndex - 1];
5103
5104 if (CommandStatus != DAC960_V2_NormalCompletion) {
5105 memset(InquiryUnitSerialNumber,
5106 0, sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
5107 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
5108 } else
5109 memcpy(InquiryUnitSerialNumber,
5110 Controller->V2.NewInquiryUnitSerialNumber,
5111 sizeof(DAC960_SCSI_Inquiry_UnitSerialNumber_T));
5112
5113 Controller->V2.NeedDeviceSerialNumberInformation = false;
5114 }
5115
5116 if (Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
5117 - Controller->V2.NextEventSequenceNumber > 0)
5118 {
5119 CommandMailbox->GetEvent.CommandOpcode = DAC960_V2_IOCTL;
5120 CommandMailbox->GetEvent.DataTransferSize = sizeof(DAC960_V2_Event_T);
5121 CommandMailbox->GetEvent.EventSequenceNumberHigh16 =
5122 Controller->V2.NextEventSequenceNumber >> 16;
5123 CommandMailbox->GetEvent.ControllerNumber = 0;
5124 CommandMailbox->GetEvent.IOCTL_Opcode =
5125 DAC960_V2_GetEvent;
5126 CommandMailbox->GetEvent.EventSequenceNumberLow16 =
5127 Controller->V2.NextEventSequenceNumber & 0xFFFF;
5128 CommandMailbox->GetEvent.DataTransferMemoryAddress
5129 .ScatterGatherSegments[0]
5130 .SegmentDataPointer =
5131 Controller->V2.EventDMA;
5132 CommandMailbox->GetEvent.DataTransferMemoryAddress
5133 .ScatterGatherSegments[0]
5134 .SegmentByteCount =
5135 CommandMailbox->GetEvent.DataTransferSize;
5136 DAC960_QueueCommand(Command);
5137 return;
5138 }
5139 if (Controller->V2.NeedPhysicalDeviceInformation)
5140 {
5141 if (Controller->V2.NeedDeviceSerialNumberInformation)
5142 {
5143 DAC960_SCSI_Inquiry_UnitSerialNumber_T *InquiryUnitSerialNumber =
5144 Controller->V2.NewInquiryUnitSerialNumber;
5145 InquiryUnitSerialNumber->PeripheralDeviceType = 0x1F;
5146
5147 DAC960_V2_ConstructNewUnitSerialNumber(Controller, CommandMailbox,
5148 Controller->V2.NewPhysicalDeviceInformation->Channel,
5149 Controller->V2.NewPhysicalDeviceInformation->TargetID,
5150 Controller->V2.NewPhysicalDeviceInformation->LogicalUnit - 1);
5151
5152
5153 DAC960_QueueCommand(Command);
5154 return;
5155 }
5156 if (Controller->V2.StartPhysicalDeviceInformationScan)
5157 {
5158 Controller->V2.PhysicalDeviceIndex = 0;
5159 Controller->V2.NewPhysicalDeviceInformation->Channel = 0;
5160 Controller->V2.NewPhysicalDeviceInformation->TargetID = 0;
5161 Controller->V2.NewPhysicalDeviceInformation->LogicalUnit = 0;
5162 Controller->V2.StartPhysicalDeviceInformationScan = false;
5163 }
5164 CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
5165 CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
5166 sizeof(DAC960_V2_PhysicalDeviceInfo_T);
5167 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.LogicalUnit =
5168 Controller->V2.NewPhysicalDeviceInformation->LogicalUnit;
5169 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID =
5170 Controller->V2.NewPhysicalDeviceInformation->TargetID;
5171 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel =
5172 Controller->V2.NewPhysicalDeviceInformation->Channel;
5173 CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
5174 DAC960_V2_GetPhysicalDeviceInfoValid;
5175 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
5176 .ScatterGatherSegments[0]
5177 .SegmentDataPointer =
5178 Controller->V2.NewPhysicalDeviceInformationDMA;
5179 CommandMailbox->PhysicalDeviceInfo.DataTransferMemoryAddress
5180 .ScatterGatherSegments[0]
5181 .SegmentByteCount =
5182 CommandMailbox->PhysicalDeviceInfo.DataTransferSize;
5183 DAC960_QueueCommand(Command);
5184 return;
5185 }
5186 if (Controller->V2.NeedLogicalDeviceInformation)
5187 {
5188 if (Controller->V2.StartLogicalDeviceInformationScan)
5189 {
5190 int LogicalDriveNumber;
5191 for (LogicalDriveNumber = 0;
5192 LogicalDriveNumber < DAC960_MaxLogicalDrives;
5193 LogicalDriveNumber++)
5194 Controller->V2.LogicalDriveFoundDuringScan
5195 [LogicalDriveNumber] = false;
5196 Controller->V2.NewLogicalDeviceInformation->LogicalDeviceNumber = 0;
5197 Controller->V2.StartLogicalDeviceInformationScan = false;
5198 }
5199 CommandMailbox->LogicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
5200 CommandMailbox->LogicalDeviceInfo.DataTransferSize =
5201 sizeof(DAC960_V2_LogicalDeviceInfo_T);
5202 CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
5203 Controller->V2.NewLogicalDeviceInformation->LogicalDeviceNumber;
5204 CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
5205 DAC960_V2_GetLogicalDeviceInfoValid;
5206 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
5207 .ScatterGatherSegments[0]
5208 .SegmentDataPointer =
5209 Controller->V2.NewLogicalDeviceInformationDMA;
5210 CommandMailbox->LogicalDeviceInfo.DataTransferMemoryAddress
5211 .ScatterGatherSegments[0]
5212 .SegmentByteCount =
5213 CommandMailbox->LogicalDeviceInfo.DataTransferSize;
5214 DAC960_QueueCommand(Command);
5215 return;
5216 }
5217 Controller->MonitoringTimerCount++;
5218 Controller->MonitoringTimer.expires =
5219 jiffies + DAC960_HealthStatusMonitoringInterval;
5220 add_timer(&Controller->MonitoringTimer);
5221 }
5222 if (CommandType == DAC960_ImmediateCommand)
5223 {
5224 complete(Command->Completion);
5225 Command->Completion = NULL;
5226 return;
5227 }
5228 if (CommandType == DAC960_QueuedCommand)
5229 {
5230 DAC960_V2_KernelCommand_T *KernelCommand = Command->V2.KernelCommand;
5231 KernelCommand->CommandStatus = CommandStatus;
5232 KernelCommand->RequestSenseLength = Command->V2.RequestSenseLength;
5233 KernelCommand->DataTransferLength = Command->V2.DataTransferResidue;
5234 Command->V2.KernelCommand = NULL;
5235 DAC960_DeallocateCommand(Command);
5236 KernelCommand->CompletionFunction(KernelCommand);
5237 return;
5238 }
5239
5240
5241
5242
5243
5244 if (Controller->MonitoringCommandDeferred)
5245 {
5246 Controller->MonitoringCommandDeferred = false;
5247 DAC960_V2_QueueMonitoringCommand(Command);
5248 return;
5249 }
5250
5251
5252
5253 DAC960_DeallocateCommand(Command);
5254
5255
5256
5257 wake_up(&Controller->CommandWaitQueue);
5258}
5259
5260
5261
5262
5263
5264
5265static irqreturn_t DAC960_GEM_InterruptHandler(int IRQ_Channel,
5266 void *DeviceIdentifier)
5267{
5268 DAC960_Controller_T *Controller = DeviceIdentifier;
5269 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5270 DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5271 unsigned long flags;
5272
5273 spin_lock_irqsave(&Controller->queue_lock, flags);
5274 DAC960_GEM_AcknowledgeInterrupt(ControllerBaseAddress);
5275 NextStatusMailbox = Controller->V2.NextStatusMailbox;
5276 while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5277 {
5278 DAC960_V2_CommandIdentifier_T CommandIdentifier =
5279 NextStatusMailbox->Fields.CommandIdentifier;
5280 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5281 Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5282 Command->V2.RequestSenseLength =
5283 NextStatusMailbox->Fields.RequestSenseLength;
5284 Command->V2.DataTransferResidue =
5285 NextStatusMailbox->Fields.DataTransferResidue;
5286 NextStatusMailbox->Words[0] = 0;
5287 if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5288 NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5289 DAC960_V2_ProcessCompletedCommand(Command);
5290 }
5291 Controller->V2.NextStatusMailbox = NextStatusMailbox;
5292
5293
5294
5295
5296 DAC960_ProcessRequest(Controller);
5297 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5298 return IRQ_HANDLED;
5299}
5300
5301
5302
5303
5304
5305
5306static irqreturn_t DAC960_BA_InterruptHandler(int IRQ_Channel,
5307 void *DeviceIdentifier)
5308{
5309 DAC960_Controller_T *Controller = DeviceIdentifier;
5310 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5311 DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5312 unsigned long flags;
5313
5314 spin_lock_irqsave(&Controller->queue_lock, flags);
5315 DAC960_BA_AcknowledgeInterrupt(ControllerBaseAddress);
5316 NextStatusMailbox = Controller->V2.NextStatusMailbox;
5317 while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5318 {
5319 DAC960_V2_CommandIdentifier_T CommandIdentifier =
5320 NextStatusMailbox->Fields.CommandIdentifier;
5321 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5322 Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5323 Command->V2.RequestSenseLength =
5324 NextStatusMailbox->Fields.RequestSenseLength;
5325 Command->V2.DataTransferResidue =
5326 NextStatusMailbox->Fields.DataTransferResidue;
5327 NextStatusMailbox->Words[0] = 0;
5328 if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5329 NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5330 DAC960_V2_ProcessCompletedCommand(Command);
5331 }
5332 Controller->V2.NextStatusMailbox = NextStatusMailbox;
5333
5334
5335
5336
5337 DAC960_ProcessRequest(Controller);
5338 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5339 return IRQ_HANDLED;
5340}
5341
5342
5343
5344
5345
5346
5347
5348static irqreturn_t DAC960_LP_InterruptHandler(int IRQ_Channel,
5349 void *DeviceIdentifier)
5350{
5351 DAC960_Controller_T *Controller = DeviceIdentifier;
5352 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5353 DAC960_V2_StatusMailbox_T *NextStatusMailbox;
5354 unsigned long flags;
5355
5356 spin_lock_irqsave(&Controller->queue_lock, flags);
5357 DAC960_LP_AcknowledgeInterrupt(ControllerBaseAddress);
5358 NextStatusMailbox = Controller->V2.NextStatusMailbox;
5359 while (NextStatusMailbox->Fields.CommandIdentifier > 0)
5360 {
5361 DAC960_V2_CommandIdentifier_T CommandIdentifier =
5362 NextStatusMailbox->Fields.CommandIdentifier;
5363 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5364 Command->V2.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5365 Command->V2.RequestSenseLength =
5366 NextStatusMailbox->Fields.RequestSenseLength;
5367 Command->V2.DataTransferResidue =
5368 NextStatusMailbox->Fields.DataTransferResidue;
5369 NextStatusMailbox->Words[0] = 0;
5370 if (++NextStatusMailbox > Controller->V2.LastStatusMailbox)
5371 NextStatusMailbox = Controller->V2.FirstStatusMailbox;
5372 DAC960_V2_ProcessCompletedCommand(Command);
5373 }
5374 Controller->V2.NextStatusMailbox = NextStatusMailbox;
5375
5376
5377
5378
5379 DAC960_ProcessRequest(Controller);
5380 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5381 return IRQ_HANDLED;
5382}
5383
5384
5385
5386
5387
5388
5389
5390static irqreturn_t DAC960_LA_InterruptHandler(int IRQ_Channel,
5391 void *DeviceIdentifier)
5392{
5393 DAC960_Controller_T *Controller = DeviceIdentifier;
5394 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5395 DAC960_V1_StatusMailbox_T *NextStatusMailbox;
5396 unsigned long flags;
5397
5398 spin_lock_irqsave(&Controller->queue_lock, flags);
5399 DAC960_LA_AcknowledgeInterrupt(ControllerBaseAddress);
5400 NextStatusMailbox = Controller->V1.NextStatusMailbox;
5401 while (NextStatusMailbox->Fields.Valid)
5402 {
5403 DAC960_V1_CommandIdentifier_T CommandIdentifier =
5404 NextStatusMailbox->Fields.CommandIdentifier;
5405 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5406 Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5407 NextStatusMailbox->Word = 0;
5408 if (++NextStatusMailbox > Controller->V1.LastStatusMailbox)
5409 NextStatusMailbox = Controller->V1.FirstStatusMailbox;
5410 DAC960_V1_ProcessCompletedCommand(Command);
5411 }
5412 Controller->V1.NextStatusMailbox = NextStatusMailbox;
5413
5414
5415
5416
5417 DAC960_ProcessRequest(Controller);
5418 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5419 return IRQ_HANDLED;
5420}
5421
5422
5423
5424
5425
5426
5427
5428static irqreturn_t DAC960_PG_InterruptHandler(int IRQ_Channel,
5429 void *DeviceIdentifier)
5430{
5431 DAC960_Controller_T *Controller = DeviceIdentifier;
5432 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5433 DAC960_V1_StatusMailbox_T *NextStatusMailbox;
5434 unsigned long flags;
5435
5436 spin_lock_irqsave(&Controller->queue_lock, flags);
5437 DAC960_PG_AcknowledgeInterrupt(ControllerBaseAddress);
5438 NextStatusMailbox = Controller->V1.NextStatusMailbox;
5439 while (NextStatusMailbox->Fields.Valid)
5440 {
5441 DAC960_V1_CommandIdentifier_T CommandIdentifier =
5442 NextStatusMailbox->Fields.CommandIdentifier;
5443 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5444 Command->V1.CommandStatus = NextStatusMailbox->Fields.CommandStatus;
5445 NextStatusMailbox->Word = 0;
5446 if (++NextStatusMailbox > Controller->V1.LastStatusMailbox)
5447 NextStatusMailbox = Controller->V1.FirstStatusMailbox;
5448 DAC960_V1_ProcessCompletedCommand(Command);
5449 }
5450 Controller->V1.NextStatusMailbox = NextStatusMailbox;
5451
5452
5453
5454
5455 DAC960_ProcessRequest(Controller);
5456 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5457 return IRQ_HANDLED;
5458}
5459
5460
5461
5462
5463
5464
5465
5466static irqreturn_t DAC960_PD_InterruptHandler(int IRQ_Channel,
5467 void *DeviceIdentifier)
5468{
5469 DAC960_Controller_T *Controller = DeviceIdentifier;
5470 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5471 unsigned long flags;
5472
5473 spin_lock_irqsave(&Controller->queue_lock, flags);
5474 while (DAC960_PD_StatusAvailableP(ControllerBaseAddress))
5475 {
5476 DAC960_V1_CommandIdentifier_T CommandIdentifier =
5477 DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress);
5478 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5479 Command->V1.CommandStatus =
5480 DAC960_PD_ReadStatusRegister(ControllerBaseAddress);
5481 DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress);
5482 DAC960_PD_AcknowledgeStatus(ControllerBaseAddress);
5483 DAC960_V1_ProcessCompletedCommand(Command);
5484 }
5485
5486
5487
5488
5489 DAC960_ProcessRequest(Controller);
5490 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5491 return IRQ_HANDLED;
5492}
5493
5494
5495
5496
5497
5498
5499
5500
5501
5502
5503
5504static irqreturn_t DAC960_P_InterruptHandler(int IRQ_Channel,
5505 void *DeviceIdentifier)
5506{
5507 DAC960_Controller_T *Controller = DeviceIdentifier;
5508 void __iomem *ControllerBaseAddress = Controller->BaseAddress;
5509 unsigned long flags;
5510
5511 spin_lock_irqsave(&Controller->queue_lock, flags);
5512 while (DAC960_PD_StatusAvailableP(ControllerBaseAddress))
5513 {
5514 DAC960_V1_CommandIdentifier_T CommandIdentifier =
5515 DAC960_PD_ReadStatusCommandIdentifier(ControllerBaseAddress);
5516 DAC960_Command_T *Command = Controller->Commands[CommandIdentifier-1];
5517 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5518 DAC960_V1_CommandOpcode_T CommandOpcode =
5519 CommandMailbox->Common.CommandOpcode;
5520 Command->V1.CommandStatus =
5521 DAC960_PD_ReadStatusRegister(ControllerBaseAddress);
5522 DAC960_PD_AcknowledgeInterrupt(ControllerBaseAddress);
5523 DAC960_PD_AcknowledgeStatus(ControllerBaseAddress);
5524 switch (CommandOpcode)
5525 {
5526 case DAC960_V1_Enquiry_Old:
5527 Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Enquiry;
5528 DAC960_P_To_PD_TranslateEnquiry(Controller->V1.NewEnquiry);
5529 break;
5530 case DAC960_V1_GetDeviceState_Old:
5531 Command->V1.CommandMailbox.Common.CommandOpcode =
5532 DAC960_V1_GetDeviceState;
5533 DAC960_P_To_PD_TranslateDeviceState(Controller->V1.NewDeviceState);
5534 break;
5535 case DAC960_V1_Read_Old:
5536 Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Read;
5537 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5538 break;
5539 case DAC960_V1_Write_Old:
5540 Command->V1.CommandMailbox.Common.CommandOpcode = DAC960_V1_Write;
5541 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5542 break;
5543 case DAC960_V1_ReadWithScatterGather_Old:
5544 Command->V1.CommandMailbox.Common.CommandOpcode =
5545 DAC960_V1_ReadWithScatterGather;
5546 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5547 break;
5548 case DAC960_V1_WriteWithScatterGather_Old:
5549 Command->V1.CommandMailbox.Common.CommandOpcode =
5550 DAC960_V1_WriteWithScatterGather;
5551 DAC960_P_To_PD_TranslateReadWriteCommand(CommandMailbox);
5552 break;
5553 default:
5554 break;
5555 }
5556 DAC960_V1_ProcessCompletedCommand(Command);
5557 }
5558
5559
5560
5561
5562 DAC960_ProcessRequest(Controller);
5563 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5564 return IRQ_HANDLED;
5565}
5566
5567
5568
5569
5570
5571
5572
5573static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *Command)
5574{
5575 DAC960_Controller_T *Controller = Command->Controller;
5576 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5577 DAC960_V1_ClearCommand(Command);
5578 Command->CommandType = DAC960_MonitoringCommand;
5579 CommandMailbox->Type3.CommandOpcode = DAC960_V1_Enquiry;
5580 CommandMailbox->Type3.BusAddress = Controller->V1.NewEnquiryDMA;
5581 DAC960_QueueCommand(Command);
5582}
5583
5584
5585
5586
5587
5588
5589
5590static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *Command)
5591{
5592 DAC960_Controller_T *Controller = Command->Controller;
5593 DAC960_V2_CommandMailbox_T *CommandMailbox = &Command->V2.CommandMailbox;
5594 DAC960_V2_ClearCommand(Command);
5595 Command->CommandType = DAC960_MonitoringCommand;
5596 CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
5597 CommandMailbox->ControllerInfo.CommandControlBits
5598 .DataTransferControllerToHost = true;
5599 CommandMailbox->ControllerInfo.CommandControlBits
5600 .NoAutoRequestSense = true;
5601 CommandMailbox->ControllerInfo.DataTransferSize =
5602 sizeof(DAC960_V2_ControllerInfo_T);
5603 CommandMailbox->ControllerInfo.ControllerNumber = 0;
5604 CommandMailbox->ControllerInfo.IOCTL_Opcode = DAC960_V2_GetControllerInfo;
5605 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
5606 .ScatterGatherSegments[0]
5607 .SegmentDataPointer =
5608 Controller->V2.NewControllerInformationDMA;
5609 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
5610 .ScatterGatherSegments[0]
5611 .SegmentByteCount =
5612 CommandMailbox->ControllerInfo.DataTransferSize;
5613 DAC960_QueueCommand(Command);
5614}
5615
5616
5617
5618
5619
5620
5621
5622static void DAC960_MonitoringTimerFunction(struct timer_list *t)
5623{
5624 DAC960_Controller_T *Controller = from_timer(Controller, t, MonitoringTimer);
5625 DAC960_Command_T *Command;
5626 unsigned long flags;
5627
5628 if (Controller->FirmwareType == DAC960_V1_Controller)
5629 {
5630 spin_lock_irqsave(&Controller->queue_lock, flags);
5631
5632
5633
5634 Command = DAC960_AllocateCommand(Controller);
5635 if (Command != NULL)
5636 DAC960_V1_QueueMonitoringCommand(Command);
5637 else Controller->MonitoringCommandDeferred = true;
5638 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5639 }
5640 else
5641 {
5642 DAC960_V2_ControllerInfo_T *ControllerInfo =
5643 &Controller->V2.ControllerInformation;
5644 unsigned int StatusChangeCounter =
5645 Controller->V2.HealthStatusBuffer->StatusChangeCounter;
5646 bool ForceMonitoringCommand = false;
5647 if (time_after(jiffies, Controller->SecondaryMonitoringTime
5648 + DAC960_SecondaryMonitoringInterval))
5649 {
5650 int LogicalDriveNumber;
5651 for (LogicalDriveNumber = 0;
5652 LogicalDriveNumber < DAC960_MaxLogicalDrives;
5653 LogicalDriveNumber++)
5654 {
5655 DAC960_V2_LogicalDeviceInfo_T *LogicalDeviceInfo =
5656 Controller->V2.LogicalDeviceInformation[LogicalDriveNumber];
5657 if (LogicalDeviceInfo == NULL) continue;
5658 if (!LogicalDeviceInfo->LogicalDeviceControl
5659 .LogicalDeviceInitialized)
5660 {
5661 ForceMonitoringCommand = true;
5662 break;
5663 }
5664 }
5665 Controller->SecondaryMonitoringTime = jiffies;
5666 }
5667 if (StatusChangeCounter == Controller->V2.StatusChangeCounter &&
5668 Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
5669 == Controller->V2.NextEventSequenceNumber &&
5670 (ControllerInfo->BackgroundInitializationsActive +
5671 ControllerInfo->LogicalDeviceInitializationsActive +
5672 ControllerInfo->PhysicalDeviceInitializationsActive +
5673 ControllerInfo->ConsistencyChecksActive +
5674 ControllerInfo->RebuildsActive +
5675 ControllerInfo->OnlineExpansionsActive == 0 ||
5676 time_before(jiffies, Controller->PrimaryMonitoringTime
5677 + DAC960_MonitoringTimerInterval)) &&
5678 !ForceMonitoringCommand)
5679 {
5680 Controller->MonitoringTimer.expires =
5681 jiffies + DAC960_HealthStatusMonitoringInterval;
5682 add_timer(&Controller->MonitoringTimer);
5683 return;
5684 }
5685 Controller->V2.StatusChangeCounter = StatusChangeCounter;
5686 Controller->PrimaryMonitoringTime = jiffies;
5687
5688 spin_lock_irqsave(&Controller->queue_lock, flags);
5689
5690
5691
5692 Command = DAC960_AllocateCommand(Controller);
5693 if (Command != NULL)
5694 DAC960_V2_QueueMonitoringCommand(Command);
5695 else Controller->MonitoringCommandDeferred = true;
5696 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5697
5698
5699
5700 wake_up(&Controller->HealthStatusWaitQueue);
5701 }
5702}
5703
5704
5705
5706
5707
5708
5709
5710static bool DAC960_CheckStatusBuffer(DAC960_Controller_T *Controller,
5711 unsigned int ByteCount)
5712{
5713 unsigned char *NewStatusBuffer;
5714 if (Controller->InitialStatusLength + 1 +
5715 Controller->CurrentStatusLength + ByteCount + 1 <=
5716 Controller->CombinedStatusBufferLength)
5717 return true;
5718 if (Controller->CombinedStatusBufferLength == 0)
5719 {
5720 unsigned int NewStatusBufferLength = DAC960_InitialStatusBufferSize;
5721 while (NewStatusBufferLength < ByteCount)
5722 NewStatusBufferLength *= 2;
5723 Controller->CombinedStatusBuffer = kmalloc(NewStatusBufferLength,
5724 GFP_ATOMIC);
5725 if (Controller->CombinedStatusBuffer == NULL) return false;
5726 Controller->CombinedStatusBufferLength = NewStatusBufferLength;
5727 return true;
5728 }
5729 NewStatusBuffer = kmalloc_array(2, Controller->CombinedStatusBufferLength,
5730 GFP_ATOMIC);
5731 if (NewStatusBuffer == NULL)
5732 {
5733 DAC960_Warning("Unable to expand Combined Status Buffer - Truncating\n",
5734 Controller);
5735 return false;
5736 }
5737 memcpy(NewStatusBuffer, Controller->CombinedStatusBuffer,
5738 Controller->CombinedStatusBufferLength);
5739 kfree(Controller->CombinedStatusBuffer);
5740 Controller->CombinedStatusBuffer = NewStatusBuffer;
5741 Controller->CombinedStatusBufferLength *= 2;
5742 Controller->CurrentStatusBuffer =
5743 &NewStatusBuffer[Controller->InitialStatusLength + 1];
5744 return true;
5745}
5746
5747
5748
5749
5750
5751
5752static void DAC960_Message(DAC960_MessageLevel_T MessageLevel,
5753 unsigned char *Format,
5754 DAC960_Controller_T *Controller,
5755 ...)
5756{
5757 static unsigned char Buffer[DAC960_LineBufferSize];
5758 static bool BeginningOfLine = true;
5759 va_list Arguments;
5760 int Length = 0;
5761 va_start(Arguments, Controller);
5762 Length = vsprintf(Buffer, Format, Arguments);
5763 va_end(Arguments);
5764 if (Controller == NULL)
5765 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5766 DAC960_ControllerCount, Buffer);
5767 else if (MessageLevel == DAC960_AnnounceLevel ||
5768 MessageLevel == DAC960_InfoLevel)
5769 {
5770 if (!Controller->ControllerInitialized)
5771 {
5772 if (DAC960_CheckStatusBuffer(Controller, Length))
5773 {
5774 strcpy(&Controller->CombinedStatusBuffer
5775 [Controller->InitialStatusLength],
5776 Buffer);
5777 Controller->InitialStatusLength += Length;
5778 Controller->CurrentStatusBuffer =
5779 &Controller->CombinedStatusBuffer
5780 [Controller->InitialStatusLength + 1];
5781 }
5782 if (MessageLevel == DAC960_AnnounceLevel)
5783 {
5784 static int AnnouncementLines = 0;
5785 if (++AnnouncementLines <= 2)
5786 printk("%sDAC960: %s", DAC960_MessageLevelMap[MessageLevel],
5787 Buffer);
5788 }
5789 else
5790 {
5791 if (BeginningOfLine)
5792 {
5793 if (Buffer[0] != '\n' || Length > 1)
5794 printk("%sDAC960#%d: %s",
5795 DAC960_MessageLevelMap[MessageLevel],
5796 Controller->ControllerNumber, Buffer);
5797 }
5798 else printk("%s", Buffer);
5799 }
5800 }
5801 else if (DAC960_CheckStatusBuffer(Controller, Length))
5802 {
5803 strcpy(&Controller->CurrentStatusBuffer[
5804 Controller->CurrentStatusLength], Buffer);
5805 Controller->CurrentStatusLength += Length;
5806 }
5807 }
5808 else if (MessageLevel == DAC960_ProgressLevel)
5809 {
5810 strcpy(Controller->ProgressBuffer, Buffer);
5811 Controller->ProgressBufferLength = Length;
5812 if (Controller->EphemeralProgressMessage)
5813 {
5814 if (time_after_eq(jiffies, Controller->LastProgressReportTime
5815 + DAC960_ProgressReportingInterval))
5816 {
5817 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5818 Controller->ControllerNumber, Buffer);
5819 Controller->LastProgressReportTime = jiffies;
5820 }
5821 }
5822 else printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5823 Controller->ControllerNumber, Buffer);
5824 }
5825 else if (MessageLevel == DAC960_UserCriticalLevel)
5826 {
5827 strcpy(&Controller->UserStatusBuffer[Controller->UserStatusLength],
5828 Buffer);
5829 Controller->UserStatusLength += Length;
5830 if (Buffer[0] != '\n' || Length > 1)
5831 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5832 Controller->ControllerNumber, Buffer);
5833 }
5834 else
5835 {
5836 if (BeginningOfLine)
5837 printk("%sDAC960#%d: %s", DAC960_MessageLevelMap[MessageLevel],
5838 Controller->ControllerNumber, Buffer);
5839 else printk("%s", Buffer);
5840 }
5841 BeginningOfLine = (Buffer[Length-1] == '\n');
5842}
5843
5844
5845
5846
5847
5848
5849
5850
5851static bool DAC960_ParsePhysicalDevice(DAC960_Controller_T *Controller,
5852 char *UserCommandString,
5853 unsigned char *Channel,
5854 unsigned char *TargetID)
5855{
5856 char *NewUserCommandString = UserCommandString;
5857 unsigned long XChannel, XTargetID;
5858 while (*UserCommandString == ' ') UserCommandString++;
5859 if (UserCommandString == NewUserCommandString)
5860 return false;
5861 XChannel = simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5862 if (NewUserCommandString == UserCommandString ||
5863 *NewUserCommandString != ':' ||
5864 XChannel >= Controller->Channels)
5865 return false;
5866 UserCommandString = ++NewUserCommandString;
5867 XTargetID = simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5868 if (NewUserCommandString == UserCommandString ||
5869 *NewUserCommandString != '\0' ||
5870 XTargetID >= Controller->Targets)
5871 return false;
5872 *Channel = XChannel;
5873 *TargetID = XTargetID;
5874 return true;
5875}
5876
5877
5878
5879
5880
5881
5882
5883
5884static bool DAC960_ParseLogicalDrive(DAC960_Controller_T *Controller,
5885 char *UserCommandString,
5886 unsigned char *LogicalDriveNumber)
5887{
5888 char *NewUserCommandString = UserCommandString;
5889 unsigned long XLogicalDriveNumber;
5890 while (*UserCommandString == ' ') UserCommandString++;
5891 if (UserCommandString == NewUserCommandString)
5892 return false;
5893 XLogicalDriveNumber =
5894 simple_strtoul(UserCommandString, &NewUserCommandString, 10);
5895 if (NewUserCommandString == UserCommandString ||
5896 *NewUserCommandString != '\0' ||
5897 XLogicalDriveNumber > DAC960_MaxLogicalDrives - 1)
5898 return false;
5899 *LogicalDriveNumber = XLogicalDriveNumber;
5900 return true;
5901}
5902
5903
5904
5905
5906
5907
5908
5909static void DAC960_V1_SetDeviceState(DAC960_Controller_T *Controller,
5910 DAC960_Command_T *Command,
5911 unsigned char Channel,
5912 unsigned char TargetID,
5913 DAC960_V1_PhysicalDeviceState_T
5914 DeviceState,
5915 const unsigned char *DeviceStateString)
5916{
5917 DAC960_V1_CommandMailbox_T *CommandMailbox = &Command->V1.CommandMailbox;
5918 CommandMailbox->Type3D.CommandOpcode = DAC960_V1_StartDevice;
5919 CommandMailbox->Type3D.Channel = Channel;
5920 CommandMailbox->Type3D.TargetID = TargetID;
5921 CommandMailbox->Type3D.DeviceState = DeviceState;
5922 CommandMailbox->Type3D.Modifier = 0;
5923 DAC960_ExecuteCommand(Command);
5924 switch (Command->V1.CommandStatus)
5925 {
5926 case DAC960_V1_NormalCompletion:
5927 DAC960_UserCritical("%s of Physical Device %d:%d Succeeded\n", Controller,
5928 DeviceStateString, Channel, TargetID);
5929 break;
5930 case DAC960_V1_UnableToStartDevice:
5931 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5932 "Unable to Start Device\n", Controller,
5933 DeviceStateString, Channel, TargetID);
5934 break;
5935 case DAC960_V1_NoDeviceAtAddress:
5936 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5937 "No Device at Address\n", Controller,
5938 DeviceStateString, Channel, TargetID);
5939 break;
5940 case DAC960_V1_InvalidChannelOrTargetOrModifier:
5941 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5942 "Invalid Channel or Target or Modifier\n",
5943 Controller, DeviceStateString, Channel, TargetID);
5944 break;
5945 case DAC960_V1_ChannelBusy:
5946 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5947 "Channel Busy\n", Controller,
5948 DeviceStateString, Channel, TargetID);
5949 break;
5950 default:
5951 DAC960_UserCritical("%s of Physical Device %d:%d Failed - "
5952 "Unexpected Status %04X\n", Controller,
5953 DeviceStateString, Channel, TargetID,
5954 Command->V1.CommandStatus);
5955 break;
5956 }
5957}
5958
5959
5960
5961
5962
5963
5964
5965static bool DAC960_V1_ExecuteUserCommand(DAC960_Controller_T *Controller,
5966 unsigned char *UserCommand)
5967{
5968 DAC960_Command_T *Command;
5969 DAC960_V1_CommandMailbox_T *CommandMailbox;
5970 unsigned long flags;
5971 unsigned char Channel, TargetID, LogicalDriveNumber;
5972
5973 spin_lock_irqsave(&Controller->queue_lock, flags);
5974 while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
5975 DAC960_WaitForCommand(Controller);
5976 spin_unlock_irqrestore(&Controller->queue_lock, flags);
5977 Controller->UserStatusLength = 0;
5978 DAC960_V1_ClearCommand(Command);
5979 Command->CommandType = DAC960_ImmediateCommand;
5980 CommandMailbox = &Command->V1.CommandMailbox;
5981 if (strcmp(UserCommand, "flush-cache") == 0)
5982 {
5983 CommandMailbox->Type3.CommandOpcode = DAC960_V1_Flush;
5984 DAC960_ExecuteCommand(Command);
5985 DAC960_UserCritical("Cache Flush Completed\n", Controller);
5986 }
5987 else if (strncmp(UserCommand, "kill", 4) == 0 &&
5988 DAC960_ParsePhysicalDevice(Controller, &UserCommand[4],
5989 &Channel, &TargetID))
5990 {
5991 DAC960_V1_DeviceState_T *DeviceState =
5992 &Controller->V1.DeviceState[Channel][TargetID];
5993 if (DeviceState->Present &&
5994 DeviceState->DeviceType == DAC960_V1_DiskType &&
5995 DeviceState->DeviceState != DAC960_V1_Device_Dead)
5996 DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
5997 DAC960_V1_Device_Dead, "Kill");
5998 else DAC960_UserCritical("Kill of Physical Device %d:%d Illegal\n",
5999 Controller, Channel, TargetID);
6000 }
6001 else if (strncmp(UserCommand, "make-online", 11) == 0 &&
6002 DAC960_ParsePhysicalDevice(Controller, &UserCommand[11],
6003 &Channel, &TargetID))
6004 {
6005 DAC960_V1_DeviceState_T *DeviceState =
6006 &Controller->V1.DeviceState[Channel][TargetID];
6007 if (DeviceState->Present &&
6008 DeviceState->DeviceType == DAC960_V1_DiskType &&
6009 DeviceState->DeviceState == DAC960_V1_Device_Dead)
6010 DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
6011 DAC960_V1_Device_Online, "Make Online");
6012 else DAC960_UserCritical("Make Online of Physical Device %d:%d Illegal\n",
6013 Controller, Channel, TargetID);
6014
6015 }
6016 else if (strncmp(UserCommand, "make-standby", 12) == 0 &&
6017 DAC960_ParsePhysicalDevice(Controller, &UserCommand[12],
6018 &Channel, &TargetID))
6019 {
6020 DAC960_V1_DeviceState_T *DeviceState =
6021 &Controller->V1.DeviceState[Channel][TargetID];
6022 if (DeviceState->Present &&
6023 DeviceState->DeviceType == DAC960_V1_DiskType &&
6024 DeviceState->DeviceState == DAC960_V1_Device_Dead)
6025 DAC960_V1_SetDeviceState(Controller, Command, Channel, TargetID,
6026 DAC960_V1_Device_Standby, "Make Standby");
6027 else DAC960_UserCritical("Make Standby of Physical "
6028 "Device %d:%d Illegal\n",
6029 Controller, Channel, TargetID);
6030 }
6031 else if (strncmp(UserCommand, "rebuild", 7) == 0 &&
6032 DAC960_ParsePhysicalDevice(Controller, &UserCommand[7],
6033 &Channel, &TargetID))
6034 {
6035 CommandMailbox->Type3D.CommandOpcode = DAC960_V1_RebuildAsync;
6036 CommandMailbox->Type3D.Channel = Channel;
6037 CommandMailbox->Type3D.TargetID = TargetID;
6038 DAC960_ExecuteCommand(Command);
6039 switch (Command->V1.CommandStatus)
6040 {
6041 case DAC960_V1_NormalCompletion:
6042 DAC960_UserCritical("Rebuild of Physical Device %d:%d Initiated\n",
6043 Controller, Channel, TargetID);
6044 break;
6045 case DAC960_V1_AttemptToRebuildOnlineDrive:
6046 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6047 "Attempt to Rebuild Online or "
6048 "Unresponsive Drive\n",
6049 Controller, Channel, TargetID);
6050 break;
6051 case DAC960_V1_NewDiskFailedDuringRebuild:
6052 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6053 "New Disk Failed During Rebuild\n",
6054 Controller, Channel, TargetID);
6055 break;
6056 case DAC960_V1_InvalidDeviceAddress:
6057 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6058 "Invalid Device Address\n",
6059 Controller, Channel, TargetID);
6060 break;
6061 case DAC960_V1_RebuildOrCheckAlreadyInProgress:
6062 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6063 "Rebuild or Consistency Check Already "
6064 "in Progress\n", Controller, Channel, TargetID);
6065 break;
6066 default:
6067 DAC960_UserCritical("Rebuild of Physical Device %d:%d Failed - "
6068 "Unexpected Status %04X\n", Controller,
6069 Channel, TargetID, Command->V1.CommandStatus);
6070 break;
6071 }
6072 }
6073 else if (strncmp(UserCommand, "check-consistency", 17) == 0 &&
6074 DAC960_ParseLogicalDrive(Controller, &UserCommand[17],
6075 &LogicalDriveNumber))
6076 {
6077 CommandMailbox->Type3C.CommandOpcode = DAC960_V1_CheckConsistencyAsync;
6078 CommandMailbox->Type3C.LogicalDriveNumber = LogicalDriveNumber;
6079 CommandMailbox->Type3C.AutoRestore = true;
6080 DAC960_ExecuteCommand(Command);
6081 switch (Command->V1.CommandStatus)
6082 {
6083 case DAC960_V1_NormalCompletion:
6084 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6085 "(/dev/rd/c%dd%d) Initiated\n",
6086 Controller, LogicalDriveNumber,
6087 Controller->ControllerNumber,
6088 LogicalDriveNumber);
6089 break;
6090 case DAC960_V1_DependentDiskIsDead:
6091 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6092 "(/dev/rd/c%dd%d) Failed - "
6093 "Dependent Physical Device is DEAD\n",
6094 Controller, LogicalDriveNumber,
6095 Controller->ControllerNumber,
6096 LogicalDriveNumber);
6097 break;
6098 case DAC960_V1_InvalidOrNonredundantLogicalDrive:
6099 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6100 "(/dev/rd/c%dd%d) Failed - "
6101 "Invalid or Nonredundant Logical Drive\n",
6102 Controller, LogicalDriveNumber,
6103 Controller->ControllerNumber,
6104 LogicalDriveNumber);
6105 break;
6106 case DAC960_V1_RebuildOrCheckAlreadyInProgress:
6107 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6108 "(/dev/rd/c%dd%d) Failed - Rebuild or "
6109 "Consistency Check Already in Progress\n",
6110 Controller, LogicalDriveNumber,
6111 Controller->ControllerNumber,
6112 LogicalDriveNumber);
6113 break;
6114 default:
6115 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6116 "(/dev/rd/c%dd%d) Failed - "
6117 "Unexpected Status %04X\n",
6118 Controller, LogicalDriveNumber,
6119 Controller->ControllerNumber,
6120 LogicalDriveNumber, Command->V1.CommandStatus);
6121 break;
6122 }
6123 }
6124 else if (strcmp(UserCommand, "cancel-rebuild") == 0 ||
6125 strcmp(UserCommand, "cancel-consistency-check") == 0)
6126 {
6127
6128
6129
6130
6131 unsigned char *OldRebuildRateConstant;
6132 dma_addr_t OldRebuildRateConstantDMA;
6133
6134 OldRebuildRateConstant = pci_alloc_consistent( Controller->PCIDevice,
6135 sizeof(char), &OldRebuildRateConstantDMA);
6136 if (OldRebuildRateConstant == NULL) {
6137 DAC960_UserCritical("Cancellation of Rebuild or "
6138 "Consistency Check Failed - "
6139 "Out of Memory",
6140 Controller);
6141 goto failure;
6142 }
6143 CommandMailbox->Type3R.CommandOpcode = DAC960_V1_RebuildControl;
6144 CommandMailbox->Type3R.RebuildRateConstant = 0xFF;
6145 CommandMailbox->Type3R.BusAddress = OldRebuildRateConstantDMA;
6146 DAC960_ExecuteCommand(Command);
6147 switch (Command->V1.CommandStatus)
6148 {
6149 case DAC960_V1_NormalCompletion:
6150 DAC960_UserCritical("Rebuild or Consistency Check Cancelled\n",
6151 Controller);
6152 break;
6153 default:
6154 DAC960_UserCritical("Cancellation of Rebuild or "
6155 "Consistency Check Failed - "
6156 "Unexpected Status %04X\n",
6157 Controller, Command->V1.CommandStatus);
6158 break;
6159 }
6160failure:
6161 pci_free_consistent(Controller->PCIDevice, sizeof(char),
6162 OldRebuildRateConstant, OldRebuildRateConstantDMA);
6163 }
6164 else DAC960_UserCritical("Illegal User Command: '%s'\n",
6165 Controller, UserCommand);
6166
6167 spin_lock_irqsave(&Controller->queue_lock, flags);
6168 DAC960_DeallocateCommand(Command);
6169 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6170 return true;
6171}
6172
6173
6174
6175
6176
6177
6178
6179
6180static bool DAC960_V2_TranslatePhysicalDevice(DAC960_Command_T *Command,
6181 unsigned char Channel,
6182 unsigned char TargetID,
6183 unsigned short
6184 *LogicalDeviceNumber)
6185{
6186 DAC960_V2_CommandMailbox_T SavedCommandMailbox, *CommandMailbox;
6187 DAC960_Controller_T *Controller = Command->Controller;
6188
6189 CommandMailbox = &Command->V2.CommandMailbox;
6190 memcpy(&SavedCommandMailbox, CommandMailbox,
6191 sizeof(DAC960_V2_CommandMailbox_T));
6192
6193 CommandMailbox->PhysicalDeviceInfo.CommandOpcode = DAC960_V2_IOCTL;
6194 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
6195 .DataTransferControllerToHost = true;
6196 CommandMailbox->PhysicalDeviceInfo.CommandControlBits
6197 .NoAutoRequestSense = true;
6198 CommandMailbox->PhysicalDeviceInfo.DataTransferSize =
6199 sizeof(DAC960_V2_PhysicalToLogicalDevice_T);
6200 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.TargetID = TargetID;
6201 CommandMailbox->PhysicalDeviceInfo.PhysicalDevice.Channel = Channel;
6202 CommandMailbox->PhysicalDeviceInfo.IOCTL_Opcode =
6203 DAC960_V2_TranslatePhysicalToLogicalDevice;
6204 CommandMailbox->Common.DataTransferMemoryAddress
6205 .ScatterGatherSegments[0]
6206 .SegmentDataPointer =
6207 Controller->V2.PhysicalToLogicalDeviceDMA;
6208 CommandMailbox->Common.DataTransferMemoryAddress
6209 .ScatterGatherSegments[0]
6210 .SegmentByteCount =
6211 CommandMailbox->Common.DataTransferSize;
6212
6213 DAC960_ExecuteCommand(Command);
6214 *LogicalDeviceNumber = Controller->V2.PhysicalToLogicalDevice->LogicalDeviceNumber;
6215
6216 memcpy(CommandMailbox, &SavedCommandMailbox,
6217 sizeof(DAC960_V2_CommandMailbox_T));
6218 return (Command->V2.CommandStatus == DAC960_V2_NormalCompletion);
6219}
6220
6221
6222
6223
6224
6225
6226
6227static bool DAC960_V2_ExecuteUserCommand(DAC960_Controller_T *Controller,
6228 unsigned char *UserCommand)
6229{
6230 DAC960_Command_T *Command;
6231 DAC960_V2_CommandMailbox_T *CommandMailbox;
6232 unsigned long flags;
6233 unsigned char Channel, TargetID, LogicalDriveNumber;
6234 unsigned short LogicalDeviceNumber;
6235
6236 spin_lock_irqsave(&Controller->queue_lock, flags);
6237 while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6238 DAC960_WaitForCommand(Controller);
6239 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6240 Controller->UserStatusLength = 0;
6241 DAC960_V2_ClearCommand(Command);
6242 Command->CommandType = DAC960_ImmediateCommand;
6243 CommandMailbox = &Command->V2.CommandMailbox;
6244 CommandMailbox->Common.CommandOpcode = DAC960_V2_IOCTL;
6245 CommandMailbox->Common.CommandControlBits.DataTransferControllerToHost = true;
6246 CommandMailbox->Common.CommandControlBits.NoAutoRequestSense = true;
6247 if (strcmp(UserCommand, "flush-cache") == 0)
6248 {
6249 CommandMailbox->DeviceOperation.IOCTL_Opcode = DAC960_V2_PauseDevice;
6250 CommandMailbox->DeviceOperation.OperationDevice =
6251 DAC960_V2_RAID_Controller;
6252 DAC960_ExecuteCommand(Command);
6253 DAC960_UserCritical("Cache Flush Completed\n", Controller);
6254 }
6255 else if (strncmp(UserCommand, "kill", 4) == 0 &&
6256 DAC960_ParsePhysicalDevice(Controller, &UserCommand[4],
6257 &Channel, &TargetID) &&
6258 DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6259 &LogicalDeviceNumber))
6260 {
6261 CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6262 LogicalDeviceNumber;
6263 CommandMailbox->SetDeviceState.IOCTL_Opcode =
6264 DAC960_V2_SetDeviceState;
6265 CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6266 DAC960_V2_Device_Dead;
6267 DAC960_ExecuteCommand(Command);
6268 DAC960_UserCritical("Kill of Physical Device %d:%d %s\n",
6269 Controller, Channel, TargetID,
6270 (Command->V2.CommandStatus
6271 == DAC960_V2_NormalCompletion
6272 ? "Succeeded" : "Failed"));
6273 }
6274 else if (strncmp(UserCommand, "make-online", 11) == 0 &&
6275 DAC960_ParsePhysicalDevice(Controller, &UserCommand[11],
6276 &Channel, &TargetID) &&
6277 DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6278 &LogicalDeviceNumber))
6279 {
6280 CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6281 LogicalDeviceNumber;
6282 CommandMailbox->SetDeviceState.IOCTL_Opcode =
6283 DAC960_V2_SetDeviceState;
6284 CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6285 DAC960_V2_Device_Online;
6286 DAC960_ExecuteCommand(Command);
6287 DAC960_UserCritical("Make Online of Physical Device %d:%d %s\n",
6288 Controller, Channel, TargetID,
6289 (Command->V2.CommandStatus
6290 == DAC960_V2_NormalCompletion
6291 ? "Succeeded" : "Failed"));
6292 }
6293 else if (strncmp(UserCommand, "make-standby", 12) == 0 &&
6294 DAC960_ParsePhysicalDevice(Controller, &UserCommand[12],
6295 &Channel, &TargetID) &&
6296 DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6297 &LogicalDeviceNumber))
6298 {
6299 CommandMailbox->SetDeviceState.LogicalDevice.LogicalDeviceNumber =
6300 LogicalDeviceNumber;
6301 CommandMailbox->SetDeviceState.IOCTL_Opcode =
6302 DAC960_V2_SetDeviceState;
6303 CommandMailbox->SetDeviceState.DeviceState.PhysicalDeviceState =
6304 DAC960_V2_Device_Standby;
6305 DAC960_ExecuteCommand(Command);
6306 DAC960_UserCritical("Make Standby of Physical Device %d:%d %s\n",
6307 Controller, Channel, TargetID,
6308 (Command->V2.CommandStatus
6309 == DAC960_V2_NormalCompletion
6310 ? "Succeeded" : "Failed"));
6311 }
6312 else if (strncmp(UserCommand, "rebuild", 7) == 0 &&
6313 DAC960_ParsePhysicalDevice(Controller, &UserCommand[7],
6314 &Channel, &TargetID) &&
6315 DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6316 &LogicalDeviceNumber))
6317 {
6318 CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
6319 LogicalDeviceNumber;
6320 CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
6321 DAC960_V2_RebuildDeviceStart;
6322 DAC960_ExecuteCommand(Command);
6323 DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6324 Controller, Channel, TargetID,
6325 (Command->V2.CommandStatus
6326 == DAC960_V2_NormalCompletion
6327 ? "Initiated" : "Not Initiated"));
6328 }
6329 else if (strncmp(UserCommand, "cancel-rebuild", 14) == 0 &&
6330 DAC960_ParsePhysicalDevice(Controller, &UserCommand[14],
6331 &Channel, &TargetID) &&
6332 DAC960_V2_TranslatePhysicalDevice(Command, Channel, TargetID,
6333 &LogicalDeviceNumber))
6334 {
6335 CommandMailbox->LogicalDeviceInfo.LogicalDevice.LogicalDeviceNumber =
6336 LogicalDeviceNumber;
6337 CommandMailbox->LogicalDeviceInfo.IOCTL_Opcode =
6338 DAC960_V2_RebuildDeviceStop;
6339 DAC960_ExecuteCommand(Command);
6340 DAC960_UserCritical("Rebuild of Physical Device %d:%d %s\n",
6341 Controller, Channel, TargetID,
6342 (Command->V2.CommandStatus
6343 == DAC960_V2_NormalCompletion
6344 ? "Cancelled" : "Not Cancelled"));
6345 }
6346 else if (strncmp(UserCommand, "check-consistency", 17) == 0 &&
6347 DAC960_ParseLogicalDrive(Controller, &UserCommand[17],
6348 &LogicalDriveNumber))
6349 {
6350 CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber =
6351 LogicalDriveNumber;
6352 CommandMailbox->ConsistencyCheck.IOCTL_Opcode =
6353 DAC960_V2_ConsistencyCheckStart;
6354 CommandMailbox->ConsistencyCheck.RestoreConsistency = true;
6355 CommandMailbox->ConsistencyCheck.InitializedAreaOnly = false;
6356 DAC960_ExecuteCommand(Command);
6357 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6358 "(/dev/rd/c%dd%d) %s\n",
6359 Controller, LogicalDriveNumber,
6360 Controller->ControllerNumber,
6361 LogicalDriveNumber,
6362 (Command->V2.CommandStatus
6363 == DAC960_V2_NormalCompletion
6364 ? "Initiated" : "Not Initiated"));
6365 }
6366 else if (strncmp(UserCommand, "cancel-consistency-check", 24) == 0 &&
6367 DAC960_ParseLogicalDrive(Controller, &UserCommand[24],
6368 &LogicalDriveNumber))
6369 {
6370 CommandMailbox->ConsistencyCheck.LogicalDevice.LogicalDeviceNumber =
6371 LogicalDriveNumber;
6372 CommandMailbox->ConsistencyCheck.IOCTL_Opcode =
6373 DAC960_V2_ConsistencyCheckStop;
6374 DAC960_ExecuteCommand(Command);
6375 DAC960_UserCritical("Consistency Check of Logical Drive %d "
6376 "(/dev/rd/c%dd%d) %s\n",
6377 Controller, LogicalDriveNumber,
6378 Controller->ControllerNumber,
6379 LogicalDriveNumber,
6380 (Command->V2.CommandStatus
6381 == DAC960_V2_NormalCompletion
6382 ? "Cancelled" : "Not Cancelled"));
6383 }
6384 else if (strcmp(UserCommand, "perform-discovery") == 0)
6385 {
6386 CommandMailbox->Common.IOCTL_Opcode = DAC960_V2_StartDiscovery;
6387 DAC960_ExecuteCommand(Command);
6388 DAC960_UserCritical("Discovery %s\n", Controller,
6389 (Command->V2.CommandStatus
6390 == DAC960_V2_NormalCompletion
6391 ? "Initiated" : "Not Initiated"));
6392 if (Command->V2.CommandStatus == DAC960_V2_NormalCompletion)
6393 {
6394 CommandMailbox->ControllerInfo.CommandOpcode = DAC960_V2_IOCTL;
6395 CommandMailbox->ControllerInfo.CommandControlBits
6396 .DataTransferControllerToHost = true;
6397 CommandMailbox->ControllerInfo.CommandControlBits
6398 .NoAutoRequestSense = true;
6399 CommandMailbox->ControllerInfo.DataTransferSize =
6400 sizeof(DAC960_V2_ControllerInfo_T);
6401 CommandMailbox->ControllerInfo.ControllerNumber = 0;
6402 CommandMailbox->ControllerInfo.IOCTL_Opcode =
6403 DAC960_V2_GetControllerInfo;
6404
6405
6406
6407
6408 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
6409 .ScatterGatherSegments[0]
6410 .SegmentDataPointer =
6411 Controller->V2.NewControllerInformationDMA;
6412 CommandMailbox->ControllerInfo.DataTransferMemoryAddress
6413 .ScatterGatherSegments[0]
6414 .SegmentByteCount =
6415 CommandMailbox->ControllerInfo.DataTransferSize;
6416 while (1) {
6417 DAC960_ExecuteCommand(Command);
6418 if (!Controller->V2.NewControllerInformation->PhysicalScanActive)
6419 break;
6420 msleep(1000);
6421 }
6422 DAC960_UserCritical("Discovery Completed\n", Controller);
6423 }
6424 }
6425 else if (strcmp(UserCommand, "suppress-enclosure-messages") == 0)
6426 Controller->SuppressEnclosureMessages = true;
6427 else DAC960_UserCritical("Illegal User Command: '%s'\n",
6428 Controller, UserCommand);
6429
6430 spin_lock_irqsave(&Controller->queue_lock, flags);
6431 DAC960_DeallocateCommand(Command);
6432 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6433 return true;
6434}
6435
6436static int __maybe_unused dac960_proc_show(struct seq_file *m, void *v)
6437{
6438 unsigned char *StatusMessage = "OK\n";
6439 int ControllerNumber;
6440 for (ControllerNumber = 0;
6441 ControllerNumber < DAC960_ControllerCount;
6442 ControllerNumber++)
6443 {
6444 DAC960_Controller_T *Controller = DAC960_Controllers[ControllerNumber];
6445 if (Controller == NULL) continue;
6446 if (Controller->MonitoringAlertMode)
6447 {
6448 StatusMessage = "ALERT\n";
6449 break;
6450 }
6451 }
6452 seq_puts(m, StatusMessage);
6453 return 0;
6454}
6455
6456static int __maybe_unused dac960_initial_status_proc_show(struct seq_file *m,
6457 void *v)
6458{
6459 DAC960_Controller_T *Controller = (DAC960_Controller_T *)m->private;
6460 seq_printf(m, "%.*s", Controller->InitialStatusLength, Controller->CombinedStatusBuffer);
6461 return 0;
6462}
6463
6464static int __maybe_unused dac960_current_status_proc_show(struct seq_file *m,
6465 void *v)
6466{
6467 DAC960_Controller_T *Controller = (DAC960_Controller_T *) m->private;
6468 unsigned char *StatusMessage =
6469 "No Rebuild or Consistency Check in Progress\n";
6470 int ProgressMessageLength = strlen(StatusMessage);
6471 if (jiffies != Controller->LastCurrentStatusTime)
6472 {
6473 Controller->CurrentStatusLength = 0;
6474 DAC960_AnnounceDriver(Controller);
6475 DAC960_ReportControllerConfiguration(Controller);
6476 DAC960_ReportDeviceConfiguration(Controller);
6477 if (Controller->ProgressBufferLength > 0)
6478 ProgressMessageLength = Controller->ProgressBufferLength;
6479 if (DAC960_CheckStatusBuffer(Controller, 2 + ProgressMessageLength))
6480 {
6481 unsigned char *CurrentStatusBuffer = Controller->CurrentStatusBuffer;
6482 CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' ';
6483 CurrentStatusBuffer[Controller->CurrentStatusLength++] = ' ';
6484 if (Controller->ProgressBufferLength > 0)
6485 strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength],
6486 Controller->ProgressBuffer);
6487 else
6488 strcpy(&CurrentStatusBuffer[Controller->CurrentStatusLength],
6489 StatusMessage);
6490 Controller->CurrentStatusLength += ProgressMessageLength;
6491 }
6492 Controller->LastCurrentStatusTime = jiffies;
6493 }
6494 seq_printf(m, "%.*s", Controller->CurrentStatusLength, Controller->CurrentStatusBuffer);
6495 return 0;
6496}
6497
6498static int dac960_user_command_proc_show(struct seq_file *m, void *v)
6499{
6500 DAC960_Controller_T *Controller = (DAC960_Controller_T *)m->private;
6501
6502 seq_printf(m, "%.*s", Controller->UserStatusLength, Controller->UserStatusBuffer);
6503 return 0;
6504}
6505
6506static int dac960_user_command_proc_open(struct inode *inode, struct file *file)
6507{
6508 return single_open(file, dac960_user_command_proc_show, PDE_DATA(inode));
6509}
6510
6511static ssize_t dac960_user_command_proc_write(struct file *file,
6512 const char __user *Buffer,
6513 size_t Count, loff_t *pos)
6514{
6515 DAC960_Controller_T *Controller = PDE_DATA(file_inode(file));
6516 unsigned char CommandBuffer[80];
6517 int Length;
6518 if (Count > sizeof(CommandBuffer)-1) return -EINVAL;
6519 if (copy_from_user(CommandBuffer, Buffer, Count)) return -EFAULT;
6520 CommandBuffer[Count] = '\0';
6521 Length = strlen(CommandBuffer);
6522 if (Length > 0 && CommandBuffer[Length-1] == '\n')
6523 CommandBuffer[--Length] = '\0';
6524 if (Controller->FirmwareType == DAC960_V1_Controller)
6525 return (DAC960_V1_ExecuteUserCommand(Controller, CommandBuffer)
6526 ? Count : -EBUSY);
6527 else
6528 return (DAC960_V2_ExecuteUserCommand(Controller, CommandBuffer)
6529 ? Count : -EBUSY);
6530}
6531
6532static const struct file_operations dac960_user_command_proc_fops = {
6533 .owner = THIS_MODULE,
6534 .open = dac960_user_command_proc_open,
6535 .read = seq_read,
6536 .llseek = seq_lseek,
6537 .release = single_release,
6538 .write = dac960_user_command_proc_write,
6539};
6540
6541
6542
6543
6544
6545
6546static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller)
6547{
6548 struct proc_dir_entry *ControllerProcEntry;
6549
6550 if (DAC960_ProcDirectoryEntry == NULL) {
6551 DAC960_ProcDirectoryEntry = proc_mkdir("rd", NULL);
6552 proc_create_single("status", 0, DAC960_ProcDirectoryEntry,
6553 dac960_proc_show);
6554 }
6555
6556 snprintf(Controller->ControllerName, sizeof(Controller->ControllerName),
6557 "c%d", Controller->ControllerNumber);
6558 ControllerProcEntry = proc_mkdir(Controller->ControllerName,
6559 DAC960_ProcDirectoryEntry);
6560 proc_create_single_data("initial_status", 0, ControllerProcEntry,
6561 dac960_initial_status_proc_show, Controller);
6562 proc_create_single_data("current_status", 0, ControllerProcEntry,
6563 dac960_current_status_proc_show, Controller);
6564 proc_create_data("user_command", 0600, ControllerProcEntry, &dac960_user_command_proc_fops, Controller);
6565 Controller->ControllerProcEntry = ControllerProcEntry;
6566}
6567
6568
6569
6570
6571
6572
6573
6574static void DAC960_DestroyProcEntries(DAC960_Controller_T *Controller)
6575{
6576 if (Controller->ControllerProcEntry == NULL)
6577 return;
6578 remove_proc_entry("initial_status", Controller->ControllerProcEntry);
6579 remove_proc_entry("current_status", Controller->ControllerProcEntry);
6580 remove_proc_entry("user_command", Controller->ControllerProcEntry);
6581 remove_proc_entry(Controller->ControllerName, DAC960_ProcDirectoryEntry);
6582 Controller->ControllerProcEntry = NULL;
6583}
6584
6585#ifdef DAC960_GAM_MINOR
6586
6587static long DAC960_gam_get_controller_info(DAC960_ControllerInfo_T __user *UserSpaceControllerInfo)
6588{
6589 DAC960_ControllerInfo_T ControllerInfo;
6590 DAC960_Controller_T *Controller;
6591 int ControllerNumber;
6592 long ErrorCode;
6593
6594 if (UserSpaceControllerInfo == NULL)
6595 ErrorCode = -EINVAL;
6596 else ErrorCode = get_user(ControllerNumber,
6597 &UserSpaceControllerInfo->ControllerNumber);
6598 if (ErrorCode != 0)
6599 goto out;
6600 ErrorCode = -ENXIO;
6601 if (ControllerNumber < 0 ||
6602 ControllerNumber > DAC960_ControllerCount - 1) {
6603 goto out;
6604 }
6605 Controller = DAC960_Controllers[ControllerNumber];
6606 if (Controller == NULL)
6607 goto out;
6608 memset(&ControllerInfo, 0, sizeof(DAC960_ControllerInfo_T));
6609 ControllerInfo.ControllerNumber = ControllerNumber;
6610 ControllerInfo.FirmwareType = Controller->FirmwareType;
6611 ControllerInfo.Channels = Controller->Channels;
6612 ControllerInfo.Targets = Controller->Targets;
6613 ControllerInfo.PCI_Bus = Controller->Bus;
6614 ControllerInfo.PCI_Device = Controller->Device;
6615 ControllerInfo.PCI_Function = Controller->Function;
6616 ControllerInfo.IRQ_Channel = Controller->IRQ_Channel;
6617 ControllerInfo.PCI_Address = Controller->PCI_Address;
6618 strcpy(ControllerInfo.ModelName, Controller->ModelName);
6619 strcpy(ControllerInfo.FirmwareVersion, Controller->FirmwareVersion);
6620 ErrorCode = (copy_to_user(UserSpaceControllerInfo, &ControllerInfo,
6621 sizeof(DAC960_ControllerInfo_T)) ? -EFAULT : 0);
6622out:
6623 return ErrorCode;
6624}
6625
6626static long DAC960_gam_v1_execute_command(DAC960_V1_UserCommand_T __user *UserSpaceUserCommand)
6627{
6628 DAC960_V1_UserCommand_T UserCommand;
6629 DAC960_Controller_T *Controller;
6630 DAC960_Command_T *Command = NULL;
6631 DAC960_V1_CommandOpcode_T CommandOpcode;
6632 DAC960_V1_CommandStatus_T CommandStatus;
6633 DAC960_V1_DCDB_T DCDB;
6634 DAC960_V1_DCDB_T *DCDB_IOBUF = NULL;
6635 dma_addr_t DCDB_IOBUFDMA;
6636 unsigned long flags;
6637 int ControllerNumber, DataTransferLength;
6638 unsigned char *DataTransferBuffer = NULL;
6639 dma_addr_t DataTransferBufferDMA;
6640 long ErrorCode;
6641
6642 if (UserSpaceUserCommand == NULL) {
6643 ErrorCode = -EINVAL;
6644 goto out;
6645 }
6646 if (copy_from_user(&UserCommand, UserSpaceUserCommand,
6647 sizeof(DAC960_V1_UserCommand_T))) {
6648 ErrorCode = -EFAULT;
6649 goto out;
6650 }
6651 ControllerNumber = UserCommand.ControllerNumber;
6652 ErrorCode = -ENXIO;
6653 if (ControllerNumber < 0 ||
6654 ControllerNumber > DAC960_ControllerCount - 1)
6655 goto out;
6656 Controller = DAC960_Controllers[ControllerNumber];
6657 if (Controller == NULL)
6658 goto out;
6659 ErrorCode = -EINVAL;
6660 if (Controller->FirmwareType != DAC960_V1_Controller)
6661 goto out;
6662 CommandOpcode = UserCommand.CommandMailbox.Common.CommandOpcode;
6663 DataTransferLength = UserCommand.DataTransferLength;
6664 if (CommandOpcode & 0x80)
6665 goto out;
6666 if (CommandOpcode == DAC960_V1_DCDB)
6667 {
6668 if (copy_from_user(&DCDB, UserCommand.DCDB,
6669 sizeof(DAC960_V1_DCDB_T))) {
6670 ErrorCode = -EFAULT;
6671 goto out;
6672 }
6673 if (DCDB.Channel >= DAC960_V1_MaxChannels)
6674 goto out;
6675 if (!((DataTransferLength == 0 &&
6676 DCDB.Direction
6677 == DAC960_V1_DCDB_NoDataTransfer) ||
6678 (DataTransferLength > 0 &&
6679 DCDB.Direction
6680 == DAC960_V1_DCDB_DataTransferDeviceToSystem) ||
6681 (DataTransferLength < 0 &&
6682 DCDB.Direction
6683 == DAC960_V1_DCDB_DataTransferSystemToDevice)))
6684 goto out;
6685 if (((DCDB.TransferLengthHigh4 << 16) | DCDB.TransferLength)
6686 != abs(DataTransferLength))
6687 goto out;
6688 DCDB_IOBUF = pci_alloc_consistent(Controller->PCIDevice,
6689 sizeof(DAC960_V1_DCDB_T), &DCDB_IOBUFDMA);
6690 if (DCDB_IOBUF == NULL) {
6691 ErrorCode = -ENOMEM;
6692 goto out;
6693 }
6694 }
6695 ErrorCode = -ENOMEM;
6696 if (DataTransferLength > 0)
6697 {
6698 DataTransferBuffer = pci_zalloc_consistent(Controller->PCIDevice,
6699 DataTransferLength,
6700 &DataTransferBufferDMA);
6701 if (DataTransferBuffer == NULL)
6702 goto out;
6703 }
6704 else if (DataTransferLength < 0)
6705 {
6706 DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6707 -DataTransferLength, &DataTransferBufferDMA);
6708 if (DataTransferBuffer == NULL)
6709 goto out;
6710 if (copy_from_user(DataTransferBuffer,
6711 UserCommand.DataTransferBuffer,
6712 -DataTransferLength)) {
6713 ErrorCode = -EFAULT;
6714 goto out;
6715 }
6716 }
6717 if (CommandOpcode == DAC960_V1_DCDB)
6718 {
6719 spin_lock_irqsave(&Controller->queue_lock, flags);
6720 while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6721 DAC960_WaitForCommand(Controller);
6722 while (Controller->V1.DirectCommandActive[DCDB.Channel]
6723 [DCDB.TargetID])
6724 {
6725 spin_unlock_irq(&Controller->queue_lock);
6726 __wait_event(Controller->CommandWaitQueue,
6727 !Controller->V1.DirectCommandActive
6728 [DCDB.Channel][DCDB.TargetID]);
6729 spin_lock_irq(&Controller->queue_lock);
6730 }
6731 Controller->V1.DirectCommandActive[DCDB.Channel]
6732 [DCDB.TargetID] = true;
6733 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6734 DAC960_V1_ClearCommand(Command);
6735 Command->CommandType = DAC960_ImmediateCommand;
6736 memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox,
6737 sizeof(DAC960_V1_CommandMailbox_T));
6738 Command->V1.CommandMailbox.Type3.BusAddress = DCDB_IOBUFDMA;
6739 DCDB.BusAddress = DataTransferBufferDMA;
6740 memcpy(DCDB_IOBUF, &DCDB, sizeof(DAC960_V1_DCDB_T));
6741 }
6742 else
6743 {
6744 spin_lock_irqsave(&Controller->queue_lock, flags);
6745 while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6746 DAC960_WaitForCommand(Controller);
6747 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6748 DAC960_V1_ClearCommand(Command);
6749 Command->CommandType = DAC960_ImmediateCommand;
6750 memcpy(&Command->V1.CommandMailbox, &UserCommand.CommandMailbox,
6751 sizeof(DAC960_V1_CommandMailbox_T));
6752 if (DataTransferBuffer != NULL)
6753 Command->V1.CommandMailbox.Type3.BusAddress =
6754 DataTransferBufferDMA;
6755 }
6756 DAC960_ExecuteCommand(Command);
6757 CommandStatus = Command->V1.CommandStatus;
6758 spin_lock_irqsave(&Controller->queue_lock, flags);
6759 DAC960_DeallocateCommand(Command);
6760 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6761 if (DataTransferLength > 0)
6762 {
6763 if (copy_to_user(UserCommand.DataTransferBuffer,
6764 DataTransferBuffer, DataTransferLength)) {
6765 ErrorCode = -EFAULT;
6766 goto Failure1;
6767 }
6768 }
6769 if (CommandOpcode == DAC960_V1_DCDB)
6770 {
6771
6772
6773
6774
6775 Controller->V1.DirectCommandActive[DCDB.Channel]
6776 [DCDB.TargetID] = false;
6777 if (copy_to_user(UserCommand.DCDB, DCDB_IOBUF,
6778 sizeof(DAC960_V1_DCDB_T))) {
6779 ErrorCode = -EFAULT;
6780 goto Failure1;
6781 }
6782 }
6783 ErrorCode = CommandStatus;
6784 Failure1:
6785 if (DataTransferBuffer != NULL)
6786 pci_free_consistent(Controller->PCIDevice, abs(DataTransferLength),
6787 DataTransferBuffer, DataTransferBufferDMA);
6788 if (DCDB_IOBUF != NULL)
6789 pci_free_consistent(Controller->PCIDevice, sizeof(DAC960_V1_DCDB_T),
6790 DCDB_IOBUF, DCDB_IOBUFDMA);
6791 out:
6792 return ErrorCode;
6793}
6794
6795static long DAC960_gam_v2_execute_command(DAC960_V2_UserCommand_T __user *UserSpaceUserCommand)
6796{
6797 DAC960_V2_UserCommand_T UserCommand;
6798 DAC960_Controller_T *Controller;
6799 DAC960_Command_T *Command = NULL;
6800 DAC960_V2_CommandMailbox_T *CommandMailbox;
6801 DAC960_V2_CommandStatus_T CommandStatus;
6802 unsigned long flags;
6803 int ControllerNumber, DataTransferLength;
6804 int DataTransferResidue, RequestSenseLength;
6805 unsigned char *DataTransferBuffer = NULL;
6806 dma_addr_t DataTransferBufferDMA;
6807 unsigned char *RequestSenseBuffer = NULL;
6808 dma_addr_t RequestSenseBufferDMA;
6809 long ErrorCode = -EINVAL;
6810
6811 if (UserSpaceUserCommand == NULL)
6812 goto out;
6813 if (copy_from_user(&UserCommand, UserSpaceUserCommand,
6814 sizeof(DAC960_V2_UserCommand_T))) {
6815 ErrorCode = -EFAULT;
6816 goto out;
6817 }
6818 ErrorCode = -ENXIO;
6819 ControllerNumber = UserCommand.ControllerNumber;
6820 if (ControllerNumber < 0 ||
6821 ControllerNumber > DAC960_ControllerCount - 1)
6822 goto out;
6823 Controller = DAC960_Controllers[ControllerNumber];
6824 if (Controller == NULL)
6825 goto out;
6826 if (Controller->FirmwareType != DAC960_V2_Controller){
6827 ErrorCode = -EINVAL;
6828 goto out;
6829 }
6830 DataTransferLength = UserCommand.DataTransferLength;
6831 ErrorCode = -ENOMEM;
6832 if (DataTransferLength > 0)
6833 {
6834 DataTransferBuffer = pci_zalloc_consistent(Controller->PCIDevice,
6835 DataTransferLength,
6836 &DataTransferBufferDMA);
6837 if (DataTransferBuffer == NULL)
6838 goto out;
6839 }
6840 else if (DataTransferLength < 0)
6841 {
6842 DataTransferBuffer = pci_alloc_consistent(Controller->PCIDevice,
6843 -DataTransferLength, &DataTransferBufferDMA);
6844 if (DataTransferBuffer == NULL)
6845 goto out;
6846 if (copy_from_user(DataTransferBuffer,
6847 UserCommand.DataTransferBuffer,
6848 -DataTransferLength)) {
6849 ErrorCode = -EFAULT;
6850 goto Failure2;
6851 }
6852 }
6853 RequestSenseLength = UserCommand.RequestSenseLength;
6854 if (RequestSenseLength > 0)
6855 {
6856 RequestSenseBuffer = pci_zalloc_consistent(Controller->PCIDevice,
6857 RequestSenseLength,
6858 &RequestSenseBufferDMA);
6859 if (RequestSenseBuffer == NULL)
6860 {
6861 ErrorCode = -ENOMEM;
6862 goto Failure2;
6863 }
6864 }
6865 spin_lock_irqsave(&Controller->queue_lock, flags);
6866 while ((Command = DAC960_AllocateCommand(Controller)) == NULL)
6867 DAC960_WaitForCommand(Controller);
6868 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6869 DAC960_V2_ClearCommand(Command);
6870 Command->CommandType = DAC960_ImmediateCommand;
6871 CommandMailbox = &Command->V2.CommandMailbox;
6872 memcpy(CommandMailbox, &UserCommand.CommandMailbox,
6873 sizeof(DAC960_V2_CommandMailbox_T));
6874 CommandMailbox->Common.CommandControlBits
6875 .AdditionalScatterGatherListMemory = false;
6876 CommandMailbox->Common.CommandControlBits
6877 .NoAutoRequestSense = true;
6878 CommandMailbox->Common.DataTransferSize = 0;
6879 CommandMailbox->Common.DataTransferPageNumber = 0;
6880 memset(&CommandMailbox->Common.DataTransferMemoryAddress, 0,
6881 sizeof(DAC960_V2_DataTransferMemoryAddress_T));
6882 if (DataTransferLength != 0)
6883 {
6884 if (DataTransferLength > 0)
6885 {
6886 CommandMailbox->Common.CommandControlBits
6887 .DataTransferControllerToHost = true;
6888 CommandMailbox->Common.DataTransferSize = DataTransferLength;
6889 }
6890 else
6891 {
6892 CommandMailbox->Common.CommandControlBits
6893 .DataTransferControllerToHost = false;
6894 CommandMailbox->Common.DataTransferSize = -DataTransferLength;
6895 }
6896 CommandMailbox->Common.DataTransferMemoryAddress
6897 .ScatterGatherSegments[0]
6898 .SegmentDataPointer = DataTransferBufferDMA;
6899 CommandMailbox->Common.DataTransferMemoryAddress
6900 .ScatterGatherSegments[0]
6901 .SegmentByteCount =
6902 CommandMailbox->Common.DataTransferSize;
6903 }
6904 if (RequestSenseLength > 0)
6905 {
6906 CommandMailbox->Common.CommandControlBits
6907 .NoAutoRequestSense = false;
6908 CommandMailbox->Common.RequestSenseSize = RequestSenseLength;
6909 CommandMailbox->Common.RequestSenseBusAddress =
6910 RequestSenseBufferDMA;
6911 }
6912 DAC960_ExecuteCommand(Command);
6913 CommandStatus = Command->V2.CommandStatus;
6914 RequestSenseLength = Command->V2.RequestSenseLength;
6915 DataTransferResidue = Command->V2.DataTransferResidue;
6916 spin_lock_irqsave(&Controller->queue_lock, flags);
6917 DAC960_DeallocateCommand(Command);
6918 spin_unlock_irqrestore(&Controller->queue_lock, flags);
6919 if (RequestSenseLength > UserCommand.RequestSenseLength)
6920 RequestSenseLength = UserCommand.RequestSenseLength;
6921 if (copy_to_user(&UserSpaceUserCommand->DataTransferLength,
6922 &DataTransferResidue,
6923 sizeof(DataTransferResidue))) {
6924 ErrorCode = -EFAULT;
6925 goto Failure2;
6926 }
6927 if (copy_to_user(&UserSpaceUserCommand->RequestSenseLength,
6928 &RequestSenseLength, sizeof(RequestSenseLength))) {
6929 ErrorCode = -EFAULT;
6930 goto Failure2;
6931 }
6932 if (DataTransferLength > 0)
6933 {
6934 if (copy_to_user(UserCommand.DataTransferBuffer,
6935 DataTransferBuffer, DataTransferLength)) {
6936 ErrorCode = -EFAULT;
6937 goto Failure2;
6938 }
6939 }
6940 if (RequestSenseLength > 0)
6941 {
6942 if (copy_to_user(UserCommand.RequestSenseBuffer,
6943 RequestSenseBuffer, RequestSenseLength)) {
6944 ErrorCode = -EFAULT;
6945 goto Failure2;
6946 }
6947 }
6948 ErrorCode = CommandStatus;
6949 Failure2:
6950 pci_free_consistent(Controller->PCIDevice, abs(DataTransferLength),
6951 DataTransferBuffer, DataTransferBufferDMA);
6952 if (RequestSenseBuffer != NULL)
6953 pci_free_consistent(Controller->PCIDevice, RequestSenseLength,
6954 RequestSenseBuffer, RequestSenseBufferDMA);
6955out:
6956 return ErrorCode;
6957}
6958
6959static long DAC960_gam_v2_get_health_status(DAC960_V2_GetHealthStatus_T __user *UserSpaceGetHealthStatus)
6960{
6961 DAC960_V2_GetHealthStatus_T GetHealthStatus;
6962 DAC960_V2_HealthStatusBuffer_T HealthStatusBuffer;
6963 DAC960_Controller_T *Controller;
6964 int ControllerNumber;
6965 long ErrorCode;
6966
6967 if (UserSpaceGetHealthStatus == NULL) {
6968 ErrorCode = -EINVAL;
6969 goto out;
6970 }
6971 if (copy_from_user(&GetHealthStatus, UserSpaceGetHealthStatus,
6972 sizeof(DAC960_V2_GetHealthStatus_T))) {
6973 ErrorCode = -EFAULT;
6974 goto out;
6975 }
6976 ErrorCode = -ENXIO;
6977 ControllerNumber = GetHealthStatus.ControllerNumber;
6978 if (ControllerNumber < 0 ||
6979 ControllerNumber > DAC960_ControllerCount - 1)
6980 goto out;
6981 Controller = DAC960_Controllers[ControllerNumber];
6982 if (Controller == NULL)
6983 goto out;
6984 if (Controller->FirmwareType != DAC960_V2_Controller) {
6985 ErrorCode = -EINVAL;
6986 goto out;
6987 }
6988 if (copy_from_user(&HealthStatusBuffer,
6989 GetHealthStatus.HealthStatusBuffer,
6990 sizeof(DAC960_V2_HealthStatusBuffer_T))) {
6991 ErrorCode = -EFAULT;
6992 goto out;
6993 }
6994 ErrorCode = wait_event_interruptible_timeout(Controller->HealthStatusWaitQueue,
6995 !(Controller->V2.HealthStatusBuffer->StatusChangeCounter
6996 == HealthStatusBuffer.StatusChangeCounter &&
6997 Controller->V2.HealthStatusBuffer->NextEventSequenceNumber
6998 == HealthStatusBuffer.NextEventSequenceNumber),
6999 DAC960_MonitoringTimerInterval);
7000 if (ErrorCode == -ERESTARTSYS) {
7001 ErrorCode = -EINTR;
7002 goto out;
7003 }
7004 if (copy_to_user(GetHealthStatus.HealthStatusBuffer,
7005 Controller->V2.HealthStatusBuffer,
7006 sizeof(DAC960_V2_HealthStatusBuffer_T)))
7007 ErrorCode = -EFAULT;
7008 else
7009 ErrorCode = 0;
7010
7011out:
7012 return ErrorCode;
7013}
7014
7015
7016
7017
7018
7019static long DAC960_gam_ioctl(struct file *file, unsigned int Request,
7020 unsigned long Argument)
7021{
7022 long ErrorCode = 0;
7023 void __user *argp = (void __user *)Argument;
7024 if (!capable(CAP_SYS_ADMIN)) return -EACCES;
7025
7026 mutex_lock(&DAC960_mutex);
7027 switch (Request)
7028 {
7029 case DAC960_IOCTL_GET_CONTROLLER_COUNT:
7030 ErrorCode = DAC960_ControllerCount;
7031 break;
7032 case DAC960_IOCTL_GET_CONTROLLER_INFO:
7033 ErrorCode = DAC960_gam_get_controller_info(argp);
7034 break;
7035 case DAC960_IOCTL_V1_EXECUTE_COMMAND:
7036 ErrorCode = DAC960_gam_v1_execute_command(argp);
7037 break;
7038 case DAC960_IOCTL_V2_EXECUTE_COMMAND:
7039 ErrorCode = DAC960_gam_v2_execute_command(argp);
7040 break;
7041 case DAC960_IOCTL_V2_GET_HEALTH_STATUS:
7042 ErrorCode = DAC960_gam_v2_get_health_status(argp);
7043 break;
7044 default:
7045 ErrorCode = -ENOTTY;
7046 }
7047 mutex_unlock(&DAC960_mutex);
7048 return ErrorCode;
7049}
7050
7051static const struct file_operations DAC960_gam_fops = {
7052 .owner = THIS_MODULE,
7053 .unlocked_ioctl = DAC960_gam_ioctl,
7054 .llseek = noop_llseek,
7055};
7056
7057static struct miscdevice DAC960_gam_dev = {
7058 DAC960_GAM_MINOR,
7059 "dac960_gam",
7060 &DAC960_gam_fops
7061};
7062
7063static int DAC960_gam_init(void)
7064{
7065 int ret;
7066
7067 ret = misc_register(&DAC960_gam_dev);
7068 if (ret)
7069 printk(KERN_ERR "DAC960_gam: can't misc_register on minor %d\n", DAC960_GAM_MINOR);
7070 return ret;
7071}
7072
7073static void DAC960_gam_cleanup(void)
7074{
7075 misc_deregister(&DAC960_gam_dev);
7076}
7077
7078#endif
7079
7080static struct DAC960_privdata DAC960_GEM_privdata = {
7081 .HardwareType = DAC960_GEM_Controller,
7082 .FirmwareType = DAC960_V2_Controller,
7083 .InterruptHandler = DAC960_GEM_InterruptHandler,
7084 .MemoryWindowSize = DAC960_GEM_RegisterWindowSize,
7085};
7086
7087
7088static struct DAC960_privdata DAC960_BA_privdata = {
7089 .HardwareType = DAC960_BA_Controller,
7090 .FirmwareType = DAC960_V2_Controller,
7091 .InterruptHandler = DAC960_BA_InterruptHandler,
7092 .MemoryWindowSize = DAC960_BA_RegisterWindowSize,
7093};
7094
7095static struct DAC960_privdata DAC960_LP_privdata = {
7096 .HardwareType = DAC960_LP_Controller,
7097 .FirmwareType = DAC960_V2_Controller,
7098 .InterruptHandler = DAC960_LP_InterruptHandler,
7099 .MemoryWindowSize = DAC960_LP_RegisterWindowSize,
7100};
7101
7102static struct DAC960_privdata DAC960_LA_privdata = {
7103 .HardwareType = DAC960_LA_Controller,
7104 .FirmwareType = DAC960_V1_Controller,
7105 .InterruptHandler = DAC960_LA_InterruptHandler,
7106 .MemoryWindowSize = DAC960_LA_RegisterWindowSize,
7107};
7108
7109static struct DAC960_privdata DAC960_PG_privdata = {
7110 .HardwareType = DAC960_PG_Controller,
7111 .FirmwareType = DAC960_V1_Controller,
7112 .InterruptHandler = DAC960_PG_InterruptHandler,
7113 .MemoryWindowSize = DAC960_PG_RegisterWindowSize,
7114};
7115
7116static struct DAC960_privdata DAC960_PD_privdata = {
7117 .HardwareType = DAC960_PD_Controller,
7118 .FirmwareType = DAC960_V1_Controller,
7119 .InterruptHandler = DAC960_PD_InterruptHandler,
7120 .MemoryWindowSize = DAC960_PD_RegisterWindowSize,
7121};
7122
7123static struct DAC960_privdata DAC960_P_privdata = {
7124 .HardwareType = DAC960_P_Controller,
7125 .FirmwareType = DAC960_V1_Controller,
7126 .InterruptHandler = DAC960_P_InterruptHandler,
7127 .MemoryWindowSize = DAC960_PD_RegisterWindowSize,
7128};
7129
7130static const struct pci_device_id DAC960_id_table[] = {
7131 {
7132 .vendor = PCI_VENDOR_ID_MYLEX,
7133 .device = PCI_DEVICE_ID_MYLEX_DAC960_GEM,
7134 .subvendor = PCI_VENDOR_ID_MYLEX,
7135 .subdevice = PCI_ANY_ID,
7136 .driver_data = (unsigned long) &DAC960_GEM_privdata,
7137 },
7138 {
7139 .vendor = PCI_VENDOR_ID_MYLEX,
7140 .device = PCI_DEVICE_ID_MYLEX_DAC960_BA,
7141 .subvendor = PCI_ANY_ID,
7142 .subdevice = PCI_ANY_ID,
7143 .driver_data = (unsigned long) &DAC960_BA_privdata,
7144 },
7145 {
7146 .vendor = PCI_VENDOR_ID_MYLEX,
7147 .device = PCI_DEVICE_ID_MYLEX_DAC960_LP,
7148 .subvendor = PCI_ANY_ID,
7149 .subdevice = PCI_ANY_ID,
7150 .driver_data = (unsigned long) &DAC960_LP_privdata,
7151 },
7152 {
7153 .vendor = PCI_VENDOR_ID_DEC,
7154 .device = PCI_DEVICE_ID_DEC_21285,
7155 .subvendor = PCI_VENDOR_ID_MYLEX,
7156 .subdevice = PCI_DEVICE_ID_MYLEX_DAC960_LA,
7157 .driver_data = (unsigned long) &DAC960_LA_privdata,
7158 },
7159 {
7160 .vendor = PCI_VENDOR_ID_MYLEX,
7161 .device = PCI_DEVICE_ID_MYLEX_DAC960_PG,
7162 .subvendor = PCI_ANY_ID,
7163 .subdevice = PCI_ANY_ID,
7164 .driver_data = (unsigned long) &DAC960_PG_privdata,
7165 },
7166 {
7167 .vendor = PCI_VENDOR_ID_MYLEX,
7168 .device = PCI_DEVICE_ID_MYLEX_DAC960_PD,
7169 .subvendor = PCI_ANY_ID,
7170 .subdevice = PCI_ANY_ID,
7171 .driver_data = (unsigned long) &DAC960_PD_privdata,
7172 },
7173 {
7174 .vendor = PCI_VENDOR_ID_MYLEX,
7175 .device = PCI_DEVICE_ID_MYLEX_DAC960_P,
7176 .subvendor = PCI_ANY_ID,
7177 .subdevice = PCI_ANY_ID,
7178 .driver_data = (unsigned long) &DAC960_P_privdata,
7179 },
7180 {0, },
7181};
7182
7183MODULE_DEVICE_TABLE(pci, DAC960_id_table);
7184
7185static struct pci_driver DAC960_pci_driver = {
7186 .name = "DAC960",
7187 .id_table = DAC960_id_table,
7188 .probe = DAC960_Probe,
7189 .remove = DAC960_Remove,
7190};
7191
7192static int __init DAC960_init_module(void)
7193{
7194 int ret;
7195
7196 ret = pci_register_driver(&DAC960_pci_driver);
7197#ifdef DAC960_GAM_MINOR
7198 if (!ret)
7199 DAC960_gam_init();
7200#endif
7201 return ret;
7202}
7203
7204static void __exit DAC960_cleanup_module(void)
7205{
7206 int i;
7207
7208#ifdef DAC960_GAM_MINOR
7209 DAC960_gam_cleanup();
7210#endif
7211
7212 for (i = 0; i < DAC960_ControllerCount; i++) {
7213 DAC960_Controller_T *Controller = DAC960_Controllers[i];
7214 if (Controller == NULL)
7215 continue;
7216 DAC960_FinalizeController(Controller);
7217 }
7218 if (DAC960_ProcDirectoryEntry != NULL) {
7219 remove_proc_entry("rd/status", NULL);
7220 remove_proc_entry("rd", NULL);
7221 }
7222 DAC960_ControllerCount = 0;
7223 pci_unregister_driver(&DAC960_pci_driver);
7224}
7225
7226module_init(DAC960_init_module);
7227module_exit(DAC960_cleanup_module);
7228
7229MODULE_LICENSE("GPL");
7230