zfcp_fc.c 28.1 KB
Newer Older
1 2 3 4 5
/*
 * zfcp device driver
 *
 * Fibre Channel related functions for the zfcp device driver.
 *
6
 * Copyright IBM Corp. 2008, 2010
7 8
 */

9 10 11
#define KMSG_COMPONENT "zfcp"
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt

12
#include <linux/types.h>
13
#include <linux/slab.h>
14
#include <linux/utsname.h>
M
Martin Peschke 已提交
15
#include <linux/random.h>
16 17
#include <scsi/fc/fc_els.h>
#include <scsi/libfc.h>
18
#include "zfcp_ext.h"
19
#include "zfcp_fc.h"
20

21 22
struct kmem_cache *zfcp_fc_req_cache;

23 24 25 26 27
static u32 zfcp_fc_rscn_range_mask[] = {
	[ELS_ADDR_FMT_PORT]		= 0xFFFFFF,
	[ELS_ADDR_FMT_AREA]		= 0xFFFF00,
	[ELS_ADDR_FMT_DOM]		= 0xFF0000,
	[ELS_ADDR_FMT_FAB]		= 0x000000,
28 29
};

30 31 32 33 34
static bool no_auto_port_rescan;
module_param_named(no_auto_port_rescan, no_auto_port_rescan, bool, 0600);
MODULE_PARM_DESC(no_auto_port_rescan,
		 "no automatic port_rescan (default off)");

M
Martin Peschke 已提交
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
static unsigned int port_scan_backoff = 500;
module_param(port_scan_backoff, uint, 0600);
MODULE_PARM_DESC(port_scan_backoff,
	"upper limit of port scan random backoff in msecs (default 500)");

static unsigned int port_scan_ratelimit = 60000;
module_param(port_scan_ratelimit, uint, 0600);
MODULE_PARM_DESC(port_scan_ratelimit,
	"minimum interval between port scans in msecs (default 60000)");

unsigned int zfcp_fc_port_scan_backoff(void)
{
	if (!port_scan_backoff)
		return 0;
	return get_random_int() % port_scan_backoff;
}

static void zfcp_fc_port_scan_time(struct zfcp_adapter *adapter)
{
	unsigned long interval = msecs_to_jiffies(port_scan_ratelimit);
	unsigned long backoff = msecs_to_jiffies(zfcp_fc_port_scan_backoff());

	adapter->next_port_scan = jiffies + interval + backoff;
}

static void zfcp_fc_port_scan(struct zfcp_adapter *adapter)
{
	unsigned long now = jiffies;
	unsigned long next = adapter->next_port_scan;
	unsigned long delay = 0, max;

	/* delay only needed within waiting period */
	if (time_before(now, next)) {
		delay = next - now;
		/* paranoia: never ever delay scans longer than specified */
		max = msecs_to_jiffies(port_scan_ratelimit + port_scan_backoff);
		delay = min(delay, max);
	}

	queue_delayed_work(adapter->work_queue, &adapter->scan_work, delay);
}

77 78 79 80 81
void zfcp_fc_conditional_port_scan(struct zfcp_adapter *adapter)
{
	if (no_auto_port_rescan)
		return;

M
Martin Peschke 已提交
82
	zfcp_fc_port_scan(adapter);
83 84 85 86 87 88 89
}

void zfcp_fc_inverse_conditional_port_scan(struct zfcp_adapter *adapter)
{
	if (!no_auto_port_rescan)
		return;

M
Martin Peschke 已提交
90
	zfcp_fc_port_scan(adapter);
91 92
}

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
/**
 * zfcp_fc_post_event - post event to userspace via fc_transport
 * @work: work struct with enqueued events
 */
void zfcp_fc_post_event(struct work_struct *work)
{
	struct zfcp_fc_event *event = NULL, *tmp = NULL;
	LIST_HEAD(tmp_lh);
	struct zfcp_fc_events *events = container_of(work,
					struct zfcp_fc_events, work);
	struct zfcp_adapter *adapter = container_of(events, struct zfcp_adapter,
						events);

	spin_lock_bh(&events->list_lock);
	list_splice_init(&events->list, &tmp_lh);
	spin_unlock_bh(&events->list_lock);

	list_for_each_entry_safe(event, tmp, &tmp_lh, list) {
		fc_host_post_event(adapter->scsi_host, fc_get_event_number(),
				event->code, event->data);
		list_del(&event->list);
		kfree(event);
	}

}

/**
 * zfcp_fc_enqueue_event - safely enqueue FC HBA API event from irq context
 * @adapter: The adapter where to enqueue the event
 * @event_code: The event code (as defined in fc_host_event_code in
 *		scsi_transport_fc.h)
 * @event_data: The event data (e.g. n_port page in case of els)
 */
void zfcp_fc_enqueue_event(struct zfcp_adapter *adapter,
			enum fc_host_event_code event_code, u32 event_data)
{
	struct zfcp_fc_event *event;

	event = kmalloc(sizeof(struct zfcp_fc_event), GFP_ATOMIC);
	if (!event)
		return;

	event->code = event_code;
	event->data = event_data;

	spin_lock(&adapter->events.list_lock);
	list_add_tail(&event->list, &adapter->events.list);
	spin_unlock(&adapter->events.list_lock);

	queue_work(adapter->work_queue, &adapter->events.work);
}

145
static int zfcp_fc_wka_port_get(struct zfcp_fc_wka_port *wka_port)
146 147 148 149
{
	if (mutex_lock_interruptible(&wka_port->mutex))
		return -ERESTARTSYS;

150 151 152
	if (wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE ||
	    wka_port->status == ZFCP_FC_WKA_PORT_CLOSING) {
		wka_port->status = ZFCP_FC_WKA_PORT_OPENING;
153
		if (zfcp_fsf_open_wka_port(wka_port))
154
			wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
155 156 157 158
	}

	mutex_unlock(&wka_port->mutex);

159
	wait_event(wka_port->completion_wq,
160 161
		   wka_port->status == ZFCP_FC_WKA_PORT_ONLINE ||
		   wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE);
162

163
	if (wka_port->status == ZFCP_FC_WKA_PORT_ONLINE) {
164 165 166 167 168 169
		atomic_inc(&wka_port->refcount);
		return 0;
	}
	return -EIO;
}

170
static void zfcp_fc_wka_port_offline(struct work_struct *work)
171
{
172
	struct delayed_work *dw = to_delayed_work(work);
173 174
	struct zfcp_fc_wka_port *wka_port =
			container_of(dw, struct zfcp_fc_wka_port, work);
175 176 177

	mutex_lock(&wka_port->mutex);
	if ((atomic_read(&wka_port->refcount) != 0) ||
178
	    (wka_port->status != ZFCP_FC_WKA_PORT_ONLINE))
179 180
		goto out;

181
	wka_port->status = ZFCP_FC_WKA_PORT_CLOSING;
182
	if (zfcp_fsf_close_wka_port(wka_port)) {
183
		wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
184 185 186 187 188 189
		wake_up(&wka_port->completion_wq);
	}
out:
	mutex_unlock(&wka_port->mutex);
}

190
static void zfcp_fc_wka_port_put(struct zfcp_fc_wka_port *wka_port)
191 192 193
{
	if (atomic_dec_return(&wka_port->refcount) != 0)
		return;
194
	/* wait 10 milliseconds, other reqs might pop in */
195 196 197
	schedule_delayed_work(&wka_port->work, HZ / 100);
}

198
static void zfcp_fc_wka_port_init(struct zfcp_fc_wka_port *wka_port, u32 d_id,
199
				  struct zfcp_adapter *adapter)
200 201 202 203
{
	init_waitqueue_head(&wka_port->completion_wq);

	wka_port->adapter = adapter;
204
	wka_port->d_id = d_id;
205

206
	wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
207 208
	atomic_set(&wka_port->refcount, 0);
	mutex_init(&wka_port->mutex);
209
	INIT_DELAYED_WORK(&wka_port->work, zfcp_fc_wka_port_offline);
210 211
}

212
static void zfcp_fc_wka_port_force_offline(struct zfcp_fc_wka_port *wka)
213 214 215
{
	cancel_delayed_work_sync(&wka->work);
	mutex_lock(&wka->mutex);
216
	wka->status = ZFCP_FC_WKA_PORT_OFFLINE;
217 218 219
	mutex_unlock(&wka->mutex);
}

220
void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *gs)
221
{
222 223
	if (!gs)
		return;
224 225 226 227 228 229
	zfcp_fc_wka_port_force_offline(&gs->ms);
	zfcp_fc_wka_port_force_offline(&gs->ts);
	zfcp_fc_wka_port_force_offline(&gs->ds);
	zfcp_fc_wka_port_force_offline(&gs->as);
}

230
static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
231
				   struct fc_els_rscn_page *page)
232 233
{
	unsigned long flags;
234
	struct zfcp_adapter *adapter = fsf_req->adapter;
235 236
	struct zfcp_port *port;

237 238
	read_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry(port, &adapter->port_list, list) {
239
		if ((port->d_id & range) == (ntoh24(page->rscn_fid) & range))
240
			zfcp_fc_test_link(port);
241 242 243
		if (!port->d_id)
			zfcp_erp_port_reopen(port,
					     ZFCP_STATUS_COMMON_ERP_FAILED,
244
					     "fcrscn1");
245
	}
246
	read_unlock_irqrestore(&adapter->port_list_lock, flags);
247 248 249 250 251
}

static void zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req)
{
	struct fsf_status_read_buffer *status_buffer = (void *)fsf_req->data;
252 253
	struct fc_els_rscn *head;
	struct fc_els_rscn_page *page;
254 255
	u16 i;
	u16 no_entries;
256
	unsigned int afmt;
257

258 259
	head = (struct fc_els_rscn *) status_buffer->payload.data;
	page = (struct fc_els_rscn_page *) head;
260 261

	/* see FC-FS */
262
	no_entries = head->rscn_plen / sizeof(struct fc_els_rscn_page);
263 264 265

	for (i = 1; i < no_entries; i++) {
		/* skip head and start with 1st element */
266 267 268 269
		page++;
		afmt = page->rscn_page_flags & ELS_RSCN_ADDR_FMT_MASK;
		_zfcp_fc_incoming_rscn(fsf_req, zfcp_fc_rscn_range_mask[afmt],
				       page);
270 271
		zfcp_fc_enqueue_event(fsf_req->adapter, FCH_EVT_RSCN,
				      *(u32 *)page);
272
	}
273
	zfcp_fc_conditional_port_scan(fsf_req->adapter);
274 275
}

276
static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, u64 wwpn)
277
{
278
	unsigned long flags;
279 280 281
	struct zfcp_adapter *adapter = req->adapter;
	struct zfcp_port *port;

282 283 284
	read_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry(port, &adapter->port_list, list)
		if (port->wwpn == wwpn) {
285
			zfcp_erp_port_forced_reopen(port, 0, "fciwwp1");
286
			break;
287 288
		}
	read_unlock_irqrestore(&adapter->port_list_lock, flags);
289 290 291 292
}

static void zfcp_fc_incoming_plogi(struct zfcp_fsf_req *req)
{
293 294
	struct fsf_status_read_buffer *status_buffer;
	struct fc_els_flogi *plogi;
295

296 297 298
	status_buffer = (struct fsf_status_read_buffer *) req->data;
	plogi = (struct fc_els_flogi *) status_buffer->payload.data;
	zfcp_fc_incoming_wwpn(req, plogi->fl_wwpn);
299 300 301 302 303 304
}

static void zfcp_fc_incoming_logo(struct zfcp_fsf_req *req)
{
	struct fsf_status_read_buffer *status_buffer =
		(struct fsf_status_read_buffer *)req->data;
305 306
	struct fc_els_logo *logo =
		(struct fc_els_logo *) status_buffer->payload.data;
307

308
	zfcp_fc_incoming_wwpn(req, logo->fl_n_port_wwn);
309 310 311 312 313 314 315 316 317 318
}

/**
 * zfcp_fc_incoming_els - handle incoming ELS
 * @fsf_req - request which contains incoming ELS
 */
void zfcp_fc_incoming_els(struct zfcp_fsf_req *fsf_req)
{
	struct fsf_status_read_buffer *status_buffer =
		(struct fsf_status_read_buffer *) fsf_req->data;
S
Swen Schillig 已提交
319
	unsigned int els_type = status_buffer->payload.data[0];
320

321
	zfcp_dbf_san_in_els("fciels1", fsf_req);
322
	if (els_type == ELS_PLOGI)
323
		zfcp_fc_incoming_plogi(fsf_req);
324
	else if (els_type == ELS_LOGO)
325
		zfcp_fc_incoming_logo(fsf_req);
326
	else if (els_type == ELS_RSCN)
327 328 329
		zfcp_fc_incoming_rscn(fsf_req);
}

330
static void zfcp_fc_ns_gid_pn_eval(struct zfcp_fc_req *fc_req)
331
{
332 333
	struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els;
	struct zfcp_fc_gid_pn_rsp *gid_pn_rsp = &fc_req->u.gid_pn.rsp;
334

335
	if (ct_els->status)
336
		return;
337
	if (gid_pn_rsp->ct_hdr.ct_cmd != FC_FS_ACC)
338
		return;
339

340
	/* looks like a valid d_id */
341
	ct_els->port->d_id = ntoh24(gid_pn_rsp->gid_pn.fp_fid);
342 343
}

344 345 346 347 348
static void zfcp_fc_complete(void *data)
{
	complete(data);
}

349 350 351 352 353 354 355 356 357
static void zfcp_fc_ct_ns_init(struct fc_ct_hdr *ct_hdr, u16 cmd, u16 mr_size)
{
	ct_hdr->ct_rev = FC_CT_REV;
	ct_hdr->ct_fs_type = FC_FST_DIR;
	ct_hdr->ct_fs_subtype = FC_NS_SUBTYPE;
	ct_hdr->ct_cmd = cmd;
	ct_hdr->ct_mr_size = mr_size / 4;
}

358
static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port,
359
				     struct zfcp_fc_req *fc_req)
360
{
361
	struct zfcp_adapter *adapter = port->adapter;
362
	DECLARE_COMPLETION_ONSTACK(completion);
363 364
	struct zfcp_fc_gid_pn_req *gid_pn_req = &fc_req->u.gid_pn.req;
	struct zfcp_fc_gid_pn_rsp *gid_pn_rsp = &fc_req->u.gid_pn.rsp;
365
	int ret;
366 367

	/* setup parameters for send generic command */
368 369 370 371 372 373 374 375 376 377 378 379 380
	fc_req->ct_els.port = port;
	fc_req->ct_els.handler = zfcp_fc_complete;
	fc_req->ct_els.handler_data = &completion;
	fc_req->ct_els.req = &fc_req->sg_req;
	fc_req->ct_els.resp = &fc_req->sg_rsp;
	sg_init_one(&fc_req->sg_req, gid_pn_req, sizeof(*gid_pn_req));
	sg_init_one(&fc_req->sg_rsp, gid_pn_rsp, sizeof(*gid_pn_rsp));

	zfcp_fc_ct_ns_init(&gid_pn_req->ct_hdr,
			   FC_NS_GID_PN, ZFCP_FC_CT_SIZE_PAGE);
	gid_pn_req->gid_pn.fn_wwpn = port->wwpn;

	ret = zfcp_fsf_send_ct(&adapter->gs->ds, &fc_req->ct_els,
381 382
			       adapter->pool.gid_pn_req,
			       ZFCP_FC_CTELS_TMO);
383 384
	if (!ret) {
		wait_for_completion(&completion);
385
		zfcp_fc_ns_gid_pn_eval(fc_req);
386
	}
387 388 389 390
	return ret;
}

/**
391
 * zfcp_fc_ns_gid_pn - initiate GID_PN nameserver request
392
 * @port: port where GID_PN request is needed
393 394
 * return: -ENOMEM on error, 0 otherwise
 */
395
static int zfcp_fc_ns_gid_pn(struct zfcp_port *port)
396 397
{
	int ret;
398
	struct zfcp_fc_req *fc_req;
399
	struct zfcp_adapter *adapter = port->adapter;
400

401 402
	fc_req = mempool_alloc(adapter->pool.gid_pn, GFP_ATOMIC);
	if (!fc_req)
403 404
		return -ENOMEM;

405
	memset(fc_req, 0, sizeof(*fc_req));
406

407
	ret = zfcp_fc_wka_port_get(&adapter->gs->ds);
408
	if (ret)
409 410
		goto out;

411
	ret = zfcp_fc_ns_gid_pn_request(port, fc_req);
412

413
	zfcp_fc_wka_port_put(&adapter->gs->ds);
414
out:
415
	mempool_free(fc_req, adapter->pool.gid_pn);
416 417 418
	return ret;
}

419 420 421 422 423 424 425 426 427
void zfcp_fc_port_did_lookup(struct work_struct *work)
{
	int ret;
	struct zfcp_port *port = container_of(work, struct zfcp_port,
					      gid_pn_work);

	ret = zfcp_fc_ns_gid_pn(port);
	if (ret) {
		/* could not issue gid_pn for some reason */
428
		zfcp_erp_adapter_reopen(port->adapter, 0, "fcgpn_1");
429 430 431 432
		goto out;
	}

	if (!port->d_id) {
433
		zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED);
434 435 436
		goto out;
	}

437
	zfcp_erp_port_reopen(port, 0, "fcgpn_3");
438
out:
439
	put_device(&port->dev);
440 441
}

442 443 444 445 446 447
/**
 * zfcp_fc_trigger_did_lookup - trigger the d_id lookup using a GID_PN request
 * @port: The zfcp_port to lookup the d_id for.
 */
void zfcp_fc_trigger_did_lookup(struct zfcp_port *port)
{
448
	get_device(&port->dev);
449
	if (!queue_work(port->adapter->work_queue, &port->gid_pn_work))
450
		put_device(&port->dev);
451 452
}

453 454 455 456 457 458 459
/**
 * zfcp_fc_plogi_evaluate - evaluate PLOGI playload
 * @port: zfcp_port structure
 * @plogi: plogi payload
 *
 * Evaluate PLOGI playload and copy important fields into zfcp_port structure
 */
460
void zfcp_fc_plogi_evaluate(struct zfcp_port *port, struct fc_els_flogi *plogi)
461
{
462 463 464 465 466 467 468 469 470 471 472 473 474 475
	if (plogi->fl_wwpn != port->wwpn) {
		port->d_id = 0;
		dev_warn(&port->adapter->ccw_device->dev,
			 "A port opened with WWPN 0x%016Lx returned data that "
			 "identifies it as WWPN 0x%016Lx\n",
			 (unsigned long long) port->wwpn,
			 (unsigned long long) plogi->fl_wwpn);
		return;
	}

	port->wwnn = plogi->fl_wwnn;
	port->maxframe_size = plogi->fl_csp.sp_bb_data;

	if (plogi->fl_cssp[0].cp_class & FC_CPC_VALID)
476
		port->supported_classes |= FC_COS_CLASS1;
477
	if (plogi->fl_cssp[1].cp_class & FC_CPC_VALID)
478
		port->supported_classes |= FC_COS_CLASS2;
479
	if (plogi->fl_cssp[2].cp_class & FC_CPC_VALID)
480
		port->supported_classes |= FC_COS_CLASS3;
481
	if (plogi->fl_cssp[3].cp_class & FC_CPC_VALID)
482 483 484
		port->supported_classes |= FC_COS_CLASS4;
}

485
static void zfcp_fc_adisc_handler(void *data)
486
{
487 488 489
	struct zfcp_fc_req *fc_req = data;
	struct zfcp_port *port = fc_req->ct_els.port;
	struct fc_els_adisc *adisc_resp = &fc_req->u.adisc.rsp;
490

491
	if (fc_req->ct_els.status) {
492
		/* request rejected or timed out */
493
		zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
494
					    "fcadh_1");
495 496 497 498
		goto out;
	}

	if (!port->wwnn)
499
		port->wwnn = adisc_resp->adisc_wwnn;
500

501
	if ((port->wwpn != adisc_resp->adisc_wwpn) ||
502
	    !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)) {
503
		zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
504
				     "fcadh_2");
505 506
		goto out;
	}
507

508 509
	/* port is good, unblock rport without going through erp */
	zfcp_scsi_schedule_rport_register(port);
510
 out:
511
	atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
512
	put_device(&port->dev);
513
	kmem_cache_free(zfcp_fc_req_cache, fc_req);
514 515 516 517
}

static int zfcp_fc_adisc(struct zfcp_port *port)
{
518
	struct zfcp_fc_req *fc_req;
519
	struct zfcp_adapter *adapter = port->adapter;
520
	struct Scsi_Host *shost = adapter->scsi_host;
521
	int ret;
522

523 524
	fc_req = kmem_cache_zalloc(zfcp_fc_req_cache, GFP_ATOMIC);
	if (!fc_req)
525 526
		return -ENOMEM;

527 528 529 530
	fc_req->ct_els.port = port;
	fc_req->ct_els.req = &fc_req->sg_req;
	fc_req->ct_els.resp = &fc_req->sg_rsp;
	sg_init_one(&fc_req->sg_req, &fc_req->u.adisc.req,
531
		    sizeof(struct fc_els_adisc));
532
	sg_init_one(&fc_req->sg_rsp, &fc_req->u.adisc.rsp,
533
		    sizeof(struct fc_els_adisc));
534

535 536
	fc_req->ct_els.handler = zfcp_fc_adisc_handler;
	fc_req->ct_els.handler_data = fc_req;
537 538 539

	/* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports
	   without FC-AL-2 capability, so we don't set it */
540 541 542 543
	fc_req->u.adisc.req.adisc_wwpn = fc_host_port_name(shost);
	fc_req->u.adisc.req.adisc_wwnn = fc_host_node_name(shost);
	fc_req->u.adisc.req.adisc_cmd = ELS_ADISC;
	hton24(fc_req->u.adisc.req.adisc_port_id, fc_host_port_id(shost));
544

545
	ret = zfcp_fsf_send_els(adapter, port->d_id, &fc_req->ct_els,
546
				ZFCP_FC_CTELS_TMO);
547
	if (ret)
548
		kmem_cache_free(zfcp_fc_req_cache, fc_req);
549 550

	return ret;
551 552
}

553
void zfcp_fc_link_test_work(struct work_struct *work)
554
{
555 556
	struct zfcp_port *port =
		container_of(work, struct zfcp_port, test_link_work);
557 558
	int retval;

559
	get_device(&port->dev);
560 561 562
	port->rport_task = RPORT_DEL;
	zfcp_scsi_rport_work(&port->rport_work);

563 564 565 566
	/* only issue one test command at one time per port */
	if (atomic_read(&port->status) & ZFCP_STATUS_PORT_LINK_TEST)
		goto out;

567
	atomic_or(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
568

569
	retval = zfcp_fc_adisc(port);
570
	if (retval == 0)
571 572 573
		return;

	/* send of ADISC was not possible */
574
	atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
575
	zfcp_erp_port_forced_reopen(port, 0, "fcltwk1");
576

577
out:
578
	put_device(&port->dev);
579
}
580

581
/**
582
 * zfcp_fc_test_link - lightweight link test procedure
583 584 585 586 587 588
 * @port: port to be tested
 *
 * Test status of a link to a remote port using the ELS command ADISC.
 * If there is a problem with the remote port, error recovery steps
 * will be triggered.
 */
589
void zfcp_fc_test_link(struct zfcp_port *port)
590
{
591
	get_device(&port->dev);
592
	if (!queue_work(port->adapter->work_queue, &port->test_link_work))
593
		put_device(&port->dev);
594 595
}

596
static struct zfcp_fc_req *zfcp_alloc_sg_env(int buf_num)
597
{
598
	struct zfcp_fc_req *fc_req;
599

600 601
	fc_req = kmem_cache_zalloc(zfcp_fc_req_cache, GFP_KERNEL);
	if (!fc_req)
602 603
		return NULL;

604 605 606
	if (zfcp_sg_setup_table(&fc_req->sg_rsp, buf_num)) {
		kmem_cache_free(zfcp_fc_req_cache, fc_req);
		return NULL;
607 608
	}

609 610
	sg_init_one(&fc_req->sg_req, &fc_req->u.gpn_ft.req,
		    sizeof(struct zfcp_fc_gpn_ft_req));
611

612 613
	return fc_req;
}
614

615
static int zfcp_fc_send_gpn_ft(struct zfcp_fc_req *fc_req,
616
			       struct zfcp_adapter *adapter, int max_bytes)
617
{
618 619
	struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els;
	struct zfcp_fc_gpn_ft_req *req = &fc_req->u.gpn_ft.req;
620
	DECLARE_COMPLETION_ONSTACK(completion);
621 622
	int ret;

623
	zfcp_fc_ct_ns_init(&req->ct_hdr, FC_NS_GPN_FT, max_bytes);
624
	req->gpn_ft.fn_fc4_type = FC_TYPE_FCP;
625

626 627 628 629
	ct_els->handler = zfcp_fc_complete;
	ct_els->handler_data = &completion;
	ct_els->req = &fc_req->sg_req;
	ct_els->resp = &fc_req->sg_rsp;
630

631
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct_els, NULL,
632
			       ZFCP_FC_CTELS_TMO);
633
	if (!ret)
634
		wait_for_completion(&completion);
635 636 637
	return ret;
}

638
static void zfcp_fc_validate_port(struct zfcp_port *port, struct list_head *lh)
639
{
640 641 642
	if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC))
		return;

643
	atomic_andnot(ZFCP_STATUS_COMMON_NOESC, &port->status);
644

645
	if ((port->supported_classes != 0) ||
646
	    !list_empty(&port->unit_list))
647
		return;
648 649

	list_move_tail(&port->list, lh);
650 651
}

652
static int zfcp_fc_eval_gpn_ft(struct zfcp_fc_req *fc_req,
653
			       struct zfcp_adapter *adapter, int max_entries)
654
{
655 656
	struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els;
	struct scatterlist *sg = &fc_req->sg_rsp;
657 658
	struct fc_ct_hdr *hdr = sg_virt(sg);
	struct fc_gpn_ft_resp *acc = sg_virt(sg);
659
	struct zfcp_port *port, *tmp;
660
	unsigned long flags;
661
	LIST_HEAD(remove_lh);
662
	u32 d_id;
663
	int ret = 0, x, last = 0;
664

665
	if (ct_els->status)
666 667
		return -EIO;

668 669
	if (hdr->ct_cmd != FC_FS_ACC) {
		if (hdr->ct_reason == FC_BA_RJT_UNABLE)
670 671 672 673
			return -EAGAIN; /* might be a temporary condition */
		return -EIO;
	}

674
	if (hdr->ct_mr_size) {
675 676
		dev_warn(&adapter->ccw_device->dev,
			 "The name server reported %d words residual data\n",
677
			 hdr->ct_mr_size);
678
		return -E2BIG;
679
	}
680 681

	/* first entry is the header */
682
	for (x = 1; x < max_entries && !last; x++) {
683
		if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1))
684 685 686 687
			acc++;
		else
			acc = sg_virt(++sg);

688 689
		last = acc->fp_flags & FC_NS_FID_LAST;
		d_id = ntoh24(acc->fp_fid);
690

691
		/* don't attach ports with a well known address */
692
		if (d_id >= FC_FID_WELL_KNOWN_BASE)
693
			continue;
694
		/* skip the adapter's port and known remote ports */
695
		if (acc->fp_wwpn == fc_host_port_name(adapter->scsi_host))
696 697
			continue;

698
		port = zfcp_port_enqueue(adapter, acc->fp_wwpn,
699
					 ZFCP_STATUS_COMMON_NOESC, d_id);
700
		if (!IS_ERR(port))
701
			zfcp_erp_port_reopen(port, 0, "fcegpf1");
702 703
		else if (PTR_ERR(port) != -EEXIST)
			ret = PTR_ERR(port);
704 705 706
	}

	zfcp_erp_wait(adapter);
707 708
	write_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry_safe(port, tmp, &adapter->port_list, list)
709
		zfcp_fc_validate_port(port, &remove_lh);
710
	write_unlock_irqrestore(&adapter->port_list_lock, flags);
711 712

	list_for_each_entry_safe(port, tmp, &remove_lh, list) {
713
		zfcp_erp_port_shutdown(port, 0, "fcegpf2");
714
		device_unregister(&port->dev);
715 716
	}

717 718 719 720
	return ret;
}

/**
721
 * zfcp_fc_scan_ports - scan remote ports and attach new ports
722
 * @work: reference to scheduled work
723
 */
724
void zfcp_fc_scan_ports(struct work_struct *work)
725
{
M
Martin Peschke 已提交
726 727
	struct delayed_work *dw = to_delayed_work(work);
	struct zfcp_adapter *adapter = container_of(dw, struct zfcp_adapter,
728
						    scan_work);
729
	int ret, i;
730
	struct zfcp_fc_req *fc_req;
731 732
	int chain, max_entries, buf_num, max_bytes;

M
Martin Peschke 已提交
733 734
	zfcp_fc_port_scan_time(adapter);

735
	chain = adapter->adapter_features & FSF_FEATURE_ELS_CT_CHAINED_SBALS;
736 737 738
	buf_num = chain ? ZFCP_FC_GPN_FT_NUM_BUFS : 1;
	max_entries = chain ? ZFCP_FC_GPN_FT_MAX_ENT : ZFCP_FC_GPN_FT_ENT_PAGE;
	max_bytes = chain ? ZFCP_FC_GPN_FT_MAX_SIZE : ZFCP_FC_CT_SIZE_PAGE;
739

740 741
	if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
	    fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
742
		return;
743

744 745
	if (zfcp_fc_wka_port_get(&adapter->gs->ds))
		return;
746

747 748
	fc_req = zfcp_alloc_sg_env(buf_num);
	if (!fc_req)
749
		goto out;
750 751

	for (i = 0; i < 3; i++) {
752
		ret = zfcp_fc_send_gpn_ft(fc_req, adapter, max_bytes);
753
		if (!ret) {
754
			ret = zfcp_fc_eval_gpn_ft(fc_req, adapter, max_entries);
755 756 757 758 759 760
			if (ret == -EAGAIN)
				ssleep(1);
			else
				break;
		}
	}
761 762
	zfcp_sg_free_table(&fc_req->sg_rsp, buf_num);
	kmem_cache_free(zfcp_fc_req_cache, fc_req);
763
out:
764
	zfcp_fc_wka_port_put(&adapter->gs->ds);
765 766
}

767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
static int zfcp_fc_gspn(struct zfcp_adapter *adapter,
			struct zfcp_fc_req *fc_req)
{
	DECLARE_COMPLETION_ONSTACK(completion);
	char devno[] = "DEVNO:";
	struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els;
	struct zfcp_fc_gspn_req *gspn_req = &fc_req->u.gspn.req;
	struct zfcp_fc_gspn_rsp *gspn_rsp = &fc_req->u.gspn.rsp;
	int ret;

	zfcp_fc_ct_ns_init(&gspn_req->ct_hdr, FC_NS_GSPN_ID,
			   FC_SYMBOLIC_NAME_SIZE);
	hton24(gspn_req->gspn.fp_fid, fc_host_port_id(adapter->scsi_host));

	sg_init_one(&fc_req->sg_req, gspn_req, sizeof(*gspn_req));
	sg_init_one(&fc_req->sg_rsp, gspn_rsp, sizeof(*gspn_rsp));

	ct_els->handler = zfcp_fc_complete;
	ct_els->handler_data = &completion;
	ct_els->req = &fc_req->sg_req;
	ct_els->resp = &fc_req->sg_rsp;

	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct_els, NULL,
			       ZFCP_FC_CTELS_TMO);
	if (ret)
		return ret;

	wait_for_completion(&completion);
	if (ct_els->status)
		return ct_els->status;

	if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_NPIV &&
	    !(strstr(gspn_rsp->gspn.fp_name, devno)))
		snprintf(fc_host_symbolic_name(adapter->scsi_host),
			 FC_SYMBOLIC_NAME_SIZE, "%s%s %s NAME: %s",
			 gspn_rsp->gspn.fp_name, devno,
			 dev_name(&adapter->ccw_device->dev),
			 init_utsname()->nodename);
	else
		strlcpy(fc_host_symbolic_name(adapter->scsi_host),
			gspn_rsp->gspn.fp_name, FC_SYMBOLIC_NAME_SIZE);

	return 0;
}

static void zfcp_fc_rspn(struct zfcp_adapter *adapter,
			 struct zfcp_fc_req *fc_req)
{
	DECLARE_COMPLETION_ONSTACK(completion);
	struct Scsi_Host *shost = adapter->scsi_host;
	struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els;
	struct zfcp_fc_rspn_req *rspn_req = &fc_req->u.rspn.req;
	struct fc_ct_hdr *rspn_rsp = &fc_req->u.rspn.rsp;
	int ret, len;

	zfcp_fc_ct_ns_init(&rspn_req->ct_hdr, FC_NS_RSPN_ID,
			   FC_SYMBOLIC_NAME_SIZE);
	hton24(rspn_req->rspn.fr_fid.fp_fid, fc_host_port_id(shost));
	len = strlcpy(rspn_req->rspn.fr_name, fc_host_symbolic_name(shost),
		      FC_SYMBOLIC_NAME_SIZE);
	rspn_req->rspn.fr_name_len = len;

	sg_init_one(&fc_req->sg_req, rspn_req, sizeof(*rspn_req));
	sg_init_one(&fc_req->sg_rsp, rspn_rsp, sizeof(*rspn_rsp));

	ct_els->handler = zfcp_fc_complete;
	ct_els->handler_data = &completion;
	ct_els->req = &fc_req->sg_req;
	ct_els->resp = &fc_req->sg_rsp;

	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct_els, NULL,
			       ZFCP_FC_CTELS_TMO);
	if (!ret)
		wait_for_completion(&completion);
}

/**
 * zfcp_fc_sym_name_update - Retrieve and update the symbolic port name
 * @work: ns_up_work of the adapter where to update the symbolic port name
 *
 * Retrieve the current symbolic port name that may have been set by
 * the hardware using the GSPN request and update the fc_host
 * symbolic_name sysfs attribute. When running in NPIV mode (and hence
 * the port name is unique for this system), update the symbolic port
 * name to add Linux specific information and update the FC nameserver
 * using the RSPN request.
 */
void zfcp_fc_sym_name_update(struct work_struct *work)
{
	struct zfcp_adapter *adapter = container_of(work, struct zfcp_adapter,
						    ns_up_work);
	int ret;
	struct zfcp_fc_req *fc_req;

	if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
	    fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
		return;

	fc_req = kmem_cache_zalloc(zfcp_fc_req_cache, GFP_KERNEL);
	if (!fc_req)
		return;

	ret = zfcp_fc_wka_port_get(&adapter->gs->ds);
	if (ret)
		goto out_free;

	ret = zfcp_fc_gspn(adapter, fc_req);
	if (ret || fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
		goto out_ds_put;

	memset(fc_req, 0, sizeof(*fc_req));
	zfcp_fc_rspn(adapter, fc_req);

out_ds_put:
	zfcp_fc_wka_port_put(&adapter->gs->ds);
out_free:
	kmem_cache_free(zfcp_fc_req_cache, fc_req);
}

886
static void zfcp_fc_ct_els_job_handler(void *data)
887
{
888 889
	struct fc_bsg_job *job = data;
	struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data;
890
	struct fc_bsg_reply *jr = job->reply;
891

892 893 894
	jr->reply_payload_rcv_len = job->reply_payload.payload_len;
	jr->reply_data.ctels_reply.status = FC_CTELS_STATUS_OK;
	jr->result = zfcp_ct_els->status ? -EIO : 0;
895 896 897
	job->job_done(job);
}

898 899 900 901 902
static struct zfcp_fc_wka_port *zfcp_fc_job_wka_port(struct fc_bsg_job *job)
{
	u32 preamble_word1;
	u8 gs_type;
	struct zfcp_adapter *adapter;
903
	struct fc_bsg_request *bsg_request = job->request;
904

905
	preamble_word1 = bsg_request->rqst_data.r_ct.preamble_word1;
906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
	gs_type = (preamble_word1 & 0xff000000) >> 24;

	adapter = (struct zfcp_adapter *) job->shost->hostdata[0];

	switch (gs_type) {
	case FC_FST_ALIAS:
		return &adapter->gs->as;
	case FC_FST_MGMT:
		return &adapter->gs->ms;
	case FC_FST_TIME:
		return &adapter->gs->ts;
		break;
	case FC_FST_DIR:
		return &adapter->gs->ds;
		break;
	default:
		return NULL;
	}
}

static void zfcp_fc_ct_job_handler(void *data)
{
	struct fc_bsg_job *job = data;
	struct zfcp_fc_wka_port *wka_port;

	wka_port = zfcp_fc_job_wka_port(job);
	zfcp_fc_wka_port_put(wka_port);

	zfcp_fc_ct_els_job_handler(data);
}

937 938
static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
				struct zfcp_adapter *adapter)
939
{
940
	struct zfcp_fsf_ct_els *els = job->dd_data;
941
	struct fc_rport *rport = job->rport;
942
	struct fc_bsg_request *bsg_request = job->request;
943
	struct zfcp_port *port;
944
	u32 d_id;
945 946

	if (rport) {
947
		port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
948
		if (!port)
949
			return -EINVAL;
950

951
		d_id = port->d_id;
952
		put_device(&port->dev);
953
	} else
954
		d_id = ntoh24(bsg_request->rqst_data.h_els.port_id);
955

956
	els->handler = zfcp_fc_ct_els_job_handler;
957
	return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ);
958 959
}

960 961
static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
			       struct zfcp_adapter *adapter)
962 963
{
	int ret;
964 965
	struct zfcp_fsf_ct_els *ct = job->dd_data;
	struct zfcp_fc_wka_port *wka_port;
966

967 968 969
	wka_port = zfcp_fc_job_wka_port(job);
	if (!wka_port)
		return -EINVAL;
970

971 972
	ret = zfcp_fc_wka_port_get(wka_port);
	if (ret)
973 974
		return ret;

975
	ct->handler = zfcp_fc_ct_job_handler;
976
	ret = zfcp_fsf_send_ct(wka_port, ct, NULL, job->req->timeout / HZ);
977 978
	if (ret)
		zfcp_fc_wka_port_put(wka_port);
979 980 981

	return ret;
}
982

983 984 985 986 987
int zfcp_fc_exec_bsg_job(struct fc_bsg_job *job)
{
	struct Scsi_Host *shost;
	struct zfcp_adapter *adapter;
	struct zfcp_fsf_ct_els *ct_els = job->dd_data;
988
	struct fc_bsg_request *bsg_request = job->request;
989 990 991 992 993 994 995 996 997 998 999

	shost = job->rport ? rport_to_shost(job->rport) : job->shost;
	adapter = (struct zfcp_adapter *)shost->hostdata[0];

	if (!(atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_OPEN))
		return -EINVAL;

	ct_els->req = job->request_payload.sg_list;
	ct_els->resp = job->reply_payload.sg_list;
	ct_els->handler_data = job;

1000
	switch (bsg_request->msgcode) {
1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
	case FC_BSG_RPT_ELS:
	case FC_BSG_HST_ELS_NOLOGIN:
		return zfcp_fc_exec_els_job(job, adapter);
	case FC_BSG_RPT_CT:
	case FC_BSG_HST_CT:
		return zfcp_fc_exec_ct_job(job, adapter);
	default:
		return -EINVAL;
	}
}

1012 1013 1014 1015 1016 1017
int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job)
{
	/* hardware tracks timeout, reset bsg timeout to not interfere */
	return -EAGAIN;
}

1018 1019
int zfcp_fc_gs_setup(struct zfcp_adapter *adapter)
{
1020
	struct zfcp_fc_wka_ports *wka_ports;
1021

1022
	wka_ports = kzalloc(sizeof(struct zfcp_fc_wka_ports), GFP_KERNEL);
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
	if (!wka_ports)
		return -ENOMEM;

	adapter->gs = wka_ports;
	zfcp_fc_wka_port_init(&wka_ports->ms, FC_FID_MGMT_SERV, adapter);
	zfcp_fc_wka_port_init(&wka_ports->ts, FC_FID_TIME_SERV, adapter);
	zfcp_fc_wka_port_init(&wka_ports->ds, FC_FID_DIR_SERV, adapter);
	zfcp_fc_wka_port_init(&wka_ports->as, FC_FID_ALIASES, adapter);

	return 0;
}

void zfcp_fc_gs_destroy(struct zfcp_adapter *adapter)
{
	kfree(adapter->gs);
	adapter->gs = NULL;
}