Lines Matching +full:my +full:- +full:dma +full:- +full:window
1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
8 * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
47 static uint partition_number = -1;
61 u32 residual_count = se_cmd->residual_count; in ibmvscsis_determine_resid()
66 if (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { in ibmvscsis_determine_resid()
67 if (se_cmd->data_direction == DMA_TO_DEVICE) { in ibmvscsis_determine_resid()
69 rsp->flags = SRP_RSP_FLAG_DOUNDER; in ibmvscsis_determine_resid()
70 rsp->data_out_res_cnt = cpu_to_be32(residual_count); in ibmvscsis_determine_resid()
71 } else if (se_cmd->data_direction == DMA_FROM_DEVICE) { in ibmvscsis_determine_resid()
73 rsp->flags = SRP_RSP_FLAG_DIUNDER; in ibmvscsis_determine_resid()
74 rsp->data_in_res_cnt = cpu_to_be32(residual_count); in ibmvscsis_determine_resid()
76 } else if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) { in ibmvscsis_determine_resid()
77 if (se_cmd->data_direction == DMA_TO_DEVICE) { in ibmvscsis_determine_resid()
79 rsp->flags = SRP_RSP_FLAG_DOOVER; in ibmvscsis_determine_resid()
80 rsp->data_out_res_cnt = cpu_to_be32(residual_count); in ibmvscsis_determine_resid()
81 } else if (se_cmd->data_direction == DMA_FROM_DEVICE) { in ibmvscsis_determine_resid()
83 rsp->flags = SRP_RSP_FLAG_DIOVER; in ibmvscsis_determine_resid()
84 rsp->data_in_res_cnt = cpu_to_be32(residual_count); in ibmvscsis_determine_resid()
90 * connection_broken() - Determine if the connection to the client is good
109 crq->valid = VALID_CMD_RESP_EL; in connection_broken()
110 crq->format = MESSAGE_IN_CRQ; in connection_broken()
111 crq->status = PING; in connection_broken()
113 h_return_code = h_send_crq(vscsi->dds.unit_id, in connection_broken()
117 dev_dbg(&vscsi->dev, "Connection_broken: rc %ld\n", h_return_code); in connection_broken()
126 * ibmvscsis_unregister_command_q() - Helper Function-Unregister Command Queue
147 qrc = h_free_crq(vscsi->dds.unit_id); in ibmvscsis_unregister_command_q()
150 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_unregister_command_q()
151 vscsi->flags &= ~PREP_FOR_SUSPEND_FLAGS; in ibmvscsis_unregister_command_q()
152 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_unregister_command_q()
157 dev_err(&vscsi->dev, "unregister_command_q: error from h_free_crq %ld\n", in ibmvscsis_unregister_command_q()
189 dev_err(&vscsi->dev, "unregister_command_q: unknown error %ld from h_free_crq\n", in ibmvscsis_unregister_command_q()
201 dev_err(&vscsi->dev, "Excessive wait for h_free_crq\n"); in ibmvscsis_unregister_command_q()
205 dev_dbg(&vscsi->dev, "Freeing CRQ: phyp rc %ld, rc %ld\n", qrc, rc); in ibmvscsis_unregister_command_q()
211 * ibmvscsis_delete_client_info() - Helper function to Delete Client Info
223 vscsi->client_cap = 0; in ibmvscsis_delete_client_info()
231 vscsi->client_data.os_type = 0; in ibmvscsis_delete_client_info()
235 * ibmvscsis_free_command_q() - Free Command Queue
260 if (!(vscsi->flags & CRQ_CLOSED)) { in ibmvscsis_free_command_q()
261 vio_disable_interrupts(vscsi->dma_dev); in ibmvscsis_free_command_q()
263 state_under_lock = vscsi->new_state; in ibmvscsis_free_command_q()
264 flags_under_lock = vscsi->flags; in ibmvscsis_free_command_q()
265 vscsi->phyp_acr_state = 0; in ibmvscsis_free_command_q()
266 vscsi->phyp_acr_flags = 0; in ibmvscsis_free_command_q()
268 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_free_command_q()
270 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_free_command_q()
272 if (state_under_lock != vscsi->new_state) in ibmvscsis_free_command_q()
273 vscsi->phyp_acr_state = vscsi->new_state; in ibmvscsis_free_command_q()
275 vscsi->phyp_acr_flags = ((~flags_under_lock) & vscsi->flags); in ibmvscsis_free_command_q()
278 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_free_command_q()
279 memset(vscsi->cmd_q.base_addr, 0, bytes); in ibmvscsis_free_command_q()
280 vscsi->cmd_q.index = 0; in ibmvscsis_free_command_q()
281 vscsi->flags |= CRQ_CLOSED; in ibmvscsis_free_command_q()
286 dev_dbg(&vscsi->dev, "free_command_q: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", in ibmvscsis_free_command_q()
287 vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, in ibmvscsis_free_command_q()
288 vscsi->phyp_acr_state); in ibmvscsis_free_command_q()
294 * ibmvscsis_cmd_q_dequeue() - Get valid Command element
313 if (ptr->valid) { in ibmvscsis_cmd_q_dequeue()
324 * ibmvscsis_send_init_message() - send initialize message to the client
338 crq->valid = VALID_INIT_MSG; in ibmvscsis_send_init_message()
339 crq->format = format; in ibmvscsis_send_init_message()
340 rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]), in ibmvscsis_send_init_message()
347 * ibmvscsis_check_init_msg() - Check init message valid
363 crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask, &vscsi->cmd_q.index, in ibmvscsis_check_init_msg()
364 vscsi->cmd_q.base_addr); in ibmvscsis_check_init_msg()
367 } else if (crq->valid == VALID_INIT_MSG && crq->format == INIT_MSG) { in ibmvscsis_check_init_msg()
369 crq->valid = INVALIDATE_CMD_RESP_EL; in ibmvscsis_check_init_msg()
377 crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask, in ibmvscsis_check_init_msg()
378 &vscsi->cmd_q.index, in ibmvscsis_check_init_msg()
379 vscsi->cmd_q.base_addr); in ibmvscsis_check_init_msg()
381 *format = (uint)(crq->format); in ibmvscsis_check_init_msg()
383 crq->valid = INVALIDATE_CMD_RESP_EL; in ibmvscsis_check_init_msg()
387 *format = (uint)(crq->format); in ibmvscsis_check_init_msg()
389 crq->valid = INVALIDATE_CMD_RESP_EL; in ibmvscsis_check_init_msg()
397 * ibmvscsis_disconnect() - Helper function to disconnect
401 * and the driver is requesting that the command queue be de-registered
416 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
417 new_state = vscsi->new_state; in ibmvscsis_disconnect()
418 vscsi->new_state = 0; in ibmvscsis_disconnect()
420 vscsi->flags |= DISCONNECT_SCHEDULED; in ibmvscsis_disconnect()
421 vscsi->flags &= ~SCHEDULE_DISCONNECT; in ibmvscsis_disconnect()
423 dev_dbg(&vscsi->dev, "disconnect: flags 0x%x, state 0x%hx\n", in ibmvscsis_disconnect()
424 vscsi->flags, vscsi->state); in ibmvscsis_disconnect()
430 switch (vscsi->state) { in ibmvscsis_disconnect()
443 vscsi->state = new_state; in ibmvscsis_disconnect()
454 vscsi->state = new_state; in ibmvscsis_disconnect()
467 vscsi->state = new_state; in ibmvscsis_disconnect()
473 vscsi->state = new_state; in ibmvscsis_disconnect()
474 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_disconnect()
475 vscsi->flags &= ~(SCHEDULE_DISCONNECT | in ibmvscsis_disconnect()
478 if (vscsi->flags & CFG_SLEEPING) { in ibmvscsis_disconnect()
479 vscsi->flags &= ~CFG_SLEEPING; in ibmvscsis_disconnect()
480 complete(&vscsi->unconfig); in ibmvscsis_disconnect()
488 dev_err(&vscsi->dev, "disconnect: invalid state %d for WAIT_IDLE\n", in ibmvscsis_disconnect()
489 vscsi->state); in ibmvscsis_disconnect()
497 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_disconnect()
498 vscsi->state = new_state; in ibmvscsis_disconnect()
499 vscsi->flags &= ~(SCHEDULE_DISCONNECT | in ibmvscsis_disconnect()
505 vscsi->state = new_state; in ibmvscsis_disconnect()
522 vscsi->state = new_state; in ibmvscsis_disconnect()
528 vscsi->state = new_state; in ibmvscsis_disconnect()
535 dev_dbg(&vscsi->dev, "disconnect start wait, active %d, sched %d\n", in ibmvscsis_disconnect()
536 (int)list_empty(&vscsi->active_q), in ibmvscsis_disconnect()
537 (int)list_empty(&vscsi->schedule_q)); in ibmvscsis_disconnect()
538 if (!list_empty(&vscsi->active_q) || in ibmvscsis_disconnect()
539 !list_empty(&vscsi->schedule_q)) { in ibmvscsis_disconnect()
540 vscsi->flags |= WAIT_FOR_IDLE; in ibmvscsis_disconnect()
541 dev_dbg(&vscsi->dev, "disconnect flags 0x%x\n", in ibmvscsis_disconnect()
542 vscsi->flags); in ibmvscsis_disconnect()
547 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
548 wait_for_completion(&vscsi->wait_idle); in ibmvscsis_disconnect()
549 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
551 dev_dbg(&vscsi->dev, "disconnect stop wait\n"); in ibmvscsis_disconnect()
556 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
560 * ibmvscsis_post_disconnect() - Schedule the disconnect
586 dev_err(&vscsi->dev, "post_disconnect: Invalid new state %d\n", in ibmvscsis_post_disconnect()
591 vscsi->flags |= flag_bits; in ibmvscsis_post_disconnect()
593 …dev_dbg(&vscsi->dev, "post_disconnect: new_state 0x%x, flag_bits 0x%x, vscsi->flags 0x%x, state %h… in ibmvscsis_post_disconnect()
594 new_state, flag_bits, vscsi->flags, vscsi->state); in ibmvscsis_post_disconnect()
596 if (!(vscsi->flags & (DISCONNECT_SCHEDULED | SCHEDULE_DISCONNECT))) { in ibmvscsis_post_disconnect()
597 vscsi->flags |= SCHEDULE_DISCONNECT; in ibmvscsis_post_disconnect()
598 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
600 INIT_WORK(&vscsi->proc_work, ibmvscsis_disconnect); in ibmvscsis_post_disconnect()
601 (void)queue_work(vscsi->work_q, &vscsi->proc_work); in ibmvscsis_post_disconnect()
603 if (vscsi->new_state) in ibmvscsis_post_disconnect()
604 state = vscsi->new_state; in ibmvscsis_post_disconnect()
606 state = vscsi->state; in ibmvscsis_post_disconnect()
617 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
624 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
636 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
644 dev_dbg(&vscsi->dev, "Leaving post_disconnect: flags 0x%x, new_state 0x%x\n", in ibmvscsis_post_disconnect()
645 vscsi->flags, vscsi->new_state); in ibmvscsis_post_disconnect()
649 * ibmvscsis_handle_init_compl_msg() - Respond to an Init Complete Message
658 switch (vscsi->state) { in ibmvscsis_handle_init_compl_msg()
669 vscsi->state = CONNECTED; in ibmvscsis_handle_init_compl_msg()
678 dev_err(&vscsi->dev, "init_msg: invalid state %d to get init compl msg\n", in ibmvscsis_handle_init_compl_msg()
679 vscsi->state); in ibmvscsis_handle_init_compl_msg()
688 * ibmvscsis_handle_init_msg() - Respond to an Init Message
697 switch (vscsi->state) { in ibmvscsis_handle_init_msg()
702 vscsi->state = CONNECTED; in ibmvscsis_handle_init_msg()
706 dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
712 dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
720 dev_warn(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
744 dev_err(&vscsi->dev, "init_msg: invalid state %d to get init msg\n", in ibmvscsis_handle_init_msg()
745 vscsi->state); in ibmvscsis_handle_init_msg()
754 * ibmvscsis_init_msg() - Respond to an init message
765 dev_dbg(&vscsi->dev, "init_msg: state 0x%hx\n", vscsi->state); in ibmvscsis_init_msg()
767 rc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO, in ibmvscsis_init_msg()
768 (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0, in ibmvscsis_init_msg()
771 vscsi->client_data.partition_number = in ibmvscsis_init_msg()
772 be64_to_cpu(*(u64 *)vscsi->map_buf); in ibmvscsis_init_msg()
773 dev_dbg(&vscsi->dev, "init_msg, part num %d\n", in ibmvscsis_init_msg()
774 vscsi->client_data.partition_number); in ibmvscsis_init_msg()
776 dev_dbg(&vscsi->dev, "init_msg h_vioctl rc %ld\n", rc); in ibmvscsis_init_msg()
780 if (crq->format == INIT_MSG) { in ibmvscsis_init_msg()
782 } else if (crq->format == INIT_COMPLETE_MSG) { in ibmvscsis_init_msg()
786 dev_err(&vscsi->dev, "init_msg: invalid format %d\n", in ibmvscsis_init_msg()
787 (uint)crq->format); in ibmvscsis_init_msg()
795 * ibmvscsis_establish_new_q() - Establish new CRQ queue
805 rc = h_vioctl(vscsi->dds.unit_id, H_ENABLE_PREPARE_FOR_SUSPEND, 30000, in ibmvscsis_establish_new_q()
808 vscsi->flags |= PREP_FOR_SUSPEND_ENABLED; in ibmvscsis_establish_new_q()
810 dev_err(&vscsi->dev, "Error from Enable Prepare for Suspend: %ld\n", in ibmvscsis_establish_new_q()
813 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_establish_new_q()
814 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_establish_new_q()
815 vscsi->debit = 0; in ibmvscsis_establish_new_q()
816 vscsi->credit = 0; in ibmvscsis_establish_new_q()
818 rc = vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_establish_new_q()
820 dev_warn(&vscsi->dev, "establish_new_q: failed to enable interrupts, rc %ld\n", in ibmvscsis_establish_new_q()
827 dev_err(&vscsi->dev, "establish_new_q: check_init_msg failed, rc %ld\n", in ibmvscsis_establish_new_q()
846 vscsi->state = UNDEFINED; in ibmvscsis_establish_new_q()
858 * ibmvscsis_reset_queue() - Reset CRQ Queue
881 dev_dbg(&vscsi->dev, "reset_queue: flags 0x%x\n", vscsi->flags); in ibmvscsis_reset_queue()
884 if (vscsi->flags & (CLIENT_FAILED | TRANS_EVENT)) { in ibmvscsis_reset_queue()
885 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_reset_queue()
886 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_reset_queue()
887 vscsi->debit = 0; in ibmvscsis_reset_queue()
888 vscsi->credit = 0; in ibmvscsis_reset_queue()
889 vscsi->state = WAIT_CONNECTION; in ibmvscsis_reset_queue()
890 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_reset_queue()
894 vscsi->state = WAIT_CONNECTION; in ibmvscsis_reset_queue()
896 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_reset_queue()
897 rc = h_reg_crq(vscsi->dds.unit_id, in ibmvscsis_reset_queue()
898 vscsi->cmd_q.crq_token, bytes); in ibmvscsis_reset_queue()
904 dev_dbg(&vscsi->dev, "reset_queue: reg_crq rc %ld\n", in ibmvscsis_reset_queue()
907 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_reset_queue()
908 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_reset_queue()
912 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_reset_queue()
913 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_reset_queue()
919 * ibmvscsis_free_cmd_resources() - Free command resources
928 struct iu_entry *iue = cmd->iue; in ibmvscsis_free_cmd_resources()
930 switch (cmd->type) { in ibmvscsis_free_cmd_resources()
937 if (vscsi->debit) in ibmvscsis_free_cmd_resources()
938 vscsi->debit -= 1; in ibmvscsis_free_cmd_resources()
941 vscsi->flags &= ~PROCESSING_MAD; in ibmvscsis_free_cmd_resources()
946 dev_err(&vscsi->dev, "free_cmd_resources unknown type %d\n", in ibmvscsis_free_cmd_resources()
947 cmd->type); in ibmvscsis_free_cmd_resources()
951 cmd->iue = NULL; in ibmvscsis_free_cmd_resources()
952 list_add_tail(&cmd->list, &vscsi->free_cmd); in ibmvscsis_free_cmd_resources()
955 if (list_empty(&vscsi->active_q) && list_empty(&vscsi->schedule_q) && in ibmvscsis_free_cmd_resources()
956 list_empty(&vscsi->waiting_rsp) && (vscsi->flags & WAIT_FOR_IDLE)) { in ibmvscsis_free_cmd_resources()
957 vscsi->flags &= ~WAIT_FOR_IDLE; in ibmvscsis_free_cmd_resources()
958 complete(&vscsi->wait_idle); in ibmvscsis_free_cmd_resources()
963 * ibmvscsis_ready_for_suspend() - Helper function to call VIOCTL
982 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_ready_for_suspend()
984 dev_dbg(&vscsi->dev, "ready_suspend: flags 0x%x, state 0x%hx crq_valid:%x\n", in ibmvscsis_ready_for_suspend()
985 vscsi->flags, vscsi->state, (int)crq->valid); in ibmvscsis_ready_for_suspend()
987 if (!(vscsi->flags & PREP_FOR_SUSPEND_ABORTED) && !(crq->valid)) { in ibmvscsis_ready_for_suspend()
988 rc = h_vioctl(vscsi->dds.unit_id, H_READY_FOR_SUSPEND, 0, 0, 0, in ibmvscsis_ready_for_suspend()
991 dev_err(&vscsi->dev, "Ready for Suspend Vioctl failed: %ld\n", in ibmvscsis_ready_for_suspend()
995 } else if (((vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE) && in ibmvscsis_ready_for_suspend()
996 (vscsi->flags & PREP_FOR_SUSPEND_ABORTED)) || in ibmvscsis_ready_for_suspend()
997 ((crq->valid) && ((crq->valid != VALID_TRANS_EVENT) || in ibmvscsis_ready_for_suspend()
998 (crq->format != RESUME_FROM_SUSP)))) { in ibmvscsis_ready_for_suspend()
1000 vscsi->state = ERR_DISCONNECT_RECONNECT; in ibmvscsis_ready_for_suspend()
1002 rc = -1; in ibmvscsis_ready_for_suspend()
1003 } else if (vscsi->state == CONNECTED) { in ibmvscsis_ready_for_suspend()
1008 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_ready_for_suspend()
1010 if ((crq->valid) && ((crq->valid != VALID_TRANS_EVENT) || in ibmvscsis_ready_for_suspend()
1011 (crq->format != RESUME_FROM_SUSP))) in ibmvscsis_ready_for_suspend()
1012 dev_err(&vscsi->dev, "Invalid element in CRQ after Prepare for Suspend"); in ibmvscsis_ready_for_suspend()
1015 vscsi->flags &= ~(PREP_FOR_SUSPEND_PENDING | PREP_FOR_SUSPEND_ABORTED); in ibmvscsis_ready_for_suspend()
1021 * ibmvscsis_trans_event() - Handle a Transport Event
1036 dev_dbg(&vscsi->dev, "trans_event: format %d, flags 0x%x, state 0x%hx\n", in ibmvscsis_trans_event()
1037 (int)crq->format, vscsi->flags, vscsi->state); in ibmvscsis_trans_event()
1039 switch (crq->format) { in ibmvscsis_trans_event()
1044 if (crq->format == MIGRATED) in ibmvscsis_trans_event()
1045 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1046 switch (vscsi->state) { in ibmvscsis_trans_event()
1053 vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT); in ibmvscsis_trans_event()
1069 if ((vscsi->debit > 0) || in ibmvscsis_trans_event()
1070 !list_empty(&vscsi->schedule_q) || in ibmvscsis_trans_event()
1071 !list_empty(&vscsi->waiting_rsp) || in ibmvscsis_trans_event()
1072 !list_empty(&vscsi->active_q)) { in ibmvscsis_trans_event()
1073 dev_dbg(&vscsi->dev, "debit %d, sched %d, wait %d, active %d\n", in ibmvscsis_trans_event()
1074 vscsi->debit, in ibmvscsis_trans_event()
1075 (int)list_empty(&vscsi->schedule_q), in ibmvscsis_trans_event()
1076 (int)list_empty(&vscsi->waiting_rsp), in ibmvscsis_trans_event()
1077 (int)list_empty(&vscsi->active_q)); in ibmvscsis_trans_event()
1078 dev_warn(&vscsi->dev, "connection lost with outstanding work\n"); in ibmvscsis_trans_event()
1080 dev_dbg(&vscsi->dev, "trans_event: SRP Processing, but no outstanding work\n"); in ibmvscsis_trans_event()
1091 vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT); in ibmvscsis_trans_event()
1097 dev_dbg(&vscsi->dev, "Prep for Suspend, crq status = 0x%x\n", in ibmvscsis_trans_event()
1098 (int)crq->status); in ibmvscsis_trans_event()
1099 switch (vscsi->state) { in ibmvscsis_trans_event()
1106 vscsi->resume_state = vscsi->state; in ibmvscsis_trans_event()
1107 vscsi->flags |= PREP_FOR_SUSPEND_PENDING; in ibmvscsis_trans_event()
1108 if (crq->status == CRQ_ENTRY_OVERWRITTEN) in ibmvscsis_trans_event()
1109 vscsi->flags |= PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1119 dev_err(&vscsi->dev, "Invalid state for Prepare for Suspend Trans Event: 0x%x\n", in ibmvscsis_trans_event()
1120 vscsi->state); in ibmvscsis_trans_event()
1126 dev_dbg(&vscsi->dev, "Resume from Suspend, crq status = 0x%x\n", in ibmvscsis_trans_event()
1127 (int)crq->status); in ibmvscsis_trans_event()
1128 if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) { in ibmvscsis_trans_event()
1129 vscsi->flags |= PREP_FOR_SUSPEND_ABORTED; in ibmvscsis_trans_event()
1131 if ((crq->status == CRQ_ENTRY_OVERWRITTEN) || in ibmvscsis_trans_event()
1132 (vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE)) { in ibmvscsis_trans_event()
1136 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1143 dev_err(&vscsi->dev, "trans_event: invalid format %d\n", in ibmvscsis_trans_event()
1144 (uint)crq->format); in ibmvscsis_trans_event()
1150 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_trans_event()
1152 dev_dbg(&vscsi->dev, "Leaving trans_event: flags 0x%x, state 0x%hx, rc %ld\n", in ibmvscsis_trans_event()
1153 vscsi->flags, vscsi->state, rc); in ibmvscsis_trans_event()
1159 * ibmvscsis_poll_cmd_q() - Poll Command Queue
1175 dev_dbg(&vscsi->dev, "poll_cmd_q: flags 0x%x, state 0x%hx, q index %ud\n", in ibmvscsis_poll_cmd_q()
1176 vscsi->flags, vscsi->state, vscsi->cmd_q.index); in ibmvscsis_poll_cmd_q()
1178 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_poll_cmd_q()
1179 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_poll_cmd_q()
1180 valid = crq->valid; in ibmvscsis_poll_cmd_q()
1185 vscsi->cmd_q.index = in ibmvscsis_poll_cmd_q()
1186 (vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask; in ibmvscsis_poll_cmd_q()
1191 if ((uint)crq->valid == VALID_TRANS_EVENT) { in ibmvscsis_poll_cmd_q()
1199 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_poll_cmd_q()
1204 dev_dbg(&vscsi->dev, "poll_cmd_q, ignoring\n"); in ibmvscsis_poll_cmd_q()
1210 if (vscsi->cmd_q.index) in ibmvscsis_poll_cmd_q()
1211 vscsi->cmd_q.index -= 1; in ibmvscsis_poll_cmd_q()
1217 vscsi->cmd_q.index = vscsi->cmd_q.mask; in ibmvscsis_poll_cmd_q()
1222 crq->valid = INVALIDATE_CMD_RESP_EL; in ibmvscsis_poll_cmd_q()
1224 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_poll_cmd_q()
1225 valid = crq->valid; in ibmvscsis_poll_cmd_q()
1231 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_poll_cmd_q()
1233 dev_dbg(&vscsi->dev, "poll_cmd_q, reenabling interrupts\n"); in ibmvscsis_poll_cmd_q()
1235 valid = crq->valid; in ibmvscsis_poll_cmd_q()
1241 dev_dbg(&vscsi->dev, "Leaving poll_cmd_q: rc %ld\n", rc); in ibmvscsis_poll_cmd_q()
1245 * ibmvscsis_free_cmd_qs() - Free elements in queue
1258 dev_dbg(&vscsi->dev, "free_cmd_qs: waiting_rsp empty %d, timer starter %d\n", in ibmvscsis_free_cmd_qs()
1259 (int)list_empty(&vscsi->waiting_rsp), in ibmvscsis_free_cmd_qs()
1260 vscsi->rsp_q_timer.started); in ibmvscsis_free_cmd_qs()
1262 list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, list) { in ibmvscsis_free_cmd_qs()
1263 list_del(&cmd->list); in ibmvscsis_free_cmd_qs()
1269 * ibmvscsis_get_free_cmd() - Get free command from list
1279 iue = srp_iu_get(&vscsi->target); in ibmvscsis_get_free_cmd()
1281 cmd = list_first_entry_or_null(&vscsi->free_cmd, in ibmvscsis_get_free_cmd()
1284 if (cmd->abort_cmd) in ibmvscsis_get_free_cmd()
1285 cmd->abort_cmd = NULL; in ibmvscsis_get_free_cmd()
1286 cmd->flags &= ~(DELAY_SEND); in ibmvscsis_get_free_cmd()
1287 list_del(&cmd->list); in ibmvscsis_get_free_cmd()
1288 cmd->iue = iue; in ibmvscsis_get_free_cmd()
1289 cmd->type = UNSET_TYPE; in ibmvscsis_get_free_cmd()
1290 memset(&cmd->se_cmd, 0, sizeof(cmd->se_cmd)); in ibmvscsis_get_free_cmd()
1300 * ibmvscsis_adapter_idle() - Helper function to handle idle adapter
1306 * are non-empty. This function can be invoked
1317 dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1318 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1321 if (vscsi->state != WAIT_CONNECTION || vscsi->flags & TRANS_EVENT) in ibmvscsis_adapter_idle()
1324 switch (vscsi->state) { in ibmvscsis_adapter_idle()
1329 if (vscsi->flags & CFG_SLEEPING) { in ibmvscsis_adapter_idle()
1330 vscsi->flags &= ~CFG_SLEEPING; in ibmvscsis_adapter_idle()
1331 complete(&vscsi->unconfig); in ibmvscsis_adapter_idle()
1336 dev_dbg(&vscsi->dev, "adapter_idle, disc_rec: flags 0x%x\n", in ibmvscsis_adapter_idle()
1337 vscsi->flags); in ibmvscsis_adapter_idle()
1342 vscsi->flags &= ~(SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED); in ibmvscsis_adapter_idle()
1343 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_adapter_idle()
1344 if (vscsi->tport.enabled) in ibmvscsis_adapter_idle()
1345 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_adapter_idle()
1347 vscsi->state = WAIT_ENABLED; in ibmvscsis_adapter_idle()
1348 dev_dbg(&vscsi->dev, "adapter_idle, disc: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1349 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1353 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_adapter_idle()
1354 vscsi->debit = 0; in ibmvscsis_adapter_idle()
1355 vscsi->credit = 0; in ibmvscsis_adapter_idle()
1356 if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) { in ibmvscsis_adapter_idle()
1357 vscsi->state = vscsi->resume_state; in ibmvscsis_adapter_idle()
1358 vscsi->resume_state = 0; in ibmvscsis_adapter_idle()
1360 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1363 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_adapter_idle()
1364 vscsi->state = WAIT_CONNECTION; in ibmvscsis_adapter_idle()
1365 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_adapter_idle()
1367 vscsi->state = CONNECTED; in ibmvscsis_adapter_idle()
1368 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1371 dev_dbg(&vscsi->dev, "adapter_idle, wait: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1372 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1377 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1378 dev_dbg(&vscsi->dev, "adapter_idle, disconnected: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1379 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1383 dev_err(&vscsi->dev, "adapter_idle: in invalid state %d\n", in ibmvscsis_adapter_idle()
1384 vscsi->state); in ibmvscsis_adapter_idle()
1392 * There is a timing window where we could lose a disconnect request. in ibmvscsis_adapter_idle()
1393 * The known path to this window occurs during the DISCONNECT_RECONNECT in ibmvscsis_adapter_idle()
1409 if (vscsi->phyp_acr_state != 0) { in ibmvscsis_adapter_idle()
1415 vscsi->flags |= vscsi->phyp_acr_flags; in ibmvscsis_adapter_idle()
1416 ibmvscsis_post_disconnect(vscsi, vscsi->phyp_acr_state, 0); in ibmvscsis_adapter_idle()
1417 vscsi->phyp_acr_state = 0; in ibmvscsis_adapter_idle()
1418 vscsi->phyp_acr_flags = 0; in ibmvscsis_adapter_idle()
1420 dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", in ibmvscsis_adapter_idle()
1421 vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, in ibmvscsis_adapter_idle()
1422 vscsi->phyp_acr_state); in ibmvscsis_adapter_idle()
1425 dev_dbg(&vscsi->dev, "Leaving adapter_idle: flags 0x%x, state 0x%hx, new_state 0x%x\n", in ibmvscsis_adapter_idle()
1426 vscsi->flags, vscsi->state, vscsi->new_state); in ibmvscsis_adapter_idle()
1430 * ibmvscsis_copy_crq_packet() - Copy CRQ Packet
1436 * partition using remote dma
1445 struct iu_entry *iue = cmd->iue; in ibmvscsis_copy_crq_packet()
1449 len = be16_to_cpu(crq->IU_length); in ibmvscsis_copy_crq_packet()
1451 dev_err(&vscsi->dev, "copy_crq: Invalid len %d passed", len); in ibmvscsis_copy_crq_packet()
1456 rc = h_copy_rdma(len, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_copy_crq_packet()
1457 be64_to_cpu(crq->IU_data_ptr), in ibmvscsis_copy_crq_packet()
1458 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma); in ibmvscsis_copy_crq_packet()
1462 cmd->init_time = mftb(); in ibmvscsis_copy_crq_packet()
1463 iue->remote_token = crq->IU_data_ptr; in ibmvscsis_copy_crq_packet()
1464 iue->iu_len = len; in ibmvscsis_copy_crq_packet()
1465 dev_dbg(&vscsi->dev, "copy_crq: ioba 0x%llx, init_time 0x%llx\n", in ibmvscsis_copy_crq_packet()
1466 be64_to_cpu(crq->IU_data_ptr), cmd->init_time); in ibmvscsis_copy_crq_packet()
1478 dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n", in ibmvscsis_copy_crq_packet()
1484 dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n", in ibmvscsis_copy_crq_packet()
1494 * ibmvscsis_adapter_info - Service an Adapter Info MAnagement Data gram
1504 struct viosrp_adapter_info *mad = &vio_iu(iue)->mad.adapter_info; in ibmvscsis_adapter_info()
1510 mad->common.status = cpu_to_be16(VIOSRP_MAD_SUCCESS); in ibmvscsis_adapter_info()
1512 if (be16_to_cpu(mad->common.length) > sizeof(*info)) { in ibmvscsis_adapter_info()
1513 mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED); in ibmvscsis_adapter_info()
1517 info = dma_alloc_coherent(&vscsi->dma_dev->dev, sizeof(*info), &token, in ibmvscsis_adapter_info()
1520 dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n", in ibmvscsis_adapter_info()
1521 iue->target); in ibmvscsis_adapter_info()
1522 mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED); in ibmvscsis_adapter_info()
1527 rc = h_copy_rdma(be16_to_cpu(mad->common.length), in ibmvscsis_adapter_info()
1528 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_adapter_info()
1529 be64_to_cpu(mad->buffer), in ibmvscsis_adapter_info()
1530 vscsi->dds.window[LOCAL].liobn, token); in ibmvscsis_adapter_info()
1537 dev_warn(&vscsi->dev, "adapter_info: h_copy_rdma from client failed, rc %ld\n", in ibmvscsis_adapter_info()
1539 dev_dbg(&vscsi->dev, "adapter_info: ioba 0x%llx, flags 0x%x, flag_bits 0x%x\n", in ibmvscsis_adapter_info()
1540 be64_to_cpu(mad->buffer), vscsi->flags, flag_bits); in ibmvscsis_adapter_info()
1548 * already got from phyp - unless we failed to get it from in ibmvscsis_adapter_info()
1551 if (vscsi->client_data.partition_number == 0) in ibmvscsis_adapter_info()
1552 vscsi->client_data.partition_number = in ibmvscsis_adapter_info()
1553 be32_to_cpu(info->partition_number); in ibmvscsis_adapter_info()
1554 strscpy(vscsi->client_data.srp_version, info->srp_version, in ibmvscsis_adapter_info()
1555 sizeof(vscsi->client_data.srp_version)); in ibmvscsis_adapter_info()
1556 strscpy(vscsi->client_data.partition_name, info->partition_name, in ibmvscsis_adapter_info()
1557 sizeof(vscsi->client_data.partition_name)); in ibmvscsis_adapter_info()
1558 vscsi->client_data.mad_version = be32_to_cpu(info->mad_version); in ibmvscsis_adapter_info()
1559 vscsi->client_data.os_type = be32_to_cpu(info->os_type); in ibmvscsis_adapter_info()
1562 strscpy_pad(info->srp_version, SRP_VERSION, in ibmvscsis_adapter_info()
1563 sizeof(info->srp_version)); in ibmvscsis_adapter_info()
1564 strscpy_pad(info->partition_name, vscsi->dds.partition_name, in ibmvscsis_adapter_info()
1565 sizeof(info->partition_name)); in ibmvscsis_adapter_info()
1566 info->partition_number = cpu_to_be32(vscsi->dds.partition_num); in ibmvscsis_adapter_info()
1567 info->mad_version = cpu_to_be32(MAD_VERSION_1); in ibmvscsis_adapter_info()
1568 info->os_type = cpu_to_be32(LINUX); in ibmvscsis_adapter_info()
1569 memset(&info->port_max_txu[0], 0, sizeof(info->port_max_txu)); in ibmvscsis_adapter_info()
1570 info->port_max_txu[0] = cpu_to_be32(MAX_TXU); in ibmvscsis_adapter_info()
1573 rc = h_copy_rdma(sizeof(*info), vscsi->dds.window[LOCAL].liobn, in ibmvscsis_adapter_info()
1574 token, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_adapter_info()
1575 be64_to_cpu(mad->buffer)); in ibmvscsis_adapter_info()
1587 dev_err(&vscsi->dev, "adapter_info: h_copy_rdma to client failed, rc %ld\n", in ibmvscsis_adapter_info()
1596 dma_free_coherent(&vscsi->dma_dev->dev, sizeof(*info), info, token); in ibmvscsis_adapter_info()
1597 dev_dbg(&vscsi->dev, "Leaving adapter_info, rc %ld\n", rc); in ibmvscsis_adapter_info()
1603 * ibmvscsis_cap_mad() - Service a Capabilities MAnagement Data gram
1615 struct viosrp_capabilities *mad = &vio_iu(iue)->mad.capabilities; in ibmvscsis_cap_mad()
1624 olen = be16_to_cpu(mad->common.length); in ibmvscsis_cap_mad()
1631 dev_warn(&vscsi->dev, "cap_mad: invalid len %d\n", olen); in ibmvscsis_cap_mad()
1632 mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED); in ibmvscsis_cap_mad()
1636 cap = dma_alloc_coherent(&vscsi->dma_dev->dev, olen, &token, in ibmvscsis_cap_mad()
1639 dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n", in ibmvscsis_cap_mad()
1640 iue->target); in ibmvscsis_cap_mad()
1641 mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED); in ibmvscsis_cap_mad()
1644 rc = h_copy_rdma(olen, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_cap_mad()
1645 be64_to_cpu(mad->buffer), in ibmvscsis_cap_mad()
1646 vscsi->dds.window[LOCAL].liobn, token); in ibmvscsis_cap_mad()
1648 strscpy_pad(cap->name, dev_name(&vscsi->dma_dev->dev), in ibmvscsis_cap_mad()
1649 sizeof(cap->name)); in ibmvscsis_cap_mad()
1651 len = olen - min_len; in ibmvscsis_cap_mad()
1653 common = (struct mad_capability_common *)&cap->migration; in ibmvscsis_cap_mad()
1656 dev_dbg(&vscsi->dev, "cap_mad: len left %hd, cap type %d, cap len %hd\n", in ibmvscsis_cap_mad()
1657 len, be32_to_cpu(common->cap_type), in ibmvscsis_cap_mad()
1658 be16_to_cpu(common->length)); in ibmvscsis_cap_mad()
1660 cap_len = be16_to_cpu(common->length); in ibmvscsis_cap_mad()
1662 dev_err(&vscsi->dev, "cap_mad: cap len mismatch with total len\n"); in ibmvscsis_cap_mad()
1668 dev_err(&vscsi->dev, "cap_mad: cap len is 0\n"); in ibmvscsis_cap_mad()
1673 switch (common->cap_type) { in ibmvscsis_cap_mad()
1675 dev_dbg(&vscsi->dev, "cap_mad: unsupported capability\n"); in ibmvscsis_cap_mad()
1676 common->server_support = 0; in ibmvscsis_cap_mad()
1678 cap->flags &= ~flag; in ibmvscsis_cap_mad()
1682 len = len - cap_len; in ibmvscsis_cap_mad()
1687 mad->common.status = cpu_to_be16(status); in ibmvscsis_cap_mad()
1690 rc = h_copy_rdma(olen, vscsi->dds.window[LOCAL].liobn, token, in ibmvscsis_cap_mad()
1691 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_cap_mad()
1692 be64_to_cpu(mad->buffer)); in ibmvscsis_cap_mad()
1695 dev_dbg(&vscsi->dev, "cap_mad: failed to copy to client, rc %ld\n", in ibmvscsis_cap_mad()
1704 dev_warn(&vscsi->dev, "cap_mad: error copying data to client, rc %ld\n", in ibmvscsis_cap_mad()
1712 dma_free_coherent(&vscsi->dma_dev->dev, olen, cap, token); in ibmvscsis_cap_mad()
1714 dev_dbg(&vscsi->dev, "Leaving cap_mad, rc %ld, client_cap 0x%x\n", in ibmvscsis_cap_mad()
1715 rc, vscsi->client_cap); in ibmvscsis_cap_mad()
1721 * ibmvscsis_process_mad() - Service a MAnagement Data gram
1729 struct mad_common *mad = (struct mad_common *)&vio_iu(iue)->mad; in ibmvscsis_process_mad()
1733 switch (be32_to_cpu(mad->type)) { in ibmvscsis_process_mad()
1735 empty = &vio_iu(iue)->mad.empty_iu; in ibmvscsis_process_mad()
1736 vscsi->empty_iu_id = be64_to_cpu(empty->buffer); in ibmvscsis_process_mad()
1737 vscsi->empty_iu_tag = be64_to_cpu(empty->common.tag); in ibmvscsis_process_mad()
1738 mad->status = cpu_to_be16(VIOSRP_MAD_SUCCESS); in ibmvscsis_process_mad()
1747 if (vscsi->state == CONNECTED) { in ibmvscsis_process_mad()
1748 vscsi->fast_fail = true; in ibmvscsis_process_mad()
1749 mad->status = cpu_to_be16(VIOSRP_MAD_SUCCESS); in ibmvscsis_process_mad()
1751 dev_warn(&vscsi->dev, "fast fail mad sent after login\n"); in ibmvscsis_process_mad()
1752 mad->status = cpu_to_be16(VIOSRP_MAD_FAILED); in ibmvscsis_process_mad()
1756 mad->status = cpu_to_be16(VIOSRP_MAD_NOT_SUPPORTED); in ibmvscsis_process_mad()
1764 * srp_snd_msg_failed() - Handle an error when sending a response
1778 vscsi->flags |= CLIENT_FAILED; in srp_snd_msg_failed()
1781 if (!(vscsi->flags & RESPONSE_Q_DOWN)) { in srp_snd_msg_failed()
1782 vscsi->flags |= RESPONSE_Q_DOWN; in srp_snd_msg_failed()
1783 if (!(vscsi->state & (ERR_DISCONNECT | in srp_snd_msg_failed()
1786 … dev_err(&vscsi->dev, "snd_msg_failed: setting RESPONSE_Q_DOWN, state 0x%hx, flags 0x%x, rc %ld\n", in srp_snd_msg_failed()
1787 vscsi->state, vscsi->flags, rc); in srp_snd_msg_failed()
1809 if ((vscsi->rsp_q_timer.timer_pops < MAX_TIMER_POPS) || in srp_snd_msg_failed()
1810 (vscsi->state == SRP_PROCESSING)) { in srp_snd_msg_failed()
1811 …dev_dbg(&vscsi->dev, "snd_msg_failed: response queue full, flags 0x%x, timer started %d, pops %d\n… in srp_snd_msg_failed()
1812 vscsi->flags, (int)vscsi->rsp_q_timer.started, in srp_snd_msg_failed()
1813 vscsi->rsp_q_timer.timer_pops); in srp_snd_msg_failed()
1819 if (!vscsi->rsp_q_timer.started) { in srp_snd_msg_failed()
1820 if (vscsi->rsp_q_timer.timer_pops < in srp_snd_msg_failed()
1831 vscsi->rsp_q_timer.started = true; in srp_snd_msg_failed()
1832 hrtimer_start(&vscsi->rsp_q_timer.timer, kt, in srp_snd_msg_failed()
1844 vscsi->flags |= RESPONSE_Q_DOWN; in srp_snd_msg_failed()
1851 if (!(vscsi->state & (ERR_DISCONNECT | in srp_snd_msg_failed()
1854 dev_err(&vscsi->dev, "client crq full too long\n"); in srp_snd_msg_failed()
1863 * ibmvscsis_send_messages() - Send a Response
1881 if (!(vscsi->flags & RESPONSE_Q_DOWN)) { in ibmvscsis_send_messages()
1884 list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, in ibmvscsis_send_messages()
1890 if (cmd->flags & DELAY_SEND) in ibmvscsis_send_messages()
1893 if (cmd->abort_cmd) { in ibmvscsis_send_messages()
1895 cmd->abort_cmd->flags &= ~(DELAY_SEND); in ibmvscsis_send_messages()
1896 cmd->abort_cmd = NULL; in ibmvscsis_send_messages()
1906 if (cmd->se_cmd.transport_state & CMD_T_ABORTED && in ibmvscsis_send_messages()
1907 !(cmd->se_cmd.transport_state & CMD_T_TAS)) { in ibmvscsis_send_messages()
1908 list_del(&cmd->list); in ibmvscsis_send_messages()
1929 vscsi->credit += 1; in ibmvscsis_send_messages()
1931 crq->valid = VALID_CMD_RESP_EL; in ibmvscsis_send_messages()
1932 crq->format = cmd->rsp.format; in ibmvscsis_send_messages()
1934 if (cmd->flags & CMD_FAST_FAIL) in ibmvscsis_send_messages()
1935 crq->status = VIOSRP_ADAPTER_FAIL; in ibmvscsis_send_messages()
1937 crq->IU_length = cpu_to_be16(cmd->rsp.len); in ibmvscsis_send_messages()
1939 rc = h_send_crq(vscsi->dma_dev->unit_address, in ibmvscsis_send_messages()
1940 be64_to_cpu(crq->high), in ibmvscsis_send_messages()
1941 be64_to_cpu(cmd->rsp.tag)); in ibmvscsis_send_messages()
1943 dev_dbg(&vscsi->dev, "send_messages: cmd %p, tag 0x%llx, rc %ld\n", in ibmvscsis_send_messages()
1944 cmd, be64_to_cpu(cmd->rsp.tag), in ibmvscsis_send_messages()
1952 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_send_messages()
1953 list_del(&cmd->list); in ibmvscsis_send_messages()
1971 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_send_messages()
1983 struct iu_entry *iue = cmd->iue; in ibmvscsis_send_mad_resp()
1984 struct mad_common *mad = (struct mad_common *)&vio_iu(iue)->mad; in ibmvscsis_send_mad_resp()
1990 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma, in ibmvscsis_send_mad_resp()
1991 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_send_mad_resp()
1992 be64_to_cpu(crq->IU_data_ptr)); in ibmvscsis_send_mad_resp()
1994 cmd->rsp.format = VIOSRP_MAD_FORMAT; in ibmvscsis_send_mad_resp()
1995 cmd->rsp.len = sizeof(struct mad_common); in ibmvscsis_send_mad_resp()
1996 cmd->rsp.tag = mad->tag; in ibmvscsis_send_mad_resp()
1997 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_send_mad_resp()
2000 dev_dbg(&vscsi->dev, "Error sending mad response, rc %ld\n", in ibmvscsis_send_mad_resp()
2006 dev_err(&vscsi->dev, "mad: failed to copy to client, rc %ld\n", in ibmvscsis_send_mad_resp()
2016 * ibmvscsis_mad() - Service a MAnagement Data gram.
2030 switch (vscsi->state) { in ibmvscsis_mad()
2037 dev_dbg(&vscsi->dev, "mad: in Wait Connection state, ignoring MAD, flags %d\n", in ibmvscsis_mad()
2038 vscsi->flags); in ibmvscsis_mad()
2054 dev_err(&vscsi->dev, "mad: invalid adapter state %d for mad\n", in ibmvscsis_mad()
2055 vscsi->state); in ibmvscsis_mad()
2061 dev_err(&vscsi->dev, "mad: failed to get cmd, debit %d\n", in ibmvscsis_mad()
2062 vscsi->debit); in ibmvscsis_mad()
2066 iue = cmd->iue; in ibmvscsis_mad()
2067 cmd->type = ADAPTER_MAD; in ibmvscsis_mad()
2071 mad = (struct mad_common *)&vio_iu(iue)->mad; in ibmvscsis_mad()
2073 dev_dbg(&vscsi->dev, "mad: type %d\n", be32_to_cpu(mad->type)); in ibmvscsis_mad()
2077 dev_dbg(&vscsi->dev, "mad: status %hd, rc %ld\n", in ibmvscsis_mad()
2078 be16_to_cpu(mad->status), rc); in ibmvscsis_mad()
2086 dev_dbg(&vscsi->dev, "Leaving mad, rc %ld\n", rc); in ibmvscsis_mad()
2091 * ibmvscsis_login_rsp() - Create/copy a login response notice to the client
2101 struct iu_entry *iue = cmd->iue; in ibmvscsis_login_rsp()
2102 struct srp_login_rsp *rsp = &vio_iu(iue)->srp.login_rsp; in ibmvscsis_login_rsp()
2109 rsp->opcode = SRP_LOGIN_RSP; in ibmvscsis_login_rsp()
2110 rsp->req_lim_delta = cpu_to_be32(vscsi->request_limit); in ibmvscsis_login_rsp()
2111 rsp->tag = cmd->rsp.tag; in ibmvscsis_login_rsp()
2112 rsp->max_it_iu_len = cpu_to_be32(SRP_MAX_IU_LEN); in ibmvscsis_login_rsp()
2113 rsp->max_ti_iu_len = cpu_to_be32(SRP_MAX_IU_LEN); in ibmvscsis_login_rsp()
2114 fmt = (struct format_code *)&rsp->buf_fmt; in ibmvscsis_login_rsp()
2115 fmt->buffers = SUPPORTED_FORMATS; in ibmvscsis_login_rsp()
2116 vscsi->credit = 0; in ibmvscsis_login_rsp()
2118 cmd->rsp.len = sizeof(struct srp_login_rsp); in ibmvscsis_login_rsp()
2121 rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn, in ibmvscsis_login_rsp()
2122 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_login_rsp()
2123 be64_to_cpu(iue->remote_token)); in ibmvscsis_login_rsp()
2132 dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n", in ibmvscsis_login_rsp()
2140 dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n", in ibmvscsis_login_rsp()
2150 * ibmvscsis_srp_login_rej() - Create/copy a login rejection notice to client
2161 struct iu_entry *iue = cmd->iue; in ibmvscsis_srp_login_rej()
2162 struct srp_login_rej *rej = &vio_iu(iue)->srp.login_rej; in ibmvscsis_srp_login_rej()
2169 rej->opcode = SRP_LOGIN_REJ; in ibmvscsis_srp_login_rej()
2170 rej->reason = cpu_to_be32(reason); in ibmvscsis_srp_login_rej()
2171 rej->tag = cmd->rsp.tag; in ibmvscsis_srp_login_rej()
2172 fmt = (struct format_code *)&rej->buf_fmt; in ibmvscsis_srp_login_rej()
2173 fmt->buffers = SUPPORTED_FORMATS; in ibmvscsis_srp_login_rej()
2175 cmd->rsp.len = sizeof(*rej); in ibmvscsis_srp_login_rej()
2178 rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn, in ibmvscsis_srp_login_rej()
2179 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_srp_login_rej()
2180 be64_to_cpu(iue->remote_token)); in ibmvscsis_srp_login_rej()
2188 dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n", in ibmvscsis_srp_login_rej()
2196 dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n", in ibmvscsis_srp_login_rej()
2207 char *name = tport->tport_name; in ibmvscsis_make_nexus()
2212 if (tport->ibmv_nexus) { in ibmvscsis_make_nexus()
2213 dev_dbg(&vscsi->dev, "tport->ibmv_nexus already exists\n"); in ibmvscsis_make_nexus()
2219 dev_err(&vscsi->dev, "Unable to allocate struct ibmvscsis_nexus\n"); in ibmvscsis_make_nexus()
2220 return -ENOMEM; in ibmvscsis_make_nexus()
2223 nexus->se_sess = target_setup_session(&tport->se_tpg, 0, 0, in ibmvscsis_make_nexus()
2226 if (IS_ERR(nexus->se_sess)) { in ibmvscsis_make_nexus()
2227 rc = PTR_ERR(nexus->se_sess); in ibmvscsis_make_nexus()
2231 tport->ibmv_nexus = nexus; in ibmvscsis_make_nexus()
2245 nexus = tport->ibmv_nexus; in ibmvscsis_drop_nexus()
2247 return -ENODEV; in ibmvscsis_drop_nexus()
2249 se_sess = nexus->se_sess; in ibmvscsis_drop_nexus()
2251 return -ENODEV; in ibmvscsis_drop_nexus()
2257 tport->ibmv_nexus = NULL; in ibmvscsis_drop_nexus()
2264 * ibmvscsis_srp_login() - Process an SRP Login Request
2276 struct iu_entry *iue = cmd->iue; in ibmvscsis_srp_login()
2277 struct srp_login_req *req = &vio_iu(iue)->srp.login_req; in ibmvscsis_srp_login()
2286 iport = (struct port_id *)req->initiator_port_id; in ibmvscsis_srp_login()
2287 tport = (struct port_id *)req->target_port_id; in ibmvscsis_srp_login()
2288 fmt = (struct format_code *)&req->req_buf_fmt; in ibmvscsis_srp_login()
2289 if (be32_to_cpu(req->req_it_iu_len) > SRP_MAX_IU_LEN) in ibmvscsis_srp_login()
2291 else if (be32_to_cpu(req->req_it_iu_len) < 64) in ibmvscsis_srp_login()
2293 else if ((be64_to_cpu(iport->id_extension) > (MAX_NUM_PORTS - 1)) || in ibmvscsis_srp_login()
2294 (be64_to_cpu(tport->id_extension) > (MAX_NUM_PORTS - 1))) in ibmvscsis_srp_login()
2296 else if (req->req_flags & SRP_MULTICHAN_MULTI) in ibmvscsis_srp_login()
2298 else if (fmt->buffers & (~SUPPORTED_FORMATS)) in ibmvscsis_srp_login()
2300 else if ((fmt->buffers & SUPPORTED_FORMATS) == 0) in ibmvscsis_srp_login()
2303 if (vscsi->state == SRP_PROCESSING) in ibmvscsis_srp_login()
2306 rc = ibmvscsis_make_nexus(&vscsi->tport); in ibmvscsis_srp_login()
2310 cmd->rsp.format = VIOSRP_SRP_FORMAT; in ibmvscsis_srp_login()
2311 cmd->rsp.tag = req->tag; in ibmvscsis_srp_login()
2313 dev_dbg(&vscsi->dev, "srp_login: reason 0x%x\n", reason); in ibmvscsis_srp_login()
2322 vscsi->state = SRP_PROCESSING; in ibmvscsis_srp_login()
2324 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_srp_login()
2330 dev_dbg(&vscsi->dev, "Leaving srp_login, rc %ld\n", rc); in ibmvscsis_srp_login()
2335 * ibmvscsis_srp_i_logout() - Helper Function to close I_T Nexus
2350 struct iu_entry *iue = cmd->iue; in ibmvscsis_srp_i_logout()
2351 struct srp_i_logout *log_out = &vio_iu(iue)->srp.i_logout; in ibmvscsis_srp_i_logout()
2353 if ((vscsi->debit > 0) || !list_empty(&vscsi->schedule_q) || in ibmvscsis_srp_i_logout()
2354 !list_empty(&vscsi->waiting_rsp)) { in ibmvscsis_srp_i_logout()
2355 dev_err(&vscsi->dev, "i_logout: outstanding work\n"); in ibmvscsis_srp_i_logout()
2358 cmd->rsp.format = SRP_FORMAT; in ibmvscsis_srp_i_logout()
2359 cmd->rsp.tag = log_out->tag; in ibmvscsis_srp_i_logout()
2360 cmd->rsp.len = sizeof(struct mad_common); in ibmvscsis_srp_i_logout()
2361 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_srp_i_logout()
2379 if (vscsi->request_limit - vscsi->debit <= 0) { in ibmvscsis_srp_cmd()
2381 dev_err(&vscsi->dev, "Client exceeded the request limit (%d), debit %d\n", in ibmvscsis_srp_cmd()
2382 vscsi->request_limit, vscsi->debit); in ibmvscsis_srp_cmd()
2389 dev_err(&vscsi->dev, "srp_cmd failed to get cmd, debit %d\n", in ibmvscsis_srp_cmd()
2390 vscsi->debit); in ibmvscsis_srp_cmd()
2394 iue = cmd->iue; in ibmvscsis_srp_cmd()
2395 srp = &vio_iu(iue)->srp.cmd; in ibmvscsis_srp_cmd()
2403 if (vscsi->state == SRP_PROCESSING) { in ibmvscsis_srp_cmd()
2404 switch (srp->opcode) { in ibmvscsis_srp_cmd()
2410 tsk = &vio_iu(iue)->srp.tsk_mgmt; in ibmvscsis_srp_cmd()
2411 dev_dbg(&vscsi->dev, "tsk_mgmt tag: %llu (0x%llx)\n", in ibmvscsis_srp_cmd()
2412 tsk->tag, tsk->tag); in ibmvscsis_srp_cmd()
2413 cmd->rsp.tag = tsk->tag; in ibmvscsis_srp_cmd()
2414 vscsi->debit += 1; in ibmvscsis_srp_cmd()
2415 cmd->type = TASK_MANAGEMENT; in ibmvscsis_srp_cmd()
2416 list_add_tail(&cmd->list, &vscsi->schedule_q); in ibmvscsis_srp_cmd()
2417 queue_work(vscsi->work_q, &cmd->work); in ibmvscsis_srp_cmd()
2421 dev_dbg(&vscsi->dev, "srp_cmd tag: %llu (0x%llx)\n", in ibmvscsis_srp_cmd()
2422 srp->tag, srp->tag); in ibmvscsis_srp_cmd()
2423 cmd->rsp.tag = srp->tag; in ibmvscsis_srp_cmd()
2424 vscsi->debit += 1; in ibmvscsis_srp_cmd()
2425 cmd->type = SCSI_CDB; in ibmvscsis_srp_cmd()
2430 list_add_tail(&cmd->list, &vscsi->schedule_q); in ibmvscsis_srp_cmd()
2431 queue_work(vscsi->work_q, &cmd->work); in ibmvscsis_srp_cmd()
2442 dev_err(&vscsi->dev, "invalid srp cmd, opcode %d\n", in ibmvscsis_srp_cmd()
2443 (uint)srp->opcode); in ibmvscsis_srp_cmd()
2448 } else if (srp->opcode == SRP_LOGIN_REQ && vscsi->state == CONNECTED) { in ibmvscsis_srp_cmd()
2452 dev_err(&vscsi->dev, "Invalid state %d to handle srp cmd\n", in ibmvscsis_srp_cmd()
2453 vscsi->state); in ibmvscsis_srp_cmd()
2459 * ibmvscsis_ping_response() - Respond to a ping request
2478 crq->valid = VALID_CMD_RESP_EL; in ibmvscsis_ping_response()
2479 crq->format = (u8)MESSAGE_IN_CRQ; in ibmvscsis_ping_response()
2480 crq->status = PING_RESPONSE; in ibmvscsis_ping_response()
2482 rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]), in ibmvscsis_ping_response()
2489 vscsi->flags |= CLIENT_FAILED; in ibmvscsis_ping_response()
2492 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_ping_response()
2495 dev_err(&vscsi->dev, "ping_response: h_send_crq failed, rc %ld\n", in ibmvscsis_ping_response()
2500 dev_err(&vscsi->dev, "ping_response: h_send_crq returned unknown rc %ld\n", in ibmvscsis_ping_response()
2510 * ibmvscsis_parse_command() - Parse an element taken from the cmd rsp queue.
2526 switch (crq->valid) { in ibmvscsis_parse_command()
2528 switch (crq->format) { in ibmvscsis_parse_command()
2533 if (vscsi->flags & PROCESSING_MAD) { in ibmvscsis_parse_command()
2535 dev_err(&vscsi->dev, "parse_command: already processing mad\n"); in ibmvscsis_parse_command()
2540 vscsi->flags |= PROCESSING_MAD; in ibmvscsis_parse_command()
2550 if (crq->status == PING) in ibmvscsis_parse_command()
2555 dev_err(&vscsi->dev, "parse_command: invalid format %d\n", in ibmvscsis_parse_command()
2556 (uint)crq->format); in ibmvscsis_parse_command()
2572 dev_err(&vscsi->dev, "parse_command: invalid valid field %d\n", in ibmvscsis_parse_command()
2573 (uint)crq->valid); in ibmvscsis_parse_command()
2582 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_parse_command()
2589 struct vio_dev *vdev = vscsi->dma_dev; in read_dma_window()
2595 * a window or the number of windows. in read_dma_window()
2598 "ibm,my-dma-window", in read_dma_window()
2601 dev_err(&vscsi->dev, "Couldn't find ibm,my-dma-window property\n"); in read_dma_window()
2602 return -1; in read_dma_window()
2605 vscsi->dds.window[LOCAL].liobn = be32_to_cpu(*dma_window); in read_dma_window()
2608 prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-address-cells", in read_dma_window()
2611 dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-address-cells property\n"); in read_dma_window()
2617 prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-size-cells", in read_dma_window()
2620 dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-size-cells property\n"); in read_dma_window()
2626 /* dma_window should point to the second window now */ in read_dma_window()
2627 vscsi->dds.window[REMOTE].liobn = be32_to_cpu(*dma_window); in read_dma_window()
2640 vdev = vscsi->dma_dev; in ibmvscsis_lookup_port()
2641 if (!strcmp(dev_name(&vdev->dev), name)) { in ibmvscsis_lookup_port()
2642 tport = &vscsi->tport; in ibmvscsis_lookup_port()
2652 * ibmvscsis_parse_cmd() - Parse SRP Command
2665 struct iu_entry *iue = cmd->iue; in ibmvscsis_parse_cmd()
2666 struct srp_cmd *srp = (struct srp_cmd *)iue->sbuf->buf; in ibmvscsis_parse_cmd()
2672 nexus = vscsi->tport.ibmv_nexus; in ibmvscsis_parse_cmd()
2675 * additional length is in 4-byte words, but technically the in ibmvscsis_parse_cmd()
2681 if (srp->add_cdb_len & 0x03) { in ibmvscsis_parse_cmd()
2682 dev_err(&vscsi->dev, "parse_cmd: reserved bits set in IU\n"); in ibmvscsis_parse_cmd()
2683 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2686 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2691 dev_err(&vscsi->dev, "0x%llx: parsing SRP descriptor table failed.\n", in ibmvscsis_parse_cmd()
2692 srp->tag); in ibmvscsis_parse_cmd()
2696 cmd->rsp.sol_not = srp->sol_not; in ibmvscsis_parse_cmd()
2698 switch (srp->task_attr) { in ibmvscsis_parse_cmd()
2712 dev_err(&vscsi->dev, "Invalid task attribute %d\n", in ibmvscsis_parse_cmd()
2713 srp->task_attr); in ibmvscsis_parse_cmd()
2717 cmd->se_cmd.tag = be64_to_cpu(srp->tag); in ibmvscsis_parse_cmd()
2719 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2720 list_add_tail(&cmd->list, &vscsi->active_q); in ibmvscsis_parse_cmd()
2721 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2723 srp->lun.scsi_lun[0] &= 0x3f; in ibmvscsis_parse_cmd()
2725 target_submit_cmd(&cmd->se_cmd, nexus->se_sess, srp->cdb, in ibmvscsis_parse_cmd()
2726 cmd->sense_buf, scsilun_to_int(&srp->lun), in ibmvscsis_parse_cmd()
2731 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2733 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2737 * ibmvscsis_parse_task() - Parse SRP Task Management Request
2751 struct iu_entry *iue = cmd->iue; in ibmvscsis_parse_task()
2752 struct srp_tsk_mgmt *srp_tsk = &vio_iu(iue)->srp.tsk_mgmt; in ibmvscsis_parse_task()
2758 nexus = vscsi->tport.ibmv_nexus; in ibmvscsis_parse_task()
2760 cmd->rsp.sol_not = srp_tsk->sol_not; in ibmvscsis_parse_task()
2762 switch (srp_tsk->tsk_mgmt_func) { in ibmvscsis_parse_task()
2765 tag_to_abort = be64_to_cpu(srp_tsk->task_tag); in ibmvscsis_parse_task()
2780 dev_err(&vscsi->dev, "unknown task mgmt func %d\n", in ibmvscsis_parse_task()
2781 srp_tsk->tsk_mgmt_func); in ibmvscsis_parse_task()
2782 cmd->se_cmd.se_tmr_req->response = in ibmvscsis_parse_task()
2784 rc = -1; in ibmvscsis_parse_task()
2789 cmd->se_cmd.tag = be64_to_cpu(srp_tsk->tag); in ibmvscsis_parse_task()
2791 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2792 list_add_tail(&cmd->list, &vscsi->active_q); in ibmvscsis_parse_task()
2793 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2795 srp_tsk->lun.scsi_lun[0] &= 0x3f; in ibmvscsis_parse_task()
2797 dev_dbg(&vscsi->dev, "calling submit_tmr, func %d\n", in ibmvscsis_parse_task()
2798 srp_tsk->tsk_mgmt_func); in ibmvscsis_parse_task()
2799 rc = target_submit_tmr(&cmd->se_cmd, nexus->se_sess, NULL, in ibmvscsis_parse_task()
2800 scsilun_to_int(&srp_tsk->lun), srp_tsk, in ibmvscsis_parse_task()
2803 dev_err(&vscsi->dev, "target_submit_tmr failed, rc %d\n", in ibmvscsis_parse_task()
2805 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2806 list_del(&cmd->list); in ibmvscsis_parse_task()
2807 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2808 cmd->se_cmd.se_tmr_req->response = in ibmvscsis_parse_task()
2814 transport_send_check_condition_and_sense(&cmd->se_cmd, 0, 0); in ibmvscsis_parse_task()
2821 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_scheduler()
2823 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2826 list_del(&cmd->list); in ibmvscsis_scheduler()
2829 if (vscsi->flags & (SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED)) { in ibmvscsis_scheduler()
2833 if (list_empty(&vscsi->active_q) && in ibmvscsis_scheduler()
2834 list_empty(&vscsi->schedule_q) && in ibmvscsis_scheduler()
2835 (vscsi->flags & WAIT_FOR_IDLE)) { in ibmvscsis_scheduler()
2836 vscsi->flags &= ~WAIT_FOR_IDLE; in ibmvscsis_scheduler()
2837 complete(&vscsi->wait_idle); in ibmvscsis_scheduler()
2840 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2844 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2846 switch (cmd->type) { in ibmvscsis_scheduler()
2854 dev_err(&vscsi->dev, "scheduler, invalid cmd type %d\n", in ibmvscsis_scheduler()
2855 cmd->type); in ibmvscsis_scheduler()
2856 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2858 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2868 INIT_LIST_HEAD(&vscsi->free_cmd); in ibmvscsis_alloc_cmds()
2869 vscsi->cmd_pool = kcalloc(num, sizeof(struct ibmvscsis_cmd), in ibmvscsis_alloc_cmds()
2871 if (!vscsi->cmd_pool) in ibmvscsis_alloc_cmds()
2872 return -ENOMEM; in ibmvscsis_alloc_cmds()
2874 for (i = 0, cmd = (struct ibmvscsis_cmd *)vscsi->cmd_pool; i < num; in ibmvscsis_alloc_cmds()
2876 cmd->abort_cmd = NULL; in ibmvscsis_alloc_cmds()
2877 cmd->adapter = vscsi; in ibmvscsis_alloc_cmds()
2878 INIT_WORK(&cmd->work, ibmvscsis_scheduler); in ibmvscsis_alloc_cmds()
2879 list_add_tail(&cmd->list, &vscsi->free_cmd); in ibmvscsis_alloc_cmds()
2887 kfree(vscsi->cmd_pool); in ibmvscsis_free_cmds()
2888 vscsi->cmd_pool = NULL; in ibmvscsis_free_cmds()
2889 INIT_LIST_HEAD(&vscsi->free_cmd); in ibmvscsis_free_cmds()
2893 * ibmvscsis_service_wait_q() - Service Waiting Queue
2911 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_service_wait_q()
2912 p_timer->timer_pops += 1; in ibmvscsis_service_wait_q()
2913 p_timer->started = false; in ibmvscsis_service_wait_q()
2915 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_service_wait_q()
2924 p_timer = &vscsi->rsp_q_timer; in ibmvscsis_alloctimer()
2925 hrtimer_setup(&p_timer->timer, ibmvscsis_service_wait_q, CLOCK_MONOTONIC, HRTIMER_MODE_REL); in ibmvscsis_alloctimer()
2926 p_timer->started = false; in ibmvscsis_alloctimer()
2927 p_timer->timer_pops = 0; in ibmvscsis_alloctimer()
2936 p_timer = &vscsi->rsp_q_timer; in ibmvscsis_freetimer()
2938 (void)hrtimer_cancel(&p_timer->timer); in ibmvscsis_freetimer()
2940 p_timer->started = false; in ibmvscsis_freetimer()
2941 p_timer->timer_pops = 0; in ibmvscsis_freetimer()
2948 vio_disable_interrupts(vscsi->dma_dev); in ibmvscsis_interrupt()
2949 tasklet_schedule(&vscsi->work_task); in ibmvscsis_interrupt()
2955 * ibmvscsis_enable_change_state() - Set new state based on enabled status
2968 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_enable_change_state()
2969 rc = h_reg_crq(vscsi->dds.unit_id, vscsi->cmd_q.crq_token, bytes); in ibmvscsis_enable_change_state()
2971 vscsi->state = WAIT_CONNECTION; in ibmvscsis_enable_change_state()
2976 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_enable_change_state()
2977 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_enable_change_state()
2984 * ibmvscsis_create_command_q() - Create Command Queue
2998 struct vio_dev *vdev = vscsi->dma_dev; in ibmvscsis_create_command_q()
3003 vscsi->cmd_q.size = pages; in ibmvscsis_create_command_q()
3005 vscsi->cmd_q.base_addr = in ibmvscsis_create_command_q()
3007 if (!vscsi->cmd_q.base_addr) in ibmvscsis_create_command_q()
3008 return -ENOMEM; in ibmvscsis_create_command_q()
3010 vscsi->cmd_q.mask = ((uint)pages * CRQ_PER_PAGE) - 1; in ibmvscsis_create_command_q()
3012 vscsi->cmd_q.crq_token = dma_map_single(&vdev->dev, in ibmvscsis_create_command_q()
3013 vscsi->cmd_q.base_addr, in ibmvscsis_create_command_q()
3015 if (dma_mapping_error(&vdev->dev, vscsi->cmd_q.crq_token)) { in ibmvscsis_create_command_q()
3016 free_page((unsigned long)vscsi->cmd_q.base_addr); in ibmvscsis_create_command_q()
3017 return -ENOMEM; in ibmvscsis_create_command_q()
3024 * ibmvscsis_destroy_command_q - Destroy Command Queue
3034 dma_unmap_single(&vscsi->dma_dev->dev, vscsi->cmd_q.crq_token, in ibmvscsis_destroy_command_q()
3036 free_page((unsigned long)vscsi->cmd_q.base_addr); in ibmvscsis_destroy_command_q()
3037 vscsi->cmd_q.base_addr = NULL; in ibmvscsis_destroy_command_q()
3038 vscsi->state = NO_QUEUE; in ibmvscsis_destroy_command_q()
3044 struct iu_entry *iue = cmd->iue; in ibmvscsis_fast_fail()
3045 struct se_cmd *se_cmd = &cmd->se_cmd; in ibmvscsis_fast_fail()
3046 struct srp_cmd *srp = (struct srp_cmd *)iue->sbuf->buf; in ibmvscsis_fast_fail()
3048 u8 rc = se_cmd->scsi_status; in ibmvscsis_fast_fail()
3050 if (vscsi->fast_fail && (READ_CMD(srp->cdb) || WRITE_CMD(srp->cdb))) in ibmvscsis_fast_fail()
3051 if (scsi_normalize_sense(se_cmd->sense_buffer, in ibmvscsis_fast_fail()
3052 se_cmd->scsi_sense_length, &sshdr)) in ibmvscsis_fast_fail()
3054 (se_cmd->residual_count == 0 || in ibmvscsis_fast_fail()
3055 se_cmd->residual_count == se_cmd->data_length)) { in ibmvscsis_fast_fail()
3057 cmd->flags |= CMD_FAST_FAIL; in ibmvscsis_fast_fail()
3064 * srp_build_response() - Build an SRP response buffer
3075 struct iu_entry *iue = cmd->iue; in srp_build_response()
3076 struct se_cmd *se_cmd = &cmd->se_cmd; in srp_build_response()
3084 spin_lock_bh(&vscsi->intr_lock); in srp_build_response()
3086 rsp = &vio_iu(iue)->srp.rsp; in srp_build_response()
3089 data = rsp->data; in srp_build_response()
3091 rsp->opcode = SRP_RSP; in srp_build_response()
3093 rsp->req_lim_delta = cpu_to_be32(1 + vscsi->credit); in srp_build_response()
3094 rsp->tag = cmd->rsp.tag; in srp_build_response()
3095 rsp->flags = 0; in srp_build_response()
3097 if (cmd->type == SCSI_CDB) { in srp_build_response()
3098 rsp->status = ibmvscsis_fast_fail(vscsi, cmd); in srp_build_response()
3099 if (rsp->status) { in srp_build_response()
3100 dev_dbg(&vscsi->dev, "build_resp: cmd %p, scsi status %d\n", in srp_build_response()
3101 cmd, (int)rsp->status); in srp_build_response()
3103 if (se_cmd->scsi_sense_length && se_cmd->sense_buffer) { in srp_build_response()
3104 rsp->sense_data_len = in srp_build_response()
3105 cpu_to_be32(se_cmd->scsi_sense_length); in srp_build_response()
3106 rsp->flags |= SRP_RSP_FLAG_SNSVALID; in srp_build_response()
3107 len += se_cmd->scsi_sense_length; in srp_build_response()
3108 memcpy(data, se_cmd->sense_buffer, in srp_build_response()
3109 se_cmd->scsi_sense_length); in srp_build_response()
3111 rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> in srp_build_response()
3113 } else if (cmd->flags & CMD_FAST_FAIL) { in srp_build_response()
3114 dev_dbg(&vscsi->dev, "build_resp: cmd %p, fast fail\n", in srp_build_response()
3116 rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> in srp_build_response()
3119 rsp->sol_not = (cmd->rsp.sol_not & SCSOLNT) >> in srp_build_response()
3124 rsp->status = 0; in srp_build_response()
3125 rsp->resp_data_len = cpu_to_be32(4); in srp_build_response()
3126 rsp->flags |= SRP_RSP_FLAG_RSPVALID; in srp_build_response()
3128 switch (se_cmd->se_tmr_req->response) { in srp_build_response()
3132 rsp->sol_not = (cmd->rsp.sol_not & SCSOLNT) >> in srp_build_response()
3138 rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> in srp_build_response()
3145 rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> in srp_build_response()
3157 rc = h_copy_rdma(len, vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma, in srp_build_response()
3158 vscsi->dds.window[REMOTE].liobn, in srp_build_response()
3159 be64_to_cpu(iue->remote_token)); in srp_build_response()
3163 vscsi->credit = 0; in srp_build_response()
3168 vscsi->flags |= RESPONSE_Q_DOWN | CLIENT_FAILED; in srp_build_response()
3170 dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld, flags 0x%x, state 0x%hx\n", in srp_build_response()
3171 rc, vscsi->flags, vscsi->state); in srp_build_response()
3176 dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld\n", in srp_build_response()
3181 spin_unlock_bh(&vscsi->intr_lock); in srp_build_response()
3190 struct iu_entry *iue = cmd->iue; in ibmvscsis_rdma()
3191 struct srp_target *target = iue->target; in ibmvscsis_rdma()
3192 struct scsi_info *vscsi = target->ldata; in ibmvscsis_rdma()
3213 dev_err(&vscsi->dev, "rdma: ran out of client memory descriptors\n"); in ibmvscsis_rdma()
3214 rc = -EIO; in ibmvscsis_rdma()
3222 dev_err(&vscsi->dev, "rdma: ran out of scatter/gather list\n"); in ibmvscsis_rdma()
3223 rc = -EIO; in ibmvscsis_rdma()
3244 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_rdma()
3246 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_rdma()
3258 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_rdma()
3260 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_rdma()
3270 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_rdma()
3271 vscsi->flags |= in ibmvscsis_rdma()
3273 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_rdma()
3275 dev_err(&vscsi->dev, "rdma: h_copy_rdma failed, rc %ld\n", in ibmvscsis_rdma()
3280 dev_err(&vscsi->dev, "rdma: unknown error %ld from h_copy_rdma\n", in ibmvscsis_rdma()
3286 tx_len -= buf_len; in ibmvscsis_rdma()
3288 client_len -= buf_len; in ibmvscsis_rdma()
3294 server_len -= buf_len; in ibmvscsis_rdma()
3309 * ibmvscsis_handle_crq() - Handle CRQ
3326 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3328 dev_dbg(&vscsi->dev, "got interrupt\n"); in ibmvscsis_handle_crq()
3336 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_handle_crq()
3338 dev_dbg(&vscsi->dev, "handle_crq, don't process: flags 0x%x, state 0x%hx\n", in ibmvscsis_handle_crq()
3339 vscsi->flags, vscsi->state); in ibmvscsis_handle_crq()
3340 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3344 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_handle_crq()
3345 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_handle_crq()
3346 valid = crq->valid; in ibmvscsis_handle_crq()
3357 vscsi->cmd_q.index = in ibmvscsis_handle_crq()
3358 (vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask; in ibmvscsis_handle_crq()
3363 if ((uint)crq->valid == VALID_TRANS_EVENT) { in ibmvscsis_handle_crq()
3371 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_handle_crq()
3379 if (vscsi->cmd_q.index) in ibmvscsis_handle_crq()
3380 vscsi->cmd_q.index -= 1; in ibmvscsis_handle_crq()
3386 vscsi->cmd_q.index = vscsi->cmd_q.mask; in ibmvscsis_handle_crq()
3391 crq->valid = INVALIDATE_CMD_RESP_EL; in ibmvscsis_handle_crq()
3393 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_handle_crq()
3394 valid = crq->valid; in ibmvscsis_handle_crq()
3400 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_handle_crq()
3402 dev_dbg(&vscsi->dev, "handle_crq, reenabling interrupts\n"); in ibmvscsis_handle_crq()
3404 valid = crq->valid; in ibmvscsis_handle_crq()
3409 dev_dbg(&vscsi->dev, "handle_crq, error: flags 0x%x, state 0x%hx, crq index 0x%x\n", in ibmvscsis_handle_crq()
3410 vscsi->flags, vscsi->state, vscsi->cmd_q.index); in ibmvscsis_handle_crq()
3413 dev_dbg(&vscsi->dev, "Leaving handle_crq: schedule_q empty %d, flags 0x%x, state 0x%hx\n", in ibmvscsis_handle_crq()
3414 (int)list_empty(&vscsi->schedule_q), vscsi->flags, in ibmvscsis_handle_crq()
3415 vscsi->state); in ibmvscsis_handle_crq()
3417 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3429 rc = -ENOMEM; in ibmvscsis_probe()
3430 dev_err(&vdev->dev, "probe: allocation of adapter failed\n"); in ibmvscsis_probe()
3434 vscsi->dma_dev = vdev; in ibmvscsis_probe()
3435 vscsi->dev = vdev->dev; in ibmvscsis_probe()
3436 INIT_LIST_HEAD(&vscsi->schedule_q); in ibmvscsis_probe()
3437 INIT_LIST_HEAD(&vscsi->waiting_rsp); in ibmvscsis_probe()
3438 INIT_LIST_HEAD(&vscsi->active_q); in ibmvscsis_probe()
3440 snprintf(vscsi->tport.tport_name, IBMVSCSIS_NAMELEN, "%s", in ibmvscsis_probe()
3441 dev_name(&vdev->dev)); in ibmvscsis_probe()
3443 dev_dbg(&vscsi->dev, "probe tport_name: %s\n", vscsi->tport.tport_name); in ibmvscsis_probe()
3448 dev_dbg(&vscsi->dev, "Probe: liobn 0x%x, riobn 0x%x\n", in ibmvscsis_probe()
3449 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_probe()
3450 vscsi->dds.window[REMOTE].liobn); in ibmvscsis_probe()
3452 snprintf(vscsi->eye, sizeof(vscsi->eye), "VSCSI %s", vdev->name); in ibmvscsis_probe()
3454 vscsi->dds.unit_id = vdev->unit_address; in ibmvscsis_probe()
3455 strscpy(vscsi->dds.partition_name, partition_name, in ibmvscsis_probe()
3456 sizeof(vscsi->dds.partition_name)); in ibmvscsis_probe()
3457 vscsi->dds.partition_num = partition_number; in ibmvscsis_probe()
3460 list_add_tail(&vscsi->list, &ibmvscsis_dev_list); in ibmvscsis_probe()
3467 vscsi->request_limit = INITIAL_SRP_LIMIT; in ibmvscsis_probe()
3468 rc = srp_target_alloc(&vscsi->target, &vdev->dev, vscsi->request_limit, in ibmvscsis_probe()
3473 vscsi->target.ldata = vscsi; in ibmvscsis_probe()
3475 rc = ibmvscsis_alloc_cmds(vscsi, vscsi->request_limit); in ibmvscsis_probe()
3477 dev_err(&vscsi->dev, "alloc_cmds failed, rc %d, num %d\n", in ibmvscsis_probe()
3478 rc, vscsi->request_limit); in ibmvscsis_probe()
3486 spin_lock_init(&vscsi->intr_lock); in ibmvscsis_probe()
3490 dev_err(&vscsi->dev, "probe: alloctimer failed, rc %d\n", rc); in ibmvscsis_probe()
3496 dev_err(&vscsi->dev, "probe: create_command_q failed, rc %d\n", in ibmvscsis_probe()
3501 vscsi->map_buf = kzalloc(PAGE_SIZE, GFP_KERNEL); in ibmvscsis_probe()
3502 if (!vscsi->map_buf) { in ibmvscsis_probe()
3503 rc = -ENOMEM; in ibmvscsis_probe()
3504 dev_err(&vscsi->dev, "probe: allocating cmd buffer failed\n"); in ibmvscsis_probe()
3508 vscsi->map_ioba = dma_map_single(&vdev->dev, vscsi->map_buf, PAGE_SIZE, in ibmvscsis_probe()
3510 if (dma_mapping_error(&vdev->dev, vscsi->map_ioba)) { in ibmvscsis_probe()
3511 rc = -ENOMEM; in ibmvscsis_probe()
3512 dev_err(&vscsi->dev, "probe: error mapping command buffer\n"); in ibmvscsis_probe()
3516 hrc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO, in ibmvscsis_probe()
3517 (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0, in ibmvscsis_probe()
3520 vscsi->client_data.partition_number = in ibmvscsis_probe()
3521 be64_to_cpu(*(u64 *)vscsi->map_buf); in ibmvscsis_probe()
3527 dev_dbg(&vscsi->dev, "probe hrc %ld, client partition num %d\n", in ibmvscsis_probe()
3528 hrc, vscsi->client_data.partition_number); in ibmvscsis_probe()
3530 tasklet_init(&vscsi->work_task, ibmvscsis_handle_crq, in ibmvscsis_probe()
3533 init_completion(&vscsi->wait_idle); in ibmvscsis_probe()
3534 init_completion(&vscsi->unconfig); in ibmvscsis_probe()
3536 vscsi->work_q = alloc_workqueue("ibmvscsis%s", WQ_MEM_RECLAIM, 1, in ibmvscsis_probe()
3537 dev_name(&vdev->dev)); in ibmvscsis_probe()
3538 if (!vscsi->work_q) { in ibmvscsis_probe()
3539 rc = -ENOMEM; in ibmvscsis_probe()
3540 dev_err(&vscsi->dev, "create_workqueue failed\n"); in ibmvscsis_probe()
3544 rc = request_irq(vdev->irq, ibmvscsis_interrupt, 0, "ibmvscsis", vscsi); in ibmvscsis_probe()
3546 rc = -EPERM; in ibmvscsis_probe()
3547 dev_err(&vscsi->dev, "probe: request_irq failed, rc %d\n", rc); in ibmvscsis_probe()
3551 vscsi->state = WAIT_ENABLED; in ibmvscsis_probe()
3553 dev_set_drvdata(&vdev->dev, vscsi); in ibmvscsis_probe()
3558 destroy_workqueue(vscsi->work_q); in ibmvscsis_probe()
3560 dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE, in ibmvscsis_probe()
3563 kfree(vscsi->map_buf); in ibmvscsis_probe()
3565 tasklet_kill(&vscsi->work_task); in ibmvscsis_probe()
3573 srp_target_free(&vscsi->target); in ibmvscsis_probe()
3576 list_del(&vscsi->list); in ibmvscsis_probe()
3586 struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev); in ibmvscsis_remove()
3588 dev_dbg(&vscsi->dev, "remove (%s)\n", dev_name(&vscsi->dma_dev->dev)); in ibmvscsis_remove()
3590 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_remove()
3592 vscsi->flags |= CFG_SLEEPING; in ibmvscsis_remove()
3593 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_remove()
3594 wait_for_completion(&vscsi->unconfig); in ibmvscsis_remove()
3597 free_irq(vdev->irq, vscsi); in ibmvscsis_remove()
3598 destroy_workqueue(vscsi->work_q); in ibmvscsis_remove()
3599 dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE, in ibmvscsis_remove()
3601 kfree(vscsi->map_buf); in ibmvscsis_remove()
3602 tasklet_kill(&vscsi->work_task); in ibmvscsis_remove()
3606 srp_target_free(&vscsi->target); in ibmvscsis_remove()
3608 list_del(&vscsi->list); in ibmvscsis_remove()
3624 return sysfs_emit(buf, "%x\n", vscsi->dma_dev->unit_address); in unit_address_show()
3635 return -ENOENT; in ibmvscsis_get_system_info()
3638 id = of_get_property(rootdn, "system-id", NULL); in ibmvscsis_get_system_info()
3640 snprintf(system_id, sizeof(system_id), "%s-%s", model, id); in ibmvscsis_get_system_info()
3642 name = of_get_property(rootdn, "ibm,partition-name", NULL); in ibmvscsis_get_system_info()
3646 num = of_get_property(rootdn, "ibm,partition-no", NULL); in ibmvscsis_get_system_info()
3656 mvds = of_get_property(vdevdn, "ibm,max-virtual-dma-size", in ibmvscsis_get_system_info()
3671 return tport->tport_name; in ibmvscsis_get_fabric_wwn()
3679 return tport->tport_tpgt; in ibmvscsis_get_tag()
3701 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_release_cmd()
3703 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_release_cmd()
3705 list_move_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_release_cmd()
3707 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_release_cmd()
3714 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_write_pending()
3715 struct iu_entry *iue = cmd->iue; in ibmvscsis_write_pending()
3723 if ((vscsi->flags & (CLIENT_FAILED | RESPONSE_Q_DOWN))) { in ibmvscsis_write_pending()
3724 dev_err(&vscsi->dev, "write_pending failed since: %d\n", in ibmvscsis_write_pending()
3725 vscsi->flags); in ibmvscsis_write_pending()
3726 return -EIO; in ibmvscsis_write_pending()
3730 rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma, in ibmvscsis_write_pending()
3733 dev_err(&vscsi->dev, "srp_transfer_data() failed: %d\n", rc); in ibmvscsis_write_pending()
3734 return -EIO; in ibmvscsis_write_pending()
3748 struct iu_entry *iue = cmd->iue; in ibmvscsis_queue_data_in()
3749 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_data_in()
3753 rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma, 1, in ibmvscsis_queue_data_in()
3756 dev_err(&vscsi->dev, "srp_transfer_data failed: %d\n", rc); in ibmvscsis_queue_data_in()
3757 se_cmd->scsi_sense_length = 18; in ibmvscsis_queue_data_in()
3758 memset(se_cmd->sense_buffer, 0, se_cmd->scsi_sense_length); in ibmvscsis_queue_data_in()
3759 /* Logical Unit Communication Time-out asc/ascq = 0x0801 */ in ibmvscsis_queue_data_in()
3760 scsi_build_sense_buffer(0, se_cmd->sense_buffer, MEDIUM_ERROR, in ibmvscsis_queue_data_in()
3765 cmd->rsp.format = SRP_FORMAT; in ibmvscsis_queue_data_in()
3766 cmd->rsp.len = len; in ibmvscsis_queue_data_in()
3775 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_status()
3778 dev_dbg(&vscsi->dev, "queue_status %p\n", se_cmd); in ibmvscsis_queue_status()
3781 cmd->rsp.format = SRP_FORMAT; in ibmvscsis_queue_status()
3782 cmd->rsp.len = len; in ibmvscsis_queue_status()
3791 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_tm_rsp()
3793 struct iu_entry *iue = iue = cmd->iue; in ibmvscsis_queue_tm_rsp()
3794 struct srp_tsk_mgmt *srp_tsk = &vio_iu(iue)->srp.tsk_mgmt; in ibmvscsis_queue_tm_rsp()
3795 u64 tag_to_abort = be64_to_cpu(srp_tsk->task_tag); in ibmvscsis_queue_tm_rsp()
3798 dev_dbg(&vscsi->dev, "queue_tm_rsp %p, status %d\n", in ibmvscsis_queue_tm_rsp()
3799 se_cmd, (int)se_cmd->se_tmr_req->response); in ibmvscsis_queue_tm_rsp()
3801 if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK && in ibmvscsis_queue_tm_rsp()
3802 cmd->se_cmd.se_tmr_req->response == TMR_TASK_DOES_NOT_EXIST) { in ibmvscsis_queue_tm_rsp()
3803 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_queue_tm_rsp()
3804 list_for_each_entry(cmd_itr, &vscsi->active_q, list) { in ibmvscsis_queue_tm_rsp()
3805 if (tag_to_abort == cmd_itr->se_cmd.tag) { in ibmvscsis_queue_tm_rsp()
3806 cmd_itr->abort_cmd = cmd; in ibmvscsis_queue_tm_rsp()
3807 cmd->flags |= DELAY_SEND; in ibmvscsis_queue_tm_rsp()
3811 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_queue_tm_rsp()
3815 cmd->rsp.format = SRP_FORMAT; in ibmvscsis_queue_tm_rsp()
3816 cmd->rsp.len = len; in ibmvscsis_queue_tm_rsp()
3823 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_aborted_task()
3825 dev_dbg(&vscsi->dev, "ibmvscsis_aborted_task %p task_tag: %llu\n", in ibmvscsis_aborted_task()
3826 se_cmd, se_cmd->tag); in ibmvscsis_aborted_task()
3839 tport->tport_proto_id = SCSI_PROTOCOL_SRP; in ibmvscsis_make_tport()
3840 dev_dbg(&vscsi->dev, "make_tport(%s), pointer:%p, tport_id:%x\n", in ibmvscsis_make_tport()
3841 name, tport, tport->tport_proto_id); in ibmvscsis_make_tport()
3842 return &tport->tport_wwn; in ibmvscsis_make_tport()
3845 return ERR_PTR(-EINVAL); in ibmvscsis_make_tport()
3855 dev_dbg(&vscsi->dev, "drop_tport(%s)\n", in ibmvscsis_drop_tport()
3856 config_item_name(&tport->tport_wwn.wwn_group.cg_item)); in ibmvscsis_drop_tport()
3868 return ERR_PTR(-EINVAL); in ibmvscsis_make_tpg()
3872 tport->tport_tpgt = tpgt; in ibmvscsis_make_tpg()
3874 tport->releasing = false; in ibmvscsis_make_tpg()
3876 rc = core_tpg_register(&tport->tport_wwn, &tport->se_tpg, in ibmvscsis_make_tpg()
3877 tport->tport_proto_id); in ibmvscsis_make_tpg()
3881 return &tport->se_tpg; in ibmvscsis_make_tpg()
3890 tport->releasing = true; in ibmvscsis_drop_tpg()
3891 tport->enabled = false; in ibmvscsis_drop_tpg()
3925 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_enable_tpg()
3926 tport->enabled = true; in ibmvscsis_enable_tpg()
3929 dev_err(&vscsi->dev, "enable_change_state failed, rc %ld state %d\n", in ibmvscsis_enable_tpg()
3930 lrc, vscsi->state); in ibmvscsis_enable_tpg()
3931 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_enable_tpg()
3933 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_enable_tpg()
3934 tport->enabled = false; in ibmvscsis_enable_tpg()
3937 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_enable_tpg()
3998 { "v-scsi-host", "IBM,v-scsi-host" },
4011 * ibmvscsis_init() - Kernel Module initialization
4014 * of those callback functions calls TCM - Linux IO Target Subsystem, thus