Lines Matching full:sfp
3605 * SFP module specific
3609 static void bfa_sfp_getdata_send(struct bfa_sfp_s *sfp);
3610 static void bfa_sfp_media_get(struct bfa_sfp_s *sfp);
3611 static bfa_status_t bfa_sfp_speed_valid(struct bfa_sfp_s *sfp,
3615 bfa_cb_sfp_show(struct bfa_sfp_s *sfp) in bfa_cb_sfp_show() argument
3617 bfa_trc(sfp, sfp->lock); in bfa_cb_sfp_show()
3618 if (sfp->cbfn) in bfa_cb_sfp_show()
3619 sfp->cbfn(sfp->cbarg, sfp->status); in bfa_cb_sfp_show()
3620 sfp->lock = 0; in bfa_cb_sfp_show()
3621 sfp->cbfn = NULL; in bfa_cb_sfp_show()
3625 bfa_cb_sfp_state_query(struct bfa_sfp_s *sfp) in bfa_cb_sfp_state_query() argument
3627 bfa_trc(sfp, sfp->portspeed); in bfa_cb_sfp_state_query()
3628 if (sfp->media) { in bfa_cb_sfp_state_query()
3629 bfa_sfp_media_get(sfp); in bfa_cb_sfp_state_query()
3630 if (sfp->state_query_cbfn) in bfa_cb_sfp_state_query()
3631 sfp->state_query_cbfn(sfp->state_query_cbarg, in bfa_cb_sfp_state_query()
3632 sfp->status); in bfa_cb_sfp_state_query()
3633 sfp->media = NULL; in bfa_cb_sfp_state_query()
3636 if (sfp->portspeed) { in bfa_cb_sfp_state_query()
3637 sfp->status = bfa_sfp_speed_valid(sfp, sfp->portspeed); in bfa_cb_sfp_state_query()
3638 if (sfp->state_query_cbfn) in bfa_cb_sfp_state_query()
3639 sfp->state_query_cbfn(sfp->state_query_cbarg, in bfa_cb_sfp_state_query()
3640 sfp->status); in bfa_cb_sfp_state_query()
3641 sfp->portspeed = BFA_PORT_SPEED_UNKNOWN; in bfa_cb_sfp_state_query()
3644 sfp->state_query_lock = 0; in bfa_cb_sfp_state_query()
3645 sfp->state_query_cbfn = NULL; in bfa_cb_sfp_state_query()
3654 struct bfa_sfp_s *sfp = sfp_arg; in bfa_sfp_notify() local
3656 bfa_trc(sfp, event); in bfa_sfp_notify()
3657 bfa_trc(sfp, sfp->lock); in bfa_sfp_notify()
3658 bfa_trc(sfp, sfp->state_query_lock); in bfa_sfp_notify()
3663 if (sfp->lock) { in bfa_sfp_notify()
3664 sfp->status = BFA_STATUS_IOC_FAILURE; in bfa_sfp_notify()
3665 bfa_cb_sfp_show(sfp); in bfa_sfp_notify()
3668 if (sfp->state_query_lock) { in bfa_sfp_notify()
3669 sfp->status = BFA_STATUS_IOC_FAILURE; in bfa_sfp_notify()
3670 bfa_cb_sfp_state_query(sfp); in bfa_sfp_notify()
3680 * SFP's State Change Notification post to AEN
3683 bfa_sfp_scn_aen_post(struct bfa_sfp_s *sfp, struct bfi_sfp_scn_s *rsp) in bfa_sfp_scn_aen_post() argument
3685 struct bfad_s *bfad = (struct bfad_s *)sfp->ioc->bfa->bfad; in bfa_sfp_scn_aen_post()
3689 bfa_trc(sfp, (((u64)rsp->pomlvl) << 16) | (((u64)rsp->sfpid) << 8) | in bfa_sfp_scn_aen_post()
3696 aen_entry->aen_data.port.ioc_type = bfa_ioc_get_type(sfp->ioc); in bfa_sfp_scn_aen_post()
3697 aen_entry->aen_data.port.pwwn = sfp->ioc->attr->pwwn; in bfa_sfp_scn_aen_post()
3698 aen_entry->aen_data.port.mac = bfa_ioc_get_mac(sfp->ioc); in bfa_sfp_scn_aen_post()
3718 bfa_trc(sfp, rsp->event); in bfa_sfp_scn_aen_post()
3723 bfad_im_post_vendor_event(aen_entry, bfad, ++sfp->ioc->ioc_aen_seq, in bfa_sfp_scn_aen_post()
3728 * SFP get data send
3731 bfa_sfp_getdata_send(struct bfa_sfp_s *sfp) in bfa_sfp_getdata_send() argument
3733 struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; in bfa_sfp_getdata_send()
3735 bfa_trc(sfp, req->memtype); in bfa_sfp_getdata_send()
3739 bfa_ioc_portid(sfp->ioc)); in bfa_sfp_getdata_send()
3742 bfa_ioc_mbox_queue(sfp->ioc, &sfp->mbcmd); in bfa_sfp_getdata_send()
3746 * SFP is valid, read sfp data
3749 bfa_sfp_getdata(struct bfa_sfp_s *sfp, enum bfi_sfp_mem_e memtype) in bfa_sfp_getdata() argument
3751 struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; in bfa_sfp_getdata()
3753 WARN_ON(sfp->lock != 0); in bfa_sfp_getdata()
3754 bfa_trc(sfp, sfp->state); in bfa_sfp_getdata()
3756 sfp->lock = 1; in bfa_sfp_getdata()
3757 sfp->memtype = memtype; in bfa_sfp_getdata()
3761 bfa_alen_set(&req->alen, sizeof(struct sfp_mem_s), sfp->dbuf_pa); in bfa_sfp_getdata()
3763 bfa_sfp_getdata_send(sfp); in bfa_sfp_getdata()
3767 * SFP scn handler
3770 bfa_sfp_scn(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg) in bfa_sfp_scn() argument
3776 sfp->state = BFA_SFP_STATE_INSERTED; in bfa_sfp_scn()
3777 sfp->data_valid = 0; in bfa_sfp_scn()
3778 bfa_sfp_scn_aen_post(sfp, rsp); in bfa_sfp_scn()
3781 sfp->state = BFA_SFP_STATE_REMOVED; in bfa_sfp_scn()
3782 sfp->data_valid = 0; in bfa_sfp_scn()
3783 bfa_sfp_scn_aen_post(sfp, rsp); in bfa_sfp_scn()
3786 sfp->state = BFA_SFP_STATE_FAILED; in bfa_sfp_scn()
3787 sfp->data_valid = 0; in bfa_sfp_scn()
3788 bfa_sfp_scn_aen_post(sfp, rsp); in bfa_sfp_scn()
3791 sfp->state = BFA_SFP_STATE_UNSUPPORT; in bfa_sfp_scn()
3792 bfa_sfp_scn_aen_post(sfp, rsp); in bfa_sfp_scn()
3793 if (!sfp->lock) in bfa_sfp_scn()
3794 bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); in bfa_sfp_scn()
3797 bfa_sfp_scn_aen_post(sfp, rsp); in bfa_sfp_scn()
3800 sfp->state = BFA_SFP_STATE_VALID; in bfa_sfp_scn()
3801 if (!sfp->lock) in bfa_sfp_scn()
3802 bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); in bfa_sfp_scn()
3805 bfa_trc(sfp, rsp->event); in bfa_sfp_scn()
3811 * SFP show complete
3814 bfa_sfp_show_comp(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg) in bfa_sfp_show_comp() argument
3818 if (!sfp->lock) { in bfa_sfp_show_comp()
3822 bfa_trc(sfp, sfp->lock); in bfa_sfp_show_comp()
3826 bfa_trc(sfp, rsp->status); in bfa_sfp_show_comp()
3828 sfp->data_valid = 1; in bfa_sfp_show_comp()
3829 if (sfp->state == BFA_SFP_STATE_VALID) in bfa_sfp_show_comp()
3830 sfp->status = BFA_STATUS_OK; in bfa_sfp_show_comp()
3831 else if (sfp->state == BFA_SFP_STATE_UNSUPPORT) in bfa_sfp_show_comp()
3832 sfp->status = BFA_STATUS_SFP_UNSUPP; in bfa_sfp_show_comp()
3834 bfa_trc(sfp, sfp->state); in bfa_sfp_show_comp()
3836 sfp->data_valid = 0; in bfa_sfp_show_comp()
3837 sfp->status = rsp->status; in bfa_sfp_show_comp()
3838 /* sfpshow shouldn't change sfp state */ in bfa_sfp_show_comp()
3841 bfa_trc(sfp, sfp->memtype); in bfa_sfp_show_comp()
3842 if (sfp->memtype == BFI_SFP_MEM_DIAGEXT) { in bfa_sfp_show_comp()
3843 bfa_trc(sfp, sfp->data_valid); in bfa_sfp_show_comp()
3844 if (sfp->data_valid) { in bfa_sfp_show_comp()
3846 u8 *des = (u8 *)(sfp->sfpmem); in bfa_sfp_show_comp()
3847 memcpy(des, sfp->dbuf_kva, size); in bfa_sfp_show_comp()
3852 bfa_cb_sfp_show(sfp); in bfa_sfp_show_comp()
3854 sfp->lock = 0; in bfa_sfp_show_comp()
3856 bfa_trc(sfp, sfp->state_query_lock); in bfa_sfp_show_comp()
3857 if (sfp->state_query_lock) { in bfa_sfp_show_comp()
3858 sfp->state = rsp->state; in bfa_sfp_show_comp()
3860 bfa_cb_sfp_state_query(sfp); in bfa_sfp_show_comp()
3865 * SFP query fw sfp state
3868 bfa_sfp_state_query(struct bfa_sfp_s *sfp) in bfa_sfp_state_query() argument
3870 struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg; in bfa_sfp_state_query()
3873 WARN_ON(sfp->state != BFA_SFP_STATE_INIT); in bfa_sfp_state_query()
3874 WARN_ON(sfp->state_query_lock != 0); in bfa_sfp_state_query()
3875 bfa_trc(sfp, sfp->state); in bfa_sfp_state_query()
3877 sfp->state_query_lock = 1; in bfa_sfp_state_query()
3880 if (!sfp->lock) in bfa_sfp_state_query()
3881 bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL); in bfa_sfp_state_query()
3885 bfa_sfp_media_get(struct bfa_sfp_s *sfp) in bfa_sfp_media_get() argument
3887 enum bfa_defs_sfp_media_e *media = sfp->media; in bfa_sfp_media_get()
3891 if (sfp->state == BFA_SFP_STATE_UNSUPPORT) in bfa_sfp_media_get()
3893 else if (sfp->state == BFA_SFP_STATE_VALID) { in bfa_sfp_media_get()
3895 struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva; in bfa_sfp_media_get()
3900 bfa_trc(sfp, e10g.b); in bfa_sfp_media_get()
3901 bfa_trc(sfp, xmtr_tech); in bfa_sfp_media_get()
3925 bfa_trc(sfp, 0); in bfa_sfp_media_get()
3927 bfa_trc(sfp, sfp->state); in bfa_sfp_media_get()
3931 bfa_sfp_speed_valid(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed) in bfa_sfp_speed_valid() argument
3933 struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva; in bfa_sfp_speed_valid()
3942 bfa_trc(sfp, e10g.b); in bfa_sfp_speed_valid()
3953 bfa_trc(sfp, portspeed); in bfa_sfp_speed_valid()
3954 bfa_trc(sfp, fc3.b); in bfa_sfp_speed_valid()
3955 bfa_trc(sfp, e10g.b); in bfa_sfp_speed_valid()
3961 * SFP hmbox handler
3966 struct bfa_sfp_s *sfp = sfparg; in bfa_sfp_intr() local
3970 bfa_sfp_show_comp(sfp, msg); in bfa_sfp_intr()
3974 bfa_sfp_scn(sfp, msg); in bfa_sfp_intr()
3978 bfa_trc(sfp, msg->mh.msg_id); in bfa_sfp_intr()
3984 * Return DMA memory needed by sfp module.
3993 * Attach virtual and physical memory for SFP.
3996 bfa_sfp_attach(struct bfa_sfp_s *sfp, struct bfa_ioc_s *ioc, void *dev, in bfa_sfp_attach() argument
3999 sfp->dev = dev; in bfa_sfp_attach()
4000 sfp->ioc = ioc; in bfa_sfp_attach()
4001 sfp->trcmod = trcmod; in bfa_sfp_attach()
4003 sfp->cbfn = NULL; in bfa_sfp_attach()
4004 sfp->cbarg = NULL; in bfa_sfp_attach()
4005 sfp->sfpmem = NULL; in bfa_sfp_attach()
4006 sfp->lock = 0; in bfa_sfp_attach()
4007 sfp->data_valid = 0; in bfa_sfp_attach()
4008 sfp->state = BFA_SFP_STATE_INIT; in bfa_sfp_attach()
4009 sfp->state_query_lock = 0; in bfa_sfp_attach()
4010 sfp->state_query_cbfn = NULL; in bfa_sfp_attach()
4011 sfp->state_query_cbarg = NULL; in bfa_sfp_attach()
4012 sfp->media = NULL; in bfa_sfp_attach()
4013 sfp->portspeed = BFA_PORT_SPEED_UNKNOWN; in bfa_sfp_attach()
4014 sfp->is_elb = BFA_FALSE; in bfa_sfp_attach()
4016 bfa_ioc_mbox_regisr(sfp->ioc, BFI_MC_SFP, bfa_sfp_intr, sfp); in bfa_sfp_attach()
4017 bfa_q_qe_init(&sfp->ioc_notify); in bfa_sfp_attach()
4018 bfa_ioc_notify_init(&sfp->ioc_notify, bfa_sfp_notify, sfp); in bfa_sfp_attach()
4019 list_add_tail(&sfp->ioc_notify.qe, &sfp->ioc->notify_q); in bfa_sfp_attach()
4023 * Claim Memory for SFP
4026 bfa_sfp_memclaim(struct bfa_sfp_s *sfp, u8 *dm_kva, u64 dm_pa) in bfa_sfp_memclaim() argument
4028 sfp->dbuf_kva = dm_kva; in bfa_sfp_memclaim()
4029 sfp->dbuf_pa = dm_pa; in bfa_sfp_memclaim()
4030 memset(sfp->dbuf_kva, 0, sizeof(struct sfp_mem_s)); in bfa_sfp_memclaim()
4037 * Show SFP eeprom content
4039 * @param[in] sfp - bfa sfp module
4041 * @param[out] sfpmem - sfp eeprom data
4045 bfa_sfp_show(struct bfa_sfp_s *sfp, struct sfp_mem_s *sfpmem, in bfa_sfp_show() argument
4049 if (!bfa_ioc_is_operational(sfp->ioc)) { in bfa_sfp_show()
4050 bfa_trc(sfp, 0); in bfa_sfp_show()
4054 if (sfp->lock) { in bfa_sfp_show()
4055 bfa_trc(sfp, 0); in bfa_sfp_show()
4059 sfp->cbfn = cbfn; in bfa_sfp_show()
4060 sfp->cbarg = cbarg; in bfa_sfp_show()
4061 sfp->sfpmem = sfpmem; in bfa_sfp_show()
4063 bfa_sfp_getdata(sfp, BFI_SFP_MEM_DIAGEXT); in bfa_sfp_show()
4068 * Return SFP Media type
4070 * @param[in] sfp - bfa sfp module
4076 bfa_sfp_media(struct bfa_sfp_s *sfp, enum bfa_defs_sfp_media_e *media, in bfa_sfp_media() argument
4079 if (!bfa_ioc_is_operational(sfp->ioc)) { in bfa_sfp_media()
4080 bfa_trc(sfp, 0); in bfa_sfp_media()
4084 sfp->media = media; in bfa_sfp_media()
4085 if (sfp->state == BFA_SFP_STATE_INIT) { in bfa_sfp_media()
4086 if (sfp->state_query_lock) { in bfa_sfp_media()
4087 bfa_trc(sfp, 0); in bfa_sfp_media()
4090 sfp->state_query_cbfn = cbfn; in bfa_sfp_media()
4091 sfp->state_query_cbarg = cbarg; in bfa_sfp_media()
4092 bfa_sfp_state_query(sfp); in bfa_sfp_media()
4097 bfa_sfp_media_get(sfp); in bfa_sfp_media()
4102 * Check if user set port speed is allowed by the SFP
4104 * @param[in] sfp - bfa sfp module
4109 bfa_sfp_speed(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed, in bfa_sfp_speed() argument
4114 if (!bfa_ioc_is_operational(sfp->ioc)) in bfa_sfp_speed()
4118 if (bfa_mfg_is_mezz(sfp->ioc->attr->card_type)) in bfa_sfp_speed()
4121 /* Check SFP state */ in bfa_sfp_speed()
4122 sfp->portspeed = portspeed; in bfa_sfp_speed()
4123 if (sfp->state == BFA_SFP_STATE_INIT) { in bfa_sfp_speed()
4124 if (sfp->state_query_lock) { in bfa_sfp_speed()
4125 bfa_trc(sfp, 0); in bfa_sfp_speed()
4128 sfp->state_query_cbfn = cbfn; in bfa_sfp_speed()
4129 sfp->state_query_cbarg = cbarg; in bfa_sfp_speed()
4130 bfa_sfp_state_query(sfp); in bfa_sfp_speed()
4135 if (sfp->state == BFA_SFP_STATE_REMOVED || in bfa_sfp_speed()
4136 sfp->state == BFA_SFP_STATE_FAILED) { in bfa_sfp_speed()
4137 bfa_trc(sfp, sfp->state); in bfa_sfp_speed()
4141 if (sfp->state == BFA_SFP_STATE_INSERTED) { in bfa_sfp_speed()
4142 bfa_trc(sfp, sfp->state); in bfa_sfp_speed()
4143 return BFA_STATUS_DEVBUSY; /* sfp is reading data */ in bfa_sfp_speed()
4147 if (sfp->is_elb) in bfa_sfp_speed()
4150 return bfa_sfp_speed_valid(sfp, portspeed); in bfa_sfp_speed()