Lines Matching refs:vscsi

52 static long ibmvscsis_parse_command(struct scsi_info *vscsi,
55 static void ibmvscsis_adapter_idle(struct scsi_info *vscsi);
99 static bool connection_broken(struct scsi_info *vscsi) in connection_broken() argument
112 h_return_code = h_send_crq(vscsi->dds.unit_id, in connection_broken()
116 dev_dbg(&vscsi->dev, "Connection_broken: rc %ld\n", h_return_code); in connection_broken()
139 static long ibmvscsis_unregister_command_q(struct scsi_info *vscsi) in ibmvscsis_unregister_command_q() argument
146 qrc = h_free_crq(vscsi->dds.unit_id); in ibmvscsis_unregister_command_q()
149 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_unregister_command_q()
150 vscsi->flags &= ~PREP_FOR_SUSPEND_FLAGS; in ibmvscsis_unregister_command_q()
151 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_unregister_command_q()
156 dev_err(&vscsi->dev, "unregister_command_q: error from h_free_crq %ld\n", in ibmvscsis_unregister_command_q()
188 dev_err(&vscsi->dev, "unregister_command_q: unknown error %ld from h_free_crq\n", in ibmvscsis_unregister_command_q()
200 dev_err(&vscsi->dev, "Excessive wait for h_free_crq\n"); in ibmvscsis_unregister_command_q()
204 dev_dbg(&vscsi->dev, "Freeing CRQ: phyp rc %ld, rc %ld\n", qrc, rc); in ibmvscsis_unregister_command_q()
219 static void ibmvscsis_delete_client_info(struct scsi_info *vscsi, in ibmvscsis_delete_client_info() argument
222 vscsi->client_cap = 0; in ibmvscsis_delete_client_info()
230 vscsi->client_data.os_type = 0; in ibmvscsis_delete_client_info()
252 static long ibmvscsis_free_command_q(struct scsi_info *vscsi) in ibmvscsis_free_command_q() argument
259 if (!(vscsi->flags & CRQ_CLOSED)) { in ibmvscsis_free_command_q()
260 vio_disable_interrupts(vscsi->dma_dev); in ibmvscsis_free_command_q()
262 state_under_lock = vscsi->new_state; in ibmvscsis_free_command_q()
263 flags_under_lock = vscsi->flags; in ibmvscsis_free_command_q()
264 vscsi->phyp_acr_state = 0; in ibmvscsis_free_command_q()
265 vscsi->phyp_acr_flags = 0; in ibmvscsis_free_command_q()
267 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_free_command_q()
268 rc = ibmvscsis_unregister_command_q(vscsi); in ibmvscsis_free_command_q()
269 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_free_command_q()
271 if (state_under_lock != vscsi->new_state) in ibmvscsis_free_command_q()
272 vscsi->phyp_acr_state = vscsi->new_state; in ibmvscsis_free_command_q()
274 vscsi->phyp_acr_flags = ((~flags_under_lock) & vscsi->flags); in ibmvscsis_free_command_q()
277 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_free_command_q()
278 memset(vscsi->cmd_q.base_addr, 0, bytes); in ibmvscsis_free_command_q()
279 vscsi->cmd_q.index = 0; in ibmvscsis_free_command_q()
280 vscsi->flags |= CRQ_CLOSED; in ibmvscsis_free_command_q()
282 ibmvscsis_delete_client_info(vscsi, false); in ibmvscsis_free_command_q()
285 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()
286 vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, in ibmvscsis_free_command_q()
287 vscsi->phyp_acr_state); in ibmvscsis_free_command_q()
330 static long ibmvscsis_send_init_message(struct scsi_info *vscsi, u8 format) in ibmvscsis_send_init_message() argument
339 rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]), in ibmvscsis_send_init_message()
357 static long ibmvscsis_check_init_msg(struct scsi_info *vscsi, uint *format) in ibmvscsis_check_init_msg() argument
362 crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask, &vscsi->cmd_q.index, in ibmvscsis_check_init_msg()
363 vscsi->cmd_q.base_addr); in ibmvscsis_check_init_msg()
376 crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask, in ibmvscsis_check_init_msg()
377 &vscsi->cmd_q.index, in ibmvscsis_check_init_msg()
378 vscsi->cmd_q.base_addr); in ibmvscsis_check_init_msg()
410 struct scsi_info *vscsi = container_of(work, struct scsi_info, in ibmvscsis_disconnect() local
415 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
416 new_state = vscsi->new_state; in ibmvscsis_disconnect()
417 vscsi->new_state = 0; in ibmvscsis_disconnect()
419 vscsi->flags |= DISCONNECT_SCHEDULED; in ibmvscsis_disconnect()
420 vscsi->flags &= ~SCHEDULE_DISCONNECT; in ibmvscsis_disconnect()
422 dev_dbg(&vscsi->dev, "disconnect: flags 0x%x, state 0x%hx\n", in ibmvscsis_disconnect()
423 vscsi->flags, vscsi->state); in ibmvscsis_disconnect()
429 switch (vscsi->state) { in ibmvscsis_disconnect()
442 vscsi->state = new_state; in ibmvscsis_disconnect()
453 vscsi->state = new_state; in ibmvscsis_disconnect()
466 vscsi->state = new_state; in ibmvscsis_disconnect()
472 vscsi->state = new_state; in ibmvscsis_disconnect()
473 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_disconnect()
474 vscsi->flags &= ~(SCHEDULE_DISCONNECT | in ibmvscsis_disconnect()
477 if (vscsi->flags & CFG_SLEEPING) { in ibmvscsis_disconnect()
478 vscsi->flags &= ~CFG_SLEEPING; in ibmvscsis_disconnect()
479 complete(&vscsi->unconfig); in ibmvscsis_disconnect()
487 dev_err(&vscsi->dev, "disconnect: invalid state %d for WAIT_IDLE\n", in ibmvscsis_disconnect()
488 vscsi->state); in ibmvscsis_disconnect()
496 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_disconnect()
497 vscsi->state = new_state; in ibmvscsis_disconnect()
498 vscsi->flags &= ~(SCHEDULE_DISCONNECT | in ibmvscsis_disconnect()
500 ibmvscsis_free_command_q(vscsi); in ibmvscsis_disconnect()
504 vscsi->state = new_state; in ibmvscsis_disconnect()
521 vscsi->state = new_state; in ibmvscsis_disconnect()
527 vscsi->state = new_state; in ibmvscsis_disconnect()
534 dev_dbg(&vscsi->dev, "disconnect start wait, active %d, sched %d\n", in ibmvscsis_disconnect()
535 (int)list_empty(&vscsi->active_q), in ibmvscsis_disconnect()
536 (int)list_empty(&vscsi->schedule_q)); in ibmvscsis_disconnect()
537 if (!list_empty(&vscsi->active_q) || in ibmvscsis_disconnect()
538 !list_empty(&vscsi->schedule_q)) { in ibmvscsis_disconnect()
539 vscsi->flags |= WAIT_FOR_IDLE; in ibmvscsis_disconnect()
540 dev_dbg(&vscsi->dev, "disconnect flags 0x%x\n", in ibmvscsis_disconnect()
541 vscsi->flags); in ibmvscsis_disconnect()
546 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
547 wait_for_completion(&vscsi->wait_idle); in ibmvscsis_disconnect()
548 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
550 dev_dbg(&vscsi->dev, "disconnect stop wait\n"); in ibmvscsis_disconnect()
552 ibmvscsis_adapter_idle(vscsi); in ibmvscsis_disconnect()
555 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_disconnect()
571 static void ibmvscsis_post_disconnect(struct scsi_info *vscsi, uint new_state, in ibmvscsis_post_disconnect() argument
585 dev_err(&vscsi->dev, "post_disconnect: Invalid new state %d\n", in ibmvscsis_post_disconnect()
590 vscsi->flags |= flag_bits; in ibmvscsis_post_disconnect()
592 …dev_dbg(&vscsi->dev, "post_disconnect: new_state 0x%x, flag_bits 0x%x, vscsi->flags 0x%x, state %h… in ibmvscsis_post_disconnect()
593 new_state, flag_bits, vscsi->flags, vscsi->state); in ibmvscsis_post_disconnect()
595 if (!(vscsi->flags & (DISCONNECT_SCHEDULED | SCHEDULE_DISCONNECT))) { in ibmvscsis_post_disconnect()
596 vscsi->flags |= SCHEDULE_DISCONNECT; in ibmvscsis_post_disconnect()
597 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
599 INIT_WORK(&vscsi->proc_work, ibmvscsis_disconnect); in ibmvscsis_post_disconnect()
600 (void)queue_work(vscsi->work_q, &vscsi->proc_work); in ibmvscsis_post_disconnect()
602 if (vscsi->new_state) in ibmvscsis_post_disconnect()
603 state = vscsi->new_state; in ibmvscsis_post_disconnect()
605 state = vscsi->state; in ibmvscsis_post_disconnect()
616 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
623 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
635 vscsi->new_state = new_state; in ibmvscsis_post_disconnect()
643 dev_dbg(&vscsi->dev, "Leaving post_disconnect: flags 0x%x, new_state 0x%x\n", in ibmvscsis_post_disconnect()
644 vscsi->flags, vscsi->new_state); in ibmvscsis_post_disconnect()
653 static long ibmvscsis_handle_init_compl_msg(struct scsi_info *vscsi) in ibmvscsis_handle_init_compl_msg() argument
657 switch (vscsi->state) { in ibmvscsis_handle_init_compl_msg()
668 vscsi->state = CONNECTED; in ibmvscsis_handle_init_compl_msg()
677 dev_err(&vscsi->dev, "init_msg: invalid state %d to get init compl msg\n", in ibmvscsis_handle_init_compl_msg()
678 vscsi->state); in ibmvscsis_handle_init_compl_msg()
679 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_handle_init_compl_msg()
692 static long ibmvscsis_handle_init_msg(struct scsi_info *vscsi) in ibmvscsis_handle_init_msg() argument
696 switch (vscsi->state) { in ibmvscsis_handle_init_msg()
698 rc = ibmvscsis_send_init_message(vscsi, INIT_COMPLETE_MSG); in ibmvscsis_handle_init_msg()
701 vscsi->state = CONNECTED; in ibmvscsis_handle_init_msg()
705 dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
707 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0); in ibmvscsis_handle_init_msg()
711 dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
714 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_handle_init_msg()
719 dev_warn(&vscsi->dev, "init_msg: failed to send, rc %ld\n", in ibmvscsis_handle_init_msg()
743 dev_err(&vscsi->dev, "init_msg: invalid state %d to get init msg\n", in ibmvscsis_handle_init_msg()
744 vscsi->state); in ibmvscsis_handle_init_msg()
745 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_handle_init_msg()
760 static long ibmvscsis_init_msg(struct scsi_info *vscsi, struct viosrp_crq *crq) in ibmvscsis_init_msg() argument
764 dev_dbg(&vscsi->dev, "init_msg: state 0x%hx\n", vscsi->state); in ibmvscsis_init_msg()
766 rc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO, in ibmvscsis_init_msg()
767 (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0, in ibmvscsis_init_msg()
770 vscsi->client_data.partition_number = in ibmvscsis_init_msg()
771 be64_to_cpu(*(u64 *)vscsi->map_buf); in ibmvscsis_init_msg()
772 dev_dbg(&vscsi->dev, "init_msg, part num %d\n", in ibmvscsis_init_msg()
773 vscsi->client_data.partition_number); in ibmvscsis_init_msg()
775 dev_dbg(&vscsi->dev, "init_msg h_vioctl rc %ld\n", rc); in ibmvscsis_init_msg()
780 rc = ibmvscsis_handle_init_msg(vscsi); in ibmvscsis_init_msg()
782 rc = ibmvscsis_handle_init_compl_msg(vscsi); in ibmvscsis_init_msg()
785 dev_err(&vscsi->dev, "init_msg: invalid format %d\n", in ibmvscsis_init_msg()
787 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_init_msg()
799 static long ibmvscsis_establish_new_q(struct scsi_info *vscsi) in ibmvscsis_establish_new_q() argument
804 rc = h_vioctl(vscsi->dds.unit_id, H_ENABLE_PREPARE_FOR_SUSPEND, 30000, in ibmvscsis_establish_new_q()
807 vscsi->flags |= PREP_FOR_SUSPEND_ENABLED; in ibmvscsis_establish_new_q()
809 dev_err(&vscsi->dev, "Error from Enable Prepare for Suspend: %ld\n", in ibmvscsis_establish_new_q()
812 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_establish_new_q()
813 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_establish_new_q()
814 vscsi->debit = 0; in ibmvscsis_establish_new_q()
815 vscsi->credit = 0; in ibmvscsis_establish_new_q()
817 rc = vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_establish_new_q()
819 dev_warn(&vscsi->dev, "establish_new_q: failed to enable interrupts, rc %ld\n", in ibmvscsis_establish_new_q()
824 rc = ibmvscsis_check_init_msg(vscsi, &format); in ibmvscsis_establish_new_q()
826 dev_err(&vscsi->dev, "establish_new_q: check_init_msg failed, rc %ld\n", in ibmvscsis_establish_new_q()
832 rc = ibmvscsis_send_init_message(vscsi, INIT_MSG); in ibmvscsis_establish_new_q()
845 vscsi->state = UNDEFINED; in ibmvscsis_establish_new_q()
850 rc = ibmvscsis_handle_init_msg(vscsi); in ibmvscsis_establish_new_q()
875 static void ibmvscsis_reset_queue(struct scsi_info *vscsi) in ibmvscsis_reset_queue() argument
880 dev_dbg(&vscsi->dev, "reset_queue: flags 0x%x\n", vscsi->flags); in ibmvscsis_reset_queue()
883 if (vscsi->flags & (CLIENT_FAILED | TRANS_EVENT)) { in ibmvscsis_reset_queue()
884 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_reset_queue()
885 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_reset_queue()
886 vscsi->debit = 0; in ibmvscsis_reset_queue()
887 vscsi->credit = 0; in ibmvscsis_reset_queue()
888 vscsi->state = WAIT_CONNECTION; in ibmvscsis_reset_queue()
889 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_reset_queue()
891 rc = ibmvscsis_free_command_q(vscsi); in ibmvscsis_reset_queue()
893 vscsi->state = WAIT_CONNECTION; in ibmvscsis_reset_queue()
895 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_reset_queue()
896 rc = h_reg_crq(vscsi->dds.unit_id, in ibmvscsis_reset_queue()
897 vscsi->cmd_q.crq_token, bytes); in ibmvscsis_reset_queue()
899 rc = ibmvscsis_establish_new_q(vscsi); in ibmvscsis_reset_queue()
903 dev_dbg(&vscsi->dev, "reset_queue: reg_crq rc %ld\n", in ibmvscsis_reset_queue()
906 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_reset_queue()
907 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_reset_queue()
908 ibmvscsis_free_command_q(vscsi); in ibmvscsis_reset_queue()
911 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_reset_queue()
912 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_reset_queue()
924 static void ibmvscsis_free_cmd_resources(struct scsi_info *vscsi, in ibmvscsis_free_cmd_resources() argument
936 if (vscsi->debit) in ibmvscsis_free_cmd_resources()
937 vscsi->debit -= 1; in ibmvscsis_free_cmd_resources()
940 vscsi->flags &= ~PROCESSING_MAD; in ibmvscsis_free_cmd_resources()
945 dev_err(&vscsi->dev, "free_cmd_resources unknown type %d\n", in ibmvscsis_free_cmd_resources()
951 list_add_tail(&cmd->list, &vscsi->free_cmd); in ibmvscsis_free_cmd_resources()
954 if (list_empty(&vscsi->active_q) && list_empty(&vscsi->schedule_q) && in ibmvscsis_free_cmd_resources()
955 list_empty(&vscsi->waiting_rsp) && (vscsi->flags & WAIT_FOR_IDLE)) { in ibmvscsis_free_cmd_resources()
956 vscsi->flags &= ~WAIT_FOR_IDLE; in ibmvscsis_free_cmd_resources()
957 complete(&vscsi->wait_idle); in ibmvscsis_free_cmd_resources()
975 static long ibmvscsis_ready_for_suspend(struct scsi_info *vscsi, bool idle) in ibmvscsis_ready_for_suspend() argument
981 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_ready_for_suspend()
983 dev_dbg(&vscsi->dev, "ready_suspend: flags 0x%x, state 0x%hx crq_valid:%x\n", in ibmvscsis_ready_for_suspend()
984 vscsi->flags, vscsi->state, (int)crq->valid); in ibmvscsis_ready_for_suspend()
986 if (!(vscsi->flags & PREP_FOR_SUSPEND_ABORTED) && !(crq->valid)) { in ibmvscsis_ready_for_suspend()
987 rc = h_vioctl(vscsi->dds.unit_id, H_READY_FOR_SUSPEND, 0, 0, 0, in ibmvscsis_ready_for_suspend()
990 dev_err(&vscsi->dev, "Ready for Suspend Vioctl failed: %ld\n", in ibmvscsis_ready_for_suspend()
994 } else if (((vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE) && in ibmvscsis_ready_for_suspend()
995 (vscsi->flags & PREP_FOR_SUSPEND_ABORTED)) || in ibmvscsis_ready_for_suspend()
999 vscsi->state = ERR_DISCONNECT_RECONNECT; in ibmvscsis_ready_for_suspend()
1000 ibmvscsis_reset_queue(vscsi); in ibmvscsis_ready_for_suspend()
1002 } else if (vscsi->state == CONNECTED) { in ibmvscsis_ready_for_suspend()
1003 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_ready_for_suspend()
1007 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_ready_for_suspend()
1011 dev_err(&vscsi->dev, "Invalid element in CRQ after Prepare for Suspend"); in ibmvscsis_ready_for_suspend()
1014 vscsi->flags &= ~(PREP_FOR_SUSPEND_PENDING | PREP_FOR_SUSPEND_ABORTED); in ibmvscsis_ready_for_suspend()
1030 static long ibmvscsis_trans_event(struct scsi_info *vscsi, in ibmvscsis_trans_event() argument
1035 dev_dbg(&vscsi->dev, "trans_event: format %d, flags 0x%x, state 0x%hx\n", in ibmvscsis_trans_event()
1036 (int)crq->format, vscsi->flags, vscsi->state); in ibmvscsis_trans_event()
1042 ibmvscsis_delete_client_info(vscsi, true); in ibmvscsis_trans_event()
1044 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1045 switch (vscsi->state) { in ibmvscsis_trans_event()
1052 vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT); in ibmvscsis_trans_event()
1062 ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, in ibmvscsis_trans_event()
1068 if ((vscsi->debit > 0) || in ibmvscsis_trans_event()
1069 !list_empty(&vscsi->schedule_q) || in ibmvscsis_trans_event()
1070 !list_empty(&vscsi->waiting_rsp) || in ibmvscsis_trans_event()
1071 !list_empty(&vscsi->active_q)) { in ibmvscsis_trans_event()
1072 dev_dbg(&vscsi->dev, "debit %d, sched %d, wait %d, active %d\n", in ibmvscsis_trans_event()
1073 vscsi->debit, in ibmvscsis_trans_event()
1074 (int)list_empty(&vscsi->schedule_q), in ibmvscsis_trans_event()
1075 (int)list_empty(&vscsi->waiting_rsp), in ibmvscsis_trans_event()
1076 (int)list_empty(&vscsi->active_q)); in ibmvscsis_trans_event()
1077 dev_warn(&vscsi->dev, "connection lost with outstanding work\n"); in ibmvscsis_trans_event()
1079 dev_dbg(&vscsi->dev, "trans_event: SRP Processing, but no outstanding work\n"); in ibmvscsis_trans_event()
1082 ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, in ibmvscsis_trans_event()
1090 vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT); in ibmvscsis_trans_event()
1096 dev_dbg(&vscsi->dev, "Prep for Suspend, crq status = 0x%x\n", in ibmvscsis_trans_event()
1098 switch (vscsi->state) { in ibmvscsis_trans_event()
1102 ibmvscsis_ready_for_suspend(vscsi, false); in ibmvscsis_trans_event()
1105 vscsi->resume_state = vscsi->state; in ibmvscsis_trans_event()
1106 vscsi->flags |= PREP_FOR_SUSPEND_PENDING; in ibmvscsis_trans_event()
1108 vscsi->flags |= PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1109 ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, 0); in ibmvscsis_trans_event()
1118 dev_err(&vscsi->dev, "Invalid state for Prepare for Suspend Trans Event: 0x%x\n", in ibmvscsis_trans_event()
1119 vscsi->state); in ibmvscsis_trans_event()
1125 dev_dbg(&vscsi->dev, "Resume from Suspend, crq status = 0x%x\n", in ibmvscsis_trans_event()
1127 if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) { in ibmvscsis_trans_event()
1128 vscsi->flags |= PREP_FOR_SUSPEND_ABORTED; in ibmvscsis_trans_event()
1131 (vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE)) { in ibmvscsis_trans_event()
1132 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_trans_event()
1135 vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE; in ibmvscsis_trans_event()
1142 dev_err(&vscsi->dev, "trans_event: invalid format %d\n", in ibmvscsis_trans_event()
1144 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, in ibmvscsis_trans_event()
1149 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_trans_event()
1151 dev_dbg(&vscsi->dev, "Leaving trans_event: flags 0x%x, state 0x%hx, rc %ld\n", in ibmvscsis_trans_event()
1152 vscsi->flags, vscsi->state, rc); in ibmvscsis_trans_event()
1167 static void ibmvscsis_poll_cmd_q(struct scsi_info *vscsi) in ibmvscsis_poll_cmd_q() argument
1174 dev_dbg(&vscsi->dev, "poll_cmd_q: flags 0x%x, state 0x%hx, q index %ud\n", in ibmvscsis_poll_cmd_q()
1175 vscsi->flags, vscsi->state, vscsi->cmd_q.index); in ibmvscsis_poll_cmd_q()
1177 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_poll_cmd_q()
1178 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_poll_cmd_q()
1184 vscsi->cmd_q.index = in ibmvscsis_poll_cmd_q()
1185 (vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask; in ibmvscsis_poll_cmd_q()
1188 rc = ibmvscsis_parse_command(vscsi, crq); in ibmvscsis_poll_cmd_q()
1197 rc = ibmvscsis_trans_event(vscsi, crq); in ibmvscsis_poll_cmd_q()
1198 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_poll_cmd_q()
1203 dev_dbg(&vscsi->dev, "poll_cmd_q, ignoring\n"); in ibmvscsis_poll_cmd_q()
1209 if (vscsi->cmd_q.index) in ibmvscsis_poll_cmd_q()
1210 vscsi->cmd_q.index -= 1; in ibmvscsis_poll_cmd_q()
1216 vscsi->cmd_q.index = vscsi->cmd_q.mask; in ibmvscsis_poll_cmd_q()
1223 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_poll_cmd_q()
1230 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_poll_cmd_q()
1232 dev_dbg(&vscsi->dev, "poll_cmd_q, reenabling interrupts\n"); in ibmvscsis_poll_cmd_q()
1240 dev_dbg(&vscsi->dev, "Leaving poll_cmd_q: rc %ld\n", rc); in ibmvscsis_poll_cmd_q()
1253 static void ibmvscsis_free_cmd_qs(struct scsi_info *vscsi) in ibmvscsis_free_cmd_qs() argument
1257 dev_dbg(&vscsi->dev, "free_cmd_qs: waiting_rsp empty %d, timer starter %d\n", in ibmvscsis_free_cmd_qs()
1258 (int)list_empty(&vscsi->waiting_rsp), in ibmvscsis_free_cmd_qs()
1259 vscsi->rsp_q_timer.started); in ibmvscsis_free_cmd_qs()
1261 list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, list) { in ibmvscsis_free_cmd_qs()
1263 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_free_cmd_qs()
1273 static struct ibmvscsis_cmd *ibmvscsis_get_free_cmd(struct scsi_info *vscsi) in ibmvscsis_get_free_cmd() argument
1278 iue = srp_iu_get(&vscsi->target); in ibmvscsis_get_free_cmd()
1280 cmd = list_first_entry_or_null(&vscsi->free_cmd, in ibmvscsis_get_free_cmd()
1311 static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) in ibmvscsis_adapter_idle() argument
1316 dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1317 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1320 if (vscsi->state != WAIT_CONNECTION || vscsi->flags & TRANS_EVENT) in ibmvscsis_adapter_idle()
1323 switch (vscsi->state) { in ibmvscsis_adapter_idle()
1325 ibmvscsis_free_command_q(vscsi); in ibmvscsis_adapter_idle()
1328 if (vscsi->flags & CFG_SLEEPING) { in ibmvscsis_adapter_idle()
1329 vscsi->flags &= ~CFG_SLEEPING; in ibmvscsis_adapter_idle()
1330 complete(&vscsi->unconfig); in ibmvscsis_adapter_idle()
1334 ibmvscsis_reset_queue(vscsi); in ibmvscsis_adapter_idle()
1335 dev_dbg(&vscsi->dev, "adapter_idle, disc_rec: flags 0x%x\n", in ibmvscsis_adapter_idle()
1336 vscsi->flags); in ibmvscsis_adapter_idle()
1340 ibmvscsis_free_command_q(vscsi); in ibmvscsis_adapter_idle()
1341 vscsi->flags &= ~(SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED); in ibmvscsis_adapter_idle()
1342 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_adapter_idle()
1343 if (vscsi->tport.enabled) in ibmvscsis_adapter_idle()
1344 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_adapter_idle()
1346 vscsi->state = WAIT_ENABLED; in ibmvscsis_adapter_idle()
1347 dev_dbg(&vscsi->dev, "adapter_idle, disc: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1348 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1352 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_adapter_idle()
1353 vscsi->debit = 0; in ibmvscsis_adapter_idle()
1354 vscsi->credit = 0; in ibmvscsis_adapter_idle()
1355 if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) { in ibmvscsis_adapter_idle()
1356 vscsi->state = vscsi->resume_state; in ibmvscsis_adapter_idle()
1357 vscsi->resume_state = 0; in ibmvscsis_adapter_idle()
1358 rc = ibmvscsis_ready_for_suspend(vscsi, true); in ibmvscsis_adapter_idle()
1359 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1362 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_adapter_idle()
1363 vscsi->state = WAIT_CONNECTION; in ibmvscsis_adapter_idle()
1364 vscsi->flags &= PRESERVE_FLAG_FIELDS; in ibmvscsis_adapter_idle()
1366 vscsi->state = CONNECTED; in ibmvscsis_adapter_idle()
1367 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1370 dev_dbg(&vscsi->dev, "adapter_idle, wait: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1371 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1372 ibmvscsis_poll_cmd_q(vscsi); in ibmvscsis_adapter_idle()
1376 vscsi->flags &= ~DISCONNECT_SCHEDULED; in ibmvscsis_adapter_idle()
1377 dev_dbg(&vscsi->dev, "adapter_idle, disconnected: flags 0x%x, state 0x%hx\n", in ibmvscsis_adapter_idle()
1378 vscsi->flags, vscsi->state); in ibmvscsis_adapter_idle()
1382 dev_err(&vscsi->dev, "adapter_idle: in invalid state %d\n", in ibmvscsis_adapter_idle()
1383 vscsi->state); in ibmvscsis_adapter_idle()
1388 ibmvscsis_free_cmd_qs(vscsi); in ibmvscsis_adapter_idle()
1408 if (vscsi->phyp_acr_state != 0) { in ibmvscsis_adapter_idle()
1414 vscsi->flags |= vscsi->phyp_acr_flags; in ibmvscsis_adapter_idle()
1415 ibmvscsis_post_disconnect(vscsi, vscsi->phyp_acr_state, 0); in ibmvscsis_adapter_idle()
1416 vscsi->phyp_acr_state = 0; in ibmvscsis_adapter_idle()
1417 vscsi->phyp_acr_flags = 0; in ibmvscsis_adapter_idle()
1419 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()
1420 vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, in ibmvscsis_adapter_idle()
1421 vscsi->phyp_acr_state); in ibmvscsis_adapter_idle()
1424 dev_dbg(&vscsi->dev, "Leaving adapter_idle: flags 0x%x, state 0x%hx, new_state 0x%x\n", in ibmvscsis_adapter_idle()
1425 vscsi->flags, vscsi->state, vscsi->new_state); in ibmvscsis_adapter_idle()
1440 static long ibmvscsis_copy_crq_packet(struct scsi_info *vscsi, in ibmvscsis_copy_crq_packet() argument
1450 dev_err(&vscsi->dev, "copy_crq: Invalid len %d passed", len); in ibmvscsis_copy_crq_packet()
1451 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_copy_crq_packet()
1455 rc = h_copy_rdma(len, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_copy_crq_packet()
1457 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma); in ibmvscsis_copy_crq_packet()
1464 dev_dbg(&vscsi->dev, "copy_crq: ioba 0x%llx, init_time 0x%llx\n", in ibmvscsis_copy_crq_packet()
1468 if (connection_broken(vscsi)) in ibmvscsis_copy_crq_packet()
1469 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_copy_crq_packet()
1474 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_copy_crq_packet()
1477 dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n", in ibmvscsis_copy_crq_packet()
1483 dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n", in ibmvscsis_copy_crq_packet()
1485 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_copy_crq_packet()
1500 static long ibmvscsis_adapter_info(struct scsi_info *vscsi, in ibmvscsis_adapter_info() argument
1516 info = dma_alloc_coherent(&vscsi->dma_dev->dev, sizeof(*info), &token, in ibmvscsis_adapter_info()
1519 dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n", in ibmvscsis_adapter_info()
1527 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_adapter_info()
1529 vscsi->dds.window[LOCAL].liobn, token); in ibmvscsis_adapter_info()
1533 if (connection_broken(vscsi)) in ibmvscsis_adapter_info()
1536 dev_warn(&vscsi->dev, "adapter_info: h_copy_rdma from client failed, rc %ld\n", in ibmvscsis_adapter_info()
1538 dev_dbg(&vscsi->dev, "adapter_info: ioba 0x%llx, flags 0x%x, flag_bits 0x%x\n", in ibmvscsis_adapter_info()
1539 be64_to_cpu(mad->buffer), vscsi->flags, flag_bits); in ibmvscsis_adapter_info()
1540 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, in ibmvscsis_adapter_info()
1550 if (vscsi->client_data.partition_number == 0) in ibmvscsis_adapter_info()
1551 vscsi->client_data.partition_number = in ibmvscsis_adapter_info()
1553 strncpy(vscsi->client_data.srp_version, info->srp_version, in ibmvscsis_adapter_info()
1554 sizeof(vscsi->client_data.srp_version)); in ibmvscsis_adapter_info()
1555 strncpy(vscsi->client_data.partition_name, info->partition_name, in ibmvscsis_adapter_info()
1556 sizeof(vscsi->client_data.partition_name)); in ibmvscsis_adapter_info()
1557 vscsi->client_data.mad_version = be32_to_cpu(info->mad_version); in ibmvscsis_adapter_info()
1558 vscsi->client_data.os_type = be32_to_cpu(info->os_type); in ibmvscsis_adapter_info()
1563 strncpy(info->partition_name, vscsi->dds.partition_name, in ibmvscsis_adapter_info()
1565 info->partition_number = cpu_to_be32(vscsi->dds.partition_num); in ibmvscsis_adapter_info()
1572 rc = h_copy_rdma(sizeof(*info), vscsi->dds.window[LOCAL].liobn, in ibmvscsis_adapter_info()
1573 token, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_adapter_info()
1582 if (connection_broken(vscsi)) in ibmvscsis_adapter_info()
1586 dev_err(&vscsi->dev, "adapter_info: h_copy_rdma to client failed, rc %ld\n", in ibmvscsis_adapter_info()
1588 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_adapter_info()
1595 dma_free_coherent(&vscsi->dma_dev->dev, sizeof(*info), info, token); in ibmvscsis_adapter_info()
1596 dev_dbg(&vscsi->dev, "Leaving adapter_info, rc %ld\n", rc); in ibmvscsis_adapter_info()
1612 static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) in ibmvscsis_cap_mad() argument
1630 dev_warn(&vscsi->dev, "cap_mad: invalid len %d\n", olen); in ibmvscsis_cap_mad()
1635 cap = dma_alloc_coherent(&vscsi->dma_dev->dev, olen, &token, in ibmvscsis_cap_mad()
1638 dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n", in ibmvscsis_cap_mad()
1643 rc = h_copy_rdma(olen, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_cap_mad()
1645 vscsi->dds.window[LOCAL].liobn, token); in ibmvscsis_cap_mad()
1647 strncpy(cap->name, dev_name(&vscsi->dma_dev->dev), in ibmvscsis_cap_mad()
1655 dev_dbg(&vscsi->dev, "cap_mad: len left %hd, cap type %d, cap len %hd\n", in ibmvscsis_cap_mad()
1661 dev_err(&vscsi->dev, "cap_mad: cap len mismatch with total len\n"); in ibmvscsis_cap_mad()
1667 dev_err(&vscsi->dev, "cap_mad: cap len is 0\n"); in ibmvscsis_cap_mad()
1674 dev_dbg(&vscsi->dev, "cap_mad: unsupported capability\n"); in ibmvscsis_cap_mad()
1689 rc = h_copy_rdma(olen, vscsi->dds.window[LOCAL].liobn, token, in ibmvscsis_cap_mad()
1690 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_cap_mad()
1694 dev_dbg(&vscsi->dev, "cap_mad: failed to copy to client, rc %ld\n", in ibmvscsis_cap_mad()
1698 if (connection_broken(vscsi)) in ibmvscsis_cap_mad()
1703 dev_warn(&vscsi->dev, "cap_mad: error copying data to client, rc %ld\n", in ibmvscsis_cap_mad()
1705 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_cap_mad()
1711 dma_free_coherent(&vscsi->dma_dev->dev, olen, cap, token); in ibmvscsis_cap_mad()
1713 dev_dbg(&vscsi->dev, "Leaving cap_mad, rc %ld, client_cap 0x%x\n", in ibmvscsis_cap_mad()
1714 rc, vscsi->client_cap); in ibmvscsis_cap_mad()
1726 static long ibmvscsis_process_mad(struct scsi_info *vscsi, struct iu_entry *iue) in ibmvscsis_process_mad() argument
1735 vscsi->empty_iu_id = be64_to_cpu(empty->buffer); in ibmvscsis_process_mad()
1736 vscsi->empty_iu_tag = be64_to_cpu(empty->common.tag); in ibmvscsis_process_mad()
1740 rc = ibmvscsis_adapter_info(vscsi, iue); in ibmvscsis_process_mad()
1743 rc = ibmvscsis_cap_mad(vscsi, iue); in ibmvscsis_process_mad()
1746 if (vscsi->state == CONNECTED) { in ibmvscsis_process_mad()
1747 vscsi->fast_fail = true; in ibmvscsis_process_mad()
1750 dev_warn(&vscsi->dev, "fast fail mad sent after login\n"); in ibmvscsis_process_mad()
1769 static void srp_snd_msg_failed(struct scsi_info *vscsi, long rc) in srp_snd_msg_failed() argument
1774 ibmvscsis_free_cmd_qs(vscsi); in srp_snd_msg_failed()
1777 vscsi->flags |= CLIENT_FAILED; in srp_snd_msg_failed()
1780 if (!(vscsi->flags & RESPONSE_Q_DOWN)) { in srp_snd_msg_failed()
1781 vscsi->flags |= RESPONSE_Q_DOWN; in srp_snd_msg_failed()
1782 if (!(vscsi->state & (ERR_DISCONNECT | in srp_snd_msg_failed()
1785 … 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()
1786 vscsi->state, vscsi->flags, rc); in srp_snd_msg_failed()
1788 ibmvscsis_post_disconnect(vscsi, in srp_snd_msg_failed()
1808 if ((vscsi->rsp_q_timer.timer_pops < MAX_TIMER_POPS) || in srp_snd_msg_failed()
1809 (vscsi->state == SRP_PROCESSING)) { in srp_snd_msg_failed()
1810 …dev_dbg(&vscsi->dev, "snd_msg_failed: response queue full, flags 0x%x, timer started %d, pops %d\n… in srp_snd_msg_failed()
1811 vscsi->flags, (int)vscsi->rsp_q_timer.started, in srp_snd_msg_failed()
1812 vscsi->rsp_q_timer.timer_pops); in srp_snd_msg_failed()
1818 if (!vscsi->rsp_q_timer.started) { in srp_snd_msg_failed()
1819 if (vscsi->rsp_q_timer.timer_pops < in srp_snd_msg_failed()
1830 vscsi->rsp_q_timer.started = true; in srp_snd_msg_failed()
1831 hrtimer_start(&vscsi->rsp_q_timer.timer, kt, in srp_snd_msg_failed()
1843 vscsi->flags |= RESPONSE_Q_DOWN; in srp_snd_msg_failed()
1844 ibmvscsis_free_cmd_qs(vscsi); in srp_snd_msg_failed()
1850 if (!(vscsi->state & (ERR_DISCONNECT | in srp_snd_msg_failed()
1853 dev_err(&vscsi->dev, "client crq full too long\n"); in srp_snd_msg_failed()
1854 ibmvscsis_post_disconnect(vscsi, in srp_snd_msg_failed()
1872 static void ibmvscsis_send_messages(struct scsi_info *vscsi) in ibmvscsis_send_messages() argument
1883 if (!(vscsi->flags & RESPONSE_Q_DOWN)) { in ibmvscsis_send_messages()
1886 list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, in ibmvscsis_send_messages()
1911 ibmvscsis_free_cmd_resources(vscsi, in ibmvscsis_send_messages()
1931 vscsi->credit += 1; in ibmvscsis_send_messages()
1941 rc = h_send_crq(vscsi->dma_dev->unit_address, in ibmvscsis_send_messages()
1945 dev_dbg(&vscsi->dev, "send_messages: cmd %p, tag 0x%llx, rc %ld\n", in ibmvscsis_send_messages()
1954 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_send_messages()
1957 ibmvscsis_free_cmd_resources(vscsi, in ibmvscsis_send_messages()
1960 srp_snd_msg_failed(vscsi, rc); in ibmvscsis_send_messages()
1973 vscsi->rsp_q_timer.timer_pops = 0; in ibmvscsis_send_messages()
1976 ibmvscsis_free_cmd_qs(vscsi); in ibmvscsis_send_messages()
1981 static void ibmvscsis_send_mad_resp(struct scsi_info *vscsi, in ibmvscsis_send_mad_resp() argument
1992 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma, in ibmvscsis_send_mad_resp()
1993 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_send_mad_resp()
1999 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_send_mad_resp()
2000 ibmvscsis_send_messages(vscsi); in ibmvscsis_send_mad_resp()
2002 dev_dbg(&vscsi->dev, "Error sending mad response, rc %ld\n", in ibmvscsis_send_mad_resp()
2005 if (connection_broken(vscsi)) in ibmvscsis_send_mad_resp()
2008 dev_err(&vscsi->dev, "mad: failed to copy to client, rc %ld\n", in ibmvscsis_send_mad_resp()
2011 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_send_mad_resp()
2012 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, in ibmvscsis_send_mad_resp()
2025 static long ibmvscsis_mad(struct scsi_info *vscsi, struct viosrp_crq *crq) in ibmvscsis_mad() argument
2032 switch (vscsi->state) { in ibmvscsis_mad()
2039 dev_dbg(&vscsi->dev, "mad: in Wait Connection state, ignoring MAD, flags %d\n", in ibmvscsis_mad()
2040 vscsi->flags); in ibmvscsis_mad()
2056 dev_err(&vscsi->dev, "mad: invalid adapter state %d for mad\n", in ibmvscsis_mad()
2057 vscsi->state); in ibmvscsis_mad()
2061 cmd = ibmvscsis_get_free_cmd(vscsi); in ibmvscsis_mad()
2063 dev_err(&vscsi->dev, "mad: failed to get cmd, debit %d\n", in ibmvscsis_mad()
2064 vscsi->debit); in ibmvscsis_mad()
2065 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_mad()
2071 rc = ibmvscsis_copy_crq_packet(vscsi, cmd, crq); in ibmvscsis_mad()
2075 dev_dbg(&vscsi->dev, "mad: type %d\n", be32_to_cpu(mad->type)); in ibmvscsis_mad()
2077 rc = ibmvscsis_process_mad(vscsi, iue); in ibmvscsis_mad()
2079 dev_dbg(&vscsi->dev, "mad: status %hd, rc %ld\n", in ibmvscsis_mad()
2083 ibmvscsis_send_mad_resp(vscsi, cmd, crq); in ibmvscsis_mad()
2085 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_mad()
2088 dev_dbg(&vscsi->dev, "Leaving mad, rc %ld\n", rc); in ibmvscsis_mad()
2100 static long ibmvscsis_login_rsp(struct scsi_info *vscsi, in ibmvscsis_login_rsp() argument
2112 rsp->req_lim_delta = cpu_to_be32(vscsi->request_limit); in ibmvscsis_login_rsp()
2118 vscsi->credit = 0; in ibmvscsis_login_rsp()
2123 rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn, in ibmvscsis_login_rsp()
2124 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_login_rsp()
2132 if (connection_broken(vscsi)) in ibmvscsis_login_rsp()
2134 dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n", in ibmvscsis_login_rsp()
2136 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, in ibmvscsis_login_rsp()
2142 dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n", in ibmvscsis_login_rsp()
2144 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_login_rsp()
2160 static long ibmvscsis_srp_login_rej(struct scsi_info *vscsi, in ibmvscsis_srp_login_rej() argument
2180 rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn, in ibmvscsis_srp_login_rej()
2181 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn, in ibmvscsis_srp_login_rej()
2188 if (connection_broken(vscsi)) in ibmvscsis_srp_login_rej()
2190 dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n", in ibmvscsis_srp_login_rej()
2192 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, in ibmvscsis_srp_login_rej()
2198 dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n", in ibmvscsis_srp_login_rej()
2200 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_srp_login_rej()
2211 struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); in ibmvscsis_make_nexus() local
2215 dev_dbg(&vscsi->dev, "tport->ibmv_nexus already exists\n"); in ibmvscsis_make_nexus()
2221 dev_err(&vscsi->dev, "Unable to allocate struct ibmvscsis_nexus\n"); in ibmvscsis_make_nexus()
2274 static long ibmvscsis_srp_login(struct scsi_info *vscsi, in ibmvscsis_srp_login() argument
2305 if (vscsi->state == SRP_PROCESSING) in ibmvscsis_srp_login()
2308 rc = ibmvscsis_make_nexus(&vscsi->tport); in ibmvscsis_srp_login()
2315 dev_dbg(&vscsi->dev, "srp_login: reason 0x%x\n", reason); in ibmvscsis_srp_login()
2318 rc = ibmvscsis_srp_login_rej(vscsi, cmd, reason); in ibmvscsis_srp_login()
2320 rc = ibmvscsis_login_rsp(vscsi, cmd); in ibmvscsis_srp_login()
2324 vscsi->state = SRP_PROCESSING; in ibmvscsis_srp_login()
2326 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_srp_login()
2327 ibmvscsis_send_messages(vscsi); in ibmvscsis_srp_login()
2329 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_srp_login()
2332 dev_dbg(&vscsi->dev, "Leaving srp_login, rc %ld\n", rc); in ibmvscsis_srp_login()
2348 static long ibmvscsis_srp_i_logout(struct scsi_info *vscsi, in ibmvscsis_srp_i_logout() argument
2355 if ((vscsi->debit > 0) || !list_empty(&vscsi->schedule_q) || in ibmvscsis_srp_i_logout()
2356 !list_empty(&vscsi->waiting_rsp)) { in ibmvscsis_srp_i_logout()
2357 dev_err(&vscsi->dev, "i_logout: outstanding work\n"); in ibmvscsis_srp_i_logout()
2358 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0); in ibmvscsis_srp_i_logout()
2363 list_add_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_srp_i_logout()
2364 ibmvscsis_send_messages(vscsi); in ibmvscsis_srp_i_logout()
2366 ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, 0); in ibmvscsis_srp_i_logout()
2373 static void ibmvscsis_srp_cmd(struct scsi_info *vscsi, struct viosrp_crq *crq) in ibmvscsis_srp_cmd() argument
2381 if (vscsi->request_limit - vscsi->debit <= 0) { in ibmvscsis_srp_cmd()
2383 dev_err(&vscsi->dev, "Client exceeded the request limit (%d), debit %d\n", in ibmvscsis_srp_cmd()
2384 vscsi->request_limit, vscsi->debit); in ibmvscsis_srp_cmd()
2385 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_srp_cmd()
2389 cmd = ibmvscsis_get_free_cmd(vscsi); in ibmvscsis_srp_cmd()
2391 dev_err(&vscsi->dev, "srp_cmd failed to get cmd, debit %d\n", in ibmvscsis_srp_cmd()
2392 vscsi->debit); in ibmvscsis_srp_cmd()
2393 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_srp_cmd()
2399 rc = ibmvscsis_copy_crq_packet(vscsi, cmd, crq); in ibmvscsis_srp_cmd()
2401 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_srp_cmd()
2405 if (vscsi->state == SRP_PROCESSING) { in ibmvscsis_srp_cmd()
2408 rc = ibmvscsis_srp_login(vscsi, cmd, crq); in ibmvscsis_srp_cmd()
2413 dev_dbg(&vscsi->dev, "tsk_mgmt tag: %llu (0x%llx)\n", in ibmvscsis_srp_cmd()
2416 vscsi->debit += 1; in ibmvscsis_srp_cmd()
2418 list_add_tail(&cmd->list, &vscsi->schedule_q); in ibmvscsis_srp_cmd()
2419 queue_work(vscsi->work_q, &cmd->work); in ibmvscsis_srp_cmd()
2423 dev_dbg(&vscsi->dev, "srp_cmd tag: %llu (0x%llx)\n", in ibmvscsis_srp_cmd()
2426 vscsi->debit += 1; in ibmvscsis_srp_cmd()
2432 list_add_tail(&cmd->list, &vscsi->schedule_q); in ibmvscsis_srp_cmd()
2433 queue_work(vscsi->work_q, &cmd->work); in ibmvscsis_srp_cmd()
2437 rc = ibmvscsis_srp_i_logout(vscsi, cmd, crq); in ibmvscsis_srp_cmd()
2443 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_srp_cmd()
2444 dev_err(&vscsi->dev, "invalid srp cmd, opcode %d\n", in ibmvscsis_srp_cmd()
2446 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_srp_cmd()
2450 } else if (srp->opcode == SRP_LOGIN_REQ && vscsi->state == CONNECTED) { in ibmvscsis_srp_cmd()
2451 rc = ibmvscsis_srp_login(vscsi, cmd, crq); in ibmvscsis_srp_cmd()
2453 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_srp_cmd()
2454 dev_err(&vscsi->dev, "Invalid state %d to handle srp cmd\n", in ibmvscsis_srp_cmd()
2455 vscsi->state); in ibmvscsis_srp_cmd()
2456 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_srp_cmd()
2473 static long ibmvscsis_ping_response(struct scsi_info *vscsi) in ibmvscsis_ping_response() argument
2484 rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]), in ibmvscsis_ping_response()
2491 vscsi->flags |= CLIENT_FAILED; in ibmvscsis_ping_response()
2494 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_ping_response()
2497 dev_err(&vscsi->dev, "ping_response: h_send_crq failed, rc %ld\n", in ibmvscsis_ping_response()
2499 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_ping_response()
2502 dev_err(&vscsi->dev, "ping_response: h_send_crq returned unknown rc %ld\n", in ibmvscsis_ping_response()
2504 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0); in ibmvscsis_ping_response()
2523 static long ibmvscsis_parse_command(struct scsi_info *vscsi, in ibmvscsis_parse_command() argument
2535 if (vscsi->flags & PROCESSING_MAD) { in ibmvscsis_parse_command()
2537 dev_err(&vscsi->dev, "parse_command: already processing mad\n"); in ibmvscsis_parse_command()
2538 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_parse_command()
2542 vscsi->flags |= PROCESSING_MAD; in ibmvscsis_parse_command()
2543 rc = ibmvscsis_mad(vscsi, crq); in ibmvscsis_parse_command()
2548 ibmvscsis_srp_cmd(vscsi, crq); in ibmvscsis_parse_command()
2553 ibmvscsis_ping_response(vscsi); in ibmvscsis_parse_command()
2557 dev_err(&vscsi->dev, "parse_command: invalid format %d\n", in ibmvscsis_parse_command()
2559 ibmvscsis_post_disconnect(vscsi, in ibmvscsis_parse_command()
2566 rc = ibmvscsis_trans_event(vscsi, crq); in ibmvscsis_parse_command()
2570 rc = ibmvscsis_init_msg(vscsi, crq); in ibmvscsis_parse_command()
2574 dev_err(&vscsi->dev, "parse_command: invalid valid field %d\n", in ibmvscsis_parse_command()
2576 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_parse_command()
2584 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_parse_command()
2589 static int read_dma_window(struct scsi_info *vscsi) in read_dma_window() argument
2591 struct vio_dev *vdev = vscsi->dma_dev; in read_dma_window()
2603 dev_err(&vscsi->dev, "Couldn't find ibm,my-dma-window property\n"); in read_dma_window()
2607 vscsi->dds.window[LOCAL].liobn = be32_to_cpu(*dma_window); in read_dma_window()
2613 dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-address-cells property\n"); in read_dma_window()
2622 dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-size-cells property\n"); in read_dma_window()
2629 vscsi->dds.window[REMOTE].liobn = be32_to_cpu(*dma_window); in read_dma_window()
2638 struct scsi_info *vscsi; in ibmvscsis_lookup_port() local
2641 list_for_each_entry(vscsi, &ibmvscsis_dev_list, list) { in ibmvscsis_lookup_port()
2642 vdev = vscsi->dma_dev; in ibmvscsis_lookup_port()
2644 tport = &vscsi->tport; in ibmvscsis_lookup_port()
2664 static void ibmvscsis_parse_cmd(struct scsi_info *vscsi, in ibmvscsis_parse_cmd() argument
2675 nexus = vscsi->tport.ibmv_nexus; in ibmvscsis_parse_cmd()
2685 dev_err(&vscsi->dev, "parse_cmd: reserved bits set in IU\n"); in ibmvscsis_parse_cmd()
2686 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2687 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_parse_cmd()
2688 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_parse_cmd()
2689 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2694 dev_err(&vscsi->dev, "0x%llx: parsing SRP descriptor table failed.\n", in ibmvscsis_parse_cmd()
2715 dev_err(&vscsi->dev, "Invalid task attribute %d\n", in ibmvscsis_parse_cmd()
2722 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2723 list_add_tail(&cmd->list, &vscsi->active_q); in ibmvscsis_parse_cmd()
2724 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2732 dev_err(&vscsi->dev, "target_submit_cmd failed, rc %d\n", rc); in ibmvscsis_parse_cmd()
2733 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2735 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_parse_cmd()
2736 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2742 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2743 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0); in ibmvscsis_parse_cmd()
2744 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_cmd()
2759 static void ibmvscsis_parse_task(struct scsi_info *vscsi, in ibmvscsis_parse_task() argument
2769 nexus = vscsi->tport.ibmv_nexus; in ibmvscsis_parse_task()
2791 dev_err(&vscsi->dev, "unknown task mgmt func %d\n", in ibmvscsis_parse_task()
2802 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2803 list_add_tail(&cmd->list, &vscsi->active_q); in ibmvscsis_parse_task()
2804 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2808 dev_dbg(&vscsi->dev, "calling submit_tmr, func %d\n", in ibmvscsis_parse_task()
2814 dev_err(&vscsi->dev, "target_submit_tmr failed, rc %d\n", in ibmvscsis_parse_task()
2816 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2818 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_parse_task()
2832 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_scheduler() local
2834 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2840 if (vscsi->flags & (SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED)) { in ibmvscsis_scheduler()
2841 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_scheduler()
2844 if (list_empty(&vscsi->active_q) && in ibmvscsis_scheduler()
2845 list_empty(&vscsi->schedule_q) && in ibmvscsis_scheduler()
2846 (vscsi->flags & WAIT_FOR_IDLE)) { in ibmvscsis_scheduler()
2847 vscsi->flags &= ~WAIT_FOR_IDLE; in ibmvscsis_scheduler()
2848 complete(&vscsi->wait_idle); in ibmvscsis_scheduler()
2851 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2855 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2859 ibmvscsis_parse_cmd(vscsi, cmd); in ibmvscsis_scheduler()
2862 ibmvscsis_parse_task(vscsi, cmd); in ibmvscsis_scheduler()
2865 dev_err(&vscsi->dev, "scheduler, invalid cmd type %d\n", in ibmvscsis_scheduler()
2867 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2868 ibmvscsis_free_cmd_resources(vscsi, cmd); in ibmvscsis_scheduler()
2869 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_scheduler()
2874 static int ibmvscsis_alloc_cmds(struct scsi_info *vscsi, int num) in ibmvscsis_alloc_cmds() argument
2879 INIT_LIST_HEAD(&vscsi->free_cmd); in ibmvscsis_alloc_cmds()
2880 vscsi->cmd_pool = kcalloc(num, sizeof(struct ibmvscsis_cmd), in ibmvscsis_alloc_cmds()
2882 if (!vscsi->cmd_pool) in ibmvscsis_alloc_cmds()
2885 for (i = 0, cmd = (struct ibmvscsis_cmd *)vscsi->cmd_pool; i < num; in ibmvscsis_alloc_cmds()
2888 cmd->adapter = vscsi; in ibmvscsis_alloc_cmds()
2890 list_add_tail(&cmd->list, &vscsi->free_cmd); in ibmvscsis_alloc_cmds()
2896 static void ibmvscsis_free_cmds(struct scsi_info *vscsi) in ibmvscsis_free_cmds() argument
2898 kfree(vscsi->cmd_pool); in ibmvscsis_free_cmds()
2899 vscsi->cmd_pool = NULL; in ibmvscsis_free_cmds()
2900 INIT_LIST_HEAD(&vscsi->free_cmd); in ibmvscsis_free_cmds()
2919 struct scsi_info *vscsi = container_of(p_timer, struct scsi_info, in ibmvscsis_service_wait_q() local
2922 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_service_wait_q()
2925 ibmvscsis_send_messages(vscsi); in ibmvscsis_service_wait_q()
2926 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_service_wait_q()
2931 static long ibmvscsis_alloctimer(struct scsi_info *vscsi) in ibmvscsis_alloctimer() argument
2935 p_timer = &vscsi->rsp_q_timer; in ibmvscsis_alloctimer()
2945 static void ibmvscsis_freetimer(struct scsi_info *vscsi) in ibmvscsis_freetimer() argument
2949 p_timer = &vscsi->rsp_q_timer; in ibmvscsis_freetimer()
2959 struct scsi_info *vscsi = data; in ibmvscsis_interrupt() local
2961 vio_disable_interrupts(vscsi->dma_dev); in ibmvscsis_interrupt()
2962 tasklet_schedule(&vscsi->work_task); in ibmvscsis_interrupt()
2976 static long ibmvscsis_enable_change_state(struct scsi_info *vscsi) in ibmvscsis_enable_change_state() argument
2981 bytes = vscsi->cmd_q.size * PAGE_SIZE; in ibmvscsis_enable_change_state()
2982 rc = h_reg_crq(vscsi->dds.unit_id, vscsi->cmd_q.crq_token, bytes); in ibmvscsis_enable_change_state()
2984 vscsi->state = WAIT_CONNECTION; in ibmvscsis_enable_change_state()
2985 rc = ibmvscsis_establish_new_q(vscsi); in ibmvscsis_enable_change_state()
2989 vscsi->state = ERR_DISCONNECTED; in ibmvscsis_enable_change_state()
2990 vscsi->flags |= RESPONSE_Q_DOWN; in ibmvscsis_enable_change_state()
3008 static long ibmvscsis_create_command_q(struct scsi_info *vscsi, int num_cmds) in ibmvscsis_create_command_q() argument
3011 struct vio_dev *vdev = vscsi->dma_dev; in ibmvscsis_create_command_q()
3016 vscsi->cmd_q.size = pages; in ibmvscsis_create_command_q()
3018 vscsi->cmd_q.base_addr = in ibmvscsis_create_command_q()
3020 if (!vscsi->cmd_q.base_addr) in ibmvscsis_create_command_q()
3023 vscsi->cmd_q.mask = ((uint)pages * CRQ_PER_PAGE) - 1; in ibmvscsis_create_command_q()
3025 vscsi->cmd_q.crq_token = dma_map_single(&vdev->dev, in ibmvscsis_create_command_q()
3026 vscsi->cmd_q.base_addr, in ibmvscsis_create_command_q()
3028 if (dma_mapping_error(&vdev->dev, vscsi->cmd_q.crq_token)) { in ibmvscsis_create_command_q()
3029 free_page((unsigned long)vscsi->cmd_q.base_addr); in ibmvscsis_create_command_q()
3045 static void ibmvscsis_destroy_command_q(struct scsi_info *vscsi) in ibmvscsis_destroy_command_q() argument
3047 dma_unmap_single(&vscsi->dma_dev->dev, vscsi->cmd_q.crq_token, in ibmvscsis_destroy_command_q()
3049 free_page((unsigned long)vscsi->cmd_q.base_addr); in ibmvscsis_destroy_command_q()
3050 vscsi->cmd_q.base_addr = NULL; in ibmvscsis_destroy_command_q()
3051 vscsi->state = NO_QUEUE; in ibmvscsis_destroy_command_q()
3054 static u8 ibmvscsis_fast_fail(struct scsi_info *vscsi, in ibmvscsis_fast_fail() argument
3063 if (vscsi->fast_fail && (READ_CMD(srp->cdb) || WRITE_CMD(srp->cdb))) in ibmvscsis_fast_fail()
3085 static long srp_build_response(struct scsi_info *vscsi, in srp_build_response() argument
3097 spin_lock_bh(&vscsi->intr_lock); in srp_build_response()
3106 rsp->req_lim_delta = cpu_to_be32(1 + vscsi->credit); in srp_build_response()
3111 rsp->status = ibmvscsis_fast_fail(vscsi, cmd); in srp_build_response()
3113 dev_dbg(&vscsi->dev, "build_resp: cmd %p, scsi status %d\n", in srp_build_response()
3127 dev_dbg(&vscsi->dev, "build_resp: cmd %p, fast fail\n", in srp_build_response()
3170 rc = h_copy_rdma(len, vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma, in srp_build_response()
3171 vscsi->dds.window[REMOTE].liobn, in srp_build_response()
3176 vscsi->credit = 0; in srp_build_response()
3180 if (connection_broken(vscsi)) in srp_build_response()
3181 vscsi->flags |= RESPONSE_Q_DOWN | CLIENT_FAILED; in srp_build_response()
3183 dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld, flags 0x%x, state 0x%hx\n", in srp_build_response()
3184 rc, vscsi->flags, vscsi->state); in srp_build_response()
3189 dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld\n", in srp_build_response()
3194 spin_unlock_bh(&vscsi->intr_lock); in srp_build_response()
3205 struct scsi_info *vscsi = target->ldata; in ibmvscsis_rdma() local
3226 dev_err(&vscsi->dev, "rdma: ran out of client memory descriptors\n"); in ibmvscsis_rdma()
3235 dev_err(&vscsi->dev, "rdma: ran out of scatter/gather list\n"); in ibmvscsis_rdma()
3257 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_rdma()
3259 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_rdma()
3271 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_rdma()
3273 vscsi->dds.window[REMOTE].liobn, in ibmvscsis_rdma()
3282 if (connection_broken(vscsi)) { in ibmvscsis_rdma()
3283 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_rdma()
3284 vscsi->flags |= in ibmvscsis_rdma()
3286 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_rdma()
3288 dev_err(&vscsi->dev, "rdma: h_copy_rdma failed, rc %ld\n", in ibmvscsis_rdma()
3293 dev_err(&vscsi->dev, "rdma: unknown error %ld from h_copy_rdma\n", in ibmvscsis_rdma()
3333 struct scsi_info *vscsi = (struct scsi_info *)data; in ibmvscsis_handle_crq() local
3339 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3341 dev_dbg(&vscsi->dev, "got interrupt\n"); in ibmvscsis_handle_crq()
3348 if (TARGET_STOP(vscsi)) { in ibmvscsis_handle_crq()
3349 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_handle_crq()
3351 dev_dbg(&vscsi->dev, "handle_crq, don't process: flags 0x%x, state 0x%hx\n", in ibmvscsis_handle_crq()
3352 vscsi->flags, vscsi->state); in ibmvscsis_handle_crq()
3353 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3357 rc = vscsi->flags & SCHEDULE_DISCONNECT; in ibmvscsis_handle_crq()
3358 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_handle_crq()
3370 vscsi->cmd_q.index = in ibmvscsis_handle_crq()
3371 (vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask; in ibmvscsis_handle_crq()
3374 rc = ibmvscsis_parse_command(vscsi, crq); in ibmvscsis_handle_crq()
3383 rc = ibmvscsis_trans_event(vscsi, crq); in ibmvscsis_handle_crq()
3384 } else if (vscsi->flags & TRANS_EVENT) { in ibmvscsis_handle_crq()
3392 if (vscsi->cmd_q.index) in ibmvscsis_handle_crq()
3393 vscsi->cmd_q.index -= 1; in ibmvscsis_handle_crq()
3399 vscsi->cmd_q.index = vscsi->cmd_q.mask; in ibmvscsis_handle_crq()
3406 crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; in ibmvscsis_handle_crq()
3413 vio_enable_interrupts(vscsi->dma_dev); in ibmvscsis_handle_crq()
3415 dev_dbg(&vscsi->dev, "handle_crq, reenabling interrupts\n"); in ibmvscsis_handle_crq()
3422 dev_dbg(&vscsi->dev, "handle_crq, error: flags 0x%x, state 0x%hx, crq index 0x%x\n", in ibmvscsis_handle_crq()
3423 vscsi->flags, vscsi->state, vscsi->cmd_q.index); in ibmvscsis_handle_crq()
3426 dev_dbg(&vscsi->dev, "Leaving handle_crq: schedule_q empty %d, flags 0x%x, state 0x%hx\n", in ibmvscsis_handle_crq()
3427 (int)list_empty(&vscsi->schedule_q), vscsi->flags, in ibmvscsis_handle_crq()
3428 vscsi->state); in ibmvscsis_handle_crq()
3430 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_handle_crq()
3436 struct scsi_info *vscsi; in ibmvscsis_probe() local
3441 vscsi = kzalloc(sizeof(*vscsi), GFP_KERNEL); in ibmvscsis_probe()
3442 if (!vscsi) { in ibmvscsis_probe()
3448 vscsi->dma_dev = vdev; in ibmvscsis_probe()
3449 vscsi->dev = vdev->dev; in ibmvscsis_probe()
3450 INIT_LIST_HEAD(&vscsi->schedule_q); in ibmvscsis_probe()
3451 INIT_LIST_HEAD(&vscsi->waiting_rsp); in ibmvscsis_probe()
3452 INIT_LIST_HEAD(&vscsi->active_q); in ibmvscsis_probe()
3454 snprintf(vscsi->tport.tport_name, IBMVSCSIS_NAMELEN, "%s", in ibmvscsis_probe()
3457 dev_dbg(&vscsi->dev, "probe tport_name: %s\n", vscsi->tport.tport_name); in ibmvscsis_probe()
3459 rc = read_dma_window(vscsi); in ibmvscsis_probe()
3462 dev_dbg(&vscsi->dev, "Probe: liobn 0x%x, riobn 0x%x\n", in ibmvscsis_probe()
3463 vscsi->dds.window[LOCAL].liobn, in ibmvscsis_probe()
3464 vscsi->dds.window[REMOTE].liobn); in ibmvscsis_probe()
3466 snprintf(vscsi->eye, sizeof(vscsi->eye), "VSCSI %s", vdev->name); in ibmvscsis_probe()
3468 vscsi->dds.unit_id = vdev->unit_address; in ibmvscsis_probe()
3469 strscpy(vscsi->dds.partition_name, partition_name, in ibmvscsis_probe()
3470 sizeof(vscsi->dds.partition_name)); in ibmvscsis_probe()
3471 vscsi->dds.partition_num = partition_number; in ibmvscsis_probe()
3474 list_add_tail(&vscsi->list, &ibmvscsis_dev_list); in ibmvscsis_probe()
3481 vscsi->request_limit = INITIAL_SRP_LIMIT; in ibmvscsis_probe()
3482 rc = srp_target_alloc(&vscsi->target, &vdev->dev, vscsi->request_limit, in ibmvscsis_probe()
3487 vscsi->target.ldata = vscsi; in ibmvscsis_probe()
3489 rc = ibmvscsis_alloc_cmds(vscsi, vscsi->request_limit); in ibmvscsis_probe()
3491 dev_err(&vscsi->dev, "alloc_cmds failed, rc %d, num %d\n", in ibmvscsis_probe()
3492 rc, vscsi->request_limit); in ibmvscsis_probe()
3500 spin_lock_init(&vscsi->intr_lock); in ibmvscsis_probe()
3502 rc = ibmvscsis_alloctimer(vscsi); in ibmvscsis_probe()
3504 dev_err(&vscsi->dev, "probe: alloctimer failed, rc %d\n", rc); in ibmvscsis_probe()
3508 rc = ibmvscsis_create_command_q(vscsi, 256); in ibmvscsis_probe()
3510 dev_err(&vscsi->dev, "probe: create_command_q failed, rc %d\n", in ibmvscsis_probe()
3515 vscsi->map_buf = kzalloc(PAGE_SIZE, GFP_KERNEL); in ibmvscsis_probe()
3516 if (!vscsi->map_buf) { in ibmvscsis_probe()
3518 dev_err(&vscsi->dev, "probe: allocating cmd buffer failed\n"); in ibmvscsis_probe()
3522 vscsi->map_ioba = dma_map_single(&vdev->dev, vscsi->map_buf, PAGE_SIZE, in ibmvscsis_probe()
3524 if (dma_mapping_error(&vdev->dev, vscsi->map_ioba)) { in ibmvscsis_probe()
3526 dev_err(&vscsi->dev, "probe: error mapping command buffer\n"); in ibmvscsis_probe()
3530 hrc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO, in ibmvscsis_probe()
3531 (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0, in ibmvscsis_probe()
3534 vscsi->client_data.partition_number = in ibmvscsis_probe()
3535 be64_to_cpu(*(u64 *)vscsi->map_buf); in ibmvscsis_probe()
3541 dev_dbg(&vscsi->dev, "probe hrc %ld, client partition num %d\n", in ibmvscsis_probe()
3542 hrc, vscsi->client_data.partition_number); in ibmvscsis_probe()
3544 tasklet_init(&vscsi->work_task, ibmvscsis_handle_crq, in ibmvscsis_probe()
3545 (unsigned long)vscsi); in ibmvscsis_probe()
3547 init_completion(&vscsi->wait_idle); in ibmvscsis_probe()
3548 init_completion(&vscsi->unconfig); in ibmvscsis_probe()
3551 vscsi->work_q = create_workqueue(wq_name); in ibmvscsis_probe()
3552 if (!vscsi->work_q) { in ibmvscsis_probe()
3554 dev_err(&vscsi->dev, "create_workqueue failed\n"); in ibmvscsis_probe()
3558 rc = request_irq(vdev->irq, ibmvscsis_interrupt, 0, "ibmvscsis", vscsi); in ibmvscsis_probe()
3561 dev_err(&vscsi->dev, "probe: request_irq failed, rc %d\n", rc); in ibmvscsis_probe()
3565 vscsi->state = WAIT_ENABLED; in ibmvscsis_probe()
3567 dev_set_drvdata(&vdev->dev, vscsi); in ibmvscsis_probe()
3572 destroy_workqueue(vscsi->work_q); in ibmvscsis_probe()
3574 dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE, in ibmvscsis_probe()
3577 kfree(vscsi->map_buf); in ibmvscsis_probe()
3579 tasklet_kill(&vscsi->work_task); in ibmvscsis_probe()
3580 ibmvscsis_unregister_command_q(vscsi); in ibmvscsis_probe()
3581 ibmvscsis_destroy_command_q(vscsi); in ibmvscsis_probe()
3583 ibmvscsis_freetimer(vscsi); in ibmvscsis_probe()
3585 ibmvscsis_free_cmds(vscsi); in ibmvscsis_probe()
3587 srp_target_free(&vscsi->target); in ibmvscsis_probe()
3590 list_del(&vscsi->list); in ibmvscsis_probe()
3593 kfree(vscsi); in ibmvscsis_probe()
3600 struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev); in ibmvscsis_remove() local
3602 dev_dbg(&vscsi->dev, "remove (%s)\n", dev_name(&vscsi->dma_dev->dev)); in ibmvscsis_remove()
3604 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_remove()
3605 ibmvscsis_post_disconnect(vscsi, UNCONFIGURING, 0); in ibmvscsis_remove()
3606 vscsi->flags |= CFG_SLEEPING; in ibmvscsis_remove()
3607 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_remove()
3608 wait_for_completion(&vscsi->unconfig); in ibmvscsis_remove()
3611 free_irq(vdev->irq, vscsi); in ibmvscsis_remove()
3612 destroy_workqueue(vscsi->work_q); in ibmvscsis_remove()
3613 dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE, in ibmvscsis_remove()
3615 kfree(vscsi->map_buf); in ibmvscsis_remove()
3616 tasklet_kill(&vscsi->work_task); in ibmvscsis_remove()
3617 ibmvscsis_destroy_command_q(vscsi); in ibmvscsis_remove()
3618 ibmvscsis_freetimer(vscsi); in ibmvscsis_remove()
3619 ibmvscsis_free_cmds(vscsi); in ibmvscsis_remove()
3620 srp_target_free(&vscsi->target); in ibmvscsis_remove()
3622 list_del(&vscsi->list); in ibmvscsis_remove()
3624 kfree(vscsi); in ibmvscsis_remove()
3644 struct scsi_info *vscsi = container_of(dev, struct scsi_info, dev); in unit_address_show() local
3646 return snprintf(buf, PAGE_SIZE, "%x\n", vscsi->dma_dev->unit_address); in unit_address_show()
3733 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_release_cmd() local
3735 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_release_cmd()
3737 list_move_tail(&cmd->list, &vscsi->waiting_rsp); in ibmvscsis_release_cmd()
3738 ibmvscsis_send_messages(vscsi); in ibmvscsis_release_cmd()
3739 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_release_cmd()
3751 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_write_pending() local
3760 if ((vscsi->flags & (CLIENT_FAILED | RESPONSE_Q_DOWN))) { in ibmvscsis_write_pending()
3761 dev_err(&vscsi->dev, "write_pending failed since: %d\n", in ibmvscsis_write_pending()
3762 vscsi->flags); in ibmvscsis_write_pending()
3770 dev_err(&vscsi->dev, "srp_transfer_data() failed: %d\n", rc); in ibmvscsis_write_pending()
3795 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_data_in() local
3802 dev_err(&vscsi->dev, "srp_transfer_data failed: %d\n", rc); in ibmvscsis_queue_data_in()
3810 srp_build_response(vscsi, cmd, &len); in ibmvscsis_queue_data_in()
3821 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_status() local
3824 dev_dbg(&vscsi->dev, "queue_status %p\n", se_cmd); in ibmvscsis_queue_status()
3826 srp_build_response(vscsi, cmd, &len); in ibmvscsis_queue_status()
3837 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_queue_tm_rsp() local
3844 dev_dbg(&vscsi->dev, "queue_tm_rsp %p, status %d\n", in ibmvscsis_queue_tm_rsp()
3849 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_queue_tm_rsp()
3850 list_for_each_entry(cmd_itr, &vscsi->active_q, list) { in ibmvscsis_queue_tm_rsp()
3857 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_queue_tm_rsp()
3860 srp_build_response(vscsi, cmd, &len); in ibmvscsis_queue_tm_rsp()
3869 struct scsi_info *vscsi = cmd->adapter; in ibmvscsis_aborted_task() local
3871 dev_dbg(&vscsi->dev, "ibmvscsis_aborted_task %p task_tag: %llu\n", in ibmvscsis_aborted_task()
3880 struct scsi_info *vscsi; in ibmvscsis_make_tport() local
3884 vscsi = container_of(tport, struct scsi_info, tport); in ibmvscsis_make_tport()
3886 dev_dbg(&vscsi->dev, "make_tport(%s), pointer:%p, tport_id:%x\n", in ibmvscsis_make_tport()
3899 struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); in ibmvscsis_drop_tport() local
3901 dev_dbg(&vscsi->dev, "drop_tport(%s)\n", in ibmvscsis_drop_tport()
3979 struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); in ibmvscsis_tpg_enable_store() local
3986 dev_err(&vscsi->dev, "Unable to extract srpt_tpg_store_enable\n"); in ibmvscsis_tpg_enable_store()
3991 dev_err(&vscsi->dev, "Illegal value for srpt_tpg_store_enable\n"); in ibmvscsis_tpg_enable_store()
3996 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_tpg_enable_store()
3998 lrc = ibmvscsis_enable_change_state(vscsi); in ibmvscsis_tpg_enable_store()
4000 dev_err(&vscsi->dev, "enable_change_state failed, rc %ld state %d\n", in ibmvscsis_tpg_enable_store()
4001 lrc, vscsi->state); in ibmvscsis_tpg_enable_store()
4002 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_tpg_enable_store()
4004 spin_lock_bh(&vscsi->intr_lock); in ibmvscsis_tpg_enable_store()
4007 ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0); in ibmvscsis_tpg_enable_store()
4008 spin_unlock_bh(&vscsi->intr_lock); in ibmvscsis_tpg_enable_store()
4011 dev_dbg(&vscsi->dev, "tpg_enable_store, tmp %ld, state %d\n", tmp, in ibmvscsis_tpg_enable_store()
4012 vscsi->state); in ibmvscsis_tpg_enable_store()