1#ifndef dprintk
2# define dprintk(x)
3#endif
4
5#define _nblank(x) #x
6#define nblank(x) _nblank(x)[0]
7
8#include <linux/interrupt.h>
9
10
11
12
13
14#ifndef AAC_DRIVER_BUILD
15# define AAC_DRIVER_BUILD 28900
16# define AAC_DRIVER_BRANCH "-ms"
17#endif
18#define MAXIMUM_NUM_CONTAINERS 32
19
20#define AAC_NUM_MGT_FIB 8
21#define AAC_NUM_IO_FIB (512 - AAC_NUM_MGT_FIB)
22#define AAC_NUM_FIB (AAC_NUM_IO_FIB + AAC_NUM_MGT_FIB)
23
24#define AAC_MAX_LUN (8)
25
26#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
27#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)256)
28
29#define AAC_DEBUG_INSTRUMENT_AIF_DELETE
30
31
32
33
34#define CONTAINER_CHANNEL (0)
35#define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL)
36#define CONTAINER_TO_ID(cont) (cont)
37#define CONTAINER_TO_LUN(cont) (0)
38
39#define aac_phys_to_logical(x) ((x)+1)
40#define aac_logical_to_phys(x) ((x)?(x)-1:0)
41
42
43
44struct diskparm
45{
46 int heads;
47 int sectors;
48 int cylinders;
49};
50
51
52
53
54
55
56#define CT_NONE 0
57#define CT_OK 218
58#define FT_FILESYS 8
59#define FT_DRIVE 9
60
61
62
63
64
65
66
67struct sgentry {
68 __le32 addr;
69 __le32 count;
70};
71
72struct user_sgentry {
73 u32 addr;
74 u32 count;
75};
76
77struct sgentry64 {
78 __le32 addr[2];
79 __le32 count;
80};
81
82struct user_sgentry64 {
83 u32 addr[2];
84 u32 count;
85};
86
87struct sgentryraw {
88 __le32 next;
89 __le32 prev;
90 __le32 addr[2];
91 __le32 count;
92 __le32 flags;
93};
94
95struct user_sgentryraw {
96 u32 next;
97 u32 prev;
98 u32 addr[2];
99 u32 count;
100 u32 flags;
101};
102
103
104
105
106
107
108
109
110struct sgmap {
111 __le32 count;
112 struct sgentry sg[1];
113};
114
115struct user_sgmap {
116 u32 count;
117 struct user_sgentry sg[1];
118};
119
120struct sgmap64 {
121 __le32 count;
122 struct sgentry64 sg[1];
123};
124
125struct user_sgmap64 {
126 u32 count;
127 struct user_sgentry64 sg[1];
128};
129
130struct sgmapraw {
131 __le32 count;
132 struct sgentryraw sg[1];
133};
134
135struct user_sgmapraw {
136 u32 count;
137 struct user_sgentryraw sg[1];
138};
139
140struct creation_info
141{
142 u8 buildnum;
143 u8 usec;
144 u8 via;
145
146
147 u8 year;
148 __le32 date;
149
150
151
152
153
154
155 __le32 serial[2];
156};
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171#define NUMBER_OF_COMM_QUEUES 8
172#define HOST_HIGH_CMD_ENTRIES 4
173#define HOST_NORM_CMD_ENTRIES 8
174#define ADAP_HIGH_CMD_ENTRIES 4
175#define ADAP_NORM_CMD_ENTRIES 512
176#define HOST_HIGH_RESP_ENTRIES 4
177#define HOST_NORM_RESP_ENTRIES 512
178#define ADAP_HIGH_RESP_ENTRIES 4
179#define ADAP_NORM_RESP_ENTRIES 8
180
181#define TOTAL_QUEUE_ENTRIES \
182 (HOST_NORM_CMD_ENTRIES + HOST_HIGH_CMD_ENTRIES + ADAP_NORM_CMD_ENTRIES + ADAP_HIGH_CMD_ENTRIES + \
183 HOST_NORM_RESP_ENTRIES + HOST_HIGH_RESP_ENTRIES + ADAP_NORM_RESP_ENTRIES + ADAP_HIGH_RESP_ENTRIES)
184
185
186
187
188
189
190#define QUEUE_ALIGNMENT 16
191
192
193
194
195
196
197
198
199struct aac_entry {
200 __le32 size;
201 __le32 addr;
202};
203
204
205
206
207
208
209struct aac_qhdr {
210 __le64 header_addr;
211
212 __le32 *producer;
213 __le32 *consumer;
214};
215
216
217
218
219
220
221#define HostNormCmdQue 1
222#define HostHighCmdQue 2
223#define HostNormRespQue 3
224#define HostHighRespQue 4
225#define AdapNormRespNotFull 5
226#define AdapHighRespNotFull 6
227#define AdapNormCmdNotFull 7
228#define AdapHighCmdNotFull 8
229#define SynchCommandComplete 9
230#define AdapInternalError 0xfe
231
232
233
234
235
236
237
238#define AdapNormCmdQue 2
239#define AdapHighCmdQue 3
240#define AdapNormRespQue 6
241#define AdapHighRespQue 7
242#define HostShutdown 8
243#define HostPowerFail 9
244#define FatalCommError 10
245#define HostNormRespNotFull 11
246#define HostHighRespNotFull 12
247#define HostNormCmdNotFull 13
248#define HostHighCmdNotFull 14
249#define FastIo 15
250#define AdapPrintfDone 16
251
252
253
254
255
256
257enum aac_queue_types {
258 HostNormCmdQueue = 0,
259 HostHighCmdQueue,
260 AdapNormCmdQueue,
261 AdapHighCmdQueue,
262 HostNormRespQueue,
263 HostHighRespQueue,
264 AdapNormRespQueue,
265 AdapHighRespQueue
266};
267
268
269
270
271
272#define FIB_MAGIC 0x0001
273
274
275
276
277
278#define FsaNormal 1
279
280
281struct aac_fib_xporthdr {
282 u64 HostAddress;
283 u32 Size;
284 u32 Handle;
285 u64 Reserved[2];
286};
287
288#define ALIGN32 32
289
290
291
292
293
294
295struct aac_fibhdr {
296 __le32 XferState;
297 __le16 Command;
298 u8 StructType;
299 u8 Flags;
300 __le16 Size;
301 __le16 SenderSize;
302
303 __le32 SenderFibAddress;
304 __le32 ReceiverFibAddress;
305
306 u32 SenderData;
307 union {
308 struct {
309 __le32 _ReceiverTimeStart;
310
311 __le32 _ReceiverTimeDone;
312
313 } _s;
314 } _u;
315};
316
317struct hw_fib {
318 struct aac_fibhdr header;
319 u8 data[512-sizeof(struct aac_fibhdr)];
320};
321
322
323
324
325
326#define TestCommandResponse 1
327#define TestAdapterCommand 2
328
329
330
331#define LastTestCommand 100
332#define ReinitHostNormCommandQueue 101
333#define ReinitHostHighCommandQueue 102
334#define ReinitHostHighRespQueue 103
335#define ReinitHostNormRespQueue 104
336#define ReinitAdapNormCommandQueue 105
337#define ReinitAdapHighCommandQueue 107
338#define ReinitAdapHighRespQueue 108
339#define ReinitAdapNormRespQueue 109
340#define InterfaceShutdown 110
341#define DmaCommandFib 120
342#define StartProfile 121
343#define TermProfile 122
344#define SpeedTest 123
345#define TakeABreakPt 124
346#define RequestPerfData 125
347#define SetInterruptDefTimer 126
348#define SetInterruptDefCount 127
349#define GetInterruptDefStatus 128
350#define LastCommCommand 129
351
352
353
354#define NuFileSystem 300
355#define UFS 301
356#define HostFileSystem 302
357#define LastFileSystemCommand 303
358
359
360
361#define ContainerCommand 500
362#define ContainerCommand64 501
363#define ContainerRawIo 502
364
365
366
367#define ScsiPortCommand 600
368#define ScsiPortCommand64 601
369
370
371
372#define AifRequest 700
373#define CheckRevision 701
374#define FsaHostShutdown 702
375#define RequestAdapterInfo 703
376#define IsAdapterPaused 704
377#define SendHostTime 705
378#define RequestSupplementAdapterInfo 706
379#define LastMiscCommand 707
380
381
382
383
384
385enum fib_xfer_state {
386 HostOwned = (1<<0),
387 AdapterOwned = (1<<1),
388 FibInitialized = (1<<2),
389 FibEmpty = (1<<3),
390 AllocatedFromPool = (1<<4),
391 SentFromHost = (1<<5),
392 SentFromAdapter = (1<<6),
393 ResponseExpected = (1<<7),
394 NoResponseExpected = (1<<8),
395 AdapterProcessed = (1<<9),
396 HostProcessed = (1<<10),
397 HighPriority = (1<<11),
398 NormalPriority = (1<<12),
399 Async = (1<<13),
400 AsyncIo = (1<<13),
401 PageFileIo = (1<<14),
402 ShutdownRequest = (1<<15),
403 LazyWrite = (1<<16),
404 AdapterMicroFib = (1<<17),
405 BIOSFibPath = (1<<18),
406 FastResponseCapable = (1<<19),
407 ApiFib = (1<<20),
408
409 NoMoreAifDataAvailable = (1<<21)
410};
411
412
413
414
415
416
417#define ADAPTER_INIT_STRUCT_REVISION 3
418#define ADAPTER_INIT_STRUCT_REVISION_4 4
419#define ADAPTER_INIT_STRUCT_REVISION_6 6
420
421struct aac_init
422{
423 __le32 InitStructRevision;
424 __le32 MiniPortRevision;
425 __le32 fsrev;
426 __le32 CommHeaderAddress;
427 __le32 FastIoCommAreaAddress;
428 __le32 AdapterFibsPhysicalAddress;
429 __le32 AdapterFibsVirtualAddress;
430 __le32 AdapterFibsSize;
431 __le32 AdapterFibAlign;
432 __le32 printfbuf;
433 __le32 printfbufsiz;
434 __le32 HostPhysMemPages;
435
436 __le32 HostElapsedSeconds;
437
438
439
440 __le32 InitFlags;
441#define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001
442#define INITFLAGS_DRIVER_USES_UTC_TIME 0x00000010
443#define INITFLAGS_DRIVER_SUPPORTS_PM 0x00000020
444#define INITFLAGS_NEW_COMM_TYPE1_SUPPORTED 0x00000041
445 __le32 MaxIoCommands;
446 __le32 MaxIoSize;
447 __le32 MaxFibSize;
448
449 __le32 MaxNumAif;
450
451 __le32 HostRRQ_AddrLow;
452 __le32 HostRRQ_AddrHigh;
453};
454
455enum aac_log_level {
456 LOG_AAC_INIT = 10,
457 LOG_AAC_INFORMATIONAL = 20,
458 LOG_AAC_WARNING = 30,
459 LOG_AAC_LOW_ERROR = 40,
460 LOG_AAC_MEDIUM_ERROR = 50,
461 LOG_AAC_HIGH_ERROR = 60,
462 LOG_AAC_PANIC = 70,
463 LOG_AAC_DEBUG = 80,
464 LOG_AAC_WINDBG_PRINT = 90
465};
466
467#define FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT 0x030b
468#define FSAFS_NTC_FIB_CONTEXT 0x030c
469
470struct aac_dev;
471struct fib;
472struct scsi_cmnd;
473
474struct adapter_ops
475{
476
477 void (*adapter_interrupt)(struct aac_dev *dev);
478 void (*adapter_notify)(struct aac_dev *dev, u32 event);
479 void (*adapter_disable_int)(struct aac_dev *dev);
480 void (*adapter_enable_int)(struct aac_dev *dev);
481 int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
482 int (*adapter_check_health)(struct aac_dev *dev);
483 int (*adapter_restart)(struct aac_dev *dev, int bled);
484
485 int (*adapter_ioremap)(struct aac_dev * dev, u32 size);
486 irq_handler_t adapter_intr;
487
488 int (*adapter_deliver)(struct fib * fib);
489 int (*adapter_bounds)(struct aac_dev * dev, struct scsi_cmnd * cmd, u64 lba);
490 int (*adapter_read)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count);
491 int (*adapter_write)(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32 count, int fua);
492 int (*adapter_scsi)(struct fib * fib, struct scsi_cmnd * cmd);
493
494 int (*adapter_comm)(struct aac_dev * dev, int comm);
495};
496
497
498
499
500
501struct aac_driver_ident
502{
503 int (*init)(struct aac_dev *dev);
504 char * name;
505 char * vname;
506 char * model;
507 u16 channels;
508 int quirks;
509};
510
511
512
513
514
515
516#define AAC_QUIRK_31BIT 0x0001
517
518
519
520
521
522
523#define AAC_QUIRK_34SG 0x0002
524
525
526
527
528#define AAC_QUIRK_SLAVE 0x0004
529
530
531
532
533#define AAC_QUIRK_MASTER 0x0008
534
535
536
537
538
539
540#define AAC_QUIRK_17SG 0x0010
541
542
543
544
545
546#define AAC_QUIRK_SCSI_32 0x0020
547
548
549
550
551
552
553
554
555
556
557
558struct aac_queue {
559 u64 logical;
560 struct aac_entry *base;
561 struct aac_qhdr headers;
562 u32 entries;
563 wait_queue_head_t qfull;
564 wait_queue_head_t cmdready;
565
566 spinlock_t *lock;
567 spinlock_t lockdata;
568 struct list_head cmdq;
569
570 u32 numpending;
571 struct aac_dev * dev;
572};
573
574
575
576
577
578
579struct aac_queue_block
580{
581 struct aac_queue queue[8];
582};
583
584
585
586
587
588struct sa_drawbridge_CSR {
589
590 __le32 reserved[10];
591 u8 LUT_Offset;
592 u8 reserved1[3];
593 __le32 LUT_Data;
594 __le32 reserved2[26];
595 __le16 PRICLEARIRQ;
596 __le16 SECCLEARIRQ;
597 __le16 PRISETIRQ;
598 __le16 SECSETIRQ;
599 __le16 PRICLEARIRQMASK;
600 __le16 SECCLEARIRQMASK;
601 __le16 PRISETIRQMASK;
602 __le16 SECSETIRQMASK;
603 __le32 MAILBOX0;
604 __le32 MAILBOX1;
605 __le32 MAILBOX2;
606 __le32 MAILBOX3;
607 __le32 MAILBOX4;
608 __le32 MAILBOX5;
609 __le32 MAILBOX6;
610 __le32 MAILBOX7;
611 __le32 ROM_Setup_Data;
612 __le32 ROM_Control_Addr;
613 __le32 reserved3[12];
614 __le32 LUT[64];
615};
616
617#define Mailbox0 SaDbCSR.MAILBOX0
618#define Mailbox1 SaDbCSR.MAILBOX1
619#define Mailbox2 SaDbCSR.MAILBOX2
620#define Mailbox3 SaDbCSR.MAILBOX3
621#define Mailbox4 SaDbCSR.MAILBOX4
622#define Mailbox5 SaDbCSR.MAILBOX5
623#define Mailbox6 SaDbCSR.MAILBOX6
624#define Mailbox7 SaDbCSR.MAILBOX7
625
626#define DoorbellReg_p SaDbCSR.PRISETIRQ
627#define DoorbellReg_s SaDbCSR.SECSETIRQ
628#define DoorbellClrReg_p SaDbCSR.PRICLEARIRQ
629
630
631#define DOORBELL_0 0x0001
632#define DOORBELL_1 0x0002
633#define DOORBELL_2 0x0004
634#define DOORBELL_3 0x0008
635#define DOORBELL_4 0x0010
636#define DOORBELL_5 0x0020
637#define DOORBELL_6 0x0040
638
639
640#define PrintfReady DOORBELL_5
641#define PrintfDone DOORBELL_5
642
643struct sa_registers {
644 struct sa_drawbridge_CSR SaDbCSR;
645};
646
647
648#define Sa_MINIPORT_REVISION 1
649
650#define sa_readw(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
651#define sa_readl(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
652#define sa_writew(AEP, CSR, value) writew(value, &((AEP)->regs.sa->CSR))
653#define sa_writel(AEP, CSR, value) writel(value, &((AEP)->regs.sa->CSR))
654
655
656
657
658
659struct rx_mu_registers {
660
661 __le32 ARSR;
662 __le32 reserved0;
663 __le32 AWR;
664 __le32 reserved1;
665 __le32 IMRx[2];
666 __le32 OMRx[2];
667 __le32 IDR;
668 __le32 IISR;
669
670 __le32 IIMR;
671
672 __le32 ODR;
673 __le32 OISR;
674
675 __le32 OIMR;
676
677 __le32 reserved2;
678 __le32 reserved3;
679 __le32 InboundQueue;
680 __le32 OutboundQueue;
681
682
683};
684
685struct rx_inbound {
686 __le32 Mailbox[8];
687};
688
689#define INBOUNDDOORBELL_0 0x00000001
690#define INBOUNDDOORBELL_1 0x00000002
691#define INBOUNDDOORBELL_2 0x00000004
692#define INBOUNDDOORBELL_3 0x00000008
693#define INBOUNDDOORBELL_4 0x00000010
694#define INBOUNDDOORBELL_5 0x00000020
695#define INBOUNDDOORBELL_6 0x00000040
696
697#define OUTBOUNDDOORBELL_0 0x00000001
698#define OUTBOUNDDOORBELL_1 0x00000002
699#define OUTBOUNDDOORBELL_2 0x00000004
700#define OUTBOUNDDOORBELL_3 0x00000008
701#define OUTBOUNDDOORBELL_4 0x00000010
702
703#define InboundDoorbellReg MUnit.IDR
704#define OutboundDoorbellReg MUnit.ODR
705
706struct rx_registers {
707 struct rx_mu_registers MUnit;
708 __le32 reserved1[2];
709 struct rx_inbound IndexRegs;
710};
711
712#define rx_readb(AEP, CSR) readb(&((AEP)->regs.rx->CSR))
713#define rx_readl(AEP, CSR) readl(&((AEP)->regs.rx->CSR))
714#define rx_writeb(AEP, CSR, value) writeb(value, &((AEP)->regs.rx->CSR))
715#define rx_writel(AEP, CSR, value) writel(value, &((AEP)->regs.rx->CSR))
716
717
718
719
720
721#define rkt_mu_registers rx_mu_registers
722#define rkt_inbound rx_inbound
723
724struct rkt_registers {
725 struct rkt_mu_registers MUnit;
726 __le32 reserved1[1006];
727 struct rkt_inbound IndexRegs;
728};
729
730#define rkt_readb(AEP, CSR) readb(&((AEP)->regs.rkt->CSR))
731#define rkt_readl(AEP, CSR) readl(&((AEP)->regs.rkt->CSR))
732#define rkt_writeb(AEP, CSR, value) writeb(value, &((AEP)->regs.rkt->CSR))
733#define rkt_writel(AEP, CSR, value) writel(value, &((AEP)->regs.rkt->CSR))
734
735
736
737
738
739#define src_inbound rx_inbound
740
741struct src_mu_registers {
742
743 __le32 reserved0[8];
744 __le32 IDR;
745 __le32 IISR;
746 __le32 reserved1[3];
747 __le32 OIMR;
748 __le32 reserved2[25];
749 __le32 ODR_R;
750 __le32 ODR_C;
751 __le32 reserved3[6];
752 __le32 OMR;
753 __le32 IQ_L;
754 __le32 IQ_H;
755};
756
757struct src_registers {
758 struct src_mu_registers MUnit;
759 union {
760 struct {
761 __le32 reserved1[130790];
762 struct src_inbound IndexRegs;
763 } tupelo;
764 struct {
765 __le32 reserved1[974];
766 struct src_inbound IndexRegs;
767 } denali;
768 } u;
769};
770
771#define src_readb(AEP, CSR) readb(&((AEP)->regs.src.bar0->CSR))
772#define src_readl(AEP, CSR) readl(&((AEP)->regs.src.bar0->CSR))
773#define src_writeb(AEP, CSR, value) writeb(value, \
774 &((AEP)->regs.src.bar0->CSR))
775#define src_writel(AEP, CSR, value) writel(value, \
776 &((AEP)->regs.src.bar0->CSR))
777
778#define SRC_ODR_SHIFT 12
779#define SRC_IDR_SHIFT 9
780
781typedef void (*fib_callback)(void *ctxt, struct fib *fibctx);
782
783struct aac_fib_context {
784 s16 type;
785 s16 size;
786 u32 unique;
787 ulong jiffies;
788 struct list_head next;
789 struct semaphore wait_sem;
790 int wait;
791 unsigned long count;
792 struct list_head fib_list;
793};
794
795struct sense_data {
796 u8 error_code;
797 u8 valid:1;
798
799
800
801 u8 segment_number;
802 u8 sense_key:4;
803 u8 reserved:1;
804 u8 ILI:1;
805 u8 EOM:1;
806 u8 filemark:1;
807
808 u8 information[4];
809
810
811
812 u8 add_sense_len;
813 u8 cmnd_info[4];
814 u8 ASC;
815 u8 ASCQ;
816 u8 FRUC;
817 u8 bit_ptr:3;
818
819
820 u8 BPV:1;
821
822
823 u8 reserved2:2;
824 u8 CD:1;
825
826
827 u8 SKSV:1;
828 u8 field_ptr[2];
829};
830
831struct fsa_dev_info {
832 u64 last;
833 u64 size;
834 u32 type;
835 u32 config_waiting_on;
836 unsigned long config_waiting_stamp;
837 u16 queue_depth;
838 u8 config_needed;
839 u8 valid;
840 u8 ro;
841 u8 locked;
842 u8 deleted;
843 char devname[8];
844 struct sense_data sense_data;
845};
846
847struct fib {
848 void *next;
849 s16 type;
850 s16 size;
851
852
853
854 struct aac_dev *dev;
855
856
857
858
859 struct semaphore event_wait;
860 spinlock_t event_lock;
861
862 u32 done;
863 fib_callback callback;
864 void *callback_data;
865 u32 flags;
866
867
868
869
870 struct list_head fiblink;
871 void *data;
872 struct hw_fib *hw_fib_va;
873 dma_addr_t hw_fib_pa;
874};
875
876
877
878
879
880
881
882struct aac_adapter_info
883{
884 __le32 platform;
885 __le32 cpu;
886 __le32 subcpu;
887 __le32 clock;
888 __le32 execmem;
889 __le32 buffermem;
890 __le32 totalmem;
891 __le32 kernelrev;
892 __le32 kernelbuild;
893 __le32 monitorrev;
894 __le32 monitorbuild;
895 __le32 hwrev;
896 __le32 hwbuild;
897 __le32 biosrev;
898 __le32 biosbuild;
899 __le32 cluster;
900 __le32 clusterchannelmask;
901 __le32 serial[2];
902 __le32 battery;
903 __le32 options;
904 __le32 OEM;
905};
906
907struct aac_supplement_adapter_info
908{
909 u8 AdapterTypeText[17+1];
910 u8 Pad[2];
911 __le32 FlashMemoryByteSize;
912 __le32 FlashImageId;
913 __le32 MaxNumberPorts;
914 __le32 Version;
915 __le32 FeatureBits;
916 u8 SlotNumber;
917 u8 ReservedPad0[3];
918 u8 BuildDate[12];
919 __le32 CurrentNumberPorts;
920 struct {
921 u8 AssemblyPn[8];
922 u8 FruPn[8];
923 u8 BatteryFruPn[8];
924 u8 EcVersionString[8];
925 u8 Tsid[12];
926 } VpdInfo;
927 __le32 FlashFirmwareRevision;
928 __le32 FlashFirmwareBuild;
929 __le32 RaidTypeMorphOptions;
930 __le32 FlashFirmwareBootRevision;
931 __le32 FlashFirmwareBootBuild;
932 u8 MfgPcbaSerialNo[12];
933 u8 MfgWWNName[8];
934 __le32 SupportedOptions2;
935 __le32 StructExpansion;
936
937 __le32 FeatureBits3;
938 __le32 SupportedPerformanceModes;
939 __le32 ReservedForFutureGrowth[80];
940};
941#define AAC_FEATURE_FALCON cpu_to_le32(0x00000010)
942#define AAC_FEATURE_JBOD cpu_to_le32(0x08000000)
943
944#define AAC_OPTION_MU_RESET cpu_to_le32(0x00000001)
945#define AAC_OPTION_IGNORE_RESET cpu_to_le32(0x00000002)
946#define AAC_OPTION_POWER_MANAGEMENT cpu_to_le32(0x00000004)
947#define AAC_OPTION_DOORBELL_RESET cpu_to_le32(0x00004000)
948#define AAC_SIS_VERSION_V3 3
949#define AAC_SIS_SLOT_UNKNOWN 0xFF
950
951#define GetBusInfo 0x00000009
952struct aac_bus_info {
953 __le32 Command;
954 __le32 ObjType;
955 __le32 MethodId;
956 __le32 ObjectId;
957 __le32 CtlCmd;
958};
959
960struct aac_bus_info_response {
961 __le32 Status;
962 __le32 ObjType;
963 __le32 MethodId;
964 __le32 ObjectId;
965 __le32 CtlCmd;
966 __le32 ProbeComplete;
967 __le32 BusCount;
968 __le32 TargetsPerBus;
969 u8 InitiatorBusId[10];
970 u8 BusValid[10];
971};
972
973
974
975
976#define AAC_BAT_REQ_PRESENT (1)
977#define AAC_BAT_REQ_NOTPRESENT (2)
978#define AAC_BAT_OPT_PRESENT (3)
979#define AAC_BAT_OPT_NOTPRESENT (4)
980#define AAC_BAT_NOT_SUPPORTED (5)
981
982
983
984#define AAC_CPU_SIMULATOR (1)
985#define AAC_CPU_I960 (2)
986#define AAC_CPU_STRONGARM (3)
987
988
989
990
991#define AAC_OPT_SNAPSHOT cpu_to_le32(1)
992#define AAC_OPT_CLUSTERS cpu_to_le32(1<<1)
993#define AAC_OPT_WRITE_CACHE cpu_to_le32(1<<2)
994#define AAC_OPT_64BIT_DATA cpu_to_le32(1<<3)
995#define AAC_OPT_HOST_TIME_FIB cpu_to_le32(1<<4)
996#define AAC_OPT_RAID50 cpu_to_le32(1<<5)
997#define AAC_OPT_4GB_WINDOW cpu_to_le32(1<<6)
998#define AAC_OPT_SCSI_UPGRADEABLE cpu_to_le32(1<<7)
999#define AAC_OPT_SOFT_ERR_REPORT cpu_to_le32(1<<8)
1000#define AAC_OPT_SUPPORTED_RECONDITION cpu_to_le32(1<<9)
1001#define AAC_OPT_SGMAP_HOST64 cpu_to_le32(1<<10)
1002#define AAC_OPT_ALARM cpu_to_le32(1<<11)
1003#define AAC_OPT_NONDASD cpu_to_le32(1<<12)
1004#define AAC_OPT_SCSI_MANAGED cpu_to_le32(1<<13)
1005#define AAC_OPT_RAID_SCSI_MODE cpu_to_le32(1<<14)
1006#define AAC_OPT_SUPPLEMENT_ADAPTER_INFO cpu_to_le32(1<<16)
1007#define AAC_OPT_NEW_COMM cpu_to_le32(1<<17)
1008#define AAC_OPT_NEW_COMM_64 cpu_to_le32(1<<18)
1009#define AAC_OPT_NEW_COMM_TYPE1 cpu_to_le32(1<<28)
1010#define AAC_OPT_NEW_COMM_TYPE2 cpu_to_le32(1<<29)
1011#define AAC_OPT_NEW_COMM_TYPE3 cpu_to_le32(1<<30)
1012#define AAC_OPT_NEW_COMM_TYPE4 cpu_to_le32(1<<31)
1013
1014
1015struct aac_dev
1016{
1017 struct list_head entry;
1018 const char *name;
1019 int id;
1020
1021
1022
1023
1024 unsigned max_fib_size;
1025 unsigned sg_tablesize;
1026 unsigned max_num_aif;
1027
1028
1029
1030
1031 dma_addr_t hw_fib_pa;
1032 struct hw_fib *hw_fib_va;
1033 struct hw_fib *aif_base_va;
1034
1035
1036
1037 struct fib *fibs;
1038
1039 struct fib *free_fib;
1040 spinlock_t fib_lock;
1041
1042 struct aac_queue_block *queues;
1043
1044
1045
1046
1047
1048
1049
1050 struct list_head fib_list;
1051
1052 struct adapter_ops a_ops;
1053 unsigned long fsrev;
1054
1055 unsigned long dbg_base;
1056
1057
1058 unsigned base_size, dbg_size;
1059
1060
1061 struct aac_init *init;
1062 dma_addr_t init_pa;
1063
1064 u32 *host_rrq;
1065
1066
1067 dma_addr_t host_rrq_pa;
1068 u32 host_rrq_idx;
1069
1070 struct pci_dev *pdev;
1071 void * printfbuf;
1072 void * comm_addr;
1073 dma_addr_t comm_phys;
1074 size_t comm_size;
1075
1076 struct Scsi_Host *scsi_host_ptr;
1077 int maximum_num_containers;
1078 int maximum_num_physicals;
1079 int maximum_num_channels;
1080 struct fsa_dev_info *fsa_dev;
1081 struct task_struct *thread;
1082 int cardtype;
1083
1084
1085
1086
1087#ifndef AAC_MIN_FOOTPRINT_SIZE
1088# define AAC_MIN_FOOTPRINT_SIZE 8192
1089# define AAC_MIN_SRC_BAR0_SIZE 0x400000
1090# define AAC_MIN_SRC_BAR1_SIZE 0x800
1091# define AAC_MIN_SRCV_BAR0_SIZE 0x100000
1092# define AAC_MIN_SRCV_BAR1_SIZE 0x400
1093#endif
1094 union
1095 {
1096 struct sa_registers __iomem *sa;
1097 struct rx_registers __iomem *rx;
1098 struct rkt_registers __iomem *rkt;
1099 struct {
1100 struct src_registers __iomem *bar0;
1101 char __iomem *bar1;
1102 } src;
1103 } regs;
1104 volatile void __iomem *base, *dbg_base_mapped;
1105 volatile struct rx_inbound __iomem *IndexRegs;
1106 u32 OIMR;
1107
1108
1109
1110 u32 aif_thread;
1111 struct aac_adapter_info adapter_info;
1112 struct aac_supplement_adapter_info supplement_adapter_info;
1113
1114
1115
1116 u8 nondasd_support;
1117 u8 jbod;
1118 u8 cache_protected;
1119 u8 dac_support;
1120 u8 needs_dac;
1121 u8 raid_scsi_mode;
1122 u8 comm_interface;
1123# define AAC_COMM_PRODUCER 0
1124# define AAC_COMM_MESSAGE 1
1125# define AAC_COMM_MESSAGE_TYPE1 3
1126 u8 raw_io_interface;
1127 u8 raw_io_64;
1128 u8 printf_enabled;
1129 u8 in_reset;
1130 u8 msi;
1131 int management_fib_count;
1132 spinlock_t manage_lock;
1133 spinlock_t sync_lock;
1134 int sync_mode;
1135 struct fib *sync_fib;
1136 struct list_head sync_fib_list;
1137};
1138
1139#define aac_adapter_interrupt(dev) \
1140 (dev)->a_ops.adapter_interrupt(dev)
1141
1142#define aac_adapter_notify(dev, event) \
1143 (dev)->a_ops.adapter_notify(dev, event)
1144
1145#define aac_adapter_disable_int(dev) \
1146 (dev)->a_ops.adapter_disable_int(dev)
1147
1148#define aac_adapter_enable_int(dev) \
1149 (dev)->a_ops.adapter_enable_int(dev)
1150
1151#define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
1152 (dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
1153
1154#define aac_adapter_check_health(dev) \
1155 (dev)->a_ops.adapter_check_health(dev)
1156
1157#define aac_adapter_restart(dev,bled) \
1158 (dev)->a_ops.adapter_restart(dev,bled)
1159
1160#define aac_adapter_ioremap(dev, size) \
1161 (dev)->a_ops.adapter_ioremap(dev, size)
1162
1163#define aac_adapter_deliver(fib) \
1164 ((fib)->dev)->a_ops.adapter_deliver(fib)
1165
1166#define aac_adapter_bounds(dev,cmd,lba) \
1167 dev->a_ops.adapter_bounds(dev,cmd,lba)
1168
1169#define aac_adapter_read(fib,cmd,lba,count) \
1170 ((fib)->dev)->a_ops.adapter_read(fib,cmd,lba,count)
1171
1172#define aac_adapter_write(fib,cmd,lba,count,fua) \
1173 ((fib)->dev)->a_ops.adapter_write(fib,cmd,lba,count,fua)
1174
1175#define aac_adapter_scsi(fib,cmd) \
1176 ((fib)->dev)->a_ops.adapter_scsi(fib,cmd)
1177
1178#define aac_adapter_comm(dev,comm) \
1179 (dev)->a_ops.adapter_comm(dev, comm)
1180
1181#define FIB_CONTEXT_FLAG_TIMED_OUT (0x00000001)
1182#define FIB_CONTEXT_FLAG (0x00000002)
1183#define FIB_CONTEXT_FLAG_WAIT (0x00000004)
1184
1185
1186
1187
1188
1189#define Null 0
1190#define GetAttributes 1
1191#define SetAttributes 2
1192#define Lookup 3
1193#define ReadLink 4
1194#define Read 5
1195#define Write 6
1196#define Create 7
1197#define MakeDirectory 8
1198#define SymbolicLink 9
1199#define MakeNode 10
1200#define Removex 11
1201#define RemoveDirectoryx 12
1202#define Rename 13
1203#define Link 14
1204#define ReadDirectory 15
1205#define ReadDirectoryPlus 16
1206#define FileSystemStatus 17
1207#define FileSystemInfo 18
1208#define PathConfigure 19
1209#define Commit 20
1210#define Mount 21
1211#define UnMount 22
1212#define Newfs 23
1213#define FsCheck 24
1214#define FsSync 25
1215#define SimReadWrite 26
1216#define SetFileSystemStatus 27
1217#define BlockRead 28
1218#define BlockWrite 29
1219#define NvramIoctl 30
1220#define FsSyncWait 31
1221#define ClearArchiveBit 32
1222#define SetAcl 33
1223#define GetAcl 34
1224#define AssignAcl 35
1225#define FaultInsertion 36
1226#define CrazyCache 37
1227
1228#define MAX_FSACOMMAND_NUM 38
1229
1230
1231
1232
1233
1234
1235
1236#define ST_OK 0
1237#define ST_PERM 1
1238#define ST_NOENT 2
1239#define ST_IO 5
1240#define ST_NXIO 6
1241#define ST_E2BIG 7
1242#define ST_ACCES 13
1243#define ST_EXIST 17
1244#define ST_XDEV 18
1245#define ST_NODEV 19
1246#define ST_NOTDIR 20
1247#define ST_ISDIR 21
1248#define ST_INVAL 22
1249#define ST_FBIG 27
1250#define ST_NOSPC 28
1251#define ST_ROFS 30
1252#define ST_MLINK 31
1253#define ST_WOULDBLOCK 35
1254#define ST_NAMETOOLONG 63
1255#define ST_NOTEMPTY 66
1256#define ST_DQUOT 69
1257#define ST_STALE 70
1258#define ST_REMOTE 71
1259#define ST_NOT_READY 72
1260#define ST_BADHANDLE 10001
1261#define ST_NOT_SYNC 10002
1262#define ST_BAD_COOKIE 10003
1263#define ST_NOTSUPP 10004
1264#define ST_TOOSMALL 10005
1265#define ST_SERVERFAULT 10006
1266#define ST_BADTYPE 10007
1267#define ST_JUKEBOX 10008
1268#define ST_NOTMOUNTED 10009
1269#define ST_MAINTMODE 10010
1270#define ST_STALEACL 10011
1271
1272
1273
1274
1275
1276#define CACHE_CSTABLE 1
1277#define CACHE_UNSTABLE 2
1278
1279
1280
1281
1282
1283
1284#define CMFILE_SYNCH_NVRAM 1
1285#define CMDATA_SYNCH_NVRAM 2
1286#define CMFILE_SYNCH 3
1287#define CMDATA_SYNCH 4
1288#define CMUNSTABLE 5
1289
1290struct aac_read
1291{
1292 __le32 command;
1293 __le32 cid;
1294 __le32 block;
1295 __le32 count;
1296 struct sgmap sg;
1297};
1298
1299struct aac_read64
1300{
1301 __le32 command;
1302 __le16 cid;
1303 __le16 sector_count;
1304 __le32 block;
1305 __le16 pad;
1306 __le16 flags;
1307 struct sgmap64 sg;
1308};
1309
1310struct aac_read_reply
1311{
1312 __le32 status;
1313 __le32 count;
1314};
1315
1316struct aac_write
1317{
1318 __le32 command;
1319 __le32 cid;
1320 __le32 block;
1321 __le32 count;
1322 __le32 stable;
1323 struct sgmap sg;
1324};
1325
1326struct aac_write64
1327{
1328 __le32 command;
1329 __le16 cid;
1330 __le16 sector_count;
1331 __le32 block;
1332 __le16 pad;
1333 __le16 flags;
1334#define IO_TYPE_WRITE 0x00000000
1335#define IO_TYPE_READ 0x00000001
1336#define IO_SUREWRITE 0x00000008
1337 struct sgmap64 sg;
1338};
1339struct aac_write_reply
1340{
1341 __le32 status;
1342 __le32 count;
1343 __le32 committed;
1344};
1345
1346struct aac_raw_io
1347{
1348 __le32 block[2];
1349 __le32 count;
1350 __le16 cid;
1351 __le16 flags;
1352 __le16 bpTotal;
1353 __le16 bpComplete;
1354 struct sgmapraw sg;
1355};
1356
1357#define CT_FLUSH_CACHE 129
1358struct aac_synchronize {
1359 __le32 command;
1360 __le32 type;
1361 __le32 cid;
1362 __le32 parm1;
1363 __le32 parm2;
1364 __le32 parm3;
1365 __le32 parm4;
1366 __le32 count;
1367};
1368
1369struct aac_synchronize_reply {
1370 __le32 dummy0;
1371 __le32 dummy1;
1372 __le32 status;
1373 __le32 parm1;
1374 __le32 parm2;
1375 __le32 parm3;
1376 __le32 parm4;
1377 __le32 parm5;
1378 u8 data[16];
1379};
1380
1381#define CT_POWER_MANAGEMENT 245
1382#define CT_PM_START_UNIT 2
1383#define CT_PM_STOP_UNIT 3
1384#define CT_PM_UNIT_IMMEDIATE 1
1385struct aac_power_management {
1386 __le32 command;
1387 __le32 type;
1388 __le32 sub;
1389 __le32 cid;
1390 __le32 parm;
1391};
1392
1393#define CT_PAUSE_IO 65
1394#define CT_RELEASE_IO 66
1395struct aac_pause {
1396 __le32 command;
1397 __le32 type;
1398 __le32 timeout;
1399 __le32 min;
1400 __le32 noRescan;
1401 __le32 parm3;
1402 __le32 parm4;
1403 __le32 count;
1404};
1405
1406struct aac_srb
1407{
1408 __le32 function;
1409 __le32 channel;
1410 __le32 id;
1411 __le32 lun;
1412 __le32 timeout;
1413 __le32 flags;
1414 __le32 count;
1415 __le32 retry_limit;
1416 __le32 cdb_size;
1417 u8 cdb[16];
1418 struct sgmap sg;
1419};
1420
1421
1422
1423
1424
1425struct user_aac_srb
1426{
1427 u32 function;
1428 u32 channel;
1429 u32 id;
1430 u32 lun;
1431 u32 timeout;
1432 u32 flags;
1433 u32 count;
1434 u32 retry_limit;
1435 u32 cdb_size;
1436 u8 cdb[16];
1437 struct user_sgmap sg;
1438};
1439
1440#define AAC_SENSE_BUFFERSIZE 30
1441
1442struct aac_srb_reply
1443{
1444 __le32 status;
1445 __le32 srb_status;
1446 __le32 scsi_status;
1447 __le32 data_xfer_length;
1448 __le32 sense_data_size;
1449 u8 sense_data[AAC_SENSE_BUFFERSIZE];
1450};
1451
1452
1453
1454#define SRB_NoDataXfer 0x0000
1455#define SRB_DisableDisconnect 0x0004
1456#define SRB_DisableSynchTransfer 0x0008
1457#define SRB_BypassFrozenQueue 0x0010
1458#define SRB_DisableAutosense 0x0020
1459#define SRB_DataIn 0x0040
1460#define SRB_DataOut 0x0080
1461
1462
1463
1464
1465#define SRBF_ExecuteScsi 0x0000
1466#define SRBF_ClaimDevice 0x0001
1467#define SRBF_IO_Control 0x0002
1468#define SRBF_ReceiveEvent 0x0003
1469#define SRBF_ReleaseQueue 0x0004
1470#define SRBF_AttachDevice 0x0005
1471#define SRBF_ReleaseDevice 0x0006
1472#define SRBF_Shutdown 0x0007
1473#define SRBF_Flush 0x0008
1474#define SRBF_AbortCommand 0x0010
1475#define SRBF_ReleaseRecovery 0x0011
1476#define SRBF_ResetBus 0x0012
1477#define SRBF_ResetDevice 0x0013
1478#define SRBF_TerminateIO 0x0014
1479#define SRBF_FlushQueue 0x0015
1480#define SRBF_RemoveDevice 0x0016
1481#define SRBF_DomainValidation 0x0017
1482
1483
1484
1485
1486#define SRB_STATUS_PENDING 0x00
1487#define SRB_STATUS_SUCCESS 0x01
1488#define SRB_STATUS_ABORTED 0x02
1489#define SRB_STATUS_ABORT_FAILED 0x03
1490#define SRB_STATUS_ERROR 0x04
1491#define SRB_STATUS_BUSY 0x05
1492#define SRB_STATUS_INVALID_REQUEST 0x06
1493#define SRB_STATUS_INVALID_PATH_ID 0x07
1494#define SRB_STATUS_NO_DEVICE 0x08
1495#define SRB_STATUS_TIMEOUT 0x09
1496#define SRB_STATUS_SELECTION_TIMEOUT 0x0A
1497#define SRB_STATUS_COMMAND_TIMEOUT 0x0B
1498#define SRB_STATUS_MESSAGE_REJECTED 0x0D
1499#define SRB_STATUS_BUS_RESET 0x0E
1500#define SRB_STATUS_PARITY_ERROR 0x0F
1501#define SRB_STATUS_REQUEST_SENSE_FAILED 0x10
1502#define SRB_STATUS_NO_HBA 0x11
1503#define SRB_STATUS_DATA_OVERRUN 0x12
1504#define SRB_STATUS_UNEXPECTED_BUS_FREE 0x13
1505#define SRB_STATUS_PHASE_SEQUENCE_FAILURE 0x14
1506#define SRB_STATUS_BAD_SRB_BLOCK_LENGTH 0x15
1507#define SRB_STATUS_REQUEST_FLUSHED 0x16
1508#define SRB_STATUS_DELAYED_RETRY 0x17
1509#define SRB_STATUS_INVALID_LUN 0x20
1510#define SRB_STATUS_INVALID_TARGET_ID 0x21
1511#define SRB_STATUS_BAD_FUNCTION 0x22
1512#define SRB_STATUS_ERROR_RECOVERY 0x23
1513#define SRB_STATUS_NOT_STARTED 0x24
1514#define SRB_STATUS_NOT_IN_USE 0x30
1515#define SRB_STATUS_FORCE_ABORT 0x31
1516#define SRB_STATUS_DOMAIN_VALIDATION_FAIL 0x32
1517
1518
1519
1520
1521
1522#define VM_Null 0
1523#define VM_NameServe 1
1524#define VM_ContainerConfig 2
1525#define VM_Ioctl 3
1526#define VM_FilesystemIoctl 4
1527#define VM_CloseAll 5
1528#define VM_CtBlockRead 6
1529#define VM_CtBlockWrite 7
1530#define VM_SliceBlockRead 8
1531#define VM_SliceBlockWrite 9
1532#define VM_DriveBlockRead 10
1533#define VM_DriveBlockWrite 11
1534#define VM_EnclosureMgt 12
1535#define VM_Unused 13
1536#define VM_CtBlockVerify 14
1537#define VM_CtPerf 15
1538#define VM_CtBlockRead64 16
1539#define VM_CtBlockWrite64 17
1540#define VM_CtBlockVerify64 18
1541#define VM_CtHostRead64 19
1542#define VM_CtHostWrite64 20
1543#define VM_DrvErrTblLog 21
1544#define VM_NameServe64 22
1545
1546#define MAX_VMCOMMAND_NUM 23
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556struct aac_fsinfo {
1557 __le32 fsTotalSize;
1558 __le32 fsBlockSize;
1559 __le32 fsFragSize;
1560 __le32 fsMaxExtendSize;
1561 __le32 fsSpaceUnits;
1562 __le32 fsMaxNumFiles;
1563 __le32 fsNumFreeFiles;
1564 __le32 fsInodeDensity;
1565};
1566
1567union aac_contentinfo {
1568 struct aac_fsinfo filesys;
1569};
1570
1571
1572
1573
1574
1575#define CT_GET_CONFIG_STATUS 147
1576struct aac_get_config_status {
1577 __le32 command;
1578 __le32 type;
1579 __le32 parm1;
1580 __le32 parm2;
1581 __le32 parm3;
1582 __le32 parm4;
1583 __le32 parm5;
1584 __le32 count;
1585};
1586
1587#define CFACT_CONTINUE 0
1588#define CFACT_PAUSE 1
1589#define CFACT_ABORT 2
1590struct aac_get_config_status_resp {
1591 __le32 response;
1592 __le32 dummy0;
1593 __le32 status;
1594 __le32 parm1;
1595 __le32 parm2;
1596 __le32 parm3;
1597 __le32 parm4;
1598 __le32 parm5;
1599 struct {
1600 __le32 action;
1601 __le16 flags;
1602 __le16 count;
1603 } data;
1604};
1605
1606
1607
1608
1609
1610#define CT_COMMIT_CONFIG 152
1611
1612struct aac_commit_config {
1613 __le32 command;
1614 __le32 type;
1615};
1616
1617
1618
1619
1620
1621#define CT_GET_CONTAINER_COUNT 4
1622struct aac_get_container_count {
1623 __le32 command;
1624 __le32 type;
1625};
1626
1627struct aac_get_container_count_resp {
1628 __le32 response;
1629 __le32 dummy0;
1630 __le32 MaxContainers;
1631 __le32 ContainerSwitchEntries;
1632 __le32 MaxPartitions;
1633};
1634
1635
1636
1637
1638
1639
1640
1641struct aac_mntent {
1642 __le32 oid;
1643 u8 name[16];
1644 struct creation_info create_info;
1645 __le32 capacity;
1646 __le32 vol;
1647 __le32 obj;
1648 __le32 state;
1649
1650 union aac_contentinfo fileinfo;
1651
1652 __le32 altoid;
1653
1654 __le32 capacityhigh;
1655};
1656
1657#define FSCS_NOTCLEAN 0x0001
1658#define FSCS_READONLY 0x0002
1659#define FSCS_HIDDEN 0x0004
1660#define FSCS_NOT_READY 0x0008
1661
1662struct aac_query_mount {
1663 __le32 command;
1664 __le32 type;
1665 __le32 count;
1666};
1667
1668struct aac_mount {
1669 __le32 status;
1670 __le32 type;
1671 __le32 count;
1672 struct aac_mntent mnt[1];
1673};
1674
1675#define CT_READ_NAME 130
1676struct aac_get_name {
1677 __le32 command;
1678 __le32 type;
1679 __le32 cid;
1680 __le32 parm1;
1681 __le32 parm2;
1682 __le32 parm3;
1683 __le32 parm4;
1684 __le32 count;
1685};
1686
1687struct aac_get_name_resp {
1688 __le32 dummy0;
1689 __le32 dummy1;
1690 __le32 status;
1691 __le32 parm1;
1692 __le32 parm2;
1693 __le32 parm3;
1694 __le32 parm4;
1695 __le32 parm5;
1696 u8 data[16];
1697};
1698
1699#define CT_CID_TO_32BITS_UID 165
1700struct aac_get_serial {
1701 __le32 command;
1702 __le32 type;
1703 __le32 cid;
1704};
1705
1706struct aac_get_serial_resp {
1707 __le32 dummy0;
1708 __le32 dummy1;
1709 __le32 status;
1710 __le32 uid;
1711};
1712
1713
1714
1715
1716
1717struct aac_close {
1718 __le32 command;
1719 __le32 cid;
1720};
1721
1722struct aac_query_disk
1723{
1724 s32 cnum;
1725 s32 bus;
1726 s32 id;
1727 s32 lun;
1728 u32 valid;
1729 u32 locked;
1730 u32 deleted;
1731 s32 instance;
1732 s8 name[10];
1733 u32 unmapped;
1734};
1735
1736struct aac_delete_disk {
1737 u32 disknum;
1738 u32 cnum;
1739};
1740
1741struct fib_ioctl
1742{
1743 u32 fibctx;
1744 s32 wait;
1745 char __user *fib;
1746};
1747
1748struct revision
1749{
1750 u32 compat;
1751 __le32 version;
1752 __le32 build;
1753};
1754
1755
1756
1757
1758
1759
1760#define CTL_CODE(function, method) ( \
1761 (4<< 16) | ((function) << 2) | (method) \
1762)
1763
1764
1765
1766
1767
1768
1769#define METHOD_BUFFERED 0
1770#define METHOD_NEITHER 3
1771
1772
1773
1774
1775
1776#define FSACTL_SENDFIB CTL_CODE(2050, METHOD_BUFFERED)
1777#define FSACTL_SEND_RAW_SRB CTL_CODE(2067, METHOD_BUFFERED)
1778#define FSACTL_DELETE_DISK 0x163
1779#define FSACTL_QUERY_DISK 0x173
1780#define FSACTL_OPEN_GET_ADAPTER_FIB CTL_CODE(2100, METHOD_BUFFERED)
1781#define FSACTL_GET_NEXT_ADAPTER_FIB CTL_CODE(2101, METHOD_BUFFERED)
1782#define FSACTL_CLOSE_GET_ADAPTER_FIB CTL_CODE(2102, METHOD_BUFFERED)
1783#define FSACTL_MINIPORT_REV_CHECK CTL_CODE(2107, METHOD_BUFFERED)
1784#define FSACTL_GET_PCI_INFO CTL_CODE(2119, METHOD_BUFFERED)
1785#define FSACTL_FORCE_DELETE_DISK CTL_CODE(2120, METHOD_NEITHER)
1786#define FSACTL_GET_CONTAINERS 2131
1787#define FSACTL_SEND_LARGE_FIB CTL_CODE(2138, METHOD_BUFFERED)
1788
1789
1790struct aac_common
1791{
1792
1793
1794
1795
1796 u32 irq_mod;
1797 u32 peak_fibs;
1798 u32 zero_fibs;
1799 u32 fib_timeouts;
1800
1801
1802
1803#ifdef DBG
1804 u32 FibsSent;
1805 u32 FibRecved;
1806 u32 NoResponseSent;
1807 u32 NoResponseRecved;
1808 u32 AsyncSent;
1809 u32 AsyncRecved;
1810 u32 NormalSent;
1811 u32 NormalRecved;
1812#endif
1813};
1814
1815extern struct aac_common aac_config;
1816
1817
1818
1819
1820
1821
1822
1823#ifdef DBG
1824#define FIB_COUNTER_INCREMENT(counter) (counter)++
1825#else
1826#define FIB_COUNTER_INCREMENT(counter)
1827#endif
1828
1829
1830
1831
1832
1833
1834#define BREAKPOINT_REQUEST 0x00000004
1835#define INIT_STRUCT_BASE_ADDRESS 0x00000005
1836#define READ_PERMANENT_PARAMETERS 0x0000000a
1837#define WRITE_PERMANENT_PARAMETERS 0x0000000b
1838#define HOST_CRASHING 0x0000000d
1839#define SEND_SYNCHRONOUS_FIB 0x0000000c
1840#define COMMAND_POST_RESULTS 0x00000014
1841#define GET_ADAPTER_PROPERTIES 0x00000019
1842#define GET_DRIVER_BUFFER_PROPERTIES 0x00000023
1843#define RCV_TEMP_READINGS 0x00000025
1844#define GET_COMM_PREFERRED_SETTINGS 0x00000026
1845#define IOP_RESET 0x00001000
1846#define IOP_RESET_ALWAYS 0x00001001
1847#define RE_INIT_ADAPTER 0x000000ee
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870#define SELF_TEST_FAILED 0x00000004
1871#define MONITOR_PANIC 0x00000020
1872#define KERNEL_UP_AND_RUNNING 0x00000080
1873#define KERNEL_PANIC 0x00000100
1874
1875
1876
1877
1878
1879#define DoorBellSyncCmdAvailable (1<<0)
1880#define DoorBellPrintfDone (1<<5)
1881#define DoorBellAdapterNormCmdReady (1<<1)
1882#define DoorBellAdapterNormRespReady (1<<2)
1883#define DoorBellAdapterNormCmdNotFull (1<<3)
1884#define DoorBellAdapterNormRespNotFull (1<<4)
1885#define DoorBellPrintfReady (1<<5)
1886#define DoorBellAifPending (1<<6)
1887
1888
1889#define PmDoorBellResponseSent (1<<1)
1890
1891
1892
1893
1894
1895
1896#define AifCmdEventNotify 1
1897#define AifEnConfigChange 3
1898#define AifEnContainerChange 4
1899#define AifEnDeviceFailure 5
1900#define AifEnEnclosureManagement 13
1901#define EM_DRIVE_INSERTION 31
1902#define EM_DRIVE_REMOVAL 32
1903#define AifEnBatteryEvent 14
1904#define AifEnAddContainer 15
1905#define AifEnDeleteContainer 16
1906#define AifEnExpEvent 23
1907#define AifExeFirmwarePanic 3
1908#define AifHighPriority 3
1909#define AifEnAddJBOD 30
1910#define AifEnDeleteJBOD 31
1911
1912#define AifCmdJobProgress 2
1913#define AifJobCtrZero 101
1914#define AifJobStsSuccess 1
1915#define AifJobStsRunning 102
1916#define AifCmdAPIReport 3
1917#define AifCmdDriverNotify 4
1918#define AifDenMorphComplete 200
1919#define AifDenVolumeExtendComplete 201
1920#define AifReqJobList 100
1921#define AifReqJobsForCtr 101
1922#define AifReqJobsForScsi 102
1923#define AifReqJobReport 103
1924#define AifReqTerminateJob 104
1925#define AifReqSuspendJob 105
1926#define AifReqResumeJob 106
1927#define AifReqSendAPIReport 107
1928#define AifReqAPIJobStart 108
1929#define AifReqAPIJobUpdate 109
1930#define AifReqAPIJobFinish 110
1931
1932
1933#define AifReqEvent 200
1934
1935
1936
1937
1938
1939
1940
1941struct aac_aifcmd {
1942 __le32 command;
1943 __le32 seqnum;
1944 u8 data[1];
1945};
1946
1947
1948
1949
1950
1951
1952static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor)
1953{
1954 sector_div(capacity, divisor);
1955 return capacity;
1956}
1957
1958
1959#define AAC_OWNER_MIDLEVEL 0x101
1960#define AAC_OWNER_LOWLEVEL 0x102
1961#define AAC_OWNER_ERROR_HANDLER 0x103
1962#define AAC_OWNER_FIRMWARE 0x106
1963
1964const char *aac_driverinfo(struct Scsi_Host *);
1965struct fib *aac_fib_alloc(struct aac_dev *dev);
1966int aac_fib_setup(struct aac_dev *dev);
1967void aac_fib_map_free(struct aac_dev *dev);
1968void aac_fib_free(struct fib * context);
1969void aac_fib_init(struct fib * context);
1970void aac_printf(struct aac_dev *dev, u32 val);
1971int aac_fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt);
1972int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry);
1973void aac_consumer_free(struct aac_dev * dev, struct aac_queue * q, u32 qnum);
1974int aac_fib_complete(struct fib * context);
1975#define fib_data(fibctx) ((void *)(fibctx)->hw_fib_va->data)
1976struct aac_dev *aac_init_adapter(struct aac_dev *dev);
1977int aac_get_config_status(struct aac_dev *dev, int commit_flag);
1978int aac_get_containers(struct aac_dev *dev);
1979int aac_scsi_cmd(struct scsi_cmnd *cmd);
1980int aac_dev_ioctl(struct aac_dev *dev, int cmd, void __user *arg);
1981#ifndef shost_to_class
1982#define shost_to_class(shost) &shost->shost_dev
1983#endif
1984ssize_t aac_get_serial_number(struct device *dev, char *buf);
1985int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg);
1986int aac_rx_init(struct aac_dev *dev);
1987int aac_rkt_init(struct aac_dev *dev);
1988int aac_nark_init(struct aac_dev *dev);
1989int aac_sa_init(struct aac_dev *dev);
1990int aac_src_init(struct aac_dev *dev);
1991int aac_srcv_init(struct aac_dev *dev);
1992int aac_queue_get(struct aac_dev * dev, u32 * index, u32 qid, struct hw_fib * hw_fib, int wait, struct fib * fibptr, unsigned long *nonotify);
1993unsigned int aac_response_normal(struct aac_queue * q);
1994unsigned int aac_command_normal(struct aac_queue * q);
1995unsigned int aac_intr_normal(struct aac_dev *dev, u32 Index,
1996 int isAif, int isFastResponse,
1997 struct hw_fib *aif_fib);
1998int aac_reset_adapter(struct aac_dev * dev, int forced);
1999int aac_check_health(struct aac_dev * dev);
2000int aac_command_thread(void *data);
2001int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx);
2002int aac_fib_adapter_complete(struct fib * fibptr, unsigned short size);
2003struct aac_driver_ident* aac_get_driver_ident(int devtype);
2004int aac_get_adapter_info(struct aac_dev* dev);
2005int aac_send_shutdown(struct aac_dev *dev);
2006int aac_probe_container(struct aac_dev *dev, int cid);
2007int _aac_rx_init(struct aac_dev *dev);
2008int aac_rx_select_comm(struct aac_dev *dev, int comm);
2009int aac_rx_deliver_producer(struct fib * fib);
2010char * get_container_type(unsigned type);
2011extern int numacb;
2012extern int acbsize;
2013extern char aac_driver_version[];
2014extern int startup_timeout;
2015extern int aif_timeout;
2016extern int expose_physicals;
2017extern int aac_reset_devices;
2018extern int aac_msi;
2019extern int aac_commit;
2020extern int update_interval;
2021extern int check_interval;
2022extern int aac_check_reset;
2023