ib_srp.c 57.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
/*
 * Copyright (c) 2005 Cisco Systems.  All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/err.h>
#include <linux/string.h>
#include <linux/parser.h>
#include <linux/random.h>
40
#include <linux/jiffies.h>
41 42 43 44 45 46 47

#include <asm/atomic.h>

#include <scsi/scsi.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_dbg.h>
#include <scsi/srp.h>
48
#include <scsi/scsi_transport_srp.h>
49 50 51 52 53 54 55 56 57 58 59 60 61

#include "ib_srp.h"

#define DRV_NAME	"ib_srp"
#define PFX		DRV_NAME ": "
#define DRV_VERSION	"0.2"
#define DRV_RELDATE	"November 1, 2005"

MODULE_AUTHOR("Roland Dreier");
MODULE_DESCRIPTION("InfiniBand SCSI RDMA Protocol initiator "
		   "v" DRV_VERSION " (" DRV_RELDATE ")");
MODULE_LICENSE("Dual BSD/GPL");

62 63 64 65 66
static int srp_sg_tablesize = SRP_DEF_SG_TABLESIZE;
static int srp_max_iu_len;

module_param(srp_sg_tablesize, int, 0444);
MODULE_PARM_DESC(srp_sg_tablesize,
67
		 "Max number of gather/scatter entries per I/O (default is 12, max 255)");
68

69 70 71 72 73 74 75 76
static int topspin_workarounds = 1;

module_param(topspin_workarounds, int, 0444);
MODULE_PARM_DESC(topspin_workarounds,
		 "Enable workarounds for Topspin/Cisco SRP target bugs if != 0");

static void srp_add_one(struct ib_device *device);
static void srp_remove_one(struct ib_device *device);
77 78
static void srp_recv_completion(struct ib_cq *cq, void *target_ptr);
static void srp_send_completion(struct ib_cq *cq, void *target_ptr);
79 80
static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event);

81 82
static struct scsi_transport_template *ib_srp_transport_template;

83 84 85 86 87 88
static struct ib_client srp_client = {
	.name   = "srp",
	.add    = srp_add_one,
	.remove = srp_remove_one
};

89 90
static struct ib_sa_client srp_sa_client;

91 92 93 94 95 96 97 98 99 100
static inline struct srp_target_port *host_to_target(struct Scsi_Host *host)
{
	return (struct srp_target_port *) host->hostdata;
}

static const char *srp_target_info(struct Scsi_Host *host)
{
	return host_to_target(host)->target_name;
}

101 102 103
static int srp_target_is_topspin(struct srp_target_port *target)
{
	static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };
104
	static const u8 cisco_oui[3]   = { 0x00, 0x1b, 0x0d };
105 106

	return topspin_workarounds &&
107 108
		(!memcmp(&target->ioc_guid, topspin_oui, sizeof topspin_oui) ||
		 !memcmp(&target->ioc_guid, cisco_oui, sizeof cisco_oui));
109 110
}

111 112 113 114 115 116 117 118 119 120 121 122 123 124
static struct srp_iu *srp_alloc_iu(struct srp_host *host, size_t size,
				   gfp_t gfp_mask,
				   enum dma_data_direction direction)
{
	struct srp_iu *iu;

	iu = kmalloc(sizeof *iu, gfp_mask);
	if (!iu)
		goto out;

	iu->buf = kzalloc(size, gfp_mask);
	if (!iu->buf)
		goto out_free_iu;

125 126 127
	iu->dma = ib_dma_map_single(host->srp_dev->dev, iu->buf, size,
				    direction);
	if (ib_dma_mapping_error(host->srp_dev->dev, iu->dma))
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
		goto out_free_buf;

	iu->size      = size;
	iu->direction = direction;

	return iu;

out_free_buf:
	kfree(iu->buf);
out_free_iu:
	kfree(iu);
out:
	return NULL;
}

static void srp_free_iu(struct srp_host *host, struct srp_iu *iu)
{
	if (!iu)
		return;

148 149
	ib_dma_unmap_single(host->srp_dev->dev, iu->dma, iu->size,
			    iu->direction);
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
	kfree(iu->buf);
	kfree(iu);
}

static void srp_qp_event(struct ib_event *event, void *context)
{
	printk(KERN_ERR PFX "QP event %d\n", event->event);
}

static int srp_init_qp(struct srp_target_port *target,
		       struct ib_qp *qp)
{
	struct ib_qp_attr *attr;
	int ret;

	attr = kmalloc(sizeof *attr, GFP_KERNEL);
	if (!attr)
		return -ENOMEM;

169 170 171 172
	ret = ib_find_pkey(target->srp_host->srp_dev->dev,
			   target->srp_host->port,
			   be16_to_cpu(target->path.pkey),
			   &attr->pkey_index);
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
	if (ret)
		goto out;

	attr->qp_state        = IB_QPS_INIT;
	attr->qp_access_flags = (IB_ACCESS_REMOTE_READ |
				    IB_ACCESS_REMOTE_WRITE);
	attr->port_num        = target->srp_host->port;

	ret = ib_modify_qp(qp, attr,
			   IB_QP_STATE		|
			   IB_QP_PKEY_INDEX	|
			   IB_QP_ACCESS_FLAGS	|
			   IB_QP_PORT);

out:
	kfree(attr);
	return ret;
}

D
David Dillow 已提交
192 193 194 195
static int srp_new_cm_id(struct srp_target_port *target)
{
	struct ib_cm_id *new_cm_id;

196
	new_cm_id = ib_create_cm_id(target->srp_host->srp_dev->dev,
D
David Dillow 已提交
197 198 199 200 201 202 203 204 205 206 207
				    srp_cm_handler, target);
	if (IS_ERR(new_cm_id))
		return PTR_ERR(new_cm_id);

	if (target->cm_id)
		ib_destroy_cm_id(target->cm_id);
	target->cm_id = new_cm_id;

	return 0;
}

208 209 210 211 212 213 214 215 216
static int srp_create_target_ib(struct srp_target_port *target)
{
	struct ib_qp_init_attr *init_attr;
	int ret;

	init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL);
	if (!init_attr)
		return -ENOMEM;

217 218 219 220
	target->recv_cq = ib_create_cq(target->srp_host->srp_dev->dev,
				       srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0);
	if (IS_ERR(target->recv_cq)) {
		ret = PTR_ERR(target->recv_cq);
221
		goto err;
222 223
	}

224 225 226 227
	target->send_cq = ib_create_cq(target->srp_host->srp_dev->dev,
				       srp_send_completion, NULL, target, SRP_SQ_SIZE, 0);
	if (IS_ERR(target->send_cq)) {
		ret = PTR_ERR(target->send_cq);
228
		goto err_recv_cq;
229 230 231
	}

	ib_req_notify_cq(target->recv_cq, IB_CQ_NEXT_COMP);
232 233 234 235 236 237 238 239

	init_attr->event_handler       = srp_qp_event;
	init_attr->cap.max_send_wr     = SRP_SQ_SIZE;
	init_attr->cap.max_recv_wr     = SRP_RQ_SIZE;
	init_attr->cap.max_recv_sge    = 1;
	init_attr->cap.max_send_sge    = 1;
	init_attr->sq_sig_type         = IB_SIGNAL_ALL_WR;
	init_attr->qp_type             = IB_QPT_RC;
240 241
	init_attr->send_cq             = target->send_cq;
	init_attr->recv_cq             = target->recv_cq;
242

243
	target->qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr);
244 245
	if (IS_ERR(target->qp)) {
		ret = PTR_ERR(target->qp);
246
		goto err_send_cq;
247 248 249
	}

	ret = srp_init_qp(target, target->qp);
250 251
	if (ret)
		goto err_qp;
252

253 254 255 256 257 258 259 260 261 262 263 264 265
	kfree(init_attr);
	return 0;

err_qp:
	ib_destroy_qp(target->qp);

err_send_cq:
	ib_destroy_cq(target->send_cq);

err_recv_cq:
	ib_destroy_cq(target->recv_cq);

err:
266 267 268 269 270 271 272 273 274
	kfree(init_attr);
	return ret;
}

static void srp_free_target_ib(struct srp_target_port *target)
{
	int i;

	ib_destroy_qp(target->qp);
275 276
	ib_destroy_cq(target->send_cq);
	ib_destroy_cq(target->recv_cq);
277 278 279

	for (i = 0; i < SRP_RQ_SIZE; ++i)
		srp_free_iu(target->srp_host, target->rx_ring[i]);
280
	for (i = 0; i < SRP_SQ_SIZE; ++i)
281 282 283 284 285 286 287 288 289 290 291
		srp_free_iu(target->srp_host, target->tx_ring[i]);
}

static void srp_path_rec_completion(int status,
				    struct ib_sa_path_rec *pathrec,
				    void *target_ptr)
{
	struct srp_target_port *target = target_ptr;

	target->status = status;
	if (status)
292 293
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "Got failed path rec status %d\n", status);
294 295 296 297 298 299 300 301 302 303 304
	else
		target->path = *pathrec;
	complete(&target->done);
}

static int srp_lookup_path(struct srp_target_port *target)
{
	target->path.numb_path = 1;

	init_completion(&target->done);

305
	target->path_query_id = ib_sa_path_rec_get(&srp_sa_client,
306
						   target->srp_host->srp_dev->dev,
307 308
						   target->srp_host->port,
						   &target->path,
309
						   IB_SA_PATH_REC_SERVICE_ID	|
310 311 312 313 314 315 316 317 318 319 320 321 322 323
						   IB_SA_PATH_REC_DGID		|
						   IB_SA_PATH_REC_SGID		|
						   IB_SA_PATH_REC_NUMB_PATH	|
						   IB_SA_PATH_REC_PKEY,
						   SRP_PATH_REC_TIMEOUT_MS,
						   GFP_KERNEL,
						   srp_path_rec_completion,
						   target, &target->path_query);
	if (target->path_query_id < 0)
		return target->path_query_id;

	wait_for_completion(&target->done);

	if (target->status < 0)
324 325
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "Path record query failed\n");
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366

	return target->status;
}

static int srp_send_req(struct srp_target_port *target)
{
	struct {
		struct ib_cm_req_param param;
		struct srp_login_req   priv;
	} *req = NULL;
	int status;

	req = kzalloc(sizeof *req, GFP_KERNEL);
	if (!req)
		return -ENOMEM;

	req->param.primary_path 	      = &target->path;
	req->param.alternate_path 	      = NULL;
	req->param.service_id 		      = target->service_id;
	req->param.qp_num 		      = target->qp->qp_num;
	req->param.qp_type 		      = target->qp->qp_type;
	req->param.private_data 	      = &req->priv;
	req->param.private_data_len 	      = sizeof req->priv;
	req->param.flow_control 	      = 1;

	get_random_bytes(&req->param.starting_psn, 4);
	req->param.starting_psn 	     &= 0xffffff;

	/*
	 * Pick some arbitrary defaults here; we could make these
	 * module parameters if anyone cared about setting them.
	 */
	req->param.responder_resources	      = 4;
	req->param.remote_cm_response_timeout = 20;
	req->param.local_cm_response_timeout  = 20;
	req->param.retry_count 		      = 7;
	req->param.rnr_retry_count 	      = 7;
	req->param.max_cm_retries 	      = 15;

	req->priv.opcode     	= SRP_LOGIN_REQ;
	req->priv.tag        	= 0;
367
	req->priv.req_it_iu_len = cpu_to_be32(srp_max_iu_len);
368 369
	req->priv.req_buf_fmt 	= cpu_to_be16(SRP_BUF_FORMAT_DIRECT |
					      SRP_BUF_FORMAT_INDIRECT);
370
	/*
R
Roland Dreier 已提交
371
	 * In the published SRP specification (draft rev. 16a), the
372 373 374 375 376 377 378 379 380
	 * port identifier format is 8 bytes of ID extension followed
	 * by 8 bytes of GUID.  Older drafts put the two halves in the
	 * opposite order, so that the GUID comes first.
	 *
	 * Targets conforming to these obsolete drafts can be
	 * recognized by the I/O Class they report.
	 */
	if (target->io_class == SRP_REV10_IB_IO_CLASS) {
		memcpy(req->priv.initiator_port_id,
381
		       &target->path.sgid.global.interface_id, 8);
382
		memcpy(req->priv.initiator_port_id + 8,
383
		       &target->initiator_ext, 8);
384 385 386 387
		memcpy(req->priv.target_port_id,     &target->ioc_guid, 8);
		memcpy(req->priv.target_port_id + 8, &target->id_ext, 8);
	} else {
		memcpy(req->priv.initiator_port_id,
388 389 390
		       &target->initiator_ext, 8);
		memcpy(req->priv.initiator_port_id + 8,
		       &target->path.sgid.global.interface_id, 8);
391 392 393 394
		memcpy(req->priv.target_port_id,     &target->id_ext, 8);
		memcpy(req->priv.target_port_id + 8, &target->ioc_guid, 8);
	}

395 396
	/*
	 * Topspin/Cisco SRP targets will reject our login unless we
397 398
	 * zero out the first 8 bytes of our initiator port ID and set
	 * the second 8 bytes to the local node GUID.
399
	 */
400
	if (srp_target_is_topspin(target)) {
401 402 403 404
		shost_printk(KERN_DEBUG, target->scsi_host,
			     PFX "Topspin/Cisco initiator port ID workaround "
			     "activated for target GUID %016llx\n",
			     (unsigned long long) be64_to_cpu(target->ioc_guid));
405
		memset(req->priv.initiator_port_id, 0, 8);
406
		memcpy(req->priv.initiator_port_id + 8,
407
		       &target->srp_host->srp_dev->dev->node_guid, 8);
408 409 410 411 412 413 414 415 416 417 418 419 420 421
	}

	status = ib_send_cm_req(target->cm_id, &req->param);

	kfree(req);

	return status;
}

static void srp_disconnect_target(struct srp_target_port *target)
{
	/* XXX should send SRP_I_LOGOUT request */

	init_completion(&target->done);
422
	if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {
423 424
		shost_printk(KERN_DEBUG, target->scsi_host,
			     PFX "Sending CM DREQ failed\n");
425 426
		return;
	}
427 428 429
	wait_for_completion(&target->done);
}

430 431 432 433 434 435
static bool srp_change_state(struct srp_target_port *target,
			    enum srp_target_state old,
			    enum srp_target_state new)
{
	bool changed = false;

436
	spin_lock_irq(&target->lock);
437 438 439 440
	if (target->state == old) {
		target->state = new;
		changed = true;
	}
441
	spin_unlock_irq(&target->lock);
442 443 444
	return changed;
}

D
David Howells 已提交
445
static void srp_remove_work(struct work_struct *work)
446
{
D
David Howells 已提交
447 448
	struct srp_target_port *target =
		container_of(work, struct srp_target_port, work);
449

450
	if (!srp_change_state(target, SRP_TARGET_DEAD, SRP_TARGET_REMOVED))
451 452
		return;

453
	spin_lock(&target->srp_host->target_lock);
454
	list_del(&target->list);
455
	spin_unlock(&target->srp_host->target_lock);
456

457
	srp_remove_host(target->scsi_host);
458 459 460 461 462 463 464 465
	scsi_remove_host(target->scsi_host);
	ib_destroy_cm_id(target->cm_id);
	srp_free_target_ib(target);
	scsi_host_put(target->scsi_host);
}

static int srp_connect_target(struct srp_target_port *target)
{
D
David Dillow 已提交
466
	int retries = 3;
467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498
	int ret;

	ret = srp_lookup_path(target);
	if (ret)
		return ret;

	while (1) {
		init_completion(&target->done);
		ret = srp_send_req(target);
		if (ret)
			return ret;
		wait_for_completion(&target->done);

		/*
		 * The CM event handling code will set status to
		 * SRP_PORT_REDIRECT if we get a port redirect REJ
		 * back, or SRP_DLID_REDIRECT if we get a lid/qp
		 * redirect REJ back.
		 */
		switch (target->status) {
		case 0:
			return 0;

		case SRP_PORT_REDIRECT:
			ret = srp_lookup_path(target);
			if (ret)
				return ret;
			break;

		case SRP_DLID_REDIRECT:
			break;

D
David Dillow 已提交
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
		case SRP_STALE_CONN:
			/* Our current CM id was stale, and is now in timewait.
			 * Try to reconnect with a new one.
			 */
			if (!retries-- || srp_new_cm_id(target)) {
				shost_printk(KERN_ERR, target->scsi_host, PFX
					     "giving up on stale connection\n");
				target->status = -ECONNRESET;
				return target->status;
			}

			shost_printk(KERN_ERR, target->scsi_host, PFX
				     "retrying stale connection\n");
			break;

514 515 516 517 518 519
		default:
			return target->status;
		}
	}
}

520 521 522 523
static void srp_unmap_data(struct scsi_cmnd *scmnd,
			   struct srp_target_port *target,
			   struct srp_request *req)
{
524
	if (!scsi_sglist(scmnd) ||
525 526 527 528
	    (scmnd->sc_data_direction != DMA_TO_DEVICE &&
	     scmnd->sc_data_direction != DMA_FROM_DEVICE))
		return;

529 530 531 532 533
	if (req->fmr) {
		ib_fmr_pool_unmap(req->fmr);
		req->fmr = NULL;
	}

534
	ib_dma_unmap_sg(target->srp_host->srp_dev->dev, scsi_sglist(scmnd),
535
			scsi_sg_count(scmnd), scmnd->sc_data_direction);
536 537
}

538 539
static void srp_remove_req(struct srp_target_port *target,
			   struct srp_request *req, s32 req_lim_delta)
540
{
541 542
	unsigned long flags;

543
	srp_unmap_data(req->scmnd, target, req);
544
	spin_lock_irqsave(&target->lock, flags);
545
	target->req_lim += req_lim_delta;
546
	req->scmnd = NULL;
547
	list_add_tail(&req->list, &target->free_reqs);
548
	spin_unlock_irqrestore(&target->lock, flags);
549 550 551 552 553 554
}

static void srp_reset_req(struct srp_target_port *target, struct srp_request *req)
{
	req->scmnd->result = DID_RESET << 16;
	req->scmnd->scsi_done(req->scmnd);
555
	srp_remove_req(target, req, 0);
556 557
}

558 559 560 561
static int srp_reconnect_target(struct srp_target_port *target)
{
	struct ib_qp_attr qp_attr;
	struct ib_wc wc;
562
	int i, ret;
563

564
	if (!srp_change_state(target, SRP_TARGET_LIVE, SRP_TARGET_CONNECTING))
565 566 567 568 569 570 571
		return -EAGAIN;

	srp_disconnect_target(target);
	/*
	 * Now get a new local CM ID so that we avoid confusing the
	 * target in case things are really fouled up.
	 */
D
David Dillow 已提交
572 573
	ret = srp_new_cm_id(target);
	if (ret)
574 575 576 577 578 579 580 581 582 583 584
		goto err;

	qp_attr.qp_state = IB_QPS_RESET;
	ret = ib_modify_qp(target->qp, &qp_attr, IB_QP_STATE);
	if (ret)
		goto err;

	ret = srp_init_qp(target, target->qp);
	if (ret)
		goto err;

585 586 587
	while (ib_poll_cq(target->recv_cq, 1, &wc) > 0)
		; /* nothing */
	while (ib_poll_cq(target->send_cq, 1, &wc) > 0)
588 589
		; /* nothing */

590 591 592 593 594
	for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
		struct srp_request *req = &target->req_ring[i];
		if (req->scmnd)
			srp_reset_req(target, req);
	}
595

596
	INIT_LIST_HEAD(&target->free_tx);
597
	for (i = 0; i < SRP_SQ_SIZE; ++i)
598
		list_add(&target->tx_ring[i]->list, &target->free_tx);
599

600
	target->qp_in_error = 0;
601 602 603 604
	ret = srp_connect_target(target);
	if (ret)
		goto err;

605
	if (!srp_change_state(target, SRP_TARGET_CONNECTING, SRP_TARGET_LIVE))
606 607 608 609 610
		ret = -EAGAIN;

	return ret;

err:
611 612
	shost_printk(KERN_ERR, target->scsi_host,
		     PFX "reconnect failed (%d), removing target port.\n", ret);
613 614 615

	/*
	 * We couldn't reconnect, so kill our target port off.
616 617 618 619 620 621
	 * However, we have to defer the real removal because we
	 * are in the context of the SCSI error handler now, which
	 * will deadlock if we call scsi_remove_host().
	 *
	 * Schedule our work inside the lock to avoid a race with
	 * the flush_scheduled_work() in srp_remove_one().
622
	 */
623
	spin_lock_irq(&target->lock);
624 625
	if (target->state == SRP_TARGET_CONNECTING) {
		target->state = SRP_TARGET_DEAD;
D
David Howells 已提交
626
		INIT_WORK(&target->work, srp_remove_work);
T
Tejun Heo 已提交
627
		queue_work(ib_wq, &target->work);
628
	}
629
	spin_unlock_irq(&target->lock);
630 631 632 633

	return ret;
}

634
static int srp_map_fmr(struct srp_target_port *target, struct scatterlist *scat,
635 636 637 638 639 640 641 642 643
		       int sg_cnt, struct srp_request *req,
		       struct srp_direct_buf *buf)
{
	u64 io_addr = 0;
	u64 *dma_pages;
	u32 len;
	int page_cnt;
	int i, j;
	int ret;
644
	struct srp_device *dev = target->srp_host->srp_dev;
645
	struct ib_device *ibdev = dev->dev;
646
	struct scatterlist *sg;
647 648 649 650

	if (!dev->fmr_pool)
		return -ENODEV;

651
	if (ib_sg_dma_address(ibdev, &scat[0]) & ~dev->fmr_page_mask)
652 653
		return -EINVAL;

654
	len = page_cnt = 0;
655 656
	scsi_for_each_sg(req->scmnd, sg, sg_cnt, i) {
		unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
657

658
		if (ib_sg_dma_address(ibdev, sg) & ~dev->fmr_page_mask) {
659 660 661 662 663
			if (i > 0)
				return -EINVAL;
			else
				++page_cnt;
		}
664
		if ((ib_sg_dma_address(ibdev, sg) + dma_len) &
665 666 667 668 669 670 671
		    ~dev->fmr_page_mask) {
			if (i < sg_cnt - 1)
				return -EINVAL;
			else
				++page_cnt;
		}

672
		len += dma_len;
673 674 675 676 677 678 679 680 681 682 683
	}

	page_cnt += len >> dev->fmr_page_shift;
	if (page_cnt > SRP_FMR_SIZE)
		return -ENOMEM;

	dma_pages = kmalloc(sizeof (u64) * page_cnt, GFP_ATOMIC);
	if (!dma_pages)
		return -ENOMEM;

	page_cnt = 0;
684 685
	scsi_for_each_sg(req->scmnd, sg, sg_cnt, i) {
		unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
686 687

		for (j = 0; j < dma_len; j += dev->fmr_page_size)
688
			dma_pages[page_cnt++] =
689
				(ib_sg_dma_address(ibdev, sg) &
690 691
				 dev->fmr_page_mask) + j;
	}
692 693

	req->fmr = ib_fmr_pool_map_phys(dev->fmr_pool,
694
					dma_pages, page_cnt, io_addr);
695 696
	if (IS_ERR(req->fmr)) {
		ret = PTR_ERR(req->fmr);
V
Vu Pham 已提交
697
		req->fmr = NULL;
698 699 700
		goto out;
	}

701 702
	buf->va  = cpu_to_be64(ib_sg_dma_address(ibdev, &scat[0]) &
			       ~dev->fmr_page_mask);
703 704 705 706 707 708 709 710 711 712 713
	buf->key = cpu_to_be32(req->fmr->fmr->rkey);
	buf->len = cpu_to_be32(len);

	ret = 0;

out:
	kfree(dma_pages);

	return ret;
}

714 715 716
static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target,
			struct srp_request *req)
{
717
	struct scatterlist *scat;
718
	struct srp_cmd *cmd = req->cmd->buf;
719
	int len, nents, count;
720
	u8 fmt = SRP_DATA_DESC_DIRECT;
721 722
	struct srp_device *dev;
	struct ib_device *ibdev;
723

724
	if (!scsi_sglist(scmnd) || scmnd->sc_data_direction == DMA_NONE)
725 726 727 728
		return sizeof (struct srp_cmd);

	if (scmnd->sc_data_direction != DMA_FROM_DEVICE &&
	    scmnd->sc_data_direction != DMA_TO_DEVICE) {
729 730 731
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "Unhandled data direction %d\n",
			     scmnd->sc_data_direction);
732 733 734
		return -EINVAL;
	}

735 736
	nents = scsi_sg_count(scmnd);
	scat  = scsi_sglist(scmnd);
737

738
	dev = target->srp_host->srp_dev;
739 740 741
	ibdev = dev->dev;

	count = ib_dma_map_sg(ibdev, scat, nents, scmnd->sc_data_direction);
742 743 744

	fmt = SRP_DATA_DESC_DIRECT;
	len = sizeof (struct srp_cmd) +	sizeof (struct srp_direct_buf);
745

746
	if (count == 1) {
747 748 749 750 751 752
		/*
		 * The midlayer only generated a single gather/scatter
		 * entry, or DMA mapping coalesced everything to a
		 * single entry.  So a direct descriptor along with
		 * the DMA MR suffices.
		 */
753
		struct srp_direct_buf *buf = (void *) cmd->add_data;
754

755
		buf->va  = cpu_to_be64(ib_sg_dma_address(ibdev, scat));
756
		buf->key = cpu_to_be32(target->rkey);
757
		buf->len = cpu_to_be32(ib_sg_dma_len(ibdev, scat));
758
	} else if (srp_map_fmr(target, scat, count, req,
759 760 761 762 763 764
			       (void *) cmd->add_data)) {
		/*
		 * FMR mapping failed, and the scatterlist has more
		 * than one entry.  Generate an indirect memory
		 * descriptor.
		 */
765
		struct srp_indirect_buf *buf = (void *) cmd->add_data;
766
		struct scatterlist *sg;
767
		u32 datalen = 0;
768
		int i;
769

770
		fmt = SRP_DATA_DESC_INDIRECT;
771 772 773 774
		len = sizeof (struct srp_cmd) +
			sizeof (struct srp_indirect_buf) +
			count * sizeof (struct srp_direct_buf);

775 776
		scsi_for_each_sg(scmnd, sg, count, i) {
			unsigned int dma_len = ib_sg_dma_len(ibdev, sg);
777

778
			buf->desc_list[i].va  =
779
				cpu_to_be64(ib_sg_dma_address(ibdev, sg));
780
			buf->desc_list[i].key =
781
				cpu_to_be32(target->rkey);
782 783
			buf->desc_list[i].len = cpu_to_be32(dma_len);
			datalen += dma_len;
784
		}
785

786 787 788 789 790
		if (scmnd->sc_data_direction == DMA_TO_DEVICE)
			cmd->data_out_desc_cnt = count;
		else
			cmd->data_in_desc_cnt = count;

791 792
		buf->table_desc.va  =
			cpu_to_be64(req->cmd->dma + sizeof *cmd + sizeof *buf);
793
		buf->table_desc.key =
794
			cpu_to_be32(target->rkey);
795 796 797 798
		buf->table_desc.len =
			cpu_to_be32(count * sizeof (struct srp_direct_buf));

		buf->len = cpu_to_be32(datalen);
799 800 801 802 803 804 805 806 807 808
	}

	if (scmnd->sc_data_direction == DMA_TO_DEVICE)
		cmd->buf_fmt = fmt << 4;
	else
		cmd->buf_fmt = fmt;

	return len;
}

809 810 811 812 813 814 815 816
/*
 * Return an IU and possible credit to the free pool
 */
static void srp_put_tx_iu(struct srp_target_port *target, struct srp_iu *iu,
			  enum srp_iu_type iu_type)
{
	unsigned long flags;

817
	spin_lock_irqsave(&target->lock, flags);
818 819 820
	list_add(&iu->list, &target->free_tx);
	if (iu_type != SRP_IU_RSP)
		++target->req_lim;
821
	spin_unlock_irqrestore(&target->lock, flags);
822 823
}

824
/*
825 826
 * Must be called with target->lock held to protect req_lim and free_tx.
 * If IU is not sent, it must be returned using srp_put_tx_iu().
827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
 *
 * Note:
 * An upper limit for the number of allocated information units for each
 * request type is:
 * - SRP_IU_CMD: SRP_CMD_SQ_SIZE, since the SCSI mid-layer never queues
 *   more than Scsi_Host.can_queue requests.
 * - SRP_IU_TSK_MGMT: SRP_TSK_MGMT_SQ_SIZE.
 * - SRP_IU_RSP: 1, since a conforming SRP target never sends more than
 *   one unanswered SRP request to an initiator.
 */
static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target,
				      enum srp_iu_type iu_type)
{
	s32 rsv = (iu_type == SRP_IU_TSK_MGMT) ? 0 : SRP_TSK_MGMT_SQ_SIZE;
	struct srp_iu *iu;

	srp_send_completion(target->send_cq, target);

845
	if (list_empty(&target->free_tx))
846 847 848
		return NULL;

	/* Initiator responses to target requests do not consume credits */
849 850 851 852 853 854 855
	if (iu_type != SRP_IU_RSP) {
		if (target->req_lim <= rsv) {
			++target->zero_req_lim;
			return NULL;
		}

		--target->req_lim;
856 857
	}

858
	iu = list_first_entry(&target->free_tx, struct srp_iu, list);
859
	list_del(&iu->list);
860 861 862
	return iu;
}

863 864
static int srp_post_send(struct srp_target_port *target,
			 struct srp_iu *iu, int len)
865 866 867 868 869 870
{
	struct ib_sge list;
	struct ib_send_wr wr, *bad_wr;

	list.addr   = iu->dma;
	list.length = len;
871
	list.lkey   = target->lkey;
872 873

	wr.next       = NULL;
874
	wr.wr_id      = (uintptr_t) iu;
875 876 877 878 879
	wr.sg_list    = &list;
	wr.num_sge    = 1;
	wr.opcode     = IB_WR_SEND;
	wr.send_flags = IB_SEND_SIGNALED;

880
	return ib_post_send(target->qp, &wr, &bad_wr);
881 882
}

883
static int srp_post_recv(struct srp_target_port *target, struct srp_iu *iu)
884 885
{
	struct ib_recv_wr wr, *bad_wr;
886
	struct ib_sge list;
887 888 889

	list.addr   = iu->dma;
	list.length = iu->size;
890
	list.lkey   = target->lkey;
891 892

	wr.next     = NULL;
893
	wr.wr_id    = (uintptr_t) iu;
894 895 896
	wr.sg_list  = &list;
	wr.num_sge  = 1;

897
	return ib_post_recv(target->qp, &wr, &bad_wr);
898 899
}

900 901 902 903 904 905 906
static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
{
	struct srp_request *req;
	struct scsi_cmnd *scmnd;
	unsigned long flags;

	if (unlikely(rsp->tag & SRP_TAG_TSK_MGMT)) {
907
		spin_lock_irqsave(&target->lock, flags);
908
		target->req_lim += be32_to_cpu(rsp->req_lim_delta);
909
		spin_unlock_irqrestore(&target->lock, flags);
910

911 912 913 914
		target->tsk_mgmt_status = -1;
		if (be32_to_cpu(rsp->resp_data_len) >= 4)
			target->tsk_mgmt_status = rsp->data[3];
		complete(&target->tsk_mgmt_done);
915
	} else {
916
		req = &target->req_ring[rsp->tag];
917
		scmnd = req->scmnd;
918
		if (!scmnd)
919 920 921
			shost_printk(KERN_ERR, target->scsi_host,
				     "Null scmnd for RSP w/tag %016llx\n",
				     (unsigned long long) rsp->tag);
922 923 924 925 926 927 928 929 930 931
		scmnd->result = rsp->status;

		if (rsp->flags & SRP_RSP_FLAG_SNSVALID) {
			memcpy(scmnd->sense_buffer, rsp->data +
			       be32_to_cpu(rsp->resp_data_len),
			       min_t(int, be32_to_cpu(rsp->sense_data_len),
				     SCSI_SENSE_BUFFERSIZE));
		}

		if (rsp->flags & (SRP_RSP_FLAG_DOOVER | SRP_RSP_FLAG_DOUNDER))
932
			scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt));
933
		else if (rsp->flags & (SRP_RSP_FLAG_DIOVER | SRP_RSP_FLAG_DIUNDER))
934
			scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt));
935

936
		srp_remove_req(target, req, be32_to_cpu(rsp->req_lim_delta));
937 938
		scmnd->host_scribble = NULL;
		scmnd->scsi_done(scmnd);
939 940 941
	}
}

942 943 944
static int srp_response_common(struct srp_target_port *target, s32 req_delta,
			       void *rsp, int len)
{
945
	struct ib_device *dev = target->srp_host->srp_dev->dev;
946 947
	unsigned long flags;
	struct srp_iu *iu;
948
	int err;
949

950
	spin_lock_irqsave(&target->lock, flags);
951 952
	target->req_lim += req_delta;
	iu = __srp_get_tx_iu(target, SRP_IU_RSP);
953
	spin_unlock_irqrestore(&target->lock, flags);
954

955 956 957
	if (!iu) {
		shost_printk(KERN_ERR, target->scsi_host, PFX
			     "no IU available to send response\n");
958
		return 1;
959 960 961 962 963 964
	}

	ib_dma_sync_single_for_cpu(dev, iu->dma, len, DMA_TO_DEVICE);
	memcpy(iu->buf, rsp, len);
	ib_dma_sync_single_for_device(dev, iu->dma, len, DMA_TO_DEVICE);

965 966
	err = srp_post_send(target, iu, len);
	if (err) {
967 968
		shost_printk(KERN_ERR, target->scsi_host, PFX
			     "unable to post response: %d\n", err);
969 970
		srp_put_tx_iu(target, iu, SRP_IU_RSP);
	}
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005

	return err;
}

static void srp_process_cred_req(struct srp_target_port *target,
				 struct srp_cred_req *req)
{
	struct srp_cred_rsp rsp = {
		.opcode = SRP_CRED_RSP,
		.tag = req->tag,
	};
	s32 delta = be32_to_cpu(req->req_lim_delta);

	if (srp_response_common(target, delta, &rsp, sizeof rsp))
		shost_printk(KERN_ERR, target->scsi_host, PFX
			     "problems processing SRP_CRED_REQ\n");
}

static void srp_process_aer_req(struct srp_target_port *target,
				struct srp_aer_req *req)
{
	struct srp_aer_rsp rsp = {
		.opcode = SRP_AER_RSP,
		.tag = req->tag,
	};
	s32 delta = be32_to_cpu(req->req_lim_delta);

	shost_printk(KERN_ERR, target->scsi_host, PFX
		     "ignoring AER for LUN %llu\n", be64_to_cpu(req->lun));

	if (srp_response_common(target, delta, &rsp, sizeof rsp))
		shost_printk(KERN_ERR, target->scsi_host, PFX
			     "problems processing SRP_AER_REQ\n");
}

1006 1007
static void srp_handle_recv(struct srp_target_port *target, struct ib_wc *wc)
{
1008 1009
	struct ib_device *dev = target->srp_host->srp_dev->dev;
	struct srp_iu *iu = (struct srp_iu *) wc->wr_id;
1010
	int res;
1011 1012
	u8 opcode;

1013 1014
	ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_ti_iu_len,
				   DMA_FROM_DEVICE);
1015 1016 1017 1018

	opcode = *(u8 *) iu->buf;

	if (0) {
1019 1020
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "recv completion, opcode 0x%02x\n", opcode);
B
Bart Van Assche 已提交
1021 1022
		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 8, 1,
			       iu->buf, wc->byte_len, true);
1023 1024 1025 1026 1027 1028 1029
	}

	switch (opcode) {
	case SRP_RSP:
		srp_process_rsp(target, iu->buf);
		break;

1030 1031 1032 1033 1034 1035 1036 1037
	case SRP_CRED_REQ:
		srp_process_cred_req(target, iu->buf);
		break;

	case SRP_AER_REQ:
		srp_process_aer_req(target, iu->buf);
		break;

1038 1039
	case SRP_T_LOGOUT:
		/* XXX Handle target logout */
1040 1041
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "Got target logout request\n");
1042 1043 1044
		break;

	default:
1045 1046
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "Unhandled SRP opcode 0x%02x\n", opcode);
1047 1048 1049
		break;
	}

1050 1051
	ib_dma_sync_single_for_device(dev, iu->dma, target->max_ti_iu_len,
				      DMA_FROM_DEVICE);
1052

1053
	res = srp_post_recv(target, iu);
1054 1055 1056
	if (res != 0)
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "Recv failed with error code %d\n", res);
1057 1058
}

1059
static void srp_recv_completion(struct ib_cq *cq, void *target_ptr)
1060 1061 1062 1063 1064 1065 1066
{
	struct srp_target_port *target = target_ptr;
	struct ib_wc wc;

	ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);
	while (ib_poll_cq(cq, 1, &wc) > 0) {
		if (wc.status) {
1067
			shost_printk(KERN_ERR, target->scsi_host,
1068
				     PFX "failed receive status %d\n",
1069
				     wc.status);
1070
			target->qp_in_error = 1;
1071 1072 1073
			break;
		}

1074 1075 1076 1077 1078 1079 1080 1081
		srp_handle_recv(target, &wc);
	}
}

static void srp_send_completion(struct ib_cq *cq, void *target_ptr)
{
	struct srp_target_port *target = target_ptr;
	struct ib_wc wc;
1082
	struct srp_iu *iu;
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092

	while (ib_poll_cq(cq, 1, &wc) > 0) {
		if (wc.status) {
			shost_printk(KERN_ERR, target->scsi_host,
				     PFX "failed send status %d\n",
				     wc.status);
			target->qp_in_error = 1;
			break;
		}

1093 1094
		iu = (struct srp_iu *) wc.wr_id;
		list_add(&iu->list, &target->free_tx);
1095 1096 1097
	}
}

1098
static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
1099
{
1100
	struct srp_target_port *target = host_to_target(shost);
1101 1102 1103
	struct srp_request *req;
	struct srp_iu *iu;
	struct srp_cmd *cmd;
1104
	struct ib_device *dev;
1105
	unsigned long flags;
1106 1107 1108 1109 1110 1111 1112 1113
	int len;

	if (target->state == SRP_TARGET_CONNECTING)
		goto err;

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED) {
		scmnd->result = DID_BAD_TARGET << 16;
1114
		scmnd->scsi_done(scmnd);
1115 1116 1117
		return 0;
	}

1118
	spin_lock_irqsave(&target->lock, flags);
1119
	iu = __srp_get_tx_iu(target, SRP_IU_CMD);
1120
	if (!iu)
1121 1122 1123 1124 1125
		goto err_unlock;

	req = list_first_entry(&target->free_reqs, struct srp_request, list);
	list_del(&req->list);
	spin_unlock_irqrestore(&target->lock, flags);
1126

1127
	dev = target->srp_host->srp_dev->dev;
1128 1129
	ib_dma_sync_single_for_cpu(dev, iu->dma, srp_max_iu_len,
				   DMA_TO_DEVICE);
1130 1131

	scmnd->result        = 0;
1132
	scmnd->host_scribble = (void *) req;
1133 1134 1135 1136 1137 1138

	cmd = iu->buf;
	memset(cmd, 0, sizeof *cmd);

	cmd->opcode = SRP_CMD;
	cmd->lun    = cpu_to_be64((u64) scmnd->device->lun << 48);
1139
	cmd->tag    = req->index;
1140 1141 1142 1143 1144 1145 1146
	memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);

	req->scmnd    = scmnd;
	req->cmd      = iu;

	len = srp_map_data(scmnd, target, req);
	if (len < 0) {
1147 1148
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "Failed to map data\n");
1149
		goto err_iu;
1150 1151
	}

1152 1153
	ib_dma_sync_single_for_device(dev, iu->dma, srp_max_iu_len,
				      DMA_TO_DEVICE);
1154

1155
	if (srp_post_send(target, iu, len)) {
1156
		shost_printk(KERN_ERR, target->scsi_host, PFX "Send failed\n");
1157 1158 1159 1160 1161 1162 1163 1164
		goto err_unmap;
	}

	return 0;

err_unmap:
	srp_unmap_data(scmnd, target, req);

1165 1166 1167
err_iu:
	srp_put_tx_iu(target, iu, SRP_IU_CMD);

1168
	spin_lock_irqsave(&target->lock, flags);
1169
	list_add(&req->list, &target->free_reqs);
1170 1171

err_unlock:
1172
	spin_unlock_irqrestore(&target->lock, flags);
1173

1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189
err:
	return SCSI_MLQUEUE_HOST_BUSY;
}

static int srp_alloc_iu_bufs(struct srp_target_port *target)
{
	int i;

	for (i = 0; i < SRP_RQ_SIZE; ++i) {
		target->rx_ring[i] = srp_alloc_iu(target->srp_host,
						  target->max_ti_iu_len,
						  GFP_KERNEL, DMA_FROM_DEVICE);
		if (!target->rx_ring[i])
			goto err;
	}

1190
	for (i = 0; i < SRP_SQ_SIZE; ++i) {
1191
		target->tx_ring[i] = srp_alloc_iu(target->srp_host,
1192
						  srp_max_iu_len,
1193 1194 1195
						  GFP_KERNEL, DMA_TO_DEVICE);
		if (!target->tx_ring[i])
			goto err;
1196 1197

		list_add(&target->tx_ring[i]->list, &target->free_tx);
1198 1199 1200 1201 1202 1203 1204 1205 1206 1207
	}

	return 0;

err:
	for (i = 0; i < SRP_RQ_SIZE; ++i) {
		srp_free_iu(target->srp_host, target->rx_ring[i]);
		target->rx_ring[i] = NULL;
	}

1208
	for (i = 0; i < SRP_SQ_SIZE; ++i) {
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219
		srp_free_iu(target->srp_host, target->tx_ring[i]);
		target->tx_ring[i] = NULL;
	}

	return -ENOMEM;
}

static void srp_cm_rej_handler(struct ib_cm_id *cm_id,
			       struct ib_cm_event *event,
			       struct srp_target_port *target)
{
1220
	struct Scsi_Host *shost = target->scsi_host;
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
	struct ib_class_port_info *cpi;
	int opcode;

	switch (event->param.rej_rcvd.reason) {
	case IB_CM_REJ_PORT_CM_REDIRECT:
		cpi = event->param.rej_rcvd.ari;
		target->path.dlid = cpi->redirect_lid;
		target->path.pkey = cpi->redirect_pkey;
		cm_id->remote_cm_qpn = be32_to_cpu(cpi->redirect_qp) & 0x00ffffff;
		memcpy(target->path.dgid.raw, cpi->redirect_gid, 16);

		target->status = target->path.dlid ?
			SRP_DLID_REDIRECT : SRP_PORT_REDIRECT;
		break;

	case IB_CM_REJ_PORT_REDIRECT:
1237
		if (srp_target_is_topspin(target)) {
1238 1239 1240 1241 1242 1243 1244 1245
			/*
			 * Topspin/Cisco SRP gateways incorrectly send
			 * reject reason code 25 when they mean 24
			 * (port redirect).
			 */
			memcpy(target->path.dgid.raw,
			       event->param.rej_rcvd.ari, 16);

1246 1247 1248 1249
			shost_printk(KERN_DEBUG, shost,
				     PFX "Topspin/Cisco redirect to target port GID %016llx%016llx\n",
				     (unsigned long long) be64_to_cpu(target->path.dgid.global.subnet_prefix),
				     (unsigned long long) be64_to_cpu(target->path.dgid.global.interface_id));
1250 1251 1252

			target->status = SRP_PORT_REDIRECT;
		} else {
1253 1254
			shost_printk(KERN_WARNING, shost,
				     "  REJ reason: IB_CM_REJ_PORT_REDIRECT\n");
1255 1256 1257 1258 1259
			target->status = -ECONNRESET;
		}
		break;

	case IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID:
1260 1261
		shost_printk(KERN_WARNING, shost,
			    "  REJ reason: IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID\n");
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271
		target->status = -ECONNRESET;
		break;

	case IB_CM_REJ_CONSUMER_DEFINED:
		opcode = *(u8 *) event->private_data;
		if (opcode == SRP_LOGIN_REJ) {
			struct srp_login_rej *rej = event->private_data;
			u32 reason = be32_to_cpu(rej->reason);

			if (reason == SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE)
1272 1273
				shost_printk(KERN_WARNING, shost,
					     PFX "SRP_LOGIN_REJ: requested max_it_iu_len too large\n");
1274
			else
1275 1276
				shost_printk(KERN_WARNING, shost,
					    PFX "SRP LOGIN REJECTED, reason 0x%08x\n", reason);
1277
		} else
1278 1279 1280
			shost_printk(KERN_WARNING, shost,
				     "  REJ reason: IB_CM_REJ_CONSUMER_DEFINED,"
				     " opcode 0x%02x\n", opcode);
1281 1282 1283
		target->status = -ECONNRESET;
		break;

D
David Dillow 已提交
1284 1285 1286 1287 1288
	case IB_CM_REJ_STALE_CONN:
		shost_printk(KERN_WARNING, shost, "  REJ reason: stale connection\n");
		target->status = SRP_STALE_CONN;
		break;

1289
	default:
1290 1291
		shost_printk(KERN_WARNING, shost, "  REJ reason 0x%x\n",
			     event->param.rej_rcvd.reason);
1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302
		target->status = -ECONNRESET;
	}
}

static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)
{
	struct srp_target_port *target = cm_id->context;
	struct ib_qp_attr *qp_attr = NULL;
	int attr_mask = 0;
	int comp = 0;
	int opcode = 0;
1303
	int i;
1304 1305 1306

	switch (event->event) {
	case IB_CM_REQ_ERROR:
1307 1308
		shost_printk(KERN_DEBUG, target->scsi_host,
			     PFX "Sending CM REQ failed\n");
1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322
		comp = 1;
		target->status = -ECONNRESET;
		break;

	case IB_CM_REP_RECEIVED:
		comp = 1;
		opcode = *(u8 *) event->private_data;

		if (opcode == SRP_LOGIN_RSP) {
			struct srp_login_rsp *rsp = event->private_data;

			target->max_ti_iu_len = be32_to_cpu(rsp->max_ti_iu_len);
			target->req_lim       = be32_to_cpu(rsp->req_lim_delta);

1323 1324 1325 1326 1327 1328 1329
			/*
			 * Reserve credits for task management so we don't
			 * bounce requests back to the SCSI mid-layer.
			 */
			target->scsi_host->can_queue
				= min(target->req_lim - SRP_TSK_MGMT_SQ_SIZE,
				      target->scsi_host->can_queue);
1330
		} else {
1331 1332
			shost_printk(KERN_WARNING, target->scsi_host,
				    PFX "Unhandled RSP opcode %#x\n", opcode);
1333 1334 1335 1336
			target->status = -ECONNRESET;
			break;
		}

V
Vu Pham 已提交
1337 1338 1339 1340 1341
		if (!target->rx_ring[0]) {
			target->status = srp_alloc_iu_bufs(target);
			if (target->status)
				break;
		}
1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357

		qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL);
		if (!qp_attr) {
			target->status = -ENOMEM;
			break;
		}

		qp_attr->qp_state = IB_QPS_RTR;
		target->status = ib_cm_init_qp_attr(cm_id, qp_attr, &attr_mask);
		if (target->status)
			break;

		target->status = ib_modify_qp(target->qp, qp_attr, attr_mask);
		if (target->status)
			break;

1358
		for (i = 0; i < SRP_RQ_SIZE; i++) {
1359 1360
			struct srp_iu *iu = target->rx_ring[i];
			target->status = srp_post_recv(target, iu);
1361 1362 1363
			if (target->status)
				break;
		}
1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
		if (target->status)
			break;

		qp_attr->qp_state = IB_QPS_RTS;
		target->status = ib_cm_init_qp_attr(cm_id, qp_attr, &attr_mask);
		if (target->status)
			break;

		target->status = ib_modify_qp(target->qp, qp_attr, attr_mask);
		if (target->status)
			break;

		target->status = ib_send_cm_rtu(cm_id, NULL, 0);
		if (target->status)
			break;

		break;

	case IB_CM_REJ_RECEIVED:
1383
		shost_printk(KERN_DEBUG, target->scsi_host, PFX "REJ received\n");
1384 1385 1386 1387 1388
		comp = 1;

		srp_cm_rej_handler(cm_id, event, target);
		break;

1389
	case IB_CM_DREQ_RECEIVED:
1390 1391
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "DREQ received - connection closed\n");
1392
		if (ib_send_cm_drep(cm_id, NULL, 0))
1393 1394
			shost_printk(KERN_ERR, target->scsi_host,
				     PFX "Sending CM DREP failed\n");
1395 1396 1397
		break;

	case IB_CM_TIMEWAIT_EXIT:
1398 1399
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "connection closed\n");
1400 1401 1402 1403 1404

		comp = 1;
		target->status = 0;
		break;

1405 1406 1407 1408 1409
	case IB_CM_MRA_RECEIVED:
	case IB_CM_DREQ_ERROR:
	case IB_CM_DREP_RECEIVED:
		break;

1410
	default:
1411 1412
		shost_printk(KERN_WARNING, target->scsi_host,
			     PFX "Unhandled CM event %d\n", event->event);
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423
		break;
	}

	if (comp)
		complete(&target->done);

	kfree(qp_attr);

	return 0;
}

1424
static int srp_send_tsk_mgmt(struct srp_target_port *target,
1425
			     u64 req_tag, unsigned int lun, u8 func)
1426
{
1427
	struct ib_device *dev = target->srp_host->srp_dev->dev;
1428 1429 1430
	struct srp_iu *iu;
	struct srp_tsk_mgmt *tsk_mgmt;

1431
	if (target->state == SRP_TARGET_DEAD ||
1432
	    target->state == SRP_TARGET_REMOVED)
1433
		return -1;
1434

1435
	init_completion(&target->tsk_mgmt_done);
1436

1437
	spin_lock_irq(&target->lock);
1438
	iu = __srp_get_tx_iu(target, SRP_IU_TSK_MGMT);
1439
	spin_unlock_irq(&target->lock);
1440

1441
	if (!iu)
1442
		return -1;
1443

1444 1445
	ib_dma_sync_single_for_cpu(dev, iu->dma, sizeof *tsk_mgmt,
				   DMA_TO_DEVICE);
1446 1447 1448 1449
	tsk_mgmt = iu->buf;
	memset(tsk_mgmt, 0, sizeof *tsk_mgmt);

	tsk_mgmt->opcode 	= SRP_TSK_MGMT;
1450 1451
	tsk_mgmt->lun		= cpu_to_be64((u64) lun << 48);
	tsk_mgmt->tag		= req_tag | SRP_TAG_TSK_MGMT;
1452
	tsk_mgmt->tsk_mgmt_func = func;
1453
	tsk_mgmt->task_tag	= req_tag;
1454

1455 1456
	ib_dma_sync_single_for_device(dev, iu->dma, sizeof *tsk_mgmt,
				      DMA_TO_DEVICE);
1457 1458 1459 1460
	if (srp_post_send(target, iu, sizeof *tsk_mgmt)) {
		srp_put_tx_iu(target, iu, SRP_IU_TSK_MGMT);
		return -1;
	}
1461

1462
	if (!wait_for_completion_timeout(&target->tsk_mgmt_done,
1463
					 msecs_to_jiffies(SRP_ABORT_TIMEOUT_MS)))
1464
		return -1;
1465

1466 1467 1468
	return 0;
}

1469 1470
static int srp_abort(struct scsi_cmnd *scmnd)
{
1471
	struct srp_target_port *target = host_to_target(scmnd->device->host);
1472
	struct srp_request *req = (struct srp_request *) scmnd->host_scribble;
1473 1474
	int ret = SUCCESS;

1475
	shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n");
1476

1477
	if (!req || target->qp_in_error)
1478
		return FAILED;
1479 1480
	if (srp_send_tsk_mgmt(target, req->index, scmnd->device->lun,
			      SRP_TSK_ABORT_TASK))
1481 1482
		return FAILED;

1483 1484
	if (req->scmnd) {
		if (!target->tsk_mgmt_status) {
1485
			srp_remove_req(target, req, 0);
1486 1487 1488 1489
			scmnd->result = DID_ABORT << 16;
		} else
			ret = FAILED;
	}
1490 1491

	return ret;
1492 1493 1494 1495
}

static int srp_reset_device(struct scsi_cmnd *scmnd)
{
1496
	struct srp_target_port *target = host_to_target(scmnd->device->host);
1497
	int i;
1498

1499
	shost_printk(KERN_ERR, target->scsi_host, "SRP reset_device called\n");
1500

1501 1502
	if (target->qp_in_error)
		return FAILED;
1503 1504
	if (srp_send_tsk_mgmt(target, SRP_TAG_NO_REQ, scmnd->device->lun,
			      SRP_TSK_LUN_RESET))
1505
		return FAILED;
1506
	if (target->tsk_mgmt_status)
1507 1508
		return FAILED;

1509 1510
	for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
		struct srp_request *req = &target->req_ring[i];
1511
		if (req->scmnd && req->scmnd->device == scmnd->device)
1512
			srp_reset_req(target, req);
1513
	}
1514 1515

	return SUCCESS;
1516 1517 1518 1519 1520 1521 1522
}

static int srp_reset_host(struct scsi_cmnd *scmnd)
{
	struct srp_target_port *target = host_to_target(scmnd->device->host);
	int ret = FAILED;

1523
	shost_printk(KERN_ERR, target->scsi_host, PFX "SRP reset_host called\n");
1524 1525 1526 1527 1528 1529 1530

	if (!srp_reconnect_target(target))
		ret = SUCCESS;

	return ret;
}

1531 1532
static ssize_t show_id_ext(struct device *dev, struct device_attribute *attr,
			   char *buf)
1533
{
1534
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1535 1536 1537 1538 1539 1540 1541 1542 1543

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "0x%016llx\n",
		       (unsigned long long) be64_to_cpu(target->id_ext));
}

1544 1545
static ssize_t show_ioc_guid(struct device *dev, struct device_attribute *attr,
			     char *buf)
1546
{
1547
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1548 1549 1550 1551 1552 1553 1554 1555 1556

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "0x%016llx\n",
		       (unsigned long long) be64_to_cpu(target->ioc_guid));
}

1557 1558
static ssize_t show_service_id(struct device *dev,
			       struct device_attribute *attr, char *buf)
1559
{
1560
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1561 1562 1563 1564 1565 1566 1567 1568 1569

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "0x%016llx\n",
		       (unsigned long long) be64_to_cpu(target->service_id));
}

1570 1571
static ssize_t show_pkey(struct device *dev, struct device_attribute *attr,
			 char *buf)
1572
{
1573
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1574 1575 1576 1577 1578 1579 1580 1581

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "0x%04x\n", be16_to_cpu(target->path.pkey));
}

1582 1583
static ssize_t show_dgid(struct device *dev, struct device_attribute *attr,
			 char *buf)
1584
{
1585
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1586 1587 1588 1589 1590

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

H
Harvey Harrison 已提交
1591
	return sprintf(buf, "%pI6\n", target->path.dgid.raw);
1592 1593
}

1594 1595
static ssize_t show_orig_dgid(struct device *dev,
			      struct device_attribute *attr, char *buf)
1596
{
1597
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1598 1599 1600 1601 1602

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

H
Harvey Harrison 已提交
1603
	return sprintf(buf, "%pI6\n", target->orig_dgid);
1604 1605
}

1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
static ssize_t show_req_lim(struct device *dev,
			    struct device_attribute *attr, char *buf)
{
	struct srp_target_port *target = host_to_target(class_to_shost(dev));

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "%d\n", target->req_lim);
}

1618 1619
static ssize_t show_zero_req_lim(struct device *dev,
				 struct device_attribute *attr, char *buf)
1620
{
1621
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1622 1623 1624 1625 1626 1627 1628 1629

	if (target->state == SRP_TARGET_DEAD ||
	    target->state == SRP_TARGET_REMOVED)
		return -ENODEV;

	return sprintf(buf, "%d\n", target->zero_req_lim);
}

1630 1631
static ssize_t show_local_ib_port(struct device *dev,
				  struct device_attribute *attr, char *buf)
1632
{
1633
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1634 1635 1636 1637

	return sprintf(buf, "%d\n", target->srp_host->port);
}

1638 1639
static ssize_t show_local_ib_device(struct device *dev,
				    struct device_attribute *attr, char *buf)
1640
{
1641
	struct srp_target_port *target = host_to_target(class_to_shost(dev));
1642

1643
	return sprintf(buf, "%s\n", target->srp_host->srp_dev->dev->name);
1644 1645
}

1646 1647 1648 1649 1650 1651
static DEVICE_ATTR(id_ext,	    S_IRUGO, show_id_ext,	   NULL);
static DEVICE_ATTR(ioc_guid,	    S_IRUGO, show_ioc_guid,	   NULL);
static DEVICE_ATTR(service_id,	    S_IRUGO, show_service_id,	   NULL);
static DEVICE_ATTR(pkey,	    S_IRUGO, show_pkey,		   NULL);
static DEVICE_ATTR(dgid,	    S_IRUGO, show_dgid,		   NULL);
static DEVICE_ATTR(orig_dgid,	    S_IRUGO, show_orig_dgid,	   NULL);
1652
static DEVICE_ATTR(req_lim,         S_IRUGO, show_req_lim,         NULL);
1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663
static DEVICE_ATTR(zero_req_lim,    S_IRUGO, show_zero_req_lim,	   NULL);
static DEVICE_ATTR(local_ib_port,   S_IRUGO, show_local_ib_port,   NULL);
static DEVICE_ATTR(local_ib_device, S_IRUGO, show_local_ib_device, NULL);

static struct device_attribute *srp_host_attrs[] = {
	&dev_attr_id_ext,
	&dev_attr_ioc_guid,
	&dev_attr_service_id,
	&dev_attr_pkey,
	&dev_attr_dgid,
	&dev_attr_orig_dgid,
1664
	&dev_attr_req_lim,
1665 1666 1667
	&dev_attr_zero_req_lim,
	&dev_attr_local_ib_port,
	&dev_attr_local_ib_device,
1668 1669 1670
	NULL
};

1671 1672
static struct scsi_host_template srp_template = {
	.module				= THIS_MODULE,
R
Roland Dreier 已提交
1673 1674
	.name				= "InfiniBand SRP initiator",
	.proc_name			= DRV_NAME,
1675 1676 1677 1678 1679
	.info				= srp_target_info,
	.queuecommand			= srp_queuecommand,
	.eh_abort_handler		= srp_abort,
	.eh_device_reset_handler	= srp_reset_device,
	.eh_host_reset_handler		= srp_reset_host,
1680
	.can_queue			= SRP_CMD_SQ_SIZE,
1681
	.this_id			= -1,
1682
	.cmd_per_lun			= SRP_CMD_SQ_SIZE,
1683 1684
	.use_clustering			= ENABLE_CLUSTERING,
	.shost_attrs			= srp_host_attrs
1685 1686 1687 1688
};

static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
{
1689 1690 1691
	struct srp_rport_identifiers ids;
	struct srp_rport *rport;

1692 1693 1694
	sprintf(target->target_name, "SRP.T10:%016llX",
		 (unsigned long long) be64_to_cpu(target->id_ext));

1695
	if (scsi_add_host(target->scsi_host, host->srp_dev->dev->dma_device))
1696 1697
		return -ENODEV;

1698 1699
	memcpy(ids.port_id, &target->id_ext, 8);
	memcpy(ids.port_id + 8, &target->ioc_guid, 8);
1700
	ids.roles = SRP_RPORT_ROLE_TARGET;
1701 1702 1703 1704 1705 1706
	rport = srp_rport_add(target->scsi_host, &ids);
	if (IS_ERR(rport)) {
		scsi_remove_host(target->scsi_host);
		return PTR_ERR(rport);
	}

1707
	spin_lock(&host->target_lock);
1708
	list_add_tail(&target->list, &host->target_list);
1709
	spin_unlock(&host->target_lock);
1710 1711 1712 1713

	target->state = SRP_TARGET_LIVE;

	scsi_scan_target(&target->scsi_host->shost_gendev,
1714
			 0, target->scsi_id, SCAN_WILD_CARD, 0);
1715 1716 1717 1718

	return 0;
}

1719
static void srp_release_dev(struct device *dev)
1720 1721
{
	struct srp_host *host =
1722
		container_of(dev, struct srp_host, dev);
1723 1724 1725 1726 1727 1728

	complete(&host->released);
}

static struct class srp_class = {
	.name    = "infiniband_srp",
1729
	.dev_release = srp_release_dev
1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747
};

/*
 * Target ports are added by writing
 *
 *     id_ext=<SRP ID ext>,ioc_guid=<SRP IOC GUID>,dgid=<dest GID>,
 *     pkey=<P_Key>,service_id=<service ID>
 *
 * to the add_target sysfs attribute.
 */
enum {
	SRP_OPT_ERR		= 0,
	SRP_OPT_ID_EXT		= 1 << 0,
	SRP_OPT_IOC_GUID	= 1 << 1,
	SRP_OPT_DGID		= 1 << 2,
	SRP_OPT_PKEY		= 1 << 3,
	SRP_OPT_SERVICE_ID	= 1 << 4,
	SRP_OPT_MAX_SECT	= 1 << 5,
1748
	SRP_OPT_MAX_CMD_PER_LUN	= 1 << 6,
1749
	SRP_OPT_IO_CLASS	= 1 << 7,
1750
	SRP_OPT_INITIATOR_EXT	= 1 << 8,
1751 1752 1753 1754 1755 1756 1757
	SRP_OPT_ALL		= (SRP_OPT_ID_EXT	|
				   SRP_OPT_IOC_GUID	|
				   SRP_OPT_DGID		|
				   SRP_OPT_PKEY		|
				   SRP_OPT_SERVICE_ID),
};

1758
static const match_table_t srp_opt_tokens = {
1759 1760 1761 1762 1763 1764 1765
	{ SRP_OPT_ID_EXT,		"id_ext=%s" 		},
	{ SRP_OPT_IOC_GUID,		"ioc_guid=%s" 		},
	{ SRP_OPT_DGID,			"dgid=%s" 		},
	{ SRP_OPT_PKEY,			"pkey=%x" 		},
	{ SRP_OPT_SERVICE_ID,		"service_id=%s"		},
	{ SRP_OPT_MAX_SECT,		"max_sect=%d" 		},
	{ SRP_OPT_MAX_CMD_PER_LUN,	"max_cmd_per_lun=%d" 	},
1766
	{ SRP_OPT_IO_CLASS,		"io_class=%x"		},
1767
	{ SRP_OPT_INITIATOR_EXT,	"initiator_ext=%s"	},
1768
	{ SRP_OPT_ERR,			NULL 			}
1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796
};

static int srp_parse_options(const char *buf, struct srp_target_port *target)
{
	char *options, *sep_opt;
	char *p;
	char dgid[3];
	substring_t args[MAX_OPT_ARGS];
	int opt_mask = 0;
	int token;
	int ret = -EINVAL;
	int i;

	options = kstrdup(buf, GFP_KERNEL);
	if (!options)
		return -ENOMEM;

	sep_opt = options;
	while ((p = strsep(&sep_opt, ",")) != NULL) {
		if (!*p)
			continue;

		token = match_token(p, srp_opt_tokens, args);
		opt_mask |= token;

		switch (token) {
		case SRP_OPT_ID_EXT:
			p = match_strdup(args);
1797 1798 1799 1800
			if (!p) {
				ret = -ENOMEM;
				goto out;
			}
1801 1802 1803 1804 1805 1806
			target->id_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
			kfree(p);
			break;

		case SRP_OPT_IOC_GUID:
			p = match_strdup(args);
1807 1808 1809 1810
			if (!p) {
				ret = -ENOMEM;
				goto out;
			}
1811 1812 1813 1814 1815 1816
			target->ioc_guid = cpu_to_be64(simple_strtoull(p, NULL, 16));
			kfree(p);
			break;

		case SRP_OPT_DGID:
			p = match_strdup(args);
1817 1818 1819 1820
			if (!p) {
				ret = -ENOMEM;
				goto out;
			}
1821 1822
			if (strlen(p) != 32) {
				printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p);
1823
				kfree(p);
1824 1825 1826 1827 1828 1829 1830
				goto out;
			}

			for (i = 0; i < 16; ++i) {
				strlcpy(dgid, p + i * 2, 3);
				target->path.dgid.raw[i] = simple_strtoul(dgid, NULL, 16);
			}
1831
			kfree(p);
1832
			memcpy(target->orig_dgid, target->path.dgid.raw, 16);
1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844
			break;

		case SRP_OPT_PKEY:
			if (match_hex(args, &token)) {
				printk(KERN_WARNING PFX "bad P_Key parameter '%s'\n", p);
				goto out;
			}
			target->path.pkey = cpu_to_be16(token);
			break;

		case SRP_OPT_SERVICE_ID:
			p = match_strdup(args);
1845 1846 1847 1848
			if (!p) {
				ret = -ENOMEM;
				goto out;
			}
1849
			target->service_id = cpu_to_be64(simple_strtoull(p, NULL, 16));
1850
			target->path.service_id = target->service_id;
1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861
			kfree(p);
			break;

		case SRP_OPT_MAX_SECT:
			if (match_int(args, &token)) {
				printk(KERN_WARNING PFX "bad max sect parameter '%s'\n", p);
				goto out;
			}
			target->scsi_host->max_sectors = token;
			break;

1862 1863 1864 1865 1866
		case SRP_OPT_MAX_CMD_PER_LUN:
			if (match_int(args, &token)) {
				printk(KERN_WARNING PFX "bad max cmd_per_lun parameter '%s'\n", p);
				goto out;
			}
1867
			target->scsi_host->cmd_per_lun = min(token, SRP_CMD_SQ_SIZE);
1868 1869
			break;

1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884
		case SRP_OPT_IO_CLASS:
			if (match_hex(args, &token)) {
				printk(KERN_WARNING PFX "bad  IO class parameter '%s' \n", p);
				goto out;
			}
			if (token != SRP_REV10_IB_IO_CLASS &&
			    token != SRP_REV16A_IB_IO_CLASS) {
				printk(KERN_WARNING PFX "unknown IO class parameter value"
				       " %x specified (use %x or %x).\n",
				       token, SRP_REV10_IB_IO_CLASS, SRP_REV16A_IB_IO_CLASS);
				goto out;
			}
			target->io_class = token;
			break;

1885 1886
		case SRP_OPT_INITIATOR_EXT:
			p = match_strdup(args);
1887 1888 1889 1890
			if (!p) {
				ret = -ENOMEM;
				goto out;
			}
1891 1892 1893 1894
			target->initiator_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));
			kfree(p);
			break;

1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
		default:
			printk(KERN_WARNING PFX "unknown parameter or missing value "
			       "'%s' in target creation request\n", p);
			goto out;
		}
	}

	if ((opt_mask & SRP_OPT_ALL) == SRP_OPT_ALL)
		ret = 0;
	else
		for (i = 0; i < ARRAY_SIZE(srp_opt_tokens); ++i)
			if ((srp_opt_tokens[i].token & SRP_OPT_ALL) &&
			    !(srp_opt_tokens[i].token & opt_mask))
				printk(KERN_WARNING PFX "target creation request is "
				       "missing parameter '%s'\n",
				       srp_opt_tokens[i].pattern);

out:
	kfree(options);
	return ret;
}

1917 1918
static ssize_t srp_create_target(struct device *dev,
				 struct device_attribute *attr,
1919 1920 1921
				 const char *buf, size_t count)
{
	struct srp_host *host =
1922
		container_of(dev, struct srp_host, dev);
1923 1924 1925 1926 1927 1928 1929 1930 1931 1932
	struct Scsi_Host *target_host;
	struct srp_target_port *target;
	int ret;
	int i;

	target_host = scsi_host_alloc(&srp_template,
				      sizeof (struct srp_target_port));
	if (!target_host)
		return -ENOMEM;

1933
	target_host->transportt = ib_srp_transport_template;
A
Arne Redlich 已提交
1934 1935
	target_host->max_lun     = SRP_MAX_LUN;
	target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;
R
Roland Dreier 已提交
1936

1937 1938
	target = host_to_target(target_host);

1939
	target->io_class   = SRP_REV16A_IB_IO_CLASS;
1940 1941
	target->scsi_host  = target_host;
	target->srp_host   = host;
1942 1943
	target->lkey	   = host->srp_dev->mr->lkey;
	target->rkey	   = host->srp_dev->mr->rkey;
1944

1945
	spin_lock_init(&target->lock);
1946
	INIT_LIST_HEAD(&target->free_tx);
1947
	INIT_LIST_HEAD(&target->free_reqs);
1948
	for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {
1949 1950 1951
		target->req_ring[i].index = i;
		list_add_tail(&target->req_ring[i].list, &target->free_reqs);
	}
1952 1953 1954 1955 1956

	ret = srp_parse_options(buf, target);
	if (ret)
		goto err;

1957
	ib_query_gid(host->srp_dev->dev, host->port, 0, &target->path.sgid);
1958

1959 1960
	shost_printk(KERN_DEBUG, target->scsi_host, PFX
		     "new target: id_ext %016llx ioc_guid %016llx pkey %04x "
H
Harvey Harrison 已提交
1961
		     "service_id %016llx dgid %pI6\n",
1962 1963 1964 1965
	       (unsigned long long) be64_to_cpu(target->id_ext),
	       (unsigned long long) be64_to_cpu(target->ioc_guid),
	       be16_to_cpu(target->path.pkey),
	       (unsigned long long) be64_to_cpu(target->service_id),
1966
	       target->path.dgid.raw);
1967 1968 1969 1970 1971

	ret = srp_create_target_ib(target);
	if (ret)
		goto err;

D
David Dillow 已提交
1972 1973
	ret = srp_new_cm_id(target);
	if (ret)
1974 1975
		goto err_free;

1976
	target->qp_in_error = 0;
1977 1978
	ret = srp_connect_target(target);
	if (ret) {
1979 1980
		shost_printk(KERN_ERR, target->scsi_host,
			     PFX "Connection failed\n");
1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
		goto err_cm_id;
	}

	ret = srp_add_target(host, target);
	if (ret)
		goto err_disconnect;

	return count;

err_disconnect:
	srp_disconnect_target(target);

err_cm_id:
	ib_destroy_cm_id(target->cm_id);

err_free:
	srp_free_target_ib(target);

err:
	scsi_host_put(target_host);

	return ret;
}

2005
static DEVICE_ATTR(add_target, S_IWUSR, NULL, srp_create_target);
2006

2007 2008
static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr,
			  char *buf)
2009
{
2010
	struct srp_host *host = container_of(dev, struct srp_host, dev);
2011

2012
	return sprintf(buf, "%s\n", host->srp_dev->dev->name);
2013 2014
}

2015
static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL);
2016

2017 2018
static ssize_t show_port(struct device *dev, struct device_attribute *attr,
			 char *buf)
2019
{
2020
	struct srp_host *host = container_of(dev, struct srp_host, dev);
2021 2022 2023 2024

	return sprintf(buf, "%d\n", host->port);
}

2025
static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);
2026

2027
static struct srp_host *srp_add_port(struct srp_device *device, u8 port)
2028 2029 2030 2031 2032 2033 2034 2035
{
	struct srp_host *host;

	host = kzalloc(sizeof *host, GFP_KERNEL);
	if (!host)
		return NULL;

	INIT_LIST_HEAD(&host->target_list);
2036
	spin_lock_init(&host->target_lock);
2037
	init_completion(&host->released);
2038
	host->srp_dev = device;
2039 2040
	host->port = port;

2041 2042
	host->dev.class = &srp_class;
	host->dev.parent = device->dev->dma_device;
2043
	dev_set_name(&host->dev, "srp-%s-%d", device->dev->name, port);
2044

2045
	if (device_register(&host->dev))
2046
		goto free_host;
2047
	if (device_create_file(&host->dev, &dev_attr_add_target))
2048
		goto err_class;
2049
	if (device_create_file(&host->dev, &dev_attr_ibdev))
2050
		goto err_class;
2051
	if (device_create_file(&host->dev, &dev_attr_port))
2052 2053 2054 2055 2056
		goto err_class;

	return host;

err_class:
2057
	device_unregister(&host->dev);
2058

2059
free_host:
2060 2061 2062 2063 2064 2065 2066
	kfree(host);

	return NULL;
}

static void srp_add_one(struct ib_device *device)
{
2067 2068 2069
	struct srp_device *srp_dev;
	struct ib_device_attr *dev_attr;
	struct ib_fmr_pool_param fmr_param;
2070 2071 2072
	struct srp_host *host;
	int s, e, p;

2073 2074
	dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL);
	if (!dev_attr)
2075
		return;
2076

2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093
	if (ib_query_device(device, dev_attr)) {
		printk(KERN_WARNING PFX "Query device failed for %s\n",
		       device->name);
		goto free_attr;
	}

	srp_dev = kmalloc(sizeof *srp_dev, GFP_KERNEL);
	if (!srp_dev)
		goto free_attr;

	/*
	 * Use the smallest page size supported by the HCA, down to a
	 * minimum of 512 bytes (which is the smallest sector that a
	 * SCSI command will ever carry).
	 */
	srp_dev->fmr_page_shift = max(9, ffs(dev_attr->page_size_cap) - 1);
	srp_dev->fmr_page_size  = 1 << srp_dev->fmr_page_shift;
2094
	srp_dev->fmr_page_mask  = ~((u64) srp_dev->fmr_page_size - 1);
2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122

	INIT_LIST_HEAD(&srp_dev->dev_list);

	srp_dev->dev = device;
	srp_dev->pd  = ib_alloc_pd(device);
	if (IS_ERR(srp_dev->pd))
		goto free_dev;

	srp_dev->mr = ib_get_dma_mr(srp_dev->pd,
				    IB_ACCESS_LOCAL_WRITE |
				    IB_ACCESS_REMOTE_READ |
				    IB_ACCESS_REMOTE_WRITE);
	if (IS_ERR(srp_dev->mr))
		goto err_pd;

	memset(&fmr_param, 0, sizeof fmr_param);
	fmr_param.pool_size	    = SRP_FMR_POOL_SIZE;
	fmr_param.dirty_watermark   = SRP_FMR_DIRTY_SIZE;
	fmr_param.cache		    = 1;
	fmr_param.max_pages_per_fmr = SRP_FMR_SIZE;
	fmr_param.page_shift	    = srp_dev->fmr_page_shift;
	fmr_param.access	    = (IB_ACCESS_LOCAL_WRITE |
				       IB_ACCESS_REMOTE_WRITE |
				       IB_ACCESS_REMOTE_READ);

	srp_dev->fmr_pool = ib_create_fmr_pool(srp_dev->pd, &fmr_param);
	if (IS_ERR(srp_dev->fmr_pool))
		srp_dev->fmr_pool = NULL;
2123

T
Tom Tucker 已提交
2124
	if (device->node_type == RDMA_NODE_IB_SWITCH) {
2125 2126 2127 2128 2129 2130 2131 2132
		s = 0;
		e = 0;
	} else {
		s = 1;
		e = device->phys_port_cnt;
	}

	for (p = s; p <= e; ++p) {
2133
		host = srp_add_port(srp_dev, p);
2134
		if (host)
2135
			list_add_tail(&host->list, &srp_dev->dev_list);
2136 2137
	}

2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149
	ib_set_client_data(device, &srp_client, srp_dev);

	goto free_attr;

err_pd:
	ib_dealloc_pd(srp_dev->pd);

free_dev:
	kfree(srp_dev);

free_attr:
	kfree(dev_attr);
2150 2151 2152 2153
}

static void srp_remove_one(struct ib_device *device)
{
2154
	struct srp_device *srp_dev;
2155 2156 2157 2158
	struct srp_host *host, *tmp_host;
	LIST_HEAD(target_list);
	struct srp_target_port *target, *tmp_target;

2159
	srp_dev = ib_get_client_data(device, &srp_client);
2160

2161
	list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) {
2162
		device_unregister(&host->dev);
2163 2164 2165 2166 2167 2168 2169 2170 2171 2172
		/*
		 * Wait for the sysfs entry to go away, so that no new
		 * target ports can be created.
		 */
		wait_for_completion(&host->released);

		/*
		 * Mark all target ports as removed, so we stop queueing
		 * commands and don't try to reconnect.
		 */
2173
		spin_lock(&host->target_lock);
2174
		list_for_each_entry(target, &host->target_list, list) {
2175
			spin_lock_irq(&target->lock);
2176
			target->state = SRP_TARGET_REMOVED;
2177
			spin_unlock_irq(&target->lock);
2178
		}
2179
		spin_unlock(&host->target_lock);
2180 2181 2182 2183 2184 2185

		/*
		 * Wait for any reconnection tasks that may have
		 * started before we marked our target ports as
		 * removed, and any target port removal tasks.
		 */
T
Tejun Heo 已提交
2186
		flush_workqueue(ib_wq);
2187 2188 2189

		list_for_each_entry_safe(target, tmp_target,
					 &host->target_list, list) {
2190
			srp_remove_host(target->scsi_host);
2191
			scsi_remove_host(target->scsi_host);
2192 2193 2194 2195 2196 2197 2198 2199 2200
			srp_disconnect_target(target);
			ib_destroy_cm_id(target->cm_id);
			srp_free_target_ib(target);
			scsi_host_put(target->scsi_host);
		}

		kfree(host);
	}

2201 2202 2203 2204 2205 2206
	if (srp_dev->fmr_pool)
		ib_destroy_fmr_pool(srp_dev->fmr_pool);
	ib_dereg_mr(srp_dev->mr);
	ib_dealloc_pd(srp_dev->pd);

	kfree(srp_dev);
2207 2208
}

2209 2210 2211
static struct srp_function_template ib_srp_transport_functions = {
};

2212 2213 2214 2215
static int __init srp_init_module(void)
{
	int ret;

2216
	BUILD_BUG_ON(FIELD_SIZEOF(struct ib_wc, wr_id) < sizeof(void *));
2217

2218 2219 2220 2221 2222
	if (srp_sg_tablesize > 255) {
		printk(KERN_WARNING PFX "Clamping srp_sg_tablesize to 255\n");
		srp_sg_tablesize = 255;
	}

2223 2224 2225 2226 2227
	ib_srp_transport_template =
		srp_attach_transport(&ib_srp_transport_functions);
	if (!ib_srp_transport_template)
		return -ENOMEM;

2228 2229 2230 2231 2232
	srp_template.sg_tablesize = srp_sg_tablesize;
	srp_max_iu_len = (sizeof (struct srp_cmd) +
			  sizeof (struct srp_indirect_buf) +
			  srp_sg_tablesize * 16);

2233 2234 2235
	ret = class_register(&srp_class);
	if (ret) {
		printk(KERN_ERR PFX "couldn't register class infiniband_srp\n");
2236
		srp_release_transport(ib_srp_transport_template);
2237 2238 2239
		return ret;
	}

2240 2241
	ib_sa_register_client(&srp_sa_client);

2242 2243 2244
	ret = ib_register_client(&srp_client);
	if (ret) {
		printk(KERN_ERR PFX "couldn't register IB client\n");
2245
		srp_release_transport(ib_srp_transport_template);
2246
		ib_sa_unregister_client(&srp_sa_client);
2247 2248 2249 2250 2251 2252 2253 2254 2255 2256
		class_unregister(&srp_class);
		return ret;
	}

	return 0;
}

static void __exit srp_cleanup_module(void)
{
	ib_unregister_client(&srp_client);
2257
	ib_sa_unregister_client(&srp_sa_client);
2258
	class_unregister(&srp_class);
2259
	srp_release_transport(ib_srp_transport_template);
2260 2261 2262 2263
}

module_init(srp_init_module);
module_exit(srp_cleanup_module);