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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* fcp_impl.h: Generic SCSI on top of FC4 - our interface defines.
  2.  *
  3.  * Copyright (C) 1997-1999 Jakub Jelinek (jj@ultra.linux.cz)
  4.  * Copyright (C) 1998 Jirka Hanika (geo@ff.cuni.cz)
  5.  */
  6. #ifndef _FCP_SCSI_H
  7. #define _FCP_SCSI_H
  8. #include <linux/types.h>
  9. #include <linux/blk.h>
  10. #include "../scsi/scsi.h"
  11. #include "fc.h"
  12. #include "fcp.h"
  13. #include "fc-al.h"
  14. #include <asm/io.h>
  15. #ifdef __sparc__
  16. #include <asm/sbus.h>
  17. #endif
  18. /* 0 or 1 */
  19. #define FCP_SCSI_USE_NEW_EH_CODE 0
  20. #define FC_CLASS_OUTBOUND 0x01
  21. #define FC_CLASS_INBOUND 0x02
  22. #define FC_CLASS_SIMPLE 0x03
  23. #define FC_CLASS_IO_WRITE 0x04
  24. #define FC_CLASS_IO_READ 0x05
  25. #define FC_CLASS_UNSOLICITED 0x06
  26. #define FC_CLASS_OFFLINE 0x08
  27. #define PROTO_OFFLINE 0x02
  28. #define PROTO_REPORT_AL_MAP 0x03
  29. #define PROTO_FORCE_LIP 0x06
  30. struct _fc_channel; 
  31. typedef struct fcp_cmnd {
  32. struct fcp_cmnd *next;
  33. struct fcp_cmnd *prev;
  34. void (*done)(Scsi_Cmnd *);
  35. unsigned short proto;
  36. unsigned short token;
  37. unsigned int did;
  38. /* FCP SCSI stuff */
  39. dma_addr_t data;
  40. /* From now on this cannot be touched for proto == TYPE_SCSI_FCP */
  41. fc_hdr fch;
  42. dma_addr_t cmd;
  43. dma_addr_t rsp;
  44. int cmdlen;
  45. int rsplen;
  46. int class;
  47. int datalen;
  48. /* This is just used as a verification during login */
  49. struct _fc_channel *fc;
  50. void *ls;
  51. } fcp_cmnd;
  52. typedef struct {
  53. unsigned int len;
  54. unsigned char list[0];
  55. } fcp_posmap;
  56. typedef struct _fc_channel {
  57. struct _fc_channel *next;
  58. int irq;
  59. int state;
  60. int sid;
  61. int did;
  62. char name[16];
  63. void (*fcp_register)(struct _fc_channel *, u8, int);
  64. void (*reset)(struct _fc_channel *);
  65. int (*hw_enque)(struct _fc_channel *, fcp_cmnd *);
  66. fc_wwn wwn_node;
  67. fc_wwn wwn_nport;
  68. fc_wwn wwn_dest;
  69. common_svc_parm *common_svc;
  70. svc_parm *class_svcs;
  71. #ifdef __sparc__
  72. struct sbus_dev *dev;
  73. #else
  74. struct pci_dev *dev;
  75. #endif
  76. struct module *module;
  77. /* FCP SCSI stuff */
  78. short can_queue;
  79. short abort_count;
  80. int rsp_size;
  81. fcp_cmd *scsi_cmd_pool;
  82. char *scsi_rsp_pool;
  83. dma_addr_t dma_scsi_cmd, dma_scsi_rsp;
  84. long *scsi_bitmap;
  85. long scsi_bitmap_end;
  86. int scsi_free;
  87. int (*encode_addr)(Scsi_Cmnd *, u16 *, struct _fc_channel *, fcp_cmnd *);
  88. fcp_cmnd *scsi_que;
  89. char scsi_name[4];
  90. fcp_cmnd **cmd_slots;
  91. int channels;
  92. int targets;
  93. long *ages;
  94. Scsi_Cmnd *rst_pkt;
  95. fcp_posmap *posmap;
  96. /* LOGIN stuff */
  97. fcp_cmnd *login;
  98. void *ls;
  99. } fc_channel;
  100. extern fc_channel *fc_channels;
  101. #define FC_STATE_UNINITED 0
  102. #define FC_STATE_ONLINE 1
  103. #define FC_STATE_OFFLINE 2
  104. #define FC_STATE_RESETING 3
  105. #define FC_STATE_FPORT_OK 4
  106. #define FC_STATE_MAYBEOFFLINE 5
  107. #define FC_STATUS_OK 0
  108. #define FC_STATUS_P_RJT 2
  109. #define FC_STATUS_F_RJT 3
  110. #define FC_STATUS_P_BSY 4
  111. #define FC_STATUS_F_BSY 5
  112. #define FC_STATUS_ERR_OFFLINE 0x11
  113. #define FC_STATUS_TIMEOUT 0x12
  114. #define FC_STATUS_ERR_OVERRUN 0x13
  115. #define FC_STATUS_POINTTOPOINT 0x15
  116. #define FC_STATUS_AL 0x16
  117. #define FC_STATUS_UNKNOWN_CQ_TYPE 0x20
  118. #define FC_STATUS_BAD_SEG_CNT 0x21
  119. #define FC_STATUS_MAX_XCHG_EXCEEDED 0x22
  120. #define FC_STATUS_BAD_XID 0x23
  121. #define FC_STATUS_XCHG_BUSY 0x24
  122. #define FC_STATUS_BAD_POOL_ID 0x25
  123. #define FC_STATUS_INSUFFICIENT_CQES 0x26
  124. #define FC_STATUS_ALLOC_FAIL 0x27
  125. #define FC_STATUS_BAD_SID 0x28
  126. #define FC_STATUS_NO_SEQ_INIT 0x29
  127. #define FC_STATUS_TIMED_OUT -1
  128. #define FC_STATUS_BAD_RSP -2
  129. void fcp_queue_empty(fc_channel *);
  130. int fcp_init(fc_channel *);
  131. void fcp_release(fc_channel *fc_chain, int count);
  132. void fcp_receive_solicited(fc_channel *, int, int, int, fc_hdr *);
  133. void fcp_state_change(fc_channel *, int);
  134. int fc_do_plogi(fc_channel *, unsigned char, fc_wwn *, fc_wwn *);
  135. int fc_do_prli(fc_channel *, unsigned char);
  136. #define for_each_fc_channel(fc)
  137. for (fc = fc_channels; fc; fc = fc->next)
  138. #define for_each_online_fc_channel(fc) 
  139. for_each_fc_channel(fc)
  140. if (fc->state == FC_STATE_ONLINE)
  141. int fcp_scsi_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *));
  142. int fcp_old_abort(Scsi_Cmnd *);
  143. int fcp_scsi_abort(Scsi_Cmnd *);
  144. int fcp_scsi_dev_reset(Scsi_Cmnd *);
  145. int fcp_scsi_bus_reset(Scsi_Cmnd *);
  146. int fcp_scsi_host_reset(Scsi_Cmnd *);
  147. #endif /* !(_FCP_SCSI_H) */