18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef __LIBSRP_H__ 38c2ecf20Sopenharmony_ci#define __LIBSRP_H__ 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/list.h> 68c2ecf20Sopenharmony_ci#include <linux/kfifo.h> 78c2ecf20Sopenharmony_ci#include <scsi/srp.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cienum srp_valid { 108c2ecf20Sopenharmony_ci INVALIDATE_CMD_RESP_EL = 0, 118c2ecf20Sopenharmony_ci VALID_CMD_RESP_EL = 0x80, 128c2ecf20Sopenharmony_ci VALID_INIT_MSG = 0xC0, 138c2ecf20Sopenharmony_ci VALID_TRANS_EVENT = 0xFF 148c2ecf20Sopenharmony_ci}; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cienum srp_format { 178c2ecf20Sopenharmony_ci SRP_FORMAT = 1, 188c2ecf20Sopenharmony_ci MAD_FORMAT = 2, 198c2ecf20Sopenharmony_ci OS400_FORMAT = 3, 208c2ecf20Sopenharmony_ci AIX_FORMAT = 4, 218c2ecf20Sopenharmony_ci LINUX_FORMAT = 5, 228c2ecf20Sopenharmony_ci MESSAGE_IN_CRQ = 6 238c2ecf20Sopenharmony_ci}; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cienum srp_init_msg { 268c2ecf20Sopenharmony_ci INIT_MSG = 1, 278c2ecf20Sopenharmony_ci INIT_COMPLETE_MSG = 2 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cienum srp_trans_event { 318c2ecf20Sopenharmony_ci UNUSED_FORMAT = 0, 328c2ecf20Sopenharmony_ci PARTNER_FAILED = 1, 338c2ecf20Sopenharmony_ci PARTNER_DEREGISTER = 2, 348c2ecf20Sopenharmony_ci MIGRATED = 6, 358c2ecf20Sopenharmony_ci PREPARE_FOR_SUSPEND = 9, 368c2ecf20Sopenharmony_ci RESUME_FROM_SUSP = 0xA 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cienum srp_status { 408c2ecf20Sopenharmony_ci CRQ_ENTRY_OVERWRITTEN = 0x20, 418c2ecf20Sopenharmony_ci HEADER_DESCRIPTOR = 0xF1, 428c2ecf20Sopenharmony_ci PING = 0xF5, 438c2ecf20Sopenharmony_ci PING_RESPONSE = 0xF6 448c2ecf20Sopenharmony_ci}; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_cienum srp_mad_version { 478c2ecf20Sopenharmony_ci MAD_VERSION_1 = 1 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cienum srp_os_type { 518c2ecf20Sopenharmony_ci OS400 = 1, 528c2ecf20Sopenharmony_ci LINUX = 2, 538c2ecf20Sopenharmony_ci AIX = 3, 548c2ecf20Sopenharmony_ci OFW = 4 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cienum srp_task_attributes { 588c2ecf20Sopenharmony_ci SRP_SIMPLE_TASK = 0, 598c2ecf20Sopenharmony_ci SRP_HEAD_TASK = 1, 608c2ecf20Sopenharmony_ci SRP_ORDERED_TASK = 2, 618c2ecf20Sopenharmony_ci SRP_ACA_TASK = 4 628c2ecf20Sopenharmony_ci}; 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cienum { 658c2ecf20Sopenharmony_ci SRP_TASK_MANAGEMENT_FUNCTION_COMPLETE = 0, 668c2ecf20Sopenharmony_ci SRP_REQUEST_FIELDS_INVALID = 2, 678c2ecf20Sopenharmony_ci SRP_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED = 4, 688c2ecf20Sopenharmony_ci SRP_TASK_MANAGEMENT_FUNCTION_FAILED = 5 698c2ecf20Sopenharmony_ci}; 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistruct srp_buf { 728c2ecf20Sopenharmony_ci dma_addr_t dma; 738c2ecf20Sopenharmony_ci void *buf; 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistruct srp_queue { 778c2ecf20Sopenharmony_ci void *pool; 788c2ecf20Sopenharmony_ci void *items; 798c2ecf20Sopenharmony_ci struct kfifo queue; 808c2ecf20Sopenharmony_ci spinlock_t lock; 818c2ecf20Sopenharmony_ci}; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_cistruct srp_target { 848c2ecf20Sopenharmony_ci struct device *dev; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci spinlock_t lock; 878c2ecf20Sopenharmony_ci struct list_head cmd_queue; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci size_t srp_iu_size; 908c2ecf20Sopenharmony_ci struct srp_queue iu_queue; 918c2ecf20Sopenharmony_ci size_t rx_ring_size; 928c2ecf20Sopenharmony_ci struct srp_buf **rx_ring; 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci void *ldata; 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistruct iu_entry { 988c2ecf20Sopenharmony_ci struct srp_target *target; 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci struct list_head ilist; 1018c2ecf20Sopenharmony_ci dma_addr_t remote_token; 1028c2ecf20Sopenharmony_ci unsigned long flags; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci struct srp_buf *sbuf; 1058c2ecf20Sopenharmony_ci u16 iu_len; 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistruct ibmvscsis_cmd; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_citypedef int (srp_rdma_t)(struct ibmvscsis_cmd *, struct scatterlist *, int, 1118c2ecf20Sopenharmony_ci struct srp_direct_buf *, int, 1128c2ecf20Sopenharmony_ci enum dma_data_direction, unsigned int); 1138c2ecf20Sopenharmony_ciint srp_target_alloc(struct srp_target *, struct device *, size_t, size_t); 1148c2ecf20Sopenharmony_civoid srp_target_free(struct srp_target *); 1158c2ecf20Sopenharmony_cistruct iu_entry *srp_iu_get(struct srp_target *); 1168c2ecf20Sopenharmony_civoid srp_iu_put(struct iu_entry *); 1178c2ecf20Sopenharmony_ciint srp_transfer_data(struct ibmvscsis_cmd *, struct srp_cmd *, 1188c2ecf20Sopenharmony_ci srp_rdma_t, int, int); 1198c2ecf20Sopenharmony_ciu64 srp_data_length(struct srp_cmd *cmd, enum dma_data_direction dir); 1208c2ecf20Sopenharmony_ciint srp_get_desc_table(struct srp_cmd *srp_cmd, enum dma_data_direction *dir, 1218c2ecf20Sopenharmony_ci u64 *data_len); 1228c2ecf20Sopenharmony_cistatic inline int srp_cmd_direction(struct srp_cmd *cmd) 1238c2ecf20Sopenharmony_ci{ 1248c2ecf20Sopenharmony_ci return (cmd->buf_fmt >> 4) ? DMA_TO_DEVICE : DMA_FROM_DEVICE; 1258c2ecf20Sopenharmony_ci} 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci#endif 128