• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6/drivers/scsi/bfa/
1/*
2 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
3 * All rights reserved
4 * www.brocade.com
5 *
6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License (GPL) Version 2 as
10 * published by the Free Software Foundation
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * General Public License for more details.
16 */
17
18/**
19 *  vfapi.c Fabric module implementation.
20 */
21
22#include "fcs_fabric.h"
23#include "fcs_trcmod.h"
24
25BFA_TRC_FILE(FCS, VFAPI);
26
27/**
28 *  fcs_vf_api virtual fabrics API
29 */
30
31/**
32 * 		Enable VF mode.
33 *
34 * @param[in]		fcs		fcs module instance
35 * @param[in]		vf_id		default vf_id of port, FC_VF_ID_NULL
36 * 					to use standard default vf_id of 1.
37 *
38 * @retval	BFA_STATUS_OK		vf mode is enabled
39 * @retval	BFA_STATUS_BUSY		Port is active. Port must be disabled
40 *					before VF mode can be enabled.
41 */
42bfa_status_t
43bfa_fcs_vf_mode_enable(struct bfa_fcs_s *fcs, u16 vf_id)
44{
45	return BFA_STATUS_OK;
46}
47
48/**
49 * 		Disable VF mode.
50 *
51 * @param[in]		fcs		fcs module instance
52 *
53 * @retval	BFA_STATUS_OK		vf mode is disabled
54 * @retval	BFA_STATUS_BUSY		VFs are present and being used. All
55 * 					VFs must be deleted before disabling
56 *					VF mode.
57 */
58bfa_status_t
59bfa_fcs_vf_mode_disable(struct bfa_fcs_s *fcs)
60{
61	return BFA_STATUS_OK;
62}
63
64/**
65 * 		Create a new VF instance.
66 *
67 *  A new VF is created using the given VF configuration. A VF is identified
68 *  by VF id. No duplicate VF creation is allowed with the same VF id. Once
69 *  a VF is created, VF is automatically started after link initialization
70 *  and EVFP exchange is completed.
71 *
72 * 	param[in] vf		- 	FCS vf data structure. Memory is
73 *					allocated by caller (driver)
74 * 	param[in] fcs 		- 	FCS module
75 * 	param[in] vf_cfg	- 	VF configuration
76 * 	param[in] vf_drv 	- 	Opaque handle back to the driver's
77 *					virtual vf structure
78 *
79 * 	retval BFA_STATUS_OK VF creation is successful
80 * 	retval BFA_STATUS_FAILED VF creation failed
81 * 	retval BFA_STATUS_EEXIST A VF exists with the given vf_id
82 */
83bfa_status_t
84bfa_fcs_vf_create(bfa_fcs_vf_t *vf, struct bfa_fcs_s *fcs, u16 vf_id,
85		  struct bfa_port_cfg_s *port_cfg, struct bfad_vf_s *vf_drv)
86{
87	bfa_trc(fcs, vf_id);
88	return BFA_STATUS_OK;
89}
90
91/**
92 *  	Use this function to delete a BFA VF object. VF object should
93 * 		be stopped before this function call.
94 *
95 * 	param[in] vf - pointer to bfa_vf_t.
96 *
97 * 	retval BFA_STATUS_OK	On vf deletion success
98 * 	retval BFA_STATUS_BUSY VF is not in a stopped state
99 * 	retval BFA_STATUS_INPROGRESS VF deletion in in progress
100 */
101bfa_status_t
102bfa_fcs_vf_delete(bfa_fcs_vf_t *vf)
103{
104	bfa_trc(vf->fcs, vf->vf_id);
105	return BFA_STATUS_OK;
106}
107
108/**
109 *  	Start participation in VF. This triggers login to the virtual fabric.
110 *
111 * 	param[in] vf - pointer to bfa_vf_t.
112 *
113 * 	return None
114 */
115void
116bfa_fcs_vf_start(bfa_fcs_vf_t *vf)
117{
118	bfa_trc(vf->fcs, vf->vf_id);
119}
120
121/**
122 *  	Logout with the virtual fabric.
123 *
124 * 	param[in] vf - pointer to bfa_vf_t.
125 *
126 * 	retval BFA_STATUS_OK 	On success.
127 * 	retval BFA_STATUS_INPROGRESS VF is being stopped.
128 */
129bfa_status_t
130bfa_fcs_vf_stop(bfa_fcs_vf_t *vf)
131{
132	bfa_trc(vf->fcs, vf->vf_id);
133	return BFA_STATUS_OK;
134}
135
136/**
137 *  	Returns attributes of the given VF.
138 *
139 * 	param[in] 	vf			pointer to bfa_vf_t.
140 * 	param[out] vf_attr 	vf attributes returned
141 *
142 * 	return None
143 */
144void
145bfa_fcs_vf_get_attr(bfa_fcs_vf_t *vf, struct bfa_vf_attr_s *vf_attr)
146{
147	bfa_trc(vf->fcs, vf->vf_id);
148}
149
150/**
151 * 		Return statistics associated with the given vf.
152 *
153 * 	param[in] 	vf			pointer to bfa_vf_t.
154 * 	param[out] vf_stats 	vf statistics returned
155 *
156 *  @return None
157 */
158void
159bfa_fcs_vf_get_stats(bfa_fcs_vf_t *vf, struct bfa_vf_stats_s *vf_stats)
160{
161	bfa_os_memcpy(vf_stats, &vf->stats, sizeof(struct bfa_vf_stats_s));
162	return;
163}
164
165void
166/**
167 * 		clear statistics associated with the given vf.
168 *
169 * 	param[in] 	vf			pointer to bfa_vf_t.
170 *
171 *  @return None
172 */
173bfa_fcs_vf_clear_stats(bfa_fcs_vf_t *vf)
174{
175	bfa_os_memset(&vf->stats, 0, sizeof(struct bfa_vf_stats_s));
176	return;
177}
178
179/**
180 *  	Returns FCS vf structure for a given vf_id.
181 *
182 * 	param[in] 	vf_id		- VF_ID
183 *
184 * 	return
185 * 		If lookup succeeds, retuns fcs vf object, otherwise returns NULL
186 */
187bfa_fcs_vf_t   *
188bfa_fcs_vf_lookup(struct bfa_fcs_s *fcs, u16 vf_id)
189{
190	bfa_trc(fcs, vf_id);
191	if (vf_id == FC_VF_ID_NULL)
192		return &fcs->fabric;
193
194	/**
195	 * @todo vf support
196	 */
197
198	return NULL;
199}
200
201/**
202 *  	Returns driver VF structure for a given FCS vf.
203 *
204 * 	param[in] 	vf		- pointer to bfa_vf_t
205 *
206 * 	return Driver VF structure
207 */
208struct bfad_vf_s      *
209bfa_fcs_vf_get_drv_vf(bfa_fcs_vf_t *vf)
210{
211	bfa_assert(vf);
212	bfa_trc(vf->fcs, vf->vf_id);
213	return vf->vf_drv;
214}
215
216/**
217 *  	Return the list of VFs configured.
218 *
219 * 	param[in]	fcs	fcs module instance
220 * 	param[out] 	vf_ids	returned list of vf_ids
221 * 	param[in,out] 	nvfs	in:size of vf_ids array,
222 * 				out:total elements present,
223 * 				actual elements returned is limited by the size
224 *
225 * 	return Driver VF structure
226 */
227void
228bfa_fcs_vf_list(struct bfa_fcs_s *fcs, u16 *vf_ids, int *nvfs)
229{
230	bfa_trc(fcs, *nvfs);
231}
232
233/**
234 *  	Return the list of all VFs visible from fabric.
235 *
236 * 	param[in]	fcs	fcs module instance
237 * 	param[out] 	vf_ids	returned list of vf_ids
238 * 	param[in,out] 	nvfs	in:size of vf_ids array,
239 *				out:total elements present,
240 * 				actual elements returned is limited by the size
241 *
242 * 	return Driver VF structure
243 */
244void
245bfa_fcs_vf_list_all(struct bfa_fcs_s *fcs, u16 *vf_ids, int *nvfs)
246{
247	bfa_trc(fcs, *nvfs);
248}
249
250/**
251 * 		Return the list of local logical ports present in the given VF.
252 *
253 * 	param[in]	vf	vf for which logical ports are returned
254 * 	param[out] 	lpwwn	returned logical port wwn list
255 * 	param[in,out] 	nlports	in:size of lpwwn list;
256 *				out:total elements present,
257 * 				actual elements returned is limited by the size
258 *
259 */
260void
261bfa_fcs_vf_get_ports(bfa_fcs_vf_t *vf, wwn_t lpwwn[], int *nlports)
262{
263	struct list_head        *qe;
264	struct bfa_fcs_vport_s *vport;
265	int             i;
266	struct bfa_fcs_s      *fcs;
267
268	if (vf == NULL || lpwwn == NULL || *nlports == 0)
269		return;
270
271	fcs = vf->fcs;
272
273	bfa_trc(fcs, vf->vf_id);
274	bfa_trc(fcs, (u32) *nlports);
275
276	i = 0;
277	lpwwn[i++] = vf->bport.port_cfg.pwwn;
278
279	list_for_each(qe, &vf->vport_q) {
280		if (i >= *nlports)
281			break;
282
283		vport = (struct bfa_fcs_vport_s *) qe;
284		lpwwn[i++] = vport->lport.port_cfg.pwwn;
285	}
286
287	bfa_trc(fcs, i);
288	*nlports = i;
289	return;
290}
291