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

嵌入式Linux

开发平台:

Unix_Linux

  1. /********************************************************
  2. * Header file for eata_dma.c and eata_pio.c *
  3. * Linux EATA SCSI drivers *
  4. * (c) 1993-96 Michael Neuffer                           *
  5. *             mike@i-Connect.Net                        *
  6. *             neuffer@mail.uni-mainz.de                 *
  7. *********************************************************
  8. * last change: 96/08/14                                 *
  9. ********************************************************/
  10. #ifndef _EATA_GENERIC_H
  11. #define _EATA_GENERIC_H
  12. /*********************************************
  13.  * Misc. definitions      *
  14.  *********************************************/
  15. #ifndef TRUE
  16. #define TRUE 1
  17. #endif
  18. #ifndef FALSE
  19. #define FALSE 0
  20. #endif
  21. #define R_LIMIT 0x20000
  22. #define MAXISA    4
  23. #define MAXEISA   16  
  24. #define MAXPCI   16
  25. #define MAXIRQ   16 
  26. #define MAXTARGET 16
  27. #define MAXCHANNEL 3
  28. #define IS_ISA    'I'
  29. #define IS_EISA    'E'
  30. #define IS_PCI    'P'
  31. #define BROKEN_INQUIRY 1
  32. #define BUSMASTER       0xff
  33. #define PIO             0xfe
  34. #define EATA_SIGNATURE 0x45415441     /* BIG ENDIAN coded "EATA" sig.  */
  35. #define DPT_ID1         0x12
  36. #define DPT_ID2         0x14
  37. #define ATT_ID1         0x06
  38. #define ATT_ID2         0x94
  39. #define ATT_ID3         0x0
  40. #define NEC_ID1         0x38
  41. #define NEC_ID2         0xa3
  42. #define NEC_ID3         0x82
  43.  
  44. #define EATA_CP_SIZE  44
  45. #define MAX_PCI_DEVICES  32        /* Maximum # Of Devices Per Bus  */
  46. #define MAX_METHOD_2  16        /* Max Devices For Method 2  */
  47. #define MAX_PCI_BUS  16        /* Maximum # Of Busses Allowed  */
  48. #define SG_SIZE  64 
  49. #define SG_SIZE_BIG  252        /* max. 8096 elements, 64k */
  50. #define UPPER_DEVICE_QUEUE_LIMIT 64    /* The limit we have to set for the 
  51. * device queue to keep the broken 
  52. * midlevel SCSI code from producing
  53. * bogus timeouts
  54. */
  55. #define TYPE_DISK_QUEUE  16
  56. #define TYPE_TAPE_QUEUE  4
  57. #define TYPE_ROM_QUEUE   4
  58. #define TYPE_OTHER_QUEUE 2
  59. #define FREE          0
  60. #define OK          0
  61. #define NO_TIMEOUT       0
  62. #define USED          1
  63. #define TIMEOUT          2
  64. #define RESET          4
  65. #define LOCKED          8
  66. #define ABORTED          16
  67. #define READ             0
  68. #define WRITE            1
  69. #define OTHER            2
  70. #define HD(cmd)  ((hostdata *)&(cmd->host->hostdata))
  71. #define CD(cmd)  ((struct eata_ccb *)(cmd->host_scribble))
  72. #define SD(host) ((hostdata *)&(host->hostdata))
  73. #define DELAY(x) { ulong flags, i;                
  74.                    save_flags(flags); sti();      
  75.                    i = jiffies + (x * HZ);        
  76.                    while (jiffies < i);           
  77.                    restore_flags(flags); }
  78. /***********************************************
  79.  *    EATA Command & Register definitions      *
  80.  ***********************************************/
  81. #define PCI_REG_DPTconfig  0x40  
  82. #define PCI_REG_PumpModeAddress  0x44  
  83. #define PCI_REG_PumpModeData  0x48  
  84. #define PCI_REG_ConfigParam1  0x50  
  85. #define PCI_REG_ConfigParam2  0x54  
  86. #define EATA_CMD_PIO_SETUPTEST  0xc6
  87. #define EATA_CMD_PIO_READ_CONFIG 0xf0
  88. #define EATA_CMD_PIO_SET_CONFIG  0xf1
  89. #define EATA_CMD_PIO_SEND_CP  0xf2
  90. #define EATA_CMD_PIO_RECEIVE_SP  0xf3
  91. #define EATA_CMD_PIO_TRUNC  0xf4
  92. #define EATA_CMD_RESET  0xf9
  93. #define EATA_CMD_IMMEDIATE  0xfa
  94. #define EATA_CMD_DMA_READ_CONFIG 0xfd
  95. #define EATA_CMD_DMA_SET_CONFIG  0xfe
  96. #define EATA_CMD_DMA_SEND_CP  0xff
  97. #define ECS_EMULATE_SENSE  0xd4
  98. #define EATA_GENERIC_ABORT       0x00 
  99. #define EATA_SPECIFIC_RESET      0x01
  100. #define EATA_BUS_RESET           0x02
  101. #define EATA_SPECIFIC_ABORT      0x03
  102. #define EATA_QUIET_INTR          0x04
  103. #define EATA_COLD_BOOT_HBA       0x06    /* Only as a last resort */
  104. #define EATA_FORCE_IO            0x07
  105. #define HA_CTRLREG     0x206       /* control register for HBA    */
  106. #define HA_CTRL_DISINT 0x02        /* CTRLREG: disable interrupts */
  107. #define HA_CTRL_RESCPU 0x04        /* CTRLREG: reset processor    */
  108. #define HA_CTRL_8HEADS 0x08        /* CTRLREG: set for drives with* 
  109.     * >=8 heads (WD1003 rudimentary :-) */
  110. #define HA_WCOMMAND    0x07    /* command register offset */
  111. #define HA_WIFC        0x06    /* immediate command offset  */
  112. #define HA_WCODE       0x05 
  113. #define HA_WCODE2      0x04 
  114. #define HA_WDMAADDR    0x02    /* DMA address LSB offset */  
  115. #define HA_RAUXSTAT    0x08    /* aux status register offset*/
  116. #define HA_RSTATUS     0x07    /* status register offset */
  117. #define HA_RDATA       0x00    /* data register (16bit) */
  118. #define HA_WDATA       0x00    /* data register (16bit) */
  119. #define HA_ABUSY       0x01    /* aux busy bit */
  120. #define HA_AIRQ        0x02    /* aux IRQ pending bit */
  121. #define HA_SERROR      0x01    /* pr. command ended in error*/
  122. #define HA_SMORE       0x02    /* more data soon to come */
  123. #define HA_SCORR       0x04    /* data corrected */
  124. #define HA_SDRQ        0x08    /* data request active */
  125. #define HA_SSC        0x10    /* seek complete */
  126. #define HA_SFAULT      0x20    /* write fault */
  127. #define HA_SREADY      0x40    /* drive ready */
  128. #define HA_SBUSY       0x80    /* drive busy */
  129. #define HA_SDRDY       HA_SSC+HA_SREADY+HA_SDRQ 
  130. /**********************************************
  131.  * Message definitions       *
  132.  **********************************************/
  133. #define HA_NO_ERROR  0x00 /* No Error */
  134. #define HA_ERR_SEL_TO  0x01 /* Selection Timeout */
  135. #define HA_ERR_CMD_TO  0x02 /* Command Timeout */
  136. #define HA_BUS_RESET  0x03 /* SCSI Bus Reset Received */
  137. #define HA_INIT_POWERUP  0x04 /* Initial Controller Power-up */
  138. #define HA_UNX_BUSPHASE  0x05 /* Unexpected Bus Phase */
  139. #define HA_UNX_BUS_FREE  0x06 /* Unexpected Bus Free */
  140. #define HA_BUS_PARITY  0x07 /* Bus Parity Error */
  141. #define HA_SCSI_HUNG  0x08 /* SCSI Hung */
  142. #define HA_UNX_MSGRJCT  0x09 /* Unexpected Message Rejected */
  143. #define HA_RESET_STUCK  0x0a /* SCSI Bus Reset Stuck */
  144. #define HA_RSENSE_FAIL  0x0b /* Auto Request-Sense Failed */
  145. #define HA_PARITY_ERR  0x0c /* Controller Ram Parity Error */
  146. #define HA_CP_ABORT_NA  0x0d /* Abort Message sent to non-active cmd */
  147. #define HA_CP_ABORTED  0x0e /* Abort Message sent to active cmd */
  148. #define HA_CP_RESET_NA  0x0f /* Reset Message sent to non-active cmd */
  149. #define HA_CP_RESET  0x10 /* Reset Message sent to active cmd */
  150. #define HA_ECC_ERR  0x11 /* Controller Ram ECC Error */
  151. #define HA_PCI_PARITY  0x12 /* PCI Parity Error */
  152. #define HA_PCI_MABORT  0x13 /* PCI Master Abort */
  153. #define HA_PCI_TABORT  0x14 /* PCI Target Abort */
  154. #define HA_PCI_STABORT  0x15 /* PCI Signaled Target Abort */
  155. /**********************************************
  156.  *  Other  definitions       *
  157.  **********************************************/
  158. struct reg_bit {      /* reading this one will clear the interrupt    */
  159.     __u8 error:1;     /* previous command ended in an error       */
  160.     __u8 more:1;      /* more DATA coming soon, poll BSY & DRQ (PIO)  */
  161.     __u8 corr:1;      /* data read was successfully corrected with ECC*/
  162.     __u8 drq:1;       /* data request active  */     
  163.     __u8 sc:1;       /* seek complete       */
  164.     __u8 fault:1;     /* write fault       */
  165.     __u8 ready:1;     /* drive ready       */
  166.     __u8 busy:1;      /* controller busy      */
  167. };
  168. struct reg_abit {     /* reading this won't clear the interrupt */
  169.     __u8 abusy:1;     /* auxiliary busy */
  170.     __u8 irq:1;       /* set when drive interrupt is asserted */
  171.     __u8 dummy:6;
  172. };
  173. struct eata_register {     /* EATA register set */
  174.     __u8 data_reg[2];     /* R, couldn't figure this one out */
  175.     __u8 cp_addr[4];     /* W, CP address register */
  176.     union { 
  177. __u8 command;     /* W, command code: [read|set] conf, send CP*/
  178. struct reg_bit status; /* R, see register_bit1 */
  179. __u8 statusbyte;
  180.     } ovr;   
  181.     struct reg_abit aux_stat; /* R, see register_bit2 */
  182. };
  183. struct get_conf {       /* Read Configuration Array */
  184.     __u32  len;       /* Should return 0x22, 0x24, etc */
  185.     __u32 signature;       /* Signature MUST be "EATA" */
  186.     __u8    version2:4,
  187.      version:4;       /* EATA Version level */
  188.     __u8 OCS_enabled:1,       /* Overlap Command Support enabled */
  189.  TAR_support:1,       /* SCSI Target Mode supported */
  190.       TRNXFR:1,       /* Truncate Transfer Cmd not necessary *
  191.        * Only used in PIO Mode */
  192. MORE_support:1,       /* MORE supported (only PIO Mode) */
  193.  DMA_support:1,       /* DMA supported Driver uses only *
  194.        * this mode */
  195.    DMA_valid:1,       /* DRQ value in Byte 30 is valid */
  196.  ATA:1,       /* ATA device connected (not supported) */
  197.    HAA_valid:1;       /* Hostadapter Address is valid */
  198.     __u16 cppadlen;       /* Number of pad bytes send after CD data *
  199.        * set to zero for DMA commands */
  200.     __u8 scsi_id[4];       /* SCSI ID of controller 2-0 Byte 0 res. *
  201.        * if not, zero is returned */
  202.     __u32  cplen;       /* CP length: number of valid cp bytes */
  203.     __u32  splen;       /* Number of bytes returned after * 
  204.        * Receive SP command */
  205.     __u16 queuesiz;       /* max number of queueable CPs */
  206.     __u16 dummy;
  207.     __u16 SGsiz;       /* max number of SG table entries */
  208.     __u8    IRQ:4,       /* IRQ used this HA */
  209.  IRQ_TR:1,       /* IRQ Trigger: 0=edge, 1=level */
  210.  SECOND:1,       /* This is a secondary controller */
  211.     DMA_channel:2;       /* DRQ index, DRQ is 2comp of DRQX */
  212.     __u8 sync;       /* device at ID 7 tru 0 is running in *
  213.        * synchronous mode, this will disappear */
  214.     __u8   DSBLE:1,       /* ISA i/o addressing is disabled */
  215.  FORCADR:1,       /* i/o address has been forced */
  216.   SG_64K:1,
  217.   SG_UAE:1,
  218. :4;
  219.     __u8  MAX_ID:5,       /* Max number of SCSI target IDs */
  220. MAX_CHAN:3;       /* Number of SCSI busses on HBA */
  221.     __u8 MAX_LUN;       /* Max number of LUNs */
  222.     __u8 :3,
  223.  AUTOTRM:1,
  224.  M1_inst:1,
  225.  ID_qest:1,       /* Raidnum ID is questionable */
  226.   is_PCI:1,       /* HBA is PCI */
  227.  is_EISA:1;       /* HBA is EISA */
  228.     __u8 RAIDNUM;             /* unique HBA identifier                  */
  229.     __u8 unused[474]; 
  230. };
  231. struct eata_sg_list
  232. {
  233.     __u32 data;
  234.     __u32 len;
  235. };
  236. struct eata_ccb {       /* Send Command Packet structure     */
  237.  
  238.     __u8 SCSI_Reset:1,       /* Cause a SCSI Bus reset on the cmd */
  239.    HBA_Init:1,       /* Cause Controller to reinitialize */
  240.        Auto_Req_Sen:1,       /* Do Auto Request Sense on errors */
  241.     scatter:1,       /* Data Ptr points to a SG Packet */
  242.      Resrvd:1,       /* RFU */
  243.   Interpret:1,       /* Interpret the SCSI cdb of own use */
  244.     DataOut:1,       /* Data Out phase with command */
  245.      DataIn:1;       /* Data In phase with command */
  246.     __u8 reqlen;       /* Request Sense Length * 
  247.        * Valid if Auto_Req_Sen=1 */
  248.     __u8 unused[3];
  249.     __u8  FWNEST:1,       /* send cmd to phys RAID component */
  250.  unused2:7;
  251.     __u8 Phsunit:1,       /* physical unit on mirrored pair */
  252.     I_AT:1,       /* inhibit address translation */
  253.  I_HBA_C:1,       /* HBA inhibit caching */
  254.  unused3:5;
  255.     __u8     cp_id:5,       /* SCSI Device ID of target */ 
  256. cp_channel:3;       /* SCSI Channel # of HBA */
  257.     __u8    cp_lun:3,
  258.   :2,
  259.  cp_luntar:1,       /* CP is for target ROUTINE */
  260.  cp_dispri:1,       /* Grant disconnect privilege */
  261.        cp_identify:1;       /* Always TRUE */
  262.     __u8 cp_msg1;       /* Message bytes 0-3 */
  263.     __u8 cp_msg2;
  264.     __u8 cp_msg3;
  265.     __u8 cp_cdb[12];       /* Command Descriptor Block */
  266.     __u32 cp_datalen;       /* Data Transfer Length *
  267.        * If scatter=1 len of sg package */
  268.     void *cp_viraddr;       /* address of this ccb */
  269.     __u32 cp_dataDMA;       /* Data Address, if scatter=1 *
  270.        * address of scatter packet */
  271.     __u32 cp_statDMA;       /* address for Status Packet */ 
  272.     __u32 cp_reqDMA;       /* Request Sense Address, used if *
  273.        * CP command ends with error */
  274.     /* Additional CP info begins here */
  275.     __u32 timestamp;       /* Needed to measure command latency */
  276.     __u32 timeout;
  277.     __u8 sizeindex;
  278.     __u8 rw_latency;
  279.     __u8 retries;
  280.     __u8 status;       /* status of this queueslot */
  281.     Scsi_Cmnd *cmd;       /* address of cmd */
  282.     struct eata_sg_list *sg_list;
  283. };
  284. struct eata_sp {
  285.     __u8 hba_stat:7,       /* HBA status */
  286.       EOC:1;       /* True if command finished */
  287.     __u8 scsi_stat;       /* Target SCSI status */
  288.     __u8 reserved[2];
  289.     __u32  residue_len;       /* Number of bytes not transferred */
  290.     struct eata_ccb *ccb;     /* Address set in COMMAND PACKET */
  291.     __u8 msg[12];
  292. };
  293. typedef struct hstd {
  294.     __u8   vendor[9];
  295.     __u8   name[18];
  296.     __u8   revision[6];
  297.     __u8   EATA_revision;
  298.     __u32  firmware_revision;
  299.     __u8   HBA_number;
  300.     __u8   bustype;  /* bustype of HBA        */
  301.     __u8   channel;  /* # of avail. scsi channels  */
  302.     __u8   state;  /* state of HBA        */
  303.     __u8   primary;  /* true if primary        */
  304.     __u8        more_support:1,  /* HBA supports MORE flag     */
  305.            immediate_support:1,  /* HBA supports IMMEDIATE CMDs*/
  306.               broken_INQUIRY:1;  /* This is an EISA HBA with   *
  307.   * broken INQUIRY        */
  308.     __u8   do_latency;  /* Latency measurement flag   */
  309.     __u32  reads[13];
  310.     __u32  writes[13];
  311.     __u32  reads_lat[12][4];
  312.     __u32  writes_lat[12][4];
  313.     __u32  all_lat[4];
  314.     __u8   resetlevel[MAXCHANNEL]; 
  315.     __u32  last_ccb;  /* Last used ccb        */
  316.     __u32  cplen;  /* size of CP in words        */
  317.     __u16  cppadlen;  /* pad length of cp in words  */
  318.     __u16  queuesize;
  319.     __u16  sgsize;               /* # of entries in the SG list*/
  320.     __u16  devflags;  /* bits set for detected devices */
  321.     __u8   hostid;  /* SCSI ID of HBA        */
  322.     __u8   moresupport;  /* HBA supports MORE flag     */
  323.     struct Scsi_Host *next;     
  324.     struct Scsi_Host *prev;
  325.     struct eata_sp sp;  /* status packet        */ 
  326.     struct eata_ccb ccb[0];  /* ccb array begins here      */
  327. }hostdata;
  328. /* structure for max. 2 emulated drives */
  329. struct drive_geom_emul {
  330.     __u8  trans;  /* translation flag 1=transl */
  331.     __u8  channel;  /* SCSI channel number       */
  332.     __u8  HBA;  /* HBA number (prim/sec)     */
  333.     __u8  id;  /* drive id       */
  334.     __u8  lun;  /* drive lun       */
  335.     __u32 heads;  /* number of heads       */
  336.     __u32 sectors;  /* number of sectors       */
  337.     __u32 cylinder;  /* number of cylinders       */
  338. };
  339. struct geom_emul {
  340.     __u8 bios_drives;  /* number of emulated drives */
  341.     struct drive_geom_emul drv[2]; /* drive structures       */
  342. };
  343. #endif /* _EATA_GENERIC_H */
  344. /*
  345.  * Overrides for Emacs so that we almost follow Linus's tabbing style.
  346.  * Emacs will notice this stuff at the end of the file and automatically
  347.  * adjust the settings for this buffer only.  This must remain at the end
  348.  * of the file.
  349.  * ---------------------------------------------------------------------------
  350.  * Local variables:
  351.  * c-indent-level: 4
  352.  * c-brace-imaginary-offset: 0
  353.  * c-brace-offset: -4
  354.  * c-argdecl-indent: 4
  355.  * c-label-offset: -4
  356.  * c-continued-statement-offset: 4
  357.  * c-continued-brace-offset: 0
  358.  * tab-width: 8
  359.  * End:
  360.  */