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, 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 15
#include <scsi/fc/fc_els.h>
#include <scsi/libfc.h>
16
#include "zfcp_ext.h"
17
#include "zfcp_fc.h"
18

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

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

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

	mutex_unlock(&wka_port->mutex);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

161 162 163 164
	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);
165
			break;
166 167
		}
	read_unlock_irqrestore(&adapter->port_list_lock, flags);
168 169 170 171
}

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

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

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

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

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

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

209
static void zfcp_fc_ns_gid_pn_eval(void *data)
210
{
211 212
	struct zfcp_fc_gid_pn *gid_pn = data;
	struct zfcp_fsf_ct_els *ct = &gid_pn->ct;
213 214
	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);
215 216 217
	struct zfcp_port *port = gid_pn->port;

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

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

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

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

	/* setup parameters for send generic command */
242
	gid_pn->port = port;
243 244
	gid_pn->ct.handler = zfcp_fc_complete;
	gid_pn->ct.handler_data = &completion;
245 246 247 248 249 250
	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));
251 252

	/* setup nameserver request */
253 254 255 256 257 258 259
	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;
260

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

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

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

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

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

292
	ret = zfcp_fc_ns_gid_pn_request(port, gid_pn);
293

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return ret;
432 433
}

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

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

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

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

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

458
out:
459
	put_device(&port->dev);
460
}
461

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

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

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

	kfree(gpn_ft);
}

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

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

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

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


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

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

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

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

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

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

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

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

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

	if (ct->status)
		return -EIO;

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

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

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

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

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

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

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

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

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
	struct fc_bsg_job *job = data;
	struct zfcp_fsf_ct_els *zfcp_ct_els = job->dd_data;
674
	struct fc_bsg_reply *jr = job->reply;
675

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

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

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

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

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

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

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

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

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

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

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

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

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

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