brintos

brintos / linux-shallow public Read only

0
0
Text · 10.4 KiB · 7ae074e Raw
363 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*******************************************************************************3 * IBM Virtual SCSI Target Driver4 * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.5 *			   Santiago Leon (santil@us.ibm.com) IBM Corp.6 *			   Linda Xie (lxie@us.ibm.com) IBM Corp.7 *8 * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>9 * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>10 * Copyright (C) 2016 Bryant G. Ly <bryantly@linux.vnet.ibm.com> IBM Corp.11 *12 * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>13 * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>14 *15 ****************************************************************************/16 17#ifndef __H_IBMVSCSI_TGT18#define __H_IBMVSCSI_TGT19 20#include <linux/interrupt.h>21#include "libsrp.h"22 23#define SYS_ID_NAME_LEN		6424#define PARTITION_NAMELEN	9625#define IBMVSCSIS_NAMELEN       3226 27#define MSG_HI  028#define MSG_LOW 129 30#define MAX_CMD_Q_PAGES       431#define CRQ_PER_PAGE          (PAGE_SIZE / sizeof(struct viosrp_crq))32/* in terms of number of elements */33#define DEFAULT_CMD_Q_SIZE    CRQ_PER_PAGE34#define MAX_CMD_Q_SIZE        (DEFAULT_CMD_Q_SIZE * MAX_CMD_Q_PAGES)35 36#define SRP_VIOLATION           0x102  /* general error code */37 38/*39 * SRP buffer formats defined as of 16.a supported by this driver.40 */41#define SUPPORTED_FORMATS  ((SRP_DATA_DESC_DIRECT << 1) | \42			    (SRP_DATA_DESC_INDIRECT << 1))43 44#define SCSI_LUN_ADDR_METHOD_FLAT	145 46struct dma_window {47	u32 liobn;	/* Unique per vdevice */48	u64 tce_base;	/* Physical location of the TCE table */49	u64 tce_size;	/* Size of the TCE table in bytes */50};51 52struct target_dds {53	u64 unit_id;                /* 64 bit will force alignment */54#define NUM_DMA_WINDOWS 255#define LOCAL  056#define REMOTE 157	struct dma_window  window[NUM_DMA_WINDOWS];58 59	/* root node property "ibm,partition-no" */60	uint partition_num;61	char partition_name[PARTITION_NAMELEN];62};63 64#define MAX_NUM_PORTS        165#define MAX_H_COPY_RDMA      (128 * 1024)66 67#define MAX_EYE   6468 69/* Return codes */70#define ADAPT_SUCCESS            0L71/* choose error codes that do not conflict with PHYP */72#define ERROR                   -40L73 74struct format_code {75	u8 reserved;76	u8 buffers;77};78 79struct client_info {80#define SRP_VERSION "16.a"81	char srp_version[8];82	/* root node property ibm,partition-name */83	char partition_name[PARTITION_NAMELEN];84	/* root node property ibm,partition-no */85	u32 partition_number;86	/* initially 1 */87	u32 mad_version;88	u32 os_type;89};90 91/*92 * Changing this constant changes the number of seconds to wait before93 * considering the client will never service its queue again.94 */95#define SECONDS_TO_CONSIDER_FAILED 3096/*97 * These constants set the polling period used to determine if the client98 * has freed at least one element in the response queue.99 */100#define WAIT_SECONDS 1101#define WAIT_NANO_SECONDS 5000102#define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \103			SECONDS_TO_CONSIDER_FAILED)104/*105 * general purpose timer control block106 * which can be used for multiple functions107 */108struct timer_cb {109	struct hrtimer timer;110	/*111	 * how long has it been since the client112	 * serviced the queue. The variable is incrmented113	 * in the service_wait_q routine and cleared114	 * in send messages115	 */116	int timer_pops;117	/* the timer is started */118	bool started;119};120 121struct cmd_queue {122	/* kva */123	struct viosrp_crq *base_addr;124	dma_addr_t crq_token;125	/* used to maintain index */126	uint mask;127	/* current element */128	uint index;129	int size;130};131 132#define SCSOLNT_RESP_SHIFT	1133#define UCSOLNT_RESP_SHIFT	2134 135#define SCSOLNT         BIT(SCSOLNT_RESP_SHIFT)136#define UCSOLNT         BIT(UCSOLNT_RESP_SHIFT)137 138enum cmd_type {139	SCSI_CDB	= 0x01,140	TASK_MANAGEMENT	= 0x02,141	/* MAD or addressed to port 0 */142	ADAPTER_MAD	= 0x04,143	UNSET_TYPE	= 0x08,144};145 146struct iu_rsp {147	u8 format;148	u8 sol_not;149	u16 len;150	/* tag is just to help client identify cmd, so don't translate be/le */151	u64 tag;152};153 154struct ibmvscsis_cmd {155	struct list_head list;156	/* Used for TCM Core operations */157	struct se_cmd se_cmd;158	struct iu_entry *iue;159	struct iu_rsp rsp;160	struct work_struct work;161	struct scsi_info *adapter;162	struct ibmvscsis_cmd *abort_cmd;163	/* Sense buffer that will be mapped into outgoing status */164	unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];165	u64 init_time;166#define CMD_FAST_FAIL	BIT(0)167#define DELAY_SEND	BIT(1)168	u32 flags;169	char type;170};171 172struct ibmvscsis_nexus {173	struct se_session *se_sess;174};175 176struct ibmvscsis_tport {177	/* SCSI protocol the tport is providing */178	u8 tport_proto_id;179	/* ASCII formatted WWPN for SRP Target port */180	char tport_name[IBMVSCSIS_NAMELEN];181	/* Returned by ibmvscsis_make_tport() */182	struct se_wwn tport_wwn;183	/* Returned by ibmvscsis_make_tpg() */184	struct se_portal_group se_tpg;185	/* ibmvscsis port target portal group tag for TCM */186	u16 tport_tpgt;187	/* Pointer to TCM session for I_T Nexus */188	struct ibmvscsis_nexus *ibmv_nexus;189	bool enabled;190	bool releasing;191};192 193struct scsi_info {194	struct list_head list;195	char eye[MAX_EYE];196 197	/* commands waiting for space on repsonse queue */198	struct list_head waiting_rsp;199#define NO_QUEUE                    0x00200#define WAIT_ENABLED                0X01201#define WAIT_CONNECTION             0x04202	/* have established a connection */203#define CONNECTED                   0x08204	/* at least one port is processing SRP IU */205#define SRP_PROCESSING              0x10206	/* remove request received */207#define UNCONFIGURING               0x20208	/* disconnect by letting adapter go idle, no error */209#define WAIT_IDLE                   0x40210	/* disconnecting to clear an error */211#define ERR_DISCONNECT              0x80212	/* disconnect to clear error state, then come back up */213#define ERR_DISCONNECT_RECONNECT    0x100214	/* disconnected after clearing an error */215#define ERR_DISCONNECTED            0x200216	/* A series of errors caused unexpected errors */217#define UNDEFINED                   0x400218	u16  state;219	int fast_fail;220	struct target_dds dds;221	char *cmd_pool;222	/* list of free commands */223	struct list_head free_cmd;224	/* command elements ready for scheduler */225	struct list_head schedule_q;226	/* commands sent to TCM */227	struct list_head active_q;228	caddr_t *map_buf;229	/* ioba of map buffer */230	dma_addr_t map_ioba;231	/* allowable number of outstanding SRP requests */232	int request_limit;233	/* extra credit */234	int credit;235	/* outstanding transactions against credit limit */236	int debit;237 238	/* allow only one outstanding mad request */239#define PROCESSING_MAD                0x00002240	/* Waiting to go idle */241#define WAIT_FOR_IDLE		      0x00004242	/* H_REG_CRQ called */243#define CRQ_CLOSED                    0x00010244	/* detected that client has failed */245#define CLIENT_FAILED                 0x00040246	/* detected that transport event occurred */247#define TRANS_EVENT                   0x00080248	/* don't attempt to send anything to the client */249#define RESPONSE_Q_DOWN               0x00100250	/* request made to schedule disconnect handler */251#define SCHEDULE_DISCONNECT           0x00400252	/* disconnect handler is scheduled */253#define DISCONNECT_SCHEDULED          0x00800254	/* remove function is sleeping */255#define CFG_SLEEPING                  0x01000256	/* Register for Prepare for Suspend Transport Events */257#define PREP_FOR_SUSPEND_ENABLED      0x02000258	/* Prepare for Suspend event sent */259#define PREP_FOR_SUSPEND_PENDING      0x04000260	/* Resume from Suspend event sent */261#define PREP_FOR_SUSPEND_ABORTED      0x08000262	/* Prepare for Suspend event overwrote another CRQ entry */263#define PREP_FOR_SUSPEND_OVERWRITE    0x10000264	u32 flags;265	/* adapter lock */266	spinlock_t intr_lock;267	/* information needed to manage command queue */268	struct cmd_queue cmd_q;269	/* used in hcall to copy response back into srp buffer */270	u64  empty_iu_id;271	/* used in crq, to tag what iu the response is for */272	u64  empty_iu_tag;273	uint new_state;274	uint resume_state;275	/* control block for the response queue timer */276	struct timer_cb rsp_q_timer;277	/* keep last client to enable proper accounting */278	struct client_info client_data;279	/* what can this client do */280	u32 client_cap;281	/*282	 * The following two fields capture state and flag changes that283	 * can occur when the lock is given up.  In the orginal design,284	 * the lock was held during calls into phyp;285	 * however, phyp did not meet PAPR architecture.  This is286	 * a work around.287	 */288	u16  phyp_acr_state;289	u32 phyp_acr_flags;290 291	struct workqueue_struct *work_q;292	struct completion wait_idle;293	struct completion unconfig;294	struct device dev;295	struct vio_dev *dma_dev;296	struct srp_target target;297	struct ibmvscsis_tport tport;298	struct tasklet_struct work_task;299	struct work_struct proc_work;300};301 302/*303 * Provide a constant that allows software to detect the adapter is304 * disconnecting from the client from one of several states.305 */306#define IS_DISCONNECTING (UNCONFIGURING | ERR_DISCONNECT_RECONNECT | \307			  ERR_DISCONNECT)308 309/*310 * Provide a constant that can be used with interrupt handling that311 * essentially lets the interrupt handler know that all requests should312 * be thrown out,313 */314#define DONT_PROCESS_STATE (IS_DISCONNECTING | UNDEFINED | \315			    ERR_DISCONNECTED  | WAIT_IDLE)316 317/*318 * If any of these flag bits are set then do not allow the interrupt319 * handler to schedule the off level handler.320 */321#define BLOCK (DISCONNECT_SCHEDULED)322 323/* State and transition events that stop the interrupt handler */324#define TARGET_STOP(VSCSI) (long)(((VSCSI)->state & DONT_PROCESS_STATE) | \325				  ((VSCSI)->flags & BLOCK))326 327#define PREP_FOR_SUSPEND_FLAGS  (PREP_FOR_SUSPEND_ENABLED | \328				 PREP_FOR_SUSPEND_PENDING | \329				 PREP_FOR_SUSPEND_ABORTED | \330				 PREP_FOR_SUSPEND_OVERWRITE)331 332/* flag bit that are not reset during disconnect */333#define PRESERVE_FLAG_FIELDS (PREP_FOR_SUSPEND_FLAGS)334 335#define vio_iu(IUE) ((union viosrp_iu *)((IUE)->sbuf->buf))336 337#define READ_CMD(cdb)	(((cdb)[0] & 0x1F) == 8)338#define WRITE_CMD(cdb)	(((cdb)[0] & 0x1F) == 0xA)339 340#ifndef H_GET_PARTNER_INFO341#define H_GET_PARTNER_INFO              0x0000000000000008LL342#endif343#ifndef H_ENABLE_PREPARE_FOR_SUSPEND344#define H_ENABLE_PREPARE_FOR_SUSPEND    0x000000000000001DLL345#endif346#ifndef H_READY_FOR_SUSPEND347#define H_READY_FOR_SUSPEND             0x000000000000001ELL348#endif349 350 351#define h_copy_rdma(l, sa, sb, da, db) \352		plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)353#define h_vioctl(u, o, a, u1, u2, u3, u4) \354		plpar_hcall_norets(H_VIOCTL, u, o, a, u1, u2)355#define h_reg_crq(ua, tok, sz) \356		plpar_hcall_norets(H_REG_CRQ, ua, tok, sz)357#define h_free_crq(ua) \358		plpar_hcall_norets(H_FREE_CRQ, ua)359#define h_send_crq(ua, d1, d2) \360		plpar_hcall_norets(H_SEND_CRQ, ua, d1, d2)361 362#endif363