fcp_impl.h 4.0 KB

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