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 enum bfa_rport_event { 224 BFA_RPORT_SM_CREATE = 1, /* rport create event */ 225 BFA_RPORT_SM_DELETE = 2, /* deleting an existing rport */ 226 BFA_RPORT_SM_ONLINE = 3, /* rport is online */ 227 BFA_RPORT_SM_OFFLINE = 4, /* rport is offline */ 228 BFA_RPORT_SM_FWRSP = 5, /* firmware response */ 229 BFA_RPORT_SM_HWFAIL = 6, /* IOC h/w failure */ 230 BFA_RPORT_SM_QOS_SCN = 7, /* QoS SCN from firmware */ 231 BFA_RPORT_SM_SET_SPEED = 8, /* Set Rport Speed */ 232 BFA_RPORT_SM_QRESUME = 9, /* space in requeue queue */ 233 }; 234 235 #define BFA_RPORT_MIN 4 236 237 struct bfa_rport_mod_s { 238 struct bfa_rport_s *rps_list; /* list of rports */ 239 struct list_head rp_free_q; /* free bfa_rports */ 240 struct list_head rp_active_q; /* free bfa_rports */ 241 u16 num_rports; /* number of rports */ 242 }; 243 244 #define BFA_RPORT_MOD(__bfa) (&(__bfa)->modules.rport_mod) 245 246 /* 247 * Convert rport tag to RPORT 248 */ 249 #define BFA_RPORT_FROM_TAG(__bfa, _tag) \ 250 (BFA_RPORT_MOD(__bfa)->rps_list + \ 251 ((_tag) & (BFA_RPORT_MOD(__bfa)->num_rports - 1))) 252 253 /* 254 * protected functions 255 */ 256 void bfa_rport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 257 258 /* 259 * BFA rport information. 260 */ 261 struct bfa_rport_info_s { 262 u16 max_frmsz; /* max rcv pdu size */ 263 u32 pid:24, /* remote port ID */ 264 lp_tag:8; /* tag */ 265 u32 local_pid:24, /* local port ID */ 266 cisc:8; /* CIRO supported */ 267 u8 fc_class; /* supported FC classes. enum fc_cos */ 268 u8 vf_en; /* virtual fabric enable */ 269 u16 vf_id; /* virtual fabric ID */ 270 enum bfa_port_speed speed; /* Rport's current speed */ 271 }; 272 273 /* 274 * BFA rport data structure 275 */ 276 struct bfa_rport_s { 277 struct list_head qe; /* queue element */ 278 bfa_sm_t sm; /* state machine */ 279 struct bfa_s *bfa; /* backpointer to BFA */ 280 void *rport_drv; /* fcs/driver rport object */ 281 u16 fw_handle; /* firmware rport handle */ 282 u16 rport_tag; /* BFA rport tag */ 283 struct bfa_rport_info_s rport_info; /* rport info from fcs/driver */ 284 struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */ 285 struct bfa_cb_qe_s hcb_qe; /* BFA callback qelem */ 286 struct bfa_rport_hal_stats_s stats; /* BFA rport statistics */ 287 struct bfa_rport_qos_attr_s qos_attr; 288 union a { 289 bfa_status_t status; /* f/w status */ 290 void *fw_msg; /* QoS scn event */ 291 } event_arg; 292 }; 293 #define BFA_RPORT_FC_COS(_rport) ((_rport)->rport_info.fc_class) 294 295 296 /* 297 * UF - unsolicited receive related defines 298 */ 299 300 #define BFA_UF_MIN (4) 301 302 303 struct bfa_uf_s { 304 struct list_head qe; /* queue element */ 305 struct bfa_s *bfa; /* bfa instance */ 306 u16 uf_tag; /* identifying tag fw msgs */ 307 u16 vf_id; 308 u16 src_rport_handle; 309 u16 rsvd; 310 u8 *data_ptr; 311 u16 data_len; /* actual receive length */ 312 u16 pb_len; /* posted buffer length */ 313 void *buf_kva; /* buffer virtual address */ 314 u64 buf_pa; /* buffer physical address */ 315 struct bfa_cb_qe_s hcb_qe; /* comp: BFA comp qelem */ 316 struct bfa_sge_s sges[BFI_SGE_INLINE_MAX]; 317 }; 318 319 /* 320 * Callback prototype for unsolicited frame receive handler. 321 * 322 * @param[in] cbarg callback arg for receive handler 323 * @param[in] uf unsolicited frame descriptor 324 * 325 * @return None 326 */ 327 typedef void (*bfa_cb_uf_recv_t) (void *cbarg, struct bfa_uf_s *uf); 328 329 struct bfa_uf_mod_s { 330 struct bfa_s *bfa; /* back pointer to BFA */ 331 struct bfa_uf_s *uf_list; /* array of UFs */ 332 u16 num_ufs; /* num unsolicited rx frames */ 333 struct list_head uf_free_q; /* free UFs */ 334 struct list_head uf_posted_q; /* UFs posted to IOC */ 335 struct bfa_uf_buf_s *uf_pbs_kva; /* list UF bufs request pld */ 336 u64 uf_pbs_pa; /* phy addr for UF bufs */ 337 struct bfi_uf_buf_post_s *uf_buf_posts; 338 /* pre-built UF post msgs */ 339 bfa_cb_uf_recv_t ufrecv; /* uf recv handler function */ 340 void *cbarg; /* uf receive handler arg */ 341 }; 342 343 #define BFA_UF_MOD(__bfa) (&(__bfa)->modules.uf_mod) 344 345 #define ufm_pbs_pa(_ufmod, _uftag) \ 346 ((_ufmod)->uf_pbs_pa + sizeof(struct bfa_uf_buf_s) * (_uftag)) 347 348 void bfa_uf_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 349 350 #define BFA_UF_BUFSZ (2 * 1024 + 256) 351 352 /* 353 * @todo private 354 */ 355 struct bfa_uf_buf_s { 356 u8 d[BFA_UF_BUFSZ]; 357 }; 358 359 360 /* 361 * LPS - bfa lport login/logout service interface 362 */ 363 struct bfa_lps_s { 364 struct list_head qe; /* queue element */ 365 struct bfa_s *bfa; /* parent bfa instance */ 366 bfa_sm_t sm; /* finite state machine */ 367 u8 lp_tag; /* lport tag */ 368 u8 reqq; /* lport request queue */ 369 u8 alpa; /* ALPA for loop topologies */ 370 u32 lp_pid; /* lport port ID */ 371 bfa_boolean_t fdisc; /* snd FDISC instead of FLOGI */ 372 bfa_boolean_t auth_en; /* enable authentication */ 373 bfa_boolean_t auth_req; /* authentication required */ 374 bfa_boolean_t npiv_en; /* NPIV is allowed by peer */ 375 bfa_boolean_t fport; /* attached peer is F_PORT */ 376 bfa_boolean_t brcd_switch; /* attached peer is brcd sw */ 377 bfa_status_t status; /* login status */ 378 u16 pdusz; /* max receive PDU size */ 379 u16 pr_bbcred; /* BB_CREDIT from peer */ 380 u8 lsrjt_rsn; /* LSRJT reason */ 381 u8 lsrjt_expl; /* LSRJT explanation */ 382 wwn_t pwwn; /* port wwn of lport */ 383 wwn_t nwwn; /* node wwn of lport */ 384 wwn_t pr_pwwn; /* port wwn of lport peer */ 385 wwn_t pr_nwwn; /* node wwn of lport peer */ 386 mac_t lp_mac; /* fpma/spma MAC for lport */ 387 mac_t fcf_mac; /* FCF MAC of lport */ 388 struct bfa_reqq_wait_s wqe; /* request wait queue element */ 389 void *uarg; /* user callback arg */ 390 struct bfa_cb_qe_s hcb_qe; /* comp: callback qelem */ 391 struct bfi_lps_login_rsp_s *loginrsp; 392 bfa_eproto_status_t ext_status; 393 }; 394 395 struct bfa_lps_mod_s { 396 struct list_head lps_free_q; 397 struct list_head lps_active_q; 398 struct bfa_lps_s *lps_arr; 399 int num_lps; 400 }; 401 402 #define BFA_LPS_MOD(__bfa) (&(__bfa)->modules.lps_mod) 403 #define BFA_LPS_FROM_TAG(__mod, __tag) (&(__mod)->lps_arr[__tag]) 404 405 /* 406 * external functions 407 */ 408 void bfa_lps_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 409 410 411 /* 412 * FCPORT related defines 413 */ 414 415 #define BFA_FCPORT(_bfa) (&((_bfa)->modules.port)) 416 typedef void (*bfa_cb_port_t) (void *cbarg, enum bfa_status status); 417 418 /* 419 * Link notification data structure 420 */ 421 struct bfa_fcport_ln_s { 422 struct bfa_fcport_s *fcport; 423 bfa_sm_t sm; 424 struct bfa_cb_qe_s ln_qe; /* BFA callback queue elem for ln */ 425 enum bfa_port_linkstate ln_event; /* ln event for callback */ 426 }; 427 428 struct bfa_fcport_trunk_s { 429 struct bfa_trunk_attr_s attr; 430 }; 431 432 /* 433 * BFA FC port data structure 434 */ 435 struct bfa_fcport_s { 436 struct bfa_s *bfa; /* parent BFA instance */ 437 bfa_sm_t sm; /* port state machine */ 438 wwn_t nwwn; /* node wwn of physical port */ 439 wwn_t pwwn; /* port wwn of physical oprt */ 440 enum bfa_port_speed speed_sup; 441 /* supported speeds */ 442 enum bfa_port_speed speed; /* current speed */ 443 enum bfa_port_topology topology; /* current topology */ 444 u8 myalpa; /* my ALPA in LOOP topology */ 445 u8 rsvd[3]; 446 struct bfa_port_cfg_s cfg; /* current port configuration */ 447 bfa_boolean_t use_flash_cfg; /* get port cfg from flash */ 448 struct bfa_qos_attr_s qos_attr; /* QoS Attributes */ 449 struct bfa_qos_vc_attr_s qos_vc_attr; /* VC info from ELP */ 450 struct bfa_reqq_wait_s reqq_wait; 451 /* to wait for room in reqq */ 452 struct bfa_reqq_wait_s svcreq_wait; 453 /* to wait for room in reqq */ 454 struct bfa_reqq_wait_s stats_reqq_wait; 455 /* to wait for room in reqq (stats) */ 456 void *event_cbarg; 457 void (*event_cbfn) (void *cbarg, 458 enum bfa_port_linkstate event); 459 union { 460 union bfi_fcport_i2h_msg_u i2hmsg; 461 } event_arg; 462 void *bfad; /* BFA driver handle */ 463 struct bfa_fcport_ln_s ln; /* Link Notification */ 464 struct bfa_cb_qe_s hcb_qe; /* BFA callback queue elem */ 465 struct bfa_timer_s timer; /* timer */ 466 u32 msgtag; /* fimrware msg tag for reply */ 467 u8 *stats_kva; 468 u64 stats_pa; 469 union bfa_fcport_stats_u *stats; 470 union bfa_fcport_stats_u *stats_ret; /* driver stats location */ 471 bfa_status_t stats_status; /* stats/statsclr status */ 472 bfa_boolean_t stats_busy; /* outstanding stats/statsclr */ 473 bfa_boolean_t stats_qfull; 474 u32 stats_reset_time; /* stats reset time stamp */ 475 bfa_cb_port_t stats_cbfn; /* driver callback function */ 476 void *stats_cbarg; /* *!< user callback arg */ 477 bfa_boolean_t diag_busy; /* diag busy status */ 478 bfa_boolean_t beacon; /* port beacon status */ 479 bfa_boolean_t link_e2e_beacon; /* link beacon status */ 480 struct bfa_fcport_trunk_s trunk; 481 u16 fcoe_vlan; 482 }; 483 484 #define BFA_FCPORT_MOD(__bfa) (&(__bfa)->modules.fcport) 485 486 /* 487 * protected functions 488 */ 489 void bfa_fcport_init(struct bfa_s *bfa); 490 void bfa_fcport_isr(struct bfa_s *bfa, struct bfi_msg_s *msg); 491 492 /* 493 * bfa fcport API functions 494 */ 495 bfa_status_t bfa_fcport_enable(struct bfa_s *bfa); 496 bfa_status_t bfa_fcport_disable(struct bfa_s *bfa); 497 bfa_status_t bfa_fcport_cfg_speed(struct bfa_s *bfa, 498 enum bfa_port_speed speed); 499 enum bfa_port_speed bfa_fcport_get_speed(struct bfa_s *bfa); 500 bfa_status_t bfa_fcport_cfg_topology(struct bfa_s *bfa, 501 enum bfa_port_topology topo); 502 enum bfa_port_topology bfa_fcport_get_topology(struct bfa_s *bfa); 503 bfa_status_t bfa_fcport_cfg_hardalpa(struct bfa_s *bfa, u8 alpa); 504 bfa_boolean_t bfa_fcport_get_hardalpa(struct bfa_s *bfa, u8 *alpa); 505 u8 bfa_fcport_get_myalpa(struct bfa_s *bfa); 506 bfa_status_t bfa_fcport_clr_hardalpa(struct bfa_s *bfa); 507 bfa_status_t bfa_fcport_cfg_maxfrsize(struct bfa_s *bfa, u16 maxsize); 508 u16 bfa_fcport_get_maxfrsize(struct bfa_s *bfa); 509 u8 bfa_fcport_get_rx_bbcredit(struct bfa_s *bfa); 510 void bfa_fcport_get_attr(struct bfa_s *bfa, struct bfa_port_attr_s *attr); 511 wwn_t bfa_fcport_get_wwn(struct bfa_s *bfa, bfa_boolean_t node); 512 void bfa_fcport_event_register(struct bfa_s *bfa, 513 void (*event_cbfn) (void *cbarg, 514 enum bfa_port_linkstate event), void *event_cbarg); 515 bfa_boolean_t bfa_fcport_is_disabled(struct bfa_s *bfa); 516 enum bfa_port_speed bfa_fcport_get_ratelim_speed(struct bfa_s *bfa); 517 518 void bfa_fcport_set_tx_bbcredit(struct bfa_s *bfa, u16 tx_bbcredit); 519 bfa_boolean_t bfa_fcport_is_ratelim(struct bfa_s *bfa); 520 bfa_boolean_t bfa_fcport_is_linkup(struct bfa_s *bfa); 521 bfa_status_t bfa_fcport_get_stats(struct bfa_s *bfa, 522 union bfa_fcport_stats_u *stats, 523 bfa_cb_port_t cbfn, void *cbarg); 524 bfa_status_t bfa_fcport_clear_stats(struct bfa_s *bfa, bfa_cb_port_t cbfn, 525 void *cbarg); 526 bfa_boolean_t bfa_fcport_is_qos_enabled(struct bfa_s *bfa); 527 528 /* 529 * bfa rport API functions 530 */ 531 struct bfa_rport_s *bfa_rport_create(struct bfa_s *bfa, void *rport_drv); 532 void bfa_rport_online(struct bfa_rport_s *rport, 533 struct bfa_rport_info_s *rport_info); 534 void bfa_rport_speed(struct bfa_rport_s *rport, enum bfa_port_speed speed); 535 void bfa_cb_rport_online(void *rport); 536 void bfa_cb_rport_offline(void *rport); 537 void bfa_cb_rport_qos_scn_flowid(void *rport, 538 struct bfa_rport_qos_attr_s old_qos_attr, 539 struct bfa_rport_qos_attr_s new_qos_attr); 540 void bfa_cb_rport_qos_scn_prio(void *rport, 541 struct bfa_rport_qos_attr_s old_qos_attr, 542 struct bfa_rport_qos_attr_s new_qos_attr); 543 544 /* 545 * bfa fcxp API functions 546 */ 547 struct bfa_fcxp_s *bfa_fcxp_alloc(void *bfad_fcxp, struct bfa_s *bfa, 548 int nreq_sgles, int nrsp_sgles, 549 bfa_fcxp_get_sgaddr_t get_req_sga, 550 bfa_fcxp_get_sglen_t get_req_sglen, 551 bfa_fcxp_get_sgaddr_t get_rsp_sga, 552 bfa_fcxp_get_sglen_t get_rsp_sglen); 553 void bfa_fcxp_alloc_wait(struct bfa_s *bfa, struct bfa_fcxp_wqe_s *wqe, 554 bfa_fcxp_alloc_cbfn_t alloc_cbfn, 555 void *cbarg, void *bfad_fcxp, 556 int nreq_sgles, int nrsp_sgles, 557 bfa_fcxp_get_sgaddr_t get_req_sga, 558 bfa_fcxp_get_sglen_t get_req_sglen, 559 bfa_fcxp_get_sgaddr_t get_rsp_sga, 560 bfa_fcxp_get_sglen_t get_rsp_sglen); 561 void bfa_fcxp_walloc_cancel(struct bfa_s *bfa, 562 struct bfa_fcxp_wqe_s *wqe); 563 void bfa_fcxp_discard(struct bfa_fcxp_s *fcxp); 564 565 void *bfa_fcxp_get_reqbuf(struct bfa_fcxp_s *fcxp); 566 void *bfa_fcxp_get_rspbuf(struct bfa_fcxp_s *fcxp); 567 568 void bfa_fcxp_free(struct bfa_fcxp_s *fcxp); 569 570 void bfa_fcxp_send(struct bfa_fcxp_s *fcxp, struct bfa_rport_s *rport, 571 u16 vf_id, u8 lp_tag, 572 bfa_boolean_t cts, enum fc_cos cos, 573 u32 reqlen, struct fchs_s *fchs, 574 bfa_cb_fcxp_send_t cbfn, 575 void *cbarg, 576 u32 rsp_maxlen, u8 rsp_timeout); 577 bfa_status_t bfa_fcxp_abort(struct bfa_fcxp_s *fcxp); 578 u32 bfa_fcxp_get_reqbufsz(struct bfa_fcxp_s *fcxp); 579 u32 bfa_fcxp_get_maxrsp(struct bfa_s *bfa); 580 581 static inline void * 582 bfa_uf_get_frmbuf(struct bfa_uf_s *uf) 583 { 584 return uf->data_ptr; 585 } 586 587 static inline u16 588 bfa_uf_get_frmlen(struct bfa_uf_s *uf) 589 { 590 return uf->data_len; 591 } 592 593 /* 594 * bfa uf API functions 595 */ 596 void bfa_uf_recv_register(struct bfa_s *bfa, bfa_cb_uf_recv_t ufrecv, 597 void *cbarg); 598 void bfa_uf_free(struct bfa_uf_s *uf); 599 600 /* 601 * bfa lport service api 602 */ 603 604 u32 bfa_lps_get_max_vport(struct bfa_s *bfa); 605 struct bfa_lps_s *bfa_lps_alloc(struct bfa_s *bfa); 606 void bfa_lps_delete(struct bfa_lps_s *lps); 607 void bfa_lps_flogi(struct bfa_lps_s *lps, void *uarg, u8 alpa, 608 u16 pdusz, wwn_t pwwn, wwn_t nwwn, 609 bfa_boolean_t auth_en); 610 void bfa_lps_fdisc(struct bfa_lps_s *lps, void *uarg, u16 pdusz, 611 wwn_t pwwn, wwn_t nwwn); 612 void bfa_lps_fdisclogo(struct bfa_lps_s *lps); 613 void bfa_lps_set_n2n_pid(struct bfa_lps_s *lps, u32 n2n_pid); 614 u32 bfa_lps_get_base_pid(struct bfa_s *bfa); 615 u8 bfa_lps_get_tag_from_pid(struct bfa_s *bfa, u32 pid); 616 void bfa_cb_lps_flogi_comp(void *bfad, void *uarg, bfa_status_t status); 617 void bfa_cb_lps_fdisc_comp(void *bfad, void *uarg, bfa_status_t status); 618 void bfa_cb_lps_fdisclogo_comp(void *bfad, void *uarg); 619 void bfa_cb_lps_cvl_event(void *bfad, void *uarg); 620 621 #endif /* __BFA_SVC_H__ */ 622