cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ibmvscsi_tgt.c (109846B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*******************************************************************************
      3 * IBM Virtual SCSI Target Driver
      4 * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
      5 *			   Santiago Leon (santil@us.ibm.com) IBM Corp.
      6 *			   Linda Xie (lxie@us.ibm.com) IBM Corp.
      7 *
      8 * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
      9 * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>
     10 *
     11 * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
     12 * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>
     13 *
     14 ****************************************************************************/
     15
     16#define pr_fmt(fmt)	KBUILD_MODNAME ": " fmt
     17
     18#include <linux/module.h>
     19#include <linux/kernel.h>
     20#include <linux/slab.h>
     21#include <linux/types.h>
     22#include <linux/list.h>
     23#include <linux/string.h>
     24#include <linux/delay.h>
     25#include <linux/of.h>
     26
     27#include <target/target_core_base.h>
     28#include <target/target_core_fabric.h>
     29
     30#include <asm/hvcall.h>
     31#include <asm/vio.h>
     32
     33#include <scsi/viosrp.h>
     34
     35#include "ibmvscsi_tgt.h"
     36
     37#define IBMVSCSIS_VERSION	"v0.2"
     38
     39#define	INITIAL_SRP_LIMIT	1024
     40#define	DEFAULT_MAX_SECTORS	256
     41#define MAX_TXU			1024 * 1024
     42
     43static uint max_vdma_size = MAX_H_COPY_RDMA;
     44
     45static char system_id[SYS_ID_NAME_LEN] = "";
     46static char partition_name[PARTITION_NAMELEN] = "UNKNOWN";
     47static uint partition_number = -1;
     48
     49/* Adapter list and lock to control it */
     50static DEFINE_SPINLOCK(ibmvscsis_dev_lock);
     51static LIST_HEAD(ibmvscsis_dev_list);
     52
     53static long ibmvscsis_parse_command(struct scsi_info *vscsi,
     54				    struct viosrp_crq *crq);
     55
     56static void ibmvscsis_adapter_idle(struct scsi_info *vscsi);
     57
     58static void ibmvscsis_determine_resid(struct se_cmd *se_cmd,
     59				      struct srp_rsp *rsp)
     60{
     61	u32 residual_count = se_cmd->residual_count;
     62
     63	if (!residual_count)
     64		return;
     65
     66	if (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) {
     67		if (se_cmd->data_direction == DMA_TO_DEVICE) {
     68			/* residual data from an underflow write */
     69			rsp->flags = SRP_RSP_FLAG_DOUNDER;
     70			rsp->data_out_res_cnt = cpu_to_be32(residual_count);
     71		} else if (se_cmd->data_direction == DMA_FROM_DEVICE) {
     72			/* residual data from an underflow read */
     73			rsp->flags = SRP_RSP_FLAG_DIUNDER;
     74			rsp->data_in_res_cnt = cpu_to_be32(residual_count);
     75		}
     76	} else if (se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) {
     77		if (se_cmd->data_direction == DMA_TO_DEVICE) {
     78			/* residual data from an overflow write */
     79			rsp->flags = SRP_RSP_FLAG_DOOVER;
     80			rsp->data_out_res_cnt = cpu_to_be32(residual_count);
     81		} else if (se_cmd->data_direction == DMA_FROM_DEVICE) {
     82			/* residual data from an overflow read */
     83			rsp->flags = SRP_RSP_FLAG_DIOVER;
     84			rsp->data_in_res_cnt = cpu_to_be32(residual_count);
     85		}
     86	}
     87}
     88
     89/**
     90 * connection_broken() - Determine if the connection to the client is good
     91 * @vscsi:	Pointer to our adapter structure
     92 *
     93 * This function attempts to send a ping MAD to the client. If the call to
     94 * queue the request returns H_CLOSED then the connection has been broken
     95 * and the function returns TRUE.
     96 *
     97 * EXECUTION ENVIRONMENT:
     98 *	Interrupt or Process environment
     99 */
    100static bool connection_broken(struct scsi_info *vscsi)
    101{
    102	struct viosrp_crq *crq;
    103	u64 buffer[2] = { 0, 0 };
    104	long h_return_code;
    105	bool rc = false;
    106
    107	/* create a PING crq */
    108	crq = (struct viosrp_crq *)&buffer;
    109	crq->valid = VALID_CMD_RESP_EL;
    110	crq->format = MESSAGE_IN_CRQ;
    111	crq->status = PING;
    112
    113	h_return_code = h_send_crq(vscsi->dds.unit_id,
    114				   cpu_to_be64(buffer[MSG_HI]),
    115				   cpu_to_be64(buffer[MSG_LOW]));
    116
    117	dev_dbg(&vscsi->dev, "Connection_broken: rc %ld\n", h_return_code);
    118
    119	if (h_return_code == H_CLOSED)
    120		rc = true;
    121
    122	return rc;
    123}
    124
    125/**
    126 * ibmvscsis_unregister_command_q() - Helper Function-Unregister Command Queue
    127 * @vscsi:	Pointer to our adapter structure
    128 *
    129 * This function calls h_free_q then frees the interrupt bit etc.
    130 * It must release the lock before doing so because of the time it can take
    131 * for h_free_crq in PHYP
    132 * NOTE: * the caller must make sure that state and or flags will prevent
    133 *	   interrupt handler from scheduling work.
    134 *       * anyone calling this function may need to set the CRQ_CLOSED flag
    135 *	   we can't do it here, because we don't have the lock
    136 *
    137 * EXECUTION ENVIRONMENT:
    138 *	Process level
    139 */
    140static long ibmvscsis_unregister_command_q(struct scsi_info *vscsi)
    141{
    142	long qrc;
    143	long rc = ADAPT_SUCCESS;
    144	int ticks = 0;
    145
    146	do {
    147		qrc = h_free_crq(vscsi->dds.unit_id);
    148		switch (qrc) {
    149		case H_SUCCESS:
    150			spin_lock_bh(&vscsi->intr_lock);
    151			vscsi->flags &= ~PREP_FOR_SUSPEND_FLAGS;
    152			spin_unlock_bh(&vscsi->intr_lock);
    153			break;
    154
    155		case H_HARDWARE:
    156		case H_PARAMETER:
    157			dev_err(&vscsi->dev, "unregister_command_q: error from h_free_crq %ld\n",
    158				qrc);
    159			rc = ERROR;
    160			break;
    161
    162		case H_BUSY:
    163		case H_LONG_BUSY_ORDER_1_MSEC:
    164			/* msleep not good for small values */
    165			usleep_range(1000, 2000);
    166			ticks += 1;
    167			break;
    168		case H_LONG_BUSY_ORDER_10_MSEC:
    169			usleep_range(10000, 20000);
    170			ticks += 10;
    171			break;
    172		case H_LONG_BUSY_ORDER_100_MSEC:
    173			msleep(100);
    174			ticks += 100;
    175			break;
    176		case H_LONG_BUSY_ORDER_1_SEC:
    177			ssleep(1);
    178			ticks += 1000;
    179			break;
    180		case H_LONG_BUSY_ORDER_10_SEC:
    181			ssleep(10);
    182			ticks += 10000;
    183			break;
    184		case H_LONG_BUSY_ORDER_100_SEC:
    185			ssleep(100);
    186			ticks += 100000;
    187			break;
    188		default:
    189			dev_err(&vscsi->dev, "unregister_command_q: unknown error %ld from h_free_crq\n",
    190				qrc);
    191			rc = ERROR;
    192			break;
    193		}
    194
    195		/*
    196		 * dont wait more then 300 seconds
    197		 * ticks are in milliseconds more or less
    198		 */
    199		if (ticks > 300000 && qrc != H_SUCCESS) {
    200			rc = ERROR;
    201			dev_err(&vscsi->dev, "Excessive wait for h_free_crq\n");
    202		}
    203	} while (qrc != H_SUCCESS && rc == ADAPT_SUCCESS);
    204
    205	dev_dbg(&vscsi->dev, "Freeing CRQ: phyp rc %ld, rc %ld\n", qrc, rc);
    206
    207	return rc;
    208}
    209
    210/**
    211 * ibmvscsis_delete_client_info() - Helper function to Delete Client Info
    212 * @vscsi:	Pointer to our adapter structure
    213 * @client_closed:	True if client closed its queue
    214 *
    215 * Deletes information specific to the client when the client goes away
    216 *
    217 * EXECUTION ENVIRONMENT:
    218 *	Interrupt or Process
    219 */
    220static void ibmvscsis_delete_client_info(struct scsi_info *vscsi,
    221					 bool client_closed)
    222{
    223	vscsi->client_cap = 0;
    224
    225	/*
    226	 * Some things we don't want to clear if we're closing the queue,
    227	 * because some clients don't resend the host handshake when they
    228	 * get a transport event.
    229	 */
    230	if (client_closed)
    231		vscsi->client_data.os_type = 0;
    232}
    233
    234/**
    235 * ibmvscsis_free_command_q() - Free Command Queue
    236 * @vscsi:	Pointer to our adapter structure
    237 *
    238 * This function calls unregister_command_q, then clears interrupts and
    239 * any pending interrupt acknowledgments associated with the command q.
    240 * It also clears memory if there is no error.
    241 *
    242 * PHYP did not meet the PAPR architecture so that we must give up the
    243 * lock. This causes a timing hole regarding state change.  To close the
    244 * hole this routine does accounting on any change that occurred during
    245 * the time the lock is not held.
    246 * NOTE: must give up and then acquire the interrupt lock, the caller must
    247 *	 make sure that state and or flags will prevent interrupt handler from
    248 *	 scheduling work.
    249 *
    250 * EXECUTION ENVIRONMENT:
    251 *	Process level, interrupt lock is held
    252 */
    253static long ibmvscsis_free_command_q(struct scsi_info *vscsi)
    254{
    255	int bytes;
    256	u32 flags_under_lock;
    257	u16 state_under_lock;
    258	long rc = ADAPT_SUCCESS;
    259
    260	if (!(vscsi->flags & CRQ_CLOSED)) {
    261		vio_disable_interrupts(vscsi->dma_dev);
    262
    263		state_under_lock = vscsi->new_state;
    264		flags_under_lock = vscsi->flags;
    265		vscsi->phyp_acr_state = 0;
    266		vscsi->phyp_acr_flags = 0;
    267
    268		spin_unlock_bh(&vscsi->intr_lock);
    269		rc = ibmvscsis_unregister_command_q(vscsi);
    270		spin_lock_bh(&vscsi->intr_lock);
    271
    272		if (state_under_lock != vscsi->new_state)
    273			vscsi->phyp_acr_state = vscsi->new_state;
    274
    275		vscsi->phyp_acr_flags = ((~flags_under_lock) & vscsi->flags);
    276
    277		if (rc == ADAPT_SUCCESS) {
    278			bytes = vscsi->cmd_q.size * PAGE_SIZE;
    279			memset(vscsi->cmd_q.base_addr, 0, bytes);
    280			vscsi->cmd_q.index = 0;
    281			vscsi->flags |= CRQ_CLOSED;
    282
    283			ibmvscsis_delete_client_info(vscsi, false);
    284		}
    285
    286		dev_dbg(&vscsi->dev, "free_command_q: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n",
    287			vscsi->flags, vscsi->state, vscsi->phyp_acr_flags,
    288			vscsi->phyp_acr_state);
    289	}
    290	return rc;
    291}
    292
    293/**
    294 * ibmvscsis_cmd_q_dequeue() - Get valid Command element
    295 * @mask:	Mask to use in case index wraps
    296 * @current_index:	Current index into command queue
    297 * @base_addr:	Pointer to start of command queue
    298 *
    299 * Returns a pointer to a valid command element or NULL, if the command
    300 * queue is empty
    301 *
    302 * EXECUTION ENVIRONMENT:
    303 *	Interrupt environment, interrupt lock held
    304 */
    305static struct viosrp_crq *ibmvscsis_cmd_q_dequeue(uint mask,
    306						  uint *current_index,
    307						  struct viosrp_crq *base_addr)
    308{
    309	struct viosrp_crq *ptr;
    310
    311	ptr = base_addr + *current_index;
    312
    313	if (ptr->valid) {
    314		*current_index = (*current_index + 1) & mask;
    315		dma_rmb();
    316	} else {
    317		ptr = NULL;
    318	}
    319
    320	return ptr;
    321}
    322
    323/**
    324 * ibmvscsis_send_init_message() - send initialize message to the client
    325 * @vscsi:	Pointer to our adapter structure
    326 * @format:	Which Init Message format to send
    327 *
    328 * EXECUTION ENVIRONMENT:
    329 *	Interrupt environment interrupt lock held
    330 */
    331static long ibmvscsis_send_init_message(struct scsi_info *vscsi, u8 format)
    332{
    333	struct viosrp_crq *crq;
    334	u64 buffer[2] = { 0, 0 };
    335	long rc;
    336
    337	crq = (struct viosrp_crq *)&buffer;
    338	crq->valid = VALID_INIT_MSG;
    339	crq->format = format;
    340	rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]),
    341			cpu_to_be64(buffer[MSG_LOW]));
    342
    343	return rc;
    344}
    345
    346/**
    347 * ibmvscsis_check_init_msg() - Check init message valid
    348 * @vscsi:	Pointer to our adapter structure
    349 * @format:	Pointer to return format of Init Message, if any.
    350 *		Set to UNUSED_FORMAT if no Init Message in queue.
    351 *
    352 * Checks if an initialize message was queued by the initiatior
    353 * after the queue was created and before the interrupt was enabled.
    354 *
    355 * EXECUTION ENVIRONMENT:
    356 *	Process level only, interrupt lock held
    357 */
    358static long ibmvscsis_check_init_msg(struct scsi_info *vscsi, uint *format)
    359{
    360	struct viosrp_crq *crq;
    361	long rc = ADAPT_SUCCESS;
    362
    363	crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask, &vscsi->cmd_q.index,
    364				      vscsi->cmd_q.base_addr);
    365	if (!crq) {
    366		*format = (uint)UNUSED_FORMAT;
    367	} else if (crq->valid == VALID_INIT_MSG && crq->format == INIT_MSG) {
    368		*format = (uint)INIT_MSG;
    369		crq->valid = INVALIDATE_CMD_RESP_EL;
    370		dma_rmb();
    371
    372		/*
    373		 * the caller has ensured no initialize message was
    374		 * sent after the queue was
    375		 * created so there should be no other message on the queue.
    376		 */
    377		crq = ibmvscsis_cmd_q_dequeue(vscsi->cmd_q.mask,
    378					      &vscsi->cmd_q.index,
    379					      vscsi->cmd_q.base_addr);
    380		if (crq) {
    381			*format = (uint)(crq->format);
    382			rc = ERROR;
    383			crq->valid = INVALIDATE_CMD_RESP_EL;
    384			dma_rmb();
    385		}
    386	} else {
    387		*format = (uint)(crq->format);
    388		rc = ERROR;
    389		crq->valid = INVALIDATE_CMD_RESP_EL;
    390		dma_rmb();
    391	}
    392
    393	return rc;
    394}
    395
    396/**
    397 * ibmvscsis_disconnect() - Helper function to disconnect
    398 * @work:	Pointer to work_struct, gives access to our adapter structure
    399 *
    400 * An error has occurred or the driver received a Transport event,
    401 * and the driver is requesting that the command queue be de-registered
    402 * in a safe manner. If there is no outstanding I/O then we can stop the
    403 * queue. If we are restarting the queue it will be reflected in the
    404 * the state of the adapter.
    405 *
    406 * EXECUTION ENVIRONMENT:
    407 *	Process environment
    408 */
    409static void ibmvscsis_disconnect(struct work_struct *work)
    410{
    411	struct scsi_info *vscsi = container_of(work, struct scsi_info,
    412					       proc_work);
    413	u16 new_state;
    414	bool wait_idle = false;
    415
    416	spin_lock_bh(&vscsi->intr_lock);
    417	new_state = vscsi->new_state;
    418	vscsi->new_state = 0;
    419
    420	vscsi->flags |= DISCONNECT_SCHEDULED;
    421	vscsi->flags &= ~SCHEDULE_DISCONNECT;
    422
    423	dev_dbg(&vscsi->dev, "disconnect: flags 0x%x, state 0x%hx\n",
    424		vscsi->flags, vscsi->state);
    425
    426	/*
    427	 * check which state we are in and see if we
    428	 * should transitition to the new state
    429	 */
    430	switch (vscsi->state) {
    431	/* Should never be called while in this state. */
    432	case NO_QUEUE:
    433	/*
    434	 * Can never transition from this state;
    435	 * igonore errors and logout.
    436	 */
    437	case UNCONFIGURING:
    438		break;
    439
    440	/* can transition from this state to UNCONFIGURING */
    441	case ERR_DISCONNECT:
    442		if (new_state == UNCONFIGURING)
    443			vscsi->state = new_state;
    444		break;
    445
    446	/*
    447	 * Can transition from this state to to unconfiguring
    448	 * or err disconnect.
    449	 */
    450	case ERR_DISCONNECT_RECONNECT:
    451		switch (new_state) {
    452		case UNCONFIGURING:
    453		case ERR_DISCONNECT:
    454			vscsi->state = new_state;
    455			break;
    456
    457		case WAIT_IDLE:
    458			break;
    459		default:
    460			break;
    461		}
    462		break;
    463
    464	/* can transition from this state to UNCONFIGURING */
    465	case ERR_DISCONNECTED:
    466		if (new_state == UNCONFIGURING)
    467			vscsi->state = new_state;
    468		break;
    469
    470	case WAIT_ENABLED:
    471		switch (new_state) {
    472		case UNCONFIGURING:
    473			vscsi->state = new_state;
    474			vscsi->flags |= RESPONSE_Q_DOWN;
    475			vscsi->flags &= ~(SCHEDULE_DISCONNECT |
    476					  DISCONNECT_SCHEDULED);
    477			dma_rmb();
    478			if (vscsi->flags & CFG_SLEEPING) {
    479				vscsi->flags &= ~CFG_SLEEPING;
    480				complete(&vscsi->unconfig);
    481			}
    482			break;
    483
    484		/* should never happen */
    485		case ERR_DISCONNECT:
    486		case ERR_DISCONNECT_RECONNECT:
    487		case WAIT_IDLE:
    488			dev_err(&vscsi->dev, "disconnect: invalid state %d for WAIT_IDLE\n",
    489				vscsi->state);
    490			break;
    491		}
    492		break;
    493
    494	case WAIT_IDLE:
    495		switch (new_state) {
    496		case UNCONFIGURING:
    497			vscsi->flags |= RESPONSE_Q_DOWN;
    498			vscsi->state = new_state;
    499			vscsi->flags &= ~(SCHEDULE_DISCONNECT |
    500					  DISCONNECT_SCHEDULED);
    501			ibmvscsis_free_command_q(vscsi);
    502			break;
    503		case ERR_DISCONNECT:
    504		case ERR_DISCONNECT_RECONNECT:
    505			vscsi->state = new_state;
    506			break;
    507		}
    508		break;
    509
    510	/*
    511	 * Initiator has not done a successful srp login
    512	 * or has done a successful srp logout ( adapter was not
    513	 * busy). In the first case there can be responses queued
    514	 * waiting for space on the initiators response queue (MAD)
    515	 * The second case the adapter is idle. Assume the worse case,
    516	 * i.e. the second case.
    517	 */
    518	case WAIT_CONNECTION:
    519	case CONNECTED:
    520	case SRP_PROCESSING:
    521		wait_idle = true;
    522		vscsi->state = new_state;
    523		break;
    524
    525	/* can transition from this state to UNCONFIGURING */
    526	case UNDEFINED:
    527		if (new_state == UNCONFIGURING)
    528			vscsi->state = new_state;
    529		break;
    530	default:
    531		break;
    532	}
    533
    534	if (wait_idle) {
    535		dev_dbg(&vscsi->dev, "disconnect start wait, active %d, sched %d\n",
    536			(int)list_empty(&vscsi->active_q),
    537			(int)list_empty(&vscsi->schedule_q));
    538		if (!list_empty(&vscsi->active_q) ||
    539		    !list_empty(&vscsi->schedule_q)) {
    540			vscsi->flags |= WAIT_FOR_IDLE;
    541			dev_dbg(&vscsi->dev, "disconnect flags 0x%x\n",
    542				vscsi->flags);
    543			/*
    544			 * This routine is can not be called with the interrupt
    545			 * lock held.
    546			 */
    547			spin_unlock_bh(&vscsi->intr_lock);
    548			wait_for_completion(&vscsi->wait_idle);
    549			spin_lock_bh(&vscsi->intr_lock);
    550		}
    551		dev_dbg(&vscsi->dev, "disconnect stop wait\n");
    552
    553		ibmvscsis_adapter_idle(vscsi);
    554	}
    555
    556	spin_unlock_bh(&vscsi->intr_lock);
    557}
    558
    559/**
    560 * ibmvscsis_post_disconnect() - Schedule the disconnect
    561 * @vscsi:	Pointer to our adapter structure
    562 * @new_state:	State to move to after disconnecting
    563 * @flag_bits:	Flags to turn on in adapter structure
    564 *
    565 * If it's already been scheduled, then see if we need to "upgrade"
    566 * the new state (if the one passed in is more "severe" than the
    567 * previous one).
    568 *
    569 * PRECONDITION:
    570 *	interrupt lock is held
    571 */
    572static void ibmvscsis_post_disconnect(struct scsi_info *vscsi, uint new_state,
    573				      uint flag_bits)
    574{
    575	uint state;
    576
    577	/* check the validity of the new state */
    578	switch (new_state) {
    579	case UNCONFIGURING:
    580	case ERR_DISCONNECT:
    581	case ERR_DISCONNECT_RECONNECT:
    582	case WAIT_IDLE:
    583		break;
    584
    585	default:
    586		dev_err(&vscsi->dev, "post_disconnect: Invalid new state %d\n",
    587			new_state);
    588		return;
    589	}
    590
    591	vscsi->flags |= flag_bits;
    592
    593	dev_dbg(&vscsi->dev, "post_disconnect: new_state 0x%x, flag_bits 0x%x, vscsi->flags 0x%x, state %hx\n",
    594		new_state, flag_bits, vscsi->flags, vscsi->state);
    595
    596	if (!(vscsi->flags & (DISCONNECT_SCHEDULED | SCHEDULE_DISCONNECT))) {
    597		vscsi->flags |= SCHEDULE_DISCONNECT;
    598		vscsi->new_state = new_state;
    599
    600		INIT_WORK(&vscsi->proc_work, ibmvscsis_disconnect);
    601		(void)queue_work(vscsi->work_q, &vscsi->proc_work);
    602	} else {
    603		if (vscsi->new_state)
    604			state = vscsi->new_state;
    605		else
    606			state = vscsi->state;
    607
    608		switch (state) {
    609		case NO_QUEUE:
    610		case UNCONFIGURING:
    611			break;
    612
    613		case ERR_DISCONNECTED:
    614		case ERR_DISCONNECT:
    615		case UNDEFINED:
    616			if (new_state == UNCONFIGURING)
    617				vscsi->new_state = new_state;
    618			break;
    619
    620		case ERR_DISCONNECT_RECONNECT:
    621			switch (new_state) {
    622			case UNCONFIGURING:
    623			case ERR_DISCONNECT:
    624				vscsi->new_state = new_state;
    625				break;
    626			default:
    627				break;
    628			}
    629			break;
    630
    631		case WAIT_ENABLED:
    632		case WAIT_IDLE:
    633		case WAIT_CONNECTION:
    634		case CONNECTED:
    635		case SRP_PROCESSING:
    636			vscsi->new_state = new_state;
    637			break;
    638
    639		default:
    640			break;
    641		}
    642	}
    643
    644	dev_dbg(&vscsi->dev, "Leaving post_disconnect: flags 0x%x, new_state 0x%x\n",
    645		vscsi->flags, vscsi->new_state);
    646}
    647
    648/**
    649 * ibmvscsis_handle_init_compl_msg() - Respond to an Init Complete Message
    650 * @vscsi:	Pointer to our adapter structure
    651 *
    652 * Must be called with interrupt lock held.
    653 */
    654static long ibmvscsis_handle_init_compl_msg(struct scsi_info *vscsi)
    655{
    656	long rc = ADAPT_SUCCESS;
    657
    658	switch (vscsi->state) {
    659	case NO_QUEUE:
    660	case ERR_DISCONNECT:
    661	case ERR_DISCONNECT_RECONNECT:
    662	case ERR_DISCONNECTED:
    663	case UNCONFIGURING:
    664	case UNDEFINED:
    665		rc = ERROR;
    666		break;
    667
    668	case WAIT_CONNECTION:
    669		vscsi->state = CONNECTED;
    670		break;
    671
    672	case WAIT_IDLE:
    673	case SRP_PROCESSING:
    674	case CONNECTED:
    675	case WAIT_ENABLED:
    676	default:
    677		rc = ERROR;
    678		dev_err(&vscsi->dev, "init_msg: invalid state %d to get init compl msg\n",
    679			vscsi->state);
    680		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
    681		break;
    682	}
    683
    684	return rc;
    685}
    686
    687/**
    688 * ibmvscsis_handle_init_msg() - Respond to an Init Message
    689 * @vscsi:	Pointer to our adapter structure
    690 *
    691 * Must be called with interrupt lock held.
    692 */
    693static long ibmvscsis_handle_init_msg(struct scsi_info *vscsi)
    694{
    695	long rc = ADAPT_SUCCESS;
    696
    697	switch (vscsi->state) {
    698	case WAIT_CONNECTION:
    699		rc = ibmvscsis_send_init_message(vscsi, INIT_COMPLETE_MSG);
    700		switch (rc) {
    701		case H_SUCCESS:
    702			vscsi->state = CONNECTED;
    703			break;
    704
    705		case H_PARAMETER:
    706			dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n",
    707				rc);
    708			ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0);
    709			break;
    710
    711		case H_DROPPED:
    712			dev_err(&vscsi->dev, "init_msg: failed to send, rc %ld\n",
    713				rc);
    714			rc = ERROR;
    715			ibmvscsis_post_disconnect(vscsi,
    716						  ERR_DISCONNECT_RECONNECT, 0);
    717			break;
    718
    719		case H_CLOSED:
    720			dev_warn(&vscsi->dev, "init_msg: failed to send, rc %ld\n",
    721				 rc);
    722			rc = 0;
    723			break;
    724		}
    725		break;
    726
    727	case UNDEFINED:
    728		rc = ERROR;
    729		break;
    730
    731	case UNCONFIGURING:
    732		break;
    733
    734	case WAIT_ENABLED:
    735	case CONNECTED:
    736	case SRP_PROCESSING:
    737	case WAIT_IDLE:
    738	case NO_QUEUE:
    739	case ERR_DISCONNECT:
    740	case ERR_DISCONNECT_RECONNECT:
    741	case ERR_DISCONNECTED:
    742	default:
    743		rc = ERROR;
    744		dev_err(&vscsi->dev, "init_msg: invalid state %d to get init msg\n",
    745			vscsi->state);
    746		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
    747		break;
    748	}
    749
    750	return rc;
    751}
    752
    753/**
    754 * ibmvscsis_init_msg() - Respond to an init message
    755 * @vscsi:	Pointer to our adapter structure
    756 * @crq:	Pointer to CRQ element containing the Init Message
    757 *
    758 * EXECUTION ENVIRONMENT:
    759 *	Interrupt, interrupt lock held
    760 */
    761static long ibmvscsis_init_msg(struct scsi_info *vscsi, struct viosrp_crq *crq)
    762{
    763	long rc = ADAPT_SUCCESS;
    764
    765	dev_dbg(&vscsi->dev, "init_msg: state 0x%hx\n", vscsi->state);
    766
    767	rc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO,
    768		      (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0,
    769		      0);
    770	if (rc == H_SUCCESS) {
    771		vscsi->client_data.partition_number =
    772			be64_to_cpu(*(u64 *)vscsi->map_buf);
    773		dev_dbg(&vscsi->dev, "init_msg, part num %d\n",
    774			vscsi->client_data.partition_number);
    775	} else {
    776		dev_dbg(&vscsi->dev, "init_msg h_vioctl rc %ld\n", rc);
    777		rc = ADAPT_SUCCESS;
    778	}
    779
    780	if (crq->format == INIT_MSG) {
    781		rc = ibmvscsis_handle_init_msg(vscsi);
    782	} else if (crq->format == INIT_COMPLETE_MSG) {
    783		rc = ibmvscsis_handle_init_compl_msg(vscsi);
    784	} else {
    785		rc = ERROR;
    786		dev_err(&vscsi->dev, "init_msg: invalid format %d\n",
    787			(uint)crq->format);
    788		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
    789	}
    790
    791	return rc;
    792}
    793
    794/**
    795 * ibmvscsis_establish_new_q() - Establish new CRQ queue
    796 * @vscsi:	Pointer to our adapter structure
    797 *
    798 * Must be called with interrupt lock held.
    799 */
    800static long ibmvscsis_establish_new_q(struct scsi_info *vscsi)
    801{
    802	long rc = ADAPT_SUCCESS;
    803	uint format;
    804
    805	rc = h_vioctl(vscsi->dds.unit_id, H_ENABLE_PREPARE_FOR_SUSPEND, 30000,
    806		      0, 0, 0, 0);
    807	if (rc == H_SUCCESS)
    808		vscsi->flags |= PREP_FOR_SUSPEND_ENABLED;
    809	else if (rc != H_NOT_FOUND)
    810		dev_err(&vscsi->dev, "Error from Enable Prepare for Suspend: %ld\n",
    811			rc);
    812
    813	vscsi->flags &= PRESERVE_FLAG_FIELDS;
    814	vscsi->rsp_q_timer.timer_pops = 0;
    815	vscsi->debit = 0;
    816	vscsi->credit = 0;
    817
    818	rc = vio_enable_interrupts(vscsi->dma_dev);
    819	if (rc) {
    820		dev_warn(&vscsi->dev, "establish_new_q: failed to enable interrupts, rc %ld\n",
    821			 rc);
    822		return rc;
    823	}
    824
    825	rc = ibmvscsis_check_init_msg(vscsi, &format);
    826	if (rc) {
    827		dev_err(&vscsi->dev, "establish_new_q: check_init_msg failed, rc %ld\n",
    828			rc);
    829		return rc;
    830	}
    831
    832	if (format == UNUSED_FORMAT) {
    833		rc = ibmvscsis_send_init_message(vscsi, INIT_MSG);
    834		switch (rc) {
    835		case H_SUCCESS:
    836		case H_DROPPED:
    837		case H_CLOSED:
    838			rc = ADAPT_SUCCESS;
    839			break;
    840
    841		case H_PARAMETER:
    842		case H_HARDWARE:
    843			break;
    844
    845		default:
    846			vscsi->state = UNDEFINED;
    847			rc = H_HARDWARE;
    848			break;
    849		}
    850	} else if (format == INIT_MSG) {
    851		rc = ibmvscsis_handle_init_msg(vscsi);
    852	}
    853
    854	return rc;
    855}
    856
    857/**
    858 * ibmvscsis_reset_queue() - Reset CRQ Queue
    859 * @vscsi:	Pointer to our adapter structure
    860 *
    861 * This function calls h_free_q and then calls h_reg_q and does all
    862 * of the bookkeeping to get us back to where we can communicate.
    863 *
    864 * Actually, we don't always call h_free_crq.  A problem was discovered
    865 * where one partition would close and reopen his queue, which would
    866 * cause his partner to get a transport event, which would cause him to
    867 * close and reopen his queue, which would cause the original partition
    868 * to get a transport event, etc., etc.  To prevent this, we don't
    869 * actually close our queue if the client initiated the reset, (i.e.
    870 * either we got a transport event or we have detected that the client's
    871 * queue is gone)
    872 *
    873 * EXECUTION ENVIRONMENT:
    874 *	Process environment, called with interrupt lock held
    875 */
    876static void ibmvscsis_reset_queue(struct scsi_info *vscsi)
    877{
    878	int bytes;
    879	long rc = ADAPT_SUCCESS;
    880
    881	dev_dbg(&vscsi->dev, "reset_queue: flags 0x%x\n", vscsi->flags);
    882
    883	/* don't reset, the client did it for us */
    884	if (vscsi->flags & (CLIENT_FAILED | TRANS_EVENT)) {
    885		vscsi->flags &= PRESERVE_FLAG_FIELDS;
    886		vscsi->rsp_q_timer.timer_pops = 0;
    887		vscsi->debit = 0;
    888		vscsi->credit = 0;
    889		vscsi->state = WAIT_CONNECTION;
    890		vio_enable_interrupts(vscsi->dma_dev);
    891	} else {
    892		rc = ibmvscsis_free_command_q(vscsi);
    893		if (rc == ADAPT_SUCCESS) {
    894			vscsi->state = WAIT_CONNECTION;
    895
    896			bytes = vscsi->cmd_q.size * PAGE_SIZE;
    897			rc = h_reg_crq(vscsi->dds.unit_id,
    898				       vscsi->cmd_q.crq_token, bytes);
    899			if (rc == H_CLOSED || rc == H_SUCCESS) {
    900				rc = ibmvscsis_establish_new_q(vscsi);
    901			}
    902
    903			if (rc != ADAPT_SUCCESS) {
    904				dev_dbg(&vscsi->dev, "reset_queue: reg_crq rc %ld\n",
    905					rc);
    906
    907				vscsi->state = ERR_DISCONNECTED;
    908				vscsi->flags |= RESPONSE_Q_DOWN;
    909				ibmvscsis_free_command_q(vscsi);
    910			}
    911		} else {
    912			vscsi->state = ERR_DISCONNECTED;
    913			vscsi->flags |= RESPONSE_Q_DOWN;
    914		}
    915	}
    916}
    917
    918/**
    919 * ibmvscsis_free_cmd_resources() - Free command resources
    920 * @vscsi:	Pointer to our adapter structure
    921 * @cmd:	Command which is not longer in use
    922 *
    923 * Must be called with interrupt lock held.
    924 */
    925static void ibmvscsis_free_cmd_resources(struct scsi_info *vscsi,
    926					 struct ibmvscsis_cmd *cmd)
    927{
    928	struct iu_entry *iue = cmd->iue;
    929
    930	switch (cmd->type) {
    931	case TASK_MANAGEMENT:
    932	case SCSI_CDB:
    933		/*
    934		 * When the queue goes down this value is cleared, so it
    935		 * cannot be cleared in this general purpose function.
    936		 */
    937		if (vscsi->debit)
    938			vscsi->debit -= 1;
    939		break;
    940	case ADAPTER_MAD:
    941		vscsi->flags &= ~PROCESSING_MAD;
    942		break;
    943	case UNSET_TYPE:
    944		break;
    945	default:
    946		dev_err(&vscsi->dev, "free_cmd_resources unknown type %d\n",
    947			cmd->type);
    948		break;
    949	}
    950
    951	cmd->iue = NULL;
    952	list_add_tail(&cmd->list, &vscsi->free_cmd);
    953	srp_iu_put(iue);
    954
    955	if (list_empty(&vscsi->active_q) && list_empty(&vscsi->schedule_q) &&
    956	    list_empty(&vscsi->waiting_rsp) && (vscsi->flags & WAIT_FOR_IDLE)) {
    957		vscsi->flags &= ~WAIT_FOR_IDLE;
    958		complete(&vscsi->wait_idle);
    959	}
    960}
    961
    962/**
    963 * ibmvscsis_ready_for_suspend() - Helper function to call VIOCTL
    964 * @vscsi:	Pointer to our adapter structure
    965 * @idle:	Indicates whether we were called from adapter_idle.  This
    966 *		is important to know if we need to do a disconnect, since if
    967 *		we're called from adapter_idle, we're still processing the
    968 *		current disconnect, so we can't just call post_disconnect.
    969 *
    970 * This function is called when the adapter is idle when phyp has sent
    971 * us a Prepare for Suspend Transport Event.
    972 *
    973 * EXECUTION ENVIRONMENT:
    974 *	Process or interrupt environment called with interrupt lock held
    975 */
    976static long ibmvscsis_ready_for_suspend(struct scsi_info *vscsi, bool idle)
    977{
    978	long rc = 0;
    979	struct viosrp_crq *crq;
    980
    981	/* See if there is a Resume event in the queue */
    982	crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index;
    983
    984	dev_dbg(&vscsi->dev, "ready_suspend: flags 0x%x, state 0x%hx crq_valid:%x\n",
    985		vscsi->flags, vscsi->state, (int)crq->valid);
    986
    987	if (!(vscsi->flags & PREP_FOR_SUSPEND_ABORTED) && !(crq->valid)) {
    988		rc = h_vioctl(vscsi->dds.unit_id, H_READY_FOR_SUSPEND, 0, 0, 0,
    989			      0, 0);
    990		if (rc) {
    991			dev_err(&vscsi->dev, "Ready for Suspend Vioctl failed: %ld\n",
    992				rc);
    993			rc = 0;
    994		}
    995	} else if (((vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE) &&
    996		    (vscsi->flags & PREP_FOR_SUSPEND_ABORTED)) ||
    997		   ((crq->valid) && ((crq->valid != VALID_TRANS_EVENT) ||
    998				     (crq->format != RESUME_FROM_SUSP)))) {
    999		if (idle) {
   1000			vscsi->state = ERR_DISCONNECT_RECONNECT;
   1001			ibmvscsis_reset_queue(vscsi);
   1002			rc = -1;
   1003		} else if (vscsi->state == CONNECTED) {
   1004			ibmvscsis_post_disconnect(vscsi,
   1005						  ERR_DISCONNECT_RECONNECT, 0);
   1006		}
   1007
   1008		vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE;
   1009
   1010		if ((crq->valid) && ((crq->valid != VALID_TRANS_EVENT) ||
   1011				     (crq->format != RESUME_FROM_SUSP)))
   1012			dev_err(&vscsi->dev, "Invalid element in CRQ after Prepare for Suspend");
   1013	}
   1014
   1015	vscsi->flags &= ~(PREP_FOR_SUSPEND_PENDING | PREP_FOR_SUSPEND_ABORTED);
   1016
   1017	return rc;
   1018}
   1019
   1020/**
   1021 * ibmvscsis_trans_event() - Handle a Transport Event
   1022 * @vscsi:	Pointer to our adapter structure
   1023 * @crq:	Pointer to CRQ entry containing the Transport Event
   1024 *
   1025 * Do the logic to close the I_T nexus.  This function may not
   1026 * behave to specification.
   1027 *
   1028 * EXECUTION ENVIRONMENT:
   1029 *	Interrupt, interrupt lock held
   1030 */
   1031static long ibmvscsis_trans_event(struct scsi_info *vscsi,
   1032				  struct viosrp_crq *crq)
   1033{
   1034	long rc = ADAPT_SUCCESS;
   1035
   1036	dev_dbg(&vscsi->dev, "trans_event: format %d, flags 0x%x, state 0x%hx\n",
   1037		(int)crq->format, vscsi->flags, vscsi->state);
   1038
   1039	switch (crq->format) {
   1040	case MIGRATED:
   1041	case PARTNER_FAILED:
   1042	case PARTNER_DEREGISTER:
   1043		ibmvscsis_delete_client_info(vscsi, true);
   1044		if (crq->format == MIGRATED)
   1045			vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE;
   1046		switch (vscsi->state) {
   1047		case NO_QUEUE:
   1048		case ERR_DISCONNECTED:
   1049		case UNDEFINED:
   1050			break;
   1051
   1052		case UNCONFIGURING:
   1053			vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT);
   1054			break;
   1055
   1056		case WAIT_ENABLED:
   1057			break;
   1058
   1059		case WAIT_CONNECTION:
   1060			break;
   1061
   1062		case CONNECTED:
   1063			ibmvscsis_post_disconnect(vscsi, WAIT_IDLE,
   1064						  (RESPONSE_Q_DOWN |
   1065						   TRANS_EVENT));
   1066			break;
   1067
   1068		case SRP_PROCESSING:
   1069			if ((vscsi->debit > 0) ||
   1070			    !list_empty(&vscsi->schedule_q) ||
   1071			    !list_empty(&vscsi->waiting_rsp) ||
   1072			    !list_empty(&vscsi->active_q)) {
   1073				dev_dbg(&vscsi->dev, "debit %d, sched %d, wait %d, active %d\n",
   1074					vscsi->debit,
   1075					(int)list_empty(&vscsi->schedule_q),
   1076					(int)list_empty(&vscsi->waiting_rsp),
   1077					(int)list_empty(&vscsi->active_q));
   1078				dev_warn(&vscsi->dev, "connection lost with outstanding work\n");
   1079			} else {
   1080				dev_dbg(&vscsi->dev, "trans_event: SRP Processing, but no outstanding work\n");
   1081			}
   1082
   1083			ibmvscsis_post_disconnect(vscsi, WAIT_IDLE,
   1084						  (RESPONSE_Q_DOWN |
   1085						   TRANS_EVENT));
   1086			break;
   1087
   1088		case ERR_DISCONNECT:
   1089		case ERR_DISCONNECT_RECONNECT:
   1090		case WAIT_IDLE:
   1091			vscsi->flags |= (RESPONSE_Q_DOWN | TRANS_EVENT);
   1092			break;
   1093		}
   1094		break;
   1095
   1096	case PREPARE_FOR_SUSPEND:
   1097		dev_dbg(&vscsi->dev, "Prep for Suspend, crq status = 0x%x\n",
   1098			(int)crq->status);
   1099		switch (vscsi->state) {
   1100		case ERR_DISCONNECTED:
   1101		case WAIT_CONNECTION:
   1102		case CONNECTED:
   1103			ibmvscsis_ready_for_suspend(vscsi, false);
   1104			break;
   1105		case SRP_PROCESSING:
   1106			vscsi->resume_state = vscsi->state;
   1107			vscsi->flags |= PREP_FOR_SUSPEND_PENDING;
   1108			if (crq->status == CRQ_ENTRY_OVERWRITTEN)
   1109				vscsi->flags |= PREP_FOR_SUSPEND_OVERWRITE;
   1110			ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, 0);
   1111			break;
   1112		case NO_QUEUE:
   1113		case UNDEFINED:
   1114		case UNCONFIGURING:
   1115		case WAIT_ENABLED:
   1116		case ERR_DISCONNECT:
   1117		case ERR_DISCONNECT_RECONNECT:
   1118		case WAIT_IDLE:
   1119			dev_err(&vscsi->dev, "Invalid state for Prepare for Suspend Trans Event: 0x%x\n",
   1120				vscsi->state);
   1121			break;
   1122		}
   1123		break;
   1124
   1125	case RESUME_FROM_SUSP:
   1126		dev_dbg(&vscsi->dev, "Resume from Suspend, crq status = 0x%x\n",
   1127			(int)crq->status);
   1128		if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) {
   1129			vscsi->flags |= PREP_FOR_SUSPEND_ABORTED;
   1130		} else {
   1131			if ((crq->status == CRQ_ENTRY_OVERWRITTEN) ||
   1132			    (vscsi->flags & PREP_FOR_SUSPEND_OVERWRITE)) {
   1133				ibmvscsis_post_disconnect(vscsi,
   1134							  ERR_DISCONNECT_RECONNECT,
   1135							  0);
   1136				vscsi->flags &= ~PREP_FOR_SUSPEND_OVERWRITE;
   1137			}
   1138		}
   1139		break;
   1140
   1141	default:
   1142		rc = ERROR;
   1143		dev_err(&vscsi->dev, "trans_event: invalid format %d\n",
   1144			(uint)crq->format);
   1145		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT,
   1146					  RESPONSE_Q_DOWN);
   1147		break;
   1148	}
   1149
   1150	rc = vscsi->flags & SCHEDULE_DISCONNECT;
   1151
   1152	dev_dbg(&vscsi->dev, "Leaving trans_event: flags 0x%x, state 0x%hx, rc %ld\n",
   1153		vscsi->flags, vscsi->state, rc);
   1154
   1155	return rc;
   1156}
   1157
   1158/**
   1159 * ibmvscsis_poll_cmd_q() - Poll Command Queue
   1160 * @vscsi:	Pointer to our adapter structure
   1161 *
   1162 * Called to handle command elements that may have arrived while
   1163 * interrupts were disabled.
   1164 *
   1165 * EXECUTION ENVIRONMENT:
   1166 *	intr_lock must be held
   1167 */
   1168static void ibmvscsis_poll_cmd_q(struct scsi_info *vscsi)
   1169{
   1170	struct viosrp_crq *crq;
   1171	long rc;
   1172	bool ack = true;
   1173	volatile u8 valid;
   1174
   1175	dev_dbg(&vscsi->dev, "poll_cmd_q: flags 0x%x, state 0x%hx, q index %ud\n",
   1176		vscsi->flags, vscsi->state, vscsi->cmd_q.index);
   1177
   1178	rc = vscsi->flags & SCHEDULE_DISCONNECT;
   1179	crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index;
   1180	valid = crq->valid;
   1181	dma_rmb();
   1182
   1183	while (valid) {
   1184poll_work:
   1185		vscsi->cmd_q.index =
   1186			(vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask;
   1187
   1188		if (!rc) {
   1189			rc = ibmvscsis_parse_command(vscsi, crq);
   1190		} else {
   1191			if ((uint)crq->valid == VALID_TRANS_EVENT) {
   1192				/*
   1193				 * must service the transport layer events even
   1194				 * in an error state, dont break out until all
   1195				 * the consecutive transport events have been
   1196				 * processed
   1197				 */
   1198				rc = ibmvscsis_trans_event(vscsi, crq);
   1199			} else if (vscsi->flags & TRANS_EVENT) {
   1200				/*
   1201				 * if a tranport event has occurred leave
   1202				 * everything but transport events on the queue
   1203				 */
   1204				dev_dbg(&vscsi->dev, "poll_cmd_q, ignoring\n");
   1205
   1206				/*
   1207				 * need to decrement the queue index so we can
   1208				 * look at the elment again
   1209				 */
   1210				if (vscsi->cmd_q.index)
   1211					vscsi->cmd_q.index -= 1;
   1212				else
   1213					/*
   1214					 * index is at 0 it just wrapped.
   1215					 * have it index last element in q
   1216					 */
   1217					vscsi->cmd_q.index = vscsi->cmd_q.mask;
   1218				break;
   1219			}
   1220		}
   1221
   1222		crq->valid = INVALIDATE_CMD_RESP_EL;
   1223
   1224		crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index;
   1225		valid = crq->valid;
   1226		dma_rmb();
   1227	}
   1228
   1229	if (!rc) {
   1230		if (ack) {
   1231			vio_enable_interrupts(vscsi->dma_dev);
   1232			ack = false;
   1233			dev_dbg(&vscsi->dev, "poll_cmd_q, reenabling interrupts\n");
   1234		}
   1235		valid = crq->valid;
   1236		dma_rmb();
   1237		if (valid)
   1238			goto poll_work;
   1239	}
   1240
   1241	dev_dbg(&vscsi->dev, "Leaving poll_cmd_q: rc %ld\n", rc);
   1242}
   1243
   1244/**
   1245 * ibmvscsis_free_cmd_qs() - Free elements in queue
   1246 * @vscsi:	Pointer to our adapter structure
   1247 *
   1248 * Free all of the elements on all queues that are waiting for
   1249 * whatever reason.
   1250 *
   1251 * PRECONDITION:
   1252 *	Called with interrupt lock held
   1253 */
   1254static void ibmvscsis_free_cmd_qs(struct scsi_info *vscsi)
   1255{
   1256	struct ibmvscsis_cmd *cmd, *nxt;
   1257
   1258	dev_dbg(&vscsi->dev, "free_cmd_qs: waiting_rsp empty %d, timer starter %d\n",
   1259		(int)list_empty(&vscsi->waiting_rsp),
   1260		vscsi->rsp_q_timer.started);
   1261
   1262	list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp, list) {
   1263		list_del(&cmd->list);
   1264		ibmvscsis_free_cmd_resources(vscsi, cmd);
   1265	}
   1266}
   1267
   1268/**
   1269 * ibmvscsis_get_free_cmd() - Get free command from list
   1270 * @vscsi:	Pointer to our adapter structure
   1271 *
   1272 * Must be called with interrupt lock held.
   1273 */
   1274static struct ibmvscsis_cmd *ibmvscsis_get_free_cmd(struct scsi_info *vscsi)
   1275{
   1276	struct ibmvscsis_cmd *cmd = NULL;
   1277	struct iu_entry *iue;
   1278
   1279	iue = srp_iu_get(&vscsi->target);
   1280	if (iue) {
   1281		cmd = list_first_entry_or_null(&vscsi->free_cmd,
   1282					       struct ibmvscsis_cmd, list);
   1283		if (cmd) {
   1284			if (cmd->abort_cmd)
   1285				cmd->abort_cmd = NULL;
   1286			cmd->flags &= ~(DELAY_SEND);
   1287			list_del(&cmd->list);
   1288			cmd->iue = iue;
   1289			cmd->type = UNSET_TYPE;
   1290			memset(&cmd->se_cmd, 0, sizeof(cmd->se_cmd));
   1291		} else {
   1292			srp_iu_put(iue);
   1293		}
   1294	}
   1295
   1296	return cmd;
   1297}
   1298
   1299/**
   1300 * ibmvscsis_adapter_idle() - Helper function to handle idle adapter
   1301 * @vscsi:	Pointer to our adapter structure
   1302 *
   1303 * This function is called when the adapter is idle when the driver
   1304 * is attempting to clear an error condition.
   1305 * The adapter is considered busy if any of its cmd queues
   1306 * are non-empty. This function can be invoked
   1307 * from the off level disconnect function.
   1308 *
   1309 * EXECUTION ENVIRONMENT:
   1310 *	Process environment called with interrupt lock held
   1311 */
   1312static void ibmvscsis_adapter_idle(struct scsi_info *vscsi)
   1313{
   1314	int free_qs = false;
   1315	long rc = 0;
   1316
   1317	dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx\n",
   1318		vscsi->flags, vscsi->state);
   1319
   1320	/* Only need to free qs if we're disconnecting from client */
   1321	if (vscsi->state != WAIT_CONNECTION || vscsi->flags & TRANS_EVENT)
   1322		free_qs = true;
   1323
   1324	switch (vscsi->state) {
   1325	case UNCONFIGURING:
   1326		ibmvscsis_free_command_q(vscsi);
   1327		dma_rmb();
   1328		isync();
   1329		if (vscsi->flags & CFG_SLEEPING) {
   1330			vscsi->flags &= ~CFG_SLEEPING;
   1331			complete(&vscsi->unconfig);
   1332		}
   1333		break;
   1334	case ERR_DISCONNECT_RECONNECT:
   1335		ibmvscsis_reset_queue(vscsi);
   1336		dev_dbg(&vscsi->dev, "adapter_idle, disc_rec: flags 0x%x\n",
   1337			vscsi->flags);
   1338		break;
   1339
   1340	case ERR_DISCONNECT:
   1341		ibmvscsis_free_command_q(vscsi);
   1342		vscsi->flags &= ~(SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED);
   1343		vscsi->flags |= RESPONSE_Q_DOWN;
   1344		if (vscsi->tport.enabled)
   1345			vscsi->state = ERR_DISCONNECTED;
   1346		else
   1347			vscsi->state = WAIT_ENABLED;
   1348		dev_dbg(&vscsi->dev, "adapter_idle, disc: flags 0x%x, state 0x%hx\n",
   1349			vscsi->flags, vscsi->state);
   1350		break;
   1351
   1352	case WAIT_IDLE:
   1353		vscsi->rsp_q_timer.timer_pops = 0;
   1354		vscsi->debit = 0;
   1355		vscsi->credit = 0;
   1356		if (vscsi->flags & PREP_FOR_SUSPEND_PENDING) {
   1357			vscsi->state = vscsi->resume_state;
   1358			vscsi->resume_state = 0;
   1359			rc = ibmvscsis_ready_for_suspend(vscsi, true);
   1360			vscsi->flags &= ~DISCONNECT_SCHEDULED;
   1361			if (rc)
   1362				break;
   1363		} else if (vscsi->flags & TRANS_EVENT) {
   1364			vscsi->state = WAIT_CONNECTION;
   1365			vscsi->flags &= PRESERVE_FLAG_FIELDS;
   1366		} else {
   1367			vscsi->state = CONNECTED;
   1368			vscsi->flags &= ~DISCONNECT_SCHEDULED;
   1369		}
   1370
   1371		dev_dbg(&vscsi->dev, "adapter_idle, wait: flags 0x%x, state 0x%hx\n",
   1372			vscsi->flags, vscsi->state);
   1373		ibmvscsis_poll_cmd_q(vscsi);
   1374		break;
   1375
   1376	case ERR_DISCONNECTED:
   1377		vscsi->flags &= ~DISCONNECT_SCHEDULED;
   1378		dev_dbg(&vscsi->dev, "adapter_idle, disconnected: flags 0x%x, state 0x%hx\n",
   1379			vscsi->flags, vscsi->state);
   1380		break;
   1381
   1382	default:
   1383		dev_err(&vscsi->dev, "adapter_idle: in invalid state %d\n",
   1384			vscsi->state);
   1385		break;
   1386	}
   1387
   1388	if (free_qs)
   1389		ibmvscsis_free_cmd_qs(vscsi);
   1390
   1391	/*
   1392	 * There is a timing window where we could lose a disconnect request.
   1393	 * The known path to this window occurs during the DISCONNECT_RECONNECT
   1394	 * case above: reset_queue calls free_command_q, which will release the
   1395	 * interrupt lock.  During that time, a new post_disconnect call can be
   1396	 * made with a "more severe" state (DISCONNECT or UNCONFIGURING).
   1397	 * Because the DISCONNECT_SCHEDULED flag is already set, post_disconnect
   1398	 * will only set the new_state.  Now free_command_q reacquires the intr
   1399	 * lock and clears the DISCONNECT_SCHEDULED flag (using PRESERVE_FLAG_
   1400	 * FIELDS), and the disconnect is lost.  This is particularly bad when
   1401	 * the new disconnect was for UNCONFIGURING, since the unconfigure hangs
   1402	 * forever.
   1403	 * Fix is that free command queue sets acr state and acr flags if there
   1404	 * is a change under the lock
   1405	 * note free command queue writes to this state it clears it
   1406	 * before releasing the lock, different drivers call the free command
   1407	 * queue different times so dont initialize above
   1408	 */
   1409	if (vscsi->phyp_acr_state != 0)	{
   1410		/*
   1411		 * set any bits in flags that may have been cleared by
   1412		 * a call to free command queue in switch statement
   1413		 * or reset queue
   1414		 */
   1415		vscsi->flags |= vscsi->phyp_acr_flags;
   1416		ibmvscsis_post_disconnect(vscsi, vscsi->phyp_acr_state, 0);
   1417		vscsi->phyp_acr_state = 0;
   1418		vscsi->phyp_acr_flags = 0;
   1419
   1420		dev_dbg(&vscsi->dev, "adapter_idle: flags 0x%x, state 0x%hx, acr_flags 0x%x, acr_state 0x%hx\n",
   1421			vscsi->flags, vscsi->state, vscsi->phyp_acr_flags,
   1422			vscsi->phyp_acr_state);
   1423	}
   1424
   1425	dev_dbg(&vscsi->dev, "Leaving adapter_idle: flags 0x%x, state 0x%hx, new_state 0x%x\n",
   1426		vscsi->flags, vscsi->state, vscsi->new_state);
   1427}
   1428
   1429/**
   1430 * ibmvscsis_copy_crq_packet() - Copy CRQ Packet
   1431 * @vscsi:	Pointer to our adapter structure
   1432 * @cmd:	Pointer to command element to use to process the request
   1433 * @crq:	Pointer to CRQ entry containing the request
   1434 *
   1435 * Copy the srp information unit from the hosted
   1436 * partition using remote dma
   1437 *
   1438 * EXECUTION ENVIRONMENT:
   1439 *	Interrupt, interrupt lock held
   1440 */
   1441static long ibmvscsis_copy_crq_packet(struct scsi_info *vscsi,
   1442				      struct ibmvscsis_cmd *cmd,
   1443				      struct viosrp_crq *crq)
   1444{
   1445	struct iu_entry *iue = cmd->iue;
   1446	long rc = 0;
   1447	u16 len;
   1448
   1449	len = be16_to_cpu(crq->IU_length);
   1450	if ((len > SRP_MAX_IU_LEN) || (len == 0)) {
   1451		dev_err(&vscsi->dev, "copy_crq: Invalid len %d passed", len);
   1452		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   1453		return SRP_VIOLATION;
   1454	}
   1455
   1456	rc = h_copy_rdma(len, vscsi->dds.window[REMOTE].liobn,
   1457			 be64_to_cpu(crq->IU_data_ptr),
   1458			 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma);
   1459
   1460	switch (rc) {
   1461	case H_SUCCESS:
   1462		cmd->init_time = mftb();
   1463		iue->remote_token = crq->IU_data_ptr;
   1464		iue->iu_len = len;
   1465		dev_dbg(&vscsi->dev, "copy_crq: ioba 0x%llx, init_time 0x%llx\n",
   1466			be64_to_cpu(crq->IU_data_ptr), cmd->init_time);
   1467		break;
   1468	case H_PERMISSION:
   1469		if (connection_broken(vscsi))
   1470			ibmvscsis_post_disconnect(vscsi,
   1471						  ERR_DISCONNECT_RECONNECT,
   1472						  (RESPONSE_Q_DOWN |
   1473						   CLIENT_FAILED));
   1474		else
   1475			ibmvscsis_post_disconnect(vscsi,
   1476						  ERR_DISCONNECT_RECONNECT, 0);
   1477
   1478		dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n",
   1479			rc);
   1480		break;
   1481	case H_DEST_PARM:
   1482	case H_SOURCE_PARM:
   1483	default:
   1484		dev_err(&vscsi->dev, "copy_crq: h_copy_rdma failed, rc %ld\n",
   1485			rc);
   1486		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   1487		break;
   1488	}
   1489
   1490	return rc;
   1491}
   1492
   1493/**
   1494 * ibmvscsis_adapter_info - Service an Adapter Info MAnagement Data gram
   1495 * @vscsi:	Pointer to our adapter structure
   1496 * @iue:	Information Unit containing the Adapter Info MAD request
   1497 *
   1498 * EXECUTION ENVIRONMENT:
   1499 *	Interrupt adapter lock is held
   1500 */
   1501static long ibmvscsis_adapter_info(struct scsi_info *vscsi,
   1502				   struct iu_entry *iue)
   1503{
   1504	struct viosrp_adapter_info *mad = &vio_iu(iue)->mad.adapter_info;
   1505	struct mad_adapter_info_data *info;
   1506	uint flag_bits = 0;
   1507	dma_addr_t token;
   1508	long rc;
   1509
   1510	mad->common.status = cpu_to_be16(VIOSRP_MAD_SUCCESS);
   1511
   1512	if (be16_to_cpu(mad->common.length) > sizeof(*info)) {
   1513		mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED);
   1514		return 0;
   1515	}
   1516
   1517	info = dma_alloc_coherent(&vscsi->dma_dev->dev, sizeof(*info), &token,
   1518				  GFP_ATOMIC);
   1519	if (!info) {
   1520		dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n",
   1521			iue->target);
   1522		mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED);
   1523		return 0;
   1524	}
   1525
   1526	/* Get remote info */
   1527	rc = h_copy_rdma(be16_to_cpu(mad->common.length),
   1528			 vscsi->dds.window[REMOTE].liobn,
   1529			 be64_to_cpu(mad->buffer),
   1530			 vscsi->dds.window[LOCAL].liobn, token);
   1531
   1532	if (rc != H_SUCCESS) {
   1533		if (rc == H_PERMISSION) {
   1534			if (connection_broken(vscsi))
   1535				flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED);
   1536		}
   1537		dev_warn(&vscsi->dev, "adapter_info: h_copy_rdma from client failed, rc %ld\n",
   1538			 rc);
   1539		dev_dbg(&vscsi->dev, "adapter_info: ioba 0x%llx, flags 0x%x, flag_bits 0x%x\n",
   1540			be64_to_cpu(mad->buffer), vscsi->flags, flag_bits);
   1541		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT,
   1542					  flag_bits);
   1543		goto free_dma;
   1544	}
   1545
   1546	/*
   1547	 * Copy client info, but ignore partition number, which we
   1548	 * already got from phyp - unless we failed to get it from
   1549	 * phyp (e.g. if we're running on a p5 system).
   1550	 */
   1551	if (vscsi->client_data.partition_number == 0)
   1552		vscsi->client_data.partition_number =
   1553			be32_to_cpu(info->partition_number);
   1554	strncpy(vscsi->client_data.srp_version, info->srp_version,
   1555		sizeof(vscsi->client_data.srp_version));
   1556	strncpy(vscsi->client_data.partition_name, info->partition_name,
   1557		sizeof(vscsi->client_data.partition_name));
   1558	vscsi->client_data.mad_version = be32_to_cpu(info->mad_version);
   1559	vscsi->client_data.os_type = be32_to_cpu(info->os_type);
   1560
   1561	/* Copy our info */
   1562	strncpy(info->srp_version, SRP_VERSION,
   1563		sizeof(info->srp_version));
   1564	strncpy(info->partition_name, vscsi->dds.partition_name,
   1565		sizeof(info->partition_name));
   1566	info->partition_number = cpu_to_be32(vscsi->dds.partition_num);
   1567	info->mad_version = cpu_to_be32(MAD_VERSION_1);
   1568	info->os_type = cpu_to_be32(LINUX);
   1569	memset(&info->port_max_txu[0], 0, sizeof(info->port_max_txu));
   1570	info->port_max_txu[0] = cpu_to_be32(MAX_TXU);
   1571
   1572	dma_wmb();
   1573	rc = h_copy_rdma(sizeof(*info), vscsi->dds.window[LOCAL].liobn,
   1574			 token, vscsi->dds.window[REMOTE].liobn,
   1575			 be64_to_cpu(mad->buffer));
   1576	switch (rc) {
   1577	case H_SUCCESS:
   1578		break;
   1579
   1580	case H_SOURCE_PARM:
   1581	case H_DEST_PARM:
   1582	case H_PERMISSION:
   1583		if (connection_broken(vscsi))
   1584			flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED);
   1585		fallthrough;
   1586	default:
   1587		dev_err(&vscsi->dev, "adapter_info: h_copy_rdma to client failed, rc %ld\n",
   1588			rc);
   1589		ibmvscsis_post_disconnect(vscsi,
   1590					  ERR_DISCONNECT_RECONNECT,
   1591					  flag_bits);
   1592		break;
   1593	}
   1594
   1595free_dma:
   1596	dma_free_coherent(&vscsi->dma_dev->dev, sizeof(*info), info, token);
   1597	dev_dbg(&vscsi->dev, "Leaving adapter_info, rc %ld\n", rc);
   1598
   1599	return rc;
   1600}
   1601
   1602/**
   1603 * ibmvscsis_cap_mad() - Service a Capabilities MAnagement Data gram
   1604 * @vscsi:	Pointer to our adapter structure
   1605 * @iue:	Information Unit containing the Capabilities MAD request
   1606 *
   1607 * NOTE: if you return an error from this routine you must be
   1608 * disconnecting or you will cause a hang
   1609 *
   1610 * EXECUTION ENVIRONMENT:
   1611 *	Interrupt called with adapter lock held
   1612 */
   1613static int ibmvscsis_cap_mad(struct scsi_info *vscsi, struct iu_entry *iue)
   1614{
   1615	struct viosrp_capabilities *mad = &vio_iu(iue)->mad.capabilities;
   1616	struct capabilities *cap;
   1617	struct mad_capability_common *common;
   1618	dma_addr_t token;
   1619	u16 olen, len, status, min_len, cap_len;
   1620	u32 flag;
   1621	uint flag_bits = 0;
   1622	long rc = 0;
   1623
   1624	olen = be16_to_cpu(mad->common.length);
   1625	/*
   1626	 * struct capabilities hardcodes a couple capabilities after the
   1627	 * header, but the capabilities can actually be in any order.
   1628	 */
   1629	min_len = offsetof(struct capabilities, migration);
   1630	if ((olen < min_len) || (olen > PAGE_SIZE)) {
   1631		dev_warn(&vscsi->dev, "cap_mad: invalid len %d\n", olen);
   1632		mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED);
   1633		return 0;
   1634	}
   1635
   1636	cap = dma_alloc_coherent(&vscsi->dma_dev->dev, olen, &token,
   1637				 GFP_ATOMIC);
   1638	if (!cap) {
   1639		dev_err(&vscsi->dev, "bad dma_alloc_coherent %p\n",
   1640			iue->target);
   1641		mad->common.status = cpu_to_be16(VIOSRP_MAD_FAILED);
   1642		return 0;
   1643	}
   1644	rc = h_copy_rdma(olen, vscsi->dds.window[REMOTE].liobn,
   1645			 be64_to_cpu(mad->buffer),
   1646			 vscsi->dds.window[LOCAL].liobn, token);
   1647	if (rc == H_SUCCESS) {
   1648		strncpy(cap->name, dev_name(&vscsi->dma_dev->dev),
   1649			SRP_MAX_LOC_LEN);
   1650
   1651		len = olen - min_len;
   1652		status = VIOSRP_MAD_SUCCESS;
   1653		common = (struct mad_capability_common *)&cap->migration;
   1654
   1655		while ((len > 0) && (status == VIOSRP_MAD_SUCCESS) && !rc) {
   1656			dev_dbg(&vscsi->dev, "cap_mad: len left %hd, cap type %d, cap len %hd\n",
   1657				len, be32_to_cpu(common->cap_type),
   1658				be16_to_cpu(common->length));
   1659
   1660			cap_len = be16_to_cpu(common->length);
   1661			if (cap_len > len) {
   1662				dev_err(&vscsi->dev, "cap_mad: cap len mismatch with total len\n");
   1663				status = VIOSRP_MAD_FAILED;
   1664				break;
   1665			}
   1666
   1667			if (cap_len == 0) {
   1668				dev_err(&vscsi->dev, "cap_mad: cap len is 0\n");
   1669				status = VIOSRP_MAD_FAILED;
   1670				break;
   1671			}
   1672
   1673			switch (common->cap_type) {
   1674			default:
   1675				dev_dbg(&vscsi->dev, "cap_mad: unsupported capability\n");
   1676				common->server_support = 0;
   1677				flag = cpu_to_be32((u32)CAP_LIST_SUPPORTED);
   1678				cap->flags &= ~flag;
   1679				break;
   1680			}
   1681
   1682			len = len - cap_len;
   1683			common = (struct mad_capability_common *)
   1684				((char *)common + cap_len);
   1685		}
   1686
   1687		mad->common.status = cpu_to_be16(status);
   1688
   1689		dma_wmb();
   1690		rc = h_copy_rdma(olen, vscsi->dds.window[LOCAL].liobn, token,
   1691				 vscsi->dds.window[REMOTE].liobn,
   1692				 be64_to_cpu(mad->buffer));
   1693
   1694		if (rc != H_SUCCESS) {
   1695			dev_dbg(&vscsi->dev, "cap_mad: failed to copy to client, rc %ld\n",
   1696				rc);
   1697
   1698			if (rc == H_PERMISSION) {
   1699				if (connection_broken(vscsi))
   1700					flag_bits = (RESPONSE_Q_DOWN |
   1701						     CLIENT_FAILED);
   1702			}
   1703
   1704			dev_warn(&vscsi->dev, "cap_mad: error copying data to client, rc %ld\n",
   1705				 rc);
   1706			ibmvscsis_post_disconnect(vscsi,
   1707						  ERR_DISCONNECT_RECONNECT,
   1708						  flag_bits);
   1709		}
   1710	}
   1711
   1712	dma_free_coherent(&vscsi->dma_dev->dev, olen, cap, token);
   1713
   1714	dev_dbg(&vscsi->dev, "Leaving cap_mad, rc %ld, client_cap 0x%x\n",
   1715		rc, vscsi->client_cap);
   1716
   1717	return rc;
   1718}
   1719
   1720/**
   1721 * ibmvscsis_process_mad() - Service a MAnagement Data gram
   1722 * @vscsi:	Pointer to our adapter structure
   1723 * @iue:	Information Unit containing the MAD request
   1724 *
   1725 * Must be called with interrupt lock held.
   1726 */
   1727static long ibmvscsis_process_mad(struct scsi_info *vscsi, struct iu_entry *iue)
   1728{
   1729	struct mad_common *mad = (struct mad_common *)&vio_iu(iue)->mad;
   1730	struct viosrp_empty_iu *empty;
   1731	long rc = ADAPT_SUCCESS;
   1732
   1733	switch (be32_to_cpu(mad->type)) {
   1734	case VIOSRP_EMPTY_IU_TYPE:
   1735		empty = &vio_iu(iue)->mad.empty_iu;
   1736		vscsi->empty_iu_id = be64_to_cpu(empty->buffer);
   1737		vscsi->empty_iu_tag = be64_to_cpu(empty->common.tag);
   1738		mad->status = cpu_to_be16(VIOSRP_MAD_SUCCESS);
   1739		break;
   1740	case VIOSRP_ADAPTER_INFO_TYPE:
   1741		rc = ibmvscsis_adapter_info(vscsi, iue);
   1742		break;
   1743	case VIOSRP_CAPABILITIES_TYPE:
   1744		rc = ibmvscsis_cap_mad(vscsi, iue);
   1745		break;
   1746	case VIOSRP_ENABLE_FAST_FAIL:
   1747		if (vscsi->state == CONNECTED) {
   1748			vscsi->fast_fail = true;
   1749			mad->status = cpu_to_be16(VIOSRP_MAD_SUCCESS);
   1750		} else {
   1751			dev_warn(&vscsi->dev, "fast fail mad sent after login\n");
   1752			mad->status = cpu_to_be16(VIOSRP_MAD_FAILED);
   1753		}
   1754		break;
   1755	default:
   1756		mad->status = cpu_to_be16(VIOSRP_MAD_NOT_SUPPORTED);
   1757		break;
   1758	}
   1759
   1760	return rc;
   1761}
   1762
   1763/**
   1764 * srp_snd_msg_failed() - Handle an error when sending a response
   1765 * @vscsi:	Pointer to our adapter structure
   1766 * @rc:		The return code from the h_send_crq command
   1767 *
   1768 * Must be called with interrupt lock held.
   1769 */
   1770static void srp_snd_msg_failed(struct scsi_info *vscsi, long rc)
   1771{
   1772	ktime_t kt;
   1773
   1774	if (rc != H_DROPPED) {
   1775		ibmvscsis_free_cmd_qs(vscsi);
   1776
   1777		if (rc == H_CLOSED)
   1778			vscsi->flags |= CLIENT_FAILED;
   1779
   1780		/* don't flag the same problem multiple times */
   1781		if (!(vscsi->flags & RESPONSE_Q_DOWN)) {
   1782			vscsi->flags |= RESPONSE_Q_DOWN;
   1783			if (!(vscsi->state & (ERR_DISCONNECT |
   1784					      ERR_DISCONNECT_RECONNECT |
   1785					      ERR_DISCONNECTED | UNDEFINED))) {
   1786				dev_err(&vscsi->dev, "snd_msg_failed: setting RESPONSE_Q_DOWN, state 0x%hx, flags 0x%x, rc %ld\n",
   1787					vscsi->state, vscsi->flags, rc);
   1788			}
   1789			ibmvscsis_post_disconnect(vscsi,
   1790						  ERR_DISCONNECT_RECONNECT, 0);
   1791		}
   1792		return;
   1793	}
   1794
   1795	/*
   1796	 * The response queue is full.
   1797	 * If the server is processing SRP requests, i.e.
   1798	 * the client has successfully done an
   1799	 * SRP_LOGIN, then it will wait forever for room in
   1800	 * the queue.  However if the system admin
   1801	 * is attempting to unconfigure the server then one
   1802	 * or more children will be in a state where
   1803	 * they are being removed. So if there is even one
   1804	 * child being removed then the driver assumes
   1805	 * the system admin is attempting to break the
   1806	 * connection with the client and MAX_TIMER_POPS
   1807	 * is honored.
   1808	 */
   1809	if ((vscsi->rsp_q_timer.timer_pops < MAX_TIMER_POPS) ||
   1810	    (vscsi->state == SRP_PROCESSING)) {
   1811		dev_dbg(&vscsi->dev, "snd_msg_failed: response queue full, flags 0x%x, timer started %d, pops %d\n",
   1812			vscsi->flags, (int)vscsi->rsp_q_timer.started,
   1813			vscsi->rsp_q_timer.timer_pops);
   1814
   1815		/*
   1816		 * Check if the timer is running; if it
   1817		 * is not then start it up.
   1818		 */
   1819		if (!vscsi->rsp_q_timer.started) {
   1820			if (vscsi->rsp_q_timer.timer_pops <
   1821			    MAX_TIMER_POPS) {
   1822				kt = WAIT_NANO_SECONDS;
   1823			} else {
   1824				/*
   1825				 * slide the timeslice if the maximum
   1826				 * timer pops have already happened
   1827				 */
   1828				kt = ktime_set(WAIT_SECONDS, 0);
   1829			}
   1830
   1831			vscsi->rsp_q_timer.started = true;
   1832			hrtimer_start(&vscsi->rsp_q_timer.timer, kt,
   1833				      HRTIMER_MODE_REL);
   1834		}
   1835	} else {
   1836		/*
   1837		 * TBD: Do we need to worry about this? Need to get
   1838		 *      remove working.
   1839		 */
   1840		/*
   1841		 * waited a long time and it appears the system admin
   1842		 * is bring this driver down
   1843		 */
   1844		vscsi->flags |= RESPONSE_Q_DOWN;
   1845		ibmvscsis_free_cmd_qs(vscsi);
   1846		/*
   1847		 * if the driver is already attempting to disconnect
   1848		 * from the client and has already logged an error
   1849		 * trace this event but don't put it in the error log
   1850		 */
   1851		if (!(vscsi->state & (ERR_DISCONNECT |
   1852				      ERR_DISCONNECT_RECONNECT |
   1853				      ERR_DISCONNECTED | UNDEFINED))) {
   1854			dev_err(&vscsi->dev, "client crq full too long\n");
   1855			ibmvscsis_post_disconnect(vscsi,
   1856						  ERR_DISCONNECT_RECONNECT,
   1857						  0);
   1858		}
   1859	}
   1860}
   1861
   1862/**
   1863 * ibmvscsis_send_messages() - Send a Response
   1864 * @vscsi:	Pointer to our adapter structure
   1865 *
   1866 * Send a response, first checking the waiting queue. Responses are
   1867 * sent in order they are received. If the response cannot be sent,
   1868 * because the client queue is full, it stays on the waiting queue.
   1869 *
   1870 * PRECONDITION:
   1871 *	Called with interrupt lock held
   1872 */
   1873static void ibmvscsis_send_messages(struct scsi_info *vscsi)
   1874{
   1875	struct viosrp_crq empty_crq = { };
   1876	struct viosrp_crq *crq = &empty_crq;
   1877	struct ibmvscsis_cmd *cmd, *nxt;
   1878	long rc = ADAPT_SUCCESS;
   1879	bool retry = false;
   1880
   1881	if (!(vscsi->flags & RESPONSE_Q_DOWN)) {
   1882		do {
   1883			retry = false;
   1884			list_for_each_entry_safe(cmd, nxt, &vscsi->waiting_rsp,
   1885						 list) {
   1886				/*
   1887				 * Check to make sure abort cmd gets processed
   1888				 * prior to the abort tmr cmd
   1889				 */
   1890				if (cmd->flags & DELAY_SEND)
   1891					continue;
   1892
   1893				if (cmd->abort_cmd) {
   1894					retry = true;
   1895					cmd->abort_cmd->flags &= ~(DELAY_SEND);
   1896					cmd->abort_cmd = NULL;
   1897				}
   1898
   1899				/*
   1900				 * If CMD_T_ABORTED w/o CMD_T_TAS scenarios and
   1901				 * the case where LIO issued a
   1902				 * ABORT_TASK: Sending TMR_TASK_DOES_NOT_EXIST
   1903				 * case then we dont send a response, since it
   1904				 * was already done.
   1905				 */
   1906				if (cmd->se_cmd.transport_state & CMD_T_ABORTED &&
   1907				    !(cmd->se_cmd.transport_state & CMD_T_TAS)) {
   1908					list_del(&cmd->list);
   1909					ibmvscsis_free_cmd_resources(vscsi,
   1910								     cmd);
   1911					/*
   1912					 * With a successfully aborted op
   1913					 * through LIO we want to increment the
   1914					 * the vscsi credit so that when we dont
   1915					 * send a rsp to the original scsi abort
   1916					 * op (h_send_crq), but the tm rsp to
   1917					 * the abort is sent, the credit is
   1918					 * correctly sent with the abort tm rsp.
   1919					 * We would need 1 for the abort tm rsp
   1920					 * and 1 credit for the aborted scsi op.
   1921					 * Thus we need to increment here.
   1922					 * Also we want to increment the credit
   1923					 * here because we want to make sure
   1924					 * cmd is actually released first
   1925					 * otherwise the client will think it
   1926					 * it can send a new cmd, and we could
   1927					 * find ourselves short of cmd elements.
   1928					 */
   1929					vscsi->credit += 1;
   1930				} else {
   1931					crq->valid = VALID_CMD_RESP_EL;
   1932					crq->format = cmd->rsp.format;
   1933
   1934					if (cmd->flags & CMD_FAST_FAIL)
   1935						crq->status = VIOSRP_ADAPTER_FAIL;
   1936
   1937					crq->IU_length = cpu_to_be16(cmd->rsp.len);
   1938
   1939					rc = h_send_crq(vscsi->dma_dev->unit_address,
   1940							be64_to_cpu(crq->high),
   1941							be64_to_cpu(cmd->rsp.tag));
   1942
   1943					dev_dbg(&vscsi->dev, "send_messages: cmd %p, tag 0x%llx, rc %ld\n",
   1944						cmd, be64_to_cpu(cmd->rsp.tag),
   1945						rc);
   1946
   1947					/* if all ok free up the command
   1948					 * element resources
   1949					 */
   1950					if (rc == H_SUCCESS) {
   1951						/* some movement has occurred */
   1952						vscsi->rsp_q_timer.timer_pops = 0;
   1953						list_del(&cmd->list);
   1954
   1955						ibmvscsis_free_cmd_resources(vscsi,
   1956									     cmd);
   1957					} else {
   1958						srp_snd_msg_failed(vscsi, rc);
   1959						break;
   1960					}
   1961				}
   1962			}
   1963		} while (retry);
   1964
   1965		if (!rc) {
   1966			/*
   1967			 * The timer could pop with the queue empty.  If
   1968			 * this happens, rc will always indicate a
   1969			 * success; clear the pop count.
   1970			 */
   1971			vscsi->rsp_q_timer.timer_pops = 0;
   1972		}
   1973	} else {
   1974		ibmvscsis_free_cmd_qs(vscsi);
   1975	}
   1976}
   1977
   1978/* Called with intr lock held */
   1979static void ibmvscsis_send_mad_resp(struct scsi_info *vscsi,
   1980				    struct ibmvscsis_cmd *cmd,
   1981				    struct viosrp_crq *crq)
   1982{
   1983	struct iu_entry *iue = cmd->iue;
   1984	struct mad_common *mad = (struct mad_common *)&vio_iu(iue)->mad;
   1985	uint flag_bits = 0;
   1986	long rc;
   1987
   1988	dma_wmb();
   1989	rc = h_copy_rdma(sizeof(struct mad_common),
   1990			 vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma,
   1991			 vscsi->dds.window[REMOTE].liobn,
   1992			 be64_to_cpu(crq->IU_data_ptr));
   1993	if (!rc) {
   1994		cmd->rsp.format = VIOSRP_MAD_FORMAT;
   1995		cmd->rsp.len = sizeof(struct mad_common);
   1996		cmd->rsp.tag = mad->tag;
   1997		list_add_tail(&cmd->list, &vscsi->waiting_rsp);
   1998		ibmvscsis_send_messages(vscsi);
   1999	} else {
   2000		dev_dbg(&vscsi->dev, "Error sending mad response, rc %ld\n",
   2001			rc);
   2002		if (rc == H_PERMISSION) {
   2003			if (connection_broken(vscsi))
   2004				flag_bits = (RESPONSE_Q_DOWN | CLIENT_FAILED);
   2005		}
   2006		dev_err(&vscsi->dev, "mad: failed to copy to client, rc %ld\n",
   2007			rc);
   2008
   2009		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2010		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT,
   2011					  flag_bits);
   2012	}
   2013}
   2014
   2015/**
   2016 * ibmvscsis_mad() - Service a MAnagement Data gram.
   2017 * @vscsi:	Pointer to our adapter structure
   2018 * @crq:	Pointer to the CRQ entry containing the MAD request
   2019 *
   2020 * EXECUTION ENVIRONMENT:
   2021 *	Interrupt, called with adapter lock held
   2022 */
   2023static long ibmvscsis_mad(struct scsi_info *vscsi, struct viosrp_crq *crq)
   2024{
   2025	struct iu_entry *iue;
   2026	struct ibmvscsis_cmd *cmd;
   2027	struct mad_common *mad;
   2028	long rc = ADAPT_SUCCESS;
   2029
   2030	switch (vscsi->state) {
   2031		/*
   2032		 * We have not exchanged Init Msgs yet, so this MAD was sent
   2033		 * before the last Transport Event; client will not be
   2034		 * expecting a response.
   2035		 */
   2036	case WAIT_CONNECTION:
   2037		dev_dbg(&vscsi->dev, "mad: in Wait Connection state, ignoring MAD, flags %d\n",
   2038			vscsi->flags);
   2039		return ADAPT_SUCCESS;
   2040
   2041	case SRP_PROCESSING:
   2042	case CONNECTED:
   2043		break;
   2044
   2045		/*
   2046		 * We should never get here while we're in these states.
   2047		 * Just log an error and get out.
   2048		 */
   2049	case UNCONFIGURING:
   2050	case WAIT_IDLE:
   2051	case ERR_DISCONNECT:
   2052	case ERR_DISCONNECT_RECONNECT:
   2053	default:
   2054		dev_err(&vscsi->dev, "mad: invalid adapter state %d for mad\n",
   2055			vscsi->state);
   2056		return ADAPT_SUCCESS;
   2057	}
   2058
   2059	cmd = ibmvscsis_get_free_cmd(vscsi);
   2060	if (!cmd) {
   2061		dev_err(&vscsi->dev, "mad: failed to get cmd, debit %d\n",
   2062			vscsi->debit);
   2063		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2064		return ERROR;
   2065	}
   2066	iue = cmd->iue;
   2067	cmd->type = ADAPTER_MAD;
   2068
   2069	rc = ibmvscsis_copy_crq_packet(vscsi, cmd, crq);
   2070	if (!rc) {
   2071		mad = (struct mad_common *)&vio_iu(iue)->mad;
   2072
   2073		dev_dbg(&vscsi->dev, "mad: type %d\n", be32_to_cpu(mad->type));
   2074
   2075		rc = ibmvscsis_process_mad(vscsi, iue);
   2076
   2077		dev_dbg(&vscsi->dev, "mad: status %hd, rc %ld\n",
   2078			be16_to_cpu(mad->status), rc);
   2079
   2080		if (!rc)
   2081			ibmvscsis_send_mad_resp(vscsi, cmd, crq);
   2082	} else {
   2083		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2084	}
   2085
   2086	dev_dbg(&vscsi->dev, "Leaving mad, rc %ld\n", rc);
   2087	return rc;
   2088}
   2089
   2090/**
   2091 * ibmvscsis_login_rsp() - Create/copy a login response notice to the client
   2092 * @vscsi:	Pointer to our adapter structure
   2093 * @cmd:	Pointer to the command for the SRP Login request
   2094 *
   2095 * EXECUTION ENVIRONMENT:
   2096 *	Interrupt, interrupt lock held
   2097 */
   2098static long ibmvscsis_login_rsp(struct scsi_info *vscsi,
   2099				struct ibmvscsis_cmd *cmd)
   2100{
   2101	struct iu_entry *iue = cmd->iue;
   2102	struct srp_login_rsp *rsp = &vio_iu(iue)->srp.login_rsp;
   2103	struct format_code *fmt;
   2104	uint flag_bits = 0;
   2105	long rc = ADAPT_SUCCESS;
   2106
   2107	memset(rsp, 0, sizeof(struct srp_login_rsp));
   2108
   2109	rsp->opcode = SRP_LOGIN_RSP;
   2110	rsp->req_lim_delta = cpu_to_be32(vscsi->request_limit);
   2111	rsp->tag = cmd->rsp.tag;
   2112	rsp->max_it_iu_len = cpu_to_be32(SRP_MAX_IU_LEN);
   2113	rsp->max_ti_iu_len = cpu_to_be32(SRP_MAX_IU_LEN);
   2114	fmt = (struct format_code *)&rsp->buf_fmt;
   2115	fmt->buffers = SUPPORTED_FORMATS;
   2116	vscsi->credit = 0;
   2117
   2118	cmd->rsp.len = sizeof(struct srp_login_rsp);
   2119
   2120	dma_wmb();
   2121	rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn,
   2122			 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn,
   2123			 be64_to_cpu(iue->remote_token));
   2124
   2125	switch (rc) {
   2126	case H_SUCCESS:
   2127		break;
   2128
   2129	case H_PERMISSION:
   2130		if (connection_broken(vscsi))
   2131			flag_bits = RESPONSE_Q_DOWN | CLIENT_FAILED;
   2132		dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n",
   2133			rc);
   2134		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT,
   2135					  flag_bits);
   2136		break;
   2137	case H_SOURCE_PARM:
   2138	case H_DEST_PARM:
   2139	default:
   2140		dev_err(&vscsi->dev, "login_rsp: error copying to client, rc %ld\n",
   2141			rc);
   2142		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2143		break;
   2144	}
   2145
   2146	return rc;
   2147}
   2148
   2149/**
   2150 * ibmvscsis_srp_login_rej() - Create/copy a login rejection notice to client
   2151 * @vscsi:	Pointer to our adapter structure
   2152 * @cmd:	Pointer to the command for the SRP Login request
   2153 * @reason:	The reason the SRP Login is being rejected, per SRP protocol
   2154 *
   2155 * EXECUTION ENVIRONMENT:
   2156 *	Interrupt, interrupt lock held
   2157 */
   2158static long ibmvscsis_srp_login_rej(struct scsi_info *vscsi,
   2159				    struct ibmvscsis_cmd *cmd, u32 reason)
   2160{
   2161	struct iu_entry *iue = cmd->iue;
   2162	struct srp_login_rej *rej = &vio_iu(iue)->srp.login_rej;
   2163	struct format_code *fmt;
   2164	uint flag_bits = 0;
   2165	long rc = ADAPT_SUCCESS;
   2166
   2167	memset(rej, 0, sizeof(*rej));
   2168
   2169	rej->opcode = SRP_LOGIN_REJ;
   2170	rej->reason = cpu_to_be32(reason);
   2171	rej->tag = cmd->rsp.tag;
   2172	fmt = (struct format_code *)&rej->buf_fmt;
   2173	fmt->buffers = SUPPORTED_FORMATS;
   2174
   2175	cmd->rsp.len = sizeof(*rej);
   2176
   2177	dma_wmb();
   2178	rc = h_copy_rdma(cmd->rsp.len, vscsi->dds.window[LOCAL].liobn,
   2179			 iue->sbuf->dma, vscsi->dds.window[REMOTE].liobn,
   2180			 be64_to_cpu(iue->remote_token));
   2181
   2182	switch (rc) {
   2183	case H_SUCCESS:
   2184		break;
   2185	case H_PERMISSION:
   2186		if (connection_broken(vscsi))
   2187			flag_bits = RESPONSE_Q_DOWN | CLIENT_FAILED;
   2188		dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n",
   2189			rc);
   2190		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT,
   2191					  flag_bits);
   2192		break;
   2193	case H_SOURCE_PARM:
   2194	case H_DEST_PARM:
   2195	default:
   2196		dev_err(&vscsi->dev, "login_rej: error copying to client, rc %ld\n",
   2197			rc);
   2198		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2199		break;
   2200	}
   2201
   2202	return rc;
   2203}
   2204
   2205static int ibmvscsis_make_nexus(struct ibmvscsis_tport *tport)
   2206{
   2207	char *name = tport->tport_name;
   2208	struct ibmvscsis_nexus *nexus;
   2209	struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport);
   2210	int rc;
   2211
   2212	if (tport->ibmv_nexus) {
   2213		dev_dbg(&vscsi->dev, "tport->ibmv_nexus already exists\n");
   2214		return 0;
   2215	}
   2216
   2217	nexus = kzalloc(sizeof(*nexus), GFP_KERNEL);
   2218	if (!nexus) {
   2219		dev_err(&vscsi->dev, "Unable to allocate struct ibmvscsis_nexus\n");
   2220		return -ENOMEM;
   2221	}
   2222
   2223	nexus->se_sess = target_setup_session(&tport->se_tpg, 0, 0,
   2224					      TARGET_PROT_NORMAL, name, nexus,
   2225					      NULL);
   2226	if (IS_ERR(nexus->se_sess)) {
   2227		rc = PTR_ERR(nexus->se_sess);
   2228		goto transport_init_fail;
   2229	}
   2230
   2231	tport->ibmv_nexus = nexus;
   2232
   2233	return 0;
   2234
   2235transport_init_fail:
   2236	kfree(nexus);
   2237	return rc;
   2238}
   2239
   2240static int ibmvscsis_drop_nexus(struct ibmvscsis_tport *tport)
   2241{
   2242	struct se_session *se_sess;
   2243	struct ibmvscsis_nexus *nexus;
   2244
   2245	nexus = tport->ibmv_nexus;
   2246	if (!nexus)
   2247		return -ENODEV;
   2248
   2249	se_sess = nexus->se_sess;
   2250	if (!se_sess)
   2251		return -ENODEV;
   2252
   2253	/*
   2254	 * Release the SCSI I_T Nexus to the emulated ibmvscsis Target Port
   2255	 */
   2256	target_remove_session(se_sess);
   2257	tport->ibmv_nexus = NULL;
   2258	kfree(nexus);
   2259
   2260	return 0;
   2261}
   2262
   2263/**
   2264 * ibmvscsis_srp_login() - Process an SRP Login Request
   2265 * @vscsi:	Pointer to our adapter structure
   2266 * @cmd:	Command element to use to process the SRP Login request
   2267 * @crq:	Pointer to CRQ entry containing the SRP Login request
   2268 *
   2269 * EXECUTION ENVIRONMENT:
   2270 *	Interrupt, called with interrupt lock held
   2271 */
   2272static long ibmvscsis_srp_login(struct scsi_info *vscsi,
   2273				struct ibmvscsis_cmd *cmd,
   2274				struct viosrp_crq *crq)
   2275{
   2276	struct iu_entry *iue = cmd->iue;
   2277	struct srp_login_req *req = &vio_iu(iue)->srp.login_req;
   2278	struct port_id {
   2279		__be64 id_extension;
   2280		__be64 io_guid;
   2281	} *iport, *tport;
   2282	struct format_code *fmt;
   2283	u32 reason = 0x0;
   2284	long rc = ADAPT_SUCCESS;
   2285
   2286	iport = (struct port_id *)req->initiator_port_id;
   2287	tport = (struct port_id *)req->target_port_id;
   2288	fmt = (struct format_code *)&req->req_buf_fmt;
   2289	if (be32_to_cpu(req->req_it_iu_len) > SRP_MAX_IU_LEN)
   2290		reason = SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE;
   2291	else if (be32_to_cpu(req->req_it_iu_len) < 64)
   2292		reason = SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL;
   2293	else if ((be64_to_cpu(iport->id_extension) > (MAX_NUM_PORTS - 1)) ||
   2294		 (be64_to_cpu(tport->id_extension) > (MAX_NUM_PORTS - 1)))
   2295		reason = SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL;
   2296	else if (req->req_flags & SRP_MULTICHAN_MULTI)
   2297		reason = SRP_LOGIN_REJ_MULTI_CHANNEL_UNSUPPORTED;
   2298	else if (fmt->buffers & (~SUPPORTED_FORMATS))
   2299		reason = SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT;
   2300	else if ((fmt->buffers & SUPPORTED_FORMATS) == 0)
   2301		reason = SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT;
   2302
   2303	if (vscsi->state == SRP_PROCESSING)
   2304		reason = SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED;
   2305
   2306	rc = ibmvscsis_make_nexus(&vscsi->tport);
   2307	if (rc)
   2308		reason = SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL;
   2309
   2310	cmd->rsp.format = VIOSRP_SRP_FORMAT;
   2311	cmd->rsp.tag = req->tag;
   2312
   2313	dev_dbg(&vscsi->dev, "srp_login: reason 0x%x\n", reason);
   2314
   2315	if (reason)
   2316		rc = ibmvscsis_srp_login_rej(vscsi, cmd, reason);
   2317	else
   2318		rc = ibmvscsis_login_rsp(vscsi, cmd);
   2319
   2320	if (!rc) {
   2321		if (!reason)
   2322			vscsi->state = SRP_PROCESSING;
   2323
   2324		list_add_tail(&cmd->list, &vscsi->waiting_rsp);
   2325		ibmvscsis_send_messages(vscsi);
   2326	} else {
   2327		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2328	}
   2329
   2330	dev_dbg(&vscsi->dev, "Leaving srp_login, rc %ld\n", rc);
   2331	return rc;
   2332}
   2333
   2334/**
   2335 * ibmvscsis_srp_i_logout() - Helper Function to close I_T Nexus
   2336 * @vscsi:	Pointer to our adapter structure
   2337 * @cmd:	Command element to use to process the Implicit Logout request
   2338 * @crq:	Pointer to CRQ entry containing the Implicit Logout request
   2339 *
   2340 * Do the logic to close the I_T nexus.  This function may not
   2341 * behave to specification.
   2342 *
   2343 * EXECUTION ENVIRONMENT:
   2344 *	Interrupt, interrupt lock held
   2345 */
   2346static long ibmvscsis_srp_i_logout(struct scsi_info *vscsi,
   2347				   struct ibmvscsis_cmd *cmd,
   2348				   struct viosrp_crq *crq)
   2349{
   2350	struct iu_entry *iue = cmd->iue;
   2351	struct srp_i_logout *log_out = &vio_iu(iue)->srp.i_logout;
   2352
   2353	if ((vscsi->debit > 0) || !list_empty(&vscsi->schedule_q) ||
   2354	    !list_empty(&vscsi->waiting_rsp)) {
   2355		dev_err(&vscsi->dev, "i_logout: outstanding work\n");
   2356		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0);
   2357	} else {
   2358		cmd->rsp.format = SRP_FORMAT;
   2359		cmd->rsp.tag = log_out->tag;
   2360		cmd->rsp.len = sizeof(struct mad_common);
   2361		list_add_tail(&cmd->list, &vscsi->waiting_rsp);
   2362		ibmvscsis_send_messages(vscsi);
   2363
   2364		ibmvscsis_post_disconnect(vscsi, WAIT_IDLE, 0);
   2365	}
   2366
   2367	return ADAPT_SUCCESS;
   2368}
   2369
   2370/* Called with intr lock held */
   2371static void ibmvscsis_srp_cmd(struct scsi_info *vscsi, struct viosrp_crq *crq)
   2372{
   2373	struct ibmvscsis_cmd *cmd;
   2374	struct iu_entry *iue;
   2375	struct srp_cmd *srp;
   2376	struct srp_tsk_mgmt *tsk;
   2377	long rc;
   2378
   2379	if (vscsi->request_limit - vscsi->debit <= 0) {
   2380		/* Client has exceeded request limit */
   2381		dev_err(&vscsi->dev, "Client exceeded the request limit (%d), debit %d\n",
   2382			vscsi->request_limit, vscsi->debit);
   2383		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2384		return;
   2385	}
   2386
   2387	cmd = ibmvscsis_get_free_cmd(vscsi);
   2388	if (!cmd) {
   2389		dev_err(&vscsi->dev, "srp_cmd failed to get cmd, debit %d\n",
   2390			vscsi->debit);
   2391		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2392		return;
   2393	}
   2394	iue = cmd->iue;
   2395	srp = &vio_iu(iue)->srp.cmd;
   2396
   2397	rc = ibmvscsis_copy_crq_packet(vscsi, cmd, crq);
   2398	if (rc) {
   2399		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2400		return;
   2401	}
   2402
   2403	if (vscsi->state == SRP_PROCESSING) {
   2404		switch (srp->opcode) {
   2405		case SRP_LOGIN_REQ:
   2406			rc = ibmvscsis_srp_login(vscsi, cmd, crq);
   2407			break;
   2408
   2409		case SRP_TSK_MGMT:
   2410			tsk = &vio_iu(iue)->srp.tsk_mgmt;
   2411			dev_dbg(&vscsi->dev, "tsk_mgmt tag: %llu (0x%llx)\n",
   2412				tsk->tag, tsk->tag);
   2413			cmd->rsp.tag = tsk->tag;
   2414			vscsi->debit += 1;
   2415			cmd->type = TASK_MANAGEMENT;
   2416			list_add_tail(&cmd->list, &vscsi->schedule_q);
   2417			queue_work(vscsi->work_q, &cmd->work);
   2418			break;
   2419
   2420		case SRP_CMD:
   2421			dev_dbg(&vscsi->dev, "srp_cmd tag: %llu (0x%llx)\n",
   2422				srp->tag, srp->tag);
   2423			cmd->rsp.tag = srp->tag;
   2424			vscsi->debit += 1;
   2425			cmd->type = SCSI_CDB;
   2426			/*
   2427			 * We want to keep track of work waiting for
   2428			 * the workqueue.
   2429			 */
   2430			list_add_tail(&cmd->list, &vscsi->schedule_q);
   2431			queue_work(vscsi->work_q, &cmd->work);
   2432			break;
   2433
   2434		case SRP_I_LOGOUT:
   2435			rc = ibmvscsis_srp_i_logout(vscsi, cmd, crq);
   2436			break;
   2437
   2438		case SRP_CRED_RSP:
   2439		case SRP_AER_RSP:
   2440		default:
   2441			ibmvscsis_free_cmd_resources(vscsi, cmd);
   2442			dev_err(&vscsi->dev, "invalid srp cmd, opcode %d\n",
   2443				(uint)srp->opcode);
   2444			ibmvscsis_post_disconnect(vscsi,
   2445						  ERR_DISCONNECT_RECONNECT, 0);
   2446			break;
   2447		}
   2448	} else if (srp->opcode == SRP_LOGIN_REQ && vscsi->state == CONNECTED) {
   2449		rc = ibmvscsis_srp_login(vscsi, cmd, crq);
   2450	} else {
   2451		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2452		dev_err(&vscsi->dev, "Invalid state %d to handle srp cmd\n",
   2453			vscsi->state);
   2454		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2455	}
   2456}
   2457
   2458/**
   2459 * ibmvscsis_ping_response() - Respond to a ping request
   2460 * @vscsi:	Pointer to our adapter structure
   2461 *
   2462 * Let the client know that the server is alive and waiting on
   2463 * its native I/O stack.
   2464 * If any type of error occurs from the call to queue a ping
   2465 * response then the client is either not accepting or receiving
   2466 * interrupts.  Disconnect with an error.
   2467 *
   2468 * EXECUTION ENVIRONMENT:
   2469 *	Interrupt, interrupt lock held
   2470 */
   2471static long ibmvscsis_ping_response(struct scsi_info *vscsi)
   2472{
   2473	struct viosrp_crq *crq;
   2474	u64 buffer[2] = { 0, 0 };
   2475	long rc;
   2476
   2477	crq = (struct viosrp_crq *)&buffer;
   2478	crq->valid = VALID_CMD_RESP_EL;
   2479	crq->format = (u8)MESSAGE_IN_CRQ;
   2480	crq->status = PING_RESPONSE;
   2481
   2482	rc = h_send_crq(vscsi->dds.unit_id, cpu_to_be64(buffer[MSG_HI]),
   2483			cpu_to_be64(buffer[MSG_LOW]));
   2484
   2485	switch (rc) {
   2486	case H_SUCCESS:
   2487		break;
   2488	case H_CLOSED:
   2489		vscsi->flags |= CLIENT_FAILED;
   2490		fallthrough;
   2491	case H_DROPPED:
   2492		vscsi->flags |= RESPONSE_Q_DOWN;
   2493		fallthrough;
   2494	case H_REMOTE_PARM:
   2495		dev_err(&vscsi->dev, "ping_response: h_send_crq failed, rc %ld\n",
   2496			rc);
   2497		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2498		break;
   2499	default:
   2500		dev_err(&vscsi->dev, "ping_response: h_send_crq returned unknown rc %ld\n",
   2501			rc);
   2502		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0);
   2503		break;
   2504	}
   2505
   2506	return rc;
   2507}
   2508
   2509/**
   2510 * ibmvscsis_parse_command() - Parse an element taken from the cmd rsp queue.
   2511 * @vscsi:	Pointer to our adapter structure
   2512 * @crq:	Pointer to CRQ element containing the SRP request
   2513 *
   2514 * This function will return success if the command queue element is valid
   2515 * and the srp iu or MAD request it pointed to was also valid.  That does
   2516 * not mean that an error was not returned to the client.
   2517 *
   2518 * EXECUTION ENVIRONMENT:
   2519 *	Interrupt, intr lock held
   2520 */
   2521static long ibmvscsis_parse_command(struct scsi_info *vscsi,
   2522				    struct viosrp_crq *crq)
   2523{
   2524	long rc = ADAPT_SUCCESS;
   2525
   2526	switch (crq->valid) {
   2527	case VALID_CMD_RESP_EL:
   2528		switch (crq->format) {
   2529		case OS400_FORMAT:
   2530		case AIX_FORMAT:
   2531		case LINUX_FORMAT:
   2532		case MAD_FORMAT:
   2533			if (vscsi->flags & PROCESSING_MAD) {
   2534				rc = ERROR;
   2535				dev_err(&vscsi->dev, "parse_command: already processing mad\n");
   2536				ibmvscsis_post_disconnect(vscsi,
   2537						       ERR_DISCONNECT_RECONNECT,
   2538						       0);
   2539			} else {
   2540				vscsi->flags |= PROCESSING_MAD;
   2541				rc = ibmvscsis_mad(vscsi, crq);
   2542			}
   2543			break;
   2544
   2545		case SRP_FORMAT:
   2546			ibmvscsis_srp_cmd(vscsi, crq);
   2547			break;
   2548
   2549		case MESSAGE_IN_CRQ:
   2550			if (crq->status == PING)
   2551				ibmvscsis_ping_response(vscsi);
   2552			break;
   2553
   2554		default:
   2555			dev_err(&vscsi->dev, "parse_command: invalid format %d\n",
   2556				(uint)crq->format);
   2557			ibmvscsis_post_disconnect(vscsi,
   2558						  ERR_DISCONNECT_RECONNECT, 0);
   2559			break;
   2560		}
   2561		break;
   2562
   2563	case VALID_TRANS_EVENT:
   2564		rc = ibmvscsis_trans_event(vscsi, crq);
   2565		break;
   2566
   2567	case VALID_INIT_MSG:
   2568		rc = ibmvscsis_init_msg(vscsi, crq);
   2569		break;
   2570
   2571	default:
   2572		dev_err(&vscsi->dev, "parse_command: invalid valid field %d\n",
   2573			(uint)crq->valid);
   2574		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2575		break;
   2576	}
   2577
   2578	/*
   2579	 * Return only what the interrupt handler cares
   2580	 * about. Most errors we keep right on trucking.
   2581	 */
   2582	rc = vscsi->flags & SCHEDULE_DISCONNECT;
   2583
   2584	return rc;
   2585}
   2586
   2587static int read_dma_window(struct scsi_info *vscsi)
   2588{
   2589	struct vio_dev *vdev = vscsi->dma_dev;
   2590	const __be32 *dma_window;
   2591	const __be32 *prop;
   2592
   2593	/* TODO Using of_parse_dma_window would be better, but it doesn't give
   2594	 * a way to read multiple windows without already knowing the size of
   2595	 * a window or the number of windows.
   2596	 */
   2597	dma_window = (const __be32 *)vio_get_attribute(vdev,
   2598						       "ibm,my-dma-window",
   2599						       NULL);
   2600	if (!dma_window) {
   2601		dev_err(&vscsi->dev, "Couldn't find ibm,my-dma-window property\n");
   2602		return -1;
   2603	}
   2604
   2605	vscsi->dds.window[LOCAL].liobn = be32_to_cpu(*dma_window);
   2606	dma_window++;
   2607
   2608	prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-address-cells",
   2609						 NULL);
   2610	if (!prop) {
   2611		dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-address-cells property\n");
   2612		dma_window++;
   2613	} else {
   2614		dma_window += be32_to_cpu(*prop);
   2615	}
   2616
   2617	prop = (const __be32 *)vio_get_attribute(vdev, "ibm,#dma-size-cells",
   2618						 NULL);
   2619	if (!prop) {
   2620		dev_warn(&vscsi->dev, "Couldn't find ibm,#dma-size-cells property\n");
   2621		dma_window++;
   2622	} else {
   2623		dma_window += be32_to_cpu(*prop);
   2624	}
   2625
   2626	/* dma_window should point to the second window now */
   2627	vscsi->dds.window[REMOTE].liobn = be32_to_cpu(*dma_window);
   2628
   2629	return 0;
   2630}
   2631
   2632static struct ibmvscsis_tport *ibmvscsis_lookup_port(const char *name)
   2633{
   2634	struct ibmvscsis_tport *tport = NULL;
   2635	struct vio_dev *vdev;
   2636	struct scsi_info *vscsi;
   2637
   2638	spin_lock_bh(&ibmvscsis_dev_lock);
   2639	list_for_each_entry(vscsi, &ibmvscsis_dev_list, list) {
   2640		vdev = vscsi->dma_dev;
   2641		if (!strcmp(dev_name(&vdev->dev), name)) {
   2642			tport = &vscsi->tport;
   2643			break;
   2644		}
   2645	}
   2646	spin_unlock_bh(&ibmvscsis_dev_lock);
   2647
   2648	return tport;
   2649}
   2650
   2651/**
   2652 * ibmvscsis_parse_cmd() - Parse SRP Command
   2653 * @vscsi:	Pointer to our adapter structure
   2654 * @cmd:	Pointer to command element with SRP command
   2655 *
   2656 * Parse the srp command; if it is valid then submit it to tcm.
   2657 * Note: The return code does not reflect the status of the SCSI CDB.
   2658 *
   2659 * EXECUTION ENVIRONMENT:
   2660 *	Process level
   2661 */
   2662static void ibmvscsis_parse_cmd(struct scsi_info *vscsi,
   2663				struct ibmvscsis_cmd *cmd)
   2664{
   2665	struct iu_entry *iue = cmd->iue;
   2666	struct srp_cmd *srp = (struct srp_cmd *)iue->sbuf->buf;
   2667	struct ibmvscsis_nexus *nexus;
   2668	u64 data_len = 0;
   2669	enum dma_data_direction dir;
   2670	int attr = 0;
   2671
   2672	nexus = vscsi->tport.ibmv_nexus;
   2673	/*
   2674	 * additional length in bytes.  Note that the SRP spec says that
   2675	 * additional length is in 4-byte words, but technically the
   2676	 * additional length field is only the upper 6 bits of the byte.
   2677	 * The lower 2 bits are reserved.  If the lower 2 bits are 0 (as
   2678	 * all reserved fields should be), then interpreting the byte as
   2679	 * an int will yield the length in bytes.
   2680	 */
   2681	if (srp->add_cdb_len & 0x03) {
   2682		dev_err(&vscsi->dev, "parse_cmd: reserved bits set in IU\n");
   2683		spin_lock_bh(&vscsi->intr_lock);
   2684		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2685		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2686		spin_unlock_bh(&vscsi->intr_lock);
   2687		return;
   2688	}
   2689
   2690	if (srp_get_desc_table(srp, &dir, &data_len)) {
   2691		dev_err(&vscsi->dev, "0x%llx: parsing SRP descriptor table failed.\n",
   2692			srp->tag);
   2693		goto fail;
   2694	}
   2695
   2696	cmd->rsp.sol_not = srp->sol_not;
   2697
   2698	switch (srp->task_attr) {
   2699	case SRP_SIMPLE_TASK:
   2700		attr = TCM_SIMPLE_TAG;
   2701		break;
   2702	case SRP_ORDERED_TASK:
   2703		attr = TCM_ORDERED_TAG;
   2704		break;
   2705	case SRP_HEAD_TASK:
   2706		attr = TCM_HEAD_TAG;
   2707		break;
   2708	case SRP_ACA_TASK:
   2709		attr = TCM_ACA_TAG;
   2710		break;
   2711	default:
   2712		dev_err(&vscsi->dev, "Invalid task attribute %d\n",
   2713			srp->task_attr);
   2714		goto fail;
   2715	}
   2716
   2717	cmd->se_cmd.tag = be64_to_cpu(srp->tag);
   2718
   2719	spin_lock_bh(&vscsi->intr_lock);
   2720	list_add_tail(&cmd->list, &vscsi->active_q);
   2721	spin_unlock_bh(&vscsi->intr_lock);
   2722
   2723	srp->lun.scsi_lun[0] &= 0x3f;
   2724
   2725	target_submit_cmd(&cmd->se_cmd, nexus->se_sess, srp->cdb,
   2726			  cmd->sense_buf, scsilun_to_int(&srp->lun),
   2727			  data_len, attr, dir, 0);
   2728	return;
   2729
   2730fail:
   2731	spin_lock_bh(&vscsi->intr_lock);
   2732	ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT_RECONNECT, 0);
   2733	spin_unlock_bh(&vscsi->intr_lock);
   2734}
   2735
   2736/**
   2737 * ibmvscsis_parse_task() - Parse SRP Task Management Request
   2738 * @vscsi:	Pointer to our adapter structure
   2739 * @cmd:	Pointer to command element with SRP task management request
   2740 *
   2741 * Parse the srp task management request; if it is valid then submit it to tcm.
   2742 * Note: The return code does not reflect the status of the task management
   2743 * request.
   2744 *
   2745 * EXECUTION ENVIRONMENT:
   2746 *	Processor level
   2747 */
   2748static void ibmvscsis_parse_task(struct scsi_info *vscsi,
   2749				 struct ibmvscsis_cmd *cmd)
   2750{
   2751	struct iu_entry *iue = cmd->iue;
   2752	struct srp_tsk_mgmt *srp_tsk = &vio_iu(iue)->srp.tsk_mgmt;
   2753	int tcm_type;
   2754	u64 tag_to_abort = 0;
   2755	int rc = 0;
   2756	struct ibmvscsis_nexus *nexus;
   2757
   2758	nexus = vscsi->tport.ibmv_nexus;
   2759
   2760	cmd->rsp.sol_not = srp_tsk->sol_not;
   2761
   2762	switch (srp_tsk->tsk_mgmt_func) {
   2763	case SRP_TSK_ABORT_TASK:
   2764		tcm_type = TMR_ABORT_TASK;
   2765		tag_to_abort = be64_to_cpu(srp_tsk->task_tag);
   2766		break;
   2767	case SRP_TSK_ABORT_TASK_SET:
   2768		tcm_type = TMR_ABORT_TASK_SET;
   2769		break;
   2770	case SRP_TSK_CLEAR_TASK_SET:
   2771		tcm_type = TMR_CLEAR_TASK_SET;
   2772		break;
   2773	case SRP_TSK_LUN_RESET:
   2774		tcm_type = TMR_LUN_RESET;
   2775		break;
   2776	case SRP_TSK_CLEAR_ACA:
   2777		tcm_type = TMR_CLEAR_ACA;
   2778		break;
   2779	default:
   2780		dev_err(&vscsi->dev, "unknown task mgmt func %d\n",
   2781			srp_tsk->tsk_mgmt_func);
   2782		cmd->se_cmd.se_tmr_req->response =
   2783			TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED;
   2784		rc = -1;
   2785		break;
   2786	}
   2787
   2788	if (!rc) {
   2789		cmd->se_cmd.tag = be64_to_cpu(srp_tsk->tag);
   2790
   2791		spin_lock_bh(&vscsi->intr_lock);
   2792		list_add_tail(&cmd->list, &vscsi->active_q);
   2793		spin_unlock_bh(&vscsi->intr_lock);
   2794
   2795		srp_tsk->lun.scsi_lun[0] &= 0x3f;
   2796
   2797		dev_dbg(&vscsi->dev, "calling submit_tmr, func %d\n",
   2798			srp_tsk->tsk_mgmt_func);
   2799		rc = target_submit_tmr(&cmd->se_cmd, nexus->se_sess, NULL,
   2800				       scsilun_to_int(&srp_tsk->lun), srp_tsk,
   2801				       tcm_type, GFP_KERNEL, tag_to_abort, 0);
   2802		if (rc) {
   2803			dev_err(&vscsi->dev, "target_submit_tmr failed, rc %d\n",
   2804				rc);
   2805			spin_lock_bh(&vscsi->intr_lock);
   2806			list_del(&cmd->list);
   2807			spin_unlock_bh(&vscsi->intr_lock);
   2808			cmd->se_cmd.se_tmr_req->response =
   2809				TMR_FUNCTION_REJECTED;
   2810		}
   2811	}
   2812
   2813	if (rc)
   2814		transport_send_check_condition_and_sense(&cmd->se_cmd, 0, 0);
   2815}
   2816
   2817static void ibmvscsis_scheduler(struct work_struct *work)
   2818{
   2819	struct ibmvscsis_cmd *cmd = container_of(work, struct ibmvscsis_cmd,
   2820						 work);
   2821	struct scsi_info *vscsi = cmd->adapter;
   2822
   2823	spin_lock_bh(&vscsi->intr_lock);
   2824
   2825	/* Remove from schedule_q */
   2826	list_del(&cmd->list);
   2827
   2828	/* Don't submit cmd if we're disconnecting */
   2829	if (vscsi->flags & (SCHEDULE_DISCONNECT | DISCONNECT_SCHEDULED)) {
   2830		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2831
   2832		/* ibmvscsis_disconnect might be waiting for us */
   2833		if (list_empty(&vscsi->active_q) &&
   2834		    list_empty(&vscsi->schedule_q) &&
   2835		    (vscsi->flags & WAIT_FOR_IDLE)) {
   2836			vscsi->flags &= ~WAIT_FOR_IDLE;
   2837			complete(&vscsi->wait_idle);
   2838		}
   2839
   2840		spin_unlock_bh(&vscsi->intr_lock);
   2841		return;
   2842	}
   2843
   2844	spin_unlock_bh(&vscsi->intr_lock);
   2845
   2846	switch (cmd->type) {
   2847	case SCSI_CDB:
   2848		ibmvscsis_parse_cmd(vscsi, cmd);
   2849		break;
   2850	case TASK_MANAGEMENT:
   2851		ibmvscsis_parse_task(vscsi, cmd);
   2852		break;
   2853	default:
   2854		dev_err(&vscsi->dev, "scheduler, invalid cmd type %d\n",
   2855			cmd->type);
   2856		spin_lock_bh(&vscsi->intr_lock);
   2857		ibmvscsis_free_cmd_resources(vscsi, cmd);
   2858		spin_unlock_bh(&vscsi->intr_lock);
   2859		break;
   2860	}
   2861}
   2862
   2863static int ibmvscsis_alloc_cmds(struct scsi_info *vscsi, int num)
   2864{
   2865	struct ibmvscsis_cmd *cmd;
   2866	int i;
   2867
   2868	INIT_LIST_HEAD(&vscsi->free_cmd);
   2869	vscsi->cmd_pool = kcalloc(num, sizeof(struct ibmvscsis_cmd),
   2870				  GFP_KERNEL);
   2871	if (!vscsi->cmd_pool)
   2872		return -ENOMEM;
   2873
   2874	for (i = 0, cmd = (struct ibmvscsis_cmd *)vscsi->cmd_pool; i < num;
   2875	     i++, cmd++) {
   2876		cmd->abort_cmd = NULL;
   2877		cmd->adapter = vscsi;
   2878		INIT_WORK(&cmd->work, ibmvscsis_scheduler);
   2879		list_add_tail(&cmd->list, &vscsi->free_cmd);
   2880	}
   2881
   2882	return 0;
   2883}
   2884
   2885static void ibmvscsis_free_cmds(struct scsi_info *vscsi)
   2886{
   2887	kfree(vscsi->cmd_pool);
   2888	vscsi->cmd_pool = NULL;
   2889	INIT_LIST_HEAD(&vscsi->free_cmd);
   2890}
   2891
   2892/**
   2893 * ibmvscsis_service_wait_q() - Service Waiting Queue
   2894 * @timer:	Pointer to timer which has expired
   2895 *
   2896 * This routine is called when the timer pops to service the waiting
   2897 * queue. Elements on the queue have completed, their responses have been
   2898 * copied to the client, but the client's response queue was full so
   2899 * the queue message could not be sent. The routine grabs the proper locks
   2900 * and calls send messages.
   2901 *
   2902 * EXECUTION ENVIRONMENT:
   2903 *	called at interrupt level
   2904 */
   2905static enum hrtimer_restart ibmvscsis_service_wait_q(struct hrtimer *timer)
   2906{
   2907	struct timer_cb *p_timer = container_of(timer, struct timer_cb, timer);
   2908	struct scsi_info *vscsi = container_of(p_timer, struct scsi_info,
   2909					       rsp_q_timer);
   2910
   2911	spin_lock_bh(&vscsi->intr_lock);
   2912	p_timer->timer_pops += 1;
   2913	p_timer->started = false;
   2914	ibmvscsis_send_messages(vscsi);
   2915	spin_unlock_bh(&vscsi->intr_lock);
   2916
   2917	return HRTIMER_NORESTART;
   2918}
   2919
   2920static long ibmvscsis_alloctimer(struct scsi_info *vscsi)
   2921{
   2922	struct timer_cb *p_timer;
   2923
   2924	p_timer = &vscsi->rsp_q_timer;
   2925	hrtimer_init(&p_timer->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
   2926
   2927	p_timer->timer.function = ibmvscsis_service_wait_q;
   2928	p_timer->started = false;
   2929	p_timer->timer_pops = 0;
   2930
   2931	return ADAPT_SUCCESS;
   2932}
   2933
   2934static void ibmvscsis_freetimer(struct scsi_info *vscsi)
   2935{
   2936	struct timer_cb *p_timer;
   2937
   2938	p_timer = &vscsi->rsp_q_timer;
   2939
   2940	(void)hrtimer_cancel(&p_timer->timer);
   2941
   2942	p_timer->started = false;
   2943	p_timer->timer_pops = 0;
   2944}
   2945
   2946static irqreturn_t ibmvscsis_interrupt(int dummy, void *data)
   2947{
   2948	struct scsi_info *vscsi = data;
   2949
   2950	vio_disable_interrupts(vscsi->dma_dev);
   2951	tasklet_schedule(&vscsi->work_task);
   2952
   2953	return IRQ_HANDLED;
   2954}
   2955
   2956/**
   2957 * ibmvscsis_enable_change_state() - Set new state based on enabled status
   2958 * @vscsi:	Pointer to our adapter structure
   2959 *
   2960 * This function determines our new state now that we are enabled.  This
   2961 * may involve sending an Init Complete message to the client.
   2962 *
   2963 * Must be called with interrupt lock held.
   2964 */
   2965static long ibmvscsis_enable_change_state(struct scsi_info *vscsi)
   2966{
   2967	int bytes;
   2968	long rc = ADAPT_SUCCESS;
   2969
   2970	bytes = vscsi->cmd_q.size * PAGE_SIZE;
   2971	rc = h_reg_crq(vscsi->dds.unit_id, vscsi->cmd_q.crq_token, bytes);
   2972	if (rc == H_CLOSED || rc == H_SUCCESS) {
   2973		vscsi->state = WAIT_CONNECTION;
   2974		rc = ibmvscsis_establish_new_q(vscsi);
   2975	}
   2976
   2977	if (rc != ADAPT_SUCCESS) {
   2978		vscsi->state = ERR_DISCONNECTED;
   2979		vscsi->flags |= RESPONSE_Q_DOWN;
   2980	}
   2981
   2982	return rc;
   2983}
   2984
   2985/**
   2986 * ibmvscsis_create_command_q() - Create Command Queue
   2987 * @vscsi:	Pointer to our adapter structure
   2988 * @num_cmds:	Currently unused.  In the future, may be used to determine
   2989 *		the size of the CRQ.
   2990 *
   2991 * Allocates memory for command queue maps remote memory into an ioba
   2992 * initializes the command response queue
   2993 *
   2994 * EXECUTION ENVIRONMENT:
   2995 *	Process level only
   2996 */
   2997static long ibmvscsis_create_command_q(struct scsi_info *vscsi, int num_cmds)
   2998{
   2999	int pages;
   3000	struct vio_dev *vdev = vscsi->dma_dev;
   3001
   3002	/* We might support multiple pages in the future, but just 1 for now */
   3003	pages = 1;
   3004
   3005	vscsi->cmd_q.size = pages;
   3006
   3007	vscsi->cmd_q.base_addr =
   3008		(struct viosrp_crq *)get_zeroed_page(GFP_KERNEL);
   3009	if (!vscsi->cmd_q.base_addr)
   3010		return -ENOMEM;
   3011
   3012	vscsi->cmd_q.mask = ((uint)pages * CRQ_PER_PAGE) - 1;
   3013
   3014	vscsi->cmd_q.crq_token = dma_map_single(&vdev->dev,
   3015						vscsi->cmd_q.base_addr,
   3016						PAGE_SIZE, DMA_BIDIRECTIONAL);
   3017	if (dma_mapping_error(&vdev->dev, vscsi->cmd_q.crq_token)) {
   3018		free_page((unsigned long)vscsi->cmd_q.base_addr);
   3019		return -ENOMEM;
   3020	}
   3021
   3022	return 0;
   3023}
   3024
   3025/**
   3026 * ibmvscsis_destroy_command_q - Destroy Command Queue
   3027 * @vscsi:	Pointer to our adapter structure
   3028 *
   3029 * Releases memory for command queue and unmaps mapped remote memory.
   3030 *
   3031 * EXECUTION ENVIRONMENT:
   3032 *	Process level only
   3033 */
   3034static void ibmvscsis_destroy_command_q(struct scsi_info *vscsi)
   3035{
   3036	dma_unmap_single(&vscsi->dma_dev->dev, vscsi->cmd_q.crq_token,
   3037			 PAGE_SIZE, DMA_BIDIRECTIONAL);
   3038	free_page((unsigned long)vscsi->cmd_q.base_addr);
   3039	vscsi->cmd_q.base_addr = NULL;
   3040	vscsi->state = NO_QUEUE;
   3041}
   3042
   3043static u8 ibmvscsis_fast_fail(struct scsi_info *vscsi,
   3044			      struct ibmvscsis_cmd *cmd)
   3045{
   3046	struct iu_entry *iue = cmd->iue;
   3047	struct se_cmd *se_cmd = &cmd->se_cmd;
   3048	struct srp_cmd *srp = (struct srp_cmd *)iue->sbuf->buf;
   3049	struct scsi_sense_hdr sshdr;
   3050	u8 rc = se_cmd->scsi_status;
   3051
   3052	if (vscsi->fast_fail && (READ_CMD(srp->cdb) || WRITE_CMD(srp->cdb)))
   3053		if (scsi_normalize_sense(se_cmd->sense_buffer,
   3054					 se_cmd->scsi_sense_length, &sshdr))
   3055			if (sshdr.sense_key == HARDWARE_ERROR &&
   3056			    (se_cmd->residual_count == 0 ||
   3057			     se_cmd->residual_count == se_cmd->data_length)) {
   3058				rc = NO_SENSE;
   3059				cmd->flags |= CMD_FAST_FAIL;
   3060			}
   3061
   3062	return rc;
   3063}
   3064
   3065/**
   3066 * srp_build_response() - Build an SRP response buffer
   3067 * @vscsi:	Pointer to our adapter structure
   3068 * @cmd:	Pointer to command for which to send the response
   3069 * @len_p:	Where to return the length of the IU response sent.  This
   3070 *		is needed to construct the CRQ response.
   3071 *
   3072 * Build the SRP response buffer and copy it to the client's memory space.
   3073 */
   3074static long srp_build_response(struct scsi_info *vscsi,
   3075			       struct ibmvscsis_cmd *cmd, uint *len_p)
   3076{
   3077	struct iu_entry *iue = cmd->iue;
   3078	struct se_cmd *se_cmd = &cmd->se_cmd;
   3079	struct srp_rsp *rsp;
   3080	uint len;
   3081	u32 rsp_code;
   3082	char *data;
   3083	u32 *tsk_status;
   3084	long rc = ADAPT_SUCCESS;
   3085
   3086	spin_lock_bh(&vscsi->intr_lock);
   3087
   3088	rsp = &vio_iu(iue)->srp.rsp;
   3089	len = sizeof(*rsp);
   3090	memset(rsp, 0, len);
   3091	data = rsp->data;
   3092
   3093	rsp->opcode = SRP_RSP;
   3094
   3095	rsp->req_lim_delta = cpu_to_be32(1 + vscsi->credit);
   3096	rsp->tag = cmd->rsp.tag;
   3097	rsp->flags = 0;
   3098
   3099	if (cmd->type == SCSI_CDB) {
   3100		rsp->status = ibmvscsis_fast_fail(vscsi, cmd);
   3101		if (rsp->status) {
   3102			dev_dbg(&vscsi->dev, "build_resp: cmd %p, scsi status %d\n",
   3103				cmd, (int)rsp->status);
   3104			ibmvscsis_determine_resid(se_cmd, rsp);
   3105			if (se_cmd->scsi_sense_length && se_cmd->sense_buffer) {
   3106				rsp->sense_data_len =
   3107					cpu_to_be32(se_cmd->scsi_sense_length);
   3108				rsp->flags |= SRP_RSP_FLAG_SNSVALID;
   3109				len += se_cmd->scsi_sense_length;
   3110				memcpy(data, se_cmd->sense_buffer,
   3111				       se_cmd->scsi_sense_length);
   3112			}
   3113			rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >>
   3114				UCSOLNT_RESP_SHIFT;
   3115		} else if (cmd->flags & CMD_FAST_FAIL) {
   3116			dev_dbg(&vscsi->dev, "build_resp: cmd %p, fast fail\n",
   3117				cmd);
   3118			rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >>
   3119				UCSOLNT_RESP_SHIFT;
   3120		} else {
   3121			rsp->sol_not = (cmd->rsp.sol_not & SCSOLNT) >>
   3122				SCSOLNT_RESP_SHIFT;
   3123		}
   3124	} else {
   3125		/* this is task management */
   3126		rsp->status = 0;
   3127		rsp->resp_data_len = cpu_to_be32(4);
   3128		rsp->flags |= SRP_RSP_FLAG_RSPVALID;
   3129
   3130		switch (se_cmd->se_tmr_req->response) {
   3131		case TMR_FUNCTION_COMPLETE:
   3132		case TMR_TASK_DOES_NOT_EXIST:
   3133			rsp_code = SRP_TASK_MANAGEMENT_FUNCTION_COMPLETE;
   3134			rsp->sol_not = (cmd->rsp.sol_not & SCSOLNT) >>
   3135				SCSOLNT_RESP_SHIFT;
   3136			break;
   3137		case TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED:
   3138		case TMR_LUN_DOES_NOT_EXIST:
   3139			rsp_code = SRP_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED;
   3140			rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >>
   3141				UCSOLNT_RESP_SHIFT;
   3142			break;
   3143		case TMR_FUNCTION_FAILED:
   3144		case TMR_FUNCTION_REJECTED:
   3145		default:
   3146			rsp_code = SRP_TASK_MANAGEMENT_FUNCTION_FAILED;
   3147			rsp->sol_not = (cmd->rsp.sol_not & UCSOLNT) >>
   3148				UCSOLNT_RESP_SHIFT;
   3149			break;
   3150		}
   3151
   3152		tsk_status = (u32 *)data;
   3153		*tsk_status = cpu_to_be32(rsp_code);
   3154		data = (char *)(tsk_status + 1);
   3155		len += 4;
   3156	}
   3157
   3158	dma_wmb();
   3159	rc = h_copy_rdma(len, vscsi->dds.window[LOCAL].liobn, iue->sbuf->dma,
   3160			 vscsi->dds.window[REMOTE].liobn,
   3161			 be64_to_cpu(iue->remote_token));
   3162
   3163	switch (rc) {
   3164	case H_SUCCESS:
   3165		vscsi->credit = 0;
   3166		*len_p = len;
   3167		break;
   3168	case H_PERMISSION:
   3169		if (connection_broken(vscsi))
   3170			vscsi->flags |= RESPONSE_Q_DOWN | CLIENT_FAILED;
   3171
   3172		dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld, flags 0x%x, state 0x%hx\n",
   3173			rc, vscsi->flags, vscsi->state);
   3174		break;
   3175	case H_SOURCE_PARM:
   3176	case H_DEST_PARM:
   3177	default:
   3178		dev_err(&vscsi->dev, "build_response: error copying to client, rc %ld\n",
   3179			rc);
   3180		break;
   3181	}
   3182
   3183	spin_unlock_bh(&vscsi->intr_lock);
   3184
   3185	return rc;
   3186}
   3187
   3188static int ibmvscsis_rdma(struct ibmvscsis_cmd *cmd, struct scatterlist *sg,
   3189			  int nsg, struct srp_direct_buf *md, int nmd,
   3190			  enum dma_data_direction dir, unsigned int bytes)
   3191{
   3192	struct iu_entry *iue = cmd->iue;
   3193	struct srp_target *target = iue->target;
   3194	struct scsi_info *vscsi = target->ldata;
   3195	struct scatterlist *sgp;
   3196	dma_addr_t client_ioba, server_ioba;
   3197	ulong buf_len;
   3198	ulong client_len, server_len;
   3199	int md_idx;
   3200	long tx_len;
   3201	long rc = 0;
   3202
   3203	if (bytes == 0)
   3204		return 0;
   3205
   3206	sgp = sg;
   3207	client_len = 0;
   3208	server_len = 0;
   3209	md_idx = 0;
   3210	tx_len = bytes;
   3211
   3212	do {
   3213		if (client_len == 0) {
   3214			if (md_idx >= nmd) {
   3215				dev_err(&vscsi->dev, "rdma: ran out of client memory descriptors\n");
   3216				rc = -EIO;
   3217				break;
   3218			}
   3219			client_ioba = be64_to_cpu(md[md_idx].va);
   3220			client_len = be32_to_cpu(md[md_idx].len);
   3221		}
   3222		if (server_len == 0) {
   3223			if (!sgp) {
   3224				dev_err(&vscsi->dev, "rdma: ran out of scatter/gather list\n");
   3225				rc = -EIO;
   3226				break;
   3227			}
   3228			server_ioba = sg_dma_address(sgp);
   3229			server_len = sg_dma_len(sgp);
   3230		}
   3231
   3232		buf_len = tx_len;
   3233
   3234		if (buf_len > client_len)
   3235			buf_len = client_len;
   3236
   3237		if (buf_len > server_len)
   3238			buf_len = server_len;
   3239
   3240		if (buf_len > max_vdma_size)
   3241			buf_len = max_vdma_size;
   3242
   3243		if (dir == DMA_TO_DEVICE) {
   3244			/* read from client */
   3245			rc = h_copy_rdma(buf_len,
   3246					 vscsi->dds.window[REMOTE].liobn,
   3247					 client_ioba,
   3248					 vscsi->dds.window[LOCAL].liobn,
   3249					 server_ioba);
   3250		} else {
   3251			/* The h_copy_rdma will cause phyp, running in another
   3252			 * partition, to read memory, so we need to make sure
   3253			 * the data has been written out, hence these syncs.
   3254			 */
   3255			/* ensure that everything is in memory */
   3256			isync();
   3257			/* ensure that memory has been made visible */
   3258			dma_wmb();
   3259			rc = h_copy_rdma(buf_len,
   3260					 vscsi->dds.window[LOCAL].liobn,
   3261					 server_ioba,
   3262					 vscsi->dds.window[REMOTE].liobn,
   3263					 client_ioba);
   3264		}
   3265		switch (rc) {
   3266		case H_SUCCESS:
   3267			break;
   3268		case H_PERMISSION:
   3269		case H_SOURCE_PARM:
   3270		case H_DEST_PARM:
   3271			if (connection_broken(vscsi)) {
   3272				spin_lock_bh(&vscsi->intr_lock);
   3273				vscsi->flags |=
   3274					(RESPONSE_Q_DOWN | CLIENT_FAILED);
   3275				spin_unlock_bh(&vscsi->intr_lock);
   3276			}
   3277			dev_err(&vscsi->dev, "rdma: h_copy_rdma failed, rc %ld\n",
   3278				rc);
   3279			break;
   3280
   3281		default:
   3282			dev_err(&vscsi->dev, "rdma: unknown error %ld from h_copy_rdma\n",
   3283				rc);
   3284			break;
   3285		}
   3286
   3287		if (!rc) {
   3288			tx_len -= buf_len;
   3289			if (tx_len) {
   3290				client_len -= buf_len;
   3291				if (client_len == 0)
   3292					md_idx++;
   3293				else
   3294					client_ioba += buf_len;
   3295
   3296				server_len -= buf_len;
   3297				if (server_len == 0)
   3298					sgp = sg_next(sgp);
   3299				else
   3300					server_ioba += buf_len;
   3301			} else {
   3302				break;
   3303			}
   3304		}
   3305	} while (!rc);
   3306
   3307	return rc;
   3308}
   3309
   3310/**
   3311 * ibmvscsis_handle_crq() - Handle CRQ
   3312 * @data:	Pointer to our adapter structure
   3313 *
   3314 * Read the command elements from the command queue and copy the payloads
   3315 * associated with the command elements to local memory and execute the
   3316 * SRP requests.
   3317 *
   3318 * Note: this is an edge triggered interrupt. It can not be shared.
   3319 */
   3320static void ibmvscsis_handle_crq(unsigned long data)
   3321{
   3322	struct scsi_info *vscsi = (struct scsi_info *)data;
   3323	struct viosrp_crq *crq;
   3324	long rc;
   3325	bool ack = true;
   3326	volatile u8 valid;
   3327
   3328	spin_lock_bh(&vscsi->intr_lock);
   3329
   3330	dev_dbg(&vscsi->dev, "got interrupt\n");
   3331
   3332	/*
   3333	 * if we are in a path where we are waiting for all pending commands
   3334	 * to complete because we received a transport event and anything in
   3335	 * the command queue is for a new connection, do nothing
   3336	 */
   3337	if (TARGET_STOP(vscsi)) {
   3338		vio_enable_interrupts(vscsi->dma_dev);
   3339
   3340		dev_dbg(&vscsi->dev, "handle_crq, don't process: flags 0x%x, state 0x%hx\n",
   3341			vscsi->flags, vscsi->state);
   3342		spin_unlock_bh(&vscsi->intr_lock);
   3343		return;
   3344	}
   3345
   3346	rc = vscsi->flags & SCHEDULE_DISCONNECT;
   3347	crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index;
   3348	valid = crq->valid;
   3349	dma_rmb();
   3350
   3351	while (valid) {
   3352		/*
   3353		 * These are edege triggered interrupts. After dropping out of
   3354		 * the while loop, the code must check for work since an
   3355		 * interrupt could be lost, and an elment be left on the queue,
   3356		 * hence the label.
   3357		 */
   3358cmd_work:
   3359		vscsi->cmd_q.index =
   3360			(vscsi->cmd_q.index + 1) & vscsi->cmd_q.mask;
   3361
   3362		if (!rc) {
   3363			rc = ibmvscsis_parse_command(vscsi, crq);
   3364		} else {
   3365			if ((uint)crq->valid == VALID_TRANS_EVENT) {
   3366				/*
   3367				 * must service the transport layer events even
   3368				 * in an error state, dont break out until all
   3369				 * the consecutive transport events have been
   3370				 * processed
   3371				 */
   3372				rc = ibmvscsis_trans_event(vscsi, crq);
   3373			} else if (vscsi->flags & TRANS_EVENT) {
   3374				/*
   3375				 * if a transport event has occurred leave
   3376				 * everything but transport events on the queue
   3377				 *
   3378				 * need to decrement the queue index so we can
   3379				 * look at the element again
   3380				 */
   3381				if (vscsi->cmd_q.index)
   3382					vscsi->cmd_q.index -= 1;
   3383				else
   3384					/*
   3385					 * index is at 0 it just wrapped.
   3386					 * have it index last element in q
   3387					 */
   3388					vscsi->cmd_q.index = vscsi->cmd_q.mask;
   3389				break;
   3390			}
   3391		}
   3392
   3393		crq->valid = INVALIDATE_CMD_RESP_EL;
   3394
   3395		crq = vscsi->cmd_q.base_addr + vscsi->cmd_q.index;
   3396		valid = crq->valid;
   3397		dma_rmb();
   3398	}
   3399
   3400	if (!rc) {
   3401		if (ack) {
   3402			vio_enable_interrupts(vscsi->dma_dev);
   3403			ack = false;
   3404			dev_dbg(&vscsi->dev, "handle_crq, reenabling interrupts\n");
   3405		}
   3406		valid = crq->valid;
   3407		dma_rmb();
   3408		if (valid)
   3409			goto cmd_work;
   3410	} else {
   3411		dev_dbg(&vscsi->dev, "handle_crq, error: flags 0x%x, state 0x%hx, crq index 0x%x\n",
   3412			vscsi->flags, vscsi->state, vscsi->cmd_q.index);
   3413	}
   3414
   3415	dev_dbg(&vscsi->dev, "Leaving handle_crq: schedule_q empty %d, flags 0x%x, state 0x%hx\n",
   3416		(int)list_empty(&vscsi->schedule_q), vscsi->flags,
   3417		vscsi->state);
   3418
   3419	spin_unlock_bh(&vscsi->intr_lock);
   3420}
   3421
   3422static int ibmvscsis_probe(struct vio_dev *vdev,
   3423			   const struct vio_device_id *id)
   3424{
   3425	struct scsi_info *vscsi;
   3426	int rc = 0;
   3427	long hrc = 0;
   3428	char wq_name[24];
   3429
   3430	vscsi = kzalloc(sizeof(*vscsi), GFP_KERNEL);
   3431	if (!vscsi) {
   3432		rc = -ENOMEM;
   3433		dev_err(&vdev->dev, "probe: allocation of adapter failed\n");
   3434		return rc;
   3435	}
   3436
   3437	vscsi->dma_dev = vdev;
   3438	vscsi->dev = vdev->dev;
   3439	INIT_LIST_HEAD(&vscsi->schedule_q);
   3440	INIT_LIST_HEAD(&vscsi->waiting_rsp);
   3441	INIT_LIST_HEAD(&vscsi->active_q);
   3442
   3443	snprintf(vscsi->tport.tport_name, IBMVSCSIS_NAMELEN, "%s",
   3444		 dev_name(&vdev->dev));
   3445
   3446	dev_dbg(&vscsi->dev, "probe tport_name: %s\n", vscsi->tport.tport_name);
   3447
   3448	rc = read_dma_window(vscsi);
   3449	if (rc)
   3450		goto free_adapter;
   3451	dev_dbg(&vscsi->dev, "Probe: liobn 0x%x, riobn 0x%x\n",
   3452		vscsi->dds.window[LOCAL].liobn,
   3453		vscsi->dds.window[REMOTE].liobn);
   3454
   3455	snprintf(vscsi->eye, sizeof(vscsi->eye), "VSCSI %s", vdev->name);
   3456
   3457	vscsi->dds.unit_id = vdev->unit_address;
   3458	strscpy(vscsi->dds.partition_name, partition_name,
   3459		sizeof(vscsi->dds.partition_name));
   3460	vscsi->dds.partition_num = partition_number;
   3461
   3462	spin_lock_bh(&ibmvscsis_dev_lock);
   3463	list_add_tail(&vscsi->list, &ibmvscsis_dev_list);
   3464	spin_unlock_bh(&ibmvscsis_dev_lock);
   3465
   3466	/*
   3467	 * TBD: How do we determine # of cmds to request?  Do we know how
   3468	 * many "children" we have?
   3469	 */
   3470	vscsi->request_limit = INITIAL_SRP_LIMIT;
   3471	rc = srp_target_alloc(&vscsi->target, &vdev->dev, vscsi->request_limit,
   3472			      SRP_MAX_IU_LEN);
   3473	if (rc)
   3474		goto rem_list;
   3475
   3476	vscsi->target.ldata = vscsi;
   3477
   3478	rc = ibmvscsis_alloc_cmds(vscsi, vscsi->request_limit);
   3479	if (rc) {
   3480		dev_err(&vscsi->dev, "alloc_cmds failed, rc %d, num %d\n",
   3481			rc, vscsi->request_limit);
   3482		goto free_target;
   3483	}
   3484
   3485	/*
   3486	 * Note: the lock is used in freeing timers, so must initialize
   3487	 * first so that ordering in case of error is correct.
   3488	 */
   3489	spin_lock_init(&vscsi->intr_lock);
   3490
   3491	rc = ibmvscsis_alloctimer(vscsi);
   3492	if (rc) {
   3493		dev_err(&vscsi->dev, "probe: alloctimer failed, rc %d\n", rc);
   3494		goto free_cmds;
   3495	}
   3496
   3497	rc = ibmvscsis_create_command_q(vscsi, 256);
   3498	if (rc) {
   3499		dev_err(&vscsi->dev, "probe: create_command_q failed, rc %d\n",
   3500			rc);
   3501		goto free_timer;
   3502	}
   3503
   3504	vscsi->map_buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
   3505	if (!vscsi->map_buf) {
   3506		rc = -ENOMEM;
   3507		dev_err(&vscsi->dev, "probe: allocating cmd buffer failed\n");
   3508		goto destroy_queue;
   3509	}
   3510
   3511	vscsi->map_ioba = dma_map_single(&vdev->dev, vscsi->map_buf, PAGE_SIZE,
   3512					 DMA_BIDIRECTIONAL);
   3513	if (dma_mapping_error(&vdev->dev, vscsi->map_ioba)) {
   3514		rc = -ENOMEM;
   3515		dev_err(&vscsi->dev, "probe: error mapping command buffer\n");
   3516		goto free_buf;
   3517	}
   3518
   3519	hrc = h_vioctl(vscsi->dds.unit_id, H_GET_PARTNER_INFO,
   3520		       (u64)vscsi->map_ioba | ((u64)PAGE_SIZE << 32), 0, 0, 0,
   3521		       0);
   3522	if (hrc == H_SUCCESS)
   3523		vscsi->client_data.partition_number =
   3524			be64_to_cpu(*(u64 *)vscsi->map_buf);
   3525	/*
   3526	 * We expect the VIOCTL to fail if we're configured as "any
   3527	 * client can connect" and the client isn't activated yet.
   3528	 * We'll make the call again when he sends an init msg.
   3529	 */
   3530	dev_dbg(&vscsi->dev, "probe hrc %ld, client partition num %d\n",
   3531		hrc, vscsi->client_data.partition_number);
   3532
   3533	tasklet_init(&vscsi->work_task, ibmvscsis_handle_crq,
   3534		     (unsigned long)vscsi);
   3535
   3536	init_completion(&vscsi->wait_idle);
   3537	init_completion(&vscsi->unconfig);
   3538
   3539	snprintf(wq_name, 24, "ibmvscsis%s", dev_name(&vdev->dev));
   3540	vscsi->work_q = create_workqueue(wq_name);
   3541	if (!vscsi->work_q) {
   3542		rc = -ENOMEM;
   3543		dev_err(&vscsi->dev, "create_workqueue failed\n");
   3544		goto unmap_buf;
   3545	}
   3546
   3547	rc = request_irq(vdev->irq, ibmvscsis_interrupt, 0, "ibmvscsis", vscsi);
   3548	if (rc) {
   3549		rc = -EPERM;
   3550		dev_err(&vscsi->dev, "probe: request_irq failed, rc %d\n", rc);
   3551		goto destroy_WQ;
   3552	}
   3553
   3554	vscsi->state = WAIT_ENABLED;
   3555
   3556	dev_set_drvdata(&vdev->dev, vscsi);
   3557
   3558	return 0;
   3559
   3560destroy_WQ:
   3561	destroy_workqueue(vscsi->work_q);
   3562unmap_buf:
   3563	dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE,
   3564			 DMA_BIDIRECTIONAL);
   3565free_buf:
   3566	kfree(vscsi->map_buf);
   3567destroy_queue:
   3568	tasklet_kill(&vscsi->work_task);
   3569	ibmvscsis_unregister_command_q(vscsi);
   3570	ibmvscsis_destroy_command_q(vscsi);
   3571free_timer:
   3572	ibmvscsis_freetimer(vscsi);
   3573free_cmds:
   3574	ibmvscsis_free_cmds(vscsi);
   3575free_target:
   3576	srp_target_free(&vscsi->target);
   3577rem_list:
   3578	spin_lock_bh(&ibmvscsis_dev_lock);
   3579	list_del(&vscsi->list);
   3580	spin_unlock_bh(&ibmvscsis_dev_lock);
   3581free_adapter:
   3582	kfree(vscsi);
   3583
   3584	return rc;
   3585}
   3586
   3587static void ibmvscsis_remove(struct vio_dev *vdev)
   3588{
   3589	struct scsi_info *vscsi = dev_get_drvdata(&vdev->dev);
   3590
   3591	dev_dbg(&vscsi->dev, "remove (%s)\n", dev_name(&vscsi->dma_dev->dev));
   3592
   3593	spin_lock_bh(&vscsi->intr_lock);
   3594	ibmvscsis_post_disconnect(vscsi, UNCONFIGURING, 0);
   3595	vscsi->flags |= CFG_SLEEPING;
   3596	spin_unlock_bh(&vscsi->intr_lock);
   3597	wait_for_completion(&vscsi->unconfig);
   3598
   3599	vio_disable_interrupts(vdev);
   3600	free_irq(vdev->irq, vscsi);
   3601	destroy_workqueue(vscsi->work_q);
   3602	dma_unmap_single(&vdev->dev, vscsi->map_ioba, PAGE_SIZE,
   3603			 DMA_BIDIRECTIONAL);
   3604	kfree(vscsi->map_buf);
   3605	tasklet_kill(&vscsi->work_task);
   3606	ibmvscsis_destroy_command_q(vscsi);
   3607	ibmvscsis_freetimer(vscsi);
   3608	ibmvscsis_free_cmds(vscsi);
   3609	srp_target_free(&vscsi->target);
   3610	spin_lock_bh(&ibmvscsis_dev_lock);
   3611	list_del(&vscsi->list);
   3612	spin_unlock_bh(&ibmvscsis_dev_lock);
   3613	kfree(vscsi);
   3614}
   3615
   3616static ssize_t system_id_show(struct device *dev,
   3617			      struct device_attribute *attr, char *buf)
   3618{
   3619	return snprintf(buf, PAGE_SIZE, "%s\n", system_id);
   3620}
   3621
   3622static ssize_t partition_number_show(struct device *dev,
   3623				     struct device_attribute *attr, char *buf)
   3624{
   3625	return snprintf(buf, PAGE_SIZE, "%x\n", partition_number);
   3626}
   3627
   3628static ssize_t unit_address_show(struct device *dev,
   3629				 struct device_attribute *attr, char *buf)
   3630{
   3631	struct scsi_info *vscsi = container_of(dev, struct scsi_info, dev);
   3632
   3633	return snprintf(buf, PAGE_SIZE, "%x\n", vscsi->dma_dev->unit_address);
   3634}
   3635
   3636static int ibmvscsis_get_system_info(void)
   3637{
   3638	struct device_node *rootdn, *vdevdn;
   3639	const char *id, *model, *name;
   3640	const uint *num;
   3641
   3642	rootdn = of_find_node_by_path("/");
   3643	if (!rootdn)
   3644		return -ENOENT;
   3645
   3646	model = of_get_property(rootdn, "model", NULL);
   3647	id = of_get_property(rootdn, "system-id", NULL);
   3648	if (model && id)
   3649		snprintf(system_id, sizeof(system_id), "%s-%s", model, id);
   3650
   3651	name = of_get_property(rootdn, "ibm,partition-name", NULL);
   3652	if (name)
   3653		strncpy(partition_name, name, sizeof(partition_name));
   3654
   3655	num = of_get_property(rootdn, "ibm,partition-no", NULL);
   3656	if (num)
   3657		partition_number = of_read_number(num, 1);
   3658
   3659	of_node_put(rootdn);
   3660
   3661	vdevdn = of_find_node_by_path("/vdevice");
   3662	if (vdevdn) {
   3663		const uint *mvds;
   3664
   3665		mvds = of_get_property(vdevdn, "ibm,max-virtual-dma-size",
   3666				       NULL);
   3667		if (mvds)
   3668			max_vdma_size = *mvds;
   3669		of_node_put(vdevdn);
   3670	}
   3671
   3672	return 0;
   3673}
   3674
   3675static char *ibmvscsis_get_fabric_wwn(struct se_portal_group *se_tpg)
   3676{
   3677	struct ibmvscsis_tport *tport =
   3678		container_of(se_tpg, struct ibmvscsis_tport, se_tpg);
   3679
   3680	return tport->tport_name;
   3681}
   3682
   3683static u16 ibmvscsis_get_tag(struct se_portal_group *se_tpg)
   3684{
   3685	struct ibmvscsis_tport *tport =
   3686		container_of(se_tpg, struct ibmvscsis_tport, se_tpg);
   3687
   3688	return tport->tport_tpgt;
   3689}
   3690
   3691static u32 ibmvscsis_get_default_depth(struct se_portal_group *se_tpg)
   3692{
   3693	return 1;
   3694}
   3695
   3696static int ibmvscsis_check_true(struct se_portal_group *se_tpg)
   3697{
   3698	return 1;
   3699}
   3700
   3701static int ibmvscsis_check_false(struct se_portal_group *se_tpg)
   3702{
   3703	return 0;
   3704}
   3705
   3706static u32 ibmvscsis_tpg_get_inst_index(struct se_portal_group *se_tpg)
   3707{
   3708	return 1;
   3709}
   3710
   3711static int ibmvscsis_check_stop_free(struct se_cmd *se_cmd)
   3712{
   3713	return target_put_sess_cmd(se_cmd);
   3714}
   3715
   3716static void ibmvscsis_release_cmd(struct se_cmd *se_cmd)
   3717{
   3718	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3719						 se_cmd);
   3720	struct scsi_info *vscsi = cmd->adapter;
   3721
   3722	spin_lock_bh(&vscsi->intr_lock);
   3723	/* Remove from active_q */
   3724	list_move_tail(&cmd->list, &vscsi->waiting_rsp);
   3725	ibmvscsis_send_messages(vscsi);
   3726	spin_unlock_bh(&vscsi->intr_lock);
   3727}
   3728
   3729static u32 ibmvscsis_sess_get_index(struct se_session *se_sess)
   3730{
   3731	return 0;
   3732}
   3733
   3734static int ibmvscsis_write_pending(struct se_cmd *se_cmd)
   3735{
   3736	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3737						 se_cmd);
   3738	struct scsi_info *vscsi = cmd->adapter;
   3739	struct iu_entry *iue = cmd->iue;
   3740	int rc;
   3741
   3742	/*
   3743	 * If CLIENT_FAILED OR RESPONSE_Q_DOWN, then just return success
   3744	 * since LIO can't do anything about it, and we dont want to
   3745	 * attempt an srp_transfer_data.
   3746	 */
   3747	if ((vscsi->flags & (CLIENT_FAILED | RESPONSE_Q_DOWN))) {
   3748		dev_err(&vscsi->dev, "write_pending failed since: %d\n",
   3749			vscsi->flags);
   3750		return -EIO;
   3751
   3752	}
   3753
   3754	rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma,
   3755			       1, 1);
   3756	if (rc) {
   3757		dev_err(&vscsi->dev, "srp_transfer_data() failed: %d\n", rc);
   3758		return -EIO;
   3759	}
   3760	/*
   3761	 * We now tell TCM to add this WRITE CDB directly into the TCM storage
   3762	 * object execution queue.
   3763	 */
   3764	target_execute_cmd(se_cmd);
   3765	return 0;
   3766}
   3767
   3768static void ibmvscsis_set_default_node_attrs(struct se_node_acl *nacl)
   3769{
   3770}
   3771
   3772static int ibmvscsis_get_cmd_state(struct se_cmd *se_cmd)
   3773{
   3774	return 0;
   3775}
   3776
   3777static int ibmvscsis_queue_data_in(struct se_cmd *se_cmd)
   3778{
   3779	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3780						 se_cmd);
   3781	struct iu_entry *iue = cmd->iue;
   3782	struct scsi_info *vscsi = cmd->adapter;
   3783	uint len = 0;
   3784	int rc;
   3785
   3786	rc = srp_transfer_data(cmd, &vio_iu(iue)->srp.cmd, ibmvscsis_rdma, 1,
   3787			       1);
   3788	if (rc) {
   3789		dev_err(&vscsi->dev, "srp_transfer_data failed: %d\n", rc);
   3790		se_cmd->scsi_sense_length = 18;
   3791		memset(se_cmd->sense_buffer, 0, se_cmd->scsi_sense_length);
   3792		/* Logical Unit Communication Time-out asc/ascq = 0x0801 */
   3793		scsi_build_sense_buffer(0, se_cmd->sense_buffer, MEDIUM_ERROR,
   3794					0x08, 0x01);
   3795	}
   3796
   3797	srp_build_response(vscsi, cmd, &len);
   3798	cmd->rsp.format = SRP_FORMAT;
   3799	cmd->rsp.len = len;
   3800
   3801	return 0;
   3802}
   3803
   3804static int ibmvscsis_queue_status(struct se_cmd *se_cmd)
   3805{
   3806	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3807						 se_cmd);
   3808	struct scsi_info *vscsi = cmd->adapter;
   3809	uint len;
   3810
   3811	dev_dbg(&vscsi->dev, "queue_status %p\n", se_cmd);
   3812
   3813	srp_build_response(vscsi, cmd, &len);
   3814	cmd->rsp.format = SRP_FORMAT;
   3815	cmd->rsp.len = len;
   3816
   3817	return 0;
   3818}
   3819
   3820static void ibmvscsis_queue_tm_rsp(struct se_cmd *se_cmd)
   3821{
   3822	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3823						 se_cmd);
   3824	struct scsi_info *vscsi = cmd->adapter;
   3825	struct ibmvscsis_cmd *cmd_itr;
   3826	struct iu_entry *iue = iue = cmd->iue;
   3827	struct srp_tsk_mgmt *srp_tsk = &vio_iu(iue)->srp.tsk_mgmt;
   3828	u64 tag_to_abort = be64_to_cpu(srp_tsk->task_tag);
   3829	uint len;
   3830
   3831	dev_dbg(&vscsi->dev, "queue_tm_rsp %p, status %d\n",
   3832		se_cmd, (int)se_cmd->se_tmr_req->response);
   3833
   3834	if (srp_tsk->tsk_mgmt_func == SRP_TSK_ABORT_TASK &&
   3835	    cmd->se_cmd.se_tmr_req->response == TMR_TASK_DOES_NOT_EXIST) {
   3836		spin_lock_bh(&vscsi->intr_lock);
   3837		list_for_each_entry(cmd_itr, &vscsi->active_q, list) {
   3838			if (tag_to_abort == cmd_itr->se_cmd.tag) {
   3839				cmd_itr->abort_cmd = cmd;
   3840				cmd->flags |= DELAY_SEND;
   3841				break;
   3842			}
   3843		}
   3844		spin_unlock_bh(&vscsi->intr_lock);
   3845	}
   3846
   3847	srp_build_response(vscsi, cmd, &len);
   3848	cmd->rsp.format = SRP_FORMAT;
   3849	cmd->rsp.len = len;
   3850}
   3851
   3852static void ibmvscsis_aborted_task(struct se_cmd *se_cmd)
   3853{
   3854	struct ibmvscsis_cmd *cmd = container_of(se_cmd, struct ibmvscsis_cmd,
   3855						 se_cmd);
   3856	struct scsi_info *vscsi = cmd->adapter;
   3857
   3858	dev_dbg(&vscsi->dev, "ibmvscsis_aborted_task %p task_tag: %llu\n",
   3859		se_cmd, se_cmd->tag);
   3860}
   3861
   3862static struct se_wwn *ibmvscsis_make_tport(struct target_fabric_configfs *tf,
   3863					   struct config_group *group,
   3864					   const char *name)
   3865{
   3866	struct ibmvscsis_tport *tport;
   3867	struct scsi_info *vscsi;
   3868
   3869	tport = ibmvscsis_lookup_port(name);
   3870	if (tport) {
   3871		vscsi = container_of(tport, struct scsi_info, tport);
   3872		tport->tport_proto_id = SCSI_PROTOCOL_SRP;
   3873		dev_dbg(&vscsi->dev, "make_tport(%s), pointer:%p, tport_id:%x\n",
   3874			name, tport, tport->tport_proto_id);
   3875		return &tport->tport_wwn;
   3876	}
   3877
   3878	return ERR_PTR(-EINVAL);
   3879}
   3880
   3881static void ibmvscsis_drop_tport(struct se_wwn *wwn)
   3882{
   3883	struct ibmvscsis_tport *tport = container_of(wwn,
   3884						     struct ibmvscsis_tport,
   3885						     tport_wwn);
   3886	struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport);
   3887
   3888	dev_dbg(&vscsi->dev, "drop_tport(%s)\n",
   3889		config_item_name(&tport->tport_wwn.wwn_group.cg_item));
   3890}
   3891
   3892static struct se_portal_group *ibmvscsis_make_tpg(struct se_wwn *wwn,
   3893						  const char *name)
   3894{
   3895	struct ibmvscsis_tport *tport =
   3896		container_of(wwn, struct ibmvscsis_tport, tport_wwn);
   3897	u16 tpgt;
   3898	int rc;
   3899
   3900	if (strstr(name, "tpgt_") != name)
   3901		return ERR_PTR(-EINVAL);
   3902	rc = kstrtou16(name + 5, 0, &tpgt);
   3903	if (rc)
   3904		return ERR_PTR(rc);
   3905	tport->tport_tpgt = tpgt;
   3906
   3907	tport->releasing = false;
   3908
   3909	rc = core_tpg_register(&tport->tport_wwn, &tport->se_tpg,
   3910			       tport->tport_proto_id);
   3911	if (rc)
   3912		return ERR_PTR(rc);
   3913
   3914	return &tport->se_tpg;
   3915}
   3916
   3917static void ibmvscsis_drop_tpg(struct se_portal_group *se_tpg)
   3918{
   3919	struct ibmvscsis_tport *tport = container_of(se_tpg,
   3920						     struct ibmvscsis_tport,
   3921						     se_tpg);
   3922
   3923	tport->releasing = true;
   3924	tport->enabled = false;
   3925
   3926	/*
   3927	 * Release the virtual I_T Nexus for this ibmvscsis TPG
   3928	 */
   3929	ibmvscsis_drop_nexus(tport);
   3930	/*
   3931	 * Deregister the se_tpg from TCM..
   3932	 */
   3933	core_tpg_deregister(se_tpg);
   3934}
   3935
   3936static ssize_t ibmvscsis_wwn_version_show(struct config_item *item,
   3937					  char *page)
   3938{
   3939	return scnprintf(page, PAGE_SIZE, "%s\n", IBMVSCSIS_VERSION);
   3940}
   3941CONFIGFS_ATTR_RO(ibmvscsis_wwn_, version);
   3942
   3943static struct configfs_attribute *ibmvscsis_wwn_attrs[] = {
   3944	&ibmvscsis_wwn_attr_version,
   3945	NULL,
   3946};
   3947
   3948
   3949static int ibmvscsis_enable_tpg(struct se_portal_group *se_tpg, bool enable)
   3950{
   3951	struct ibmvscsis_tport *tport = container_of(se_tpg,
   3952						     struct ibmvscsis_tport,
   3953						     se_tpg);
   3954	struct scsi_info *vscsi = container_of(tport, struct scsi_info, tport);
   3955	long lrc;
   3956
   3957	if (enable) {
   3958		spin_lock_bh(&vscsi->intr_lock);
   3959		tport->enabled = true;
   3960		lrc = ibmvscsis_enable_change_state(vscsi);
   3961		if (lrc)
   3962			dev_err(&vscsi->dev, "enable_change_state failed, rc %ld state %d\n",
   3963				lrc, vscsi->state);
   3964		spin_unlock_bh(&vscsi->intr_lock);
   3965	} else {
   3966		spin_lock_bh(&vscsi->intr_lock);
   3967		tport->enabled = false;
   3968		/* This simulates the server going down */
   3969		ibmvscsis_post_disconnect(vscsi, ERR_DISCONNECT, 0);
   3970		spin_unlock_bh(&vscsi->intr_lock);
   3971	}
   3972
   3973	return 0;
   3974}
   3975
   3976static const struct target_core_fabric_ops ibmvscsis_ops = {
   3977	.module				= THIS_MODULE,
   3978	.fabric_name			= "ibmvscsis",
   3979	.max_data_sg_nents		= MAX_TXU / PAGE_SIZE,
   3980	.tpg_get_wwn			= ibmvscsis_get_fabric_wwn,
   3981	.tpg_get_tag			= ibmvscsis_get_tag,
   3982	.tpg_get_default_depth		= ibmvscsis_get_default_depth,
   3983	.tpg_check_demo_mode		= ibmvscsis_check_true,
   3984	.tpg_check_demo_mode_cache	= ibmvscsis_check_true,
   3985	.tpg_check_demo_mode_write_protect = ibmvscsis_check_false,
   3986	.tpg_check_prod_mode_write_protect = ibmvscsis_check_false,
   3987	.tpg_get_inst_index		= ibmvscsis_tpg_get_inst_index,
   3988	.check_stop_free		= ibmvscsis_check_stop_free,
   3989	.release_cmd			= ibmvscsis_release_cmd,
   3990	.sess_get_index			= ibmvscsis_sess_get_index,
   3991	.write_pending			= ibmvscsis_write_pending,
   3992	.set_default_node_attributes	= ibmvscsis_set_default_node_attrs,
   3993	.get_cmd_state			= ibmvscsis_get_cmd_state,
   3994	.queue_data_in			= ibmvscsis_queue_data_in,
   3995	.queue_status			= ibmvscsis_queue_status,
   3996	.queue_tm_rsp			= ibmvscsis_queue_tm_rsp,
   3997	.aborted_task			= ibmvscsis_aborted_task,
   3998	/*
   3999	 * Setup function pointers for logic in target_core_fabric_configfs.c
   4000	 */
   4001	.fabric_make_wwn		= ibmvscsis_make_tport,
   4002	.fabric_drop_wwn		= ibmvscsis_drop_tport,
   4003	.fabric_make_tpg		= ibmvscsis_make_tpg,
   4004	.fabric_enable_tpg		= ibmvscsis_enable_tpg,
   4005	.fabric_drop_tpg		= ibmvscsis_drop_tpg,
   4006
   4007	.tfc_wwn_attrs			= ibmvscsis_wwn_attrs,
   4008};
   4009
   4010static void ibmvscsis_dev_release(struct device *dev) {};
   4011
   4012static struct device_attribute dev_attr_system_id =
   4013	__ATTR(system_id, S_IRUGO, system_id_show, NULL);
   4014
   4015static struct device_attribute dev_attr_partition_number =
   4016	__ATTR(partition_number, S_IRUGO, partition_number_show, NULL);
   4017
   4018static struct device_attribute dev_attr_unit_address =
   4019	__ATTR(unit_address, S_IRUGO, unit_address_show, NULL);
   4020
   4021static struct attribute *ibmvscsis_dev_attrs[] = {
   4022	&dev_attr_system_id.attr,
   4023	&dev_attr_partition_number.attr,
   4024	&dev_attr_unit_address.attr,
   4025};
   4026ATTRIBUTE_GROUPS(ibmvscsis_dev);
   4027
   4028static struct class ibmvscsis_class = {
   4029	.name		= "ibmvscsis",
   4030	.dev_release	= ibmvscsis_dev_release,
   4031	.dev_groups	= ibmvscsis_dev_groups,
   4032};
   4033
   4034static const struct vio_device_id ibmvscsis_device_table[] = {
   4035	{ "v-scsi-host", "IBM,v-scsi-host" },
   4036	{ "", "" }
   4037};
   4038MODULE_DEVICE_TABLE(vio, ibmvscsis_device_table);
   4039
   4040static struct vio_driver ibmvscsis_driver = {
   4041	.name = "ibmvscsis",
   4042	.id_table = ibmvscsis_device_table,
   4043	.probe = ibmvscsis_probe,
   4044	.remove = ibmvscsis_remove,
   4045};
   4046
   4047/*
   4048 * ibmvscsis_init() - Kernel Module initialization
   4049 *
   4050 * Note: vio_register_driver() registers callback functions, and at least one
   4051 * of those callback functions calls TCM - Linux IO Target Subsystem, thus
   4052 * the SCSI Target template must be registered before vio_register_driver()
   4053 * is called.
   4054 */
   4055static int __init ibmvscsis_init(void)
   4056{
   4057	int rc = 0;
   4058
   4059	rc = ibmvscsis_get_system_info();
   4060	if (rc) {
   4061		pr_err("rc %d from get_system_info\n", rc);
   4062		goto out;
   4063	}
   4064
   4065	rc = class_register(&ibmvscsis_class);
   4066	if (rc) {
   4067		pr_err("failed class register\n");
   4068		goto out;
   4069	}
   4070
   4071	rc = target_register_template(&ibmvscsis_ops);
   4072	if (rc) {
   4073		pr_err("rc %d from target_register_template\n", rc);
   4074		goto unregister_class;
   4075	}
   4076
   4077	rc = vio_register_driver(&ibmvscsis_driver);
   4078	if (rc) {
   4079		pr_err("rc %d from vio_register_driver\n", rc);
   4080		goto unregister_target;
   4081	}
   4082
   4083	return 0;
   4084
   4085unregister_target:
   4086	target_unregister_template(&ibmvscsis_ops);
   4087unregister_class:
   4088	class_unregister(&ibmvscsis_class);
   4089out:
   4090	return rc;
   4091}
   4092
   4093static void __exit ibmvscsis_exit(void)
   4094{
   4095	pr_info("Unregister IBM virtual SCSI host driver\n");
   4096	vio_unregister_driver(&ibmvscsis_driver);
   4097	target_unregister_template(&ibmvscsis_ops);
   4098	class_unregister(&ibmvscsis_class);
   4099}
   4100
   4101MODULE_DESCRIPTION("IBMVSCSIS fabric driver");
   4102MODULE_AUTHOR("Bryant G. Ly and Michael Cyr");
   4103MODULE_LICENSE("GPL");
   4104MODULE_VERSION(IBMVSCSIS_VERSION);
   4105module_init(ibmvscsis_init);
   4106module_exit(ibmvscsis_exit);