cciss.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef CCISS_H
  2. #define CCISS_H
  3. #include <linux/genhd.h>
  4. #include "cciss_cmd.h"
  5. #define NWD 16
  6. #define NWD_SHIFT 4
  7. #define MAX_PART 16
  8. #define IO_OK 0
  9. #define IO_ERROR 1
  10. #define MAJOR_NR COMPAQ_CISS_MAJOR 
  11. struct my_sg {
  12. int len;
  13. char *start_addr;
  14. };
  15. struct ctlr_info;
  16. typedef struct ctlr_info ctlr_info_t;
  17. struct access_method {
  18. void (*submit_command)(ctlr_info_t *h, CommandList_struct *c);
  19. void (*set_intr_mask)(ctlr_info_t *h, unsigned long val);
  20. unsigned long (*fifo_full)(ctlr_info_t *h);
  21. unsigned long (*intr_pending)(ctlr_info_t *h);
  22. unsigned long (*command_completed)(ctlr_info_t *h);
  23. };
  24. typedef struct _drive_info_struct
  25. {
  26.   __u32   LunID;
  27. int  usage_count;
  28. int  nr_blocks;
  29. int block_size;
  30. int  heads;
  31. int sectors;
  32. int  cylinders;
  33. } drive_info_struct;
  34. struct ctlr_info 
  35. {
  36. int ctlr;
  37. char devname[8];
  38. char    *product_name;
  39. char firm_ver[4]; // Firmware version 
  40. struct pci_dev *pdev;
  41. __u32 board_id;
  42. ulong   vaddr;
  43. __u32 paddr;
  44. CfgTable_struct *cfgtable;
  45. int intr;
  46. int  max_commands;
  47. int commands_outstanding;
  48. int  max_outstanding; /* Debug */ 
  49. int num_luns;
  50. int usage_count;  /* number of opens all all minor devices */
  51. // information about each logical volume
  52. drive_info_struct drv[CISS_MAX_LUN];
  53. struct access_method access;
  54. /* queue and queue Info */ 
  55. CommandList_struct *reqQ;
  56. CommandList_struct  *cmpQ;
  57. unsigned int Qdepth;
  58. unsigned int maxQsinceinit;
  59. unsigned int maxSG;
  60. //* pointers to command and error info pool */ 
  61. CommandList_struct  *cmd_pool;
  62. dma_addr_t cmd_pool_dhandle; 
  63. ErrorInfo_struct  *errinfo_pool;
  64. dma_addr_t errinfo_pool_dhandle; 
  65.         __u32    *cmd_pool_bits;
  66. int nr_allocs;
  67. int nr_frees; 
  68. // Disk structures we need to pass back
  69. struct gendisk   gendisk;
  70.    // indexed by minor numbers
  71. struct hd_struct hd[256];
  72. int              sizes[256];
  73. int              blocksizes[256];
  74. int              hardsizes[256];
  75. };
  76. /*  Defining the diffent access_menthods */
  77. /*
  78.  * Memory mapped FIFO interface (SMART 53xx cards)
  79.  */
  80. #define SA5_DOORBELL 0x20
  81. #define SA5_REQUEST_PORT_OFFSET 0x40
  82. #define SA5_REPLY_INTR_MASK_OFFSET 0x34
  83. #define SA5_REPLY_PORT_OFFSET 0x44
  84. #define SA5_INTR_STATUS 0x30
  85. #define SA5_CTCFG_OFFSET 0xB4
  86. #define SA5_CTMEM_OFFSET 0xB8
  87. #define SA5_INTR_OFF 0x08
  88. #define SA5B_INTR_OFF 0x04
  89. #define SA5_INTR_PENDING 0x08
  90. #define SA5B_INTR_PENDING 0x04
  91. #define FIFO_EMPTY 0xffffffff
  92. #define  CISS_ERROR_BIT 0x02
  93. #define CCISS_INTR_ON  1 
  94. #define CCISS_INTR_OFF 0
  95. /* 
  96. Send the command to the hardware 
  97. */
  98. static void SA5_submit_command( ctlr_info_t *h, CommandList_struct *c) 
  99. {
  100. #ifdef CCISS_DEBUG
  101.  printk("Sending %x - down to controllern", c->busaddr );
  102. #endif /* CCISS_DEBUG */ 
  103.          writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET);
  104.  h->commands_outstanding++;
  105.  if ( h->commands_outstanding > h->max_outstanding)
  106. h->max_outstanding = h->commands_outstanding;
  107. }
  108. /*  
  109.  *  This card is the opposite of the other cards.  
  110.  *   0 turns interrupts on... 
  111.  *   0x08 turns them off... 
  112.  */
  113. static void SA5_intr_mask(ctlr_info_t *h, unsigned long val)
  114. {
  115. if (val) 
  116. { /* Turn interrupts on */
  117. writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
  118. } else /* Turn them off */
  119. {
  120.          writel( SA5_INTR_OFF, 
  121. h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
  122. }
  123. }
  124. /*
  125.  *  This card is the opposite of the other cards.
  126.  *   0 turns interrupts on...
  127.  *   0x04 turns them off...
  128.  */
  129. static void SA5B_intr_mask(ctlr_info_t *h, unsigned long val)
  130. {
  131.         if (val)
  132.         { /* Turn interrupts on */
  133.                 writel(0, h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
  134.         } else /* Turn them off */
  135.         {
  136.                 writel( SA5B_INTR_OFF,
  137.                         h->vaddr + SA5_REPLY_INTR_MASK_OFFSET);
  138.         }
  139. }
  140. /*
  141.  *  Returns true if fifo is full.  
  142.  * 
  143.  */ 
  144. static unsigned long SA5_fifo_full(ctlr_info_t *h)
  145. {
  146. if( h->commands_outstanding >= h->max_commands)
  147. return(1);
  148. else 
  149. return(0);
  150. }
  151. /* 
  152.  *   returns value read from hardware. 
  153.  *     returns FIFO_EMPTY if there is nothing to read 
  154.  */ 
  155. static unsigned long SA5_completed(ctlr_info_t *h)
  156. {
  157. unsigned long register_value 
  158. = readl(h->vaddr + SA5_REPLY_PORT_OFFSET);
  159. if(register_value != FIFO_EMPTY)
  160. {
  161. h->commands_outstanding--;
  162. #ifdef CCISS_DEBUG
  163. printk("cciss:  Read %lx back from boardn", register_value);
  164. #endif /* CCISS_DEBUG */ 
  165. #ifdef CCISS_DEBUG
  166. else
  167. {
  168. printk("cciss:  FIFO Empty readn");
  169. }
  170. #endif 
  171. return ( register_value); 
  172. }
  173. /*
  174.  * Returns true if an interrupt is pending.. 
  175.  */
  176. static unsigned long SA5_intr_pending(ctlr_info_t *h)
  177. {
  178. unsigned long register_value  = 
  179. readl(h->vaddr + SA5_INTR_STATUS);
  180. #ifdef CCISS_DEBUG
  181. printk("cciss: intr_pending %lxn", register_value);
  182. #endif  /* CCISS_DEBUG */
  183. if( register_value &  SA5_INTR_PENDING) 
  184. return  1;
  185. return 0 ;
  186. }
  187. /*
  188.  *      Returns true if an interrupt is pending..
  189.  */
  190. static unsigned long SA5B_intr_pending(ctlr_info_t *h)
  191. {
  192.         unsigned long register_value  =
  193.                 readl(h->vaddr + SA5_INTR_STATUS);
  194. #ifdef CCISS_DEBUG
  195.         printk("cciss: intr_pending %lxn", register_value);
  196. #endif  /* CCISS_DEBUG */
  197.         if( register_value &  SA5B_INTR_PENDING)
  198.                 return  1;
  199.         return 0 ;
  200. }
  201. static struct access_method SA5_access = {
  202. SA5_submit_command,
  203. SA5_intr_mask,
  204. SA5_fifo_full,
  205. SA5_intr_pending,
  206. SA5_completed,
  207. };
  208. static struct access_method SA5B_access = {
  209.         SA5_submit_command,
  210.         SA5B_intr_mask,
  211.         SA5_fifo_full,
  212.         SA5B_intr_pending,
  213.         SA5_completed,
  214. };
  215. struct board_type {
  216. __u32 board_id;
  217. char *product_name;
  218. struct access_method *access;
  219. };
  220. #endif /* CCISS_H */