Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Copyright (c) 2005-2010 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#ifndef __BFA_SVC_H__
 19#define __BFA_SVC_H__
 20
 21#include "bfa_cs.h"
 22#include "bfi_ms.h"
 23
 24
 25/*
 26 * Scatter-gather DMA related defines
 27 */
 28#define BFA_SGPG_MIN	(16)
 29#define BFA_SGPG_MAX	(8192)
 30
 31/*
 32 * Alignment macro for SG page allocation
 33 */
 34#define BFA_SGPG_ROUNDUP(_l) (((_l) + (sizeof(struct bfi_sgpg_s) - 1))	\
 35			      & ~(sizeof(struct bfi_sgpg_s) - 1))
 36
 37struct bfa_sgpg_wqe_s {
 38	struct list_head qe;	/*  queue sg page element	*/
 39	int	nsgpg;		/*  pages to be allocated	*/
 40	int	nsgpg_total;	/*  total pages required	*/
 41	void	(*cbfn) (void *cbarg);	/*  callback function	*/
 42	void	*cbarg;		/*  callback arg		*/
 43	struct list_head sgpg_q;	/*  queue of alloced sgpgs	*/
 44};
 45
 46struct bfa_sgpg_s {
 47	struct list_head  qe;	/*  queue sg page element	*/
 48	struct bfi_sgpg_s *sgpg;	/*  va of SG page		*/
 49	union bfi_addr_u sgpg_pa;	/*  pa of SG page		*/
 50};
 51
 52/*
 53 * Given number of SG elements, BFA_SGPG_NPAGE() returns the number of
 54 * SG pages required.
 55 */
 56#define BFA_SGPG_NPAGE(_nsges)  (((_nsges) / BFI_SGPG_DATA_SGES) + 1)
 57
 58/* Max SGPG dma segs required */
 59#define BFA_SGPG_DMA_SEGS	\
 60	BFI_MEM_DMA_NSEGS(BFA_SGPG_MAX, (uint32_t)sizeof(struct bfi_sgpg_s))
 61
 62struct bfa_sgpg_mod_s {
 63	struct bfa_s *bfa;
 64	int		num_sgpgs;	/*  number of SG pages		*/
 65	int		free_sgpgs;	/*  number of free SG pages	*/
 66	struct list_head	sgpg_q;		/*  queue of free SG pages */
 67	struct list_head	sgpg_wait_q;	/*  wait queue for SG pages */
 68	struct bfa_mem_dma_s	dma_seg[BFA_SGPG_DMA_SEGS];
 69	struct bfa_mem_kva_s	kva_seg;
 70};
 71#define BFA_SGPG_MOD(__bfa)	(&(__bfa)->modules.sgpg_mod)
 72#define BFA_MEM_SGPG_KVA(__bfa) (&(BFA_SGPG_MOD(__bfa)->kva_seg))
 73
 74bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q,
 75			     int nsgpgs);
 76void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs);
 77void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe,
 78		    void (*cbfn) (void *cbarg), void *cbarg);
 79void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs);
 80void bfa_sgpg_wcancel(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe);
 81
 82
 83/*
 84 * FCXP related defines
 85 */
 86#define BFA_FCXP_MIN		(1)
 87#define BFA_FCXP_MAX		(256)
 88#define BFA_FCXP_MAX_IBUF_SZ	(2 * 1024 + 256)
 89#define BFA_FCXP_MAX_LBUF_SZ	(4 * 1024 + 256)
 90
 91/* Max FCXP dma segs required */
 92#define BFA_FCXP_DMA_SEGS						\
 93	BFI_MEM_DMA_NSEGS(BFA_FCXP_MAX,					\
 94		(u32)BFA_FCXP_MAX_IBUF_SZ + BFA_FCXP_MAX_LBUF_SZ)
 95
 96struct bfa_fcxp_mod_s {
 97	struct bfa_s      *bfa;		/* backpointer to BFA */
 98	struct bfa_fcxp_s *fcxp_list;	/* array of FCXPs */
 99	u16	num_fcxps;	/* max num FCXP requests */
100	struct list_head  fcxp_free_q;	/* free FCXPs */
101	struct list_head  fcxp_active_q;	/* active FCXPs */
102	struct list_head  wait_q;		/* wait queue for free fcxp */
103	struct list_head fcxp_unused_q; /* unused fcxps */
 
 
 
104	u32	req_pld_sz;
105	u32	rsp_pld_sz;
106	struct bfa_mem_dma_s dma_seg[BFA_FCXP_DMA_SEGS];
107	struct bfa_mem_kva_s kva_seg;
108};
109
110#define BFA_FCXP_MOD(__bfa)		(&(__bfa)->modules.fcxp_mod)
111#define BFA_FCXP_FROM_TAG(__mod, __tag)	(&(__mod)->fcxp_list[__tag])
112#define BFA_MEM_FCXP_KVA(__bfa) (&(BFA_FCXP_MOD(__bfa)->kva_seg))
113
114typedef void    (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp,
115				   void *cb_arg, bfa_status_t req_status,
116				   u32 rsp_len, u32 resid_len,
117				   struct fchs_s *rsp_fchs);
118
119typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid);
120typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid);
121typedef void (*bfa_cb_fcxp_send_t) (void *bfad_fcxp, struct bfa_fcxp_s *fcxp,
122				    void *cbarg, enum bfa_status req_status,
123				    u32 rsp_len, u32 resid_len,
124				    struct fchs_s *rsp_fchs);
125typedef void (*bfa_fcxp_alloc_cbfn_t) (void *cbarg, struct bfa_fcxp_s *fcxp);
126
127
128
129/*
130 * Information needed for a FCXP request
131 */
132struct bfa_fcxp_req_info_s {
133	struct bfa_rport_s *bfa_rport;
134					/* Pointer to the bfa rport that was
135					 * returned from bfa_rport_create().
136					 * This could be left NULL for WKA or
137					 * for FCXP interactions before the
138					 * rport nexus is established
139					 */
140	struct fchs_s	fchs;	/*  request FC header structure */
141	u8		cts;	/*  continuous sequence */
142	u8		class;	/*  FC class for the request/response */
143	u16	max_frmsz;	/*  max send frame size */
144	u16	vf_id;	/*  vsan tag if applicable */
145	u8		lp_tag;	/*  lport tag */
146	u32	req_tot_len;	/*  request payload total length */
147};
148
149struct bfa_fcxp_rsp_info_s {
150	struct fchs_s	rsp_fchs;
151				/* Response frame's FC header will
152				 * be sent back in this field */
153	u8		rsp_timeout;
154				/* timeout in seconds, 0-no response */
155	u8		rsvd2[3];
156	u32	rsp_maxlen;	/*  max response length expected */
157};
158
159struct bfa_fcxp_s {
160	struct list_head	qe;		/*  fcxp queue element */
161	bfa_sm_t	sm;		/*  state machine */
162	void		*caller;	/*  driver or fcs */
163	struct bfa_fcxp_mod_s *fcxp_mod;
164	/*  back pointer to fcxp mod */
165	u16	fcxp_tag;	/*  internal tag */
166	struct bfa_fcxp_req_info_s req_info;
167	/*  request info */
168	struct bfa_fcxp_rsp_info_s rsp_info;
169	/*  response info */
170	u8	use_ireqbuf;	/*  use internal req buf */
171	u8		use_irspbuf;	/*  use internal rsp buf */
172	u32	nreq_sgles;	/*  num request SGLEs */
173	u32	nrsp_sgles;	/*  num response SGLEs */
174	struct list_head req_sgpg_q;	/*  SG pages for request buf */
175	struct list_head req_sgpg_wqe;	/*  wait queue for req SG page */
176	struct list_head rsp_sgpg_q;	/*  SG pages for response buf */
177	struct list_head rsp_sgpg_wqe;	/*  wait queue for rsp SG page */
178
179	bfa_fcxp_get_sgaddr_t req_sga_cbfn;
180	/*  SG elem addr user function */
181	bfa_fcxp_get_sglen_t req_sglen_cbfn;
182	/*  SG elem len user function */
183	bfa_fcxp_get_sgaddr_t rsp_sga_cbfn;
184	/*  SG elem addr user function */
185	bfa_fcxp_get_sglen_t rsp_sglen_cbfn;
186	/*  SG elem len user function */
187	bfa_cb_fcxp_send_t send_cbfn;   /*  send completion callback */
188	void		*send_cbarg;	/*  callback arg */
189	struct bfa_sge_s   req_sge[BFA_FCXP_MAX_SGES];
190	/*  req SG elems */
191	struct bfa_sge_s   rsp_sge[BFA_FCXP_MAX_SGES];
192	/*  rsp SG elems */
193	u8		rsp_status;	/*  comp: rsp status */
194	u32	rsp_len;	/*  comp: actual response len */
195	u32	residue_len;	/*  comp: residual rsp length */
196	struct fchs_s	rsp_fchs;	/*  comp: response fchs */
197	struct bfa_cb_qe_s    hcb_qe;	/*  comp: callback qelem */
198	struct bfa_reqq_wait_s	reqq_wqe;
199	bfa_boolean_t	reqq_waiting;
 
200};
201
202struct bfa_fcxp_wqe_s {
203	struct list_head		qe;
204	bfa_fcxp_alloc_cbfn_t	alloc_cbfn;
205	void		*alloc_cbarg;
206	void		*caller;
207	struct bfa_s	*bfa;
208	int		nreq_sgles;
209	int		nrsp_sgles;
210	bfa_fcxp_get_sgaddr_t	req_sga_cbfn;
211	bfa_fcxp_get_sglen_t	req_sglen_cbfn;
212	bfa_fcxp_get_sgaddr_t	rsp_sga_cbfn;
213	bfa_fcxp_get_sglen_t	rsp_sglen_cbfn;
214};
215
216#define BFA_FCXP_REQ_PLD(_fcxp)		(bfa_fcxp_get_reqbuf(_fcxp))
217#define BFA_FCXP_RSP_FCHS(_fcxp)	(&((_fcxp)->rsp_info.fchs))
218#define BFA_FCXP_RSP_PLD(_fcxp)		(bfa_fcxp_get_rspbuf(_fcxp))
219
220#define BFA_FCXP_REQ_PLD_PA(_fcxp)					      \
221	bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,	      \
222		(_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz)
223
224/* fcxp_buf = req_buf + rsp_buf :- add req_buf_sz to get to rsp_buf */
225#define BFA_FCXP_RSP_PLD_PA(_fcxp)					       \
226	(bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,	       \
227	      (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz) + \
228	      (_fcxp)->fcxp_mod->req_pld_sz)
229
230void	bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
231
232
233/*
234 * RPORT related defines
235 */
236enum bfa_rport_event {
237	BFA_RPORT_SM_CREATE	= 1,	/*  rport create event          */
238	BFA_RPORT_SM_DELETE	= 2,	/*  deleting an existing rport  */
239	BFA_RPORT_SM_ONLINE	= 3,	/*  rport is online             */
240	BFA_RPORT_SM_OFFLINE	= 4,	/*  rport is offline            */
241	BFA_RPORT_SM_FWRSP	= 5,	/*  firmware response           */
242	BFA_RPORT_SM_HWFAIL	= 6,	/*  IOC h/w failure             */
243	BFA_RPORT_SM_QOS_SCN	= 7,	/*  QoS SCN from firmware       */
244	BFA_RPORT_SM_SET_SPEED	= 8,	/*  Set Rport Speed             */
245	BFA_RPORT_SM_QRESUME	= 9,	/*  space in requeue queue      */
246};
247
248#define BFA_RPORT_MIN	4
249
250struct bfa_rport_mod_s {
251	struct bfa_rport_s *rps_list;	/*  list of rports	*/
252	struct list_head	rp_free_q;	/*  free bfa_rports	*/
253	struct list_head	rp_active_q;	/*  free bfa_rports	*/
254	struct list_head	rp_unused_q;	/*  unused bfa rports  */
255	u16	num_rports;	/*  number of rports	*/
256	struct bfa_mem_kva_s	kva_seg;
257};
258
259#define BFA_RPORT_MOD(__bfa)	(&(__bfa)->modules.rport_mod)
260#define BFA_MEM_RPORT_KVA(__bfa) (&(BFA_RPORT_MOD(__bfa)->kva_seg))
261
262/*
263 * Convert rport tag to RPORT
264 */
265#define BFA_RPORT_FROM_TAG(__bfa, _tag)				\
266	(BFA_RPORT_MOD(__bfa)->rps_list +			\
267	 ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1)))
268
269/*
270 * protected functions
271 */
272void	bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
273void	bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw);
274
275/*
276 *	BFA rport information.
277 */
278struct bfa_rport_info_s {
279	u16	max_frmsz;	/*  max rcv pdu size		    */
280	u32	pid:24,	/*  remote port ID		    */
281		lp_tag:8;	/*  tag			    */
282	u32	local_pid:24,	/*  local port ID		    */
283		cisc:8;	/*  CIRO supported		    */
284	u8	fc_class;	/*  supported FC classes. enum fc_cos */
285	u8	vf_en;		/*  virtual fabric enable	    */
286	u16	vf_id;		/*  virtual fabric ID		    */
287	enum bfa_port_speed speed;	/*  Rport's current speed	    */
288};
289
290/*
291 * BFA rport data structure
292 */
293struct bfa_rport_s {
294	struct list_head	qe;	/*  queue element		    */
295	bfa_sm_t	sm;		/*  state machine		    */
296	struct bfa_s	*bfa;		/*  backpointer to BFA		    */
297	void		*rport_drv;	/*  fcs/driver rport object	    */
298	u16	fw_handle;	/*  firmware rport handle	    */
299	u16	rport_tag;	/*  BFA rport tag		    */
300	u8	lun_mask;	/*  LUN mask flag		    */
301	struct bfa_rport_info_s rport_info; /*  rport info from fcs/driver */
302	struct bfa_reqq_wait_s reqq_wait; /*  to wait for room in reqq     */
303	struct bfa_cb_qe_s hcb_qe;	/*  BFA callback qelem		    */
304	struct bfa_rport_hal_stats_s stats; /*  BFA rport statistics	    */
305	struct bfa_rport_qos_attr_s qos_attr;
306	union a {
307		bfa_status_t	status;	/*  f/w status */
308		void		*fw_msg; /*  QoS scn event		    */
309	} event_arg;
310};
311#define BFA_RPORT_FC_COS(_rport)	((_rport)->rport_info.fc_class)
312
313
314/*
315 * UF - unsolicited receive related defines
316 */
317
318#define BFA_UF_MIN	(4)
319#define BFA_UF_MAX	(256)
320
321struct bfa_uf_s {
322	struct list_head	qe;	/*  queue element		*/
323	struct bfa_s		*bfa;	/*  bfa instance		*/
324	u16	uf_tag;		/*  identifying tag fw msgs	*/
325	u16	vf_id;
326	u16	src_rport_handle;
327	u16	rsvd;
328	u8		*data_ptr;
329	u16	data_len;	/*  actual receive length	*/
330	u16	pb_len;		/*  posted buffer length	*/
331	void		*buf_kva;	/*  buffer virtual address	*/
332	u64	buf_pa;		/*  buffer physical address	*/
333	struct bfa_cb_qe_s hcb_qe;	/*  comp: BFA comp qelem	*/
334	struct bfa_sge_s sges[BFI_SGE_INLINE_MAX];
335};
336
337/*
338 *      Callback prototype for unsolicited frame receive handler.
339 *
340 * @param[in]           cbarg           callback arg for receive handler
341 * @param[in]           uf              unsolicited frame descriptor
342 *
343 * @return None
344 */
345typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf);
346
347#define BFA_UF_BUFSZ	(2 * 1024 + 256)
348
349struct bfa_uf_buf_s {
350	u8	d[BFA_UF_BUFSZ];
351};
352
353#define BFA_PER_UF_DMA_SZ	\
354	(u32)BFA_ROUNDUP(sizeof(struct bfa_uf_buf_s), BFA_DMA_ALIGN_SZ)
355
356/* Max UF dma segs required */
357#define BFA_UF_DMA_SEGS BFI_MEM_DMA_NSEGS(BFA_UF_MAX, BFA_PER_UF_DMA_SZ)
358
359struct bfa_uf_mod_s {
360	struct bfa_s *bfa;		/*  back pointer to BFA */
361	struct bfa_uf_s *uf_list;	/*  array of UFs */
362	u16	num_ufs;	/*  num unsolicited rx frames */
363	struct list_head	uf_free_q;	/*  free UFs */
364	struct list_head	uf_posted_q;	/*  UFs posted to IOC */
365	struct list_head	uf_unused_q;	/*  unused UF's */
366	struct bfi_uf_buf_post_s *uf_buf_posts;
367	/*  pre-built UF post msgs */
368	bfa_cb_uf_recv_t ufrecv;	/*  uf recv handler function */
369	void		*cbarg;		/*  uf receive handler arg */
370	struct bfa_mem_dma_s	dma_seg[BFA_UF_DMA_SEGS];
371	struct bfa_mem_kva_s	kva_seg;
372};
373
374#define BFA_UF_MOD(__bfa)	(&(__bfa)->modules.uf_mod)
375#define BFA_MEM_UF_KVA(__bfa)	(&(BFA_UF_MOD(__bfa)->kva_seg))
376
377#define ufm_pbs_pa(_ufmod, _uftag)					\
378	bfa_mem_get_dmabuf_pa(_ufmod, _uftag, BFA_PER_UF_DMA_SZ)
379
380void	bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
381void	bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw);
382
383/*
384 * LPS - bfa lport login/logout service interface
385 */
386struct bfa_lps_s {
387	struct list_head	qe;	/*  queue element		*/
388	struct bfa_s	*bfa;		/*  parent bfa instance	*/
389	bfa_sm_t	sm;		/*  finite state machine	*/
390	u8		bfa_tag;	/*  lport tag		*/
391	u8		fw_tag;		/*  lport fw tag                */
392	u8		reqq;		/*  lport request queue	*/
393	u8		alpa;		/*  ALPA for loop topologies	*/
394	u32	lp_pid;		/*  lport port ID		*/
395	bfa_boolean_t	fdisc;		/*  snd FDISC instead of FLOGI	*/
396	bfa_boolean_t	auth_en;	/*  enable authentication	*/
397	bfa_boolean_t	auth_req;	/*  authentication required	*/
398	bfa_boolean_t	npiv_en;	/*  NPIV is allowed by peer	*/
399	bfa_boolean_t	fport;		/*  attached peer is F_PORT	*/
400	bfa_boolean_t	brcd_switch;	/*  attached peer is brcd sw	*/
401	bfa_status_t	status;		/*  login status		*/
402	u16		pdusz;		/*  max receive PDU size	*/
403	u16		pr_bbcred;	/*  BB_CREDIT from peer		*/
404	u8		pr_bbscn;	/*  BB_SCN from peer		*/
405	u8		bb_scn;		/*  local BB_SCN		*/
406	u8		lsrjt_rsn;	/*  LSRJT reason		*/
407	u8		lsrjt_expl;	/*  LSRJT explanation		*/
408	u8		lun_mask;	/*  LUN mask flag		*/
409	wwn_t		pwwn;		/*  port wwn of lport		*/
410	wwn_t		nwwn;		/*  node wwn of lport		*/
411	wwn_t		pr_pwwn;	/*  port wwn of lport peer	*/
412	wwn_t		pr_nwwn;	/*  node wwn of lport peer	*/
413	mac_t		lp_mac;		/*  fpma/spma MAC for lport	*/
414	mac_t		fcf_mac;	/*  FCF MAC of lport		*/
415	struct bfa_reqq_wait_s	wqe;	/*  request wait queue element	*/
416	void		*uarg;		/*  user callback arg		*/
417	struct bfa_cb_qe_s hcb_qe;	/*  comp: callback qelem	*/
418	struct bfi_lps_login_rsp_s *loginrsp;
419	bfa_eproto_status_t ext_status;
420};
421
422struct bfa_lps_mod_s {
423	struct list_head		lps_free_q;
424	struct list_head		lps_active_q;
425	struct list_head		lps_login_q;
426	struct bfa_lps_s	*lps_arr;
427	int			num_lps;
428	struct bfa_mem_kva_s	kva_seg;
429};
430
431#define BFA_LPS_MOD(__bfa)		(&(__bfa)->modules.lps_mod)
432#define BFA_LPS_FROM_TAG(__mod, __tag)	(&(__mod)->lps_arr[__tag])
433#define BFA_MEM_LPS_KVA(__bfa)	(&(BFA_LPS_MOD(__bfa)->kva_seg))
434
435/*
436 * external functions
437 */
438void	bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
439
440
441/*
442 * FCPORT related defines
443 */
444
445#define BFA_FCPORT(_bfa)	(&((_bfa)->modules.port))
446
447/*
448 * Link notification data structure
449 */
450struct bfa_fcport_ln_s {
451	struct bfa_fcport_s	*fcport;
452	bfa_sm_t		sm;
453	struct bfa_cb_qe_s	ln_qe;	/*  BFA callback queue elem for ln */
454	enum bfa_port_linkstate ln_event; /*  ln event for callback */
455};
456
457struct bfa_fcport_trunk_s {
458	struct bfa_trunk_attr_s	attr;
459};
460
461/*
462 * BFA FC port data structure
463 */
464struct bfa_fcport_s {
465	struct bfa_s		*bfa;	/*  parent BFA instance */
466	bfa_sm_t		sm;	/*  port state machine */
467	wwn_t			nwwn;	/*  node wwn of physical port */
468	wwn_t			pwwn;	/*  port wwn of physical oprt */
469	enum bfa_port_speed speed_sup;
470	/*  supported speeds */
471	enum bfa_port_speed speed;	/*  current speed */
472	enum bfa_port_topology topology;	/*  current topology */
473	u8			myalpa;	/*  my ALPA in LOOP topology */
474	u8			rsvd[3];
 
 
 
475	struct bfa_port_cfg_s	cfg;	/*  current port configuration */
476	bfa_boolean_t		use_flash_cfg; /* get port cfg from flash */
477	struct bfa_qos_attr_s  qos_attr;   /* QoS Attributes */
478	struct bfa_qos_vc_attr_s qos_vc_attr;  /*  VC info from ELP */
479	struct bfa_reqq_wait_s	reqq_wait;
480	/*  to wait for room in reqq */
481	struct bfa_reqq_wait_s	svcreq_wait;
482	/*  to wait for room in reqq */
483	struct bfa_reqq_wait_s	stats_reqq_wait;
484	/*  to wait for room in reqq (stats) */
485	void			*event_cbarg;
486	void			(*event_cbfn) (void *cbarg,
487					       enum bfa_port_linkstate event);
488	union {
489		union bfi_fcport_i2h_msg_u i2hmsg;
490	} event_arg;
491	void			*bfad;	/*  BFA driver handle */
492	struct bfa_fcport_ln_s	ln; /*  Link Notification */
493	struct bfa_cb_qe_s	hcb_qe;	/*  BFA callback queue elem */
494	struct bfa_timer_s	timer;	/*  timer */
495	u32		msgtag;	/*  fimrware msg tag for reply */
496	u8			*stats_kva;
497	u64		stats_pa;
498	union bfa_fcport_stats_u *stats;
499	bfa_status_t		stats_status; /*  stats/statsclr status */
500	struct list_head	stats_pending_q;
501	struct list_head	statsclr_pending_q;
502	bfa_boolean_t		stats_qfull;
503	u32		stats_reset_time; /*  stats reset time stamp */
504	bfa_boolean_t		diag_busy; /*  diag busy status */
505	bfa_boolean_t		beacon; /*  port beacon status */
506	bfa_boolean_t		link_e2e_beacon; /*  link beacon status */
507	bfa_boolean_t		bbsc_op_state;	/* Cred recov Oper State */
508	struct bfa_fcport_trunk_s trunk;
509	u16		fcoe_vlan;
510	struct bfa_mem_dma_s	fcport_dma;
 
 
 
511};
512
513#define BFA_FCPORT_MOD(__bfa)	(&(__bfa)->modules.fcport)
514#define BFA_MEM_FCPORT_DMA(__bfa) (&(BFA_FCPORT_MOD(__bfa)->fcport_dma))
515
516/*
517 * protected functions
518 */
519void bfa_fcport_init(struct bfa_s *bfa);
520void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
521
522/*
523 * bfa fcport API functions
524 */
525bfa_status_t bfa_fcport_enable(struct bfa_s *bfa);
526bfa_status_t bfa_fcport_disable(struct bfa_s *bfa);
527bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa,
528				  enum bfa_port_speed speed);
529enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa);
530bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa,
531				     enum bfa_port_topology topo);
532enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa);
 
533bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa);
534bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa);
535u8 bfa_fcport_get_myalpa(struct bfa_s *bfa);
536bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa);
537bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize);
538u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa);
539u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa);
540void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr);
541wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node);
542void bfa_fcport_event_register(struct bfa_s *bfa,
543			void (*event_cbfn) (void *cbarg,
544			enum bfa_port_linkstate event), void *event_cbarg);
545bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa);
 
 
 
 
546enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa);
547
548void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit, u8 bb_scn);
549bfa_boolean_t     bfa_fcport_is_ratelim(struct bfa_s *bfa);
550void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon,
551			bfa_boolean_t link_e2e_beacon);
552bfa_boolean_t	bfa_fcport_is_linkup(struct bfa_s *bfa);
553bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa,
554			struct bfa_cb_pending_q_s *cb);
555bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa,
556			struct bfa_cb_pending_q_s *cb);
557bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa);
558bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa);
 
 
559bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa);
560void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state);
 
 
 
 
561
562/*
563 * bfa rport API functions
564 */
565struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv);
566void bfa_rport_online(struct bfa_rport_s *rport,
567		      struct bfa_rport_info_s *rport_info);
568void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed);
569void bfa_cb_rport_online(void *rport);
570void bfa_cb_rport_offline(void *rport);
571void bfa_cb_rport_qos_scn_flowid(void *rport,
572				 struct bfa_rport_qos_attr_s old_qos_attr,
573				 struct bfa_rport_qos_attr_s new_qos_attr);
 
 
 
574void bfa_cb_rport_qos_scn_prio(void *rport,
575			       struct bfa_rport_qos_attr_s old_qos_attr,
576			       struct bfa_rport_qos_attr_s new_qos_attr);
577
578/*
579 *	Rport LUN masking related
580 */
581#define BFA_RPORT_TAG_INVALID	0xffff
582#define BFA_LP_TAG_INVALID	0xff
583void	bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
584void	bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
585bfa_boolean_t	bfa_rport_lunmask_active(struct bfa_rport_s *rp);
586wwn_t	bfa_rport_get_pwwn(struct bfa_s *bfa, struct bfa_rport_s *rp);
587struct bfa_rport_s *bfa_rport_get_by_wwn(struct bfa_s *bfa, u16 vf_id,
588					 wwn_t *lpwwn, wwn_t rpwwn);
589void *bfa_cb_get_rp_by_wwn(void *arg, u16 vf_id, wwn_t *lpwwn, wwn_t rpwwn);
590
591/*
592 * bfa fcxp API functions
593 */
594struct bfa_fcxp_s *bfa_fcxp_alloc(void *bfad_fcxp, struct bfa_s *bfa,
595				  int nreq_sgles, int nrsp_sgles,
596				  bfa_fcxp_get_sgaddr_t get_req_sga,
597				  bfa_fcxp_get_sglen_t get_req_sglen,
598				  bfa_fcxp_get_sgaddr_t get_rsp_sga,
599				  bfa_fcxp_get_sglen_t get_rsp_sglen);
600void bfa_fcxp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe,
 
601				bfa_fcxp_alloc_cbfn_t alloc_cbfn,
602				void *cbarg, void *bfad_fcxp,
603				int nreq_sgles, int nrsp_sgles,
604				bfa_fcxp_get_sgaddr_t get_req_sga,
605				bfa_fcxp_get_sglen_t get_req_sglen,
606				bfa_fcxp_get_sgaddr_t get_rsp_sga,
607				bfa_fcxp_get_sglen_t get_rsp_sglen);
 
608void bfa_fcxp_walloc_cancel(struct bfa_s *bfa,
609			    struct bfa_fcxp_wqe_s *wqe);
610void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp);
611
612void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp);
613void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp);
614
615void bfa_fcxp_free(struct bfa_fcxp_s *fcxp);
616
617void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport,
618		   u16 vf_id, u8 lp_tag,
619		   bfa_boolean_t cts, enum fc_cos cos,
620		   u32 reqlen, struct fchs_s *fchs,
621		   bfa_cb_fcxp_send_t cbfn,
622		   void *cbarg,
623		   u32 rsp_maxlen, u8 rsp_timeout);
624bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp);
625u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp);
626u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa);
627void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw);
628
629static inline void *
630bfa_uf_get_frmbuf(struct bfa_uf_s *uf)
631{
632	return uf->data_ptr;
633}
634
635static inline   u16
636bfa_uf_get_frmlen(struct bfa_uf_s *uf)
637{
638	return uf->data_len;
639}
640
641/*
642 * bfa uf API functions
643 */
644void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv,
645			  void *cbarg);
646void bfa_uf_free(struct bfa_uf_s *uf);
647
648/*
649 * bfa lport service api
650 */
651
652u32 bfa_lps_get_max_vport(struct bfa_s *bfa);
653struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa);
654void bfa_lps_delete(struct bfa_lps_s *lps);
655void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa,
656		   u16 pdusz, wwn_t pwwn, wwn_t nwwn,
657		   bfa_boolean_t auth_en, u8 bb_scn);
658void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz,
659		   wwn_t pwwn, wwn_t nwwn);
660void bfa_lps_fdisclogo(struct bfa_lps_s *lps);
661void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid);
662u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag);
663u32 bfa_lps_get_base_pid(struct bfa_s *bfa);
664u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid);
665void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status);
 
666void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status);
667void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg);
668void bfa_cb_lps_cvl_event(void *bfad, void *uarg);
669
670/* FAA specific APIs */
671bfa_status_t bfa_faa_enable(struct bfa_s *bfa,
672			bfa_cb_iocfc_t cbfn, void *cbarg);
673bfa_status_t bfa_faa_disable(struct bfa_s *bfa,
674			bfa_cb_iocfc_t cbfn, void *cbarg);
675bfa_status_t bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr,
676			bfa_cb_iocfc_t cbfn, void *cbarg);
677
678/*
679 *	FC DIAG data structure
680 */
681struct bfa_fcdiag_qtest_s {
682	struct bfa_diag_qtest_result_s *result;
683	bfa_cb_diag_t	cbfn;
684	void		*cbarg;
685	struct bfa_timer_s	timer;
686	u32	status;
687	u32	count;
688	u8	lock;
689	u8	queue;
690	u8	all;
691	u8	timer_active;
692};
693
694struct bfa_fcdiag_lb_s {
695	bfa_cb_diag_t   cbfn;
696	void            *cbarg;
697	void            *result;
698	bfa_boolean_t   lock;
699	u32        status;
700};
701
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
702struct bfa_fcdiag_s {
703	struct bfa_s    *bfa;           /* Back pointer to BFA */
704	struct bfa_trc_mod_s   *trcmod;
705	struct bfa_fcdiag_lb_s lb;
706	struct bfa_fcdiag_qtest_s qtest;
 
707};
708
709#define BFA_FCDIAG_MOD(__bfa)	(&(__bfa)->modules.fcdiag)
710
711void	bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg);
712
713bfa_status_t	bfa_fcdiag_loopback(struct bfa_s *bfa,
714				enum bfa_port_opmode opmode,
715				enum bfa_port_speed speed, u32 lpcnt, u32 pat,
716				struct bfa_diag_loopback_result_s *result,
717				bfa_cb_diag_t cbfn, void *cbarg);
718bfa_status_t	bfa_fcdiag_queuetest(struct bfa_s *bfa, u32 ignore,
719			u32 queue, struct bfa_diag_qtest_result_s *result,
720			bfa_cb_diag_t cbfn, void *cbarg);
721bfa_status_t	bfa_fcdiag_lb_is_running(struct bfa_s *bfa);
 
 
 
 
 
 
 
 
722
723#endif /* __BFA_SVC_H__ */
v4.6
  1/*
  2 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
  3 * Copyright (c) 2014- QLogic Corporation.
  4 * All rights reserved
  5 * www.qlogic.com
  6 *
  7 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
  8 *
  9 * This program is free software; you can redistribute it and/or modify it
 10 * under the terms of the GNU General Public License (GPL) Version 2 as
 11 * published by the Free Software Foundation
 12 *
 13 * This program is distributed in the hope that it will be useful, but
 14 * WITHOUT ANY WARRANTY; without even the implied warranty of
 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 16 * General Public License for more details.
 17 */
 18
 19#ifndef __BFA_SVC_H__
 20#define __BFA_SVC_H__
 21
 22#include "bfa_cs.h"
 23#include "bfi_ms.h"
 24
 25
 26/*
 27 * Scatter-gather DMA related defines
 28 */
 29#define BFA_SGPG_MIN	(16)
 30#define BFA_SGPG_MAX	(8192)
 31
 32/*
 33 * Alignment macro for SG page allocation
 34 */
 35#define BFA_SGPG_ROUNDUP(_l) (((_l) + (sizeof(struct bfi_sgpg_s) - 1))	\
 36			      & ~(sizeof(struct bfi_sgpg_s) - 1))
 37
 38struct bfa_sgpg_wqe_s {
 39	struct list_head qe;	/*  queue sg page element	*/
 40	int	nsgpg;		/*  pages to be allocated	*/
 41	int	nsgpg_total;	/*  total pages required	*/
 42	void	(*cbfn) (void *cbarg);	/*  callback function	*/
 43	void	*cbarg;		/*  callback arg		*/
 44	struct list_head sgpg_q;	/*  queue of alloced sgpgs	*/
 45};
 46
 47struct bfa_sgpg_s {
 48	struct list_head  qe;	/*  queue sg page element	*/
 49	struct bfi_sgpg_s *sgpg;	/*  va of SG page		*/
 50	union bfi_addr_u sgpg_pa;	/*  pa of SG page		*/
 51};
 52
 53/*
 54 * Given number of SG elements, BFA_SGPG_NPAGE() returns the number of
 55 * SG pages required.
 56 */
 57#define BFA_SGPG_NPAGE(_nsges)  (((_nsges) / BFI_SGPG_DATA_SGES) + 1)
 58
 59/* Max SGPG dma segs required */
 60#define BFA_SGPG_DMA_SEGS	\
 61	BFI_MEM_DMA_NSEGS(BFA_SGPG_MAX, (uint32_t)sizeof(struct bfi_sgpg_s))
 62
 63struct bfa_sgpg_mod_s {
 64	struct bfa_s *bfa;
 65	int		num_sgpgs;	/*  number of SG pages		*/
 66	int		free_sgpgs;	/*  number of free SG pages	*/
 67	struct list_head	sgpg_q;		/*  queue of free SG pages */
 68	struct list_head	sgpg_wait_q;	/*  wait queue for SG pages */
 69	struct bfa_mem_dma_s	dma_seg[BFA_SGPG_DMA_SEGS];
 70	struct bfa_mem_kva_s	kva_seg;
 71};
 72#define BFA_SGPG_MOD(__bfa)	(&(__bfa)->modules.sgpg_mod)
 73#define BFA_MEM_SGPG_KVA(__bfa) (&(BFA_SGPG_MOD(__bfa)->kva_seg))
 74
 75bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q,
 76			     int nsgpgs);
 77void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs);
 78void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe,
 79		    void (*cbfn) (void *cbarg), void *cbarg);
 80void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs);
 81void bfa_sgpg_wcancel(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe);
 82
 83
 84/*
 85 * FCXP related defines
 86 */
 87#define BFA_FCXP_MIN		(1)
 88#define BFA_FCXP_MAX		(256)
 89#define BFA_FCXP_MAX_IBUF_SZ	(2 * 1024 + 256)
 90#define BFA_FCXP_MAX_LBUF_SZ	(4 * 1024 + 256)
 91
 92/* Max FCXP dma segs required */
 93#define BFA_FCXP_DMA_SEGS						\
 94	BFI_MEM_DMA_NSEGS(BFA_FCXP_MAX,					\
 95		(u32)BFA_FCXP_MAX_IBUF_SZ + BFA_FCXP_MAX_LBUF_SZ)
 96
 97struct bfa_fcxp_mod_s {
 98	struct bfa_s      *bfa;		/* backpointer to BFA */
 99	struct bfa_fcxp_s *fcxp_list;	/* array of FCXPs */
100	u16	num_fcxps;	/* max num FCXP requests */
101	struct list_head fcxp_req_free_q; /* free FCXPs used for sending req */
102	struct list_head fcxp_rsp_free_q; /* free FCXPs used for sending req */
103	struct list_head fcxp_active_q;	/* active FCXPs */
104	struct list_head req_wait_q;	/* wait queue for free req_fcxp */
105	struct list_head rsp_wait_q;	/* wait queue for free rsp_fcxp */
106	struct list_head fcxp_req_unused_q;	/* unused req_fcxps */
107	struct list_head fcxp_rsp_unused_q;	/* unused rsp_fcxps */
108	u32	req_pld_sz;
109	u32	rsp_pld_sz;
110	struct bfa_mem_dma_s dma_seg[BFA_FCXP_DMA_SEGS];
111	struct bfa_mem_kva_s kva_seg;
112};
113
114#define BFA_FCXP_MOD(__bfa)		(&(__bfa)->modules.fcxp_mod)
115#define BFA_FCXP_FROM_TAG(__mod, __tag)	(&(__mod)->fcxp_list[__tag])
116#define BFA_MEM_FCXP_KVA(__bfa) (&(BFA_FCXP_MOD(__bfa)->kva_seg))
117
118typedef void    (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp,
119				   void *cb_arg, bfa_status_t req_status,
120				   u32 rsp_len, u32 resid_len,
121				   struct fchs_s *rsp_fchs);
122
123typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid);
124typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid);
125typedef void (*bfa_cb_fcxp_send_t) (void *bfad_fcxp, struct bfa_fcxp_s *fcxp,
126				    void *cbarg, enum bfa_status req_status,
127				    u32 rsp_len, u32 resid_len,
128				    struct fchs_s *rsp_fchs);
129typedef void (*bfa_fcxp_alloc_cbfn_t) (void *cbarg, struct bfa_fcxp_s *fcxp);
130
131
132
133/*
134 * Information needed for a FCXP request
135 */
136struct bfa_fcxp_req_info_s {
137	struct bfa_rport_s *bfa_rport;
138					/* Pointer to the bfa rport that was
139					 * returned from bfa_rport_create().
140					 * This could be left NULL for WKA or
141					 * for FCXP interactions before the
142					 * rport nexus is established
143					 */
144	struct fchs_s	fchs;	/*  request FC header structure */
145	u8		cts;	/*  continuous sequence */
146	u8		class;	/*  FC class for the request/response */
147	u16	max_frmsz;	/*  max send frame size */
148	u16	vf_id;	/*  vsan tag if applicable */
149	u8		lp_tag;	/*  lport tag */
150	u32	req_tot_len;	/*  request payload total length */
151};
152
153struct bfa_fcxp_rsp_info_s {
154	struct fchs_s	rsp_fchs;
155				/* Response frame's FC header will
156				 * be sent back in this field */
157	u8		rsp_timeout;
158				/* timeout in seconds, 0-no response */
159	u8		rsvd2[3];
160	u32	rsp_maxlen;	/*  max response length expected */
161};
162
163struct bfa_fcxp_s {
164	struct list_head	qe;		/*  fcxp queue element */
165	bfa_sm_t	sm;		/*  state machine */
166	void		*caller;	/*  driver or fcs */
167	struct bfa_fcxp_mod_s *fcxp_mod;
168	/*  back pointer to fcxp mod */
169	u16	fcxp_tag;	/*  internal tag */
170	struct bfa_fcxp_req_info_s req_info;
171	/*  request info */
172	struct bfa_fcxp_rsp_info_s rsp_info;
173	/*  response info */
174	u8	use_ireqbuf;	/*  use internal req buf */
175	u8		use_irspbuf;	/*  use internal rsp buf */
176	u32	nreq_sgles;	/*  num request SGLEs */
177	u32	nrsp_sgles;	/*  num response SGLEs */
178	struct list_head req_sgpg_q;	/*  SG pages for request buf */
179	struct list_head req_sgpg_wqe;	/*  wait queue for req SG page */
180	struct list_head rsp_sgpg_q;	/*  SG pages for response buf */
181	struct list_head rsp_sgpg_wqe;	/*  wait queue for rsp SG page */
182
183	bfa_fcxp_get_sgaddr_t req_sga_cbfn;
184	/*  SG elem addr user function */
185	bfa_fcxp_get_sglen_t req_sglen_cbfn;
186	/*  SG elem len user function */
187	bfa_fcxp_get_sgaddr_t rsp_sga_cbfn;
188	/*  SG elem addr user function */
189	bfa_fcxp_get_sglen_t rsp_sglen_cbfn;
190	/*  SG elem len user function */
191	bfa_cb_fcxp_send_t send_cbfn;   /*  send completion callback */
192	void		*send_cbarg;	/*  callback arg */
193	struct bfa_sge_s   req_sge[BFA_FCXP_MAX_SGES];
194	/*  req SG elems */
195	struct bfa_sge_s   rsp_sge[BFA_FCXP_MAX_SGES];
196	/*  rsp SG elems */
197	u8		rsp_status;	/*  comp: rsp status */
198	u32	rsp_len;	/*  comp: actual response len */
199	u32	residue_len;	/*  comp: residual rsp length */
200	struct fchs_s	rsp_fchs;	/*  comp: response fchs */
201	struct bfa_cb_qe_s    hcb_qe;	/*  comp: callback qelem */
202	struct bfa_reqq_wait_s	reqq_wqe;
203	bfa_boolean_t	reqq_waiting;
204	bfa_boolean_t	req_rsp;	/* Used to track req/rsp fcxp */
205};
206
207struct bfa_fcxp_wqe_s {
208	struct list_head		qe;
209	bfa_fcxp_alloc_cbfn_t	alloc_cbfn;
210	void		*alloc_cbarg;
211	void		*caller;
212	struct bfa_s	*bfa;
213	int		nreq_sgles;
214	int		nrsp_sgles;
215	bfa_fcxp_get_sgaddr_t	req_sga_cbfn;
216	bfa_fcxp_get_sglen_t	req_sglen_cbfn;
217	bfa_fcxp_get_sgaddr_t	rsp_sga_cbfn;
218	bfa_fcxp_get_sglen_t	rsp_sglen_cbfn;
219};
220
221#define BFA_FCXP_REQ_PLD(_fcxp)		(bfa_fcxp_get_reqbuf(_fcxp))
222#define BFA_FCXP_RSP_FCHS(_fcxp)	(&((_fcxp)->rsp_info.fchs))
223#define BFA_FCXP_RSP_PLD(_fcxp)		(bfa_fcxp_get_rspbuf(_fcxp))
224
225#define BFA_FCXP_REQ_PLD_PA(_fcxp)					      \
226	bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,	      \
227		(_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz)
228
229/* fcxp_buf = req_buf + rsp_buf :- add req_buf_sz to get to rsp_buf */
230#define BFA_FCXP_RSP_PLD_PA(_fcxp)					       \
231	(bfa_mem_get_dmabuf_pa((_fcxp)->fcxp_mod, (_fcxp)->fcxp_tag,	       \
232	      (_fcxp)->fcxp_mod->req_pld_sz + (_fcxp)->fcxp_mod->rsp_pld_sz) + \
233	      (_fcxp)->fcxp_mod->req_pld_sz)
234
235void	bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
236
237
238/*
239 * RPORT related defines
240 */
241enum bfa_rport_event {
242	BFA_RPORT_SM_CREATE	= 1,	/*  rport create event          */
243	BFA_RPORT_SM_DELETE	= 2,	/*  deleting an existing rport  */
244	BFA_RPORT_SM_ONLINE	= 3,	/*  rport is online             */
245	BFA_RPORT_SM_OFFLINE	= 4,	/*  rport is offline            */
246	BFA_RPORT_SM_FWRSP	= 5,	/*  firmware response           */
247	BFA_RPORT_SM_HWFAIL	= 6,	/*  IOC h/w failure             */
248	BFA_RPORT_SM_QOS_SCN	= 7,	/*  QoS SCN from firmware       */
249	BFA_RPORT_SM_SET_SPEED	= 8,	/*  Set Rport Speed             */
250	BFA_RPORT_SM_QRESUME	= 9,	/*  space in requeue queue      */
251};
252
253#define BFA_RPORT_MIN	4
254
255struct bfa_rport_mod_s {
256	struct bfa_rport_s *rps_list;	/*  list of rports	*/
257	struct list_head	rp_free_q;	/*  free bfa_rports	*/
258	struct list_head	rp_active_q;	/*  free bfa_rports	*/
259	struct list_head	rp_unused_q;	/*  unused bfa rports  */
260	u16	num_rports;	/*  number of rports	*/
261	struct bfa_mem_kva_s	kva_seg;
262};
263
264#define BFA_RPORT_MOD(__bfa)	(&(__bfa)->modules.rport_mod)
265#define BFA_MEM_RPORT_KVA(__bfa) (&(BFA_RPORT_MOD(__bfa)->kva_seg))
266
267/*
268 * Convert rport tag to RPORT
269 */
270#define BFA_RPORT_FROM_TAG(__bfa, _tag)				\
271	(BFA_RPORT_MOD(__bfa)->rps_list +			\
272	 ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1)))
273
274/*
275 * protected functions
276 */
277void	bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
278void	bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw);
279
280/*
281 *	BFA rport information.
282 */
283struct bfa_rport_info_s {
284	u16	max_frmsz;	/*  max rcv pdu size		    */
285	u32	pid:24,	/*  remote port ID		    */
286		lp_tag:8;	/*  tag			    */
287	u32	local_pid:24,	/*  local port ID		    */
288		cisc:8;	/*  CIRO supported		    */
289	u8	fc_class;	/*  supported FC classes. enum fc_cos */
290	u8	vf_en;		/*  virtual fabric enable	    */
291	u16	vf_id;		/*  virtual fabric ID		    */
292	enum bfa_port_speed speed;	/*  Rport's current speed	    */
293};
294
295/*
296 * BFA rport data structure
297 */
298struct bfa_rport_s {
299	struct list_head	qe;	/*  queue element		    */
300	bfa_sm_t	sm;		/*  state machine		    */
301	struct bfa_s	*bfa;		/*  backpointer to BFA		    */
302	void		*rport_drv;	/*  fcs/driver rport object	    */
303	u16	fw_handle;	/*  firmware rport handle	    */
304	u16	rport_tag;	/*  BFA rport tag		    */
305	u8	lun_mask;	/*  LUN mask flag		    */
306	struct bfa_rport_info_s rport_info; /*  rport info from fcs/driver */
307	struct bfa_reqq_wait_s reqq_wait; /*  to wait for room in reqq     */
308	struct bfa_cb_qe_s hcb_qe;	/*  BFA callback qelem		    */
309	struct bfa_rport_hal_stats_s stats; /*  BFA rport statistics	    */
310	struct bfa_rport_qos_attr_s qos_attr;
311	union a {
312		bfa_status_t	status;	/*  f/w status */
313		void		*fw_msg; /*  QoS scn event		    */
314	} event_arg;
315};
316#define BFA_RPORT_FC_COS(_rport)	((_rport)->rport_info.fc_class)
317
318
319/*
320 * UF - unsolicited receive related defines
321 */
322
323#define BFA_UF_MIN	(4)
324#define BFA_UF_MAX	(256)
325
326struct bfa_uf_s {
327	struct list_head	qe;	/*  queue element		*/
328	struct bfa_s		*bfa;	/*  bfa instance		*/
329	u16	uf_tag;		/*  identifying tag fw msgs	*/
330	u16	vf_id;
331	u16	src_rport_handle;
332	u16	rsvd;
333	u8		*data_ptr;
334	u16	data_len;	/*  actual receive length	*/
335	u16	pb_len;		/*  posted buffer length	*/
336	void		*buf_kva;	/*  buffer virtual address	*/
337	u64	buf_pa;		/*  buffer physical address	*/
338	struct bfa_cb_qe_s hcb_qe;	/*  comp: BFA comp qelem	*/
339	struct bfa_sge_s sges[BFI_SGE_INLINE_MAX];
340};
341
342/*
343 *      Callback prototype for unsolicited frame receive handler.
344 *
345 * @param[in]           cbarg           callback arg for receive handler
346 * @param[in]           uf              unsolicited frame descriptor
347 *
348 * @return None
349 */
350typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf);
351
352#define BFA_UF_BUFSZ	(2 * 1024 + 256)
353
354struct bfa_uf_buf_s {
355	u8	d[BFA_UF_BUFSZ];
356};
357
358#define BFA_PER_UF_DMA_SZ	\
359	(u32)BFA_ROUNDUP(sizeof(struct bfa_uf_buf_s), BFA_DMA_ALIGN_SZ)
360
361/* Max UF dma segs required */
362#define BFA_UF_DMA_SEGS BFI_MEM_DMA_NSEGS(BFA_UF_MAX, BFA_PER_UF_DMA_SZ)
363
364struct bfa_uf_mod_s {
365	struct bfa_s *bfa;		/*  back pointer to BFA */
366	struct bfa_uf_s *uf_list;	/*  array of UFs */
367	u16	num_ufs;	/*  num unsolicited rx frames */
368	struct list_head	uf_free_q;	/*  free UFs */
369	struct list_head	uf_posted_q;	/*  UFs posted to IOC */
370	struct list_head	uf_unused_q;	/*  unused UF's */
371	struct bfi_uf_buf_post_s *uf_buf_posts;
372	/*  pre-built UF post msgs */
373	bfa_cb_uf_recv_t ufrecv;	/*  uf recv handler function */
374	void		*cbarg;		/*  uf receive handler arg */
375	struct bfa_mem_dma_s	dma_seg[BFA_UF_DMA_SEGS];
376	struct bfa_mem_kva_s	kva_seg;
377};
378
379#define BFA_UF_MOD(__bfa)	(&(__bfa)->modules.uf_mod)
380#define BFA_MEM_UF_KVA(__bfa)	(&(BFA_UF_MOD(__bfa)->kva_seg))
381
382#define ufm_pbs_pa(_ufmod, _uftag)					\
383	bfa_mem_get_dmabuf_pa(_ufmod, _uftag, BFA_PER_UF_DMA_SZ)
384
385void	bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
386void	bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw);
387
388/*
389 * LPS - bfa lport login/logout service interface
390 */
391struct bfa_lps_s {
392	struct list_head	qe;	/*  queue element		*/
393	struct bfa_s	*bfa;		/*  parent bfa instance	*/
394	bfa_sm_t	sm;		/*  finite state machine	*/
395	u8		bfa_tag;	/*  lport tag		*/
396	u8		fw_tag;		/*  lport fw tag                */
397	u8		reqq;		/*  lport request queue	*/
398	u8		alpa;		/*  ALPA for loop topologies	*/
399	u32	lp_pid;		/*  lport port ID		*/
400	bfa_boolean_t	fdisc;		/*  snd FDISC instead of FLOGI	*/
401	bfa_boolean_t	auth_en;	/*  enable authentication	*/
402	bfa_boolean_t	auth_req;	/*  authentication required	*/
403	bfa_boolean_t	npiv_en;	/*  NPIV is allowed by peer	*/
404	bfa_boolean_t	fport;		/*  attached peer is F_PORT	*/
405	bfa_boolean_t	brcd_switch;	/*  attached peer is brcd sw	*/
406	bfa_status_t	status;		/*  login status		*/
407	u16		pdusz;		/*  max receive PDU size	*/
408	u16		pr_bbcred;	/*  BB_CREDIT from peer		*/
 
 
409	u8		lsrjt_rsn;	/*  LSRJT reason		*/
410	u8		lsrjt_expl;	/*  LSRJT explanation		*/
411	u8		lun_mask;	/*  LUN mask flag		*/
412	wwn_t		pwwn;		/*  port wwn of lport		*/
413	wwn_t		nwwn;		/*  node wwn of lport		*/
414	wwn_t		pr_pwwn;	/*  port wwn of lport peer	*/
415	wwn_t		pr_nwwn;	/*  node wwn of lport peer	*/
416	mac_t		lp_mac;		/*  fpma/spma MAC for lport	*/
417	mac_t		fcf_mac;	/*  FCF MAC of lport		*/
418	struct bfa_reqq_wait_s	wqe;	/*  request wait queue element	*/
419	void		*uarg;		/*  user callback arg		*/
420	struct bfa_cb_qe_s hcb_qe;	/*  comp: callback qelem	*/
421	struct bfi_lps_login_rsp_s *loginrsp;
422	bfa_eproto_status_t ext_status;
423};
424
425struct bfa_lps_mod_s {
426	struct list_head		lps_free_q;
427	struct list_head		lps_active_q;
428	struct list_head		lps_login_q;
429	struct bfa_lps_s	*lps_arr;
430	int			num_lps;
431	struct bfa_mem_kva_s	kva_seg;
432};
433
434#define BFA_LPS_MOD(__bfa)		(&(__bfa)->modules.lps_mod)
435#define BFA_LPS_FROM_TAG(__mod, __tag)	(&(__mod)->lps_arr[__tag])
436#define BFA_MEM_LPS_KVA(__bfa)	(&(BFA_LPS_MOD(__bfa)->kva_seg))
437
438/*
439 * external functions
440 */
441void	bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
442
443
444/*
445 * FCPORT related defines
446 */
447
448#define BFA_FCPORT(_bfa)	(&((_bfa)->modules.port))
449
450/*
451 * Link notification data structure
452 */
453struct bfa_fcport_ln_s {
454	struct bfa_fcport_s	*fcport;
455	bfa_sm_t		sm;
456	struct bfa_cb_qe_s	ln_qe;	/*  BFA callback queue elem for ln */
457	enum bfa_port_linkstate ln_event; /*  ln event for callback */
458};
459
460struct bfa_fcport_trunk_s {
461	struct bfa_trunk_attr_s	attr;
462};
463
464/*
465 * BFA FC port data structure
466 */
467struct bfa_fcport_s {
468	struct bfa_s		*bfa;	/*  parent BFA instance */
469	bfa_sm_t		sm;	/*  port state machine */
470	wwn_t			nwwn;	/*  node wwn of physical port */
471	wwn_t			pwwn;	/*  port wwn of physical oprt */
472	enum bfa_port_speed speed_sup;
473	/*  supported speeds */
474	enum bfa_port_speed speed;	/*  current speed */
475	enum bfa_port_topology topology;	/*  current topology */
 
476	u8			rsvd[3];
477	u8			myalpa;	/*  my ALPA in LOOP topology */
478	u8			alpabm_valid; /* alpa bitmap valid or not */
479	struct fc_alpabm_s	alpabm;	/* alpa bitmap */
480	struct bfa_port_cfg_s	cfg;	/*  current port configuration */
481	bfa_boolean_t		use_flash_cfg; /* get port cfg from flash */
482	struct bfa_qos_attr_s  qos_attr;   /* QoS Attributes */
483	struct bfa_qos_vc_attr_s qos_vc_attr;  /*  VC info from ELP */
484	struct bfa_reqq_wait_s	reqq_wait;
485	/*  to wait for room in reqq */
486	struct bfa_reqq_wait_s	svcreq_wait;
487	/*  to wait for room in reqq */
488	struct bfa_reqq_wait_s	stats_reqq_wait;
489	/*  to wait for room in reqq (stats) */
490	void			*event_cbarg;
491	void			(*event_cbfn) (void *cbarg,
492					       enum bfa_port_linkstate event);
493	union {
494		union bfi_fcport_i2h_msg_u i2hmsg;
495	} event_arg;
496	void			*bfad;	/*  BFA driver handle */
497	struct bfa_fcport_ln_s	ln; /*  Link Notification */
498	struct bfa_cb_qe_s	hcb_qe;	/*  BFA callback queue elem */
499	struct bfa_timer_s	timer;	/*  timer */
500	u32		msgtag;	/*  fimrware msg tag for reply */
501	u8			*stats_kva;
502	u64		stats_pa;
503	union bfa_fcport_stats_u *stats;
504	bfa_status_t		stats_status; /*  stats/statsclr status */
505	struct list_head	stats_pending_q;
506	struct list_head	statsclr_pending_q;
507	bfa_boolean_t		stats_qfull;
508	u32		stats_reset_time; /*  stats reset time stamp */
509	bfa_boolean_t		diag_busy; /*  diag busy status */
510	bfa_boolean_t		beacon; /*  port beacon status */
511	bfa_boolean_t		link_e2e_beacon; /*  link beacon status */
 
512	struct bfa_fcport_trunk_s trunk;
513	u16		fcoe_vlan;
514	struct bfa_mem_dma_s	fcport_dma;
515	bfa_boolean_t		stats_dma_ready;
516	struct bfa_bbcr_attr_s	bbcr_attr;
517	enum bfa_fec_state_s	fec_state;
518};
519
520#define BFA_FCPORT_MOD(__bfa)	(&(__bfa)->modules.fcport)
521#define BFA_MEM_FCPORT_DMA(__bfa) (&(BFA_FCPORT_MOD(__bfa)->fcport_dma))
522
523/*
524 * protected functions
525 */
526void bfa_fcport_init(struct bfa_s *bfa);
527void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg);
528
529/*
530 * bfa fcport API functions
531 */
532bfa_status_t bfa_fcport_enable(struct bfa_s *bfa);
533bfa_status_t bfa_fcport_disable(struct bfa_s *bfa);
534bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa,
535				  enum bfa_port_speed speed);
536enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa);
537bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa,
538				     enum bfa_port_topology topo);
539enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa);
540enum bfa_port_topology bfa_fcport_get_cfg_topology(struct bfa_s *bfa);
541bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa);
542bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa);
543u8 bfa_fcport_get_myalpa(struct bfa_s *bfa);
544bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa);
545bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize);
546u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa);
547u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa);
548void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr);
549wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node);
550void bfa_fcport_event_register(struct bfa_s *bfa,
551			void (*event_cbfn) (void *cbarg,
552			enum bfa_port_linkstate event), void *event_cbarg);
553bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa);
554bfa_boolean_t bfa_fcport_is_dport(struct bfa_s *bfa);
555bfa_boolean_t bfa_fcport_is_ddport(struct bfa_s *bfa);
556bfa_status_t bfa_fcport_set_qos_bw(struct bfa_s *bfa,
557				   struct bfa_qos_bw_s *qos_bw);
558enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa);
559
560void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit);
561bfa_boolean_t     bfa_fcport_is_ratelim(struct bfa_s *bfa);
562void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon,
563			bfa_boolean_t link_e2e_beacon);
564bfa_boolean_t	bfa_fcport_is_linkup(struct bfa_s *bfa);
565bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa,
566			struct bfa_cb_pending_q_s *cb);
567bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa,
568			struct bfa_cb_pending_q_s *cb);
569bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa);
570bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa);
571void bfa_fcport_dportenable(struct bfa_s *bfa);
572void bfa_fcport_dportdisable(struct bfa_s *bfa);
573bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa);
574void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state);
575bfa_status_t bfa_fcport_cfg_bbcr(struct bfa_s *bfa,
576			bfa_boolean_t on_off, u8 bb_scn);
577bfa_status_t bfa_fcport_get_bbcr_attr(struct bfa_s *bfa,
578			struct bfa_bbcr_attr_s *bbcr_attr);
579
580/*
581 * bfa rport API functions
582 */
583struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv);
584void bfa_rport_online(struct bfa_rport_s *rport,
585		      struct bfa_rport_info_s *rport_info);
586void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed);
587void bfa_cb_rport_online(void *rport);
588void bfa_cb_rport_offline(void *rport);
589void bfa_cb_rport_qos_scn_flowid(void *rport,
590				 struct bfa_rport_qos_attr_s old_qos_attr,
591				 struct bfa_rport_qos_attr_s new_qos_attr);
592void bfa_cb_rport_scn_online(struct bfa_s *bfa);
593void bfa_cb_rport_scn_offline(struct bfa_s *bfa);
594void bfa_cb_rport_scn_no_dev(void *rp);
595void bfa_cb_rport_qos_scn_prio(void *rport,
596			       struct bfa_rport_qos_attr_s old_qos_attr,
597			       struct bfa_rport_qos_attr_s new_qos_attr);
598
599/*
600 *	Rport LUN masking related
601 */
602#define BFA_RPORT_TAG_INVALID	0xffff
603#define BFA_LP_TAG_INVALID	0xff
604void	bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
605void	bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp);
 
 
 
 
 
606
607/*
608 * bfa fcxp API functions
609 */
610struct bfa_fcxp_s *bfa_fcxp_req_rsp_alloc(void *bfad_fcxp, struct bfa_s *bfa,
611				  int nreq_sgles, int nrsp_sgles,
612				  bfa_fcxp_get_sgaddr_t get_req_sga,
613				  bfa_fcxp_get_sglen_t get_req_sglen,
614				  bfa_fcxp_get_sgaddr_t get_rsp_sga,
615				  bfa_fcxp_get_sglen_t get_rsp_sglen,
616				  bfa_boolean_t req);
617void bfa_fcxp_req_rsp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe,
618				bfa_fcxp_alloc_cbfn_t alloc_cbfn,
619				void *cbarg, void *bfad_fcxp,
620				int nreq_sgles, int nrsp_sgles,
621				bfa_fcxp_get_sgaddr_t get_req_sga,
622				bfa_fcxp_get_sglen_t get_req_sglen,
623				bfa_fcxp_get_sgaddr_t get_rsp_sga,
624				bfa_fcxp_get_sglen_t get_rsp_sglen,
625				bfa_boolean_t req);
626void bfa_fcxp_walloc_cancel(struct bfa_s *bfa,
627			    struct bfa_fcxp_wqe_s *wqe);
628void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp);
629
630void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp);
631void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp);
632
633void bfa_fcxp_free(struct bfa_fcxp_s *fcxp);
634
635void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport,
636		   u16 vf_id, u8 lp_tag,
637		   bfa_boolean_t cts, enum fc_cos cos,
638		   u32 reqlen, struct fchs_s *fchs,
639		   bfa_cb_fcxp_send_t cbfn,
640		   void *cbarg,
641		   u32 rsp_maxlen, u8 rsp_timeout);
642bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp);
643u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp);
644u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa);
645void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw);
646
647static inline void *
648bfa_uf_get_frmbuf(struct bfa_uf_s *uf)
649{
650	return uf->data_ptr;
651}
652
653static inline   u16
654bfa_uf_get_frmlen(struct bfa_uf_s *uf)
655{
656	return uf->data_len;
657}
658
659/*
660 * bfa uf API functions
661 */
662void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv,
663			  void *cbarg);
664void bfa_uf_free(struct bfa_uf_s *uf);
665
666/*
667 * bfa lport service api
668 */
669
670u32 bfa_lps_get_max_vport(struct bfa_s *bfa);
671struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa);
672void bfa_lps_delete(struct bfa_lps_s *lps);
673void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa,
674		   u16 pdusz, wwn_t pwwn, wwn_t nwwn,
675		   bfa_boolean_t auth_en);
676void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz,
677		   wwn_t pwwn, wwn_t nwwn);
678void bfa_lps_fdisclogo(struct bfa_lps_s *lps);
679void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid);
680u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag);
681u32 bfa_lps_get_base_pid(struct bfa_s *bfa);
682u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid);
683void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status);
684void bfa_cb_lps_flogo_comp(void *bfad, void *uarg);
685void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status);
686void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg);
687void bfa_cb_lps_cvl_event(void *bfad, void *uarg);
688
689/* FAA specific APIs */
 
 
 
 
690bfa_status_t bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr,
691			bfa_cb_iocfc_t cbfn, void *cbarg);
692
693/*
694 *	FC DIAG data structure
695 */
696struct bfa_fcdiag_qtest_s {
697	struct bfa_diag_qtest_result_s *result;
698	bfa_cb_diag_t	cbfn;
699	void		*cbarg;
700	struct bfa_timer_s	timer;
701	u32	status;
702	u32	count;
703	u8	lock;
704	u8	queue;
705	u8	all;
706	u8	timer_active;
707};
708
709struct bfa_fcdiag_lb_s {
710	bfa_cb_diag_t   cbfn;
711	void            *cbarg;
712	void            *result;
713	bfa_boolean_t   lock;
714	u32        status;
715};
716
717struct bfa_dport_s {
718	struct bfa_s	*bfa;		/* Back pointer to BFA	*/
719	bfa_sm_t	sm;		/* finite state machine */
720	struct bfa_reqq_wait_s reqq_wait;
721	bfa_cb_diag_t	cbfn;
722	void		*cbarg;
723	union bfi_diag_dport_msg_u i2hmsg;
724	u8		test_state;	/* enum dport_test_state  */
725	u8		dynamic;	/* boolean_t  */
726	u8		rsvd[2];
727	u32		lpcnt;
728	u32		payload;	/* user defined payload pattern */
729	wwn_t		rp_pwwn;
730	wwn_t		rp_nwwn;
731	struct bfa_diag_dport_result_s result;
732};
733
734struct bfa_fcdiag_s {
735	struct bfa_s    *bfa;           /* Back pointer to BFA */
736	struct bfa_trc_mod_s   *trcmod;
737	struct bfa_fcdiag_lb_s lb;
738	struct bfa_fcdiag_qtest_s qtest;
739	struct bfa_dport_s	dport;
740};
741
742#define BFA_FCDIAG_MOD(__bfa)	(&(__bfa)->modules.fcdiag)
743
744void	bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg);
745
746bfa_status_t	bfa_fcdiag_loopback(struct bfa_s *bfa,
747				enum bfa_port_opmode opmode,
748				enum bfa_port_speed speed, u32 lpcnt, u32 pat,
749				struct bfa_diag_loopback_result_s *result,
750				bfa_cb_diag_t cbfn, void *cbarg);
751bfa_status_t	bfa_fcdiag_queuetest(struct bfa_s *bfa, u32 ignore,
752			u32 queue, struct bfa_diag_qtest_result_s *result,
753			bfa_cb_diag_t cbfn, void *cbarg);
754bfa_status_t	bfa_fcdiag_lb_is_running(struct bfa_s *bfa);
755bfa_status_t	bfa_dport_enable(struct bfa_s *bfa, u32 lpcnt, u32 pat,
756					bfa_cb_diag_t cbfn, void *cbarg);
757bfa_status_t	bfa_dport_disable(struct bfa_s *bfa, bfa_cb_diag_t cbfn,
758				  void *cbarg);
759bfa_status_t	bfa_dport_start(struct bfa_s *bfa, u32 lpcnt, u32 pat,
760				bfa_cb_diag_t cbfn, void *cbarg);
761bfa_status_t	bfa_dport_show(struct bfa_s *bfa,
762				struct bfa_diag_dport_result_s *result);
763
764#endif /* __BFA_SVC_H__ */