aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ocs_fc/ocs_drv_fc.h
blob: 95684e30354f00edf1d9f6b00a8317296fbe02cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
/*-
 * Copyright (c) 2017 Broadcom. All rights reserved.
 * The term "Broadcom" refers to Broadcom Limited and/or its subsidiaries.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * 3. Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * $FreeBSD$
 */

/**
 * @file
 * OCS linux driver common include file
 */


#if !defined(__OCS_DRV_FC_H__)
#define __OCS_DRV_FC_H__

#define OCS_INCLUDE_FC

#include "ocs_os.h"
#include "ocs_debug.h"
#include "ocs_common.h"
#include "ocs_hw.h"
#include "ocs_io.h"
#include "ocs_pm.h"
#include "ocs_xport.h"
#include "ocs_stats.h"

struct ocs_s {

	ocs_os_t ocs_os;
	char display_name[OCS_DISPLAY_NAME_LENGTH];
	ocs_rlock_t lock;			/*>> Device wide lock */
	ocs_list_t domain_list;			/*>> linked list of virtual fabric objects */
	ocs_io_pool_t *io_pool;			/**< pointer to IO pool */
	ocs_ramlog_t *ramlog;
	ocs_drv_t drv_ocs;
	ocs_scsi_tgt_t tgt_ocs;
	ocs_scsi_ini_t ini_ocs;
	ocs_xport_e ocs_xport;
	ocs_xport_t *xport;			/*>> Pointer to transport object */
	bool enable_ini;
	bool enable_tgt;
	uint8_t fc_type;
	int ctrlmask;
	int logmask;
	uint32_t max_isr_time_msec;		/*>> Maximum ISR time */
	char *hw_war_version;
	ocs_pm_context_t pm_context;		/*<< power management context */
	ocs_mgmt_functions_t *mgmt_functions;
	ocs_mgmt_functions_t *tgt_mgmt_functions;
	ocs_mgmt_functions_t *ini_mgmt_functions;
	ocs_err_injection_e err_injection;	/**< for error injection testing */
	uint32_t cmd_err_inject;		/**< specific cmd to inject error into */
	time_t delay_value_msec;		/**< for injecting delays */

	const char *desc;
	uint32_t instance_index;
	uint16_t pci_vendor;
	uint16_t pci_device;
	uint16_t pci_subsystem_vendor;
	uint16_t pci_subsystem_device;
	char businfo[OCS_DISPLAY_BUS_INFO_LENGTH];

	const char *model;
	const char *driver_version;
	const char *fw_version;

	ocs_hw_t hw;

	ocs_domain_t *domain;			/*>> pointer to first (physical) domain (also on domain_list) */
	uint32_t domain_instance_count;			/*>> domain instance count */
	void (*domain_list_empty_cb)(ocs_t *ocs, void *arg); /*>> domain list empty callback */
	void *domain_list_empty_cb_arg;                 /*>> domain list empty callback argument */

	bool explicit_buffer_list;
	bool external_loopback;
	uint32_t num_vports;
	uint32_t hw_bounce;
	uint32_t rq_threads;
	uint32_t rq_selection_policy;
	uint32_t rr_quanta;
	char *filter_def;
	uint32_t max_remote_nodes;

	bool soft_wwn_enable;

	/*
	 * tgt_rscn_delay - delay in kicking off RSCN processing (nameserver queries)
	 * after receiving an RSCN on the target. This prevents thrashing of nameserver
	 * requests due to a huge burst of RSCNs received in a short period of time
	 * Note: this is only valid when target RSCN handling is enabled -- see ctrlmask.
	 */
	time_t tgt_rscn_delay_msec;		/*>> minimum target RSCN delay */

	/*
	 * tgt_rscn_period - determines maximum frequency when processing back-to-back
	 * RSCNs; e.g. if this value is 30, there will never be any more than 1 RSCN
	 * handling per 30s window. This prevents initiators on a faulty link generating
	 * many RSCN from causing the target to continually query the nameserver. Note:
	 * this is only valid when target RSCN handling is enabled
	 */
	time_t tgt_rscn_period_msec;		/*>> minimum target RSCN period */

	/*
	 * Target IO timer value:
	 * Zero: target command timeout disabled.
	 * Non-zero: Timeout value, in seconds, for target commands
	 */
	uint32_t target_io_timer_sec;

	int speed;
	int topology;
	int ethernet_license;
	int num_scsi_ios;
	bool enable_hlm;			/*>> high login mode is enabled */
	uint32_t hlm_group_size;		/*>> RPI count for high login mode */
	char *wwn_bump;
	uint32_t nodedb_mask;			/*>> Node debugging mask */

	uint32_t auto_xfer_rdy_size;		/*>> Maximum sized write to use auto xfer rdy */
        bool  esoc;
	uint8_t ocs_req_fw_upgrade;

	ocs_textbuf_t ddump_saved;

};

#define ocs_is_fc_initiator_enabled()	(ocs->enable_ini)
#define ocs_is_fc_target_enabled()	(ocs->enable_tgt)

static inline void
ocs_device_lock_init(ocs_t *ocs)
{
	ocs_rlock_init(ocs, &ocs->lock, "ocsdevicelock");
}
static inline void
ocs_device_lock_free(ocs_t *ocs)
{
	ocs_rlock_free(&ocs->lock);
}
static inline int32_t
ocs_device_lock_try(ocs_t *ocs)
{
	return ocs_rlock_try(&ocs->lock);
}
static inline void
ocs_device_lock(ocs_t *ocs)
{
	ocs_rlock_acquire(&ocs->lock);
}
static inline void
ocs_device_unlock(ocs_t *ocs)
{
	ocs_rlock_release(&ocs->lock);
}

extern ocs_t *ocs_get_instance(uint32_t index);
extern int32_t ocs_get_bus_dev_func(ocs_t *ocs, uint8_t* bus, uint8_t* dev, uint8_t* func);

static inline ocs_io_t *
ocs_io_alloc(ocs_t *ocs)
{
	return ocs_io_pool_io_alloc(ocs->xport->io_pool);
}

static inline void
ocs_io_free(ocs_t *ocs, ocs_io_t *io)
{
	ocs_io_pool_io_free(ocs->xport->io_pool, io);
}

extern void ocs_stop_event_processing(ocs_os_t *ocs_os);
extern int32_t ocs_start_event_processing(ocs_os_t *ocs_os);

#include "ocs_domain.h"
#include "ocs_sport.h"
#include "ocs_node.h"
#include "ocs_io.h"
#include "ocs_unsol.h"
#include "ocs_scsi.h"

#include "ocs_ioctl.h"
#include "ocs_elxu.h"


#endif