diff options
Diffstat (limited to 'drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c')
| -rw-r--r-- | drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c | 525 |
1 files changed, 217 insertions, 308 deletions
diff --git a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c index 1f75d0380516..f259746bc804 100644 --- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c +++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /******************************************************************************* * IBM Virtual SCSI Target Driver * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp. @@ -10,16 +11,6 @@ * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com> * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com> * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * ****************************************************************************/ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -31,6 +22,7 @@ #include <linux/list.h> #include <linux/string.h> #include <linux/delay.h> +#include <linux/of.h> #include <target/target_core_base.h> #include <target/target_core_fabric.h> @@ -44,7 +36,7 @@ #define IBMVSCSIS_VERSION "v0.2" -#define INITIAL_SRP_LIMIT 800 +#define INITIAL_SRP_LIMIT 1024 #define DEFAULT_MAX_SECTORS 256 #define MAX_TXU 1024 * 1024 @@ -122,7 +114,7 @@ static bool connection_broken(struct scsi_info *vscsi) cpu_to_be64(buffer[MSG_HI]), cpu_to_be64(buffer[MSG_LOW])); - pr_debug("connection_broken: rc %ld\n", h_return_code); + dev_dbg(&vscsi->dev, "Connection_broken: rc %ld\n", h_return_code); if (h_return_code == H_CLOSED) rc = true; @@ -137,10 +129,10 @@ static bool connection_broken(struct scsi_info *vscsi) * This function calls h_free_q then frees the interrupt bit etc. * It must release the lock before doing so because of the time it can take * for h_free_crq in PHYP - * NOTE: the caller must make sure that state and or flags will prevent - * interrupt handler from scheduling work. - * NOTE: anyone calling this function may need to set the CRQ_CLOSED flag - * we can't do it here, because we don't have the lock + * NOTE: * the caller must make sure that state and or flags will prevent + * interrupt handler from scheduling work. + * * anyone calling this function may need to set the CRQ_CLOSED flag + * we can't do it here, because we don't have the lock * * EXECUTION ENVIRONMENT: * Process level @@ -210,7 +202,7 @@ static long ibmvscsis_unregister_command_q(struct scsi_info *vscsi) } } while (qrc != H_SUCCESS && rc == ADAPT_SUCCESS); - pr_debug("Freeing CRQ: phyp rc %ld, rc %ld\n", qrc, rc); + dev_dbg(&vscsi->dev, "Freeing CRQ: phyp rc %ld, rc %ld\n", qrc, rc); return rc; } @@ -291,9 +283,9 @@ static long ibmvscsis_free_command_q(struct scsi_info *vscsi) ibmvscsis_delete_client_info(vscsi, false); } - pr_debug("free_command_q: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", - vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, - vscsi->phyp_acr_state); + dev_dbg(&vscsi->dev, "free_command_q: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", + vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, + vscsi->phyp_acr_state); } return rc; } @@ -428,12 +420,12 @@ static void ibmvscsis_disconnect(struct work_struct *work) vscsi->flags |= DISCONNECT_SCHEDULED; vscsi->flags &= ~SCHEDULE_DISCONNECT; - pr_debug("disconnect: flags 0x%x, state 0x%hx\n", vscsi->flags, - vscsi->state); + dev_dbg(&vscsi->dev, "disconnect: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); /* * check which state we are in and see if we - * should transitition to the new state + * should transition to the new state */ switch (vscsi->state) { /* Should never be called while in this state. */ @@ -452,7 +444,7 @@ static void ibmvscsis_disconnect(struct work_struct *work) break; /* - * Can transition from this state to to unconfiguring + * Can transition from this state to unconfiguring * or err disconnect. */ case ERR_DISCONNECT_RECONNECT: @@ -540,13 +532,14 @@ static void ibmvscsis_disconnect(struct work_struct *work) } if (wait_idle) { - pr_debug("disconnect start wait, active %d, sched %d\n", - (int)list_empty(&vscsi->active_q), - (int)list_empty(&vscsi->schedule_q)); + dev_dbg(&vscsi->dev, "disconnect start wait, active %d, sched %d\n", + (int)list_empty(&vscsi->active_q), + (int)list_empty(&vscsi->schedule_q)); if (!list_empty(&vscsi->active_q) || !list_empty(&vscsi->schedule_q)) { vscsi->flags |= WAIT_FOR_IDLE; - pr_debug("disconnect flags 0x%x\n", vscsi->flags); + dev_dbg(&vscsi->dev, "disconnect flags 0x%x\n", + vscsi->flags); /* * This routine is can not be called with the interrupt * lock held. @@ -555,7 +548,7 @@ static void ibmvscsis_disconnect(struct work_struct *work) wait_for_completion(&vscsi->wait_idle); spin_lock_bh(&vscsi->intr_lock); } - pr_debug("disconnect stop wait\n"); + dev_dbg(&vscsi->dev, "disconnect stop wait\n"); ibmvscsis_adapter_idle(vscsi); } @@ -597,8 +590,8 @@ static void ibmvscsis_post_disconnect(struct scsi_info *vscsi, uint new_state, vscsi->flags |= flag_bits; - pr_debug("post_disconnect: new_state 0x%x, flag_bits 0x%x, vscsi->flags 0x%x, state %hx\n", - new_state, flag_bits, vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "post_disconnect: new_state 0x%x, flag_bits 0x%x, vscsi->flags 0x%x, state %hx\n", + new_state, flag_bits, vscsi->flags, vscsi->state); if (!(vscsi->flags & (DISCONNECT_SCHEDULED | SCHEDULE_DISCONNECT))) { vscsi->flags |= SCHEDULE_DISCONNECT; @@ -648,8 +641,8 @@ static void ibmvscsis_post_disconnect(struct scsi_info *vscsi, uint new_state, } } - pr_debug("Leaving post_disconnect: flags 0x%x, new_state 0x%x\n", - vscsi->flags, vscsi->new_state); + dev_dbg(&vscsi->dev, "Leaving post_disconnect: flags 0x%x, new_state 0x%x\n", + vscsi->flags, vscsi->new_state); } /** @@ -724,7 +717,8 @@ static long ibmvscsis_handle_init_msg(struct scsi_info *vscsi) break; case H_CLOSED: - pr_warn("init_msg: failed to send, rc %ld\n", rc); + dev_warn(&vscsi->dev, "init_msg: failed to send, rc %ld\n", + rc); rc = 0; break; } @@ -768,7 +762,7 @@ static long ibmvscsis_init_msg(struct scsi_info *vscsi, struct viosrp_crq *crq) { long rc = ADAPT_SUCCESS; - pr_debug("init_msg: state 0x%hx\n", vscsi->state); + dev_dbg(&vscsi->dev, "init_msg: state 0x%hx\n", vscsi->state); rc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO, (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0, @@ -776,10 +770,10 @@ static long ibmvscsis_init_msg(struct scsi_info *vscsi, struct viosrp_crq *crq) if (rc == H_SUCCESS) { vscsi->client_data.partition_number = be64_to_cpu(*(u64 *)vscsi->map_buf); - pr_debug("init_msg, part num %d\n", - vscsi->client_data.partition_number); + dev_dbg(&vscsi->dev, "init_msg, part num %d\n", + vscsi->client_data.partition_number); } else { - pr_debug("init_msg h_vioctl rc %ld\n", rc); + dev_dbg(&vscsi->dev, "init_msg h_vioctl rc %ld\n", rc); rc = ADAPT_SUCCESS; } @@ -813,7 +807,8 @@ static long ibmvscsis_establish_new_q(struct scsi_info *vscsi) if (rc == H_SUCCESS) vscsi->flags |= PREP_FOR_SUSPEND_ENABLED; else if (rc != H_NOT_FOUND) - pr_err("Error from Enable Prepare for Suspend: %ld\n", rc); + dev_err(&vscsi->dev, "Error from Enable Prepare for Suspend: %ld\n", + rc); vscsi->flags &= PRESERVE_FLAG_FIELDS; vscsi->rsp_q_timer.timer_pops = 0; @@ -822,8 +817,8 @@ static long ibmvscsis_establish_new_q(struct scsi_info *vscsi) rc = vio_enable_interrupts(vscsi->dma_dev); if (rc) { - pr_warn("establish_new_q: failed to enable interrupts, rc %ld\n", - rc); + dev_warn(&vscsi->dev, "establish_new_q: failed to enable interrupts, rc %ld\n", + rc); return rc; } @@ -883,7 +878,7 @@ static void ibmvscsis_reset_queue(struct scsi_info *vscsi) int bytes; long rc = ADAPT_SUCCESS; - pr_debug("reset_queue: flags 0x%x\n", vscsi->flags); + dev_dbg(&vscsi->dev, "reset_queue: flags 0x%x\n", vscsi->flags); /* don't reset, the client did it for us */ if (vscsi->flags & (CLIENT_FAILED | TRANS_EVENT)) { @@ -906,7 +901,8 @@ static void ibmvscsis_reset_queue(struct scsi_info *vscsi) } if (rc != ADAPT_SUCCESS) { - pr_debug("reset_queue: reg_crq rc %ld\n", rc); + dev_dbg(&vscsi->dev, "reset_queue: reg_crq rc %ld\n", + rc); vscsi->state = ERR_DISCONNECTED; vscsi->flags |= RESPONSE_Q_DOWN; @@ -985,14 +981,15 @@ static long ibmvscsis_ready_for_suspend(struct scsi_info *vscsi, bool idle) /* See if there is a Resume event in the queue */ crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; - pr_debug("ready_suspend: flags 0x%x, state 0x%hx crq_valid:%x\n", - vscsi->flags, vscsi->state, (int)crq->valid); + dev_dbg(&vscsi->dev, "ready_suspend: flags 0x%x, state 0x%hx crq_valid:%x\n", + vscsi->flags, vscsi->state, (int)crq->valid); if (!(vscsi->flags & PREP_FOR_SUSPEND_ABORTED) && !(crq->valid)) { rc = h_vioctl(vscsi->dds.unit_id, H_READY_FOR_SUSPEND, 0, 0, 0, 0, 0); if (rc) { - pr_err("Ready for Suspend Vioctl failed: %ld\n", rc); + dev_err(&vscsi->dev, "Ready for Suspend Vioctl failed: %ld\n", + rc); rc = 0; } } else if (((vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE) && @@ -1012,7 +1009,7 @@ static long ibmvscsis_ready_for_suspend(struct scsi_info *vscsi, bool idle) if ((crq->valid) && ((crq->valid != VALID_TRANS_EVENT) || (crq->format != RESUME_FROM_SUSP))) - pr_err("Invalid element in CRQ after Prepare for Suspend"); + dev_err(&vscsi->dev, "Invalid element in CRQ after Prepare for Suspend"); } vscsi->flags &= ~(PREP_FOR_SUSPEND_PENDING | PREP_FOR_SUSPEND_ABORTED); @@ -1036,8 +1033,8 @@ static long ibmvscsis_trans_event(struct scsi_info *vscsi, { long rc = ADAPT_SUCCESS; - pr_debug("trans_event: format %d, flags 0x%x, state 0x%hx\n", - (int)crq->format, vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "trans_event: format %d, flags 0x%x, state 0x%hx\n", + (int)crq->format, vscsi->flags, vscsi->state); switch (crq->format) { case MIGRATED: @@ -1073,14 +1070,14 @@ static long ibmvscsis_trans_event(struct scsi_info *vscsi, !list_empty(&vscsi->schedule_q) || !list_empty(&vscsi->waiting_rsp) || !list_empty(&vscsi->active_q)) { - pr_debug("debit %d, sched %d, wait %d, active %d\n", - vscsi->debit, - (int)list_empty(&vscsi->schedule_q), - (int)list_empty(&vscsi->waiting_rsp), - (int)list_empty(&vscsi->active_q)); - pr_warn("connection lost with outstanding work\n"); + dev_dbg(&vscsi->dev, "debit %d, sched %d, wait %d, active %d\n", + vscsi->debit, + (int)list_empty(&vscsi->schedule_q), + (int)list_empty(&vscsi->waiting_rsp), + (int)list_empty(&vscsi->active_q)); + dev_warn(&vscsi->dev, "connection lost with outstanding work\n"); } else { - pr_debug("trans_event: SRP Processing, but no outstanding work\n"); + dev_dbg(&vscsi->dev, "trans_event: SRP Processing, but no outstanding work\n"); } ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, @@ -1097,8 +1094,8 @@ static long ibmvscsis_trans_event(struct scsi_info *vscsi, break; case PREPARE_FOR_SUSPEND: - pr_debug("Prep for Suspend, crq status = 0x%x\n", - (int)crq->status); + dev_dbg(&vscsi->dev, "Prep for Suspend, crq status = 0x%x\n", + (int)crq->status); switch (vscsi->state) { case ERR_DISCONNECTED: case WAIT_CONNECTION: @@ -1119,15 +1116,15 @@ static long ibmvscsis_trans_event(struct scsi_info *vscsi, case ERR_DISCONNECT: case ERR_DISCONNECT_RECONNECT: case WAIT_IDLE: - pr_err("Invalid state for Prepare for Suspend Trans Event: 0x%x\n", - vscsi->state); + dev_err(&vscsi->dev, "Invalid state for Prepare for Suspend Trans Event: 0x%x\n", + vscsi->state); break; } break; case RESUME_FROM_SUSP: - pr_debug("Resume from Suspend, crq status = 0x%x\n", - (int)crq->status); + dev_dbg(&vscsi->dev, "Resume from Suspend, crq status = 0x%x\n", + (int)crq->status); if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) { vscsi->flags |= PREP_FOR_SUSPEND_ABORTED; } else { @@ -1152,8 +1149,8 @@ static long ibmvscsis_trans_event(struct scsi_info *vscsi, rc = vscsi->flags & SCHEDULE_DISCONNECT; - pr_debug("Leaving trans_event: flags 0x%x, state 0x%hx, rc %ld\n", - vscsi->flags, vscsi->state, rc); + dev_dbg(&vscsi->dev, "Leaving trans_event: flags 0x%x, state 0x%hx, rc %ld\n", + vscsi->flags, vscsi->state, rc); return rc; } @@ -1175,8 +1172,8 @@ static void ibmvscsis_poll_cmd_q(struct scsi_info *vscsi) bool ack = true; volatile u8 valid; - pr_debug("poll_cmd_q: flags 0x%x, state 0x%hx, q index %ud\n", - vscsi->flags, vscsi->state, vscsi->cmd_q.index); + dev_dbg(&vscsi->dev, "poll_cmd_q: flags 0x%x, state 0x%hx, q index %ud\n", + vscsi->flags, vscsi->state, vscsi->cmd_q.index); rc = vscsi->flags & SCHEDULE_DISCONNECT; crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index; @@ -1204,7 +1201,7 @@ poll_work: * if a tranport event has occurred leave * everything but transport events on the queue */ - pr_debug("poll_cmd_q, ignoring\n"); + dev_dbg(&vscsi->dev, "poll_cmd_q, ignoring\n"); /* * need to decrement the queue index so we can @@ -1233,7 +1230,7 @@ poll_work: if (ack) { vio_enable_interrupts(vscsi->dma_dev); ack = false; - pr_debug("poll_cmd_q, reenabling interrupts\n"); + dev_dbg(&vscsi->dev, "poll_cmd_q, reenabling interrupts\n"); } valid = crq->valid; dma_rmb(); @@ -1241,7 +1238,7 @@ poll_work: goto poll_work; } - pr_debug("Leaving poll_cmd_q: rc %ld\n", rc); + dev_dbg(&vscsi->dev, "Leaving poll_cmd_q: rc %ld\n", rc); } /** @@ -1258,9 +1255,9 @@ static void ibmvscsis_free_cmd_qs(struct scsi_info *vscsi) { struct ibmvscsis_cmd *cmd, *nxt; - pr_debug("free_cmd_qs: waiting_rsp empty %d, timer starter %d\n", - (int)list_empty(&vscsi->waiting_rsp), - vscsi->rsp_q_timer.started); + dev_dbg(&vscsi->dev, "free_cmd_qs: waiting_rsp empty %d, timer starter %d\n", + (int)list_empty(&vscsi->waiting_rsp), + vscsi->rsp_q_timer.started); list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, list) { list_del(&cmd->list); @@ -1317,8 +1314,8 @@ static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) int free_qs = false; long rc = 0; - pr_debug("adapter_idle: flags 0x%x, state 0x%hx\n", vscsi->flags, - vscsi->state); + dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); /* Only need to free qs if we're disconnecting from client */ if (vscsi->state != WAIT_CONNECTION || vscsi->flags & TRANS_EVENT) @@ -1336,7 +1333,8 @@ static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) break; case ERR_DISCONNECT_RECONNECT: ibmvscsis_reset_queue(vscsi); - pr_debug("adapter_idle, disc_rec: flags 0x%x\n", vscsi->flags); + dev_dbg(&vscsi->dev, "adapter_idle, disc_rec: flags 0x%x\n", + vscsi->flags); break; case ERR_DISCONNECT: @@ -1347,8 +1345,8 @@ static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) vscsi->state = ERR_DISCONNECTED; else vscsi->state = WAIT_ENABLED; - pr_debug("adapter_idle, disc: flags 0x%x, state 0x%hx\n", - vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "adapter_idle, disc: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); break; case WAIT_IDLE: @@ -1370,15 +1368,15 @@ static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) vscsi->flags &= ~DISCONNECT_SCHEDULED; } - pr_debug("adapter_idle, wait: flags 0x%x, state 0x%hx\n", - vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "adapter_idle, wait: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); ibmvscsis_poll_cmd_q(vscsi); break; case ERR_DISCONNECTED: vscsi->flags &= ~DISCONNECT_SCHEDULED; - pr_debug("adapter_idle, disconnected: flags 0x%x, state 0x%hx\n", - vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "adapter_idle, disconnected: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); break; default: @@ -1419,13 +1417,13 @@ static void ibmvscsis_adapter_idle(struct scsi_info *vscsi) vscsi->phyp_acr_state = 0; vscsi->phyp_acr_flags = 0; - pr_debug("adapter_idle: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", - vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, - vscsi->phyp_acr_state); + dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n", + vscsi->flags, vscsi->state, vscsi->phyp_acr_flags, + vscsi->phyp_acr_state); } - pr_debug("Leaving adapter_idle: flags 0x%x, state 0x%hx, new_state 0x%x\n", - vscsi->flags, vscsi->state, vscsi->new_state); + dev_dbg(&vscsi->dev, "Leaving adapter_idle: flags 0x%x, state 0x%hx, new_state 0x%x\n", + vscsi->flags, vscsi->state, vscsi->new_state); } /** @@ -1464,8 +1462,8 @@ static long ibmvscsis_copy_crq_packet(struct scsi_info *vscsi, cmd->init_time = mftb(); iue->remote_token = crq->IU_data_ptr; iue->iu_len = len; - pr_debug("copy_crq: ioba 0x%llx, init_time 0x%llx\n", - be64_to_cpu(crq->IU_data_ptr), cmd->init_time); + dev_dbg(&vscsi->dev, "copy_crq: ioba 0x%llx, init_time 0x%llx\n", + be64_to_cpu(crq->IU_data_ptr), cmd->init_time); break; case H_PERMISSION: if (connection_broken(vscsi)) @@ -1536,10 +1534,10 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi, if (connection_broken(vscsi)) flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED); } - pr_warn("adapter_info: h_copy_rdma from client failed, rc %ld\n", - rc); - pr_debug("adapter_info: ioba 0x%llx, flags 0x%x, flag_bits 0x%x\n", - be64_to_cpu(mad->buffer), vscsi->flags, flag_bits); + dev_warn(&vscsi->dev, "adapter_info: h_copy_rdma from client failed, rc %ld\n", + rc); + dev_dbg(&vscsi->dev, "adapter_info: ioba 0x%llx, flags 0x%x, flag_bits 0x%x\n", + be64_to_cpu(mad->buffer), vscsi->flags, flag_bits); ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, flag_bits); goto free_dma; @@ -1553,18 +1551,18 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi, if (vscsi->client_data.partition_number == 0) vscsi->client_data.partition_number = be32_to_cpu(info->partition_number); - strncpy(vscsi->client_data.srp_version, info->srp_version, + strscpy(vscsi->client_data.srp_version, info->srp_version, sizeof(vscsi->client_data.srp_version)); - strncpy(vscsi->client_data.partition_name, info->partition_name, + strscpy(vscsi->client_data.partition_name, info->partition_name, sizeof(vscsi->client_data.partition_name)); vscsi->client_data.mad_version = be32_to_cpu(info->mad_version); vscsi->client_data.os_type = be32_to_cpu(info->os_type); /* Copy our info */ - strncpy(info->srp_version, SRP_VERSION, - sizeof(info->srp_version)); - strncpy(info->partition_name, vscsi->dds.partition_name, - sizeof(info->partition_name)); + strscpy_pad(info->srp_version, SRP_VERSION, + sizeof(info->srp_version)); + strscpy_pad(info->partition_name, vscsi->dds.partition_name, + sizeof(info->partition_name)); info->partition_number = cpu_to_be32(vscsi->dds.partition_num); info->mad_version = cpu_to_be32(MAD_VERSION_1); info->os_type = cpu_to_be32(LINUX); @@ -1584,6 +1582,7 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi, case H_PERMISSION: if (connection_broken(vscsi)) flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED); + fallthrough; default: dev_err(&vscsi->dev, "adapter_info: h_copy_rdma to client failed, rc %ld\n", rc); @@ -1595,7 +1594,7 @@ static long ibmvscsis_adapter_info(struct scsi_info *vscsi, free_dma: dma_free_coherent(&vscsi->dma_dev->dev, sizeof(*info), info, token); - pr_debug("Leaving adapter_info, rc %ld\n", rc); + dev_dbg(&vscsi->dev, "Leaving adapter_info, rc %ld\n", rc); return rc; } @@ -1629,7 +1628,7 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) */ min_len = offsetof(struct capabilities, migration); if ((olen < min_len) || (olen > PAGE_SIZE)) { - pr_warn("cap_mad: invalid len %d\n", olen); + dev_warn(&vscsi->dev, "cap_mad: invalid len %d\n", olen); mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED); return 0; } @@ -1646,17 +1645,17 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) be64_to_cpu(mad->buffer), vscsi->dds.window[LOCAL].liobn, token); if (rc == H_SUCCESS) { - strncpy(cap->name, dev_name(&vscsi->dma_dev->dev), - SRP_MAX_LOC_LEN); + strscpy_pad(cap->name, dev_name(&vscsi->dma_dev->dev), + sizeof(cap->name)); len = olen - min_len; status = VIOSRP_MAD_SUCCESS; common = (struct mad_capability_common *)&cap->migration; while ((len > 0) && (status == VIOSRP_MAD_SUCCESS) && !rc) { - pr_debug("cap_mad: len left %hd, cap type %d, cap len %hd\n", - len, be32_to_cpu(common->cap_type), - be16_to_cpu(common->length)); + dev_dbg(&vscsi->dev, "cap_mad: len left %hd, cap type %d, cap len %hd\n", + len, be32_to_cpu(common->cap_type), + be16_to_cpu(common->length)); cap_len = be16_to_cpu(common->length); if (cap_len > len) { @@ -1673,7 +1672,7 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) switch (common->cap_type) { default: - pr_debug("cap_mad: unsupported capability\n"); + dev_dbg(&vscsi->dev, "cap_mad: unsupported capability\n"); common->server_support = 0; flag = cpu_to_be32((u32)CAP_LIST_SUPPORTED); cap->flags &= ~flag; @@ -1693,8 +1692,8 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) be64_to_cpu(mad->buffer)); if (rc != H_SUCCESS) { - pr_debug("cap_mad: failed to copy to client, rc %ld\n", - rc); + dev_dbg(&vscsi->dev, "cap_mad: failed to copy to client, rc %ld\n", + rc); if (rc == H_PERMISSION) { if (connection_broken(vscsi)) @@ -1702,8 +1701,8 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) CLIENT_FAILED); } - pr_warn("cap_mad: error copying data to client, rc %ld\n", - rc); + dev_warn(&vscsi->dev, "cap_mad: error copying data to client, rc %ld\n", + rc); ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, flag_bits); @@ -1712,8 +1711,8 @@ static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue) dma_free_coherent(&vscsi->dma_dev->dev, olen, cap, token); - pr_debug("Leaving cap_mad, rc %ld, client_cap 0x%x\n", - rc, vscsi->client_cap); + dev_dbg(&vscsi->dev, "Leaving cap_mad, rc %ld, client_cap 0x%x\n", + rc, vscsi->client_cap); return rc; } @@ -1749,7 +1748,7 @@ static long ibmvscsis_process_mad(struct scsi_info *vscsi, struct iu_entry *iue) vscsi->fast_fail = true; mad->status = cpu_to_be16(VIOSRP_MAD_SUCCESS); } else { - pr_warn("fast fail mad sent after login\n"); + dev_warn(&vscsi->dev, "fast fail mad sent after login\n"); mad->status = cpu_to_be16(VIOSRP_MAD_FAILED); } break; @@ -1809,9 +1808,9 @@ static void srp_snd_msg_failed(struct scsi_info *vscsi, long rc) */ if ((vscsi->rsp_q_timer.timer_pops < MAX_TIMER_POPS) || (vscsi->state == SRP_PROCESSING)) { - pr_debug("snd_msg_failed: response queue full, flags 0x%x, timer started %d, pops %d\n", - vscsi->flags, (int)vscsi->rsp_q_timer.started, - vscsi->rsp_q_timer.timer_pops); + dev_dbg(&vscsi->dev, "snd_msg_failed: response queue full, flags 0x%x, timer started %d, pops %d\n", + vscsi->flags, (int)vscsi->rsp_q_timer.started, + vscsi->rsp_q_timer.timer_pops); /* * Check if the timer is running; if it @@ -1873,13 +1872,9 @@ static void srp_snd_msg_failed(struct scsi_info *vscsi, long rc) */ static void ibmvscsis_send_messages(struct scsi_info *vscsi) { - u64 msg_hi = 0; - /* note do not attempt to access the IU_data_ptr with this pointer - * it is not valid - */ - struct viosrp_crq *crq = (struct viosrp_crq *)&msg_hi; + struct viosrp_crq empty_crq = { }; + struct viosrp_crq *crq = &empty_crq; struct ibmvscsis_cmd *cmd, *nxt; - struct iu_entry *iue; long rc = ADAPT_SUCCESS; bool retry = false; @@ -1933,8 +1928,6 @@ static void ibmvscsis_send_messages(struct scsi_info *vscsi) */ vscsi->credit += 1; } else { - iue = cmd->iue; - crq->valid = VALID_CMD_RESP_EL; crq->format = cmd->rsp.format; @@ -1944,11 +1937,12 @@ static void ibmvscsis_send_messages(struct scsi_info *vscsi) crq->IU_length = cpu_to_be16(cmd->rsp.len); rc = h_send_crq(vscsi->dma_dev->unit_address, - be64_to_cpu(msg_hi), + be64_to_cpu(crq->high), be64_to_cpu(cmd->rsp.tag)); - pr_debug("send_messages: cmd %p, tag 0x%llx, rc %ld\n", - cmd, be64_to_cpu(cmd->rsp.tag), rc); + dev_dbg(&vscsi->dev, "send_messages: cmd %p, tag 0x%llx, rc %ld\n", + cmd, be64_to_cpu(cmd->rsp.tag), + rc); /* if all ok free up the command * element resources @@ -2003,7 +1997,8 @@ static void ibmvscsis_send_mad_resp(struct scsi_info *vscsi, list_add_tail(&cmd->list, &vscsi->waiting_rsp); ibmvscsis_send_messages(vscsi); } else { - pr_debug("Error sending mad response, rc %ld\n", rc); + dev_dbg(&vscsi->dev, "Error sending mad response, rc %ld\n", + rc); if (rc == H_PERMISSION) { if (connection_broken(vscsi)) flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED); @@ -2039,8 +2034,8 @@ static long ibmvscsis_mad(struct scsi_info *vscsi, struct viosrp_crq *crq) * expecting a response. */ case WAIT_CONNECTION: - pr_debug("mad: in Wait Connection state, ignoring MAD, flags %d\n", - vscsi->flags); + dev_dbg(&vscsi->dev, "mad: in Wait Connection state, ignoring MAD, flags %d\n", + vscsi->flags); return ADAPT_SUCCESS; case SRP_PROCESSING: @@ -2075,12 +2070,12 @@ static long ibmvscsis_mad(struct scsi_info *vscsi, struct viosrp_crq *crq) if (!rc) { mad = (struct mad_common *)&vio_iu(iue)->mad; - pr_debug("mad: type %d\n", be32_to_cpu(mad->type)); + dev_dbg(&vscsi->dev, "mad: type %d\n", be32_to_cpu(mad->type)); rc = ibmvscsis_process_mad(vscsi, iue); - pr_debug("mad: status %hd, rc %ld\n", be16_to_cpu(mad->status), - rc); + dev_dbg(&vscsi->dev, "mad: status %hd, rc %ld\n", + be16_to_cpu(mad->status), rc); if (!rc) ibmvscsis_send_mad_resp(vscsi, cmd, crq); @@ -2088,7 +2083,7 @@ static long ibmvscsis_mad(struct scsi_info *vscsi, struct viosrp_crq *crq) ibmvscsis_free_cmd_resources(vscsi, cmd); } - pr_debug("Leaving mad, rc %ld\n", rc); + dev_dbg(&vscsi->dev, "Leaving mad, rc %ld\n", rc); return rc; } @@ -2211,20 +2206,21 @@ static int ibmvscsis_make_nexus(struct ibmvscsis_tport *tport) { char *name = tport->tport_name; struct ibmvscsis_nexus *nexus; + struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); int rc; if (tport->ibmv_nexus) { - pr_debug("tport->ibmv_nexus already exists\n"); + dev_dbg(&vscsi->dev, "tport->ibmv_nexus already exists\n"); return 0; } nexus = kzalloc(sizeof(*nexus), GFP_KERNEL); if (!nexus) { - pr_err("Unable to allocate struct ibmvscsis_nexus\n"); + dev_err(&vscsi->dev, "Unable to allocate struct ibmvscsis_nexus\n"); return -ENOMEM; } - nexus->se_sess = target_alloc_session(&tport->se_tpg, 0, 0, + nexus->se_sess = target_setup_session(&tport->se_tpg, 0, 0, TARGET_PROT_NORMAL, name, nexus, NULL); if (IS_ERR(nexus->se_sess)) { @@ -2257,9 +2253,7 @@ static int ibmvscsis_drop_nexus(struct ibmvscsis_tport *tport) /* * Release the SCSI I_T Nexus to the emulated ibmvscsis Target Port */ - target_wait_for_sess_cmds(se_sess); - transport_deregister_session_configfs(se_sess); - transport_deregister_session(se_sess); + target_remove_session(se_sess); tport->ibmv_nexus = NULL; kfree(nexus); @@ -2316,7 +2310,7 @@ static long ibmvscsis_srp_login(struct scsi_info *vscsi, cmd->rsp.format = VIOSRP_SRP_FORMAT; cmd->rsp.tag = req->tag; - pr_debug("srp_login: reason 0x%x\n", reason); + dev_dbg(&vscsi->dev, "srp_login: reason 0x%x\n", reason); if (reason) rc = ibmvscsis_srp_login_rej(vscsi, cmd, reason); @@ -2333,7 +2327,7 @@ static long ibmvscsis_srp_login(struct scsi_info *vscsi, ibmvscsis_free_cmd_resources(vscsi, cmd); } - pr_debug("Leaving srp_login, rc %ld\n", rc); + dev_dbg(&vscsi->dev, "Leaving srp_login, rc %ld\n", rc); return rc; } @@ -2355,7 +2349,6 @@ static long ibmvscsis_srp_i_logout(struct scsi_info *vscsi, { struct iu_entry *iue = cmd->iue; struct srp_i_logout *log_out = &vio_iu(iue)->srp.i_logout; - long rc = ADAPT_SUCCESS; if ((vscsi->debit > 0) || !list_empty(&vscsi->schedule_q) || !list_empty(&vscsi->waiting_rsp)) { @@ -2371,7 +2364,7 @@ static long ibmvscsis_srp_i_logout(struct scsi_info *vscsi, ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, 0); } - return rc; + return ADAPT_SUCCESS; } /* Called with intr lock held */ @@ -2415,8 +2408,8 @@ static void ibmvscsis_srp_cmd(struct scsi_info *vscsi, struct viosrp_crq *crq) case SRP_TSK_MGMT: tsk = &vio_iu(iue)->srp.tsk_mgmt; - pr_debug("tsk_mgmt tag: %llu (0x%llx)\n", tsk->tag, - tsk->tag); + dev_dbg(&vscsi->dev, "tsk_mgmt tag: %llu (0x%llx)\n", + tsk->tag, tsk->tag); cmd->rsp.tag = tsk->tag; vscsi->debit += 1; cmd->type = TASK_MANAGEMENT; @@ -2425,8 +2418,8 @@ static void ibmvscsis_srp_cmd(struct scsi_info *vscsi, struct viosrp_crq *crq) break; case SRP_CMD: - pr_debug("srp_cmd tag: %llu (0x%llx)\n", srp->tag, - srp->tag); + dev_dbg(&vscsi->dev, "srp_cmd tag: %llu (0x%llx)\n", + srp->tag, srp->tag); cmd->rsp.tag = srp->tag; vscsi->debit += 1; cmd->type = SCSI_CDB; @@ -2494,8 +2487,10 @@ static long ibmvscsis_ping_response(struct scsi_info *vscsi) break; case H_CLOSED: vscsi->flags |= CLIENT_FAILED; + fallthrough; case H_DROPPED: vscsi->flags |= RESPONSE_Q_DOWN; + fallthrough; case H_REMOTE_PARM: dev_err(&vscsi->dev, "ping_response: h_send_crq failed, rc %ld\n", rc); @@ -2603,7 +2598,7 @@ static int read_dma_window(struct scsi_info *vscsi) "ibm,my-dma-window", NULL); if (!dma_window) { - pr_err("Couldn't find ibm,my-dma-window property\n"); + dev_err(&vscsi->dev, "Couldn't find ibm,my-dma-window property\n"); return -1; } @@ -2613,7 +2608,7 @@ static int read_dma_window(struct scsi_info *vscsi) prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-address-cells", NULL); if (!prop) { - pr_warn("Couldn't find ibm,#dma-address-cells property\n"); + dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-address-cells property\n"); dma_window++; } else { dma_window += be32_to_cpu(*prop); @@ -2622,7 +2617,7 @@ static int read_dma_window(struct scsi_info *vscsi) prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-size-cells", NULL); if (!prop) { - pr_warn("Couldn't find ibm,#dma-size-cells property\n"); + dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-size-cells property\n"); dma_window++; } else { dma_window += be32_to_cpu(*prop); @@ -2673,7 +2668,6 @@ static void ibmvscsis_parse_cmd(struct scsi_info *vscsi, u64 data_len = 0; enum dma_data_direction dir; int attr = 0; - int rc = 0; nexus = vscsi->tport.ibmv_nexus; /* @@ -2728,17 +2722,9 @@ static void ibmvscsis_parse_cmd(struct scsi_info *vscsi, srp->lun.scsi_lun[0] &= 0x3f; - rc = target_submit_cmd(&cmd->se_cmd, nexus->se_sess, srp->cdb, - cmd->sense_buf, scsilun_to_int(&srp->lun), - data_len, attr, dir, 0); - if (rc) { - dev_err(&vscsi->dev, "target_submit_cmd failed, rc %d\n", rc); - spin_lock_bh(&vscsi->intr_lock); - list_del(&cmd->list); - ibmvscsis_free_cmd_resources(vscsi, cmd); - spin_unlock_bh(&vscsi->intr_lock); - goto fail; - } + target_submit_cmd(&cmd->se_cmd, nexus->se_sess, srp->cdb, + cmd->sense_buf, scsilun_to_int(&srp->lun), + data_len, attr, dir, 0); return; fail: @@ -2808,8 +2794,8 @@ static void ibmvscsis_parse_task(struct scsi_info *vscsi, srp_tsk->lun.scsi_lun[0] &= 0x3f; - pr_debug("calling submit_tmr, func %d\n", - srp_tsk->tsk_mgmt_func); + dev_dbg(&vscsi->dev, "calling submit_tmr, func %d\n", + srp_tsk->tsk_mgmt_func); rc = target_submit_tmr(&cmd->se_cmd, nexus->se_sess, NULL, scsilun_to_int(&srp_tsk->lun), srp_tsk, tcm_type, GFP_KERNEL, tag_to_abort, 0); @@ -2936,9 +2922,7 @@ static long ibmvscsis_alloctimer(struct scsi_info *vscsi) struct timer_cb *p_timer; p_timer = &vscsi->rsp_q_timer; - hrtimer_init(&p_timer->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); - - p_timer->timer.function = ibmvscsis_service_wait_q; + hrtimer_setup(&p_timer->timer, ibmvscsis_service_wait_q, CLOCK_MONOTONIC, HRTIMER_MODE_REL); p_timer->started = false; p_timer->timer_pops = 0; @@ -3113,8 +3097,8 @@ static long srp_build_response(struct scsi_info *vscsi, if (cmd->type == SCSI_CDB) { rsp->status = ibmvscsis_fast_fail(vscsi, cmd); if (rsp->status) { - pr_debug("build_resp: cmd %p, scsi status %d\n", cmd, - (int)rsp->status); + dev_dbg(&vscsi->dev, "build_resp: cmd %p, scsi status %d\n", + cmd, (int)rsp->status); ibmvscsis_determine_resid(se_cmd, rsp); if (se_cmd->scsi_sense_length && se_cmd->sense_buffer) { rsp->sense_data_len = @@ -3127,7 +3111,8 @@ static long srp_build_response(struct scsi_info *vscsi, rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> UCSOLNT_RESP_SHIFT; } else if (cmd->flags & CMD_FAST_FAIL) { - pr_debug("build_resp: cmd %p, fast fail\n", cmd); + dev_dbg(&vscsi->dev, "build_resp: cmd %p, fast fail\n", + cmd); rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >> UCSOLNT_RESP_SHIFT; } else { @@ -3340,7 +3325,7 @@ static void ibmvscsis_handle_crq(unsigned long data) spin_lock_bh(&vscsi->intr_lock); - pr_debug("got interrupt\n"); + dev_dbg(&vscsi->dev, "got interrupt\n"); /* * if we are in a path where we are waiting for all pending commands @@ -3350,8 +3335,8 @@ static void ibmvscsis_handle_crq(unsigned long data) if (TARGET_STOP(vscsi)) { vio_enable_interrupts(vscsi->dma_dev); - pr_debug("handle_crq, don't process: flags 0x%x, state 0x%hx\n", - vscsi->flags, vscsi->state); + dev_dbg(&vscsi->dev, "handle_crq, don't process: flags 0x%x, state 0x%hx\n", + vscsi->flags, vscsi->state); spin_unlock_bh(&vscsi->intr_lock); return; } @@ -3414,20 +3399,20 @@ cmd_work: if (ack) { vio_enable_interrupts(vscsi->dma_dev); ack = false; - pr_debug("handle_crq, reenabling interrupts\n"); + dev_dbg(&vscsi->dev, "handle_crq, reenabling interrupts\n"); } valid = crq->valid; dma_rmb(); if (valid) goto cmd_work; } else { - pr_debug("handle_crq, error: flags 0x%x, state 0x%hx, crq index 0x%x\n", - vscsi->flags, vscsi->state, vscsi->cmd_q.index); + dev_dbg(&vscsi->dev, "handle_crq, error: flags 0x%x, state 0x%hx, crq index 0x%x\n", + vscsi->flags, vscsi->state, vscsi->cmd_q.index); } - pr_debug("Leaving handle_crq: schedule_q empty %d, flags 0x%x, state 0x%hx\n", - (int)list_empty(&vscsi->schedule_q), vscsi->flags, - vscsi->state); + dev_dbg(&vscsi->dev, "Leaving handle_crq: schedule_q empty %d, flags 0x%x, state 0x%hx\n", + (int)list_empty(&vscsi->schedule_q), vscsi->flags, + vscsi->state); spin_unlock_bh(&vscsi->intr_lock); } @@ -3438,12 +3423,11 @@ static int ibmvscsis_probe(struct vio_dev *vdev, struct scsi_info *vscsi; int rc = 0; long hrc = 0; - char wq_name[24]; vscsi = kzalloc(sizeof(*vscsi), GFP_KERNEL); if (!vscsi) { rc = -ENOMEM; - pr_err("probe: allocation of adapter failed\n"); + dev_err(&vdev->dev, "probe: allocation of adapter failed\n"); return rc; } @@ -3456,20 +3440,19 @@ static int ibmvscsis_probe(struct vio_dev *vdev, snprintf(vscsi->tport.tport_name, IBMVSCSIS_NAMELEN, "%s", dev_name(&vdev->dev)); - pr_debug("probe tport_name: %s\n", vscsi->tport.tport_name); + dev_dbg(&vscsi->dev, "probe tport_name: %s\n", vscsi->tport.tport_name); rc = read_dma_window(vscsi); if (rc) goto free_adapter; - pr_debug("Probe: liobn 0x%x, riobn 0x%x\n", - vscsi->dds.window[LOCAL].liobn, - vscsi->dds.window[REMOTE].liobn); + dev_dbg(&vscsi->dev, "Probe: liobn 0x%x, riobn 0x%x\n", + vscsi->dds.window[LOCAL].liobn, + vscsi->dds.window[REMOTE].liobn); - strcpy(vscsi->eye, "VSCSI "); - strncat(vscsi->eye, vdev->name, MAX_EYE); + snprintf(vscsi->eye, sizeof(vscsi->eye), "VSCSI %s", vdev->name); vscsi->dds.unit_id = vdev->unit_address; - strncpy(vscsi->dds.partition_name, partition_name, + strscpy(vscsi->dds.partition_name, partition_name, sizeof(vscsi->dds.partition_name)); vscsi->dds.partition_num = partition_number; @@ -3541,8 +3524,8 @@ static int ibmvscsis_probe(struct vio_dev *vdev, * client can connect" and the client isn't activated yet. * We'll make the call again when he sends an init msg. */ - pr_debug("probe hrc %ld, client partition num %d\n", - hrc, vscsi->client_data.partition_number); + dev_dbg(&vscsi->dev, "probe hrc %ld, client partition num %d\n", + hrc, vscsi->client_data.partition_number); tasklet_init(&vscsi->work_task, ibmvscsis_handle_crq, (unsigned long)vscsi); @@ -3550,8 +3533,9 @@ static int ibmvscsis_probe(struct vio_dev *vdev, init_completion(&vscsi->wait_idle); init_completion(&vscsi->unconfig); - snprintf(wq_name, 24, "ibmvscsis%s", dev_name(&vdev->dev)); - vscsi->work_q = create_workqueue(wq_name); + vscsi->work_q = alloc_workqueue("ibmvscsis%s", + WQ_MEM_RECLAIM | WQ_PERCPU, 1, + dev_name(&vdev->dev)); if (!vscsi->work_q) { rc = -ENOMEM; dev_err(&vscsi->dev, "create_workqueue failed\n"); @@ -3598,11 +3582,11 @@ free_adapter: return rc; } -static int ibmvscsis_remove(struct vio_dev *vdev) +static void ibmvscsis_remove(struct vio_dev *vdev) { struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev); - pr_debug("remove (%s)\n", dev_name(&vscsi->dma_dev->dev)); + dev_dbg(&vscsi->dev, "remove (%s)\n", dev_name(&vscsi->dma_dev->dev)); spin_lock_bh(&vscsi->intr_lock); ibmvscsis_post_disconnect(vscsi, UNCONFIGURING, 0); @@ -3625,20 +3609,12 @@ static int ibmvscsis_remove(struct vio_dev *vdev) list_del(&vscsi->list); spin_unlock_bh(&ibmvscsis_dev_lock); kfree(vscsi); - - return 0; -} - -static ssize_t system_id_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - return snprintf(buf, PAGE_SIZE, "%s\n", system_id); } static ssize_t partition_number_show(struct device *dev, struct device_attribute *attr, char *buf) { - return snprintf(buf, PAGE_SIZE, "%x\n", partition_number); + return sysfs_emit(buf, "%x\n", partition_number); } static ssize_t unit_address_show(struct device *dev, @@ -3646,7 +3622,7 @@ static ssize_t unit_address_show(struct device *dev, { struct scsi_info *vscsi = container_of(dev, struct scsi_info, dev); - return snprintf(buf, PAGE_SIZE, "%x\n", vscsi->dma_dev->unit_address); + return sysfs_emit(buf, "%x\n", vscsi->dma_dev->unit_address); } static int ibmvscsis_get_system_info(void) @@ -3666,7 +3642,7 @@ static int ibmvscsis_get_system_info(void) name = of_get_property(rootdn, "ibm,partition-name", NULL); if (name) - strncpy(partition_name, name, sizeof(partition_name)); + strscpy(partition_name, name, sizeof(partition_name)); num = of_get_property(rootdn, "ibm,partition-no", NULL); if (num) @@ -3688,11 +3664,6 @@ static int ibmvscsis_get_system_info(void) return 0; } -static char *ibmvscsis_get_fabric_name(void) -{ - return "ibmvscsis"; -} - static char *ibmvscsis_get_fabric_wwn(struct se_portal_group *se_tpg) { struct ibmvscsis_tport *tport = @@ -3719,16 +3690,6 @@ static int ibmvscsis_check_true(struct se_portal_group *se_tpg) return 1; } -static int ibmvscsis_check_false(struct se_portal_group *se_tpg) -{ - return 0; -} - -static u32 ibmvscsis_tpg_get_inst_index(struct se_portal_group *se_tpg) -{ - return 1; -} - static int ibmvscsis_check_stop_free(struct se_cmd *se_cmd) { return target_put_sess_cmd(se_cmd); @@ -3747,11 +3708,6 @@ static void ibmvscsis_release_cmd(struct se_cmd *se_cmd) spin_unlock_bh(&vscsi->intr_lock); } -static u32 ibmvscsis_sess_get_index(struct se_session *se_sess) -{ - return 0; -} - static int ibmvscsis_write_pending(struct se_cmd *se_cmd) { struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd, @@ -3766,14 +3722,16 @@ static int ibmvscsis_write_pending(struct se_cmd *se_cmd) * attempt an srp_transfer_data. */ if ((vscsi->flags & (CLIENT_FAILED | RESPONSE_Q_DOWN))) { - pr_err("write_pending failed since: %d\n", vscsi->flags); - return 0; + dev_err(&vscsi->dev, "write_pending failed since: %d\n", + vscsi->flags); + return -EIO; + } rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma, 1, 1); if (rc) { - pr_err("srp_transfer_data() failed: %d\n", rc); + dev_err(&vscsi->dev, "srp_transfer_data() failed: %d\n", rc); return -EIO; } /* @@ -3784,35 +3742,19 @@ static int ibmvscsis_write_pending(struct se_cmd *se_cmd) return 0; } -static int ibmvscsis_write_pending_status(struct se_cmd *se_cmd) -{ - return 0; -} - -static void ibmvscsis_set_default_node_attrs(struct se_node_acl *nacl) -{ -} - -static int ibmvscsis_get_cmd_state(struct se_cmd *se_cmd) -{ - return 0; -} - static int ibmvscsis_queue_data_in(struct se_cmd *se_cmd) { struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd, se_cmd); struct iu_entry *iue = cmd->iue; struct scsi_info *vscsi = cmd->adapter; - char *sd; uint len = 0; int rc; rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma, 1, 1); if (rc) { - pr_err("srp_transfer_data failed: %d\n", rc); - sd = se_cmd->sense_buffer; + dev_err(&vscsi->dev, "srp_transfer_data failed: %d\n", rc); se_cmd->scsi_sense_length = 18; memset(se_cmd->sense_buffer, 0, se_cmd->scsi_sense_length); /* Logical Unit Communication Time-out asc/ascq = 0x0801 */ @@ -3834,7 +3776,7 @@ static int ibmvscsis_queue_status(struct se_cmd *se_cmd) struct scsi_info *vscsi = cmd->adapter; uint len; - pr_debug("queue_status %p\n", se_cmd); + dev_dbg(&vscsi->dev, "queue_status %p\n", se_cmd); srp_build_response(vscsi, cmd, &len); cmd->rsp.format = SRP_FORMAT; @@ -3854,8 +3796,8 @@ static void ibmvscsis_queue_tm_rsp(struct se_cmd *se_cmd) u64 tag_to_abort = be64_to_cpu(srp_tsk->task_tag); uint len; - pr_debug("queue_tm_rsp %p, status %d\n", - se_cmd, (int)se_cmd->se_tmr_req->response); + dev_dbg(&vscsi->dev, "queue_tm_rsp %p, status %d\n", + se_cmd, (int)se_cmd->se_tmr_req->response); if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK && cmd->se_cmd.se_tmr_req->response == TMR_TASK_DOES_NOT_EXIST) { @@ -3877,8 +3819,12 @@ static void ibmvscsis_queue_tm_rsp(struct se_cmd *se_cmd) static void ibmvscsis_aborted_task(struct se_cmd *se_cmd) { - pr_debug("ibmvscsis_aborted_task %p task_tag: %llu\n", - se_cmd, se_cmd->tag); + struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd, + se_cmd); + struct scsi_info *vscsi = cmd->adapter; + + dev_dbg(&vscsi->dev, "ibmvscsis_aborted_task %p task_tag: %llu\n", + se_cmd, se_cmd->tag); } static struct se_wwn *ibmvscsis_make_tport(struct target_fabric_configfs *tf, @@ -3886,12 +3832,14 @@ static struct se_wwn *ibmvscsis_make_tport(struct target_fabric_configfs *tf, const char *name) { struct ibmvscsis_tport *tport; + struct scsi_info *vscsi; tport = ibmvscsis_lookup_port(name); if (tport) { + vscsi = container_of(tport, struct scsi_info, tport); tport->tport_proto_id = SCSI_PROTOCOL_SRP; - pr_debug("make_tport(%s), pointer:%p, tport_id:%x\n", - name, tport, tport->tport_proto_id); + dev_dbg(&vscsi->dev, "make_tport(%s), pointer:%p, tport_id:%x\n", + name, tport, tport->tport_proto_id); return &tport->tport_wwn; } @@ -3903,13 +3851,13 @@ static void ibmvscsis_drop_tport(struct se_wwn *wwn) struct ibmvscsis_tport *tport = container_of(wwn, struct ibmvscsis_tport, tport_wwn); + struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); - pr_debug("drop_tport(%s)\n", - config_item_name(&tport->tport_wwn.wwn_group.cg_item)); + dev_dbg(&vscsi->dev, "drop_tport(%s)\n", + config_item_name(&tport->tport_wwn.wwn_group.cg_item)); } static struct se_portal_group *ibmvscsis_make_tpg(struct se_wwn *wwn, - struct config_group *group, const char *name) { struct ibmvscsis_tport *tport = @@ -3965,47 +3913,22 @@ static struct configfs_attribute *ibmvscsis_wwn_attrs[] = { NULL, }; -static ssize_t ibmvscsis_tpg_enable_show(struct config_item *item, - char *page) -{ - struct se_portal_group *se_tpg = to_tpg(item); - struct ibmvscsis_tport *tport = container_of(se_tpg, - struct ibmvscsis_tport, - se_tpg); - - return snprintf(page, PAGE_SIZE, "%d\n", (tport->enabled) ? 1 : 0); -} -static ssize_t ibmvscsis_tpg_enable_store(struct config_item *item, - const char *page, size_t count) +static int ibmvscsis_enable_tpg(struct se_portal_group *se_tpg, bool enable) { - struct se_portal_group *se_tpg = to_tpg(item); struct ibmvscsis_tport *tport = container_of(se_tpg, struct ibmvscsis_tport, se_tpg); struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport); - unsigned long tmp; - int rc; long lrc; - rc = kstrtoul(page, 0, &tmp); - if (rc < 0) { - pr_err("Unable to extract srpt_tpg_store_enable\n"); - return -EINVAL; - } - - if ((tmp != 0) && (tmp != 1)) { - pr_err("Illegal value for srpt_tpg_store_enable\n"); - return -EINVAL; - } - - if (tmp) { + if (enable) { spin_lock_bh(&vscsi->intr_lock); tport->enabled = true; lrc = ibmvscsis_enable_change_state(vscsi); if (lrc) - pr_err("enable_change_state failed, rc %ld state %d\n", - lrc, vscsi->state); + dev_err(&vscsi->dev, "enable_change_state failed, rc %ld state %d\n", + lrc, vscsi->state); spin_unlock_bh(&vscsi->intr_lock); } else { spin_lock_bh(&vscsi->intr_lock); @@ -4015,37 +3938,21 @@ static ssize_t ibmvscsis_tpg_enable_store(struct config_item *item, spin_unlock_bh(&vscsi->intr_lock); } - pr_debug("tpg_enable_store, tmp %ld, state %d\n", tmp, vscsi->state); - - return count; + return 0; } -CONFIGFS_ATTR(ibmvscsis_tpg_, enable); - -static struct configfs_attribute *ibmvscsis_tpg_attrs[] = { - &ibmvscsis_tpg_attr_enable, - NULL, -}; static const struct target_core_fabric_ops ibmvscsis_ops = { .module = THIS_MODULE, - .name = "ibmvscsis", + .fabric_name = "ibmvscsis", .max_data_sg_nents = MAX_TXU / PAGE_SIZE, - .get_fabric_name = ibmvscsis_get_fabric_name, .tpg_get_wwn = ibmvscsis_get_fabric_wwn, .tpg_get_tag = ibmvscsis_get_tag, .tpg_get_default_depth = ibmvscsis_get_default_depth, .tpg_check_demo_mode = ibmvscsis_check_true, .tpg_check_demo_mode_cache = ibmvscsis_check_true, - .tpg_check_demo_mode_write_protect = ibmvscsis_check_false, - .tpg_check_prod_mode_write_protect = ibmvscsis_check_false, - .tpg_get_inst_index = ibmvscsis_tpg_get_inst_index, .check_stop_free = ibmvscsis_check_stop_free, .release_cmd = ibmvscsis_release_cmd, - .sess_get_index = ibmvscsis_sess_get_index, .write_pending = ibmvscsis_write_pending, - .write_pending_status = ibmvscsis_write_pending_status, - .set_default_node_attributes = ibmvscsis_set_default_node_attrs, - .get_cmd_state = ibmvscsis_get_cmd_state, .queue_data_in = ibmvscsis_queue_data_in, .queue_status = ibmvscsis_queue_status, .queue_tm_rsp = ibmvscsis_queue_tm_rsp, @@ -4056,16 +3963,18 @@ static const struct target_core_fabric_ops ibmvscsis_ops = { .fabric_make_wwn = ibmvscsis_make_tport, .fabric_drop_wwn = ibmvscsis_drop_tport, .fabric_make_tpg = ibmvscsis_make_tpg, + .fabric_enable_tpg = ibmvscsis_enable_tpg, .fabric_drop_tpg = ibmvscsis_drop_tpg, .tfc_wwn_attrs = ibmvscsis_wwn_attrs, - .tfc_tpg_base_attrs = ibmvscsis_tpg_attrs, + + .default_submit_type = TARGET_DIRECT_SUBMIT, + .direct_submit_supp = 1, }; static void ibmvscsis_dev_release(struct device *dev) {}; -static struct device_attribute dev_attr_system_id = - __ATTR(system_id, S_IRUGO, system_id_show, NULL); +static DEVICE_STRING_ATTR_RO(system_id, S_IRUGO, system_id); static struct device_attribute dev_attr_partition_number = __ATTR(partition_number, S_IRUGO, partition_number_show, NULL); @@ -4074,7 +3983,7 @@ static struct device_attribute dev_attr_unit_address = __ATTR(unit_address, S_IRUGO, unit_address_show, NULL); static struct attribute *ibmvscsis_dev_attrs[] = { - &dev_attr_system_id.attr, + &dev_attr_system_id.attr.attr, &dev_attr_partition_number.attr, &dev_attr_unit_address.attr, }; @@ -4086,7 +3995,7 @@ static struct class ibmvscsis_class = { .dev_groups = ibmvscsis_dev_groups, }; -static struct vio_device_id ibmvscsis_device_table[] = { +static const struct vio_device_id ibmvscsis_device_table[] = { { "v-scsi-host", "IBM,v-scsi-host" }, { "", "" } }; |
