zfcp_fc.c 21.7 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
	ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct,
261 262
			       adapter->pool.gid_pn_req,
			       ZFCP_FC_CTELS_TMO);
263 264 265 266
	if (!ret) {
		wait_for_completion(&completion);
		zfcp_fc_ns_gid_pn_eval(gid_pn);
	}
267 268 269 270 271
	return ret;
}

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

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

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

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

291
	ret = zfcp_fc_ns_gid_pn_request(port, gid_pn);
292

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

299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318
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:
319
	put_device(&port->sysfs_device);
320 321
}

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

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

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

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

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

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

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

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

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

406
	adisc->els.port = port;
407 408
	adisc->els.req = &adisc->req;
	adisc->els.resp = &adisc->resp;
409 410 411 412
	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));
413 414

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

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

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

	return ret;
431 432
}

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

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

443 444 445 446 447 448
	/* 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);

449
	retval = zfcp_fc_adisc(port);
450
	if (retval == 0)
451 452 453
		return;

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

457
out:
458
	put_device(&port->sysfs_device);
459
}
460

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

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

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

	kfree(gpn_ft);
}

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

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

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

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


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

	/* prepare CT IU for GPN_FT */
521 522 523 524 525 526 527 528 529
	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;
530 531

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

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

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

549 550
	atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);

551
	if ((port->supported_classes != 0) ||
552
	    !list_empty(&port->unit_list))
553
		return;
554 555

	list_move_tail(&port->list, lh);
556 557
}

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

	if (ct->status)
		return -EIO;

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

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

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

594 595
		last = acc->fp_flags & FC_NS_FID_LAST;
		d_id = ntoh24(acc->fp_fid);
596

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

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

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

	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);
	}

624 625 626 627
	return ret;
}

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

	chain = adapter->adapter_features & FSF_FEATURE_ELS_CT_CHAINED_SBALS;
640 641 642
	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;
643

644 645
	if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
	    fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
646
		return;
647

648 649
	if (zfcp_fc_wka_port_get(&adapter->gs->ds))
		return;
650

651
	gpn_ft = zfcp_alloc_sg_env(buf_num);
652
	if (!gpn_ft)
653
		goto out;
654 655

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

670
static void zfcp_fc_ct_els_job_handler(void *data)
671
{
672 673 674 675
	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;
676

677 678 679
	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;
680 681 682
	job->job_done(job);
}

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 718 719 720
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);
}

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

	if (rport) {
730
		port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
731
		if (!port)
732
			return -EINVAL;
733

734
		d_id = port->d_id;
735
		put_device(&port->sysfs_device);
736 737
	} else
		d_id = ntoh24(job->request->rqst_data.h_els.port_id);
738

739
	els->handler = zfcp_fc_ct_els_job_handler;
740
	return zfcp_fsf_send_els(adapter, d_id, els, job->req->timeout / HZ);
741 742
}

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

750 751 752
	wka_port = zfcp_fc_job_wka_port(job);
	if (!wka_port)
		return -EINVAL;
753

754 755
	ret = zfcp_fc_wka_port_get(wka_port);
	if (ret)
756 757
		return ret;

758
	ct->handler = zfcp_fc_ct_job_handler;
759
	ret = zfcp_fsf_send_ct(wka_port, ct, NULL, job->req->timeout / HZ);
760 761
	if (ret)
		zfcp_fc_wka_port_put(wka_port);
762 763 764

	return ret;
}
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
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;
	}
}

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

800 801
int zfcp_fc_gs_setup(struct zfcp_adapter *adapter)
{
802
	struct zfcp_fc_wka_ports *wka_ports;
803

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