Lines Matching full:trans

166 	wq = create_singlethread_workqueue("bc-trans");  in qlcnic_sriov_init()
170 "Cannot create bc-trans workqueue\n"); in qlcnic_sriov_init()
241 struct qlcnic_bc_trans *trans; in qlcnic_sriov_cleanup_list() local
248 trans = list_first_entry(&t_list->wait_list, in qlcnic_sriov_cleanup_list()
250 list_del(&trans->list); in qlcnic_sriov_cleanup_list()
252 cmd.req.arg = (u32 *)trans->req_pay; in qlcnic_sriov_cleanup_list()
253 cmd.rsp.arg = (u32 *)trans->rsp_pay; in qlcnic_sriov_cleanup_list()
255 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_cleanup_list()
700 static inline int qlcnic_sriov_alloc_bc_trans(struct qlcnic_bc_trans **trans) in qlcnic_sriov_alloc_bc_trans() argument
702 *trans = kzalloc(sizeof(struct qlcnic_bc_trans), GFP_ATOMIC); in qlcnic_sriov_alloc_bc_trans()
703 if (!*trans) in qlcnic_sriov_alloc_bc_trans()
706 init_completion(&(*trans)->resp_cmpl); in qlcnic_sriov_alloc_bc_trans()
753 static int qlcnic_sriov_prepare_bc_hdr(struct qlcnic_bc_trans *trans, in qlcnic_sriov_prepare_bc_hdr() argument
765 trans->req_pay = (struct qlcnic_bc_payload *)cmd->req.arg; in qlcnic_sriov_prepare_bc_hdr()
766 trans->rsp_pay = (struct qlcnic_bc_payload *)cmd->rsp.arg; in qlcnic_sriov_prepare_bc_hdr()
768 trans->req_pay_size = (num_regs * 4); in qlcnic_sriov_prepare_bc_hdr()
770 trans->rsp_pay_size = (num_regs * 4); in qlcnic_sriov_prepare_bc_hdr()
772 remainder = (trans->req_pay_size) % (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
773 num_frags = (trans->req_pay_size) / (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
777 if (qlcnic_sriov_alloc_bc_msg(&trans->req_hdr, num_frags)) in qlcnic_sriov_prepare_bc_hdr()
779 remainder = (trans->rsp_pay_size) % (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
780 num_frags = (trans->rsp_pay_size) / (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
783 if (qlcnic_sriov_alloc_bc_msg(&trans->rsp_hdr, num_frags)) in qlcnic_sriov_prepare_bc_hdr()
786 hdr = trans->req_hdr; in qlcnic_sriov_prepare_bc_hdr()
788 cmd->req.arg = (u32 *)trans->req_pay; in qlcnic_sriov_prepare_bc_hdr()
789 cmd->rsp.arg = (u32 *)trans->rsp_pay; in qlcnic_sriov_prepare_bc_hdr()
792 remainder = (trans->rsp_pay_size) % (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
793 num_frags = (trans->rsp_pay_size) / (bc_pay_sz); in qlcnic_sriov_prepare_bc_hdr()
796 cmd->req.num = trans->req_pay_size / 4; in qlcnic_sriov_prepare_bc_hdr()
797 cmd->rsp.num = trans->rsp_pay_size / 4; in qlcnic_sriov_prepare_bc_hdr()
798 hdr = trans->rsp_hdr; in qlcnic_sriov_prepare_bc_hdr()
799 cmd->op_type = trans->req_hdr->op_type; in qlcnic_sriov_prepare_bc_hdr()
802 trans->trans_id = seq; in qlcnic_sriov_prepare_bc_hdr()
803 trans->cmd_id = cmd_op; in qlcnic_sriov_prepare_bc_hdr()
817 static void qlcnic_sriov_cleanup_transaction(struct qlcnic_bc_trans *trans) in qlcnic_sriov_cleanup_transaction() argument
819 if (!trans) in qlcnic_sriov_cleanup_transaction()
821 kfree(trans->req_hdr); in qlcnic_sriov_cleanup_transaction()
822 kfree(trans->rsp_hdr); in qlcnic_sriov_cleanup_transaction()
823 kfree(trans); in qlcnic_sriov_cleanup_transaction()
827 struct qlcnic_bc_trans *trans, u8 type) in qlcnic_sriov_clear_trans() argument
837 list_del(&trans->list); in qlcnic_sriov_clear_trans()
862 static inline void qlcnic_sriov_wait_for_resp(struct qlcnic_bc_trans *trans) in qlcnic_sriov_wait_for_resp() argument
864 struct completion *cmpl = &trans->resp_cmpl; in qlcnic_sriov_wait_for_resp()
867 trans->trans_state = QLC_END; in qlcnic_sriov_wait_for_resp()
869 trans->trans_state = QLC_ABORT; in qlcnic_sriov_wait_for_resp()
874 static void qlcnic_sriov_handle_multi_frags(struct qlcnic_bc_trans *trans, in qlcnic_sriov_handle_multi_frags() argument
878 trans->curr_rsp_frag++; in qlcnic_sriov_handle_multi_frags()
879 if (trans->curr_rsp_frag < trans->rsp_hdr->num_frags) in qlcnic_sriov_handle_multi_frags()
880 trans->trans_state = QLC_INIT; in qlcnic_sriov_handle_multi_frags()
882 trans->trans_state = QLC_END; in qlcnic_sriov_handle_multi_frags()
884 trans->curr_req_frag++; in qlcnic_sriov_handle_multi_frags()
885 if (trans->curr_req_frag < trans->req_hdr->num_frags) in qlcnic_sriov_handle_multi_frags()
886 trans->trans_state = QLC_INIT; in qlcnic_sriov_handle_multi_frags()
888 trans->trans_state = QLC_WAIT_FOR_RESP; in qlcnic_sriov_handle_multi_frags()
892 static void qlcnic_sriov_wait_for_channel_free(struct qlcnic_bc_trans *trans, in qlcnic_sriov_wait_for_channel_free() argument
895 struct qlcnic_vf_info *vf = trans->vf; in qlcnic_sriov_wait_for_channel_free()
899 trans->trans_state = QLC_ABORT; in qlcnic_sriov_wait_for_channel_free()
904 qlcnic_sriov_handle_multi_frags(trans, type); in qlcnic_sriov_wait_for_channel_free()
938 static int qlcnic_sriov_issue_bc_post(struct qlcnic_bc_trans *trans, u8 type) in qlcnic_sriov_issue_bc_post() argument
940 struct qlcnic_vf_info *vf = trans->vf; in qlcnic_sriov_issue_bc_post()
944 u8 pci_func = trans->func_id; in qlcnic_sriov_issue_bc_post()
950 hdr = (u32 *)(trans->req_hdr + trans->curr_req_frag); in qlcnic_sriov_issue_bc_post()
951 pay = (u32 *)(trans->req_pay + trans->curr_req_frag); in qlcnic_sriov_issue_bc_post()
952 pay_size = qlcnic_sriov_get_bc_paysize(trans->req_pay_size, in qlcnic_sriov_issue_bc_post()
953 trans->curr_req_frag); in qlcnic_sriov_issue_bc_post()
956 hdr = (u32 *)(trans->rsp_hdr + trans->curr_rsp_frag); in qlcnic_sriov_issue_bc_post()
957 pay = (u32 *)(trans->rsp_pay + trans->curr_rsp_frag); in qlcnic_sriov_issue_bc_post()
958 pay_size = qlcnic_sriov_get_bc_paysize(trans->rsp_pay_size, in qlcnic_sriov_issue_bc_post()
959 trans->curr_rsp_frag); in qlcnic_sriov_issue_bc_post()
968 static int __qlcnic_sriov_send_bc_msg(struct qlcnic_bc_trans *trans, in __qlcnic_sriov_send_bc_msg() argument
977 trans->trans_state = QLC_ABORT; in __qlcnic_sriov_send_bc_msg()
979 switch (trans->trans_state) { in __qlcnic_sriov_send_bc_msg()
981 trans->trans_state = QLC_WAIT_FOR_CHANNEL_FREE; in __qlcnic_sriov_send_bc_msg()
982 if (qlcnic_sriov_issue_bc_post(trans, type)) in __qlcnic_sriov_send_bc_msg()
983 trans->trans_state = QLC_ABORT; in __qlcnic_sriov_send_bc_msg()
986 qlcnic_sriov_wait_for_channel_free(trans, type); in __qlcnic_sriov_send_bc_msg()
989 qlcnic_sriov_wait_for_resp(trans); in __qlcnic_sriov_send_bc_msg()
1009 struct qlcnic_bc_trans *trans, int pci_func) in qlcnic_sriov_send_bc_cmd() argument
1018 trans->vf = vf; in qlcnic_sriov_send_bc_cmd()
1019 trans->func_id = pci_func; in qlcnic_sriov_send_bc_cmd()
1025 trans->cmd_id != QLCNIC_BC_CMD_CHANNEL_INIT) in qlcnic_sriov_send_bc_cmd()
1030 vf->send_cmd = trans; in qlcnic_sriov_send_bc_cmd()
1031 err = __qlcnic_sriov_send_bc_msg(trans, vf, QLC_BC_COMMAND); in qlcnic_sriov_send_bc_cmd()
1032 qlcnic_sriov_clear_trans(vf, trans, QLC_BC_COMMAND); in qlcnic_sriov_send_bc_cmd()
1038 struct qlcnic_bc_trans *trans, in __qlcnic_sriov_process_bc_cmd() argument
1043 qlcnic_sriov_pf_process_bc_cmd(adapter, trans, cmd); in __qlcnic_sriov_process_bc_cmd()
1055 struct qlcnic_bc_trans *trans = NULL; in qlcnic_sriov_process_bc_cmd() local
1067 trans = list_first_entry(&vf->rcv_act.wait_list, in qlcnic_sriov_process_bc_cmd()
1071 if (qlcnic_sriov_prepare_bc_hdr(trans, &cmd, trans->req_hdr->seq_id, in qlcnic_sriov_process_bc_cmd()
1075 __qlcnic_sriov_process_bc_cmd(adapter, trans, &cmd); in qlcnic_sriov_process_bc_cmd()
1076 trans->trans_state = QLC_INIT; in qlcnic_sriov_process_bc_cmd()
1077 __qlcnic_sriov_send_bc_msg(trans, vf, QLC_BC_RESPONSE); in qlcnic_sriov_process_bc_cmd()
1081 req = qlcnic_sriov_clear_trans(vf, trans, QLC_BC_RESPONSE); in qlcnic_sriov_process_bc_cmd()
1082 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_process_bc_cmd()
1091 struct qlcnic_bc_trans *trans; in qlcnic_sriov_handle_bc_resp() local
1097 trans = vf->send_cmd; in qlcnic_sriov_handle_bc_resp()
1099 if (trans == NULL) in qlcnic_sriov_handle_bc_resp()
1102 if (trans->trans_id != hdr->seq_id) in qlcnic_sriov_handle_bc_resp()
1105 pay_size = qlcnic_sriov_get_bc_paysize(trans->rsp_pay_size, in qlcnic_sriov_handle_bc_resp()
1106 trans->curr_rsp_frag); in qlcnic_sriov_handle_bc_resp()
1108 (u32 *)(trans->rsp_hdr + trans->curr_rsp_frag), in qlcnic_sriov_handle_bc_resp()
1109 (u32 *)(trans->rsp_pay + trans->curr_rsp_frag), in qlcnic_sriov_handle_bc_resp()
1111 if (++trans->curr_rsp_frag < trans->rsp_hdr->num_frags) in qlcnic_sriov_handle_bc_resp()
1114 complete(&trans->resp_cmpl); in qlcnic_sriov_handle_bc_resp()
1122 struct qlcnic_bc_trans *trans) in __qlcnic_sriov_add_act_list() argument
1127 list_add_tail(&trans->list, &t_list->wait_list); in __qlcnic_sriov_add_act_list()
1136 struct qlcnic_bc_trans *trans) in qlcnic_sriov_add_act_list() argument
1142 __qlcnic_sriov_add_act_list(sriov, vf, trans); in qlcnic_sriov_add_act_list()
1152 struct qlcnic_bc_trans *trans = NULL; in qlcnic_sriov_handle_pending_trans() local
1160 trans = list_entry(node, struct qlcnic_bc_trans, list); in qlcnic_sriov_handle_pending_trans()
1161 if (trans->trans_id == hdr->seq_id) { in qlcnic_sriov_handle_pending_trans()
1169 curr_frag = trans->curr_req_frag; in qlcnic_sriov_handle_pending_trans()
1170 pay_size = qlcnic_sriov_get_bc_paysize(trans->req_pay_size, in qlcnic_sriov_handle_pending_trans()
1173 (u32 *)(trans->req_hdr + curr_frag), in qlcnic_sriov_handle_pending_trans()
1174 (u32 *)(trans->req_pay + curr_frag), in qlcnic_sriov_handle_pending_trans()
1176 trans->curr_req_frag++; in qlcnic_sriov_handle_pending_trans()
1177 if (trans->curr_req_frag >= hdr->num_frags) { in qlcnic_sriov_handle_pending_trans()
1179 list_del(&trans->list); in qlcnic_sriov_handle_pending_trans()
1186 if (qlcnic_sriov_add_act_list(sriov, vf, trans)) in qlcnic_sriov_handle_pending_trans()
1187 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_handle_pending_trans()
1196 struct qlcnic_bc_trans *trans; in qlcnic_sriov_handle_bc_cmd() local
1218 if (qlcnic_sriov_alloc_bc_trans(&trans)) in qlcnic_sriov_handle_bc_cmd()
1227 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_handle_bc_cmd()
1232 if (qlcnic_sriov_prepare_bc_hdr(trans, &cmd, hdr->seq_id, in qlcnic_sriov_handle_bc_cmd()
1235 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_handle_bc_cmd()
1239 pay_size = qlcnic_sriov_get_bc_paysize(trans->req_pay_size, in qlcnic_sriov_handle_bc_cmd()
1240 trans->curr_req_frag); in qlcnic_sriov_handle_bc_cmd()
1242 (u32 *)(trans->req_hdr + trans->curr_req_frag), in qlcnic_sriov_handle_bc_cmd()
1243 (u32 *)(trans->req_pay + trans->curr_req_frag), in qlcnic_sriov_handle_bc_cmd()
1245 trans->func_id = vf->pci_func; in qlcnic_sriov_handle_bc_cmd()
1246 trans->vf = vf; in qlcnic_sriov_handle_bc_cmd()
1247 trans->trans_id = hdr->seq_id; in qlcnic_sriov_handle_bc_cmd()
1248 trans->curr_req_frag++; in qlcnic_sriov_handle_bc_cmd()
1250 if (qlcnic_sriov_soft_flr_check(adapter, trans, vf)) in qlcnic_sriov_handle_bc_cmd()
1253 if (trans->curr_req_frag == trans->req_hdr->num_frags) { in qlcnic_sriov_handle_bc_cmd()
1254 if (qlcnic_sriov_add_act_list(sriov, vf, trans)) { in qlcnic_sriov_handle_bc_cmd()
1256 qlcnic_sriov_cleanup_transaction(trans); in qlcnic_sriov_handle_bc_cmd()
1260 list_add_tail(&trans->list, &vf->rcv_pend.wait_list); in qlcnic_sriov_handle_bc_cmd()
1355 struct qlcnic_bc_trans *trans) in qlcnic_sriov_retry_bc_cmd() argument
1363 clear_bit(QLC_BC_VF_CHANNEL, &trans->vf->state); in qlcnic_sriov_retry_bc_cmd()
1364 trans->trans_state = QLC_INIT; in qlcnic_sriov_retry_bc_cmd()
1380 struct qlcnic_bc_trans *trans; in __qlcnic_sriov_issue_cmd() local
1386 rsp = qlcnic_sriov_alloc_bc_trans(&trans); in __qlcnic_sriov_issue_cmd()
1390 rsp = qlcnic_sriov_prepare_bc_hdr(trans, cmd, seq, QLC_BC_COMMAND); in __qlcnic_sriov_issue_cmd()
1402 err = qlcnic_sriov_send_bc_cmd(adapter, trans, func); in __qlcnic_sriov_issue_cmd()
1411 if ((trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT) && in __qlcnic_sriov_issue_cmd()
1412 !qlcnic_sriov_retry_bc_cmd(adapter, trans)) in __qlcnic_sriov_issue_cmd()
1447 qlcnic_sriov_cleanup_transaction(trans); in __qlcnic_sriov_issue_cmd()