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 30 /* 31 * Alignment macro for SG page allocation 32 */ 33 #define BFA_SGPG_ROUNDUP(_l) (((_l) + (sizeof(struct bfi_sgpg_s) - 1)) \ 34 & ~(sizeof(struct bfi_sgpg_s) - 1)) 35 36 struct bfa_sgpg_wqe_s { 37 struct list_head qe; /* queue sg page element */ 38 int nsgpg; /* pages to be allocated */ 39 int nsgpg_total; /* total pages required */ 40 void (*cbfn) (void *cbarg); /* callback function */ 41 void *cbarg; /* callback arg */ 42 struct list_head sgpg_q; /* queue of alloced sgpgs */ 43 }; 44 45 struct bfa_sgpg_s { 46 struct list_head qe; /* queue sg page element */ 47 struct bfi_sgpg_s *sgpg; /* va of SG page */ 48 union bfi_addr_u sgpg_pa; /* pa of SG page */ 49 }; 50 51 /* 52 * Given number of SG elements, BFA_SGPG_NPAGE() returns the number of 53 * SG pages required. 54 */ 55 #define BFA_SGPG_NPAGE(_nsges) (((_nsges) / BFI_SGPG_DATA_SGES) + 1) 56 57 struct bfa_sgpg_mod_s { 58 struct bfa_s *bfa; 59 int num_sgpgs; /* number of SG pages */ 60 int free_sgpgs; /* number of free SG pages */ 61 struct bfa_sgpg_s *hsgpg_arr; /* BFA SG page array */ 62 struct bfi_sgpg_s *sgpg_arr; /* actual SG page array */ 63 u64 sgpg_arr_pa; /* SG page array DMA addr */ 64 struct list_head sgpg_q; /* queue of free SG pages */ 65 struct list_head sgpg_wait_q; /* wait queue for SG pages */ 66 }; 67 #define BFA_SGPG_MOD(__bfa) (&(__bfa)->modules.sgpg_mod) 68 69 bfa_status_t bfa_sgpg_malloc(struct bfa_s *bfa, struct list_head *sgpg_q, 70 int nsgpgs); 71 void bfa_sgpg_mfree(struct bfa_s *bfa, struct list_head *sgpg_q, int nsgpgs); 72 void bfa_sgpg_winit(struct bfa_sgpg_wqe_s *wqe, 73 void (*cbfn) (void *cbarg), void *cbarg); 74 void bfa_sgpg_wait(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe, int nsgpgs); 75 void bfa_sgpg_wcancel(struct bfa_s *bfa, struct bfa_sgpg_wqe_s *wqe); 76 77 78 /* 79 * FCXP related defines 80 */ 81 #define BFA_FCXP_MIN (1) 82 #define BFA_FCXP_MAX_IBUF_SZ (2 * 1024 + 256) 83 #define BFA_FCXP_MAX_LBUF_SZ (4 * 1024 + 256) 84 85 struct bfa_fcxp_mod_s { 86 struct bfa_s *bfa; /* backpointer to BFA */ 87 struct bfa_fcxp_s *fcxp_list; /* array of FCXPs */ 88 u16 num_fcxps; /* max num FCXP requests */ 89 struct list_head fcxp_free_q; /* free FCXPs */ 90 struct list_head fcxp_active_q; /* active FCXPs */ 91 void *req_pld_list_kva; /* list of FCXP req pld */ 92 u64 req_pld_list_pa; /* list of FCXP req pld */ 93 void *rsp_pld_list_kva; /* list of FCXP resp pld */ 94 u64 rsp_pld_list_pa; /* list of FCXP resp pld */ 95 struct list_head wait_q; /* wait queue for free fcxp */ 96 u32 req_pld_sz; 97 u32 rsp_pld_sz; 98 }; 99 100 #define BFA_FCXP_MOD(__bfa) (&(__bfa)->modules.fcxp_mod) 101 #define BFA_FCXP_FROM_TAG(__mod, __tag) (&(__mod)->fcxp_list[__tag]) 102 103 typedef void (*fcxp_send_cb_t) (struct bfa_s *ioc, struct bfa_fcxp_s *fcxp, 104 void *cb_arg, bfa_status_t req_status, 105 u32 rsp_len, u32 resid_len, 106 struct fchs_s *rsp_fchs); 107 108 typedef u64 (*bfa_fcxp_get_sgaddr_t) (void *bfad_fcxp, int sgeid); 109 typedef u32 (*bfa_fcxp_get_sglen_t) (void *bfad_fcxp, int sgeid); 110 typedef void (*bfa_cb_fcxp_send_t) (void *bfad_fcxp, struct bfa_fcxp_s *fcxp, 111 void *cbarg, enum bfa_status req_status, 112 u32 rsp_len, u32 resid_len, 113 struct fchs_s *rsp_fchs); 114 typedef void (*bfa_fcxp_alloc_cbfn_t) (void *cbarg, struct bfa_fcxp_s *fcxp); 115 116 117 118 /* 119 * Information needed for a FCXP request 120 */ 121 struct bfa_fcxp_req_info_s { 122 struct bfa_rport_s *bfa_rport; 123 /* Pointer to the bfa rport that was 124 * returned from bfa_rport_create(). 125 * This could be left NULL for WKA or 126 * for FCXP interactions before the 127 * rport nexus is established 128 */ 129 struct fchs_s fchs; /* request FC header structure */ 130 u8 cts; /* continous sequence */ 131 u8 class; /* FC class for the request/response */ 132 u16 max_frmsz; /* max send frame size */ 133 u16 vf_id; /* vsan tag if applicable */ 134 u8 lp_tag; /* lport tag */ 135 u32 req_tot_len; /* request payload total length */ 136 }; 137 138 struct bfa_fcxp_rsp_info_s { 139 struct fchs_s rsp_fchs; 140 /* Response frame's FC header will 141 * be sent back in this field */ 142 u8 rsp_timeout; 143 /* timeout in seconds, 0-no response */ 144 u8 rsvd2[3]; 145 u32 rsp_maxlen; /* max response length expected */ 146 }; 147 148 struct bfa_fcxp_s { 149 struct list_head qe; /* fcxp queue element */ 150 bfa_sm_t sm; /* state machine */ 151 void *caller; /* driver or fcs */ 152 struct bfa_fcxp_mod_s *fcxp_mod; 153 /* back pointer to fcxp mod */ 154 u16 fcxp_tag; /* internal tag */ 155 struct bfa_fcxp_req_info_s req_info; 156 /* request info */ 157 struct bfa_fcxp_rsp_info_s rsp_info; 158 /* response info */ 159 u8 use_ireqbuf; /* use internal req buf */ 160 u8 use_irspbuf; /* use internal rsp buf */ 161 u32 nreq_sgles; /* num request SGLEs */ 162 u32 nrsp_sgles; /* num response SGLEs */ 163 struct list_head req_sgpg_q; /* SG pages for request buf */ 164 struct list_head req_sgpg_wqe; /* wait queue for req SG page */ 165 struct list_head rsp_sgpg_q; /* SG pages for response buf */ 166 struct list_head rsp_sgpg_wqe; /* wait queue for rsp SG page */ 167 168 bfa_fcxp_get_sgaddr_t req_sga_cbfn; 169 /* SG elem addr user function */ 170 bfa_fcxp_get_sglen_t req_sglen_cbfn; 171 /* SG elem len user function */ 172 bfa_fcxp_get_sgaddr_t rsp_sga_cbfn; 173 /* SG elem addr user function */ 174 bfa_fcxp_get_sglen_t rsp_sglen_cbfn; 175 /* SG elem len user function */ 176 bfa_cb_fcxp_send_t send_cbfn; /* send completion callback */ 177 void *send_cbarg; /* callback arg */ 178 struct bfa_sge_s req_sge[BFA_FCXP_MAX_SGES]; 179 /* req SG elems */ 180 struct bfa_sge_s rsp_sge[BFA_FCXP_MAX_SGES]; 181 /* rsp SG elems */ 182 u8 rsp_status; /* comp: rsp status */ 183 u32 rsp_len; /* comp: actual response len */ 184 u32 residue_len; /* comp: residual rsp length */ 185 struct fchs_s rsp_fchs; /* comp: response fchs */ 186 struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ 187 struct bfa_reqq_wait_s reqq_wqe; 188 bfa_boolean_t reqq_waiting; 189 }; 190 191 struct bfa_fcxp_wqe_s { 192 struct list_head qe; 193 bfa_fcxp_alloc_cbfn_t alloc_cbfn; 194 void *alloc_cbarg; 195 void *caller; 196 struct bfa_s *bfa; 197 int nreq_sgles; 198 int nrsp_sgles; 199 bfa_fcxp_get_sgaddr_t req_sga_cbfn; 200 bfa_fcxp_get_sglen_t req_sglen_cbfn; 201 bfa_fcxp_get_sgaddr_t rsp_sga_cbfn; 202 bfa_fcxp_get_sglen_t rsp_sglen_cbfn; 203 }; 204 205 #define BFA_FCXP_REQ_PLD(_fcxp) (bfa_fcxp_get_reqbuf(_fcxp)) 206 #define BFA_FCXP_RSP_FCHS(_fcxp) (&((_fcxp)->rsp_info.fchs)) 207 #define BFA_FCXP_RSP_PLD(_fcxp) (bfa_fcxp_get_rspbuf(_fcxp)) 208 209 #define BFA_FCXP_REQ_PLD_PA(_fcxp) \ 210 ((_fcxp)->fcxp_mod->req_pld_list_pa + \ 211 ((_fcxp)->fcxp_mod->req_pld_sz * (_fcxp)->fcxp_tag)) 212 213 #define BFA_FCXP_RSP_PLD_PA(_fcxp) \ 214 ((_fcxp)->fcxp_mod->rsp_pld_list_pa + \ 215 ((_fcxp)->fcxp_mod->rsp_pld_sz * (_fcxp)->fcxp_tag)) 216 217 void bfa_fcxp_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 218 219 220 /* 221 * RPORT related defines 222 */ 223 #define BFA_RPORT_MIN 4 224 225 struct bfa_rport_mod_s { 226 struct bfa_rport_s *rps_list; /* list of rports */ 227 struct list_head rp_free_q; /* free bfa_rports */ 228 struct list_head rp_active_q; /* free bfa_rports */ 229 u16 num_rports; /* number of rports */ 230 }; 231 232 #define BFA_RPORT_MOD(__bfa) (&(__bfa)->modules.rport_mod) 233 234 /* 235 * Convert rport tag to RPORT 236 */ 237 #define BFA_RPORT_FROM_TAG(__bfa, _tag) \ 238 (BFA_RPORT_MOD(__bfa)->rps_list + \ 239 ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1))) 240 241 /* 242 * protected functions 243 */ 244 void bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 245 246 /* 247 * BFA rport information. 248 */ 249 struct bfa_rport_info_s { 250 u16 max_frmsz; /* max rcv pdu size */ 251 u32 pid:24, /* remote port ID */ 252 lp_tag:8; /* tag */ 253 u32 local_pid:24, /* local port ID */ 254 cisc:8; /* CIRO supported */ 255 u8 fc_class; /* supported FC classes. enum fc_cos */ 256 u8 vf_en; /* virtual fabric enable */ 257 u16 vf_id; /* virtual fabric ID */ 258 enum bfa_port_speed speed; /* Rport's current speed */ 259 }; 260 261 /* 262 * BFA rport data structure 263 */ 264 struct bfa_rport_s { 265 struct list_head qe; /* queue element */ 266 bfa_sm_t sm; /* state machine */ 267 struct bfa_s *bfa; /* backpointer to BFA */ 268 void *rport_drv; /* fcs/driver rport object */ 269 u16 fw_handle; /* firmware rport handle */ 270 u16 rport_tag; /* BFA rport tag */ 271 struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ 272 struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ 273 struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ 274 struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ 275 struct bfa_rport_qos_attr_s qos_attr; 276 union a { 277 bfa_status_t status; /* f/w status */ 278 void *fw_msg; /* QoS scn event */ 279 } event_arg; 280 }; 281 #define BFA_RPORT_FC_COS(_rport) ((_rport)->rport_info.fc_class) 282 283 284 /* 285 * UF - unsolicited receive related defines 286 */ 287 288 #define BFA_UF_MIN (4) 289 290 291 struct bfa_uf_s { 292 struct list_head qe; /* queue element */ 293 struct bfa_s *bfa; /* bfa instance */ 294 u16 uf_tag; /* identifying tag fw msgs */ 295 u16 vf_id; 296 u16 src_rport_handle; 297 u16 rsvd; 298 u8 *data_ptr; 299 u16 data_len; /* actual receive length */ 300 u16 pb_len; /* posted buffer length */ 301 void *buf_kva; /* buffer virtual address */ 302 u64 buf_pa; /* buffer physical address */ 303 struct bfa_cb_qe_s hcb_qe; /* comp: BFA comp qelem */ 304 struct bfa_sge_s sges[BFI_SGE_INLINE_MAX]; 305 }; 306 307 /* 308 * Callback prototype for unsolicited frame receive handler. 309 * 310 * @param[in] cbarg callback arg for receive handler 311 * @param[in] uf unsolicited frame descriptor 312 * 313 * @return None 314 */ 315 typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf); 316 317 struct bfa_uf_mod_s { 318 struct bfa_s *bfa; /* back pointer to BFA */ 319 struct bfa_uf_s *uf_list; /* array of UFs */ 320 u16 num_ufs; /* num unsolicited rx frames */ 321 struct list_head uf_free_q; /* free UFs */ 322 struct list_head uf_posted_q; /* UFs posted to IOC */ 323 struct bfa_uf_buf_s *uf_pbs_kva; /* list UF bufs request pld */ 324 u64 uf_pbs_pa; /* phy addr for UF bufs */ 325 struct bfi_uf_buf_post_s *uf_buf_posts; 326 /* pre-built UF post msgs */ 327 bfa_cb_uf_recv_t ufrecv; /* uf recv handler function */ 328 void *cbarg; /* uf receive handler arg */ 329 }; 330 331 #define BFA_UF_MOD(__bfa) (&(__bfa)->modules.uf_mod) 332 333 #define ufm_pbs_pa(_ufmod, _uftag) \ 334 ((_ufmod)->uf_pbs_pa + sizeof(struct bfa_uf_buf_s) * (_uftag)) 335 336 void bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 337 338 #define BFA_UF_BUFSZ (2 * 1024 + 256) 339 340 /* 341 * @todo private 342 */ 343 struct bfa_uf_buf_s { 344 u8 d[BFA_UF_BUFSZ]; 345 }; 346 347 348 /* 349 * LPS - bfa lport login/logout service interface 350 */ 351 struct bfa_lps_s { 352 struct list_head qe; /* queue element */ 353 struct bfa_s *bfa; /* parent bfa instance */ 354 bfa_sm_t sm; /* finite state machine */ 355 u8 lp_tag; /* lport tag */ 356 u8 reqq; /* lport request queue */ 357 u8 alpa; /* ALPA for loop topologies */ 358 u32 lp_pid; /* lport port ID */ 359 bfa_boolean_t fdisc; /* snd FDISC instead of FLOGI */ 360 bfa_boolean_t auth_en; /* enable authentication */ 361 bfa_boolean_t auth_req; /* authentication required */ 362 bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ 363 bfa_boolean_t fport; /* attached peer is F_PORT */ 364 bfa_boolean_t brcd_switch; /* attached peer is brcd sw */ 365 bfa_status_t status; /* login status */ 366 u16 pdusz; /* max receive PDU size */ 367 u16 pr_bbcred; /* BB_CREDIT from peer */ 368 u8 lsrjt_rsn; /* LSRJT reason */ 369 u8 lsrjt_expl; /* LSRJT explanation */ 370 wwn_t pwwn; /* port wwn of lport */ 371 wwn_t nwwn; /* node wwn of lport */ 372 wwn_t pr_pwwn; /* port wwn of lport peer */ 373 wwn_t pr_nwwn; /* node wwn of lport peer */ 374 mac_t lp_mac; /* fpma/spma MAC for lport */ 375 mac_t fcf_mac; /* FCF MAC of lport */ 376 struct bfa_reqq_wait_s wqe; /* request wait queue element */ 377 void *uarg; /* user callback arg */ 378 struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ 379 struct bfi_lps_login_rsp_s *loginrsp; 380 bfa_eproto_status_t ext_status; 381 }; 382 383 struct bfa_lps_mod_s { 384 struct list_head lps_free_q; 385 struct list_head lps_active_q; 386 struct bfa_lps_s *lps_arr; 387 int num_lps; 388 }; 389 390 #define BFA_LPS_MOD(__bfa) (&(__bfa)->modules.lps_mod) 391 #define BFA_LPS_FROM_TAG(__mod, __tag) (&(__mod)->lps_arr[__tag]) 392 393 /* 394 * external functions 395 */ 396 void bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 397 398 399 /* 400 * FCPORT related defines 401 */ 402 403 #define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) 404 typedef void (*bfa_cb_port_t) (void *cbarg, enum bfa_status status); 405 406 /* 407 * Link notification data structure 408 */ 409 struct bfa_fcport_ln_s { 410 struct bfa_fcport_s *fcport; 411 bfa_sm_t sm; 412 struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ 413 enum bfa_port_linkstate ln_event; /* ln event for callback */ 414 }; 415 416 struct bfa_fcport_trunk_s { 417 struct bfa_trunk_attr_s attr; 418 }; 419 420 /* 421 * BFA FC port data structure 422 */ 423 struct bfa_fcport_s { 424 struct bfa_s *bfa; /* parent BFA instance */ 425 bfa_sm_t sm; /* port state machine */ 426 wwn_t nwwn; /* node wwn of physical port */ 427 wwn_t pwwn; /* port wwn of physical oprt */ 428 enum bfa_port_speed speed_sup; 429 /* supported speeds */ 430 enum bfa_port_speed speed; /* current speed */ 431 enum bfa_port_topology topology; /* current topology */ 432 u8 myalpa; /* my ALPA in LOOP topology */ 433 u8 rsvd[3]; 434 struct bfa_port_cfg_s cfg; /* current port configuration */ 435 struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ 436 struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ 437 struct bfa_reqq_wait_s reqq_wait; 438 /* to wait for room in reqq */ 439 struct bfa_reqq_wait_s svcreq_wait; 440 /* to wait for room in reqq */ 441 struct bfa_reqq_wait_s stats_reqq_wait; 442 /* to wait for room in reqq (stats) */ 443 void *event_cbarg; 444 void (*event_cbfn) (void *cbarg, 445 enum bfa_port_linkstate event); 446 union { 447 union bfi_fcport_i2h_msg_u i2hmsg; 448 } event_arg; 449 void *bfad; /* BFA driver handle */ 450 struct bfa_fcport_ln_s ln; /* Link Notification */ 451 struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ 452 struct bfa_timer_s timer; /* timer */ 453 u32 msgtag; /* fimrware msg tag for reply */ 454 u8 *stats_kva; 455 u64 stats_pa; 456 union bfa_fcport_stats_u *stats; 457 union bfa_fcport_stats_u *stats_ret; /* driver stats location */ 458 bfa_status_t stats_status; /* stats/statsclr status */ 459 bfa_boolean_t stats_busy; /* outstanding stats/statsclr */ 460 bfa_boolean_t stats_qfull; 461 u32 stats_reset_time; /* stats reset time stamp */ 462 bfa_cb_port_t stats_cbfn; /* driver callback function */ 463 void *stats_cbarg; /* *!< user callback arg */ 464 bfa_boolean_t diag_busy; /* diag busy status */ 465 bfa_boolean_t beacon; /* port beacon status */ 466 bfa_boolean_t link_e2e_beacon; /* link beacon status */ 467 struct bfa_fcport_trunk_s trunk; 468 u16 fcoe_vlan; 469 }; 470 471 #define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) 472 473 /* 474 * protected functions 475 */ 476 void bfa_fcport_init(struct bfa_s *bfa); 477 void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 478 479 /* 480 * bfa fcport API functions 481 */ 482 bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); 483 bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); 484 bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, 485 enum bfa_port_speed speed); 486 enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa); 487 bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, 488 enum bfa_port_topology topo); 489 enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa); 490 bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); 491 bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); 492 u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); 493 bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); 494 bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); 495 u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); 496 u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); 497 void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr); 498 wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); 499 void bfa_fcport_event_register(struct bfa_s *bfa, 500 void (*event_cbfn) (void *cbarg, 501 enum bfa_port_linkstate event), void *event_cbarg); 502 bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); 503 void bfa_fcport_cfg_qos(struct bfa_s *bfa, bfa_boolean_t on_off); 504 void bfa_fcport_cfg_ratelim(struct bfa_s *bfa, bfa_boolean_t on_off); 505 bfa_status_t bfa_fcport_cfg_ratelim_speed(struct bfa_s *bfa, 506 enum bfa_port_speed speed); 507 enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); 508 509 void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); 510 void bfa_fcport_busy(struct bfa_s *bfa, bfa_boolean_t status); 511 void bfa_fcport_beacon(void *dev, bfa_boolean_t beacon, 512 bfa_boolean_t link_e2e_beacon); 513 void bfa_fcport_qos_get_attr(struct bfa_s *bfa, 514 struct bfa_qos_attr_s *qos_attr); 515 void bfa_fcport_qos_get_vc_attr(struct bfa_s *bfa, 516 struct bfa_qos_vc_attr_s *qos_vc_attr); 517 bfa_status_t bfa_fcport_get_qos_stats(struct bfa_s *bfa, 518 union bfa_fcport_stats_u *stats, 519 bfa_cb_port_t cbfn, void *cbarg); 520 bfa_status_t bfa_fcport_clear_qos_stats(struct bfa_s *bfa, bfa_cb_port_t cbfn, 521 void *cbarg); 522 bfa_status_t bfa_fcport_get_fcoe_stats(struct bfa_s *bfa, 523 union bfa_fcport_stats_u *stats, 524 bfa_cb_port_t cbfn, void *cbarg); 525 bfa_status_t bfa_fcport_clear_fcoe_stats(struct bfa_s *bfa, bfa_cb_port_t cbfn, 526 void *cbarg); 527 bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); 528 bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); 529 bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, 530 union bfa_fcport_stats_u *stats, 531 bfa_cb_port_t cbfn, void *cbarg); 532 bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_port_t cbfn, 533 void *cbarg); 534 bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa); 535 536 /* 537 * bfa rport API functions 538 */ 539 struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv); 540 void bfa_rport_delete(struct bfa_rport_s *rport); 541 void bfa_rport_online(struct bfa_rport_s *rport, 542 struct bfa_rport_info_s *rport_info); 543 void bfa_rport_offline(struct bfa_rport_s *rport); 544 void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed); 545 void bfa_rport_get_stats(struct bfa_rport_s *rport, 546 struct bfa_rport_hal_stats_s *stats); 547 void bfa_rport_clear_stats(struct bfa_rport_s *rport); 548 void bfa_cb_rport_online(void *rport); 549 void bfa_cb_rport_offline(void *rport); 550 void bfa_cb_rport_qos_scn_flowid(void *rport, 551 struct bfa_rport_qos_attr_s old_qos_attr, 552 struct bfa_rport_qos_attr_s new_qos_attr); 553 void bfa_cb_rport_qos_scn_prio(void *rport, 554 struct bfa_rport_qos_attr_s old_qos_attr, 555 struct bfa_rport_qos_attr_s new_qos_attr); 556 void bfa_rport_get_qos_attr(struct bfa_rport_s *rport, 557 struct bfa_rport_qos_attr_s *qos_attr); 558 559 /* 560 * bfa fcxp API functions 561 */ 562 struct bfa_fcxp_s *bfa_fcxp_alloc(void *bfad_fcxp, struct bfa_s *bfa, 563 int nreq_sgles, int nrsp_sgles, 564 bfa_fcxp_get_sgaddr_t get_req_sga, 565 bfa_fcxp_get_sglen_t get_req_sglen, 566 bfa_fcxp_get_sgaddr_t get_rsp_sga, 567 bfa_fcxp_get_sglen_t get_rsp_sglen); 568 void bfa_fcxp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe, 569 bfa_fcxp_alloc_cbfn_t alloc_cbfn, 570 void *cbarg, void *bfad_fcxp, 571 int nreq_sgles, int nrsp_sgles, 572 bfa_fcxp_get_sgaddr_t get_req_sga, 573 bfa_fcxp_get_sglen_t get_req_sglen, 574 bfa_fcxp_get_sgaddr_t get_rsp_sga, 575 bfa_fcxp_get_sglen_t get_rsp_sglen); 576 void bfa_fcxp_walloc_cancel(struct bfa_s *bfa, 577 struct bfa_fcxp_wqe_s *wqe); 578 void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp); 579 580 void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp); 581 void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp); 582 583 void bfa_fcxp_free(struct bfa_fcxp_s *fcxp); 584 585 void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport, 586 u16 vf_id, u8 lp_tag, 587 bfa_boolean_t cts, enum fc_cos cos, 588 u32 reqlen, struct fchs_s *fchs, 589 bfa_cb_fcxp_send_t cbfn, 590 void *cbarg, 591 u32 rsp_maxlen, u8 rsp_timeout); 592 bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp); 593 u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp); 594 u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa); 595 596 static inline void * 597 bfa_uf_get_frmbuf(struct bfa_uf_s *uf) 598 { 599 return uf->data_ptr; 600 } 601 602 static inline u16 603 bfa_uf_get_frmlen(struct bfa_uf_s *uf) 604 { 605 return uf->data_len; 606 } 607 608 /* 609 * bfa uf API functions 610 */ 611 void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv, 612 void *cbarg); 613 void bfa_uf_free(struct bfa_uf_s *uf); 614 615 /* 616 * bfa lport service api 617 */ 618 619 u32 bfa_lps_get_max_vport(struct bfa_s *bfa); 620 struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); 621 void bfa_lps_delete(struct bfa_lps_s *lps); 622 void bfa_lps_discard(struct bfa_lps_s *lps); 623 void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa, 624 u16 pdusz, wwn_t pwwn, wwn_t nwwn, 625 bfa_boolean_t auth_en); 626 void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz, 627 wwn_t pwwn, wwn_t nwwn); 628 void bfa_lps_flogo(struct bfa_lps_s *lps); 629 void bfa_lps_fdisclogo(struct bfa_lps_s *lps); 630 u8 bfa_lps_get_tag(struct bfa_lps_s *lps); 631 bfa_boolean_t bfa_lps_is_npiv_en(struct bfa_lps_s *lps); 632 bfa_boolean_t bfa_lps_is_fport(struct bfa_lps_s *lps); 633 bfa_boolean_t bfa_lps_is_brcd_fabric(struct bfa_lps_s *lps); 634 bfa_boolean_t bfa_lps_is_authreq(struct bfa_lps_s *lps); 635 bfa_eproto_status_t bfa_lps_get_extstatus(struct bfa_lps_s *lps); 636 u32 bfa_lps_get_pid(struct bfa_lps_s *lps); 637 u32 bfa_lps_get_base_pid(struct bfa_s *bfa); 638 u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid); 639 u16 bfa_lps_get_peer_bbcredit(struct bfa_lps_s *lps); 640 wwn_t bfa_lps_get_peer_pwwn(struct bfa_lps_s *lps); 641 wwn_t bfa_lps_get_peer_nwwn(struct bfa_lps_s *lps); 642 u8 bfa_lps_get_lsrjt_rsn(struct bfa_lps_s *lps); 643 u8 bfa_lps_get_lsrjt_expl(struct bfa_lps_s *lps); 644 mac_t bfa_lps_get_lp_mac(struct bfa_lps_s *lps); 645 void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); 646 void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); 647 void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); 648 void bfa_cb_lps_cvl_event(void *bfad, void *uarg); 649 650 void bfa_trunk_enable_cfg(struct bfa_s *bfa); 651 bfa_status_t bfa_trunk_enable(struct bfa_s *bfa); 652 bfa_status_t bfa_trunk_disable(struct bfa_s *bfa); 653 bfa_status_t bfa_trunk_get_attr(struct bfa_s *bfa, 654 struct bfa_trunk_attr_s *attr); 655 656 #endif /* __BFA_SVC_H__ */ 657