/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __LIBSRP_H__ #define __LIBSRP_H__ #include <linux/list.h> #include <linux/kfifo.h> #include <scsi/srp.h> enum srp_valid { INVALIDATE_CMD_RESP_EL = 0, VALID_CMD_RESP_EL = 0x80, VALID_INIT_MSG = 0xC0, VALID_TRANS_EVENT = 0xFF }; enum srp_format { SRP_FORMAT = 1, MAD_FORMAT = 2, OS400_FORMAT = 3, AIX_FORMAT = 4, LINUX_FORMAT = 5, MESSAGE_IN_CRQ = 6 }; enum srp_init_msg { INIT_MSG = 1, INIT_COMPLETE_MSG = 2 }; enum srp_trans_event { UNUSED_FORMAT = 0, PARTNER_FAILED = 1, PARTNER_DEREGISTER = 2, MIGRATED = 6, PREPARE_FOR_SUSPEND = 9, RESUME_FROM_SUSP = 0xA }; enum srp_status { CRQ_ENTRY_OVERWRITTEN = 0x20, HEADER_DESCRIPTOR = 0xF1, PING = 0xF5, PING_RESPONSE = 0xF6 }; enum srp_mad_version { MAD_VERSION_1 = 1 }; enum srp_os_type { OS400 = 1, LINUX = 2, AIX = 3, OFW = 4 }; enum srp_task_attributes { SRP_SIMPLE_TASK = 0, SRP_HEAD_TASK = 1, SRP_ORDERED_TASK = 2, SRP_ACA_TASK = 4 }; enum { SRP_TASK_MANAGEMENT_FUNCTION_COMPLETE = 0, SRP_REQUEST_FIELDS_INVALID = 2, SRP_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED = 4, SRP_TASK_MANAGEMENT_FUNCTION_FAILED = 5 }; struct srp_buf { dma_addr_t dma; void *buf; }; struct srp_queue { void *pool; void *items; struct kfifo queue; spinlock_t lock; }; struct srp_target { struct device *dev; spinlock_t lock; struct list_head cmd_queue; size_t srp_iu_size; struct srp_queue iu_queue; size_t rx_ring_size; struct srp_buf **rx_ring; void *ldata; }; struct iu_entry { struct srp_target *target; struct list_head ilist; dma_addr_t remote_token; unsigned long flags; struct srp_buf *sbuf; u16 iu_len; }; struct ibmvscsis_cmd; typedef int (srp_rdma_t)(struct ibmvscsis_cmd *, struct scatterlist *, int, struct srp_direct_buf *, int, enum dma_data_direction, unsigned int); int srp_target_alloc(struct srp_target *, struct device *, size_t, size_t); void srp_target_free(struct srp_target *); struct iu_entry *srp_iu_get(struct srp_target *); void srp_iu_put(struct iu_entry *); int srp_transfer_data(struct ibmvscsis_cmd *, struct srp_cmd *, srp_rdma_t, int, int); u64 srp_data_length(struct srp_cmd *cmd, enum dma_data_direction dir); int srp_get_desc_table(struct srp_cmd *srp_cmd, enum dma_data_direction *dir, u64 *data_len); static inline int srp_cmd_direction(struct srp_cmd *cmd) { return (cmd->buf_fmt >> 4) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; } #endif