aacraid.h 44 KB

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