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 37 struct 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 46 struct 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 62 struct 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 74 bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q, 75 int nsgpgs); 76 void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs); 77 void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe, 78 void (*cbfn) (void *cbarg), void *cbarg); 79 void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs); 80 void 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 96 struct 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 114 typedef 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 119 typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid); 120 typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid); 121 typedef 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); 125 typedef 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 */ 132 struct 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 149 struct 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 159 struct 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 202 struct 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 230 void bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 231 232 233 /* 234 * RPORT related defines 235 */ 236 enum 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 250 struct 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 */ 272 void bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 273 void bfa_rport_res_recfg(struct bfa_s *bfa, u16 num_rport_fw); 274 275 /* 276 * BFA rport information. 277 */ 278 struct 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 */ 293 struct 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 321 struct 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 */ 345 typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf); 346 347 #define BFA_UF_BUFSZ (2 * 1024 + 256) 348 349 struct 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 359 struct 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 380 void bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 381 void bfa_uf_res_recfg(struct bfa_s *bfa, u16 num_uf_fw); 382 383 /* 384 * LPS - bfa lport login/logout service interface 385 */ 386 struct 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 422 struct 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 */ 438 void 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 */ 450 struct 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 457 struct bfa_fcport_trunk_s { 458 struct bfa_trunk_attr_s attr; 459 }; 460 461 /* 462 * BFA FC port data structure 463 */ 464 struct 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 */ 519 void bfa_fcport_init(struct bfa_s *bfa); 520 void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 521 522 /* 523 * bfa fcport API functions 524 */ 525 bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); 526 bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); 527 bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, 528 enum bfa_port_speed speed); 529 enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa); 530 bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, 531 enum bfa_port_topology topo); 532 enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa); 533 bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); 534 bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); 535 u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); 536 bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); 537 bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); 538 u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); 539 u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); 540 void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr); 541 wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); 542 void bfa_fcport_event_register(struct bfa_s *bfa, 543 void (*event_cbfn) (void *cbarg, 544 enum bfa_port_linkstate event), void *event_cbarg); 545 bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); 546 enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); 547 548 void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit, u8 bb_scn); 549 bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); 550 void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon, 551 bfa_boolean_t link_e2e_beacon); 552 bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); 553 bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, 554 struct bfa_cb_pending_q_s *cb); 555 bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, 556 struct bfa_cb_pending_q_s *cb); 557 bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa); 558 bfa_boolean_t bfa_fcport_is_trunk_enabled(struct bfa_s *bfa); 559 bfa_status_t bfa_fcport_is_pbcdisabled(struct bfa_s *bfa); 560 void bfa_fcport_cfg_faa(struct bfa_s *bfa, u8 state); 561 562 /* 563 * bfa rport API functions 564 */ 565 struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv); 566 void bfa_rport_online(struct bfa_rport_s *rport, 567 struct bfa_rport_info_s *rport_info); 568 void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed); 569 void bfa_cb_rport_online(void *rport); 570 void bfa_cb_rport_offline(void *rport); 571 void 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); 574 void 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 583 void bfa_rport_set_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); 584 void bfa_rport_unset_lunmask(struct bfa_s *bfa, struct bfa_rport_s *rp); 585 bfa_boolean_t bfa_rport_lunmask_active(struct bfa_rport_s *rp); 586 wwn_t bfa_rport_get_pwwn(struct bfa_s *bfa, struct bfa_rport_s *rp); 587 struct bfa_rport_s *bfa_rport_get_by_wwn(struct bfa_s *bfa, u16 vf_id, 588 wwn_t *lpwwn, wwn_t rpwwn); 589 void *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 */ 594 struct 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); 600 void 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); 608 void bfa_fcxp_walloc_cancel(struct bfa_s *bfa, 609 struct bfa_fcxp_wqe_s *wqe); 610 void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp); 611 612 void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp); 613 void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp); 614 615 void bfa_fcxp_free(struct bfa_fcxp_s *fcxp); 616 617 void 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); 624 bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp); 625 u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp); 626 u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa); 627 void bfa_fcxp_res_recfg(struct bfa_s *bfa, u16 num_fcxp_fw); 628 629 static inline void * 630 bfa_uf_get_frmbuf(struct bfa_uf_s *uf) 631 { 632 return uf->data_ptr; 633 } 634 635 static inline u16 636 bfa_uf_get_frmlen(struct bfa_uf_s *uf) 637 { 638 return uf->data_len; 639 } 640 641 /* 642 * bfa uf API functions 643 */ 644 void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv, 645 void *cbarg); 646 void bfa_uf_free(struct bfa_uf_s *uf); 647 648 /* 649 * bfa lport service api 650 */ 651 652 u32 bfa_lps_get_max_vport(struct bfa_s *bfa); 653 struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); 654 void bfa_lps_delete(struct bfa_lps_s *lps); 655 void 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); 658 void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz, 659 wwn_t pwwn, wwn_t nwwn); 660 void bfa_lps_fdisclogo(struct bfa_lps_s *lps); 661 void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid); 662 u8 bfa_lps_get_fwtag(struct bfa_s *bfa, u8 lp_tag); 663 u32 bfa_lps_get_base_pid(struct bfa_s *bfa); 664 u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid); 665 void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); 666 void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); 667 void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); 668 void bfa_cb_lps_cvl_event(void *bfad, void *uarg); 669 670 /* FAA specific APIs */ 671 bfa_status_t bfa_faa_enable(struct bfa_s *bfa, 672 bfa_cb_iocfc_t cbfn, void *cbarg); 673 bfa_status_t bfa_faa_disable(struct bfa_s *bfa, 674 bfa_cb_iocfc_t cbfn, void *cbarg); 675 bfa_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 */ 681 struct 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 694 struct 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 702 struct 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 711 void bfa_fcdiag_intr(struct bfa_s *bfa, struct bfi_msg_s *msg); 712 713 bfa_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); 718 bfa_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); 721 bfa_status_t bfa_fcdiag_lb_is_running(struct bfa_s *bfa); 722 723 #endif /* __BFA_SVC_H__ */ 724