libsrp.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __LIBSRP_H__
  3. #define __LIBSRP_H__
  4. #include <linux/list.h>
  5. #include <linux/kfifo.h>
  6. #include <scsi/srp.h>
  7. enum srp_valid {
  8. INVALIDATE_CMD_RESP_EL = 0,
  9. VALID_CMD_RESP_EL = 0x80,
  10. VALID_INIT_MSG = 0xC0,
  11. VALID_TRANS_EVENT = 0xFF
  12. };
  13. enum srp_format {
  14. SRP_FORMAT = 1,
  15. MAD_FORMAT = 2,
  16. OS400_FORMAT = 3,
  17. AIX_FORMAT = 4,
  18. LINUX_FORMAT = 5,
  19. MESSAGE_IN_CRQ = 6
  20. };
  21. enum srp_init_msg {
  22. INIT_MSG = 1,
  23. INIT_COMPLETE_MSG = 2
  24. };
  25. enum srp_trans_event {
  26. UNUSED_FORMAT = 0,
  27. PARTNER_FAILED = 1,
  28. PARTNER_DEREGISTER = 2,
  29. MIGRATED = 6,
  30. PREPARE_FOR_SUSPEND = 9,
  31. RESUME_FROM_SUSP = 0xA
  32. };
  33. enum srp_status {
  34. CRQ_ENTRY_OVERWRITTEN = 0x20,
  35. HEADER_DESCRIPTOR = 0xF1,
  36. PING = 0xF5,
  37. PING_RESPONSE = 0xF6
  38. };
  39. enum srp_mad_version {
  40. MAD_VERSION_1 = 1
  41. };
  42. enum srp_os_type {
  43. OS400 = 1,
  44. LINUX = 2,
  45. AIX = 3,
  46. OFW = 4
  47. };
  48. enum srp_task_attributes {
  49. SRP_SIMPLE_TASK = 0,
  50. SRP_HEAD_TASK = 1,
  51. SRP_ORDERED_TASK = 2,
  52. SRP_ACA_TASK = 4
  53. };
  54. enum {
  55. SRP_TASK_MANAGEMENT_FUNCTION_COMPLETE = 0,
  56. SRP_REQUEST_FIELDS_INVALID = 2,
  57. SRP_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED = 4,
  58. SRP_TASK_MANAGEMENT_FUNCTION_FAILED = 5
  59. };
  60. struct srp_buf {
  61. dma_addr_t dma;
  62. void *buf;
  63. };
  64. struct srp_queue {
  65. void *pool;
  66. void *items;
  67. struct kfifo queue;
  68. spinlock_t lock;
  69. };
  70. struct srp_target {
  71. struct device *dev;
  72. spinlock_t lock;
  73. struct list_head cmd_queue;
  74. size_t srp_iu_size;
  75. struct srp_queue iu_queue;
  76. size_t rx_ring_size;
  77. struct srp_buf **rx_ring;
  78. void *ldata;
  79. };
  80. struct iu_entry {
  81. struct srp_target *target;
  82. struct list_head ilist;
  83. dma_addr_t remote_token;
  84. unsigned long flags;
  85. struct srp_buf *sbuf;
  86. u16 iu_len;
  87. };
  88. struct ibmvscsis_cmd;
  89. typedef int (srp_rdma_t)(struct ibmvscsis_cmd *, struct scatterlist *, int,
  90. struct srp_direct_buf *, int,
  91. enum dma_data_direction, unsigned int);
  92. int srp_target_alloc(struct srp_target *, struct device *, size_t, size_t);
  93. void srp_target_free(struct srp_target *);
  94. struct iu_entry *srp_iu_get(struct srp_target *);
  95. void srp_iu_put(struct iu_entry *);
  96. int srp_transfer_data(struct ibmvscsis_cmd *, struct srp_cmd *,
  97. srp_rdma_t, int, int);
  98. u64 srp_data_length(struct srp_cmd *cmd, enum dma_data_direction dir);
  99. int srp_get_desc_table(struct srp_cmd *srp_cmd, enum dma_data_direction *dir,
  100. u64 *data_len);
  101. static inline int srp_cmd_direction(struct srp_cmd *cmd)
  102. {
  103. return (cmd->buf_fmt >> 4) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
  104. }
  105. #endif