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