Lines Matching +full:wr +full:- +full:active

4  * Copyright (c) 2008-2012 Chelsio Communications, Inc. All rights reserved.
16 * - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
102 #define csio_ct_rsp(cp) (((struct fc_ct_hdr *)cp)->ct_cmd)
103 #define csio_ct_reason(cp) (((struct fc_ct_hdr *)cp)->ct_reason)
104 #define csio_ct_expl(cp) (((struct fc_ct_hdr *)cp)->ct_explan)
108 * csio_ln_match_by_portid - lookup lnode using given portid.
110 * @portid: port-id.
121 list_for_each(tmp, &hw->sln_head) { in csio_ln_lookup_by_portid()
123 if (ln->portid == portid) in csio_ln_lookup_by_portid()
131 * csio_ln_lookup_by_vnpi - Lookup lnode using given vnp id.
132 * @hw - HW module
133 * @vnpi - vnp index.
134 * Returns - If found, returns lnode matching given vnp id
143 if (list_empty(&hw->sln_head)) { in csio_ln_lookup_by_vnpi()
148 list_for_each(tmp1, &hw->sln_head) { in csio_ln_lookup_by_vnpi()
152 if (sln->vnp_flowid == vnp_id) in csio_ln_lookup_by_vnpi()
155 if (list_empty(&sln->cln_head)) in csio_ln_lookup_by_vnpi()
159 list_for_each(tmp2, &sln->cln_head) { in csio_ln_lookup_by_vnpi()
162 if (cln->vnp_flowid == vnp_id) in csio_ln_lookup_by_vnpi()
171 * csio_lnode_lookup_by_wwpn - Lookup lnode using given wwpn.
183 if (list_empty(&hw->sln_head)) { in csio_lnode_lookup_by_wwpn()
188 list_for_each(tmp1, &hw->sln_head) { in csio_lnode_lookup_by_wwpn()
195 if (list_empty(&sln->cln_head)) in csio_lnode_lookup_by_wwpn()
199 list_for_each(tmp2, &sln->cln_head) { in csio_lnode_lookup_by_wwpn()
214 cmd->ct_rev = FC_CT_REV; in csio_fill_ct_iu()
215 cmd->ct_fs_type = type; in csio_fill_ct_iu()
216 cmd->ct_fs_subtype = sub_type; in csio_fill_ct_iu()
217 cmd->ct_cmd = htons(op); in csio_fill_ct_iu()
223 if (snprintf(buf, buf_len, "%s", init_utsname()->nodename) > 0) in csio_hostname()
225 return -1; in csio_hostname()
232 init_utsname()->sysname, in csio_osname()
233 init_utsname()->release, in csio_osname()
234 init_utsname()->version) > 0) in csio_osname()
237 return -1; in csio_osname()
251 ae->type = htons(type); in csio_append_attrib()
254 ae->len = htons(len); in csio_append_attrib()
255 memcpy(ae->value, val, val_len); in csio_append_attrib()
257 memset(ae->value + val_len, 0, len - val_len); in csio_append_attrib()
262 * csio_ln_fdmi_done - FDMI registeration completion
270 struct csio_lnode *ln = fdmi_req->lnode; in csio_ln_fdmi_done()
272 if (fdmi_req->wr_status != FW_SUCCESS) { in csio_ln_fdmi_done()
273 csio_ln_dbg(ln, "WR error:%x in processing fdmi rpa cmd\n", in csio_ln_fdmi_done()
274 fdmi_req->wr_status); in csio_ln_fdmi_done()
278 cmd = fdmi_req->dma_buf.vaddr; in csio_ln_fdmi_done()
286 * csio_ln_fdmi_rhba_cbfn - RHBA completion
299 struct csio_lnode *ln = fdmi_req->lnode; in csio_ln_fdmi_rhba_cbfn()
306 if (fdmi_req->wr_status != FW_SUCCESS) { in csio_ln_fdmi_rhba_cbfn()
307 csio_ln_dbg(ln, "WR error:%x in processing fdmi rhba cmd\n", in csio_ln_fdmi_rhba_cbfn()
308 fdmi_req->wr_status); in csio_ln_fdmi_rhba_cbfn()
312 cmd = fdmi_req->dma_buf.vaddr; in csio_ln_fdmi_rhba_cbfn()
318 if (!csio_is_rnode_ready(fdmi_req->rnode)) { in csio_ln_fdmi_rhba_cbfn()
330 memcpy(&port_name->portname, csio_ln_wwpn(ln), 8); in csio_ln_fdmi_rhba_cbfn()
335 attrib_blk->numattrs = 0; in csio_ln_fdmi_rhba_cbfn()
336 len += sizeof(attrib_blk->numattrs); in csio_ln_fdmi_rhba_cbfn()
337 pld += sizeof(attrib_blk->numattrs); in csio_ln_fdmi_rhba_cbfn()
352 if (hw->pport[ln->portid].link_speed == FW_PORT_CAP_SPEED_1G) in csio_ln_fdmi_rhba_cbfn()
354 else if (hw->pport[ln->portid].link_speed == FW_PORT_CAP_SPEED_10G) in csio_ln_fdmi_rhba_cbfn()
356 else if (hw->pport[ln->portid].link_speed == FW_PORT_CAP32_SPEED_25G) in csio_ln_fdmi_rhba_cbfn()
358 else if (hw->pport[ln->portid].link_speed == FW_PORT_CAP32_SPEED_40G) in csio_ln_fdmi_rhba_cbfn()
360 else if (hw->pport[ln->portid].link_speed == FW_PORT_CAP32_SPEED_50G) in csio_ln_fdmi_rhba_cbfn()
362 else if (hw->pport[ln->portid].link_speed == FW_PORT_CAP32_SPEED_100G) in csio_ln_fdmi_rhba_cbfn()
370 mfs = ln->ln_sparm.csp.sp_bb_data; in csio_ln_fdmi_rhba_cbfn()
385 attrib_blk->numattrs = htonl(numattrs); in csio_ln_fdmi_rhba_cbfn()
386 len = (uint32_t)(pld - (uint8_t *)cmd); in csio_ln_fdmi_rhba_cbfn()
389 spin_lock_irqsave(&hw->lock, flags); in csio_ln_fdmi_rhba_cbfn()
391 FCOE_CT, &fdmi_req->dma_buf, len)) { in csio_ln_fdmi_rhba_cbfn()
395 spin_unlock_irqrestore(&hw->lock, flags); in csio_ln_fdmi_rhba_cbfn()
399 * csio_ln_fdmi_dprt_cbfn - DPRT completion
412 struct csio_lnode *ln = fdmi_req->lnode; in csio_ln_fdmi_dprt_cbfn()
418 if (fdmi_req->wr_status != FW_SUCCESS) { in csio_ln_fdmi_dprt_cbfn()
419 csio_ln_dbg(ln, "WR error:%x in processing fdmi dprt cmd\n", in csio_ln_fdmi_dprt_cbfn()
420 fdmi_req->wr_status); in csio_ln_fdmi_dprt_cbfn()
424 if (!csio_is_rnode_ready(fdmi_req->rnode)) { in csio_ln_fdmi_dprt_cbfn()
428 cmd = fdmi_req->dma_buf.vaddr; in csio_ln_fdmi_dprt_cbfn()
442 memcpy(&hbaid->id, csio_ln_wwpn(ln), 8); /* HBA identifer */ in csio_ln_fdmi_dprt_cbfn()
447 reg_pl->numport = htonl(1); in csio_ln_fdmi_dprt_cbfn()
448 memcpy(&reg_pl->port[0].portname, csio_ln_wwpn(ln), 8); in csio_ln_fdmi_dprt_cbfn()
453 attrib_blk->numattrs = 0; in csio_ln_fdmi_dprt_cbfn()
454 len += sizeof(attrib_blk->numattrs); in csio_ln_fdmi_dprt_cbfn()
455 pld += sizeof(attrib_blk->numattrs); in csio_ln_fdmi_dprt_cbfn()
468 hw->vpd.sn, sizeof(hw->vpd.sn)); in csio_ln_fdmi_dprt_cbfn()
470 csio_append_attrib(&pld, FC_FDMI_HBA_ATTR_MODEL, hw->vpd.id, in csio_ln_fdmi_dprt_cbfn()
471 sizeof(hw->vpd.id)); in csio_ln_fdmi_dprt_cbfn()
474 hw->model_desc, strlen(hw->model_desc)); in csio_ln_fdmi_dprt_cbfn()
477 hw->hw_ver, sizeof(hw->hw_ver)); in csio_ln_fdmi_dprt_cbfn()
480 hw->fwrev_str, strlen(hw->fwrev_str)); in csio_ln_fdmi_dprt_cbfn()
491 len = (uint32_t)(pld - (uint8_t *)cmd); in csio_ln_fdmi_dprt_cbfn()
493 attrib_blk->numattrs = htonl(numattrs); in csio_ln_fdmi_dprt_cbfn()
496 spin_lock_irqsave(&hw->lock, flags); in csio_ln_fdmi_dprt_cbfn()
498 FCOE_CT, &fdmi_req->dma_buf, len)) { in csio_ln_fdmi_dprt_cbfn()
502 spin_unlock_irqrestore(&hw->lock, flags); in csio_ln_fdmi_dprt_cbfn()
506 * csio_ln_fdmi_dhba_cbfn - DHBA completion
513 struct csio_lnode *ln = fdmi_req->lnode; in csio_ln_fdmi_dhba_cbfn()
519 if (fdmi_req->wr_status != FW_SUCCESS) { in csio_ln_fdmi_dhba_cbfn()
520 csio_ln_dbg(ln, "WR error:%x in processing fdmi dhba cmd\n", in csio_ln_fdmi_dhba_cbfn()
521 fdmi_req->wr_status); in csio_ln_fdmi_dhba_cbfn()
525 if (!csio_is_rnode_ready(fdmi_req->rnode)) { in csio_ln_fdmi_dhba_cbfn()
529 cmd = fdmi_req->dma_buf.vaddr; in csio_ln_fdmi_dhba_cbfn()
535 /* Send FDMI cmd to de-register any Port attributes if registered in csio_ln_fdmi_dhba_cbfn()
544 memcpy(&port_name->portname, csio_ln_wwpn(ln), 8); in csio_ln_fdmi_dhba_cbfn()
548 spin_lock_irqsave(&hw->lock, flags); in csio_ln_fdmi_dhba_cbfn()
550 FCOE_CT, &fdmi_req->dma_buf, len)) { in csio_ln_fdmi_dhba_cbfn()
554 spin_unlock_irqrestore(&hw->lock, flags); in csio_ln_fdmi_dhba_cbfn()
558 * csio_ln_fdmi_start - Start an FDMI request.
573 if (!(ln->flags & CSIO_LNF_FDMI_ENABLE)) in csio_ln_fdmi_start()
574 return -EPROTONOSUPPORT; in csio_ln_fdmi_start()
579 /* Send FDMI cmd to de-register any HBA attributes if registered in csio_ln_fdmi_start()
583 fdmi_req = ln->mgmt_req; in csio_ln_fdmi_start()
584 fdmi_req->lnode = ln; in csio_ln_fdmi_start()
585 fdmi_req->rnode = fdmi_rn; in csio_ln_fdmi_start()
588 cmd = fdmi_req->dma_buf.vaddr; in csio_ln_fdmi_start()
594 memcpy(&hbaid->id, csio_ln_wwpn(ln), 8); in csio_ln_fdmi_start()
599 FCOE_CT, &fdmi_req->dma_buf, len)) { in csio_ln_fdmi_start()
608 * csio_ln_vnp_read_cbfn - vnp read completion handler.
617 struct csio_lnode *ln = ((struct csio_lnode *)mbp->priv); in csio_ln_vnp_read_cbfn()
618 struct fw_fcoe_vnp_cmd *rsp = (struct fw_fcoe_vnp_cmd *)(mbp->mb); in csio_ln_vnp_read_cbfn()
624 retval = FW_CMD_RETVAL_G(ntohl(rsp->alloc_to_len16)); in csio_ln_vnp_read_cbfn()
627 mempool_free(mbp, hw->mb_mempool); in csio_ln_vnp_read_cbfn()
631 spin_lock_irq(&hw->lock); in csio_ln_vnp_read_cbfn()
633 memcpy(ln->mac, rsp->vnport_mac, sizeof(ln->mac)); in csio_ln_vnp_read_cbfn()
634 memcpy(&nport_id, &rsp->vnport_mac[3], sizeof(uint8_t)*3); in csio_ln_vnp_read_cbfn()
635 ln->nport_id = ntohl(nport_id); in csio_ln_vnp_read_cbfn()
636 ln->nport_id = ln->nport_id >> 8; in csio_ln_vnp_read_cbfn()
644 memcpy(csio_ln_wwnn(ln), rsp->vnport_wwnn, 8); in csio_ln_vnp_read_cbfn()
645 memcpy(csio_ln_wwpn(ln), rsp->vnport_wwpn, 8); in csio_ln_vnp_read_cbfn()
648 csp = (struct fc_els_csp *)rsp->cmn_srv_parms; in csio_ln_vnp_read_cbfn()
649 ln->ln_sparm.csp.sp_hi_ver = csp->sp_hi_ver; in csio_ln_vnp_read_cbfn()
650 ln->ln_sparm.csp.sp_lo_ver = csp->sp_lo_ver; in csio_ln_vnp_read_cbfn()
651 ln->ln_sparm.csp.sp_bb_cred = csp->sp_bb_cred; in csio_ln_vnp_read_cbfn()
652 ln->ln_sparm.csp.sp_features = csp->sp_features; in csio_ln_vnp_read_cbfn()
653 ln->ln_sparm.csp.sp_bb_data = csp->sp_bb_data; in csio_ln_vnp_read_cbfn()
654 ln->ln_sparm.csp.sp_r_a_tov = csp->sp_r_a_tov; in csio_ln_vnp_read_cbfn()
655 ln->ln_sparm.csp.sp_e_d_tov = csp->sp_e_d_tov; in csio_ln_vnp_read_cbfn()
658 clsp = (struct fc_els_cssp *)rsp->clsp_word_0_1; in csio_ln_vnp_read_cbfn()
659 ln->ln_sparm.clsp[2].cp_class = clsp->cp_class; in csio_ln_vnp_read_cbfn()
660 ln->ln_sparm.clsp[2].cp_init = clsp->cp_init; in csio_ln_vnp_read_cbfn()
661 ln->ln_sparm.clsp[2].cp_recip = clsp->cp_recip; in csio_ln_vnp_read_cbfn()
662 ln->ln_sparm.clsp[2].cp_rdfs = clsp->cp_rdfs; in csio_ln_vnp_read_cbfn()
664 spin_unlock_irq(&hw->lock); in csio_ln_vnp_read_cbfn()
666 mempool_free(mbp, hw->mb_mempool); in csio_ln_vnp_read_cbfn()
673 * csio_ln_vnp_read - Read vnp params.
683 struct csio_hw *hw = ln->hwp; in csio_ln_vnp_read()
687 mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC); in csio_ln_vnp_read()
690 return -ENOMEM; in csio_ln_vnp_read()
696 ln->fcf_flowid, in csio_ln_vnp_read()
697 ln->vnp_flowid, in csio_ln_vnp_read()
703 mempool_free(mbp, hw->mb_mempool); in csio_ln_vnp_read()
704 return -EINVAL; in csio_ln_vnp_read()
711 * csio_fcoe_enable_link - Enable fcoe link.
720 struct csio_hw *hw = ln->hwp; in csio_fcoe_enable_link()
728 mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC); in csio_fcoe_enable_link()
731 return -ENOMEM; in csio_fcoe_enable_link()
734 portid = ln->portid; in csio_fcoe_enable_link()
746 mempool_free(mbp, hw->mb_mempool); in csio_fcoe_enable_link()
747 return -EINVAL; in csio_fcoe_enable_link()
755 mempool_free(mbp, hw->mb_mempool); in csio_fcoe_enable_link()
756 return -EINVAL; in csio_fcoe_enable_link()
762 lcmd = (struct fw_fcoe_link_cmd *)mbp->mb; in csio_fcoe_enable_link()
764 memcpy(csio_ln_wwnn(ln), lcmd->vnport_wwnn, 8); in csio_fcoe_enable_link()
765 memcpy(csio_ln_wwpn(ln), lcmd->vnport_wwpn, 8); in csio_fcoe_enable_link()
768 if (hw->pport[i].portid == portid) in csio_fcoe_enable_link()
769 memcpy(hw->pport[i].mac, lcmd->phy_mac, 6); in csio_fcoe_enable_link()
772 mempool_free(mbp, hw->mb_mempool); in csio_fcoe_enable_link()
777 * csio_ln_read_fcf_cbfn - Read fcf parameters
785 struct csio_lnode *ln = (struct csio_lnode *)mbp->priv; in csio_ln_read_fcf_cbfn()
788 (struct fw_fcoe_fcf_cmd *)(mbp->mb); in csio_ln_read_fcf_cbfn()
791 retval = FW_CMD_RETVAL_G(ntohl(rsp->retval_len16)); in csio_ln_read_fcf_cbfn()
795 mempool_free(mbp, hw->mb_mempool); in csio_ln_read_fcf_cbfn()
799 spin_lock_irq(&hw->lock); in csio_ln_read_fcf_cbfn()
800 fcf_info = ln->fcfinfo; in csio_ln_read_fcf_cbfn()
801 fcf_info->priority = FW_FCOE_FCF_CMD_PRIORITY_GET( in csio_ln_read_fcf_cbfn()
802 ntohs(rsp->priority_pkd)); in csio_ln_read_fcf_cbfn()
803 fcf_info->vf_id = ntohs(rsp->vf_id); in csio_ln_read_fcf_cbfn()
804 fcf_info->vlan_id = rsp->vlan_id; in csio_ln_read_fcf_cbfn()
805 fcf_info->max_fcoe_size = ntohs(rsp->max_fcoe_size); in csio_ln_read_fcf_cbfn()
806 fcf_info->fka_adv = be32_to_cpu(rsp->fka_adv); in csio_ln_read_fcf_cbfn()
807 fcf_info->fcfi = FW_FCOE_FCF_CMD_FCFI_GET(ntohl(rsp->op_to_fcfi)); in csio_ln_read_fcf_cbfn()
808 fcf_info->fpma = FW_FCOE_FCF_CMD_FPMA_GET(rsp->fpma_to_portid); in csio_ln_read_fcf_cbfn()
809 fcf_info->spma = FW_FCOE_FCF_CMD_SPMA_GET(rsp->fpma_to_portid); in csio_ln_read_fcf_cbfn()
810 fcf_info->login = FW_FCOE_FCF_CMD_LOGIN_GET(rsp->fpma_to_portid); in csio_ln_read_fcf_cbfn()
811 fcf_info->portid = FW_FCOE_FCF_CMD_PORTID_GET(rsp->fpma_to_portid); in csio_ln_read_fcf_cbfn()
812 memcpy(fcf_info->fc_map, rsp->fc_map, sizeof(fcf_info->fc_map)); in csio_ln_read_fcf_cbfn()
813 memcpy(fcf_info->mac, rsp->mac, sizeof(fcf_info->mac)); in csio_ln_read_fcf_cbfn()
814 memcpy(fcf_info->name_id, rsp->name_id, sizeof(fcf_info->name_id)); in csio_ln_read_fcf_cbfn()
815 memcpy(fcf_info->fabric, rsp->fabric, sizeof(fcf_info->fabric)); in csio_ln_read_fcf_cbfn()
816 memcpy(fcf_info->spma_mac, rsp->spma_mac, sizeof(fcf_info->spma_mac)); in csio_ln_read_fcf_cbfn()
818 spin_unlock_irq(&hw->lock); in csio_ln_read_fcf_cbfn()
820 mempool_free(mbp, hw->mb_mempool); in csio_ln_read_fcf_cbfn()
824 * csio_ln_read_fcf_entry - Read fcf entry.
834 struct csio_hw *hw = ln->hwp; in csio_ln_read_fcf_entry()
837 mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC); in csio_ln_read_fcf_entry()
840 return -ENOMEM; in csio_ln_read_fcf_entry()
845 ln->portid, ln->fcf_flowid, cbfn); in csio_ln_read_fcf_entry()
849 mempool_free(mbp, hw->mb_mempool); in csio_ln_read_fcf_entry()
850 return -EINVAL; in csio_ln_read_fcf_entry()
857 * csio_handle_link_up - Logical Linkup event.
858 * @hw - HW module.
859 * @portid - Physical port number
860 * @fcfi - FCF index.
861 * @vnpi - VNP index.
862 * Returns - none.
891 if (ln->vnp_flowid != CSIO_INVALID_IDX) { in csio_handle_link_up()
892 /* New VN-Port */ in csio_handle_link_up()
893 spin_unlock_irq(&hw->lock); in csio_handle_link_up()
895 spin_lock_irq(&hw->lock); in csio_handle_link_up()
904 ln->portid = portid; in csio_handle_link_up()
906 ln->vnp_flowid = vnpi; in csio_handle_link_up()
907 ln->dev_num &= ~0xFFFF; in csio_handle_link_up()
908 ln->dev_num |= vnpi; in csio_handle_link_up()
912 ln->fcf_flowid = fcfi; in csio_handle_link_up()
914 csio_info(hw, "Port:%d - FCOE LINK UP\n", portid); in csio_handle_link_up()
919 csio_post_event(&ln->sm, CSIO_LNE_LINKUP); in csio_handle_link_up()
924 * @ln - FCOE lnode
925 * @evt - Given rnode event
926 * Returns - none
937 struct csio_rnode *rnhead = (struct csio_rnode *) &ln->rnhead; in csio_post_event_rns()
941 list_for_each_safe(tmp, next, &rnhead->sm.sm_list) { in csio_post_event_rns()
943 csio_post_event(&rn->sm, evt); in csio_post_event_rns()
949 * @ln - FCOE lnode
950 * Returns - none
959 struct csio_rnode *rnhead = (struct csio_rnode *) &ln->rnhead; in csio_cleanup_rns()
963 list_for_each_safe(tmp, next_rn, &rnhead->sm.sm_list) { in csio_cleanup_rns()
972 * @ln - FCOE lnode
973 * @evt - Given lnode event
974 * Returns - none
990 csio_post_event(&ln->sm, evt); in csio_post_event_lns()
996 list_for_each(tmp, &sln->cln_head) { in csio_post_event_lns()
998 csio_post_event(&cln->sm, evt); in csio_post_event_lns()
1002 csio_post_event(&ln->sm, evt); in csio_post_event_lns()
1006 * csio_ln_down - Lcoal nport is down
1007 * @ln - FCOE Lnode
1008 * Returns - none
1021 * csio_handle_link_down - Logical Linkdown event.
1022 * @hw - HW module.
1023 * @portid - Physical port number
1024 * @fcfi - FCF index.
1025 * @vnpi - VNP index.
1026 * Returns - none
1030 * this vnpi[VN-Port] will be de-instantiated.
1044 fp = ln->fcfinfo; in csio_handle_link_down()
1058 if (fp->portid != portid) { in csio_handle_link_down()
1067 if (ln->fcf_flowid != fcfi) { in csio_handle_link_down()
1075 csio_info(hw, "Port:%d - FCOE LINK DOWN\n", portid); in csio_handle_link_down()
1090 * csio_is_lnode_ready - Checks FCOE lnode is in ready state.
1105 * csio_lns_uninit - The request in uninit state.
1106 * @ln - FCOE lnode.
1107 * @evt - Event to be processed.
1111 * Return - none.
1117 struct csio_lnode *rln = hw->rln; in csio_lns_uninit()
1123 csio_set_state(&ln->sm, csio_lns_online); in csio_lns_uninit()
1135 list_add_tail(&ln->fcfinfo->list, &rln->fcf_lsthead); in csio_lns_uninit()
1151 "ln state[uninit].\n", evt, ln->nport_id); in csio_lns_uninit()
1158 * csio_lns_online - The request in online state.
1159 * @ln - FCOE lnode.
1160 * @evt - Event to be processed.
1164 * Return - none.
1176 "Ignoring linkup on port:%d\n", ln->portid); in csio_lns_online()
1181 csio_set_state(&ln->sm, csio_lns_ready); in csio_lns_online()
1183 spin_unlock_irq(&hw->lock); in csio_lns_online()
1185 spin_lock_irq(&hw->lock); in csio_lns_online()
1191 csio_set_state(&ln->sm, csio_lns_uninit); in csio_lns_online()
1194 list_del_init(&ln->fcfinfo->list); in csio_lns_online()
1201 "ln state[uninit].\n", evt, ln->nport_id); in csio_lns_online()
1209 * csio_lns_ready - The request in ready state.
1210 * @ln - FCOE lnode.
1211 * @evt - Event to be processed.
1215 * Return - none.
1227 "in ln state[ready].\n", evt, ln->nport_id); in csio_lns_ready()
1232 csio_set_state(&ln->sm, csio_lns_offline); in csio_lns_ready()
1235 spin_unlock_irq(&hw->lock); in csio_lns_ready()
1237 spin_lock_irq(&hw->lock); in csio_lns_ready()
1241 list_del_init(&ln->fcfinfo->list); in csio_lns_ready()
1246 csio_set_state(&ln->sm, csio_lns_offline); in csio_lns_ready()
1252 spin_unlock_irq(&hw->lock); in csio_lns_ready()
1254 spin_lock_irq(&hw->lock); in csio_lns_ready()
1258 list_del_init(&ln->fcfinfo->list); in csio_lns_ready()
1263 csio_set_state(&ln->sm, csio_lns_uninit); in csio_lns_ready()
1268 csio_set_state(&ln->sm, csio_lns_offline); in csio_lns_ready()
1275 "ln state[uninit].\n", evt, ln->nport_id); in csio_lns_ready()
1283 * csio_lns_offline - The request in offline state.
1284 * @ln - FCOE lnode.
1285 * @evt - Event to be processed.
1289 * Return - none.
1295 struct csio_lnode *rln = hw->rln; in csio_lns_offline()
1301 csio_set_state(&ln->sm, csio_lns_online); in csio_lns_offline()
1313 list_add_tail(&ln->fcfinfo->list, &rln->fcf_lsthead); in csio_lns_offline()
1328 "in ln state[offline].\n", evt, ln->nport_id); in csio_lns_offline()
1333 csio_set_state(&ln->sm, csio_lns_uninit); in csio_lns_offline()
1340 "ln state[offline]\n", evt, ln->nport_id); in csio_lns_offline()
1361 * csio_lnode_state_to_str - Get current state of FCOE lnode.
1362 * @ln - lnode
1363 * @str - state of lnode.
1394 mbp = mempool_alloc(hw->mb_mempool, GFP_ATOMIC); in csio_get_phy_port_stats()
1397 return -EINVAL; in csio_get_phy_port_stats()
1402 portparams.idx = (idx-1)*6 + 1; in csio_get_phy_port_stats()
1410 mempool_free(mbp, hw->mb_mempool); in csio_get_phy_port_stats()
1411 return -EINVAL; in csio_get_phy_port_stats()
1417 mempool_free(mbp, hw->mb_mempool); in csio_get_phy_port_stats()
1422 * csio_ln_mgmt_wr_handler -Mgmt Work Request handler.
1423 * @wr - WR.
1424 * @len - WR len.
1425 * This handler is invoked when an outstanding mgmt WR is completed.
1428 * Return - none.
1432 csio_ln_mgmt_wr_handler(struct csio_hw *hw, void *wr, uint32_t len) in csio_ln_mgmt_wr_handler() argument
1439 wr_cmd = (struct fw_fcoe_els_ct_wr *) wr; in csio_ln_mgmt_wr_handler()
1442 csio_err(mgmtm->hw, in csio_ln_mgmt_wr_handler()
1443 "Invalid ELS CT WR length recvd, len:%x\n", len); in csio_ln_mgmt_wr_handler()
1444 mgmtm->stats.n_err++; in csio_ln_mgmt_wr_handler()
1448 io_req = (struct csio_ioreq *) ((uintptr_t) wr_cmd->cookie); in csio_ln_mgmt_wr_handler()
1449 io_req->wr_status = csio_wr_status(wr_cmd); in csio_ln_mgmt_wr_handler()
1451 /* lookup ioreq exists in our active Q */ in csio_ln_mgmt_wr_handler()
1452 spin_lock_irq(&hw->lock); in csio_ln_mgmt_wr_handler()
1454 csio_err(mgmtm->hw, in csio_ln_mgmt_wr_handler()
1455 "Error- Invalid IO handle recv in WR. handle: %p\n", in csio_ln_mgmt_wr_handler()
1457 mgmtm->stats.n_err++; in csio_ln_mgmt_wr_handler()
1458 spin_unlock_irq(&hw->lock); in csio_ln_mgmt_wr_handler()
1464 /* Dequeue from active queue */ in csio_ln_mgmt_wr_handler()
1465 list_del_init(&io_req->sm.sm_list); in csio_ln_mgmt_wr_handler()
1466 mgmtm->stats.n_active--; in csio_ln_mgmt_wr_handler()
1467 spin_unlock_irq(&hw->lock); in csio_ln_mgmt_wr_handler()
1470 if (io_req->io_cbfn) in csio_ln_mgmt_wr_handler()
1471 io_req->io_cbfn(hw, io_req); in csio_ln_mgmt_wr_handler()
1475 * csio_fcoe_fwevt_handler - Event handler for Firmware FCoE events.
1478 * @cmd: FW cmd/WR.
1480 * Process received FCoE cmd/WR event from FW.
1489 struct fw_wr_hdr *wr; in csio_fcoe_fwevt_handler() local
1498 lstatus = lcmd->lstatus; in csio_fcoe_fwevt_handler()
1500 ntohl(lcmd->op_to_portid)); in csio_fcoe_fwevt_handler()
1501 fcfi = FW_FCOE_LINK_CMD_FCFI_GET(ntohl(lcmd->sub_opcode_fcfi)); in csio_fcoe_fwevt_handler()
1502 vnpi = FW_FCOE_LINK_CMD_VNPI_GET(ntohl(lcmd->vnpi_pkd)); in csio_fcoe_fwevt_handler()
1507 spin_lock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1509 spin_unlock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1515 spin_lock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1517 spin_unlock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1521 lcmd->lstatus); in csio_fcoe_fwevt_handler()
1525 wr = (struct fw_wr_hdr *) (cmd + 4); in csio_fcoe_fwevt_handler()
1526 if (FW_WR_OP_G(be32_to_cpu(wr->hi)) in csio_fcoe_fwevt_handler()
1532 ntohl(rdev_wr->alloc_to_len16)); in csio_fcoe_fwevt_handler()
1534 ntohl(rdev_wr->flags_to_assoc_flowid)); in csio_fcoe_fwevt_handler()
1539 rdev_wr->event_cause, vnpi); in csio_fcoe_fwevt_handler()
1541 if (rdev_wr->protocol != PROT_FCOE) { in csio_fcoe_fwevt_handler()
1545 rdev_wr->protocol, in csio_fcoe_fwevt_handler()
1552 spin_lock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1563 &rdev_wr->u.fcoe_rdev); in csio_fcoe_fwevt_handler()
1573 ln->prev_evt = ln->cur_evt; in csio_fcoe_fwevt_handler()
1574 ln->cur_evt = rdev_wr->event_cause; in csio_fcoe_fwevt_handler()
1575 CSIO_INC_STATS(ln, n_evt_fw[rdev_wr->event_cause]); in csio_fcoe_fwevt_handler()
1578 evt = CSIO_FWE_TO_LNE(rdev_wr->event_cause); in csio_fcoe_fwevt_handler()
1583 rdev_wr->event_cause, rdev_flowid); in csio_fcoe_fwevt_handler()
1584 csio_post_event(&ln->sm, evt); in csio_fcoe_fwevt_handler()
1588 csio_rnode_fwevt_handler(rn, rdev_wr->event_cause); in csio_fcoe_fwevt_handler()
1590 spin_unlock_irq(&hw->lock); in csio_fcoe_fwevt_handler()
1593 csio_warn(hw, "unexpected WR op(0x%x) recv\n", in csio_fcoe_fwevt_handler()
1594 FW_WR_OP_G(be32_to_cpu((wr->hi)))); in csio_fcoe_fwevt_handler()
1598 wr = (struct fw_wr_hdr *) (cmd); in csio_fcoe_fwevt_handler()
1599 if (FW_WR_OP_G(be32_to_cpu(wr->hi)) == FW_FCOE_ELS_CT_WR) { in csio_fcoe_fwevt_handler()
1600 csio_ln_mgmt_wr_handler(hw, wr, in csio_fcoe_fwevt_handler()
1603 csio_warn(hw, "unexpected WR op(0x%x) recv\n", in csio_fcoe_fwevt_handler()
1604 FW_WR_OP_G(be32_to_cpu((wr->hi)))); in csio_fcoe_fwevt_handler()
1614 * csio_lnode_start - Kickstart lnode discovery.
1623 if (csio_is_phys_ln(ln) && !(ln->flags & CSIO_LNF_LINK_ENABLE)) { in csio_lnode_start()
1625 ln->flags |= CSIO_LNF_LINK_ENABLE; in csio_lnode_start()
1632 * csio_lnode_stop - Stop the lnode.
1642 if (csio_is_phys_ln(ln) && (ln->flags & CSIO_LNF_LINK_ENABLE)) { in csio_lnode_stop()
1644 ln->flags &= ~CSIO_LNF_LINK_ENABLE; in csio_lnode_stop()
1650 * csio_lnode_close - Close an lnode.
1662 ln->vnp_flowid = CSIO_INVALID_IDX; in csio_lnode_close()
1668 * csio_ln_prep_ecwr - Prepare ELS/CT WR.
1669 * @io_req - IO request.
1670 * @wr_len - WR len
1671 * @immd_len - WR immediate data
1672 * @sub_op - Sub opcode
1673 * @sid - source portid.
1674 * @did - destination portid
1675 * @flow_id - flowid
1676 * @fw_wr - ELS/CT WR to be prepared.
1677 * Returns: 0 - on success
1684 struct fw_fcoe_els_ct_wr *wr; in csio_ln_prep_ecwr() local
1687 wr = (struct fw_fcoe_els_ct_wr *)fw_wr; in csio_ln_prep_ecwr()
1688 wr->op_immdlen = cpu_to_be32(FW_WR_OP_V(FW_FCOE_ELS_CT_WR) | in csio_ln_prep_ecwr()
1692 wr->flowid_len16 = cpu_to_be32(FW_WR_FLOWID_V(flow_id) | in csio_ln_prep_ecwr()
1694 wr->els_ct_type = sub_op; in csio_ln_prep_ecwr()
1695 wr->ctl_pri = 0; in csio_ln_prep_ecwr()
1696 wr->cp_en_class = 0; in csio_ln_prep_ecwr()
1697 wr->cookie = io_req->fw_handle; in csio_ln_prep_ecwr()
1698 wr->iqid = cpu_to_be16(csio_q_physiqid( in csio_ln_prep_ecwr()
1699 io_req->lnode->hwp, io_req->iq_idx)); in csio_ln_prep_ecwr()
1700 wr->fl_to_sp = FW_FCOE_ELS_CT_WR_SP(1); in csio_ln_prep_ecwr()
1701 wr->tmo_val = (uint8_t) io_req->tmo; in csio_ln_prep_ecwr()
1703 memcpy(wr->l_id, PORT_ID_PTR(port_id), 3); in csio_ln_prep_ecwr()
1705 memcpy(wr->r_id, PORT_ID_PTR(port_id), 3); in csio_ln_prep_ecwr()
1708 wr->rsp_dmalen = cpu_to_be32(io_req->dma_buf.len); in csio_ln_prep_ecwr()
1709 wr->rsp_dmaaddr = cpu_to_be64(io_req->dma_buf.paddr); in csio_ln_prep_ecwr()
1714 * csio_ln_mgmt_submit_wr - Post elsct work request.
1715 * @mgmtm - mgmtm
1716 * @io_req - io request.
1717 * @sub_op - ELS or CT request type
1718 * @pld - Dma Payload buffer
1719 * @pld_len - Payload len
1721 * Returns: 0 - on success
1729 struct csio_lnode *ln = io_req->lnode; in csio_ln_mgmt_submit_wr()
1730 struct csio_rnode *rn = io_req->rnode; in csio_ln_mgmt_submit_wr()
1731 struct csio_hw *hw = mgmtm->hw; in csio_ln_mgmt_submit_wr()
1740 /* Calculate WR Size for this ELS REQ */ in csio_ln_mgmt_submit_wr()
1750 /* Roundup WR size in units of 16 bytes */ in csio_ln_mgmt_submit_wr()
1753 /* Get WR to send ELS REQ */ in csio_ln_mgmt_submit_wr()
1754 ret = csio_wr_get(hw, mgmtm->eq_idx, wr_size, &wrp); in csio_ln_mgmt_submit_wr()
1756 csio_err(hw, "Failed to get WR for ec_req %p ret:%d\n", in csio_ln_mgmt_submit_wr()
1761 /* Prepare Generic WR used by all ELS/CT cmd */ in csio_ln_mgmt_submit_wr()
1763 ln->nport_id, rn->nport_id, in csio_ln_mgmt_submit_wr()
1767 /* Copy ELS/CT WR CMD */ in csio_ln_mgmt_submit_wr()
1772 /* Copy payload to Immediate section of WR */ in csio_ln_mgmt_submit_wr()
1774 csio_wr_copy_to_wrp(pld->vaddr, &wrp, wr_off, im_len); in csio_ln_mgmt_submit_wr()
1780 dsgl.addr0 = cpu_to_be64(pld->paddr); in csio_ln_mgmt_submit_wr()
1786 csio_wr_issue(mgmtm->hw, mgmtm->eq_idx, false); in csio_ln_mgmt_submit_wr()
1791 * csio_ln_mgmt_submit_req - Submit FCOE Mgmt request.
1792 * @io_req - IO Request
1793 * @io_cbfn - Completion handler.
1794 * @req_type - ELS or CT request type
1795 * @pld - Dma Payload buffer
1796 * @pld_len - Payload len
1801 * Returns: 0 - on success
1802 * -ENOMEM - on error.
1810 struct csio_hw *hw = csio_lnode_to_hw(io_req->lnode); in csio_ln_mgmt_submit_req()
1814 BUG_ON(pld_len > pld->len); in csio_ln_mgmt_submit_req()
1816 io_req->io_cbfn = io_cbfn; /* Upper layer callback handler */ in csio_ln_mgmt_submit_req()
1817 io_req->fw_handle = (uintptr_t) (io_req); in csio_ln_mgmt_submit_req()
1818 io_req->eq_idx = mgmtm->eq_idx; in csio_ln_mgmt_submit_req()
1819 io_req->iq_idx = mgmtm->iq_idx; in csio_ln_mgmt_submit_req()
1823 list_add_tail(&io_req->sm.sm_list, &mgmtm->active_q); in csio_ln_mgmt_submit_req()
1824 mgmtm->stats.n_active++; in csio_ln_mgmt_submit_req()
1830 * csio_ln_fdmi_init - FDMI Init entry point.
1840 ln->mgmt_req = kzalloc(sizeof(struct csio_ioreq), GFP_KERNEL); in csio_ln_fdmi_init()
1841 if (!ln->mgmt_req) { in csio_ln_fdmi_init()
1844 return -ENOMEM; in csio_ln_fdmi_init()
1848 dma_buf = &ln->mgmt_req->dma_buf; in csio_ln_fdmi_init()
1849 dma_buf->len = 2048; in csio_ln_fdmi_init()
1850 dma_buf->vaddr = dma_alloc_coherent(&hw->pdev->dev, dma_buf->len, in csio_ln_fdmi_init()
1851 &dma_buf->paddr, GFP_KERNEL); in csio_ln_fdmi_init()
1852 if (!dma_buf->vaddr) { in csio_ln_fdmi_init()
1854 kfree(ln->mgmt_req); in csio_ln_fdmi_init()
1855 ln->mgmt_req = NULL; in csio_ln_fdmi_init()
1856 return -ENOMEM; in csio_ln_fdmi_init()
1859 ln->flags |= CSIO_LNF_FDMI_ENABLE; in csio_ln_fdmi_init()
1864 * csio_ln_fdmi_exit - FDMI exit entry point.
1873 if (!ln->mgmt_req) in csio_ln_fdmi_exit()
1876 dma_buf = &ln->mgmt_req->dma_buf; in csio_ln_fdmi_exit()
1877 if (dma_buf->vaddr) in csio_ln_fdmi_exit()
1878 dma_free_coherent(&hw->pdev->dev, dma_buf->len, dma_buf->vaddr, in csio_ln_fdmi_exit()
1879 dma_buf->paddr); in csio_ln_fdmi_exit()
1881 kfree(ln->mgmt_req); in csio_ln_fdmi_exit()
1895 if (!ln->tgt_scan_tick) in csio_scan_done()
1896 ln->tgt_scan_tick = ticks; in csio_scan_done()
1898 if (((ticks - ln->tgt_scan_tick) >= delta_scan_ticks)) { in csio_scan_done()
1899 if (!ln->last_scan_ntgts) in csio_scan_done()
1900 ln->last_scan_ntgts = ln->n_scsi_tgts; in csio_scan_done()
1902 if (ln->last_scan_ntgts == ln->n_scsi_tgts) in csio_scan_done()
1905 ln->last_scan_ntgts = ln->n_scsi_tgts; in csio_scan_done()
1907 ln->tgt_scan_tick = ticks; in csio_scan_done()
1931 list_for_each(tmp, &hw->sln_head) { in csio_notify_lnodes()
1973 list_for_each(tmp, &hw->sln_head) { in csio_disable_lnodes()
1975 if (ln->portid != portid) in csio_disable_lnodes()
1986 * csio_ln_init - Initialize an lnode.
1993 int rv = -EINVAL; in csio_ln_init()
1997 csio_init_state(&ln->sm, csio_lns_uninit); in csio_ln_init()
1998 ln->vnp_flowid = CSIO_INVALID_IDX; in csio_ln_init()
1999 ln->fcf_flowid = CSIO_INVALID_IDX; in csio_ln_init()
2005 ln->fcfinfo = kzalloc(sizeof(struct csio_fcf_info), GFP_KERNEL); in csio_ln_init()
2006 if (!ln->fcfinfo) { in csio_ln_init()
2012 INIT_LIST_HEAD(&ln->fcf_lsthead); in csio_ln_init()
2013 kref_init(&ln->fcfinfo->kref); in csio_ln_init()
2018 } else { /* Either a non-root physical or a virtual lnode */ in csio_ln_init()
2021 * THe rest is common for non-root physical and NPIV lnodes. in csio_ln_init()
2028 kref_get(&pln->fcfinfo->kref); in csio_ln_init()
2029 ln->fcfinfo = pln->fcfinfo; in csio_ln_init()
2031 /* Another non-root physical lnode (FCF) */ in csio_ln_init()
2032 ln->fcfinfo = kzalloc(sizeof(struct csio_fcf_info), in csio_ln_init()
2034 if (!ln->fcfinfo) { in csio_ln_init()
2040 kref_init(&ln->fcfinfo->kref); in csio_ln_init()
2061 kref_put(&pln->fcfinfo->kref, csio_free_fcfinfo); in csio_ln_exit()
2063 kref_put(&ln->fcfinfo->kref, csio_free_fcfinfo); in csio_ln_exit()
2067 ln->fcfinfo = NULL; in csio_ln_exit()
2071 * csio_lnode_init - Initialize the members of an lnode.
2078 int rv = -EINVAL; in csio_lnode_init()
2085 ln->pln = pln; in csio_lnode_init()
2087 ln->pln = NULL; in csio_lnode_init()
2090 ln->n_scsi_tgts = 0; in csio_lnode_init()
2091 ln->last_scan_ntgts = 0; in csio_lnode_init()
2092 ln->tgt_scan_tick = 0; in csio_lnode_init()
2095 INIT_LIST_HEAD(&ln->rnhead); in csio_lnode_init()
2096 INIT_LIST_HEAD(&ln->cln_head); in csio_lnode_init()
2099 ln->params.log_level = hw->params.log_level; in csio_lnode_init()
2105 spin_lock_irq(&hw->lock); in csio_lnode_init()
2106 list_add_tail(&ln->sm.sm_list, pln ? &pln->cln_head : &hw->sln_head); in csio_lnode_init()
2108 pln->num_vports++; in csio_lnode_init()
2109 spin_unlock_irq(&hw->lock); in csio_lnode_init()
2111 hw->num_lns++; in csio_lnode_init()
2120 * csio_lnode_exit - De-instantiate an lnode.
2131 /* Remove this lnode from hw->sln_head */ in csio_lnode_exit()
2132 spin_lock_irq(&hw->lock); in csio_lnode_exit()
2134 list_del_init(&ln->sm.sm_list); in csio_lnode_exit()
2139 if (ln->pln) in csio_lnode_exit()
2140 ln->pln->num_vports--; in csio_lnode_exit()
2143 if (list_empty(&hw->sln_head)) in csio_lnode_exit()
2144 hw->rln = NULL; in csio_lnode_exit()
2146 hw->rln = (struct csio_lnode *)csio_list_next(&hw->sln_head); in csio_lnode_exit()
2148 spin_unlock_irq(&hw->lock); in csio_lnode_exit()
2151 hw->num_lns--; in csio_lnode_exit()