1229997Sken/*-
2229997Sken * Copyright (c) 2003-2009 Silicon Graphics International Corp.
3229997Sken * Copyright (c) 2011 Spectra Logic Corporation
4287621Smav * Copyright (c) 2015 Alexander Motin <mav@FreeBSD.org>
5229997Sken * All rights reserved.
6229997Sken *
7229997Sken * Redistribution and use in source and binary forms, with or without
8229997Sken * modification, are permitted provided that the following conditions
9229997Sken * are met:
10229997Sken * 1. Redistributions of source code must retain the above copyright
11229997Sken *    notice, this list of conditions, and the following disclaimer,
12229997Sken *    without modification.
13229997Sken * 2. Redistributions in binary form must reproduce at minimum a disclaimer
14229997Sken *    substantially similar to the "NO WARRANTY" disclaimer below
15229997Sken *    ("Disclaimer") and any redistribution must be conditioned upon
16229997Sken *    including a substantially similar Disclaimer requirement for further
17229997Sken *    binary redistribution.
18229997Sken *
19229997Sken * NO WARRANTY
20229997Sken * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21229997Sken * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22229997Sken * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
23229997Sken * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24229997Sken * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25229997Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26229997Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27229997Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28229997Sken * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29229997Sken * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30229997Sken * POSSIBILITY OF SUCH DAMAGES.
31229997Sken *
32229997Sken * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_ha.h#1 $
33229997Sken * $FreeBSD: releng/11.0/sys/cam/ctl/ctl_ha.h 288146 2015-09-23 15:49:27Z mav $
34229997Sken */
35229997Sken
36229997Sken#ifndef _CTL_HA_H_
37229997Sken#define	_CTL_HA_H_
38229997Sken
39229997Sken/*
40229997Sken * CTL High Availability Modes:
41229997Sken *
42287621Smav * CTL_HA_MODE_ACT_STBY:  Commands are serialized to the master side.
43287621Smav *			  No media access commands on slave side (Standby).
44287621Smav * CTL_HA_MODE_SER_ONLY:  Commands are serialized to the master side.
45287621Smav *			  Media can be accessed on both sides.
46287621Smav * CTL_HA_MODE_XFER:	  Commands and data are forwarded to the
47287621Smav *			  master side for execution.
48229997Sken */
49229997Skentypedef enum {
50274785Smav	CTL_HA_MODE_ACT_STBY,
51229997Sken	CTL_HA_MODE_SER_ONLY,
52229997Sken	CTL_HA_MODE_XFER
53229997Sken} ctl_ha_mode;
54229997Sken
55229997Sken/*
56229997Sken * Communication channel IDs for various system components.  This is to
57229997Sken * make sure one CTL instance talks with another, one ZFS instance talks
58229997Sken * with another, etc.
59229997Sken */
60229997Skentypedef enum {
61229997Sken	CTL_HA_CHAN_CTL,
62287621Smav	CTL_HA_CHAN_DATA,
63229997Sken	CTL_HA_CHAN_MAX
64229997Sken} ctl_ha_channel;
65229997Sken
66229997Sken/*
67229997Sken * HA communication event notification.  These are events generated by the
68229997Sken * HA communication subsystem.
69229997Sken *
70229997Sken * CTL_HA_EVT_MSG_RECV:		Message received by the other node.
71287621Smav * CTL_HA_EVT_LINK_CHANGE:	Communication channel status changed.
72229997Sken */
73229997Skentypedef enum {
74229997Sken	CTL_HA_EVT_NONE,
75229997Sken	CTL_HA_EVT_MSG_RECV,
76287621Smav	CTL_HA_EVT_LINK_CHANGE,
77229997Sken	CTL_HA_EVT_MAX
78229997Sken} ctl_ha_event;
79229997Sken
80229997Skentypedef enum {
81229997Sken	CTL_HA_STATUS_WAIT,
82229997Sken	CTL_HA_STATUS_SUCCESS,
83229997Sken	CTL_HA_STATUS_ERROR,
84229997Sken	CTL_HA_STATUS_INVALID,
85229997Sken	CTL_HA_STATUS_DISCONNECT,
86229997Sken	CTL_HA_STATUS_BUSY,
87229997Sken	CTL_HA_STATUS_MAX
88229997Sken} ctl_ha_status;
89229997Sken
90229997Skentypedef enum {
91229997Sken	CTL_HA_DT_CMD_READ,
92229997Sken	CTL_HA_DT_CMD_WRITE,
93229997Sken} ctl_ha_dt_cmd;
94229997Sken
95229997Skenstruct ctl_ha_dt_req;
96229997Sken
97229997Skentypedef void (*ctl_ha_dt_cb)(struct ctl_ha_dt_req *);
98229997Sken
99229997Skenstruct ctl_ha_dt_req {
100229997Sken	ctl_ha_dt_cmd	command;
101229997Sken	void		*context;
102229997Sken	ctl_ha_dt_cb	callback;
103229997Sken	int		ret;
104229997Sken	uint32_t	size;
105229997Sken	uint8_t		*local;
106229997Sken	uint8_t		*remote;
107287621Smav	TAILQ_ENTRY(ctl_ha_dt_req)	 links;
108229997Sken};
109229997Sken
110287621Smavstruct ctl_softc;
111287621Smavctl_ha_status ctl_ha_msg_init(struct ctl_softc *softc);
112287957Smavvoid ctl_ha_msg_shutdown(struct ctl_softc *softc);
113287957Smavctl_ha_status ctl_ha_msg_destroy(struct ctl_softc *softc);
114287621Smav
115229997Skentypedef void (*ctl_evt_handler)(ctl_ha_channel channel, ctl_ha_event event,
116229997Sken				int param);
117229997Skenvoid ctl_ha_register_evthandler(ctl_ha_channel channel,
118229997Sken				ctl_evt_handler handler);
119229997Sken
120287621Smavctl_ha_status ctl_ha_msg_register(ctl_ha_channel channel,
121287621Smav    ctl_evt_handler handler);
122287621Smavctl_ha_status ctl_ha_msg_recv(ctl_ha_channel channel, void *addr,
123287621Smav    size_t len, int wait);
124287621Smavctl_ha_status ctl_ha_msg_send(ctl_ha_channel channel, const void *addr,
125287621Smav    size_t len, int wait);
126287621Smavctl_ha_status ctl_ha_msg_send2(ctl_ha_channel channel, const void *addr,
127287621Smav    size_t len, const void *addr2, size_t len2, int wait);
128288146Smavctl_ha_status ctl_ha_msg_abort(ctl_ha_channel channel);
129287621Smavctl_ha_status ctl_ha_msg_deregister(ctl_ha_channel channel);
130229997Sken
131287621Smavstruct ctl_ha_dt_req * ctl_dt_req_alloc(void);
132287621Smavvoid ctl_dt_req_free(struct ctl_ha_dt_req *req);
133287621Smavctl_ha_status ctl_dt_single(struct ctl_ha_dt_req *req);
134229997Sken
135229997Skentypedef enum {
136287621Smav	CTL_HA_LINK_OFFLINE	= 0x00,
137287621Smav	CTL_HA_LINK_UNKNOWN	= 0x01,
138287621Smav	CTL_HA_LINK_ONLINE	= 0x02
139287621Smav} ctl_ha_link_state;
140229997Sken
141229997Sken#endif /* _CTL_HA_H_ */
142