aacraid.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:39k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #define dprintk(x)
  2. /*#define dprintk(x) printk x */
  3. /*------------------------------------------------------------------------------
  4.  *              D E F I N E S
  5.  *----------------------------------------------------------------------------*/
  6. #define MAXIMUM_NUM_CONTAINERS 31
  7. #define MAXIMUM_NUM_ADAPTERS 8
  8. #define AAC_NUM_FIB 578
  9. #define AAC_NUM_IO_FIB 512
  10. #define AAC_MAX_TARGET (MAXIMUM_NUM_CONTAINERS+1)
  11. //#define AAC_MAX_TARGET  (16)
  12. #define AAC_MAX_LUN (8)
  13. /*
  14.  * These macros convert from physical channels to virtual channels
  15.  */
  16. #define CONTAINER_CHANNEL (0)
  17. #define aac_phys_to_logical(x)  (x+1)
  18. #define aac_logical_to_phys(x)  (x?x-1:0)
  19. #define AAC_DETAILED_STATUS_INFO
  20. struct diskparm
  21. {
  22. int heads;
  23. int sectors;
  24. int cylinders;
  25. };
  26. /*
  27.  * DON'T CHANGE THE ORDER, this is set by the firmware
  28.  */
  29.  
  30. #define CT_NONE 0
  31. #define CT_VOLUME 1
  32. #define CT_MIRROR 2
  33. #define CT_STRIPE 3
  34. #define CT_RAID5 4
  35. #define CT_SSRW 5
  36. #define CT_SSRO 6
  37. #define CT_MORPH 7
  38. #define CT_PASSTHRU 8
  39. #define CT_RAID4 9
  40. #define CT_RAID10 10 /* stripe of mirror */
  41. #define CT_RAID00 11 /* stripe of stripe */
  42. #define CT_VOLUME_OF_MIRRORS 12 /* volume of mirror */
  43. #define CT_PSEUDO_RAID 13 /* really raid4 */
  44. #define CT_LAST_VOLUME_TYPE 14
  45. /*
  46.  * Types of objects addressable in some fashion by the client.
  47.  * This is a superset of those objects handled just by the filesystem
  48.  * and includes "raw" objects that an administrator would use to
  49.  * configure containers and filesystems.
  50.  */
  51. #define FT_REG 1 /* regular file */
  52. #define FT_DIR 2 /* directory */
  53. #define FT_BLK 3 /* "block" device - reserved */
  54. #define FT_CHR 4 /* "character special" device - reserved */
  55. #define FT_LNK 5 /* symbolic link */
  56. #define FT_SOCK 6 /* socket */
  57. #define FT_FIFO 7 /* fifo */
  58. #define FT_FILESYS 8 /* ADAPTEC's "FSA"(tm) filesystem */
  59. #define FT_DRIVE 9 /* physical disk - addressable in scsi by bus/target/lun */
  60. #define FT_SLICE 10 /* virtual disk - raw volume - slice */
  61. #define FT_PARTITION 11 /* FSA partition - carved out of a slice - building block for containers */
  62. #define FT_VOLUME 12 /* Container - Volume Set */
  63. #define FT_STRIPE 13 /* Container - Stripe Set */
  64. #define FT_MIRROR 14 /* Container - Mirror Set */
  65. #define FT_RAID5 15 /* Container - Raid 5 Set */
  66. #define FT_DATABASE 16 /* Storage object with "foreign" content manager */
  67. /*
  68.  * Host side memory scatter gather list
  69.  * Used by the adapter for read, write, and readdirplus operations
  70.  * We have seperate 32 and 64 bit version because even
  71.  * on 64 bit systems not all cards support the 64 bit version
  72.  */
  73. struct sgentry {
  74. u32 addr; /* 32-bit address. */
  75. u32 count; /* Length. */
  76. };
  77. struct sgentry64 {
  78. u32 addr[2]; /* 64-bit addr. 2 pieces for data alignment */
  79. u32 count; /* Length. */
  80. };
  81. /*
  82.  * SGMAP
  83.  *
  84.  * This is the SGMAP structure for all commands that use
  85.  * 32-bit addressing.
  86.  */
  87. struct sgmap {
  88. u32 count;
  89. struct sgentry sg[1]; 
  90. };
  91. struct sgmap64 {
  92. u32 count;
  93. struct sgentry64 sg[1];
  94. };
  95. struct creation_info
  96. {
  97. u8  buildnum; /* e.g., 588 */
  98. u8  usec; /* e.g., 588 */
  99. u8   via; /* e.g., 1 = FSU,
  100.  *   2 = API
  101.  */
  102. u8   year;   /* e.g., 1997 = 97 */
  103. u32 date; /*
  104.  * unsigned  Month :4; // 1 - 12
  105.  * unsigned  Day :6; // 1 - 32
  106.  * unsigned  Hour :6; // 0 - 23
  107.  * unsigned  Minute :6; // 0 - 60
  108.  * unsigned  Second :6; // 0 - 60
  109.  */
  110. u32 serial[2]; /* e.g., 0x1DEADB0BFAFAF001 */
  111. };
  112. /*
  113.  * Define all the constants needed for the communication interface
  114.  */
  115. /*
  116.  * Define how many queue entries each queue will have and the total
  117.  * number of entries for the entire communication interface. Also define
  118.  * how many queues we support.
  119.  *
  120.  * This has to match the controller
  121.  */
  122. #define NUMBER_OF_COMM_QUEUES  8   // 4 command; 4 response
  123. #define HOST_HIGH_CMD_ENTRIES  4
  124. #define HOST_NORM_CMD_ENTRIES  8
  125. #define ADAP_HIGH_CMD_ENTRIES  4
  126. #define ADAP_NORM_CMD_ENTRIES  512
  127. #define HOST_HIGH_RESP_ENTRIES 4
  128. #define HOST_NORM_RESP_ENTRIES 512
  129. #define ADAP_HIGH_RESP_ENTRIES 4
  130. #define ADAP_NORM_RESP_ENTRIES 8
  131. #define TOTAL_QUEUE_ENTRIES  
  132.     (HOST_NORM_CMD_ENTRIES + HOST_HIGH_CMD_ENTRIES + ADAP_NORM_CMD_ENTRIES + ADAP_HIGH_CMD_ENTRIES + 
  133.     HOST_NORM_RESP_ENTRIES + HOST_HIGH_RESP_ENTRIES + ADAP_NORM_RESP_ENTRIES + ADAP_HIGH_RESP_ENTRIES)
  134. /*
  135.  * Set the queues on a 16 byte alignment
  136.  */
  137.  
  138. #define QUEUE_ALIGNMENT 16
  139. /*
  140.  * The queue headers define the Communication Region queues. These
  141.  * are physically contiguous and accessible by both the adapter and the
  142.  * host. Even though all queue headers are in the same contiguous block
  143.  * they will be represented as individual units in the data structures.
  144.  */
  145. struct aac_entry {
  146. u32 size;          /* Size in bytes of Fib which this QE points to */
  147. u32 addr; /* Receiver address of the FIB */
  148. };
  149. /*
  150.  * The adapter assumes the ProducerIndex and ConsumerIndex are grouped
  151.  * adjacently and in that order.
  152.  */
  153.  
  154. struct aac_qhdr {
  155. u64 header_addr; /* Address to hand the adapter to access to this queue head */
  156. u32 *producer; /* The producer index for this queue (host address) */
  157. u32 *consumer; /* The consumer index for this queue (host address) */
  158. };
  159. /*
  160.  * Define all the events which the adapter would like to notify
  161.  * the host of.
  162.  */
  163.  
  164. #define HostNormCmdQue 1 /* Change in host normal priority command queue */
  165. #define HostHighCmdQue 2 /* Change in host high priority command queue */
  166. #define HostNormRespQue 3 /* Change in host normal priority response queue */
  167. #define HostHighRespQue 4 /* Change in host high priority response queue */
  168. #define AdapNormRespNotFull 5
  169. #define AdapHighRespNotFull 6
  170. #define AdapNormCmdNotFull 7
  171. #define AdapHighCmdNotFull 8
  172. #define SynchCommandComplete 9
  173. #define AdapInternalError 0xfe    /* The adapter detected an internal error shutting down */
  174. /*
  175.  * Define all the events the host wishes to notify the
  176.  * adapter of. The first four values much match the Qid the
  177.  * corresponding queue.
  178.  */
  179. #define AdapNormCmdQue 2
  180. #define AdapHighCmdQue 3
  181. #define AdapNormRespQue 6
  182. #define AdapHighRespQue 7
  183. #define HostShutdown 8
  184. #define HostPowerFail 9
  185. #define FatalCommError 10
  186. #define HostNormRespNotFull 11
  187. #define HostHighRespNotFull 12
  188. #define HostNormCmdNotFull 13
  189. #define HostHighCmdNotFull 14
  190. #define FastIo 15
  191. #define AdapPrintfDone 16
  192. /*
  193.  * Define all the queues that the adapter and host use to communicate
  194.  * Number them to match the physical queue layout.
  195.  */
  196. enum aac_queue_types {
  197.         HostNormCmdQueue = 0, /* Adapter to host normal priority command traffic */
  198.         HostHighCmdQueue, /* Adapter to host high priority command traffic */
  199.         AdapNormCmdQueue, /* Host to adapter normal priority command traffic */
  200.         AdapHighCmdQueue, /* Host to adapter high priority command traffic */
  201.         HostNormRespQueue, /* Adapter to host normal priority response traffic */
  202.         HostHighRespQueue, /* Adapter to host high priority response traffic */
  203.         AdapNormRespQueue, /* Host to adapter normal priority response traffic */
  204.         AdapHighRespQueue /* Host to adapter high priority response traffic */
  205. };
  206. /*
  207.  * Assign type values to the FSA communication data structures
  208.  */
  209. #define FIB_MAGIC 0x0001
  210. /*
  211.  * Define the priority levels the FSA communication routines support.
  212.  */
  213. #define FsaNormal 1
  214. #define FsaHigh 2
  215. /*
  216.  * Define the FIB. The FIB is the where all the requested data and
  217.  * command information are put to the application on the FSA adapter.
  218.  */
  219. struct aac_fibhdr {
  220. u32 XferState; // Current transfer state for this CCB
  221. u16 Command; // Routing information for the destination
  222. u8 StructType; // Type FIB
  223. u8 Flags; // Flags for FIB
  224. u16 Size; // Size of this FIB in bytes
  225. u16 SenderSize; // Size of the FIB in the sender (for response sizing)
  226. u32 SenderFibAddress; // Host defined data in the FIB
  227. u32 ReceiverFibAddress; // Logical address of this FIB for the adapter
  228. u32 SenderData; // Place holder for the sender to store data
  229. union {
  230. struct {
  231.     u32 _ReceiverTimeStart;  // Timestamp for receipt of fib
  232.     u32 _ReceiverTimeDone; // Timestamp for completion of fib
  233. } _s;
  234. struct list_head _FibLinks; // Used to link Adapter Initiated Fibs on the host
  235. } _u;
  236. };
  237. #define FibLinks _u._FibLinks
  238. #define FIB_DATA_SIZE_IN_BYTES (512 - sizeof(struct aac_fibhdr))
  239. struct hw_fib {
  240. struct aac_fibhdr header;
  241. u8 data[FIB_DATA_SIZE_IN_BYTES]; // Command specific data
  242. };
  243. /*
  244.  * FIB commands
  245.  */
  246. #define  TestCommandResponse 1
  247. #define TestAdapterCommand 2
  248. /*
  249.  * Lowlevel and comm commands
  250.  */
  251. #define LastTestCommand 100
  252. #define ReinitHostNormCommandQueue 101
  253. #define ReinitHostHighCommandQueue 102
  254. #define ReinitHostHighRespQueue 103
  255. #define ReinitHostNormRespQueue 104
  256. #define ReinitAdapNormCommandQueue 105
  257. #define ReinitAdapHighCommandQueue 107
  258. #define ReinitAdapHighRespQueue 108
  259. #define ReinitAdapNormRespQueue 109
  260. #define InterfaceShutdown 110
  261. #define DmaCommandFib 120
  262. #define StartProfile 121
  263. #define TermProfile 122
  264. #define SpeedTest 123
  265. #define TakeABreakPt 124
  266. #define RequestPerfData 125
  267. #define SetInterruptDefTimer 126
  268. #define SetInterruptDefCount 127
  269. #define GetInterruptDefStatus 128
  270. #define LastCommCommand 129
  271. /*
  272.  * Filesystem commands
  273.  */
  274. #define NuFileSystem 300
  275. #define UFS 301
  276. #define HostFileSystem 302
  277. #define LastFileSystemCommand 303
  278. /*
  279.  * Container Commands
  280.  */
  281. #define ContainerCommand 500
  282. #define ContainerCommand64 501
  283. /*
  284.  * Cluster Commands
  285.  */
  286. #define ClusterCommand   550
  287. /*
  288.  * Scsi Port commands (scsi passthrough)
  289.  */
  290. #define ScsiPortCommand 600
  291. #define ScsiPortCommand64 601
  292. /*
  293.  * Misc house keeping and generic adapter initiated commands
  294.  */
  295. #define AifRequest 700
  296. #define CheckRevision 701
  297. #define FsaHostShutdown 702
  298. #define RequestAdapterInfo 703
  299. #define IsAdapterPaused 704
  300. #define SendHostTime 705
  301. #define LastMiscCommand 706
  302. //
  303. // Commands that will target the failover level on the FSA adapter
  304. //
  305. enum fib_xfer_state {
  306. HostOwned  = (1<<0),
  307. AdapterOwned  = (1<<1),
  308. FibInitialized  = (1<<2),
  309. FibEmpty  = (1<<3),
  310. AllocatedFromPool  = (1<<4),
  311. SentFromHost  = (1<<5),
  312. SentFromAdapter  = (1<<6),
  313. ResponseExpected  = (1<<7),
  314. NoResponseExpected  = (1<<8),
  315. AdapterProcessed  = (1<<9),
  316. HostProcessed  = (1<<10),
  317. HighPriority  = (1<<11),
  318. NormalPriority  = (1<<12),
  319. Async = (1<<13),
  320. AsyncIo = (1<<13), // rpbfix: remove with new regime
  321. PageFileIo = (1<<14), // rpbfix: remove with new regime
  322. ShutdownRequest = (1<<15),
  323. LazyWrite = (1<<16), // rpbfix: remove with new regime
  324. AdapterMicroFib = (1<<17),
  325. BIOSFibPath = (1<<18),
  326. FastResponseCapable = (1<<19),
  327. ApiFib = (1<<20) // Its an API Fib.
  328. };
  329. /*
  330.  * The following defines needs to be updated any time there is an
  331.  * incompatible change made to the aac_init structure.
  332.  */
  333. #define ADAPTER_INIT_STRUCT_REVISION 3
  334. struct aac_init
  335. {
  336. u32 InitStructRevision;
  337. u32 MiniPortRevision;
  338. u32 fsrev;
  339. u32 CommHeaderAddress;
  340. u32 FastIoCommAreaAddress;
  341. u32 AdapterFibsPhysicalAddress;
  342. u32 AdapterFibsVirtualAddress;
  343. u32 AdapterFibsSize;
  344. u32 AdapterFibAlign;
  345. u32 printfbuf;
  346. u32 printfbufsiz;
  347. u32 HostPhysMemPages; // number of 4k pages of host physical memory
  348. u32 HostElapsedSeconds; // number of seconds since 1970.
  349. };
  350. enum aac_log_level {
  351. LOG_INIT = 10,
  352. LOG_INFORMATIONAL = 20,
  353. LOG_WARNING = 30,
  354. LOG_LOW_ERROR = 40,
  355. LOG_MEDIUM_ERROR = 50,
  356. LOG_HIGH_ERROR = 60,
  357. LOG_PANIC = 70,
  358. LOG_DEBUG = 80,
  359. LOG_WINDBG_PRINT = 90
  360. };
  361. #define FSAFS_NTC_GET_ADAPTER_FIB_CONTEXT 0x030b
  362. #define FSAFS_NTC_FIB_CONTEXT 0x030c
  363. struct aac_dev;
  364. struct adapter_ops
  365. {
  366. void (*adapter_interrupt)(struct aac_dev *dev);
  367. void (*adapter_notify)(struct aac_dev *dev, u32 event);
  368. void (*adapter_enable_int)(struct aac_dev *dev, u32 event);
  369. void (*adapter_disable_int)(struct aac_dev *dev, u32 event);
  370. int  (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 *status);
  371. };
  372. /*
  373.  * Define which interrupt handler needs to be installed
  374.  */
  375. struct aac_driver_ident
  376. {
  377. u16 vendor;
  378. u16 device;
  379. u16 subsystem_vendor;
  380. u16 subsystem_device;
  381. int  (*init)(struct aac_dev *dev, unsigned long num);
  382. char * name;
  383. char * vname;
  384. char * model;
  385. u16 channels;
  386. };
  387. /*
  388.  * The adapter interface specs all queues to be located in the same
  389.  * physically contigous block. The host structure that defines the
  390.  * commuication queues will assume they are each a seperate physically
  391.  * contigous memory region that will support them all being one big
  392.  * contigous block. 
  393.  * There is a command and response queue for each level and direction of
  394.  * commuication. These regions are accessed by both the host and adapter.
  395.  */
  396.  
  397. struct aac_queue {
  398. u64   logical; /* This is the address we give the adapter */
  399. struct aac_entry *base;     /* This is the system virtual address */
  400. struct aac_qhdr  headers;        /* A pointer to the producer and consumer queue headers for this queue */
  401. u32   entries;     /* Number of queue entries on this queue */
  402. wait_queue_head_t qfull;        /* Event to wait on if the queue is full */
  403. wait_queue_head_t cmdready;    /* Indicates there is a Command ready from the adapter on this queue. */
  404.                                          /* This is only valid for adapter to host command queues. */                      
  405. spinlock_t   *lock;       /* Spinlock for this queue must take this lock before accessing the lock */
  406. spinlock_t lockdata; /* Actual lock (used only on one side of the lock) */
  407. unsigned long SavedIrql;       /* Previous IRQL when the spin lock is taken */
  408. u32 padding; /* Padding - FIXME - can remove I believe */
  409. struct list_head  cmdq;     /* A queue of FIBs which need to be prcessed by the FS thread. This is */
  410.                                          /* only valid for command queues which receive entries from the adapter. */
  411. struct list_head pendingq; /* A queue of outstanding fib's to the adapter. */
  412. unsigned long numpending; /* Number of entries on outstanding queue. */
  413. struct aac_dev * dev; /* Back pointer to adapter structure */
  414. };
  415. /*
  416.  * Message queues. The order here is important, see also the 
  417.  * queue type ordering
  418.  */
  419. struct aac_queue_block
  420. {
  421. struct aac_queue queue[8];
  422. };
  423. /*
  424.  * SaP1 Message Unit Registers
  425.  */
  426.  
  427. struct sa_drawbridge_CSR {
  428. //  Offset | Name
  429. u32 reserved[10]; // 00h-27h |   Reserved
  430. u8 LUT_Offset; // 28h | Looup Table Offset
  431. u8 reserved1[3]; //  29h-2bh | Reserved
  432. u32 LUT_Data; // 2ch | Looup Table Data
  433. u32 reserved2[26]; // 30h-97h | Reserved
  434. u16 PRICLEARIRQ; // 98h | Primary Clear Irq
  435. u16 SECCLEARIRQ; // 9ah | Secondary Clear Irq
  436. u16 PRISETIRQ; // 9ch | Primary Set Irq
  437. u16 SECSETIRQ; // 9eh | Secondary Set Irq
  438. u16 PRICLEARIRQMASK; // a0h | Primary Clear Irq Mask
  439. u16 SECCLEARIRQMASK; // a2h | Secondary Clear Irq Mask
  440. u16 PRISETIRQMASK; // a4h | Primary Set Irq Mask
  441. u16 SECSETIRQMASK; // a6h | Secondary Set Irq Mask
  442. u32 MAILBOX0; // a8h | Scratchpad 0
  443. u32 MAILBOX1; // ach | Scratchpad 1
  444. u32 MAILBOX2; // b0h | Scratchpad 2
  445. u32 MAILBOX3; // b4h | Scratchpad 3
  446. u32 MAILBOX4; // b8h | Scratchpad 4
  447. u32 MAILBOX5; // bch | Scratchpad 5
  448. u32 MAILBOX6; // c0h | Scratchpad 6
  449. u32 MAILBOX7; // c4h | Scratchpad 7
  450. u32 ROM_Setup_Data; // c8h |  Rom Setup and Data
  451. u32 ROM_Control_Addr; // cch |  Rom Control and Address
  452. u32 reserved3[12]; // d0h-ffh |  reserved
  453. u32 LUT[64]; // 100h-1ffh| Lookup Table Entries
  454. //
  455. //  TO DO
  456. // need to add DMA, I2O, UART, etc registers form 80h to 364h
  457. //
  458. };
  459. #define Mailbox0 SaDbCSR.MAILBOX0
  460. #define Mailbox1 SaDbCSR.MAILBOX1
  461. #define Mailbox2 SaDbCSR.MAILBOX2
  462. #define Mailbox3 SaDbCSR.MAILBOX3
  463. #define Mailbox4 SaDbCSR.MAILBOX4
  464. #define Mailbox5 SaDbCSR.MAILBOX5
  465. #define Mailbox7 SaDbCSR.MAILBOX7
  466. #define DoorbellReg_p SaDbCSR.PRISETIRQ
  467. #define DoorbellReg_s SaDbCSR.SECSETIRQ
  468. #define DoorbellClrReg_p SaDbCSR.PRICLEARIRQ
  469. #define DOORBELL_0 cpu_to_le16(0x0001)
  470. #define DOORBELL_1 cpu_to_le16(0x0002)
  471. #define DOORBELL_2 cpu_to_le16(0x0004)
  472. #define DOORBELL_3 cpu_to_le16(0x0008)
  473. #define DOORBELL_4 cpu_to_le16(0x0010)
  474. #define DOORBELL_5 cpu_to_le16(0x0020)
  475. #define DOORBELL_6 cpu_to_le16(0x0040)
  476. #define PrintfReady DOORBELL_5
  477. #define PrintfDone DOORBELL_5
  478. struct sa_registers {
  479. struct sa_drawbridge_CSR SaDbCSR; /* 98h - c4h */
  480. };
  481. #define Sa_MINIPORT_REVISION 1
  482. #define sa_readw(AEP, CSR) readl(&((AEP)->regs.sa->CSR))
  483. #define sa_readl(AEP,  CSR) readl(&((AEP)->regs.sa->CSR))
  484. #define sa_writew(AEP, CSR, value) writew(value, &((AEP)->regs.sa->CSR))
  485. #define sa_writel(AEP, CSR, value) writel(value, &((AEP)->regs.sa->CSR))
  486. /*
  487.  * Rx Message Unit Registers
  488.  */
  489. struct rx_mu_registers {
  490. //  Local |   PCI* | Name
  491. // | |
  492. u32 ARSR; // 1300h | 00h | APIC Register Select Register
  493. u32 reserved0; // 1304h | 04h | Reserved
  494. u32 AWR; // 1308h | 08h | APIC Window Register
  495. u32 reserved1; // 130Ch | 0Ch | Reserved
  496. u32 IMRx[2]; // 1310h | 10h | Inbound Message Registers
  497. u32 OMRx[2]; // 1318h | 18h | Outbound Message Registers
  498. u32 IDR; // 1320h | 20h | Inbound Doorbell Register
  499. u32 IISR; // 1324h | 24h | Inbound Interrupt Status Register
  500. u32 IIMR; // 1328h | 28h | Inbound Interrupt Mask Register
  501. u32 ODR; // 132Ch | 2Ch | Outbound Doorbell Register
  502. u32 OISR; // 1330h | 30h | Outbound Interrupt Status Register
  503. u32 OIMR; // 1334h | 34h | Outbound Interrupt Mask Register
  504. // * Must access through ATU Inbound Translation Window
  505. };
  506. struct rx_inbound {
  507. u32 Mailbox[8];
  508. };
  509. #define InboundMailbox0 IndexRegs.Mailbox[0]
  510. #define InboundMailbox1 IndexRegs.Mailbox[1]
  511. #define InboundMailbox2 IndexRegs.Mailbox[2]
  512. #define InboundMailbox3 IndexRegs.Mailbox[3]
  513. #define InboundMailbox4 IndexRegs.Mailbox[4]
  514. #define INBOUNDDOORBELL_0 cpu_to_le32(0x00000001)
  515. #define INBOUNDDOORBELL_1 cpu_to_le32(0x00000002)
  516. #define INBOUNDDOORBELL_2 cpu_to_le32(0x00000004)
  517. #define INBOUNDDOORBELL_3 cpu_to_le32(0x00000008)
  518. #define INBOUNDDOORBELL_4 cpu_to_le32(0x00000010)
  519. #define INBOUNDDOORBELL_5 cpu_to_le32(0x00000020)
  520. #define INBOUNDDOORBELL_6 cpu_to_le32(0x00000040)
  521. #define OUTBOUNDDOORBELL_0 cpu_to_le32(0x00000001)
  522. #define OUTBOUNDDOORBELL_1 cpu_to_le32(0x00000002)
  523. #define OUTBOUNDDOORBELL_2 cpu_to_le32(0x00000004)
  524. #define OUTBOUNDDOORBELL_3 cpu_to_le32(0x00000008)
  525. #define OUTBOUNDDOORBELL_4 cpu_to_le32(0x00000010)
  526. #define InboundDoorbellReg MUnit.IDR
  527. #define OutboundDoorbellReg MUnit.ODR
  528. struct rx_registers {
  529. struct rx_mu_registers MUnit; // 1300h - 1334h
  530. u32 reserved1[6]; // 1338h - 134ch
  531. struct rx_inbound IndexRegs;
  532. };
  533. #define rx_readb(AEP, CSR) readb(&((AEP)->regs.rx->CSR))
  534. #define rx_readl(AEP, CSR) readl(&((AEP)->regs.rx->CSR))
  535. #define rx_writeb(AEP, CSR, value) writeb(value, &((AEP)->regs.rx->CSR))
  536. #define rx_writel(AEP, CSR, value) writel(value, &((AEP)->regs.rx->CSR))
  537. struct fib;
  538. typedef void (*fib_callback)(void *ctxt, struct fib *fibctx);
  539. struct aac_fib_context {
  540. s16   type; // used for verification of structure
  541. s16   size;
  542. ulong jiffies; // used for cleanup - dmb changed to ulong
  543. struct list_head next; // used to link context's into a linked list
  544. struct semaphore  wait_sem; // this is used to wait for the next fib to arrive.
  545. int wait; // Set to true when thread is in WaitForSingleObject
  546. unsigned long count; // total number of FIBs on FibList
  547. struct list_head fibs;
  548. };
  549. struct fsa_scsi_hba {
  550. u32 size[MAXIMUM_NUM_CONTAINERS];
  551. u32 type[MAXIMUM_NUM_CONTAINERS];
  552. u8 valid[MAXIMUM_NUM_CONTAINERS];
  553. u8 ro[MAXIMUM_NUM_CONTAINERS];
  554. u8 locked[MAXIMUM_NUM_CONTAINERS];
  555. u8 deleted[MAXIMUM_NUM_CONTAINERS];
  556. u32 devno[MAXIMUM_NUM_CONTAINERS];
  557. };
  558. struct fib {
  559. void *next; /* this is used by the allocator */
  560. s16 type;
  561. s16 size;
  562. /*
  563.  * The Adapter that this I/O is destined for.
  564.  */
  565. struct aac_dev  *dev;
  566. u64 logicaladdr; /* 64 bit */
  567. /*
  568.  * This is the event the sendfib routine will wait on if the
  569.  * caller did not pass one and this is synch io.
  570.  */
  571. struct semaphore  event_wait;
  572. spinlock_t event_lock;
  573. u32 done; /* gets set to 1 when fib is complete */
  574. fib_callback  callback;
  575. void  *callback_data;
  576. u32 flags; // u32 dmb was ulong
  577. /*
  578.  * The following is used to put this fib context onto the 
  579.  * Outstanding I/O queue.
  580.  */
  581. struct list_head queue;
  582. void  *data;
  583. struct hw_fib *fib; /* Actual shared object */
  584. };
  585. /*
  586.  * Adapter Information Block
  587.  *
  588.  * This is returned by the RequestAdapterInfo block
  589.  */
  590.  
  591. struct aac_adapter_info
  592. {
  593. u32 platform;
  594. u32 cpu;
  595. u32 subcpu;
  596. u32 clock;
  597. u32 execmem;
  598. u32 buffermem;
  599. u32 totalmem;
  600. u32 kernelrev;
  601. u32 kernelbuild;
  602. u32 monitorrev;
  603. u32 monitorbuild;
  604. u32 hwrev;
  605. u32 hwbuild;
  606. u32 biosrev;
  607. u32 biosbuild;
  608. u32 cluster;
  609. u32 serial[2];
  610. u32 battery;
  611. u32 options;
  612. u32 OEM;
  613. };
  614. /*
  615.  * Battery platforms
  616.  */
  617. #define AAC_BAT_REQ_PRESENT (1)
  618. #define AAC_BAT_REQ_NOTPRESENT (2)
  619. #define AAC_BAT_OPT_PRESENT (3)
  620. #define AAC_BAT_OPT_NOTPRESENT (4)
  621. #define AAC_BAT_NOT_SUPPORTED (5)
  622. /*
  623.  * cpu types
  624.  */
  625. #define AAC_CPU_SIMULATOR (1)
  626. #define AAC_CPU_I960 (2)
  627. #define AAC_CPU_STRONGARM (3)
  628. /*
  629.  * Supported Options
  630.  */
  631. #define AAC_OPT_SNAPSHOT cpu_to_le32(1)
  632. #define AAC_OPT_CLUSTERS cpu_to_le32(1<<1)
  633. #define AAC_OPT_WRITE_CACHE cpu_to_le32(1<<2)
  634. #define AAC_OPT_64BIT_DATA cpu_to_le32(1<<3)
  635. #define AAC_OPT_HOST_TIME_FIB cpu_to_le32(1<<4)
  636. #define AAC_OPT_RAID50 cpu_to_le32(1<<5)
  637. #define AAC_OPT_4GB_WINDOW cpu_to_le32(1<<6)
  638. #define AAC_OPT_SCSI_UPGRADEABLE cpu_to_le32(1<<7)
  639. #define AAC_OPT_SOFT_ERR_REPORT cpu_to_le32(1<<8)
  640. #define AAC_OPT_SUPPORTED_RECONDITION cpu_to_le32(1<<9)
  641. #define AAC_OPT_SGMAP_HOST64 cpu_to_le32(1<<10)
  642. #define AAC_OPT_ALARM cpu_to_le32(1<<11)
  643. #define AAC_OPT_NONDASD cpu_to_le32(1<<12)
  644. struct aac_dev
  645. {
  646. struct aac_dev *next;
  647. const char *name;
  648. int id;
  649. u16 irq_mask;
  650. /*
  651.  * Map for 128 fib objects (64k)
  652.  */
  653. dma_addr_t hw_fib_pa;
  654. struct hw_fib *hw_fib_va;
  655. #if BITS_PER_LONG >= 64
  656. ulong fib_base_va;
  657. #endif
  658. /*
  659.  * Fib Headers
  660.  */
  661. struct fib fibs[AAC_NUM_FIB];
  662. struct fib *free_fib;
  663. struct fib *timeout_fib;
  664. spinlock_t fib_lock;
  665. struct aac_queue_block *queues;
  666. /*
  667.  * The user API will use an IOCTL to register itself to receive
  668.  * FIBs from the adapter.  The following list is used to keep
  669.  * track of all the threads that have requested these FIBs.  The
  670.  * mutex is used to synchronize access to all data associated 
  671.  * with the adapter fibs.
  672.  */
  673. struct list_head fib_list;
  674. struct adapter_ops a_ops;
  675. unsigned long fsrev; /* Main driver's revision number */
  676. struct aac_init *init; /* Holds initialization info to communicate with adapter */
  677. dma_addr_t init_pa;  /* Holds physical address of the init struct */
  678. struct pci_dev *pdev; /* Our PCI interface */
  679. void * printfbuf; /* pointer to buffer used for printf's from the adapter */
  680. void * comm_addr; /* Base address of Comm area */
  681. dma_addr_t comm_phys; /* Physical Address of Comm area */
  682. size_t comm_size;
  683. struct Scsi_Host *scsi_host_ptr;
  684. struct fsa_scsi_hba fsa_dev;
  685. int thread_pid;
  686. int cardtype;
  687. /*
  688.  * The following is the device specific extension.
  689.  */
  690. union
  691. {
  692. struct sa_registers *sa;
  693. struct rx_registers *rx;
  694. } regs;
  695. /*
  696.  * The following is the number of the individual adapter
  697.  */
  698. u32 devnum;
  699. u32 aif_thread;
  700. struct completion aif_completion;
  701. struct aac_adapter_info adapter_info;
  702. /* These are in adapter info but they are in the io flow so
  703.  * lets break them out so we don't have to do an AND to check them
  704.  */
  705. u8 nondasd_support; 
  706. u8 pae_support;
  707. };
  708. #define aac_adapter_interrupt(dev) 
  709. dev->a_ops.adapter_interrupt(dev)
  710. #define aac_adapter_notify(dev, event) 
  711. dev->a_ops.adapter_notify(dev, event)
  712. #define aac_adapter_enable_int(dev, event) 
  713. dev->a_ops.adapter_enable_int(dev, event)
  714. #define aac_adapter_disable_int(dev, event) 
  715. dev->a_ops.adapter_disable_int(dev, event)
  716. #define FIB_CONTEXT_FLAG_TIMED_OUT (0x00000001)
  717. /*
  718.  * Define the command values
  719.  */
  720.  
  721. #define Null 0
  722. #define  GetAttributes 1
  723. #define  SetAttributes 2
  724. #define  Lookup 3
  725. #define  ReadLink 4
  726. #define  Read 5
  727. #define  Write 6
  728. #define Create 7
  729. #define MakeDirectory 8
  730. #define SymbolicLink 9
  731. #define MakeNode 10
  732. #define Removex 11
  733. #define RemoveDirectoryx 12
  734. #define Rename 13
  735. #define Link 14
  736. #define ReadDirectory 15
  737. #define ReadDirectoryPlus 16
  738. #define FileSystemStatus 17
  739. #define FileSystemInfo 18
  740. #define PathConfigure 19
  741. #define Commit 20
  742. #define Mount 21
  743. #define UnMount 22
  744. #define Newfs 23
  745. #define FsCheck 24
  746. #define FsSync 25
  747. #define SimReadWrite 26
  748. #define SetFileSystemStatus 27
  749. #define BlockRead 28
  750. #define BlockWrite 29
  751. #define NvramIoctl 30
  752. #define FsSyncWait 31
  753. #define ClearArchiveBit 32
  754. #define SetAcl 33
  755. #define GetAcl 34
  756. #define AssignAcl 35
  757. #define FaultInsertion 36 /* Fault Insertion Command */
  758. #define CrazyCache 37 /* Crazycache */
  759. #define MAX_FSACOMMAND_NUM 38
  760. /*
  761.  * Define the status returns. These are very unixlike although
  762.  * most are not in fact used
  763.  */
  764. #define ST_OK 0
  765. #define ST_PERM 1
  766. #define ST_NOENT 2
  767. #define ST_IO 5
  768. #define ST_NXIO 6
  769. #define ST_E2BIG 7
  770. #define ST_ACCES 13
  771. #define ST_EXIST 17
  772. #define ST_XDEV 18
  773. #define ST_NODEV 19
  774. #define ST_NOTDIR 20
  775. #define ST_ISDIR 21
  776. #define ST_INVAL 22
  777. #define ST_FBIG 27
  778. #define ST_NOSPC 28
  779. #define ST_ROFS 30
  780. #define ST_MLINK 31
  781. #define ST_WOULDBLOCK 35
  782. #define ST_NAMETOOLONG 63
  783. #define ST_NOTEMPTY 66
  784. #define ST_DQUOT 69
  785. #define ST_STALE 70
  786. #define ST_REMOTE 71
  787. #define ST_BADHANDLE 10001
  788. #define ST_NOT_SYNC 10002
  789. #define ST_BAD_COOKIE 10003
  790. #define ST_NOTSUPP 10004
  791. #define ST_TOOSMALL 10005
  792. #define ST_SERVERFAULT 10006
  793. #define ST_BADTYPE 10007
  794. #define ST_JUKEBOX 10008
  795. #define ST_NOTMOUNTED 10009
  796. #define ST_MAINTMODE 10010
  797. #define ST_STALEACL 10011
  798. /*
  799.  * On writes how does the client want the data written.
  800.  */
  801. #define CACHE_CSTABLE 1
  802. #define CACHE_UNSTABLE 2
  803. /*
  804.  * Lets the client know at which level the data was commited on
  805.  * a write request
  806.  */
  807. #define CMFILE_SYNCH_NVRAM 1
  808. #define CMDATA_SYNCH_NVRAM 2
  809. #define CMFILE_SYNCH 3
  810. #define CMDATA_SYNCH 4
  811. #define CMUNSTABLE 5
  812. struct aac_read
  813. {
  814. u32   command;
  815. u32  cid;
  816. u32  block;
  817. u32  count;
  818. struct sgmap sg; // Must be last in struct because it is variable
  819. };
  820. struct aac_read64
  821. {
  822. u32   command;
  823. u16  cid;
  824. u16  sector_count;
  825. u32  block;
  826. u16 pad;
  827. u16 flags;
  828. struct sgmap64 sg; // Must be last in struct because it is variable
  829. };
  830. struct aac_read_reply
  831. {
  832. u32   status;
  833. u32  count;
  834. };
  835. struct aac_write
  836. {
  837. u32 command;
  838. u32  cid;
  839. u32  block;
  840. u32  count;
  841. u32   stable; // Not used
  842. struct sgmap sg; // Must be last in struct because it is variable
  843. };
  844. struct aac_write64
  845. {
  846. u32   command;
  847. u16  cid;
  848. u16  sector_count;
  849. u32  block;
  850. u16 pad;
  851. u16 flags;
  852. struct sgmap64 sg; // Must be last in struct because it is variable
  853. };
  854. struct aac_write_reply
  855. {
  856. u32 status;
  857. u32  count;
  858. u32 committed;
  859. };
  860. struct aac_srb
  861. {
  862. u32 function;
  863. u32 channel;
  864. u32 target;
  865. u32 lun;
  866. u32 timeout;
  867. u32 flags;
  868. u32 count; // Data xfer size
  869. u32 retry_limit;
  870. u32 cdb_size;
  871. u8 cdb[16];
  872. struct sgmap sg;
  873. };
  874. #define AAC_SENSE_BUFFERSIZE  30
  875. struct aac_srb_reply
  876. {
  877. u32 status;
  878. u32 srb_status;
  879. u32 scsi_status;
  880. u32 data_xfer_length;
  881. u32 sense_data_size;
  882. u8 sense_data[AAC_SENSE_BUFFERSIZE]; // Can this be SCSI_SENSE_BUFFERSIZE
  883. };
  884. /*
  885.  * SRB Flags
  886.  */
  887. #define SRB_NoDataXfer  0x0000
  888. #define SRB_DisableDisconnect  0x0004
  889. #define SRB_DisableSynchTransfer 0x0008
  890. #define  SRB_BypassFrozenQueue  0x0010
  891. #define SRB_DisableAutosense  0x0020
  892. #define SRB_DataIn  0x0040
  893. #define  SRB_DataOut  0x0080
  894. /*
  895.  * SRB Functions - set in aac_srb->function
  896.  */
  897. #define SRBF_ExecuteScsi 0x0000
  898. #define SRBF_ClaimDevice 0x0001
  899. #define SRBF_IO_Control 0x0002
  900. #define SRBF_ReceiveEvent 0x0003
  901. #define SRBF_ReleaseQueue 0x0004
  902. #define SRBF_AttachDevice 0x0005
  903. #define SRBF_ReleaseDevice 0x0006
  904. #define SRBF_Shutdown 0x0007
  905. #define SRBF_Flush 0x0008
  906. #define SRBF_AbortCommand 0x0010
  907. #define SRBF_ReleaseRecovery 0x0011
  908. #define SRBF_ResetBus 0x0012
  909. #define SRBF_ResetDevice 0x0013
  910. #define SRBF_TerminateIO 0x0014
  911. #define SRBF_FlushQueue 0x0015
  912. #define SRBF_RemoveDevice 0x0016
  913. #define SRBF_DomainValidation 0x0017
  914. /* 
  915.  * SRB SCSI Status - set in aac_srb->scsi_status
  916.  */
  917. #define SRB_STATUS_PENDING                  0x00
  918. #define SRB_STATUS_SUCCESS                  0x01
  919. #define SRB_STATUS_ABORTED                  0x02
  920. #define SRB_STATUS_ABORT_FAILED             0x03
  921. #define SRB_STATUS_ERROR                    0x04
  922. #define SRB_STATUS_BUSY                     0x05
  923. #define SRB_STATUS_INVALID_REQUEST          0x06
  924. #define SRB_STATUS_INVALID_PATH_ID          0x07
  925. #define SRB_STATUS_NO_DEVICE                0x08
  926. #define SRB_STATUS_TIMEOUT                  0x09
  927. #define SRB_STATUS_SELECTION_TIMEOUT        0x0A
  928. #define SRB_STATUS_COMMAND_TIMEOUT          0x0B
  929. #define SRB_STATUS_MESSAGE_REJECTED         0x0D
  930. #define SRB_STATUS_BUS_RESET                0x0E
  931. #define SRB_STATUS_PARITY_ERROR             0x0F
  932. #define SRB_STATUS_REQUEST_SENSE_FAILED     0x10
  933. #define SRB_STATUS_NO_HBA                   0x11
  934. #define SRB_STATUS_DATA_OVERRUN             0x12
  935. #define SRB_STATUS_UNEXPECTED_BUS_FREE      0x13
  936. #define SRB_STATUS_PHASE_SEQUENCE_FAILURE   0x14
  937. #define SRB_STATUS_BAD_SRB_BLOCK_LENGTH     0x15
  938. #define SRB_STATUS_REQUEST_FLUSHED          0x16
  939. #define SRB_STATUS_DELAYED_RETRY     0x17
  940. #define SRB_STATUS_INVALID_LUN              0x20
  941. #define SRB_STATUS_INVALID_TARGET_ID        0x21
  942. #define SRB_STATUS_BAD_FUNCTION             0x22
  943. #define SRB_STATUS_ERROR_RECOVERY           0x23
  944. #define SRB_STATUS_NOT_STARTED     0x24
  945. #define SRB_STATUS_NOT_IN_USE     0x30
  946. #define SRB_STATUS_FORCE_ABORT     0x31
  947. #define SRB_STATUS_DOMAIN_VALIDATION_FAIL   0x32
  948. /*
  949.  * Object-Server / Volume-Manager Dispatch Classes
  950.  */
  951. #define VM_Null 0
  952. #define VM_NameServe 1
  953. #define VM_ContainerConfig 2
  954. #define VM_Ioctl 3
  955. #define VM_FilesystemIoctl 4
  956. #define VM_CloseAll 5
  957. #define VM_CtBlockRead 6
  958. #define VM_CtBlockWrite 7
  959. #define VM_SliceBlockRead 8 /* raw access to configured "storage objects" */
  960. #define VM_SliceBlockWrite 9
  961. #define VM_DriveBlockRead 10 /* raw access to physical devices */
  962. #define VM_DriveBlockWrite 11
  963. #define VM_EnclosureMgt 12 /* enclosure management */
  964. #define VM_Unused 13 /* used to be diskset management */
  965. #define VM_CtBlockVerify 14
  966. #define VM_CtPerf 15 /* performance test */
  967. #define VM_CtBlockRead64 16
  968. #define VM_CtBlockWrite64 17
  969. #define VM_CtBlockVerify64 18
  970. #define VM_CtHostRead64 19
  971. #define VM_CtHostWrite64 20
  972. #define MAX_VMCOMMAND_NUM 21 /* used for sizing stats array - leave last */
  973. /*
  974.  * Descriptive information (eg, vital stats)
  975.  * that a content manager might report.  The
  976.  * FileArray filesystem component is one example
  977.  * of a content manager.  Raw mode might be
  978.  * another.
  979.  */
  980. struct aac_fsinfo {
  981. u32  fsTotalSize; /* Consumed by fs, incl. metadata */
  982. u32  fsBlockSize;
  983. u32  fsFragSize;
  984. u32  fsMaxExtendSize;
  985. u32  fsSpaceUnits;
  986. u32  fsMaxNumFiles;
  987. u32  fsNumFreeFiles;
  988. u32  fsInodeDensity;
  989. }; /* valid iff ObjType == FT_FILESYS && !(ContentState & FSCS_NOTCLEAN) */
  990. union aac_contentinfo {
  991. struct aac_fsinfo filesys; /* valid iff ObjType == FT_FILESYS && !(ContentState & FSCS_NOTCLEAN) */
  992. };
  993. /*
  994.  * Query for "mountable" objects, ie, objects that are typically
  995.  * associated with a drive letter on the client (host) side.
  996.  */
  997. struct aac_mntent {
  998. u32     oid;
  999. u8 name[16]; // if applicable
  1000. struct creation_info create_info; // if applicable
  1001. u32 capacity;
  1002. u32 vol;     // substrate structure
  1003. u32 obj;         // FT_FILESYS, FT_DATABASE, etc.
  1004. u32 state; // unready for mounting, readonly, etc.
  1005. union aac_contentinfo fileinfo; // Info specific to content manager (eg, filesystem)
  1006. u32 altoid; // != oid <==> snapshot or broken mirror exists
  1007. };
  1008. #define FSCS_READONLY 0x0002 /* possible result of broken mirror */
  1009. struct aac_query_mount {
  1010. u32 command;
  1011. u32 type;
  1012. u32 count;
  1013. };
  1014. struct aac_mount {
  1015. u32 status;
  1016. u32     type;           /* should be same as that requested */
  1017. u32 count;
  1018. struct aac_mntent mnt[1];
  1019. };
  1020. /*
  1021.  * The following command is sent to shut down each container.
  1022.  */
  1023. struct aac_close {
  1024. u32 command;
  1025. u32 cid;
  1026. };
  1027. struct aac_query_disk
  1028. {
  1029. s32 cnum;
  1030. s32 bus;
  1031. s32 target;
  1032. s32 lun;
  1033. u32 valid;
  1034. u32 locked;
  1035. u32 deleted;
  1036. s32 instance;
  1037. s8 name[10];
  1038. u32 unmapped;
  1039. };
  1040. struct aac_delete_disk {
  1041. u32 disknum;
  1042. u32 cnum;
  1043. };
  1044. struct fib_ioctl
  1045. {
  1046. char *fibctx;
  1047. int wait;
  1048. char *fib;
  1049. };
  1050. struct revision
  1051. {
  1052. u32 compat;
  1053. u32 version;
  1054. u32 build;
  1055. };
  1056. /*
  1057.  *  Ugly - non Linux like ioctl coding for back compat.
  1058.  */
  1059. #define CTL_CODE(function, method) (                 
  1060.     (4<< 16) | ((function) << 2) | (method) 
  1061. )
  1062. /*
  1063.  * Define the method codes for how buffers are passed for I/O and FS 
  1064.  * controls
  1065.  */
  1066. #define METHOD_BUFFERED                 0
  1067. #define METHOD_NEITHER                  3
  1068. /*
  1069.  * Filesystem ioctls
  1070.  */
  1071. #define FSACTL_SENDFIB                   CTL_CODE(2050, METHOD_BUFFERED)
  1072. #define FSACTL_SEND_RAW_SRB                CTL_CODE(2067, METHOD_BUFFERED)
  1073. #define FSACTL_DELETE_DISK 0x163
  1074. #define FSACTL_QUERY_DISK 0x173
  1075. #define FSACTL_OPEN_GET_ADAPTER_FIB CTL_CODE(2100, METHOD_BUFFERED)
  1076. #define FSACTL_GET_NEXT_ADAPTER_FIB CTL_CODE(2101, METHOD_BUFFERED)
  1077. #define FSACTL_CLOSE_GET_ADAPTER_FIB CTL_CODE(2102, METHOD_BUFFERED)
  1078. #define FSACTL_MINIPORT_REV_CHECK               CTL_CODE(2107, METHOD_BUFFERED)
  1079. #define FSACTL_GET_PCI_INFO                CTL_CODE(2119, METHOD_BUFFERED)
  1080. #define FSACTL_FORCE_DELETE_DISK CTL_CODE(2120, METHOD_NEITHER)
  1081. struct aac_common
  1082. {
  1083. /*
  1084.  * If this value is set to 1 then interrupt moderation will occur 
  1085.  * in the base commuication support.
  1086.  */
  1087. u32 irq_mod;
  1088. u32 peak_fibs;
  1089. u32 zero_fibs;
  1090. u32 fib_timeouts;
  1091. /*
  1092.  * Statistical counters in debug mode
  1093.  */
  1094. #ifdef DBG
  1095. u32 FibsSent;
  1096. u32 FibRecved;
  1097. u32 NoResponseSent;
  1098. u32 NoResponseRecved;
  1099. u32 AsyncSent;
  1100. u32 AsyncRecved;
  1101. u32 NormalSent;
  1102. u32 NormalRecved;
  1103. #endif
  1104. };
  1105. extern struct aac_common aac_config;
  1106. /*
  1107.  * The following macro is used when sending and receiving FIBs. It is
  1108.  * only used for debugging.
  1109.  */
  1110.  
  1111. #if DBG
  1112. #define FIB_COUNTER_INCREMENT(counter) (counter)++
  1113. #else
  1114. #define FIB_COUNTER_INCREMENT(counter)
  1115. #endif
  1116. /*
  1117.  * Adapter direct commands
  1118.  * Monitor/Kernel API
  1119.  */
  1120. #define BREAKPOINT_REQUEST cpu_to_le32(0x00000004)
  1121. #define INIT_STRUCT_BASE_ADDRESS cpu_to_le32(0x00000005)
  1122. #define READ_PERMANENT_PARAMETERS cpu_to_le32(0x0000000a)
  1123. #define WRITE_PERMANENT_PARAMETERS cpu_to_le32(0x0000000b)
  1124. #define HOST_CRASHING cpu_to_le32(0x0000000d)
  1125. #define SEND_SYNCHRONOUS_FIB cpu_to_le32(0x0000000c)
  1126. #define GET_ADAPTER_PROPERTIES cpu_to_le32(0x00000019)
  1127. #define RE_INIT_ADAPTER cpu_to_le32(0x000000ee)
  1128. /*
  1129.  * Adapter Status Register
  1130.  *
  1131.  *  Phase Staus mailbox is 32bits:
  1132.  * <31:16> = Phase Status
  1133.  * <15:0>  = Phase
  1134.  *
  1135.  * The adapter reports is present state through the phase.  Only
  1136.  * a single phase should be ever be set.  Each phase can have multiple
  1137.  * phase status bits to provide more detailed information about the 
  1138.  * state of the board.  Care should be taken to ensure that any phase 
  1139.  * status bits that are set when changing the phase are also valid
  1140.  * for the new phase or be cleared out.  Adapter software (monitor,
  1141.  * iflash, kernel) is responsible for properly maintining the phase 
  1142.  * status mailbox when it is running.
  1143.  *
  1144.  * MONKER_API Phases
  1145.  *
  1146.  * Phases are bit oriented.  It is NOT valid  to have multiple bits set
  1147.  */
  1148. #define SELF_TEST_FAILED cpu_to_le32(0x00000004)
  1149. #define KERNEL_UP_AND_RUNNING cpu_to_le32(0x00000080)
  1150. #define KERNEL_PANIC cpu_to_le32(0x00000100)
  1151. /*
  1152.  * Doorbell bit defines
  1153.  */
  1154. #define DoorBellPrintfDone cpu_to_le32(1<<5) // Host -> Adapter
  1155. #define DoorBellAdapterNormCmdReady cpu_to_le32(1<<1) // Adapter -> Host
  1156. #define DoorBellAdapterNormRespReady cpu_to_le32(1<<2) // Adapter -> Host
  1157. #define DoorBellAdapterNormCmdNotFull cpu_to_le32(1<<3) // Adapter -> Host
  1158. #define DoorBellAdapterNormRespNotFull cpu_to_le32(1<<4) // Adapter -> Host
  1159. #define DoorBellPrintfReady cpu_to_le32(1<<5) // Adapter -> Host
  1160. /*
  1161.  * For FIB communication, we need all of the following things
  1162.  * to send back to the user.
  1163.  */
  1164.  
  1165. #define  AifCmdEventNotify 1 /* Notify of event */
  1166. #define AifCmdJobProgress 2 /* Progress report */
  1167. #define AifCmdAPIReport 3 /* Report from other user of API */
  1168. #define AifCmdDriverNotify 4 /* Notify host driver of event */
  1169. #define AifReqJobList 100 /* Gets back complete job list */
  1170. #define AifReqJobsForCtr 101 /* Gets back jobs for specific container */
  1171. #define AifReqJobsForScsi 102 /* Gets back jobs for specific SCSI device */ 
  1172. #define AifReqJobReport 103 /* Gets back a specific job report or list of them */ 
  1173. #define AifReqTerminateJob 104 /* Terminates job */
  1174. #define AifReqSuspendJob 105 /* Suspends a job */
  1175. #define AifReqResumeJob 106 /* Resumes a job */ 
  1176. #define AifReqSendAPIReport 107 /* API generic report requests */
  1177. #define AifReqAPIJobStart 108 /* Start a job from the API */
  1178. #define AifReqAPIJobUpdate 109 /* Update a job report from the API */
  1179. #define AifReqAPIJobFinish 110 /* Finish a job from the API */
  1180. /*
  1181.  * Adapter Initiated FIB command structures. Start with the adapter
  1182.  * initiated FIBs that really come from the adapter, and get responded
  1183.  * to by the host.
  1184.  */
  1185. struct aac_aifcmd {
  1186. u32 command; /* Tell host what type of notify this is */
  1187. u32 seqnum; /* To allow ordering of reports (if necessary) */
  1188. u8 data[1]; /* Undefined length (from kernel viewpoint) */
  1189. };
  1190. static inline u32 fib2addr(struct hw_fib *hw)
  1191. {
  1192. return (u32)hw;
  1193. }
  1194. static inline struct hw_fib *addr2fib(u32 addr)
  1195. {
  1196. return (struct hw_fib *)addr;
  1197. }
  1198. const char *aac_driverinfo(struct Scsi_Host *);
  1199. struct fib *fib_alloc(struct aac_dev *dev);
  1200. int fib_setup(struct aac_dev *dev);
  1201. void fib_map_free(struct aac_dev *dev);
  1202. void fib_free(struct fib * context);
  1203. void fib_init(struct fib * context);
  1204. void fib_dealloc(struct fib * context);
  1205. void aac_printf(struct aac_dev *dev, u32 val);
  1206. int fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt);
  1207. int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry);
  1208. int aac_consumer_avail(struct aac_dev * dev, struct aac_queue * q);
  1209. void aac_consumer_free(struct aac_dev * dev, struct aac_queue * q, u32 qnum);
  1210. int fib_complete(struct fib * context);
  1211. #define fib_data(fibctx) ((void *)(fibctx)->fib->data)
  1212. int aac_detach(struct aac_dev *dev);
  1213. struct aac_dev *aac_init_adapter(struct aac_dev *dev);
  1214. int aac_get_containers(struct aac_dev *dev);
  1215. int aac_scsi_cmd(Scsi_Cmnd *scsi_cmnd_ptr);
  1216. int aac_dev_ioctl(struct aac_dev *dev, int cmd, void *arg);
  1217. int aac_do_ioctl(struct aac_dev * dev, int cmd, void *arg);
  1218. int aac_rx_init(struct aac_dev *dev, unsigned long devNumber);
  1219. int aac_sa_init(struct aac_dev *dev, unsigned long devNumber);
  1220. unsigned int aac_response_normal(struct aac_queue * q);
  1221. unsigned int aac_command_normal(struct aac_queue * q);
  1222. int aac_command_thread(struct aac_dev * dev);
  1223. int aac_close_fib_context(struct aac_dev * dev, struct aac_fib_context *fibctx);
  1224. int fib_adapter_complete(struct fib * fibptr, unsigned short size);
  1225. struct aac_driver_ident* aac_get_driver_ident(int devtype);
  1226. int aac_get_adapter_info(struct aac_dev* dev);