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

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

12 13 14
#include <linux/types.h>
#include <scsi/fc/fc_els.h>
#include <scsi/libfc.h>
15
#include "zfcp_ext.h"
16
#include "zfcp_fc.h"
17

18 19 20 21 22
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,
23 24
};

25
static int zfcp_fc_wka_port_get(struct zfcp_fc_wka_port *wka_port)
26 27 28 29
{
	if (mutex_lock_interruptible(&wka_port->mutex))
		return -ERESTARTSYS;

30 31 32
	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;
33
		if (zfcp_fsf_open_wka_port(wka_port))
34
			wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
35 36 37 38
	}

	mutex_unlock(&wka_port->mutex);

39
	wait_event(wka_port->completion_wq,
40 41
		   wka_port->status == ZFCP_FC_WKA_PORT_ONLINE ||
		   wka_port->status == ZFCP_FC_WKA_PORT_OFFLINE);
42

43
	if (wka_port->status == ZFCP_FC_WKA_PORT_ONLINE) {
44 45 46 47 48 49
		atomic_inc(&wka_port->refcount);
		return 0;
	}
	return -EIO;
}

50
static void zfcp_fc_wka_port_offline(struct work_struct *work)
51
{
52
	struct delayed_work *dw = to_delayed_work(work);
53 54
	struct zfcp_fc_wka_port *wka_port =
			container_of(dw, struct zfcp_fc_wka_port, work);
55 56 57

	mutex_lock(&wka_port->mutex);
	if ((atomic_read(&wka_port->refcount) != 0) ||
58
	    (wka_port->status != ZFCP_FC_WKA_PORT_ONLINE))
59 60
		goto out;

61
	wka_port->status = ZFCP_FC_WKA_PORT_CLOSING;
62
	if (zfcp_fsf_close_wka_port(wka_port)) {
63
		wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
64 65 66 67 68 69
		wake_up(&wka_port->completion_wq);
	}
out:
	mutex_unlock(&wka_port->mutex);
}

70
static void zfcp_fc_wka_port_put(struct zfcp_fc_wka_port *wka_port)
71 72 73
{
	if (atomic_dec_return(&wka_port->refcount) != 0)
		return;
74
	/* wait 10 milliseconds, other reqs might pop in */
75 76 77
	schedule_delayed_work(&wka_port->work, HZ / 100);
}

78
static void zfcp_fc_wka_port_init(struct zfcp_fc_wka_port *wka_port, u32 d_id,
79
				  struct zfcp_adapter *adapter)
80 81 82 83
{
	init_waitqueue_head(&wka_port->completion_wq);

	wka_port->adapter = adapter;
84
	wka_port->d_id = d_id;
85

86
	wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE;
87 88
	atomic_set(&wka_port->refcount, 0);
	mutex_init(&wka_port->mutex);
89
	INIT_DELAYED_WORK(&wka_port->work, zfcp_fc_wka_port_offline);
90 91
}

92
static void zfcp_fc_wka_port_force_offline(struct zfcp_fc_wka_port *wka)
93 94 95
{
	cancel_delayed_work_sync(&wka->work);
	mutex_lock(&wka->mutex);
96
	wka->status = ZFCP_FC_WKA_PORT_OFFLINE;
97 98 99
	mutex_unlock(&wka->mutex);
}

100
void zfcp_fc_wka_ports_force_offline(struct zfcp_fc_wka_ports *gs)
101
{
102 103
	if (!gs)
		return;
104 105 106 107 108 109
	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);
}

110
static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
111
				   struct fc_els_rscn_page *page)
112 113
{
	unsigned long flags;
114
	struct zfcp_adapter *adapter = fsf_req->adapter;
115 116
	struct zfcp_port *port;

117 118
	read_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry(port, &adapter->port_list, list) {
119
		if ((port->d_id & range) == (ntoh24(page->rscn_fid) & range))
120
			zfcp_fc_test_link(port);
121 122 123 124 125
		if (!port->d_id)
			zfcp_erp_port_reopen(port,
					     ZFCP_STATUS_COMMON_ERP_FAILED,
					     "fcrscn1", NULL);
	}
126
	read_unlock_irqrestore(&adapter->port_list_lock, flags);
127 128 129 130 131
}

static void zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req)
{
	struct fsf_status_read_buffer *status_buffer = (void *)fsf_req->data;
132 133
	struct fc_els_rscn *head;
	struct fc_els_rscn_page *page;
134 135
	u16 i;
	u16 no_entries;
136
	unsigned int afmt;
137

138 139
	head = (struct fc_els_rscn *) status_buffer->payload.data;
	page = (struct fc_els_rscn_page *) head;
140 141

	/* see FC-FS */
142
	no_entries = head->rscn_plen / sizeof(struct fc_els_rscn_page);
143 144 145

	for (i = 1; i < no_entries; i++) {
		/* skip head and start with 1st element */
146 147 148 149
		page++;
		afmt = page->rscn_page_flags & ELS_RSCN_ADDR_FMT_MASK;
		_zfcp_fc_incoming_rscn(fsf_req, zfcp_fc_rscn_range_mask[afmt],
				       page);
150
	}
151
	queue_work(fsf_req->adapter->work_queue, &fsf_req->adapter->scan_work);
152 153
}

154
static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, u64 wwpn)
155
{
156
	unsigned long flags;
157 158 159
	struct zfcp_adapter *adapter = req->adapter;
	struct zfcp_port *port;

160 161 162 163
	read_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry(port, &adapter->port_list, list)
		if (port->wwpn == wwpn) {
			zfcp_erp_port_forced_reopen(port, 0, "fciwwp1", req);
164
			break;
165 166
		}
	read_unlock_irqrestore(&adapter->port_list_lock, flags);
167 168 169 170
}

static void zfcp_fc_incoming_plogi(struct zfcp_fsf_req *req)
{
171 172
	struct fsf_status_read_buffer *status_buffer;
	struct fc_els_flogi *plogi;
173

174 175 176
	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);
177 178 179 180 181 182
}

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;
183 184
	struct fc_els_logo *logo =
		(struct fc_els_logo *) status_buffer->payload.data;
185

186
	zfcp_fc_incoming_wwpn(req, logo->fl_n_port_wwn);
187 188 189 190 191 192 193 194 195 196
}

/**
 * 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 已提交
197
	unsigned int els_type = status_buffer->payload.data[0];
198

S
Swen Schillig 已提交
199
	zfcp_dbf_san_incoming_els(fsf_req);
200
	if (els_type == ELS_PLOGI)
201
		zfcp_fc_incoming_plogi(fsf_req);
202
	else if (els_type == ELS_LOGO)
203
		zfcp_fc_incoming_logo(fsf_req);
204
	else if (els_type == ELS_RSCN)
205 206 207
		zfcp_fc_incoming_rscn(fsf_req);
}

208
static void zfcp_fc_ns_gid_pn_eval(void *data)
209
{
210 211
	struct zfcp_fc_gid_pn *gid_pn = data;
	struct zfcp_fsf_ct_els *ct = &gid_pn->ct;
212 213
	struct zfcp_fc_gid_pn_req *gid_pn_req = sg_virt(ct->req);
	struct zfcp_fc_gid_pn_resp *gid_pn_resp = sg_virt(ct->resp);
214 215 216
	struct zfcp_port *port = gid_pn->port;

	if (ct->status)
217
		return;
218
	if (gid_pn_resp->ct_hdr.ct_cmd != FC_FS_ACC)
219
		return;
220

221
	/* paranoia */
222
	if (gid_pn_req->gid_pn.fn_wwpn != port->wwpn)
223
		return;
224
	/* looks like a valid d_id */
225
	port->d_id = ntoh24(gid_pn_resp->gid_pn.fp_fid);
226 227
}

228 229 230 231 232
static void zfcp_fc_complete(void *data)
{
	complete(data);
}

233
static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port,
234
				     struct zfcp_fc_gid_pn *gid_pn)
235
{
236
	struct zfcp_adapter *adapter = port->adapter;
237
	DECLARE_COMPLETION_ONSTACK(completion);
238
	int ret;
239 240

	/* setup parameters for send generic command */
241
	gid_pn->port = port;
242 243
	gid_pn->ct.handler = zfcp_fc_complete;
	gid_pn->ct.handler_data = &completion;
244 245 246 247 248 249
	gid_pn->ct.req = &gid_pn->sg_req;
	gid_pn->ct.resp = &gid_pn->sg_resp;
	sg_init_one(&gid_pn->sg_req, &gid_pn->gid_pn_req,
		    sizeof(struct zfcp_fc_gid_pn_req));
	sg_init_one(&gid_pn->sg_resp, &gid_pn->gid_pn_resp,
		    sizeof(struct zfcp_fc_gid_pn_resp));
250 251

	/* setup nameserver request */
252 253 254 255 256 257 258
	gid_pn->gid_pn_req.ct_hdr.ct_rev = FC_CT_REV;
	gid_pn->gid_pn_req.ct_hdr.ct_fs_type = FC_FST_DIR;
	gid_pn->gid_pn_req.ct_hdr.ct_fs_subtype = FC_NS_SUBTYPE;
	gid_pn->gid_pn_req.ct_hdr.ct_options = 0;
	gid_pn->gid_pn_req.ct_hdr.ct_cmd = FC_NS_GID_PN;
	gid_pn->gid_pn_req.ct_hdr.ct_mr_size = ZFCP_FC_CT_SIZE_PAGE / 4;
	gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn;
259

260 261 262 263 264 265
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct,
			       adapter->pool.gid_pn_req);
	if (!ret) {
		wait_for_completion(&completion);
		zfcp_fc_ns_gid_pn_eval(gid_pn);
	}
266 267 268 269 270
	return ret;
}

/**
 * zfcp_fc_ns_gid_pn_request - initiate GID_PN nameserver request
271
 * @port: port where GID_PN request is needed
272 273
 * return: -ENOMEM on error, 0 otherwise
 */
274
static int zfcp_fc_ns_gid_pn(struct zfcp_port *port)
275 276
{
	int ret;
277
	struct zfcp_fc_gid_pn *gid_pn;
278
	struct zfcp_adapter *adapter = port->adapter;
279

280
	gid_pn = mempool_alloc(adapter->pool.gid_pn, GFP_ATOMIC);
281 282 283 284 285
	if (!gid_pn)
		return -ENOMEM;

	memset(gid_pn, 0, sizeof(*gid_pn));

286
	ret = zfcp_fc_wka_port_get(&adapter->gs->ds);
287
	if (ret)
288 289
		goto out;

290
	ret = zfcp_fc_ns_gid_pn_request(port, gid_pn);
291

292
	zfcp_fc_wka_port_put(&adapter->gs->ds);
293
out:
294
	mempool_free(gid_pn, adapter->pool.gid_pn);
295 296 297
	return ret;
}

298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
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 */
		zfcp_erp_adapter_reopen(port->adapter, 0, "fcgpn_1", NULL);
		goto out;
	}

	if (!port->d_id) {
		zfcp_erp_port_failed(port, "fcgpn_2", NULL);
		goto out;
	}

	zfcp_erp_port_reopen(port, 0, "fcgpn_3", NULL);
out:
318
	put_device(&port->sysfs_device);
319 320
}

321 322 323 324 325 326
/**
 * 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)
{
327
	get_device(&port->sysfs_device);
328
	if (!queue_work(port->adapter->work_queue, &port->gid_pn_work))
329
		put_device(&port->sysfs_device);
330 331
}

332 333 334 335 336 337 338
/**
 * 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
 */
339
void zfcp_fc_plogi_evaluate(struct zfcp_port *port, struct fc_els_flogi *plogi)
340
{
341 342 343 344 345 346 347 348 349 350 351 352 353 354
	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)
355
		port->supported_classes |= FC_COS_CLASS1;
356
	if (plogi->fl_cssp[1].cp_class & FC_CPC_VALID)
357
		port->supported_classes |= FC_COS_CLASS2;
358
	if (plogi->fl_cssp[2].cp_class & FC_CPC_VALID)
359
		port->supported_classes |= FC_COS_CLASS3;
360
	if (plogi->fl_cssp[3].cp_class & FC_CPC_VALID)
361 362 363
		port->supported_classes |= FC_COS_CLASS4;
}

364
static void zfcp_fc_adisc_handler(void *data)
365
{
366
	struct zfcp_fc_els_adisc *adisc = data;
367
	struct zfcp_port *port = adisc->els.port;
368
	struct fc_els_adisc *adisc_resp = &adisc->adisc_resp;
369

370
	if (adisc->els.status) {
371
		/* request rejected or timed out */
372 373
		zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
					    "fcadh_1", NULL);
374 375 376 377
		goto out;
	}

	if (!port->wwnn)
378
		port->wwnn = adisc_resp->adisc_wwnn;
379

380
	if ((port->wwpn != adisc_resp->adisc_wwpn) ||
381
	    !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)) {
382 383
		zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
				     "fcadh_2", NULL);
384 385
		goto out;
	}
386

387 388
	/* port is good, unblock rport without going through erp */
	zfcp_scsi_schedule_rport_register(port);
389
 out:
390
	atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
391
	put_device(&port->sysfs_device);
392
	kmem_cache_free(zfcp_data.adisc_cache, adisc);
393 394 395 396
}

static int zfcp_fc_adisc(struct zfcp_port *port)
{
397
	struct zfcp_fc_els_adisc *adisc;
398
	struct zfcp_adapter *adapter = port->adapter;
399
	int ret;
400

401
	adisc = kmem_cache_alloc(zfcp_data.adisc_cache, GFP_ATOMIC);
402 403 404
	if (!adisc)
		return -ENOMEM;

405
	adisc->els.port = port;
406 407
	adisc->els.req = &adisc->req;
	adisc->els.resp = &adisc->resp;
408 409 410 411
	sg_init_one(adisc->els.req, &adisc->adisc_req,
		    sizeof(struct fc_els_adisc));
	sg_init_one(adisc->els.resp, &adisc->adisc_resp,
		    sizeof(struct fc_els_adisc));
412 413

	adisc->els.handler = zfcp_fc_adisc_handler;
414
	adisc->els.handler_data = adisc;
415 416 417

	/* 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 */
418 419
	adisc->adisc_req.adisc_wwpn = fc_host_port_name(adapter->scsi_host);
	adisc->adisc_req.adisc_wwnn = fc_host_node_name(adapter->scsi_host);
420
	adisc->adisc_req.adisc_cmd = ELS_ADISC;
421 422
	hton24(adisc->adisc_req.adisc_port_id,
	       fc_host_port_id(adapter->scsi_host));
423

424 425 426 427 428
	ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els);
	if (ret)
		kmem_cache_free(zfcp_data.adisc_cache, adisc);

	return ret;
429 430
}

431
void zfcp_fc_link_test_work(struct work_struct *work)
432
{
433 434
	struct zfcp_port *port =
		container_of(work, struct zfcp_port, test_link_work);
435 436
	int retval;

437
	get_device(&port->sysfs_device);
438 439 440
	port->rport_task = RPORT_DEL;
	zfcp_scsi_rport_work(&port->rport_work);

441 442 443 444 445 446
	/* only issue one test command at one time per port */
	if (atomic_read(&port->status) & ZFCP_STATUS_PORT_LINK_TEST)
		goto out;

	atomic_set_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status);

447
	retval = zfcp_fc_adisc(port);
448
	if (retval == 0)
449 450 451
		return;

	/* send of ADISC was not possible */
452
	atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status);
453 454
	zfcp_erp_port_forced_reopen(port, 0, "fcltwk1", NULL);

455
out:
456
	put_device(&port->sysfs_device);
457
}
458

459
/**
460
 * zfcp_fc_test_link - lightweight link test procedure
461 462 463 464 465 466
 * @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.
 */
467
void zfcp_fc_test_link(struct zfcp_port *port)
468
{
469
	get_device(&port->sysfs_device);
470
	if (!queue_work(port->adapter->work_queue, &port->test_link_work))
471
		put_device(&port->sysfs_device);
472 473
}

474
static void zfcp_free_sg_env(struct zfcp_fc_gpn_ft *gpn_ft, int buf_num)
475 476 477
{
	struct scatterlist *sg = &gpn_ft->sg_req;

478
	kmem_cache_free(zfcp_data.gpn_ft_cache, sg_virt(sg));
479
	zfcp_sg_free_table(gpn_ft->sg_resp, buf_num);
480 481 482 483

	kfree(gpn_ft);
}

484
static struct zfcp_fc_gpn_ft *zfcp_alloc_sg_env(int buf_num)
485
{
486 487
	struct zfcp_fc_gpn_ft *gpn_ft;
	struct zfcp_fc_gpn_ft_req *req;
488 489 490 491 492

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

493
	req = kmem_cache_alloc(zfcp_data.gpn_ft_cache, GFP_KERNEL);
494 495 496 497 498 499 500
	if (!req) {
		kfree(gpn_ft);
		gpn_ft = NULL;
		goto out;
	}
	sg_init_one(&gpn_ft->sg_req, req, sizeof(*req));

501 502
	if (zfcp_sg_setup_table(gpn_ft->sg_resp, buf_num)) {
		zfcp_free_sg_env(gpn_ft, buf_num);
503 504 505 506 507 508 509
		gpn_ft = NULL;
	}
out:
	return gpn_ft;
}


510
static int zfcp_fc_send_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft,
511
			       struct zfcp_adapter *adapter, int max_bytes)
512
{
513
	struct zfcp_fsf_ct_els *ct = &gpn_ft->ct;
514
	struct zfcp_fc_gpn_ft_req *req = sg_virt(&gpn_ft->sg_req);
515
	DECLARE_COMPLETION_ONSTACK(completion);
516 517 518
	int ret;

	/* prepare CT IU for GPN_FT */
519 520 521 522 523 524 525 526 527
	req->ct_hdr.ct_rev = FC_CT_REV;
	req->ct_hdr.ct_fs_type = FC_FST_DIR;
	req->ct_hdr.ct_fs_subtype = FC_NS_SUBTYPE;
	req->ct_hdr.ct_options = 0;
	req->ct_hdr.ct_cmd = FC_NS_GPN_FT;
	req->ct_hdr.ct_mr_size = max_bytes / 4;
	req->gpn_ft.fn_domain_id_scope = 0;
	req->gpn_ft.fn_area_id_scope = 0;
	req->gpn_ft.fn_fc4_type = FC_TYPE_FCP;
528 529

	/* prepare zfcp_send_ct */
530 531
	ct->handler = zfcp_fc_complete;
	ct->handler_data = &completion;
532 533 534
	ct->req = &gpn_ft->sg_req;
	ct->resp = gpn_ft->sg_resp;

535
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, ct, NULL);
536
	if (!ret)
537
		wait_for_completion(&completion);
538 539 540
	return ret;
}

541
static void zfcp_fc_validate_port(struct zfcp_port *port, struct list_head *lh)
542
{
543 544 545
	if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC))
		return;

546 547
	atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);

548
	if ((port->supported_classes != 0) ||
549
	    !list_empty(&port->unit_list))
550
		return;
551 552

	list_move_tail(&port->list, lh);
553 554
}

555 556
static int zfcp_fc_eval_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft,
			       struct zfcp_adapter *adapter, int max_entries)
557
{
558
	struct zfcp_fsf_ct_els *ct = &gpn_ft->ct;
559
	struct scatterlist *sg = gpn_ft->sg_resp;
560 561
	struct fc_ct_hdr *hdr = sg_virt(sg);
	struct fc_gpn_ft_resp *acc = sg_virt(sg);
562
	struct zfcp_port *port, *tmp;
563
	unsigned long flags;
564
	LIST_HEAD(remove_lh);
565
	u32 d_id;
566
	int ret = 0, x, last = 0;
567 568 569 570

	if (ct->status)
		return -EIO;

571 572
	if (hdr->ct_cmd != FC_FS_ACC) {
		if (hdr->ct_reason == FC_BA_RJT_UNABLE)
573 574 575 576
			return -EAGAIN; /* might be a temporary condition */
		return -EIO;
	}

577
	if (hdr->ct_mr_size) {
578 579
		dev_warn(&adapter->ccw_device->dev,
			 "The name server reported %d words residual data\n",
580
			 hdr->ct_mr_size);
581
		return -E2BIG;
582
	}
583 584

	/* first entry is the header */
585
	for (x = 1; x < max_entries && !last; x++) {
586
		if (x % (ZFCP_FC_GPN_FT_ENT_PAGE + 1))
587 588 589 590
			acc++;
		else
			acc = sg_virt(++sg);

591 592
		last = acc->fp_flags & FC_NS_FID_LAST;
		d_id = ntoh24(acc->fp_fid);
593

594
		/* don't attach ports with a well known address */
595
		if (d_id >= FC_FID_WELL_KNOWN_BASE)
596
			continue;
597
		/* skip the adapter's port and known remote ports */
598
		if (acc->fp_wwpn == fc_host_port_name(adapter->scsi_host))
599 600
			continue;

601
		port = zfcp_port_enqueue(adapter, acc->fp_wwpn,
602
					 ZFCP_STATUS_COMMON_NOESC, d_id);
603
		if (!IS_ERR(port))
604
			zfcp_erp_port_reopen(port, 0, "fcegpf1", NULL);
605 606
		else if (PTR_ERR(port) != -EEXIST)
			ret = PTR_ERR(port);
607 608 609
	}

	zfcp_erp_wait(adapter);
610 611
	write_lock_irqsave(&adapter->port_list_lock, flags);
	list_for_each_entry_safe(port, tmp, &adapter->port_list, list)
612
		zfcp_fc_validate_port(port, &remove_lh);
613
	write_unlock_irqrestore(&adapter->port_list_lock, flags);
614 615 616 617 618 619 620

	list_for_each_entry_safe(port, tmp, &remove_lh, list) {
		zfcp_erp_port_shutdown(port, 0, "fcegpf2", NULL);
		zfcp_device_unregister(&port->sysfs_device,
				       &zfcp_sysfs_port_attrs);
	}

621 622 623 624
	return ret;
}

/**
625
 * zfcp_fc_scan_ports - scan remote ports and attach new ports
626
 * @work: reference to scheduled work
627
 */
628
void zfcp_fc_scan_ports(struct work_struct *work)
629
{
630 631
	struct zfcp_adapter *adapter = container_of(work, struct zfcp_adapter,
						    scan_work);
632
	int ret, i;
633
	struct zfcp_fc_gpn_ft *gpn_ft;
634 635 636
	int chain, max_entries, buf_num, max_bytes;

	chain = adapter->adapter_features & FSF_FEATURE_ELS_CT_CHAINED_SBALS;
637 638 639
	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;
640

641 642
	if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
	    fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
643
		return;
644

645 646
	if (zfcp_fc_wka_port_get(&adapter->gs->ds))
		return;
647

648
	gpn_ft = zfcp_alloc_sg_env(buf_num);
649
	if (!gpn_ft)
650
		goto out;
651 652

	for (i = 0; i < 3; i++) {
653
		ret = zfcp_fc_send_gpn_ft(gpn_ft, adapter, max_bytes);
654
		if (!ret) {
655
			ret = zfcp_fc_eval_gpn_ft(gpn_ft, adapter, max_entries);
656 657 658 659 660 661
			if (ret == -EAGAIN)
				ssleep(1);
			else
				break;
		}
	}
662
	zfcp_free_sg_env(gpn_ft, buf_num);
663
out:
664
	zfcp_fc_wka_port_put(&adapter->gs->ds);
665 666
}

667
static void zfcp_fc_ct_els_job_handler(void *data)
668
{
669 670 671 672
	struct fc_bsg_job *job = data;
	struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data;
	int status = zfcp_ct_els->status;
	int reply_status;
673

674 675 676
	reply_status = status ? FC_CTELS_STATUS_REJECT : FC_CTELS_STATUS_OK;
	job->reply->reply_data.ctels_reply.status = reply_status;
	job->reply->reply_payload_rcv_len = job->reply_payload.payload_len;
677 678 679
	job->job_done(job);
}

680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717
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;

	preamble_word1 = job->request->rqst_data.r_ct.preamble_word1;
	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);
}

718 719
static int zfcp_fc_exec_els_job(struct fc_bsg_job *job,
				struct zfcp_adapter *adapter)
720
{
721
	struct zfcp_fsf_ct_els *els = job->dd_data;
722 723
	struct fc_rport *rport = job->rport;
	struct zfcp_port *port;
724
	u32 d_id;
725 726

	if (rport) {
727
		port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
728
		if (!port)
729
			return -EINVAL;
730

731
		d_id = port->d_id;
732
		put_device(&port->sysfs_device);
733 734
	} else
		d_id = ntoh24(job->request->rqst_data.h_els.port_id);
735

736
	els->handler = zfcp_fc_ct_els_job_handler;
737
	return zfcp_fsf_send_els(adapter, d_id, els);
738 739
}

740 741
static int zfcp_fc_exec_ct_job(struct fc_bsg_job *job,
			       struct zfcp_adapter *adapter)
742 743
{
	int ret;
744 745
	struct zfcp_fsf_ct_els *ct = job->dd_data;
	struct zfcp_fc_wka_port *wka_port;
746

747 748 749
	wka_port = zfcp_fc_job_wka_port(job);
	if (!wka_port)
		return -EINVAL;
750

751 752
	ret = zfcp_fc_wka_port_get(wka_port);
	if (ret)
753 754
		return ret;

755
	ct->handler = zfcp_fc_ct_job_handler;
756 757 758
	ret = zfcp_fsf_send_ct(wka_port, ct, NULL);
	if (ret)
		zfcp_fc_wka_port_put(wka_port);
759 760 761

	return ret;
}
762

763 764 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
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;

	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;

	switch (job->request->msgcode) {
	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;
	}
}

791 792 793 794 795 796
int zfcp_fc_timeout_bsg_job(struct fc_bsg_job *job)
{
	/* hardware tracks timeout, reset bsg timeout to not interfere */
	return -EAGAIN;
}

797 798
int zfcp_fc_gs_setup(struct zfcp_adapter *adapter)
{
799
	struct zfcp_fc_wka_ports *wka_ports;
800

801
	wka_ports = kzalloc(sizeof(struct zfcp_fc_wka_ports), GFP_KERNEL);
802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
	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;
}