xref: /openbmc/linux/drivers/s390/scsi/zfcp_erp.c (revision a1e58bbd)
1 /*
2  * This file is part of the zfcp device driver for
3  * FCP adapters for IBM System z9 and zSeries.
4  *
5  * (C) Copyright IBM Corp. 2002, 2006
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21 
22 #define ZFCP_LOG_AREA			ZFCP_LOG_AREA_ERP
23 
24 #include "zfcp_ext.h"
25 
26 static int zfcp_erp_adisc(struct zfcp_port *);
27 static void zfcp_erp_adisc_handler(unsigned long);
28 
29 static int zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *, int);
30 static int zfcp_erp_port_forced_reopen_internal(struct zfcp_port *, int);
31 static int zfcp_erp_port_reopen_internal(struct zfcp_port *, int);
32 static int zfcp_erp_unit_reopen_internal(struct zfcp_unit *, int);
33 
34 static int zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *, int);
35 static int zfcp_erp_unit_reopen_all_internal(struct zfcp_port *, int);
36 
37 static void zfcp_erp_adapter_block(struct zfcp_adapter *, int);
38 static void zfcp_erp_adapter_unblock(struct zfcp_adapter *);
39 static void zfcp_erp_port_block(struct zfcp_port *, int);
40 static void zfcp_erp_port_unblock(struct zfcp_port *);
41 static void zfcp_erp_unit_block(struct zfcp_unit *, int);
42 static void zfcp_erp_unit_unblock(struct zfcp_unit *);
43 
44 static int zfcp_erp_thread(void *);
45 
46 static int zfcp_erp_strategy(struct zfcp_erp_action *);
47 
48 static int zfcp_erp_strategy_do_action(struct zfcp_erp_action *);
49 static int zfcp_erp_strategy_memwait(struct zfcp_erp_action *);
50 static int zfcp_erp_strategy_check_target(struct zfcp_erp_action *, int);
51 static int zfcp_erp_strategy_check_unit(struct zfcp_unit *, int);
52 static int zfcp_erp_strategy_check_port(struct zfcp_port *, int);
53 static int zfcp_erp_strategy_check_adapter(struct zfcp_adapter *, int);
54 static int zfcp_erp_strategy_statechange(int, u32, struct zfcp_adapter *,
55 					 struct zfcp_port *,
56 					 struct zfcp_unit *, int);
57 static int zfcp_erp_strategy_statechange_detected(atomic_t *, u32);
58 static int zfcp_erp_strategy_followup_actions(int, struct zfcp_adapter *,
59 					      struct zfcp_port *,
60 					      struct zfcp_unit *, int);
61 static int zfcp_erp_strategy_check_queues(struct zfcp_adapter *);
62 static int zfcp_erp_strategy_check_action(struct zfcp_erp_action *, int);
63 
64 static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *);
65 static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *, int);
66 static int zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *);
67 static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *);
68 static int zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *);
69 static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *);
70 static int zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *);
71 static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *);
72 static int zfcp_erp_adapter_strategy_open_fsf_statusread(
73 	struct zfcp_erp_action *);
74 
75 static int zfcp_erp_port_forced_strategy(struct zfcp_erp_action *);
76 static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *);
77 
78 static int zfcp_erp_port_strategy(struct zfcp_erp_action *);
79 static int zfcp_erp_port_strategy_clearstati(struct zfcp_port *);
80 static int zfcp_erp_port_strategy_close(struct zfcp_erp_action *);
81 static int zfcp_erp_port_strategy_open(struct zfcp_erp_action *);
82 static int zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *);
83 static int zfcp_erp_port_strategy_open_nameserver_wakeup(
84 	struct zfcp_erp_action *);
85 static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *);
86 static int zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *);
87 static int zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *);
88 
89 static int zfcp_erp_unit_strategy(struct zfcp_erp_action *);
90 static int zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *);
91 static int zfcp_erp_unit_strategy_close(struct zfcp_erp_action *);
92 static int zfcp_erp_unit_strategy_open(struct zfcp_erp_action *);
93 
94 static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *);
95 static void zfcp_erp_action_dismiss_port(struct zfcp_port *);
96 static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *);
97 static void zfcp_erp_action_dismiss(struct zfcp_erp_action *);
98 
99 static int zfcp_erp_action_enqueue(int, struct zfcp_adapter *,
100 				   struct zfcp_port *, struct zfcp_unit *);
101 static int zfcp_erp_action_dequeue(struct zfcp_erp_action *);
102 static void zfcp_erp_action_cleanup(int, struct zfcp_adapter *,
103 				    struct zfcp_port *, struct zfcp_unit *,
104 				    int);
105 
106 static void zfcp_erp_action_ready(struct zfcp_erp_action *);
107 static int  zfcp_erp_action_exists(struct zfcp_erp_action *);
108 
109 static void zfcp_erp_action_to_ready(struct zfcp_erp_action *);
110 static void zfcp_erp_action_to_running(struct zfcp_erp_action *);
111 
112 static void zfcp_erp_memwait_handler(unsigned long);
113 
114 /**
115  * zfcp_close_qdio - close qdio queues for an adapter
116  */
117 static void zfcp_close_qdio(struct zfcp_adapter *adapter)
118 {
119 	struct zfcp_qdio_queue *req_queue;
120 	int first, count;
121 
122 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status))
123 		return;
124 
125 	/* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
126 	req_queue = &adapter->request_queue;
127 	write_lock_irq(&req_queue->queue_lock);
128 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
129 	write_unlock_irq(&req_queue->queue_lock);
130 
131 	debug_text_event(adapter->erp_dbf, 3, "qdio_down2a");
132 	while (qdio_shutdown(adapter->ccw_device,
133 			     QDIO_FLAG_CLEANUP_USING_CLEAR) == -EINPROGRESS)
134 		ssleep(1);
135 	debug_text_event(adapter->erp_dbf, 3, "qdio_down2b");
136 
137 	/* cleanup used outbound sbals */
138 	count = atomic_read(&req_queue->free_count);
139 	if (count < QDIO_MAX_BUFFERS_PER_Q) {
140 		first = (req_queue->free_index+count) % QDIO_MAX_BUFFERS_PER_Q;
141 		count = QDIO_MAX_BUFFERS_PER_Q - count;
142 		zfcp_qdio_zero_sbals(req_queue->buffer, first, count);
143 	}
144 	req_queue->free_index = 0;
145 	atomic_set(&req_queue->free_count, 0);
146 	req_queue->distance_from_int = 0;
147 	adapter->response_queue.free_index = 0;
148 	atomic_set(&adapter->response_queue.free_count, 0);
149 }
150 
151 /**
152  * zfcp_close_fsf - stop FSF operations for an adapter
153  *
154  * Dismiss and cleanup all pending fsf_reqs (this wakes up all initiators of
155  * requests waiting for completion; especially this returns SCSI commands
156  * with error state).
157  */
158 static void zfcp_close_fsf(struct zfcp_adapter *adapter)
159 {
160 	/* close queues to ensure that buffers are not accessed by adapter */
161 	zfcp_close_qdio(adapter);
162 	zfcp_fsf_req_dismiss_all(adapter);
163 	/* reset FSF request sequence number */
164 	adapter->fsf_req_seq_no = 0;
165 	/* all ports and units are closed */
166 	zfcp_erp_modify_adapter_status(adapter,
167 				       ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
168 }
169 
170 /**
171  * zfcp_fsf_request_timeout_handler - called if a request timed out
172  * @data: pointer to adapter for handler function
173  *
174  * This function needs to be called if requests (ELS, Generic Service,
175  * or SCSI commands) exceed a certain time limit. The assumption is
176  * that after the time limit the adapter get stuck. So we trigger a reopen of
177  * the adapter.
178  */
179 static void zfcp_fsf_request_timeout_handler(unsigned long data)
180 {
181 	struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
182 	zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
183 }
184 
185 void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, unsigned long timeout)
186 {
187 	fsf_req->timer.function = zfcp_fsf_request_timeout_handler;
188 	fsf_req->timer.data = (unsigned long) fsf_req->adapter;
189 	fsf_req->timer.expires = jiffies + timeout;
190 	add_timer(&fsf_req->timer);
191 }
192 
193 /*
194  * function:
195  *
196  * purpose:	called if an adapter failed,
197  *		initiates adapter recovery which is done
198  *		asynchronously
199  *
200  * returns:	0	- initiated action successfully
201  *		<0	- failed to initiate action
202  */
203 static int
204 zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask)
205 {
206 	int retval;
207 
208 	debug_text_event(adapter->erp_dbf, 5, "a_ro");
209 	ZFCP_LOG_DEBUG("reopen adapter %s\n",
210 		       zfcp_get_busid_by_adapter(adapter));
211 
212 	zfcp_erp_adapter_block(adapter, clear_mask);
213 
214 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) {
215 		ZFCP_LOG_DEBUG("skipped reopen of failed adapter %s\n",
216 			       zfcp_get_busid_by_adapter(adapter));
217 		debug_text_event(adapter->erp_dbf, 5, "a_ro_f");
218 		/* ensure propagation of failed status to new devices */
219 		zfcp_erp_adapter_failed(adapter);
220 		retval = -EIO;
221 		goto out;
222 	}
223 	retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER,
224 					 adapter, NULL, NULL);
225 
226  out:
227 	return retval;
228 }
229 
230 /*
231  * function:
232  *
233  * purpose:	Wrappper for zfcp_erp_adapter_reopen_internal
234  *              used to ensure the correct locking
235  *
236  * returns:	0	- initiated action successfully
237  *		<0	- failed to initiate action
238  */
239 int
240 zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear_mask)
241 {
242 	int retval;
243 	unsigned long flags;
244 
245 	read_lock_irqsave(&zfcp_data.config_lock, flags);
246 	write_lock(&adapter->erp_lock);
247 	retval = zfcp_erp_adapter_reopen_internal(adapter, clear_mask);
248 	write_unlock(&adapter->erp_lock);
249 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
250 
251 	return retval;
252 }
253 
254 int
255 zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear_mask)
256 {
257 	int retval;
258 
259 	retval = zfcp_erp_adapter_reopen(adapter,
260 					 ZFCP_STATUS_COMMON_RUNNING |
261 					 ZFCP_STATUS_COMMON_ERP_FAILED |
262 					 clear_mask);
263 
264 	return retval;
265 }
266 
267 int
268 zfcp_erp_port_shutdown(struct zfcp_port *port, int clear_mask)
269 {
270 	int retval;
271 
272 	retval = zfcp_erp_port_reopen(port,
273 				      ZFCP_STATUS_COMMON_RUNNING |
274 				      ZFCP_STATUS_COMMON_ERP_FAILED |
275 				      clear_mask);
276 
277 	return retval;
278 }
279 
280 int
281 zfcp_erp_unit_shutdown(struct zfcp_unit *unit, int clear_mask)
282 {
283 	int retval;
284 
285 	retval = zfcp_erp_unit_reopen(unit,
286 				      ZFCP_STATUS_COMMON_RUNNING |
287 				      ZFCP_STATUS_COMMON_ERP_FAILED |
288 				      clear_mask);
289 
290 	return retval;
291 }
292 
293 
294 /**
295  * zfcp_erp_adisc - send ADISC ELS command
296  * @port: port structure
297  */
298 static int
299 zfcp_erp_adisc(struct zfcp_port *port)
300 {
301 	struct zfcp_adapter *adapter = port->adapter;
302 	struct zfcp_send_els *send_els;
303 	struct zfcp_ls_adisc *adisc;
304 	void *address = NULL;
305 	int retval = 0;
306 
307 	send_els = kzalloc(sizeof(struct zfcp_send_els), GFP_ATOMIC);
308 	if (send_els == NULL)
309 		goto nomem;
310 
311 	send_els->req = kmalloc(sizeof(struct scatterlist), GFP_ATOMIC);
312 	if (send_els->req == NULL)
313 		goto nomem;
314 	sg_init_table(send_els->req, 1);
315 
316 	send_els->resp = kmalloc(sizeof(struct scatterlist), GFP_ATOMIC);
317 	if (send_els->resp == NULL)
318 		goto nomem;
319 	sg_init_table(send_els->resp, 1);
320 
321 	address = (void *) get_zeroed_page(GFP_ATOMIC);
322 	if (address == NULL)
323 		goto nomem;
324 
325 	zfcp_address_to_sg(address, send_els->req, sizeof(struct zfcp_ls_adisc));
326 	address += PAGE_SIZE >> 1;
327 	zfcp_address_to_sg(address, send_els->resp, sizeof(struct zfcp_ls_adisc_acc));
328 	send_els->req_count = send_els->resp_count = 1;
329 
330 	send_els->adapter = adapter;
331 	send_els->port = port;
332 	send_els->d_id = port->d_id;
333 	send_els->handler = zfcp_erp_adisc_handler;
334 	send_els->handler_data = (unsigned long) send_els;
335 
336 	adisc = zfcp_sg_to_address(send_els->req);
337 	send_els->ls_code = adisc->code = ZFCP_LS_ADISC;
338 
339 	/* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports
340 	   without FC-AL-2 capability, so we don't set it */
341 	adisc->wwpn = fc_host_port_name(adapter->scsi_host);
342 	adisc->wwnn = fc_host_node_name(adapter->scsi_host);
343 	adisc->nport_id = fc_host_port_id(adapter->scsi_host);
344 	ZFCP_LOG_INFO("ADISC request from s_id 0x%06x to d_id 0x%06x "
345 		      "(wwpn=0x%016Lx, wwnn=0x%016Lx, "
346 		      "hard_nport_id=0x%06x, nport_id=0x%06x)\n",
347 		      adisc->nport_id, send_els->d_id, (wwn_t) adisc->wwpn,
348 		      (wwn_t) adisc->wwnn, adisc->hard_nport_id,
349 		      adisc->nport_id);
350 
351 	retval = zfcp_fsf_send_els(send_els);
352 	if (retval != 0) {
353 		ZFCP_LOG_NORMAL("error: initiation of Send ELS failed for port "
354 				"0x%06x on adapter %s\n", send_els->d_id,
355 				zfcp_get_busid_by_adapter(adapter));
356 		goto freemem;
357 	}
358 
359 	goto out;
360 
361  nomem:
362 	retval = -ENOMEM;
363  freemem:
364 	if (address != NULL)
365 		__free_pages(sg_page(send_els->req), 0);
366 	if (send_els != NULL) {
367 		kfree(send_els->req);
368 		kfree(send_els->resp);
369 		kfree(send_els);
370 	}
371  out:
372 	return retval;
373 }
374 
375 
376 /**
377  * zfcp_erp_adisc_handler - handler for ADISC ELS command
378  * @data: pointer to struct zfcp_send_els
379  *
380  * If ADISC failed (LS_RJT or timed out) forced reopen of the port is triggered.
381  */
382 static void
383 zfcp_erp_adisc_handler(unsigned long data)
384 {
385 	struct zfcp_send_els *send_els;
386 	struct zfcp_port *port;
387 	struct zfcp_adapter *adapter;
388 	u32 d_id;
389 	struct zfcp_ls_adisc_acc *adisc;
390 
391 	send_els = (struct zfcp_send_els *) data;
392 	adapter = send_els->adapter;
393 	port = send_els->port;
394 	d_id = send_els->d_id;
395 
396 	/* request rejected or timed out */
397 	if (send_els->status != 0) {
398 		ZFCP_LOG_NORMAL("ELS request rejected/timed out, "
399 				"force physical port reopen "
400 				"(adapter %s, port d_id=0x%06x)\n",
401 				zfcp_get_busid_by_adapter(adapter), d_id);
402 		debug_text_event(adapter->erp_dbf, 3, "forcreop");
403 		if (zfcp_erp_port_forced_reopen(port, 0))
404 			ZFCP_LOG_NORMAL("failed reopen of port "
405 					"(adapter %s, wwpn=0x%016Lx)\n",
406 					zfcp_get_busid_by_port(port),
407 					port->wwpn);
408 		goto out;
409 	}
410 
411 	adisc = zfcp_sg_to_address(send_els->resp);
412 
413 	ZFCP_LOG_INFO("ADISC response from d_id 0x%06x to s_id "
414 		      "0x%06x (wwpn=0x%016Lx, wwnn=0x%016Lx, "
415 		      "hard_nport_id=0x%06x, nport_id=0x%06x)\n",
416 		      d_id, fc_host_port_id(adapter->scsi_host),
417 		      (wwn_t) adisc->wwpn, (wwn_t) adisc->wwnn,
418 		      adisc->hard_nport_id, adisc->nport_id);
419 
420 	/* set wwnn for port */
421 	if (port->wwnn == 0)
422 		port->wwnn = adisc->wwnn;
423 
424 	if (port->wwpn != adisc->wwpn) {
425 		ZFCP_LOG_NORMAL("d_id assignment changed, reopening "
426 				"port (adapter %s, wwpn=0x%016Lx, "
427 				"adisc_resp_wwpn=0x%016Lx)\n",
428 				zfcp_get_busid_by_port(port),
429 				port->wwpn, (wwn_t) adisc->wwpn);
430 		if (zfcp_erp_port_reopen(port, 0))
431 			ZFCP_LOG_NORMAL("failed reopen of port "
432 					"(adapter %s, wwpn=0x%016Lx)\n",
433 					zfcp_get_busid_by_port(port),
434 					port->wwpn);
435 	}
436 
437  out:
438 	zfcp_port_put(port);
439 	__free_pages(sg_page(send_els->req), 0);
440 	kfree(send_els->req);
441 	kfree(send_els->resp);
442 	kfree(send_els);
443 }
444 
445 
446 /**
447  * zfcp_test_link - lightweight link test procedure
448  * @port: port to be tested
449  *
450  * Test status of a link to a remote port using the ELS command ADISC.
451  */
452 int
453 zfcp_test_link(struct zfcp_port *port)
454 {
455 	int retval;
456 
457 	zfcp_port_get(port);
458 	retval = zfcp_erp_adisc(port);
459 	if (retval != 0 && retval != -EBUSY) {
460 		zfcp_port_put(port);
461 		ZFCP_LOG_NORMAL("reopen needed for port 0x%016Lx "
462 				"on adapter %s\n ", port->wwpn,
463 				zfcp_get_busid_by_port(port));
464 		retval = zfcp_erp_port_forced_reopen(port, 0);
465 		if (retval != 0) {
466 			ZFCP_LOG_NORMAL("reopen of remote port 0x%016Lx "
467 					"on adapter %s failed\n", port->wwpn,
468 					zfcp_get_busid_by_port(port));
469 			retval = -EPERM;
470 		}
471 	}
472 
473 	return retval;
474 }
475 
476 
477 /*
478  * function:
479  *
480  * purpose:	called if a port failed to be opened normally
481  *		initiates Forced Reopen recovery which is done
482  *		asynchronously
483  *
484  * returns:	0	- initiated action successfully
485  *		<0	- failed to initiate action
486  */
487 static int
488 zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask)
489 {
490 	int retval;
491 	struct zfcp_adapter *adapter = port->adapter;
492 
493 	debug_text_event(adapter->erp_dbf, 5, "pf_ro");
494 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
495 
496 	ZFCP_LOG_DEBUG("forced reopen of port 0x%016Lx on adapter %s\n",
497 		       port->wwpn, zfcp_get_busid_by_port(port));
498 
499 	zfcp_erp_port_block(port, clear_mask);
500 
501 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
502 		ZFCP_LOG_DEBUG("skipped forced reopen of failed port 0x%016Lx "
503 			       "on adapter %s\n", port->wwpn,
504 			       zfcp_get_busid_by_port(port));
505 		debug_text_event(adapter->erp_dbf, 5, "pf_ro_f");
506 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
507 		retval = -EIO;
508 		goto out;
509 	}
510 
511 	retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED,
512 					 port->adapter, port, NULL);
513 
514  out:
515 	return retval;
516 }
517 
518 /*
519  * function:
520  *
521  * purpose:	Wrappper for zfcp_erp_port_forced_reopen_internal
522  *              used to ensure the correct locking
523  *
524  * returns:	0	- initiated action successfully
525  *		<0	- failed to initiate action
526  */
527 int
528 zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask)
529 {
530 	int retval;
531 	unsigned long flags;
532 	struct zfcp_adapter *adapter;
533 
534 	adapter = port->adapter;
535 	read_lock_irqsave(&zfcp_data.config_lock, flags);
536 	write_lock(&adapter->erp_lock);
537 	retval = zfcp_erp_port_forced_reopen_internal(port, clear_mask);
538 	write_unlock(&adapter->erp_lock);
539 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
540 
541 	return retval;
542 }
543 
544 /*
545  * function:
546  *
547  * purpose:	called if a port is to be opened
548  *		initiates Reopen recovery which is done
549  *		asynchronously
550  *
551  * returns:	0	- initiated action successfully
552  *		<0	- failed to initiate action
553  */
554 static int
555 zfcp_erp_port_reopen_internal(struct zfcp_port *port, int clear_mask)
556 {
557 	int retval;
558 	struct zfcp_adapter *adapter = port->adapter;
559 
560 	debug_text_event(adapter->erp_dbf, 5, "p_ro");
561 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
562 
563 	ZFCP_LOG_DEBUG("reopen of port 0x%016Lx on adapter %s\n",
564 		       port->wwpn, zfcp_get_busid_by_port(port));
565 
566 	zfcp_erp_port_block(port, clear_mask);
567 
568 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
569 		ZFCP_LOG_DEBUG("skipped reopen of failed port 0x%016Lx "
570 			       "on adapter %s\n", port->wwpn,
571 			       zfcp_get_busid_by_port(port));
572 		debug_text_event(adapter->erp_dbf, 5, "p_ro_f");
573 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
574 		/* ensure propagation of failed status to new devices */
575 		zfcp_erp_port_failed(port);
576 		retval = -EIO;
577 		goto out;
578 	}
579 
580 	retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT,
581 					 port->adapter, port, NULL);
582 
583  out:
584 	return retval;
585 }
586 
587 /**
588  * zfcp_erp_port_reopen - initiate reopen of a remote port
589  * @port: port to be reopened
590  * @clear_mask: specifies flags in port status to be cleared
591  * Return: 0 on success, < 0 on error
592  *
593  * This is a wrappper function for zfcp_erp_port_reopen_internal. It ensures
594  * correct locking. An error recovery task is initiated to do the reopen.
595  * To wait for the completion of the reopen zfcp_erp_wait should be used.
596  */
597 int
598 zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask)
599 {
600 	int retval;
601 	unsigned long flags;
602 	struct zfcp_adapter *adapter = port->adapter;
603 
604 	read_lock_irqsave(&zfcp_data.config_lock, flags);
605 	write_lock(&adapter->erp_lock);
606 	retval = zfcp_erp_port_reopen_internal(port, clear_mask);
607 	write_unlock(&adapter->erp_lock);
608 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
609 
610 	return retval;
611 }
612 
613 /*
614  * function:
615  *
616  * purpose:	called if a unit is to be opened
617  *		initiates Reopen recovery which is done
618  *		asynchronously
619  *
620  * returns:	0	- initiated action successfully
621  *		<0	- failed to initiate action
622  */
623 static int
624 zfcp_erp_unit_reopen_internal(struct zfcp_unit *unit, int clear_mask)
625 {
626 	int retval;
627 	struct zfcp_adapter *adapter = unit->port->adapter;
628 
629 	debug_text_event(adapter->erp_dbf, 5, "u_ro");
630 	debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t));
631 	ZFCP_LOG_DEBUG("reopen of unit 0x%016Lx on port 0x%016Lx "
632 		       "on adapter %s\n", unit->fcp_lun,
633 		       unit->port->wwpn, zfcp_get_busid_by_unit(unit));
634 
635 	zfcp_erp_unit_block(unit, clear_mask);
636 
637 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status)) {
638 		ZFCP_LOG_DEBUG("skipped reopen of failed unit 0x%016Lx "
639 			       "on port 0x%016Lx on adapter %s\n",
640 			       unit->fcp_lun, unit->port->wwpn,
641 			       zfcp_get_busid_by_unit(unit));
642 		debug_text_event(adapter->erp_dbf, 5, "u_ro_f");
643 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
644 			    sizeof (fcp_lun_t));
645 		retval = -EIO;
646 		goto out;
647 	}
648 
649 	retval = zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_UNIT,
650 					 unit->port->adapter, unit->port, unit);
651  out:
652 	return retval;
653 }
654 
655 /**
656  * zfcp_erp_unit_reopen - initiate reopen of a unit
657  * @unit: unit to be reopened
658  * @clear_mask: specifies flags in unit status to be cleared
659  * Return: 0 on success, < 0 on error
660  *
661  * This is a wrappper for zfcp_erp_unit_reopen_internal. It ensures correct
662  * locking. An error recovery task is initiated to do the reopen.
663  * To wait for the completion of the reopen zfcp_erp_wait should be used.
664  */
665 int
666 zfcp_erp_unit_reopen(struct zfcp_unit *unit, int clear_mask)
667 {
668 	int retval;
669 	unsigned long flags;
670 	struct zfcp_adapter *adapter;
671 	struct zfcp_port *port;
672 
673 	port = unit->port;
674 	adapter = port->adapter;
675 
676 	read_lock_irqsave(&zfcp_data.config_lock, flags);
677 	write_lock(&adapter->erp_lock);
678 	retval = zfcp_erp_unit_reopen_internal(unit, clear_mask);
679 	write_unlock(&adapter->erp_lock);
680 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
681 
682 	return retval;
683 }
684 
685 /**
686  * zfcp_erp_adapter_block - mark adapter as blocked, block scsi requests
687  */
688 static void zfcp_erp_adapter_block(struct zfcp_adapter *adapter, int clear_mask)
689 {
690 	debug_text_event(adapter->erp_dbf, 6, "a_bl");
691 	zfcp_erp_modify_adapter_status(adapter,
692 				       ZFCP_STATUS_COMMON_UNBLOCKED |
693 				       clear_mask, ZFCP_CLEAR);
694 }
695 
696 /**
697  * zfcp_erp_adapter_unblock - mark adapter as unblocked, allow scsi requests
698  */
699 static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter)
700 {
701 	debug_text_event(adapter->erp_dbf, 6, "a_ubl");
702 	atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status);
703 }
704 
705 /*
706  * function:
707  *
708  * purpose:	disable I/O,
709  *		return any open requests and clean them up,
710  *		aim: no pending and incoming I/O
711  *
712  * returns:
713  */
714 static void
715 zfcp_erp_port_block(struct zfcp_port *port, int clear_mask)
716 {
717 	struct zfcp_adapter *adapter = port->adapter;
718 
719 	debug_text_event(adapter->erp_dbf, 6, "p_bl");
720 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
721 	zfcp_erp_modify_port_status(port,
722 				    ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask,
723 				    ZFCP_CLEAR);
724 }
725 
726 /*
727  * function:
728  *
729  * purpose:	enable I/O
730  *
731  * returns:
732  */
733 static void
734 zfcp_erp_port_unblock(struct zfcp_port *port)
735 {
736 	struct zfcp_adapter *adapter = port->adapter;
737 
738 	debug_text_event(adapter->erp_dbf, 6, "p_ubl");
739 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
740 	atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status);
741 }
742 
743 /*
744  * function:
745  *
746  * purpose:	disable I/O,
747  *		return any open requests and clean them up,
748  *		aim: no pending and incoming I/O
749  *
750  * returns:
751  */
752 static void
753 zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask)
754 {
755 	struct zfcp_adapter *adapter = unit->port->adapter;
756 
757 	debug_text_event(adapter->erp_dbf, 6, "u_bl");
758 	debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t));
759 	zfcp_erp_modify_unit_status(unit,
760 				    ZFCP_STATUS_COMMON_UNBLOCKED | clear_mask,
761 				    ZFCP_CLEAR);
762 }
763 
764 /*
765  * function:
766  *
767  * purpose:	enable I/O
768  *
769  * returns:
770  */
771 static void
772 zfcp_erp_unit_unblock(struct zfcp_unit *unit)
773 {
774 	struct zfcp_adapter *adapter = unit->port->adapter;
775 
776 	debug_text_event(adapter->erp_dbf, 6, "u_ubl");
777 	debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t));
778 	atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &unit->status);
779 }
780 
781 static void
782 zfcp_erp_action_ready(struct zfcp_erp_action *erp_action)
783 {
784 	struct zfcp_adapter *adapter = erp_action->adapter;
785 
786 	debug_text_event(adapter->erp_dbf, 4, "a_ar");
787 	debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int));
788 
789 	zfcp_erp_action_to_ready(erp_action);
790 	up(&adapter->erp_ready_sem);
791 }
792 
793 /*
794  * function:
795  *
796  * purpose:
797  *
798  * returns:	<0			erp_action not found in any list
799  *		ZFCP_ERP_ACTION_READY	erp_action is in ready list
800  *		ZFCP_ERP_ACTION_RUNNING	erp_action is in running list
801  *
802  * locks:	erp_lock must be held
803  */
804 static int
805 zfcp_erp_action_exists(struct zfcp_erp_action *erp_action)
806 {
807 	int retval = -EINVAL;
808 	struct list_head *entry;
809 	struct zfcp_erp_action *entry_erp_action;
810 	struct zfcp_adapter *adapter = erp_action->adapter;
811 
812 	/* search in running list */
813 	list_for_each(entry, &adapter->erp_running_head) {
814 		entry_erp_action =
815 		    list_entry(entry, struct zfcp_erp_action, list);
816 		if (entry_erp_action == erp_action) {
817 			retval = ZFCP_ERP_ACTION_RUNNING;
818 			goto out;
819 		}
820 	}
821 	/* search in ready list */
822 	list_for_each(entry, &adapter->erp_ready_head) {
823 		entry_erp_action =
824 		    list_entry(entry, struct zfcp_erp_action, list);
825 		if (entry_erp_action == erp_action) {
826 			retval = ZFCP_ERP_ACTION_READY;
827 			goto out;
828 		}
829 	}
830 
831  out:
832 	return retval;
833 }
834 
835 /*
836  * purpose:	checks current status of action (timed out, dismissed, ...)
837  *		and does appropriate preparations (dismiss fsf request, ...)
838  *
839  * locks:	called under erp_lock (disabled interrupts)
840  */
841 static void
842 zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *erp_action)
843 {
844 	struct zfcp_adapter *adapter = erp_action->adapter;
845 
846 	if (erp_action->fsf_req) {
847 		/* take lock to ensure that request is not deleted meanwhile */
848 		spin_lock(&adapter->req_list_lock);
849 		if (zfcp_reqlist_find_safe(adapter, erp_action->fsf_req) &&
850 		    erp_action->fsf_req->erp_action == erp_action) {
851 			/* fsf_req still exists */
852 			debug_text_event(adapter->erp_dbf, 3, "a_ca_req");
853 			debug_event(adapter->erp_dbf, 3, &erp_action->fsf_req,
854 				    sizeof (unsigned long));
855 			/* dismiss fsf_req of timed out/dismissed erp_action */
856 			if (erp_action->status & (ZFCP_STATUS_ERP_DISMISSED |
857 						  ZFCP_STATUS_ERP_TIMEDOUT)) {
858 				debug_text_event(adapter->erp_dbf, 3,
859 						 "a_ca_disreq");
860 				erp_action->fsf_req->status |=
861 					ZFCP_STATUS_FSFREQ_DISMISSED;
862 			}
863 			if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
864 				ZFCP_LOG_NORMAL("error: erp step timed out "
865 						"(action=%d, fsf_req=%p)\n ",
866 						erp_action->action,
867 						erp_action->fsf_req);
868 			}
869 			/*
870 			 * If fsf_req is neither dismissed nor completed
871 			 * then keep it running asynchronously and don't mess
872 			 * with the association of erp_action and fsf_req.
873 			 */
874 			if (erp_action->fsf_req->status &
875 					(ZFCP_STATUS_FSFREQ_COMPLETED |
876 					       ZFCP_STATUS_FSFREQ_DISMISSED)) {
877 				/* forget about association between fsf_req
878 				   and erp_action */
879 				erp_action->fsf_req = NULL;
880 			}
881 		} else {
882 			debug_text_event(adapter->erp_dbf, 3, "a_ca_gonereq");
883 			/*
884 			 * even if this fsf_req has gone, forget about
885 			 * association between erp_action and fsf_req
886 			 */
887 			erp_action->fsf_req = NULL;
888 		}
889 		spin_unlock(&adapter->req_list_lock);
890 	} else
891 		debug_text_event(adapter->erp_dbf, 3, "a_ca_noreq");
892 }
893 
894 /**
895  * zfcp_erp_async_handler_nolock - complete erp_action
896  *
897  * Used for normal completion, time-out, dismissal and failure after
898  * low memory condition.
899  */
900 static void zfcp_erp_async_handler_nolock(struct zfcp_erp_action *erp_action,
901 					  unsigned long set_mask)
902 {
903 	struct zfcp_adapter *adapter = erp_action->adapter;
904 
905 	if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING) {
906 		debug_text_event(adapter->erp_dbf, 2, "a_asyh_ex");
907 		debug_event(adapter->erp_dbf, 2, &erp_action->action,
908 			    sizeof (int));
909 		erp_action->status |= set_mask;
910 		zfcp_erp_action_ready(erp_action);
911 	} else {
912 		/* action is ready or gone - nothing to do */
913 		debug_text_event(adapter->erp_dbf, 3, "a_asyh_gone");
914 		debug_event(adapter->erp_dbf, 3, &erp_action->action,
915 			    sizeof (int));
916 	}
917 }
918 
919 /**
920  * zfcp_erp_async_handler - wrapper for erp_async_handler_nolock w/ locking
921  */
922 void zfcp_erp_async_handler(struct zfcp_erp_action *erp_action,
923 			    unsigned long set_mask)
924 {
925 	struct zfcp_adapter *adapter = erp_action->adapter;
926 	unsigned long flags;
927 
928 	write_lock_irqsave(&adapter->erp_lock, flags);
929 	zfcp_erp_async_handler_nolock(erp_action, set_mask);
930 	write_unlock_irqrestore(&adapter->erp_lock, flags);
931 }
932 
933 /*
934  * purpose:	is called for erp_action which was slept waiting for
935  *		memory becoming avaliable,
936  *		will trigger that this action will be continued
937  */
938 static void
939 zfcp_erp_memwait_handler(unsigned long data)
940 {
941 	struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data;
942 	struct zfcp_adapter *adapter = erp_action->adapter;
943 
944 	debug_text_event(adapter->erp_dbf, 2, "a_mwh");
945 	debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int));
946 
947 	zfcp_erp_async_handler(erp_action, 0);
948 }
949 
950 /*
951  * purpose:	is called if an asynchronous erp step timed out,
952  *		action gets an appropriate flag and will be processed
953  *		accordingly
954  */
955 static void zfcp_erp_timeout_handler(unsigned long data)
956 {
957 	struct zfcp_erp_action *erp_action = (struct zfcp_erp_action *) data;
958 	struct zfcp_adapter *adapter = erp_action->adapter;
959 
960 	debug_text_event(adapter->erp_dbf, 2, "a_th");
961 	debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int));
962 
963 	zfcp_erp_async_handler(erp_action, ZFCP_STATUS_ERP_TIMEDOUT);
964 }
965 
966 /**
967  * zfcp_erp_action_dismiss - dismiss an erp_action
968  *
969  * adapter->erp_lock must be held
970  *
971  * Dismissal of an erp_action is usually required if an erp_action of
972  * higher priority is generated.
973  */
974 static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action)
975 {
976 	struct zfcp_adapter *adapter = erp_action->adapter;
977 
978 	debug_text_event(adapter->erp_dbf, 2, "a_adis");
979 	debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int));
980 
981 	erp_action->status |= ZFCP_STATUS_ERP_DISMISSED;
982 	if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING)
983 		zfcp_erp_action_ready(erp_action);
984 }
985 
986 int
987 zfcp_erp_thread_setup(struct zfcp_adapter *adapter)
988 {
989 	int retval = 0;
990 
991 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
992 
993 	retval = kernel_thread(zfcp_erp_thread, adapter, SIGCHLD);
994 	if (retval < 0) {
995 		ZFCP_LOG_NORMAL("error: creation of erp thread failed for "
996 				"adapter %s\n",
997 				zfcp_get_busid_by_adapter(adapter));
998 		debug_text_event(adapter->erp_dbf, 5, "a_thset_fail");
999 	} else {
1000 		wait_event(adapter->erp_thread_wqh,
1001 			   atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP,
1002 					    &adapter->status));
1003 		debug_text_event(adapter->erp_dbf, 5, "a_thset_ok");
1004 	}
1005 
1006 	return (retval < 0);
1007 }
1008 
1009 /*
1010  * function:
1011  *
1012  * purpose:
1013  *
1014  * returns:
1015  *
1016  * context:	process (i.e. proc-fs or rmmod/insmod)
1017  *
1018  * note:	The caller of this routine ensures that the specified
1019  *		adapter has been shut down and that this operation
1020  *		has been completed. Thus, there are no pending erp_actions
1021  *		which would need to be handled here.
1022  */
1023 int
1024 zfcp_erp_thread_kill(struct zfcp_adapter *adapter)
1025 {
1026 	int retval = 0;
1027 
1028 	atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status);
1029 	up(&adapter->erp_ready_sem);
1030 
1031 	wait_event(adapter->erp_thread_wqh,
1032 		   !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP,
1033 				     &adapter->status));
1034 
1035 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL,
1036 			  &adapter->status);
1037 
1038 	debug_text_event(adapter->erp_dbf, 5, "a_thki_ok");
1039 
1040 	return retval;
1041 }
1042 
1043 /*
1044  * purpose:	is run as a kernel thread,
1045  *		goes through list of error recovery actions of associated adapter
1046  *		and delegates single action to execution
1047  *
1048  * returns:	0
1049  */
1050 static int
1051 zfcp_erp_thread(void *data)
1052 {
1053 	struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
1054 	struct list_head *next;
1055 	struct zfcp_erp_action *erp_action;
1056 	unsigned long flags;
1057 
1058 	daemonize("zfcperp%s", zfcp_get_busid_by_adapter(adapter));
1059 	/* Block all signals */
1060 	siginitsetinv(&current->blocked, 0);
1061 	atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
1062 	debug_text_event(adapter->erp_dbf, 5, "a_th_run");
1063 	wake_up(&adapter->erp_thread_wqh);
1064 
1065 	while (!atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL,
1066 				 &adapter->status)) {
1067 
1068 		write_lock_irqsave(&adapter->erp_lock, flags);
1069 		next = adapter->erp_ready_head.next;
1070 		write_unlock_irqrestore(&adapter->erp_lock, flags);
1071 
1072 		if (next != &adapter->erp_ready_head) {
1073 			erp_action =
1074 			    list_entry(next, struct zfcp_erp_action, list);
1075 			/*
1076 			 * process action (incl. [re]moving it
1077 			 * from 'ready' queue)
1078 			 */
1079 			zfcp_erp_strategy(erp_action);
1080 		}
1081 
1082 		/*
1083 		 * sleep as long as there is nothing to do, i.e.
1084 		 * no action in 'ready' queue to be processed and
1085 		 * thread is not to be killed
1086 		 */
1087 		down_interruptible(&adapter->erp_ready_sem);
1088 		debug_text_event(adapter->erp_dbf, 5, "a_th_woken");
1089 	}
1090 
1091 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
1092 	debug_text_event(adapter->erp_dbf, 5, "a_th_stop");
1093 	wake_up(&adapter->erp_thread_wqh);
1094 
1095 	return 0;
1096 }
1097 
1098 /*
1099  * function:
1100  *
1101  * purpose:	drives single error recovery action and schedules higher and
1102  *		subordinate actions, if necessary
1103  *
1104  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
1105  *		ZFCP_ERP_SUCCEEDED	- action finished successfully (deqd)
1106  *		ZFCP_ERP_FAILED		- action finished unsuccessfully (deqd)
1107  *		ZFCP_ERP_EXIT		- action finished (dequeued), offline
1108  *		ZFCP_ERP_DISMISSED	- action canceled (dequeued)
1109  */
1110 static int
1111 zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
1112 {
1113 	int retval = 0;
1114 	struct zfcp_adapter *adapter = erp_action->adapter;
1115 	struct zfcp_port *port = erp_action->port;
1116 	struct zfcp_unit *unit = erp_action->unit;
1117 	int action = erp_action->action;
1118 	u32 status = erp_action->status;
1119 	unsigned long flags;
1120 
1121 	/* serialise dismissing, timing out, moving, enqueueing */
1122 	read_lock_irqsave(&zfcp_data.config_lock, flags);
1123 	write_lock(&adapter->erp_lock);
1124 
1125 	/* dequeue dismissed action and leave, if required */
1126 	retval = zfcp_erp_strategy_check_action(erp_action, retval);
1127 	if (retval == ZFCP_ERP_DISMISSED) {
1128 		debug_text_event(adapter->erp_dbf, 4, "a_st_dis1");
1129 		goto unlock;
1130 	}
1131 
1132 	/*
1133 	 * move action to 'running' queue before processing it
1134 	 * (to avoid a race condition regarding moving the
1135 	 * action to the 'running' queue and back)
1136 	 */
1137 	zfcp_erp_action_to_running(erp_action);
1138 
1139 	/*
1140 	 * try to process action as far as possible,
1141 	 * no lock to allow for blocking operations (kmalloc, qdio, ...),
1142 	 * afterwards the lock is required again for the following reasons:
1143 	 * - dequeueing of finished action and enqueueing of
1144 	 *   follow-up actions must be atomic so that any other
1145 	 *   reopen-routine does not believe there is nothing to do
1146 	 *   and that it is safe to enqueue something else,
1147 	 * - we want to force any control thread which is dismissing
1148 	 *   actions to finish this before we decide about
1149 	 *   necessary steps to be taken here further
1150 	 */
1151 	write_unlock(&adapter->erp_lock);
1152 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1153 	retval = zfcp_erp_strategy_do_action(erp_action);
1154 	read_lock_irqsave(&zfcp_data.config_lock, flags);
1155 	write_lock(&adapter->erp_lock);
1156 
1157 	/*
1158 	 * check for dismissed status again to avoid follow-up actions,
1159 	 * failing of targets and so on for dismissed actions,
1160 	 * we go through down() here because there has been an up()
1161 	 */
1162 	if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED)
1163 		retval = ZFCP_ERP_CONTINUES;
1164 
1165 	switch (retval) {
1166 	case ZFCP_ERP_NOMEM:
1167 		/* no memory to continue immediately, let it sleep */
1168 		if (!(erp_action->status & ZFCP_STATUS_ERP_LOWMEM)) {
1169 			++adapter->erp_low_mem_count;
1170 			erp_action->status |= ZFCP_STATUS_ERP_LOWMEM;
1171 		}
1172 		/* This condition is true if there is no memory available
1173 		   for any erp_action on this adapter. This implies that there
1174 		   are no elements in the memory pool(s) left for erp_actions.
1175 		   This might happen if an erp_action that used a memory pool
1176 		   element was timed out.
1177 		 */
1178 		if (adapter->erp_total_count == adapter->erp_low_mem_count) {
1179 			debug_text_event(adapter->erp_dbf, 3, "a_st_lowmem");
1180 			ZFCP_LOG_NORMAL("error: no mempool elements available, "
1181 					"restarting I/O on adapter %s "
1182 					"to free mempool\n",
1183 					zfcp_get_busid_by_adapter(adapter));
1184 			zfcp_erp_adapter_reopen_internal(adapter, 0);
1185 		} else {
1186 		debug_text_event(adapter->erp_dbf, 2, "a_st_memw");
1187 		retval = zfcp_erp_strategy_memwait(erp_action);
1188 		}
1189 		goto unlock;
1190 	case ZFCP_ERP_CONTINUES:
1191 		/* leave since this action runs asynchronously */
1192 		debug_text_event(adapter->erp_dbf, 6, "a_st_cont");
1193 		if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
1194 			--adapter->erp_low_mem_count;
1195 			erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
1196 		}
1197 		goto unlock;
1198 	}
1199 	/* ok, finished action (whatever its result is) */
1200 
1201 	/* check for unrecoverable targets */
1202 	retval = zfcp_erp_strategy_check_target(erp_action, retval);
1203 
1204 	/* action must be dequeued (here to allow for further ones) */
1205 	zfcp_erp_action_dequeue(erp_action);
1206 
1207 	/*
1208 	 * put this target through the erp mill again if someone has
1209 	 * requested to change the status of a target being online
1210 	 * to offline or the other way around
1211 	 * (old retval is preserved if nothing has to be done here)
1212 	 */
1213 	retval = zfcp_erp_strategy_statechange(action, status, adapter,
1214 					       port, unit, retval);
1215 
1216 	/*
1217 	 * leave if target is in permanent error state or if
1218 	 * action is repeated in order to process state change
1219 	 */
1220 	if (retval == ZFCP_ERP_EXIT) {
1221 		debug_text_event(adapter->erp_dbf, 2, "a_st_exit");
1222 		goto unlock;
1223 	}
1224 
1225 	/* trigger follow up actions */
1226 	zfcp_erp_strategy_followup_actions(action, adapter, port, unit, retval);
1227 
1228  unlock:
1229 	write_unlock(&adapter->erp_lock);
1230 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1231 
1232 	if (retval != ZFCP_ERP_CONTINUES)
1233 		zfcp_erp_action_cleanup(action, adapter, port, unit, retval);
1234 
1235 	/*
1236 	 * a few tasks remain when the erp queues are empty
1237 	 * (don't do that if the last action evaluated was dismissed
1238 	 * since this clearly indicates that there is more to come) :
1239 	 * - close the name server port if it is open yet
1240 	 *   (enqueues another [probably] final action)
1241 	 * - otherwise, wake up whoever wants to be woken when we are
1242 	 *   done with erp
1243 	 */
1244 	if (retval != ZFCP_ERP_DISMISSED)
1245 		zfcp_erp_strategy_check_queues(adapter);
1246 
1247 	debug_text_event(adapter->erp_dbf, 6, "a_st_done");
1248 
1249 	return retval;
1250 }
1251 
1252 /*
1253  * function:
1254  *
1255  * purpose:
1256  *
1257  * returns:	ZFCP_ERP_DISMISSED	- if action has been dismissed
1258  *		retval			- otherwise
1259  */
1260 static int
1261 zfcp_erp_strategy_check_action(struct zfcp_erp_action *erp_action, int retval)
1262 {
1263 	struct zfcp_adapter *adapter = erp_action->adapter;
1264 
1265 	zfcp_erp_strategy_check_fsfreq(erp_action);
1266 
1267 	debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int));
1268 	if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED) {
1269 		debug_text_event(adapter->erp_dbf, 3, "a_stcd_dis");
1270 		zfcp_erp_action_dequeue(erp_action);
1271 		retval = ZFCP_ERP_DISMISSED;
1272 	} else
1273 		debug_text_event(adapter->erp_dbf, 5, "a_stcd_nodis");
1274 
1275 	return retval;
1276 }
1277 
1278 static int
1279 zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action)
1280 {
1281 	int retval = ZFCP_ERP_FAILED;
1282 	struct zfcp_adapter *adapter = erp_action->adapter;
1283 
1284 	/*
1285 	 * try to execute/continue action as far as possible,
1286 	 * note: no lock in subsequent strategy routines
1287 	 * (this allows these routine to call schedule, e.g.
1288 	 * kmalloc with such flags or qdio_initialize & friends)
1289 	 * Note: in case of timeout, the separate strategies will fail
1290 	 * anyhow. No need for a special action. Even worse, a nameserver
1291 	 * failure would not wake up waiting ports without the call.
1292 	 */
1293 	switch (erp_action->action) {
1294 
1295 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1296 		retval = zfcp_erp_adapter_strategy(erp_action);
1297 		break;
1298 
1299 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1300 		retval = zfcp_erp_port_forced_strategy(erp_action);
1301 		break;
1302 
1303 	case ZFCP_ERP_ACTION_REOPEN_PORT:
1304 		retval = zfcp_erp_port_strategy(erp_action);
1305 		break;
1306 
1307 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
1308 		retval = zfcp_erp_unit_strategy(erp_action);
1309 		break;
1310 
1311 	default:
1312 		debug_text_exception(adapter->erp_dbf, 1, "a_stda_bug");
1313 		debug_event(adapter->erp_dbf, 1, &erp_action->action,
1314 			    sizeof (int));
1315 		ZFCP_LOG_NORMAL("bug: unknown erp action requested on "
1316 				"adapter %s (action=%d)\n",
1317 				zfcp_get_busid_by_adapter(erp_action->adapter),
1318 				erp_action->action);
1319 	}
1320 
1321 	return retval;
1322 }
1323 
1324 /*
1325  * function:
1326  *
1327  * purpose:	triggers retry of this action after a certain amount of time
1328  *		by means of timer provided by erp_action
1329  *
1330  * returns:	ZFCP_ERP_CONTINUES - erp_action sleeps in erp running queue
1331  */
1332 static int
1333 zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action)
1334 {
1335 	int retval = ZFCP_ERP_CONTINUES;
1336 	struct zfcp_adapter *adapter = erp_action->adapter;
1337 
1338 	debug_text_event(adapter->erp_dbf, 6, "a_mwinit");
1339 	debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int));
1340 	init_timer(&erp_action->timer);
1341 	erp_action->timer.function = zfcp_erp_memwait_handler;
1342 	erp_action->timer.data = (unsigned long) erp_action;
1343 	erp_action->timer.expires = jiffies + ZFCP_ERP_MEMWAIT_TIMEOUT;
1344 	add_timer(&erp_action->timer);
1345 
1346 	return retval;
1347 }
1348 
1349 /*
1350  * function:    zfcp_erp_adapter_failed
1351  *
1352  * purpose:     sets the adapter and all underlying devices to ERP_FAILED
1353  *
1354  */
1355 void
1356 zfcp_erp_adapter_failed(struct zfcp_adapter *adapter)
1357 {
1358 	zfcp_erp_modify_adapter_status(adapter,
1359 				       ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
1360 	ZFCP_LOG_NORMAL("adapter erp failed on adapter %s\n",
1361 			zfcp_get_busid_by_adapter(adapter));
1362 	debug_text_event(adapter->erp_dbf, 2, "a_afail");
1363 }
1364 
1365 /*
1366  * function:    zfcp_erp_port_failed
1367  *
1368  * purpose:     sets the port and all underlying devices to ERP_FAILED
1369  *
1370  */
1371 void
1372 zfcp_erp_port_failed(struct zfcp_port *port)
1373 {
1374 	zfcp_erp_modify_port_status(port,
1375 				    ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
1376 
1377 	if (atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
1378 		ZFCP_LOG_NORMAL("port erp failed (adapter %s, "
1379 				"port d_id=0x%06x)\n",
1380 				zfcp_get_busid_by_port(port), port->d_id);
1381 	else
1382 		ZFCP_LOG_NORMAL("port erp failed (adapter %s, wwpn=0x%016Lx)\n",
1383 				zfcp_get_busid_by_port(port), port->wwpn);
1384 
1385 	debug_text_event(port->adapter->erp_dbf, 2, "p_pfail");
1386 	debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t));
1387 }
1388 
1389 /*
1390  * function:    zfcp_erp_unit_failed
1391  *
1392  * purpose:     sets the unit to ERP_FAILED
1393  *
1394  */
1395 void
1396 zfcp_erp_unit_failed(struct zfcp_unit *unit)
1397 {
1398 	zfcp_erp_modify_unit_status(unit,
1399 				    ZFCP_STATUS_COMMON_ERP_FAILED, ZFCP_SET);
1400 
1401 	ZFCP_LOG_NORMAL("unit erp failed on unit 0x%016Lx on port 0x%016Lx "
1402 			" on adapter %s\n", unit->fcp_lun,
1403 			unit->port->wwpn, zfcp_get_busid_by_unit(unit));
1404 	debug_text_event(unit->port->adapter->erp_dbf, 2, "u_ufail");
1405 	debug_event(unit->port->adapter->erp_dbf, 2,
1406 		    &unit->fcp_lun, sizeof (fcp_lun_t));
1407 }
1408 
1409 /*
1410  * function:	zfcp_erp_strategy_check_target
1411  *
1412  * purpose:	increments the erp action count on the device currently in
1413  *              recovery if the action failed or resets the count in case of
1414  *              success. If a maximum count is exceeded the device is marked
1415  *              as ERP_FAILED.
1416  *		The 'blocked' state of a target which has been recovered
1417  *              successfully is reset.
1418  *
1419  * returns:	ZFCP_ERP_CONTINUES	- action continues (not considered)
1420  *		ZFCP_ERP_SUCCEEDED	- action finished successfully
1421  *		ZFCP_ERP_EXIT		- action failed and will not continue
1422  */
1423 static int
1424 zfcp_erp_strategy_check_target(struct zfcp_erp_action *erp_action, int result)
1425 {
1426 	struct zfcp_adapter *adapter = erp_action->adapter;
1427 	struct zfcp_port *port = erp_action->port;
1428 	struct zfcp_unit *unit = erp_action->unit;
1429 
1430 	debug_text_event(adapter->erp_dbf, 5, "a_stct_norm");
1431 	debug_event(adapter->erp_dbf, 5, &erp_action->action, sizeof (int));
1432 	debug_event(adapter->erp_dbf, 5, &result, sizeof (int));
1433 
1434 	switch (erp_action->action) {
1435 
1436 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
1437 		result = zfcp_erp_strategy_check_unit(unit, result);
1438 		break;
1439 
1440 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1441 	case ZFCP_ERP_ACTION_REOPEN_PORT:
1442 		result = zfcp_erp_strategy_check_port(port, result);
1443 		break;
1444 
1445 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1446 		result = zfcp_erp_strategy_check_adapter(adapter, result);
1447 		break;
1448 	}
1449 
1450 	return result;
1451 }
1452 
1453 static int
1454 zfcp_erp_strategy_statechange(int action,
1455 			      u32 status,
1456 			      struct zfcp_adapter *adapter,
1457 			      struct zfcp_port *port,
1458 			      struct zfcp_unit *unit, int retval)
1459 {
1460 	debug_text_event(adapter->erp_dbf, 3, "a_stsc");
1461 	debug_event(adapter->erp_dbf, 3, &action, sizeof (int));
1462 
1463 	switch (action) {
1464 
1465 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1466 		if (zfcp_erp_strategy_statechange_detected(&adapter->status,
1467 							   status)) {
1468 			zfcp_erp_adapter_reopen_internal(adapter, ZFCP_STATUS_COMMON_ERP_FAILED);
1469 			retval = ZFCP_ERP_EXIT;
1470 		}
1471 		break;
1472 
1473 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1474 	case ZFCP_ERP_ACTION_REOPEN_PORT:
1475 		if (zfcp_erp_strategy_statechange_detected(&port->status,
1476 							   status)) {
1477 			zfcp_erp_port_reopen_internal(port, ZFCP_STATUS_COMMON_ERP_FAILED);
1478 			retval = ZFCP_ERP_EXIT;
1479 		}
1480 		break;
1481 
1482 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
1483 		if (zfcp_erp_strategy_statechange_detected(&unit->status,
1484 							   status)) {
1485 			zfcp_erp_unit_reopen_internal(unit, ZFCP_STATUS_COMMON_ERP_FAILED);
1486 			retval = ZFCP_ERP_EXIT;
1487 		}
1488 		break;
1489 	}
1490 
1491 	return retval;
1492 }
1493 
1494 static int
1495 zfcp_erp_strategy_statechange_detected(atomic_t * target_status, u32 erp_status)
1496 {
1497 	return
1498 	    /* take it online */
1499 	    (atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, target_status) &&
1500 	     (ZFCP_STATUS_ERP_CLOSE_ONLY & erp_status)) ||
1501 	    /* take it offline */
1502 	    (!atomic_test_mask(ZFCP_STATUS_COMMON_RUNNING, target_status) &&
1503 	     !(ZFCP_STATUS_ERP_CLOSE_ONLY & erp_status));
1504 }
1505 
1506 static int
1507 zfcp_erp_strategy_check_unit(struct zfcp_unit *unit, int result)
1508 {
1509 	debug_text_event(unit->port->adapter->erp_dbf, 5, "u_stct");
1510 	debug_event(unit->port->adapter->erp_dbf, 5, &unit->fcp_lun,
1511 		    sizeof (fcp_lun_t));
1512 
1513 	switch (result) {
1514 	case ZFCP_ERP_SUCCEEDED :
1515 		atomic_set(&unit->erp_counter, 0);
1516 		zfcp_erp_unit_unblock(unit);
1517 		break;
1518 	case ZFCP_ERP_FAILED :
1519 		atomic_inc(&unit->erp_counter);
1520 		if (atomic_read(&unit->erp_counter) > ZFCP_MAX_ERPS)
1521 			zfcp_erp_unit_failed(unit);
1522 		break;
1523 	case ZFCP_ERP_EXIT :
1524 		/* nothing */
1525 		break;
1526 	}
1527 
1528 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &unit->status)) {
1529 		zfcp_erp_unit_block(unit, 0); /* for ZFCP_ERP_SUCCEEDED */
1530 		result = ZFCP_ERP_EXIT;
1531 	}
1532 
1533 	return result;
1534 }
1535 
1536 static int
1537 zfcp_erp_strategy_check_port(struct zfcp_port *port, int result)
1538 {
1539 	debug_text_event(port->adapter->erp_dbf, 5, "p_stct");
1540 	debug_event(port->adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
1541 
1542 	switch (result) {
1543 	case ZFCP_ERP_SUCCEEDED :
1544 		atomic_set(&port->erp_counter, 0);
1545 		zfcp_erp_port_unblock(port);
1546 		break;
1547 	case ZFCP_ERP_FAILED :
1548 		atomic_inc(&port->erp_counter);
1549 		if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS)
1550 			zfcp_erp_port_failed(port);
1551 		break;
1552 	case ZFCP_ERP_EXIT :
1553 		/* nothing */
1554 		break;
1555 	}
1556 
1557 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
1558 		zfcp_erp_port_block(port, 0); /* for ZFCP_ERP_SUCCEEDED */
1559 		result = ZFCP_ERP_EXIT;
1560 	}
1561 
1562 	return result;
1563 }
1564 
1565 static int
1566 zfcp_erp_strategy_check_adapter(struct zfcp_adapter *adapter, int result)
1567 {
1568 	debug_text_event(adapter->erp_dbf, 5, "a_stct");
1569 
1570 	switch (result) {
1571 	case ZFCP_ERP_SUCCEEDED :
1572 		atomic_set(&adapter->erp_counter, 0);
1573 		zfcp_erp_adapter_unblock(adapter);
1574 		break;
1575 	case ZFCP_ERP_FAILED :
1576 		atomic_inc(&adapter->erp_counter);
1577 		if (atomic_read(&adapter->erp_counter) > ZFCP_MAX_ERPS)
1578 			zfcp_erp_adapter_failed(adapter);
1579 		break;
1580 	case ZFCP_ERP_EXIT :
1581 		/* nothing */
1582 		break;
1583 	}
1584 
1585 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) {
1586 		zfcp_erp_adapter_block(adapter, 0); /* for ZFCP_ERP_SUCCEEDED */
1587 		result = ZFCP_ERP_EXIT;
1588 	}
1589 
1590 	return result;
1591 }
1592 
1593 struct zfcp_erp_add_work {
1594 	struct zfcp_unit  *unit;
1595 	struct work_struct work;
1596 };
1597 
1598 /**
1599  * zfcp_erp_scsi_scan
1600  * @data: pointer to a struct zfcp_erp_add_work
1601  *
1602  * Registers a logical unit with the SCSI stack.
1603  */
1604 static void zfcp_erp_scsi_scan(struct work_struct *work)
1605 {
1606 	struct zfcp_erp_add_work *p =
1607 		container_of(work, struct zfcp_erp_add_work, work);
1608 	struct zfcp_unit *unit = p->unit;
1609 	struct fc_rport *rport = unit->port->rport;
1610 	scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
1611 			 unit->scsi_lun, 0);
1612 	atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1613 	zfcp_unit_put(unit);
1614 	kfree(p);
1615 }
1616 
1617 /**
1618  * zfcp_erp_schedule_work
1619  * @unit: pointer to unit which should be registered with SCSI stack
1620  *
1621  * Schedules work which registers a unit with the SCSI stack
1622  */
1623 static void
1624 zfcp_erp_schedule_work(struct zfcp_unit *unit)
1625 {
1626 	struct zfcp_erp_add_work *p;
1627 
1628 	p = kzalloc(sizeof(*p), GFP_KERNEL);
1629 	if (!p) {
1630 		ZFCP_LOG_NORMAL("error: Out of resources. Could not register "
1631 				"the FCP-LUN 0x%Lx connected to "
1632 				"the port with WWPN 0x%Lx connected to "
1633 				"the adapter %s with the SCSI stack.\n",
1634 				unit->fcp_lun,
1635 				unit->port->wwpn,
1636 				zfcp_get_busid_by_unit(unit));
1637 		return;
1638 	}
1639 
1640 	zfcp_unit_get(unit);
1641 	atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1642 	INIT_WORK(&p->work, zfcp_erp_scsi_scan);
1643 	p->unit = unit;
1644 	schedule_work(&p->work);
1645 }
1646 
1647 /*
1648  * function:
1649  *
1650  * purpose:	remaining things in good cases,
1651  *		escalation in bad cases
1652  *
1653  * returns:
1654  */
1655 static int
1656 zfcp_erp_strategy_followup_actions(int action,
1657 				   struct zfcp_adapter *adapter,
1658 				   struct zfcp_port *port,
1659 				   struct zfcp_unit *unit, int status)
1660 {
1661 	debug_text_event(adapter->erp_dbf, 5, "a_stfol");
1662 	debug_event(adapter->erp_dbf, 5, &action, sizeof (int));
1663 
1664 	/* initiate follow-up actions depending on success of finished action */
1665 	switch (action) {
1666 
1667 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
1668 		if (status == ZFCP_ERP_SUCCEEDED)
1669 			zfcp_erp_port_reopen_all_internal(adapter, 0);
1670 		else
1671 			zfcp_erp_adapter_reopen_internal(adapter, 0);
1672 		break;
1673 
1674 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
1675 		if (status == ZFCP_ERP_SUCCEEDED)
1676 			zfcp_erp_port_reopen_internal(port, 0);
1677 		else
1678 			zfcp_erp_adapter_reopen_internal(adapter, 0);
1679 		break;
1680 
1681 	case ZFCP_ERP_ACTION_REOPEN_PORT:
1682 		if (status == ZFCP_ERP_SUCCEEDED)
1683 			zfcp_erp_unit_reopen_all_internal(port, 0);
1684 		else
1685 			zfcp_erp_port_forced_reopen_internal(port, 0);
1686 		break;
1687 
1688 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
1689 		/* Nothing to do if status == ZFCP_ERP_SUCCEEDED */
1690 		if (status != ZFCP_ERP_SUCCEEDED)
1691 			zfcp_erp_port_reopen_internal(unit->port, 0);
1692 		break;
1693 	}
1694 
1695 	return 0;
1696 }
1697 
1698 static int
1699 zfcp_erp_strategy_check_queues(struct zfcp_adapter *adapter)
1700 {
1701 	unsigned long flags;
1702 
1703 	read_lock_irqsave(&zfcp_data.config_lock, flags);
1704 	read_lock(&adapter->erp_lock);
1705 	if (list_empty(&adapter->erp_ready_head) &&
1706 	    list_empty(&adapter->erp_running_head)) {
1707 			debug_text_event(adapter->erp_dbf, 4, "a_cq_wake");
1708 			atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING,
1709 					  &adapter->status);
1710 			wake_up(&adapter->erp_done_wqh);
1711 	} else
1712 		debug_text_event(adapter->erp_dbf, 5, "a_cq_notempty");
1713 	read_unlock(&adapter->erp_lock);
1714 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1715 
1716 	return 0;
1717 }
1718 
1719 /**
1720  * zfcp_erp_wait - wait for completion of error recovery on an adapter
1721  * @adapter: adapter for which to wait for completion of its error recovery
1722  * Return: 0
1723  */
1724 int
1725 zfcp_erp_wait(struct zfcp_adapter *adapter)
1726 {
1727 	int retval = 0;
1728 
1729 	wait_event(adapter->erp_done_wqh,
1730 		   !atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING,
1731 				     &adapter->status));
1732 
1733 	return retval;
1734 }
1735 
1736 void
1737 zfcp_erp_modify_adapter_status(struct zfcp_adapter *adapter,
1738 			       u32 mask, int set_or_clear)
1739 {
1740 	struct zfcp_port *port;
1741 	u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1742 
1743 	if (set_or_clear == ZFCP_SET) {
1744 		atomic_set_mask(mask, &adapter->status);
1745 		debug_text_event(adapter->erp_dbf, 3, "a_mod_as_s");
1746 	} else {
1747 		atomic_clear_mask(mask, &adapter->status);
1748 		if (mask & ZFCP_STATUS_COMMON_ERP_FAILED)
1749 			atomic_set(&adapter->erp_counter, 0);
1750 		debug_text_event(adapter->erp_dbf, 3, "a_mod_as_c");
1751 	}
1752 	debug_event(adapter->erp_dbf, 3, &mask, sizeof (u32));
1753 
1754 	/* Deal with all underlying devices, only pass common_mask */
1755 	if (common_mask)
1756 		list_for_each_entry(port, &adapter->port_list_head, list)
1757 		    zfcp_erp_modify_port_status(port, common_mask,
1758 						set_or_clear);
1759 }
1760 
1761 /*
1762  * function:	zfcp_erp_modify_port_status
1763  *
1764  * purpose:	sets the port and all underlying devices to ERP_FAILED
1765  *
1766  */
1767 void
1768 zfcp_erp_modify_port_status(struct zfcp_port *port, u32 mask, int set_or_clear)
1769 {
1770 	struct zfcp_unit *unit;
1771 	u32 common_mask = mask & ZFCP_COMMON_FLAGS;
1772 
1773 	if (set_or_clear == ZFCP_SET) {
1774 		atomic_set_mask(mask, &port->status);
1775 		debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_s");
1776 	} else {
1777 		atomic_clear_mask(mask, &port->status);
1778 		if (mask & ZFCP_STATUS_COMMON_ERP_FAILED)
1779 			atomic_set(&port->erp_counter, 0);
1780 		debug_text_event(port->adapter->erp_dbf, 3, "p_mod_ps_c");
1781 	}
1782 	debug_event(port->adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t));
1783 	debug_event(port->adapter->erp_dbf, 3, &mask, sizeof (u32));
1784 
1785 	/* Modify status of all underlying devices, only pass common mask */
1786 	if (common_mask)
1787 		list_for_each_entry(unit, &port->unit_list_head, list)
1788 		    zfcp_erp_modify_unit_status(unit, common_mask,
1789 						set_or_clear);
1790 }
1791 
1792 /*
1793  * function:	zfcp_erp_modify_unit_status
1794  *
1795  * purpose:	sets the unit to ERP_FAILED
1796  *
1797  */
1798 void
1799 zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear)
1800 {
1801 	if (set_or_clear == ZFCP_SET) {
1802 		atomic_set_mask(mask, &unit->status);
1803 		debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_s");
1804 	} else {
1805 		atomic_clear_mask(mask, &unit->status);
1806 		if (mask & ZFCP_STATUS_COMMON_ERP_FAILED) {
1807 			atomic_set(&unit->erp_counter, 0);
1808 		}
1809 		debug_text_event(unit->port->adapter->erp_dbf, 3, "u_mod_us_c");
1810 	}
1811 	debug_event(unit->port->adapter->erp_dbf, 3, &unit->fcp_lun,
1812 		    sizeof (fcp_lun_t));
1813 	debug_event(unit->port->adapter->erp_dbf, 3, &mask, sizeof (u32));
1814 }
1815 
1816 /*
1817  * function:
1818  *
1819  * purpose:	Wrappper for zfcp_erp_port_reopen_all_internal
1820  *              used to ensure the correct locking
1821  *
1822  * returns:	0	- initiated action successfully
1823  *		<0	- failed to initiate action
1824  */
1825 int
1826 zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, int clear_mask)
1827 {
1828 	int retval;
1829 	unsigned long flags;
1830 
1831 	read_lock_irqsave(&zfcp_data.config_lock, flags);
1832 	write_lock(&adapter->erp_lock);
1833 	retval = zfcp_erp_port_reopen_all_internal(adapter, clear_mask);
1834 	write_unlock(&adapter->erp_lock);
1835 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1836 
1837 	return retval;
1838 }
1839 
1840 static int
1841 zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask)
1842 {
1843 	int retval = 0;
1844 	struct zfcp_port *port;
1845 
1846 	list_for_each_entry(port, &adapter->port_list_head, list)
1847 		if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
1848 			zfcp_erp_port_reopen_internal(port, clear_mask);
1849 
1850 	return retval;
1851 }
1852 
1853 /*
1854  * function:
1855  *
1856  * purpose:
1857  *
1858  * returns:	FIXME
1859  */
1860 static int
1861 zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, int clear_mask)
1862 {
1863 	int retval = 0;
1864 	struct zfcp_unit *unit;
1865 
1866 	list_for_each_entry(unit, &port->unit_list_head, list)
1867 	    zfcp_erp_unit_reopen_internal(unit, clear_mask);
1868 
1869 	return retval;
1870 }
1871 
1872 /*
1873  * function:
1874  *
1875  * purpose:	this routine executes the 'Reopen Adapter' action
1876  *		(the entire action is processed synchronously, since
1877  *		there are no actions which might be run concurrently
1878  *		per definition)
1879  *
1880  * returns:	ZFCP_ERP_SUCCEEDED	- action finished successfully
1881  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
1882  */
1883 static int
1884 zfcp_erp_adapter_strategy(struct zfcp_erp_action *erp_action)
1885 {
1886 	int retval;
1887 	struct zfcp_adapter *adapter = erp_action->adapter;
1888 
1889 	retval = zfcp_erp_adapter_strategy_close(erp_action);
1890 	if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
1891 		retval = ZFCP_ERP_EXIT;
1892 	else
1893 		retval = zfcp_erp_adapter_strategy_open(erp_action);
1894 
1895 	debug_text_event(adapter->erp_dbf, 3, "a_ast/ret");
1896 	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
1897 	debug_event(adapter->erp_dbf, 3, &retval, sizeof (int));
1898 
1899 	if (retval == ZFCP_ERP_FAILED) {
1900 		ZFCP_LOG_INFO("Waiting to allow the adapter %s "
1901 			      "to recover itself\n",
1902 			      zfcp_get_busid_by_adapter(adapter));
1903 		ssleep(ZFCP_TYPE2_RECOVERY_TIME);
1904 	}
1905 
1906 	return retval;
1907 }
1908 
1909 /*
1910  * function:
1911  *
1912  * purpose:
1913  *
1914  * returns:	ZFCP_ERP_SUCCEEDED      - action finished successfully
1915  *              ZFCP_ERP_FAILED         - action finished unsuccessfully
1916  */
1917 static int
1918 zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *erp_action)
1919 {
1920 	int retval;
1921 
1922 	atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING,
1923 			&erp_action->adapter->status);
1924 	retval = zfcp_erp_adapter_strategy_generic(erp_action, 1);
1925 	atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING,
1926 			  &erp_action->adapter->status);
1927 
1928 	return retval;
1929 }
1930 
1931 /*
1932  * function:
1933  *
1934  * purpose:
1935  *
1936  * returns:	ZFCP_ERP_SUCCEEDED      - action finished successfully
1937  *              ZFCP_ERP_FAILED         - action finished unsuccessfully
1938  */
1939 static int
1940 zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *erp_action)
1941 {
1942 	int retval;
1943 
1944 	atomic_set_mask(ZFCP_STATUS_COMMON_OPENING,
1945 			&erp_action->adapter->status);
1946 	retval = zfcp_erp_adapter_strategy_generic(erp_action, 0);
1947 	atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING,
1948 			  &erp_action->adapter->status);
1949 
1950 	return retval;
1951 }
1952 
1953 /*
1954  * function:    zfcp_register_adapter
1955  *
1956  * purpose:	allocate the irq associated with this devno and register
1957  *		the FSF adapter with the SCSI stack
1958  *
1959  * returns:
1960  */
1961 static int
1962 zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *erp_action, int close)
1963 {
1964 	int retval = ZFCP_ERP_SUCCEEDED;
1965 
1966 	if (close)
1967 		goto close_only;
1968 
1969 	retval = zfcp_erp_adapter_strategy_open_qdio(erp_action);
1970 	if (retval != ZFCP_ERP_SUCCEEDED)
1971 		goto failed_qdio;
1972 
1973 	retval = zfcp_erp_adapter_strategy_open_fsf(erp_action);
1974 	if (retval != ZFCP_ERP_SUCCEEDED)
1975 		goto failed_openfcp;
1976 
1977 	atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &erp_action->adapter->status);
1978 	goto out;
1979 
1980  close_only:
1981 	atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN,
1982 			  &erp_action->adapter->status);
1983 
1984  failed_openfcp:
1985 	zfcp_close_fsf(erp_action->adapter);
1986  failed_qdio:
1987 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
1988 			  ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
1989 			  ZFCP_STATUS_ADAPTER_XPORT_OK,
1990 			  &erp_action->adapter->status);
1991  out:
1992 	return retval;
1993 }
1994 
1995 /*
1996  * function:    zfcp_qdio_init
1997  *
1998  * purpose:	setup QDIO operation for specified adapter
1999  *
2000  * returns:	0 - successful setup
2001  *		!0 - failed setup
2002  */
2003 static int
2004 zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *erp_action)
2005 {
2006 	int retval;
2007 	int i;
2008 	volatile struct qdio_buffer_element *sbale;
2009 	struct zfcp_adapter *adapter = erp_action->adapter;
2010 
2011 	if (atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status)) {
2012 		ZFCP_LOG_NORMAL("bug: second attempt to set up QDIO on "
2013 				"adapter %s\n",
2014 				zfcp_get_busid_by_adapter(adapter));
2015 		goto failed_sanity;
2016 	}
2017 
2018 	if (qdio_establish(&adapter->qdio_init_data) != 0) {
2019 		ZFCP_LOG_INFO("error: establishment of QDIO queues failed "
2020 			      "on adapter %s\n",
2021 			      zfcp_get_busid_by_adapter(adapter));
2022 		goto failed_qdio_establish;
2023 	}
2024 	debug_text_event(adapter->erp_dbf, 3, "qdio_est");
2025 
2026 	if (qdio_activate(adapter->ccw_device, 0) != 0) {
2027 		ZFCP_LOG_INFO("error: activation of QDIO queues failed "
2028 			      "on adapter %s\n",
2029 			      zfcp_get_busid_by_adapter(adapter));
2030 		goto failed_qdio_activate;
2031 	}
2032 	debug_text_event(adapter->erp_dbf, 3, "qdio_act");
2033 
2034 	/*
2035 	 * put buffers into response queue,
2036 	 */
2037 	for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) {
2038 		sbale = &(adapter->response_queue.buffer[i]->element[0]);
2039 		sbale->length = 0;
2040 		sbale->flags = SBAL_FLAGS_LAST_ENTRY;
2041 		sbale->addr = NULL;
2042 	}
2043 
2044 	ZFCP_LOG_TRACE("calling do_QDIO on adapter %s (flags=0x%x, "
2045 		       "queue_no=%i, index_in_queue=%i, count=%i)\n",
2046 		       zfcp_get_busid_by_adapter(adapter),
2047 		       QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q);
2048 
2049 	retval = do_QDIO(adapter->ccw_device,
2050 			 QDIO_FLAG_SYNC_INPUT,
2051 			 0, 0, QDIO_MAX_BUFFERS_PER_Q, NULL);
2052 
2053 	if (retval) {
2054 		ZFCP_LOG_NORMAL("bug: setup of QDIO failed (retval=%d)\n",
2055 				retval);
2056 		goto failed_do_qdio;
2057 	} else {
2058 		adapter->response_queue.free_index = 0;
2059 		atomic_set(&adapter->response_queue.free_count, 0);
2060 		ZFCP_LOG_DEBUG("%i buffers successfully enqueued to "
2061 			       "response queue\n", QDIO_MAX_BUFFERS_PER_Q);
2062 	}
2063 	/* set index of first avalable SBALS / number of available SBALS */
2064 	adapter->request_queue.free_index = 0;
2065 	atomic_set(&adapter->request_queue.free_count, QDIO_MAX_BUFFERS_PER_Q);
2066 	adapter->request_queue.distance_from_int = 0;
2067 
2068 	/* initialize waitqueue used to wait for free SBALs in requests queue */
2069 	init_waitqueue_head(&adapter->request_wq);
2070 
2071 	/* ok, we did it - skip all cleanups for different failures */
2072 	atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
2073 	retval = ZFCP_ERP_SUCCEEDED;
2074 	goto out;
2075 
2076  failed_do_qdio:
2077 	/* NOP */
2078 
2079  failed_qdio_activate:
2080 	debug_text_event(adapter->erp_dbf, 3, "qdio_down1a");
2081 	while (qdio_shutdown(adapter->ccw_device,
2082 			     QDIO_FLAG_CLEANUP_USING_CLEAR) == -EINPROGRESS)
2083 		ssleep(1);
2084 	debug_text_event(adapter->erp_dbf, 3, "qdio_down1b");
2085 
2086  failed_qdio_establish:
2087  failed_sanity:
2088 	retval = ZFCP_ERP_FAILED;
2089 
2090  out:
2091 	return retval;
2092 }
2093 
2094 
2095 static int
2096 zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action)
2097 {
2098 	int retval;
2099 
2100 	retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action);
2101 	if (retval == ZFCP_ERP_FAILED)
2102 		return ZFCP_ERP_FAILED;
2103 
2104 	retval = zfcp_erp_adapter_strategy_open_fsf_xport(erp_action);
2105 	if (retval == ZFCP_ERP_FAILED)
2106 		return ZFCP_ERP_FAILED;
2107 
2108 	return zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action);
2109 }
2110 
2111 static int
2112 zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action)
2113 {
2114 	int retval = ZFCP_ERP_SUCCEEDED;
2115 	int retries;
2116 	int sleep = ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP;
2117 	struct zfcp_adapter *adapter = erp_action->adapter;
2118 
2119 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status);
2120 
2121 	for (retries = ZFCP_EXCHANGE_CONFIG_DATA_RETRIES; retries; retries--) {
2122 		atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
2123 				  &adapter->status);
2124 		ZFCP_LOG_DEBUG("Doing exchange config data\n");
2125 		write_lock_irq(&adapter->erp_lock);
2126 		zfcp_erp_action_to_running(erp_action);
2127 		write_unlock_irq(&adapter->erp_lock);
2128 		if (zfcp_fsf_exchange_config_data(erp_action)) {
2129 			retval = ZFCP_ERP_FAILED;
2130 			debug_text_event(adapter->erp_dbf, 5, "a_fstx_xf");
2131 			ZFCP_LOG_INFO("error:  initiation of exchange of "
2132 				      "configuration data failed for "
2133 				      "adapter %s\n",
2134 				      zfcp_get_busid_by_adapter(adapter));
2135 			break;
2136 		}
2137 		debug_text_event(adapter->erp_dbf, 6, "a_fstx_xok");
2138 		ZFCP_LOG_DEBUG("Xchange underway\n");
2139 
2140 		/*
2141 		 * Why this works:
2142 		 * Both the normal completion handler as well as the timeout
2143 		 * handler will do an 'up' when the 'exchange config data'
2144 		 * request completes or times out. Thus, the signal to go on
2145 		 * won't be lost utilizing this semaphore.
2146 		 * Furthermore, this 'adapter_reopen' action is
2147 		 * guaranteed to be the only action being there (highest action
2148 		 * which prevents other actions from being created).
2149 		 * Resulting from that, the wake signal recognized here
2150 		 * _must_ be the one belonging to the 'exchange config
2151 		 * data' request.
2152 		 */
2153 		down(&adapter->erp_ready_sem);
2154 		if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
2155 			ZFCP_LOG_INFO("error: exchange of configuration data "
2156 				      "for adapter %s timed out\n",
2157 				      zfcp_get_busid_by_adapter(adapter));
2158 			break;
2159 		}
2160 
2161 		if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
2162 				     &adapter->status))
2163 			break;
2164 
2165 		ZFCP_LOG_DEBUG("host connection still initialising... "
2166 			       "waiting and retrying...\n");
2167 		/* sleep a little bit before retry */
2168 		ssleep(sleep);
2169 		sleep *= 2;
2170 	}
2171 
2172 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT,
2173 			  &adapter->status);
2174 
2175 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
2176 			      &adapter->status)) {
2177 		ZFCP_LOG_INFO("error: exchange of configuration data for "
2178 			      "adapter %s failed\n",
2179 			      zfcp_get_busid_by_adapter(adapter));
2180 		retval = ZFCP_ERP_FAILED;
2181 	}
2182 
2183 	return retval;
2184 }
2185 
2186 static int
2187 zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action)
2188 {
2189 	int ret;
2190 	struct zfcp_adapter *adapter;
2191 
2192 	adapter = erp_action->adapter;
2193 	atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status);
2194 
2195 	write_lock_irq(&adapter->erp_lock);
2196 	zfcp_erp_action_to_running(erp_action);
2197 	write_unlock_irq(&adapter->erp_lock);
2198 
2199 	ret = zfcp_fsf_exchange_port_data(erp_action);
2200 	if (ret == -EOPNOTSUPP) {
2201 		debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp");
2202 		return ZFCP_ERP_SUCCEEDED;
2203 	} else if (ret) {
2204 		debug_text_event(adapter->erp_dbf, 3, "a_xport_failed");
2205 		return ZFCP_ERP_FAILED;
2206 	}
2207 	debug_text_event(adapter->erp_dbf, 6, "a_xport_ok");
2208 
2209 	ret = ZFCP_ERP_SUCCEEDED;
2210 	down(&adapter->erp_ready_sem);
2211 	if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) {
2212 		ZFCP_LOG_INFO("error: exchange port data timed out (adapter "
2213 			      "%s)\n", zfcp_get_busid_by_adapter(adapter));
2214 		ret = ZFCP_ERP_FAILED;
2215 	}
2216 
2217 	/* don't treat as error for the sake of compatibility */
2218 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status))
2219 		ZFCP_LOG_INFO("warning: exchange port data failed (adapter "
2220 			      "%s\n", zfcp_get_busid_by_adapter(adapter));
2221 
2222 	return ret;
2223 }
2224 
2225 static int
2226 zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action
2227 					      *erp_action)
2228 {
2229 	int retval = ZFCP_ERP_SUCCEEDED;
2230 	int temp_ret;
2231 	struct zfcp_adapter *adapter = erp_action->adapter;
2232 	int i;
2233 
2234 	adapter->status_read_failed = 0;
2235 	for (i = 0; i < ZFCP_STATUS_READS_RECOM; i++) {
2236 		temp_ret = zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL);
2237 		if (temp_ret < 0) {
2238 			ZFCP_LOG_INFO("error: set-up of unsolicited status "
2239 				      "notification failed on adapter %s\n",
2240 				      zfcp_get_busid_by_adapter(adapter));
2241 			retval = ZFCP_ERP_FAILED;
2242 			i--;
2243 			break;
2244 		}
2245 	}
2246 
2247 	return retval;
2248 }
2249 
2250 /*
2251  * function:
2252  *
2253  * purpose:	this routine executes the 'Reopen Physical Port' action
2254  *
2255  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2256  *		ZFCP_ERP_SUCCEEDED	- action finished successfully
2257  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2258  */
2259 static int
2260 zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action)
2261 {
2262 	int retval = ZFCP_ERP_FAILED;
2263 	struct zfcp_port *port = erp_action->port;
2264 	struct zfcp_adapter *adapter = erp_action->adapter;
2265 
2266 	switch (erp_action->step) {
2267 
2268 		/*
2269 		 * FIXME:
2270 		 * the ULP spec. begs for waiting for oustanding commands
2271 		 */
2272 	case ZFCP_ERP_STEP_UNINITIALIZED:
2273 		zfcp_erp_port_strategy_clearstati(port);
2274 		/*
2275 		 * it would be sufficient to test only the normal open flag
2276 		 * since the phys. open flag cannot be set if the normal
2277 		 * open flag is unset - however, this is for readabilty ...
2278 		 */
2279 		if (atomic_test_mask((ZFCP_STATUS_PORT_PHYS_OPEN |
2280 				      ZFCP_STATUS_COMMON_OPEN),
2281 			             &port->status)) {
2282 			ZFCP_LOG_DEBUG("port 0x%016Lx is open -> trying "
2283 				       "close physical\n", port->wwpn);
2284 			retval =
2285 			    zfcp_erp_port_forced_strategy_close(erp_action);
2286 		} else
2287 			retval = ZFCP_ERP_FAILED;
2288 		break;
2289 
2290 	case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
2291 		if (atomic_test_mask(ZFCP_STATUS_PORT_PHYS_OPEN,
2292 				     &port->status)) {
2293 			ZFCP_LOG_DEBUG("close physical failed for port "
2294 				       "0x%016Lx\n", port->wwpn);
2295 			retval = ZFCP_ERP_FAILED;
2296 		} else
2297 			retval = ZFCP_ERP_SUCCEEDED;
2298 		break;
2299 	}
2300 
2301 	debug_text_event(adapter->erp_dbf, 3, "p_pfst/ret");
2302 	debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t));
2303 	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
2304 	debug_event(adapter->erp_dbf, 3, &retval, sizeof (int));
2305 
2306 	return retval;
2307 }
2308 
2309 /*
2310  * function:
2311  *
2312  * purpose:	this routine executes the 'Reopen Port' action
2313  *
2314  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2315  *		ZFCP_ERP_SUCCEEDED	- action finished successfully
2316  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2317  */
2318 static int
2319 zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action)
2320 {
2321 	int retval = ZFCP_ERP_FAILED;
2322 	struct zfcp_port *port = erp_action->port;
2323 	struct zfcp_adapter *adapter = erp_action->adapter;
2324 
2325 	switch (erp_action->step) {
2326 
2327 		/*
2328 		 * FIXME:
2329 		 * the ULP spec. begs for waiting for oustanding commands
2330 		 */
2331 	case ZFCP_ERP_STEP_UNINITIALIZED:
2332 		zfcp_erp_port_strategy_clearstati(port);
2333 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) {
2334 			ZFCP_LOG_DEBUG("port 0x%016Lx is open -> trying "
2335 				       "close\n", port->wwpn);
2336 			retval = zfcp_erp_port_strategy_close(erp_action);
2337 			goto out;
2338 		}		/* else it's already closed, open it */
2339 		break;
2340 
2341 	case ZFCP_ERP_STEP_PORT_CLOSING:
2342 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) {
2343 			ZFCP_LOG_DEBUG("close failed for port 0x%016Lx\n",
2344 				       port->wwpn);
2345 			retval = ZFCP_ERP_FAILED;
2346 			goto out;
2347 		}		/* else it's closed now, open it */
2348 		break;
2349 	}
2350 	if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
2351 		retval = ZFCP_ERP_EXIT;
2352 	else
2353 		retval = zfcp_erp_port_strategy_open(erp_action);
2354 
2355  out:
2356 	debug_text_event(adapter->erp_dbf, 3, "p_pst/ret");
2357 	debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof (wwn_t));
2358 	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
2359 	debug_event(adapter->erp_dbf, 3, &retval, sizeof (int));
2360 
2361 	return retval;
2362 }
2363 
2364 static int
2365 zfcp_erp_port_strategy_open(struct zfcp_erp_action *erp_action)
2366 {
2367 	int retval;
2368 
2369 	if (atomic_test_mask(ZFCP_STATUS_PORT_WKA,
2370 			     &erp_action->port->status))
2371 		retval = zfcp_erp_port_strategy_open_nameserver(erp_action);
2372 	else
2373 		retval = zfcp_erp_port_strategy_open_common(erp_action);
2374 
2375 	return retval;
2376 }
2377 
2378 static int
2379 zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *erp_action)
2380 {
2381 	int retval = 0;
2382 	struct zfcp_adapter *adapter = erp_action->adapter;
2383 	struct zfcp_port *port = erp_action->port;
2384 
2385 	switch (erp_action->step) {
2386 
2387 	case ZFCP_ERP_STEP_UNINITIALIZED:
2388 	case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
2389 	case ZFCP_ERP_STEP_PORT_CLOSING:
2390 		if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) {
2391 			if (port->wwpn != adapter->peer_wwpn) {
2392 				ZFCP_LOG_NORMAL("Failed to open port 0x%016Lx "
2393 						"on adapter %s.\nPeer WWPN "
2394 						"0x%016Lx does not match\n",
2395 						port->wwpn,
2396 						zfcp_get_busid_by_adapter(adapter),
2397 						adapter->peer_wwpn);
2398 				zfcp_erp_port_failed(port);
2399 				retval = ZFCP_ERP_FAILED;
2400 				break;
2401 			}
2402 			port->d_id = adapter->peer_d_id;
2403 			atomic_set_mask(ZFCP_STATUS_PORT_DID_DID, &port->status);
2404 			retval = zfcp_erp_port_strategy_open_port(erp_action);
2405 			break;
2406 		}
2407 		if (!(adapter->nameserver_port)) {
2408 			retval = zfcp_nameserver_enqueue(adapter);
2409 			if (retval != 0) {
2410 				ZFCP_LOG_NORMAL("error: nameserver port "
2411 						"unavailable for adapter %s\n",
2412 						zfcp_get_busid_by_adapter(adapter));
2413 				retval = ZFCP_ERP_FAILED;
2414 				break;
2415 			}
2416 		}
2417 		if (!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
2418 				      &adapter->nameserver_port->status)) {
2419 			ZFCP_LOG_DEBUG("nameserver port is not open -> open "
2420 				       "nameserver port\n");
2421 			/* nameserver port may live again */
2422 			atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING,
2423 					&adapter->nameserver_port->status);
2424 			if (zfcp_erp_port_reopen(adapter->nameserver_port, 0)
2425 			    >= 0) {
2426 				erp_action->step =
2427 					ZFCP_ERP_STEP_NAMESERVER_OPEN;
2428 				retval = ZFCP_ERP_CONTINUES;
2429 			} else
2430 				retval = ZFCP_ERP_FAILED;
2431 			break;
2432 		}
2433 		/* else nameserver port is already open, fall through */
2434 	case ZFCP_ERP_STEP_NAMESERVER_OPEN:
2435 		if (!atomic_test_mask(ZFCP_STATUS_COMMON_OPEN,
2436 				      &adapter->nameserver_port->status)) {
2437 			ZFCP_LOG_DEBUG("open failed for nameserver port\n");
2438 			retval = ZFCP_ERP_FAILED;
2439 		} else {
2440 			ZFCP_LOG_DEBUG("nameserver port is open -> "
2441 				       "nameserver look-up for port 0x%016Lx\n",
2442 				       port->wwpn);
2443 			retval = zfcp_erp_port_strategy_open_common_lookup
2444 				(erp_action);
2445 		}
2446 		break;
2447 
2448 	case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
2449 		if (!atomic_test_mask(ZFCP_STATUS_PORT_DID_DID, &port->status)) {
2450 			if (atomic_test_mask
2451 			    (ZFCP_STATUS_PORT_INVALID_WWPN, &port->status)) {
2452 				ZFCP_LOG_DEBUG("nameserver look-up failed "
2453 					       "for port 0x%016Lx "
2454 					       "(misconfigured WWPN?)\n",
2455 					       port->wwpn);
2456 				zfcp_erp_port_failed(port);
2457 				retval = ZFCP_ERP_EXIT;
2458 			} else {
2459 				ZFCP_LOG_DEBUG("nameserver look-up failed for "
2460 					       "port 0x%016Lx\n", port->wwpn);
2461 				retval = ZFCP_ERP_FAILED;
2462 			}
2463 		} else {
2464 			ZFCP_LOG_DEBUG("port 0x%016Lx has d_id=0x%06x -> "
2465 				       "trying open\n", port->wwpn, port->d_id);
2466 			retval = zfcp_erp_port_strategy_open_port(erp_action);
2467 		}
2468 		break;
2469 
2470 	case ZFCP_ERP_STEP_PORT_OPENING:
2471 		/* D_ID might have changed during open */
2472 		if (atomic_test_mask((ZFCP_STATUS_COMMON_OPEN |
2473 				      ZFCP_STATUS_PORT_DID_DID),
2474 				     &port->status)) {
2475 			ZFCP_LOG_DEBUG("port 0x%016Lx is open\n", port->wwpn);
2476 			retval = ZFCP_ERP_SUCCEEDED;
2477 		} else {
2478 			ZFCP_LOG_DEBUG("open failed for port 0x%016Lx\n",
2479 				       port->wwpn);
2480 			retval = ZFCP_ERP_FAILED;
2481 		}
2482 		break;
2483 
2484 	default:
2485 		ZFCP_LOG_NORMAL("bug: unknown erp step 0x%08x\n",
2486 				erp_action->step);
2487 		retval = ZFCP_ERP_FAILED;
2488 	}
2489 
2490 	return retval;
2491 }
2492 
2493 static int
2494 zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *erp_action)
2495 {
2496 	int retval;
2497 	struct zfcp_port *port = erp_action->port;
2498 
2499 	switch (erp_action->step) {
2500 
2501 	case ZFCP_ERP_STEP_UNINITIALIZED:
2502 	case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
2503 	case ZFCP_ERP_STEP_PORT_CLOSING:
2504 		ZFCP_LOG_DEBUG("port 0x%016Lx has d_id=0x%06x -> trying open\n",
2505 			       port->wwpn, port->d_id);
2506 		retval = zfcp_erp_port_strategy_open_port(erp_action);
2507 		break;
2508 
2509 	case ZFCP_ERP_STEP_PORT_OPENING:
2510 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &port->status)) {
2511 			ZFCP_LOG_DEBUG("WKA port is open\n");
2512 			retval = ZFCP_ERP_SUCCEEDED;
2513 		} else {
2514 			ZFCP_LOG_DEBUG("open failed for WKA port\n");
2515 			retval = ZFCP_ERP_FAILED;
2516 		}
2517 		/* this is needed anyway (dont care for retval of wakeup) */
2518 		ZFCP_LOG_DEBUG("continue other open port operations\n");
2519 		zfcp_erp_port_strategy_open_nameserver_wakeup(erp_action);
2520 		break;
2521 
2522 	default:
2523 		ZFCP_LOG_NORMAL("bug: unknown erp step 0x%08x\n",
2524 				erp_action->step);
2525 		retval = ZFCP_ERP_FAILED;
2526 	}
2527 
2528 	return retval;
2529 }
2530 
2531 /*
2532  * function:
2533  *
2534  * purpose:	makes the erp thread continue with reopen (physical) port
2535  *		actions which have been paused until the name server port
2536  *		is opened (or failed)
2537  *
2538  * returns:	0	(a kind of void retval, its not used)
2539  */
2540 static int
2541 zfcp_erp_port_strategy_open_nameserver_wakeup(struct zfcp_erp_action
2542 					      *ns_erp_action)
2543 {
2544 	int retval = 0;
2545 	unsigned long flags;
2546 	struct zfcp_adapter *adapter = ns_erp_action->adapter;
2547 	struct zfcp_erp_action *erp_action, *tmp;
2548 
2549 	read_lock_irqsave(&adapter->erp_lock, flags);
2550 	list_for_each_entry_safe(erp_action, tmp, &adapter->erp_running_head,
2551 				 list) {
2552 		debug_text_event(adapter->erp_dbf, 4, "p_pstnsw_n");
2553 		debug_event(adapter->erp_dbf, 4, &erp_action->port->wwpn,
2554 			    sizeof (wwn_t));
2555 		if (erp_action->step == ZFCP_ERP_STEP_NAMESERVER_OPEN) {
2556 			debug_text_event(adapter->erp_dbf, 3, "p_pstnsw_w");
2557 			debug_event(adapter->erp_dbf, 3,
2558 				    &erp_action->port->wwpn, sizeof (wwn_t));
2559 			if (atomic_test_mask(
2560 				    ZFCP_STATUS_COMMON_ERP_FAILED,
2561 				    &adapter->nameserver_port->status))
2562 				zfcp_erp_port_failed(erp_action->port);
2563 			zfcp_erp_action_ready(erp_action);
2564 		}
2565 	}
2566 	read_unlock_irqrestore(&adapter->erp_lock, flags);
2567 
2568 	return retval;
2569 }
2570 
2571 /*
2572  * function:
2573  *
2574  * purpose:
2575  *
2576  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2577  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2578  */
2579 static int
2580 zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *erp_action)
2581 {
2582 	int retval;
2583 	struct zfcp_adapter *adapter = erp_action->adapter;
2584 	struct zfcp_port *port = erp_action->port;
2585 
2586 	retval = zfcp_fsf_close_physical_port(erp_action);
2587 	if (retval == -ENOMEM) {
2588 		debug_text_event(adapter->erp_dbf, 5, "o_pfstc_nomem");
2589 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2590 		retval = ZFCP_ERP_NOMEM;
2591 		goto out;
2592 	}
2593 	erp_action->step = ZFCP_ERP_STEP_PHYS_PORT_CLOSING;
2594 	if (retval != 0) {
2595 		debug_text_event(adapter->erp_dbf, 5, "o_pfstc_cpf");
2596 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2597 		/* could not send 'open', fail */
2598 		retval = ZFCP_ERP_FAILED;
2599 		goto out;
2600 	}
2601 	debug_text_event(adapter->erp_dbf, 6, "o_pfstc_cpok");
2602 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
2603 	retval = ZFCP_ERP_CONTINUES;
2604  out:
2605 	return retval;
2606 }
2607 
2608 static int
2609 zfcp_erp_port_strategy_clearstati(struct zfcp_port *port)
2610 {
2611 	int retval = 0;
2612 	struct zfcp_adapter *adapter = port->adapter;
2613 
2614 	debug_text_event(adapter->erp_dbf, 5, "p_pstclst");
2615 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2616 
2617 	atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING |
2618 			  ZFCP_STATUS_COMMON_CLOSING |
2619 			  ZFCP_STATUS_COMMON_ACCESS_DENIED |
2620 			  ZFCP_STATUS_PORT_DID_DID |
2621 			  ZFCP_STATUS_PORT_PHYS_CLOSING |
2622 			  ZFCP_STATUS_PORT_INVALID_WWPN,
2623 			  &port->status);
2624 	return retval;
2625 }
2626 
2627 /*
2628  * function:
2629  *
2630  * purpose:
2631  *
2632  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2633  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2634  */
2635 static int
2636 zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action)
2637 {
2638 	int retval;
2639 	struct zfcp_adapter *adapter = erp_action->adapter;
2640 	struct zfcp_port *port = erp_action->port;
2641 
2642 	retval = zfcp_fsf_close_port(erp_action);
2643 	if (retval == -ENOMEM) {
2644 		debug_text_event(adapter->erp_dbf, 5, "p_pstc_nomem");
2645 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2646 		retval = ZFCP_ERP_NOMEM;
2647 		goto out;
2648 	}
2649 	erp_action->step = ZFCP_ERP_STEP_PORT_CLOSING;
2650 	if (retval != 0) {
2651 		debug_text_event(adapter->erp_dbf, 5, "p_pstc_cpf");
2652 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2653 		/* could not send 'close', fail */
2654 		retval = ZFCP_ERP_FAILED;
2655 		goto out;
2656 	}
2657 	debug_text_event(adapter->erp_dbf, 6, "p_pstc_cpok");
2658 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
2659 	retval = ZFCP_ERP_CONTINUES;
2660  out:
2661 	return retval;
2662 }
2663 
2664 /*
2665  * function:
2666  *
2667  * purpose:
2668  *
2669  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2670  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2671  */
2672 static int
2673 zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action)
2674 {
2675 	int retval;
2676 	struct zfcp_adapter *adapter = erp_action->adapter;
2677 	struct zfcp_port *port = erp_action->port;
2678 
2679 	retval = zfcp_fsf_open_port(erp_action);
2680 	if (retval == -ENOMEM) {
2681 		debug_text_event(adapter->erp_dbf, 5, "p_psto_nomem");
2682 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2683 		retval = ZFCP_ERP_NOMEM;
2684 		goto out;
2685 	}
2686 	erp_action->step = ZFCP_ERP_STEP_PORT_OPENING;
2687 	if (retval != 0) {
2688 		debug_text_event(adapter->erp_dbf, 5, "p_psto_opf");
2689 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2690 		/* could not send 'open', fail */
2691 		retval = ZFCP_ERP_FAILED;
2692 		goto out;
2693 	}
2694 	debug_text_event(adapter->erp_dbf, 6, "p_psto_opok");
2695 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
2696 	retval = ZFCP_ERP_CONTINUES;
2697  out:
2698 	return retval;
2699 }
2700 
2701 /*
2702  * function:
2703  *
2704  * purpose:
2705  *
2706  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2707  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2708  */
2709 static int
2710 zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *erp_action)
2711 {
2712 	int retval;
2713 	struct zfcp_adapter *adapter = erp_action->adapter;
2714 	struct zfcp_port *port = erp_action->port;
2715 
2716 	retval = zfcp_ns_gid_pn_request(erp_action);
2717 	if (retval == -ENOMEM) {
2718 		debug_text_event(adapter->erp_dbf, 5, "p_pstn_nomem");
2719 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2720 		retval = ZFCP_ERP_NOMEM;
2721 		goto out;
2722 	}
2723 	erp_action->step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
2724 	if (retval != 0) {
2725 		debug_text_event(adapter->erp_dbf, 5, "p_pstn_ref");
2726 		debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
2727 		/* could not send nameserver request, fail */
2728 		retval = ZFCP_ERP_FAILED;
2729 		goto out;
2730 	}
2731 	debug_text_event(adapter->erp_dbf, 6, "p_pstn_reok");
2732 	debug_event(adapter->erp_dbf, 6, &port->wwpn, sizeof (wwn_t));
2733 	retval = ZFCP_ERP_CONTINUES;
2734  out:
2735 	return retval;
2736 }
2737 
2738 /*
2739  * function:
2740  *
2741  * purpose:	this routine executes the 'Reopen Unit' action
2742  *		currently no retries
2743  *
2744  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2745  *		ZFCP_ERP_SUCCEEDED	- action finished successfully
2746  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2747  */
2748 static int
2749 zfcp_erp_unit_strategy(struct zfcp_erp_action *erp_action)
2750 {
2751 	int retval = ZFCP_ERP_FAILED;
2752 	struct zfcp_unit *unit = erp_action->unit;
2753 	struct zfcp_adapter *adapter = erp_action->adapter;
2754 
2755 	switch (erp_action->step) {
2756 
2757 		/*
2758 		 * FIXME:
2759 		 * the ULP spec. begs for waiting for oustanding commands
2760 		 */
2761 	case ZFCP_ERP_STEP_UNINITIALIZED:
2762 		zfcp_erp_unit_strategy_clearstati(unit);
2763 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
2764 			ZFCP_LOG_DEBUG("unit 0x%016Lx is open -> "
2765 				       "trying close\n", unit->fcp_lun);
2766 			retval = zfcp_erp_unit_strategy_close(erp_action);
2767 			break;
2768 		}
2769 		/* else it's already closed, fall through */
2770 	case ZFCP_ERP_STEP_UNIT_CLOSING:
2771 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
2772 			ZFCP_LOG_DEBUG("close failed for unit 0x%016Lx\n",
2773 				       unit->fcp_lun);
2774 			retval = ZFCP_ERP_FAILED;
2775 		} else {
2776 			if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
2777 				retval = ZFCP_ERP_EXIT;
2778 			else {
2779 				ZFCP_LOG_DEBUG("unit 0x%016Lx is not open -> "
2780 					       "trying open\n", unit->fcp_lun);
2781 				retval =
2782 				    zfcp_erp_unit_strategy_open(erp_action);
2783 			}
2784 		}
2785 		break;
2786 
2787 	case ZFCP_ERP_STEP_UNIT_OPENING:
2788 		if (atomic_test_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status)) {
2789 			ZFCP_LOG_DEBUG("unit 0x%016Lx is open\n",
2790 				       unit->fcp_lun);
2791 			retval = ZFCP_ERP_SUCCEEDED;
2792 		} else {
2793 			ZFCP_LOG_DEBUG("open failed for unit 0x%016Lx\n",
2794 				       unit->fcp_lun);
2795 			retval = ZFCP_ERP_FAILED;
2796 		}
2797 		break;
2798 	}
2799 
2800 	debug_text_event(adapter->erp_dbf, 3, "u_ust/ret");
2801 	debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof (fcp_lun_t));
2802 	debug_event(adapter->erp_dbf, 3, &erp_action->action, sizeof (int));
2803 	debug_event(adapter->erp_dbf, 3, &retval, sizeof (int));
2804 	return retval;
2805 }
2806 
2807 static int
2808 zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit)
2809 {
2810 	int retval = 0;
2811 	struct zfcp_adapter *adapter = unit->port->adapter;
2812 
2813 	debug_text_event(adapter->erp_dbf, 5, "u_ustclst");
2814 	debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t));
2815 
2816 	atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING |
2817 			  ZFCP_STATUS_COMMON_CLOSING |
2818 			  ZFCP_STATUS_COMMON_ACCESS_DENIED |
2819 			  ZFCP_STATUS_UNIT_SHARED |
2820 			  ZFCP_STATUS_UNIT_READONLY,
2821 			  &unit->status);
2822 
2823 	return retval;
2824 }
2825 
2826 /*
2827  * function:
2828  *
2829  * purpose:
2830  *
2831  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2832  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2833  */
2834 static int
2835 zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action)
2836 {
2837 	int retval;
2838 	struct zfcp_adapter *adapter = erp_action->adapter;
2839 	struct zfcp_unit *unit = erp_action->unit;
2840 
2841 	retval = zfcp_fsf_close_unit(erp_action);
2842 	if (retval == -ENOMEM) {
2843 		debug_text_event(adapter->erp_dbf, 5, "u_ustc_nomem");
2844 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
2845 			    sizeof (fcp_lun_t));
2846 		retval = ZFCP_ERP_NOMEM;
2847 		goto out;
2848 	}
2849 	erp_action->step = ZFCP_ERP_STEP_UNIT_CLOSING;
2850 	if (retval != 0) {
2851 		debug_text_event(adapter->erp_dbf, 5, "u_ustc_cuf");
2852 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
2853 			    sizeof (fcp_lun_t));
2854 		/* could not send 'close', fail */
2855 		retval = ZFCP_ERP_FAILED;
2856 		goto out;
2857 	}
2858 	debug_text_event(adapter->erp_dbf, 6, "u_ustc_cuok");
2859 	debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t));
2860 	retval = ZFCP_ERP_CONTINUES;
2861 
2862  out:
2863 	return retval;
2864 }
2865 
2866 /*
2867  * function:
2868  *
2869  * purpose:
2870  *
2871  * returns:	ZFCP_ERP_CONTINUES	- action continues (asynchronously)
2872  *		ZFCP_ERP_FAILED		- action finished unsuccessfully
2873  */
2874 static int
2875 zfcp_erp_unit_strategy_open(struct zfcp_erp_action *erp_action)
2876 {
2877 	int retval;
2878 	struct zfcp_adapter *adapter = erp_action->adapter;
2879 	struct zfcp_unit *unit = erp_action->unit;
2880 
2881 	retval = zfcp_fsf_open_unit(erp_action);
2882 	if (retval == -ENOMEM) {
2883 		debug_text_event(adapter->erp_dbf, 5, "u_usto_nomem");
2884 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
2885 			    sizeof (fcp_lun_t));
2886 		retval = ZFCP_ERP_NOMEM;
2887 		goto out;
2888 	}
2889 	erp_action->step = ZFCP_ERP_STEP_UNIT_OPENING;
2890 	if (retval != 0) {
2891 		debug_text_event(adapter->erp_dbf, 5, "u_usto_ouf");
2892 		debug_event(adapter->erp_dbf, 5, &unit->fcp_lun,
2893 			    sizeof (fcp_lun_t));
2894 		/* could not send 'open', fail */
2895 		retval = ZFCP_ERP_FAILED;
2896 		goto out;
2897 	}
2898 	debug_text_event(adapter->erp_dbf, 6, "u_usto_ouok");
2899 	debug_event(adapter->erp_dbf, 6, &unit->fcp_lun, sizeof (fcp_lun_t));
2900 	retval = ZFCP_ERP_CONTINUES;
2901  out:
2902 	return retval;
2903 }
2904 
2905 void zfcp_erp_start_timer(struct zfcp_fsf_req *fsf_req)
2906 {
2907 	BUG_ON(!fsf_req->erp_action);
2908 	fsf_req->timer.function = zfcp_erp_timeout_handler;
2909 	fsf_req->timer.data = (unsigned long) fsf_req->erp_action;
2910 	fsf_req->timer.expires = jiffies + ZFCP_ERP_FSFREQ_TIMEOUT;
2911 	add_timer(&fsf_req->timer);
2912 }
2913 
2914 /*
2915  * function:
2916  *
2917  * purpose:	enqueue the specified error recovery action, if needed
2918  *
2919  * returns:
2920  */
2921 static int
2922 zfcp_erp_action_enqueue(int action,
2923 			struct zfcp_adapter *adapter,
2924 			struct zfcp_port *port, struct zfcp_unit *unit)
2925 {
2926 	int retval = 1;
2927 	struct zfcp_erp_action *erp_action = NULL;
2928 	int stronger_action = 0;
2929 	u32 status = 0;
2930 
2931 	/*
2932 	 * We need some rules here which check whether we really need
2933 	 * this action or whether we should just drop it.
2934 	 * E.g. if there is a unfinished 'Reopen Port' request then we drop a
2935 	 * 'Reopen Unit' request for an associated unit since we can't
2936 	 * satisfy this request now. A 'Reopen Port' action will trigger
2937 	 * 'Reopen Unit' actions when it completes.
2938 	 * Thus, there are only actions in the queue which can immediately be
2939 	 * executed. This makes the processing of the action queue more
2940 	 * efficient.
2941 	 */
2942 
2943 	if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP,
2944 			      &adapter->status))
2945 		return -EIO;
2946 
2947 	debug_event(adapter->erp_dbf, 4, &action, sizeof (int));
2948 	/* check whether we really need this */
2949 	switch (action) {
2950 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
2951 		if (atomic_test_mask
2952 		    (ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)) {
2953 			debug_text_event(adapter->erp_dbf, 4, "u_actenq_drp");
2954 			debug_event(adapter->erp_dbf, 4, &port->wwpn,
2955 				    sizeof (wwn_t));
2956 			debug_event(adapter->erp_dbf, 4, &unit->fcp_lun,
2957 				    sizeof (fcp_lun_t));
2958 			goto out;
2959 		}
2960 		if (!atomic_test_mask
2961 		    (ZFCP_STATUS_COMMON_RUNNING, &port->status) ||
2962 		    atomic_test_mask
2963 		    (ZFCP_STATUS_COMMON_ERP_FAILED, &port->status)) {
2964 			goto out;
2965 		}
2966 		if (!atomic_test_mask
2967 		    (ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) {
2968 			stronger_action = ZFCP_ERP_ACTION_REOPEN_PORT;
2969 			unit = NULL;
2970 		}
2971 		/* fall through !!! */
2972 
2973 	case ZFCP_ERP_ACTION_REOPEN_PORT:
2974 		if (atomic_test_mask
2975 		    (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)) {
2976 			debug_text_event(adapter->erp_dbf, 4, "p_actenq_drp");
2977 			debug_event(adapter->erp_dbf, 4, &port->wwpn,
2978 				    sizeof (wwn_t));
2979 			goto out;
2980 		}
2981 		/* fall through !!! */
2982 
2983 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
2984 		if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
2985 				     &port->status)) {
2986 			if (port->erp_action.action !=
2987 			    ZFCP_ERP_ACTION_REOPEN_PORT_FORCED) {
2988 				ZFCP_LOG_INFO("dropped erp action %i (port "
2989 					      "0x%016Lx, action in use: %i)\n",
2990 					      action, port->wwpn,
2991 					      port->erp_action.action);
2992 				debug_text_event(adapter->erp_dbf, 4,
2993 						 "pf_actenq_drp");
2994 			} else
2995 				debug_text_event(adapter->erp_dbf, 4,
2996 						 "pf_actenq_drpcp");
2997 			debug_event(adapter->erp_dbf, 4, &port->wwpn,
2998 				    sizeof (wwn_t));
2999 			goto out;
3000 		}
3001 		if (!atomic_test_mask
3002 		    (ZFCP_STATUS_COMMON_RUNNING, &adapter->status) ||
3003 		    atomic_test_mask
3004 		    (ZFCP_STATUS_COMMON_ERP_FAILED, &adapter->status)) {
3005 			goto out;
3006 		}
3007 		if (!atomic_test_mask
3008 		    (ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) {
3009 			stronger_action = ZFCP_ERP_ACTION_REOPEN_ADAPTER;
3010 			port = NULL;
3011 		}
3012 		/* fall through !!! */
3013 
3014 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
3015 		if (atomic_test_mask
3016 		    (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)) {
3017 			debug_text_event(adapter->erp_dbf, 4, "a_actenq_drp");
3018 			goto out;
3019 		}
3020 		break;
3021 
3022 	default:
3023 		debug_text_exception(adapter->erp_dbf, 1, "a_actenq_bug");
3024 		debug_event(adapter->erp_dbf, 1, &action, sizeof (int));
3025 		ZFCP_LOG_NORMAL("bug: unknown erp action requested "
3026 				"on adapter %s (action=%d)\n",
3027 				zfcp_get_busid_by_adapter(adapter), action);
3028 		goto out;
3029 	}
3030 
3031 	/* check whether we need something stronger first */
3032 	if (stronger_action) {
3033 		debug_text_event(adapter->erp_dbf, 4, "a_actenq_str");
3034 		debug_event(adapter->erp_dbf, 4, &stronger_action,
3035 			    sizeof (int));
3036 		ZFCP_LOG_DEBUG("stronger erp action %d needed before "
3037 			       "erp action %d on adapter %s\n",
3038 			       stronger_action, action,
3039 			       zfcp_get_busid_by_adapter(adapter));
3040 		action = stronger_action;
3041 	}
3042 
3043 	/* mark adapter to have some error recovery pending */
3044 	atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_PENDING, &adapter->status);
3045 
3046 	/* setup error recovery action */
3047 	switch (action) {
3048 
3049 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
3050 		zfcp_unit_get(unit);
3051 		atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status);
3052 		erp_action = &unit->erp_action;
3053 		if (!atomic_test_mask
3054 		    (ZFCP_STATUS_COMMON_RUNNING, &unit->status))
3055 			status = ZFCP_STATUS_ERP_CLOSE_ONLY;
3056 		break;
3057 
3058 	case ZFCP_ERP_ACTION_REOPEN_PORT:
3059 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
3060 		zfcp_port_get(port);
3061 		zfcp_erp_action_dismiss_port(port);
3062 		atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status);
3063 		erp_action = &port->erp_action;
3064 		if (!atomic_test_mask
3065 		    (ZFCP_STATUS_COMMON_RUNNING, &port->status))
3066 			status = ZFCP_STATUS_ERP_CLOSE_ONLY;
3067 		break;
3068 
3069 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
3070 		zfcp_adapter_get(adapter);
3071 		zfcp_erp_action_dismiss_adapter(adapter);
3072 		atomic_set_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status);
3073 		erp_action = &adapter->erp_action;
3074 		if (!atomic_test_mask
3075 		    (ZFCP_STATUS_COMMON_RUNNING, &adapter->status))
3076 			status = ZFCP_STATUS_ERP_CLOSE_ONLY;
3077 		break;
3078 	}
3079 
3080 	debug_text_event(adapter->erp_dbf, 4, "a_actenq");
3081 
3082 	memset(erp_action, 0, sizeof (struct zfcp_erp_action));
3083 	erp_action->adapter = adapter;
3084 	erp_action->port = port;
3085 	erp_action->unit = unit;
3086 	erp_action->action = action;
3087 	erp_action->status = status;
3088 
3089 	++adapter->erp_total_count;
3090 
3091 	/* finally put it into 'ready' queue and kick erp thread */
3092 	list_add_tail(&erp_action->list, &adapter->erp_ready_head);
3093 	up(&adapter->erp_ready_sem);
3094 	retval = 0;
3095  out:
3096 	return retval;
3097 }
3098 
3099 static int
3100 zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
3101 {
3102 	int retval = 0;
3103 	struct zfcp_adapter *adapter = erp_action->adapter;
3104 
3105 	--adapter->erp_total_count;
3106 	if (erp_action->status & ZFCP_STATUS_ERP_LOWMEM) {
3107 		--adapter->erp_low_mem_count;
3108 		erp_action->status &= ~ZFCP_STATUS_ERP_LOWMEM;
3109 	}
3110 
3111 	debug_text_event(adapter->erp_dbf, 4, "a_actdeq");
3112 	debug_event(adapter->erp_dbf, 4, &erp_action->action, sizeof (int));
3113 	list_del(&erp_action->list);
3114 	switch (erp_action->action) {
3115 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
3116 		atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
3117 				  &erp_action->unit->status);
3118 		break;
3119 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
3120 	case ZFCP_ERP_ACTION_REOPEN_PORT:
3121 		atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
3122 				  &erp_action->port->status);
3123 		break;
3124 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
3125 		atomic_clear_mask(ZFCP_STATUS_COMMON_ERP_INUSE,
3126 				  &erp_action->adapter->status);
3127 		break;
3128 	default:
3129 		/* bug */
3130 		break;
3131 	}
3132 	return retval;
3133 }
3134 
3135 /**
3136  * zfcp_erp_action_cleanup
3137  *
3138  * Register unit with scsi stack if appropriate and fix reference counts.
3139  * Note: Temporary units are not registered with scsi stack.
3140  */
3141 static void
3142 zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter,
3143 			struct zfcp_port *port, struct zfcp_unit *unit,
3144 			int result)
3145 {
3146 	switch (action) {
3147 	case ZFCP_ERP_ACTION_REOPEN_UNIT:
3148 		if ((result == ZFCP_ERP_SUCCEEDED)
3149 		    && (!atomic_test_mask(ZFCP_STATUS_UNIT_TEMPORARY,
3150 					  &unit->status))
3151 		    && !unit->device
3152 		    && port->rport) {
3153 			atomic_set_mask(ZFCP_STATUS_UNIT_REGISTERED,
3154 					&unit->status);
3155 			if (atomic_test_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING,
3156 					     &unit->status) == 0)
3157 				zfcp_erp_schedule_work(unit);
3158 		}
3159 		zfcp_unit_put(unit);
3160 		break;
3161 	case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
3162 	case ZFCP_ERP_ACTION_REOPEN_PORT:
3163 		if (atomic_test_mask(ZFCP_STATUS_PORT_NO_WWPN,
3164 				     &port->status)) {
3165 			zfcp_port_put(port);
3166 			break;
3167 		}
3168 
3169 		if ((result == ZFCP_ERP_SUCCEEDED)
3170 		    && !port->rport) {
3171 			struct fc_rport_identifiers ids;
3172 			ids.node_name = port->wwnn;
3173 			ids.port_name = port->wwpn;
3174 			ids.port_id = port->d_id;
3175 			ids.roles = FC_RPORT_ROLE_FCP_TARGET;
3176 			port->rport =
3177 				fc_remote_port_add(adapter->scsi_host, 0, &ids);
3178 			if (!port->rport)
3179 				ZFCP_LOG_NORMAL("failed registration of rport"
3180 						"(adapter %s, wwpn=0x%016Lx)\n",
3181 						zfcp_get_busid_by_port(port),
3182 						port->wwpn);
3183 			else {
3184 				scsi_target_unblock(&port->rport->dev);
3185 				port->rport->maxframe_size = port->maxframe_size;
3186 				port->rport->supported_classes =
3187 					port->supported_classes;
3188 			}
3189 		}
3190 		if ((result != ZFCP_ERP_SUCCEEDED) && port->rport) {
3191 			fc_remote_port_delete(port->rport);
3192 			port->rport = NULL;
3193 		}
3194 		zfcp_port_put(port);
3195 		break;
3196 	case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
3197 		if (result != ZFCP_ERP_SUCCEEDED) {
3198 			list_for_each_entry(port, &adapter->port_list_head, list)
3199 				if (port->rport &&
3200 				    !atomic_test_mask(ZFCP_STATUS_PORT_WKA,
3201 						      &port->status)) {
3202 					fc_remote_port_delete(port->rport);
3203 					port->rport = NULL;
3204 				}
3205 		}
3206 		zfcp_adapter_put(adapter);
3207 		break;
3208 	default:
3209 		break;
3210 	}
3211 }
3212 
3213 
3214 static void zfcp_erp_action_dismiss_adapter(struct zfcp_adapter *adapter)
3215 {
3216 	struct zfcp_port *port;
3217 
3218 	debug_text_event(adapter->erp_dbf, 5, "a_actab");
3219 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status))
3220 		zfcp_erp_action_dismiss(&adapter->erp_action);
3221 	else
3222 		list_for_each_entry(port, &adapter->port_list_head, list)
3223 		    zfcp_erp_action_dismiss_port(port);
3224 }
3225 
3226 static void zfcp_erp_action_dismiss_port(struct zfcp_port *port)
3227 {
3228 	struct zfcp_unit *unit;
3229 	struct zfcp_adapter *adapter = port->adapter;
3230 
3231 	debug_text_event(adapter->erp_dbf, 5, "p_actab");
3232 	debug_event(adapter->erp_dbf, 5, &port->wwpn, sizeof (wwn_t));
3233 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &port->status))
3234 		zfcp_erp_action_dismiss(&port->erp_action);
3235 	else
3236 		list_for_each_entry(unit, &port->unit_list_head, list)
3237 		    zfcp_erp_action_dismiss_unit(unit);
3238 }
3239 
3240 static void zfcp_erp_action_dismiss_unit(struct zfcp_unit *unit)
3241 {
3242 	struct zfcp_adapter *adapter = unit->port->adapter;
3243 
3244 	debug_text_event(adapter->erp_dbf, 5, "u_actab");
3245 	debug_event(adapter->erp_dbf, 5, &unit->fcp_lun, sizeof (fcp_lun_t));
3246 	if (atomic_test_mask(ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status))
3247 		zfcp_erp_action_dismiss(&unit->erp_action);
3248 }
3249 
3250 static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action)
3251 {
3252 	struct zfcp_adapter *adapter = erp_action->adapter;
3253 
3254 	debug_text_event(adapter->erp_dbf, 6, "a_toru");
3255 	debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int));
3256 	list_move(&erp_action->list, &erp_action->adapter->erp_running_head);
3257 }
3258 
3259 static void zfcp_erp_action_to_ready(struct zfcp_erp_action *erp_action)
3260 {
3261 	struct zfcp_adapter *adapter = erp_action->adapter;
3262 
3263 	debug_text_event(adapter->erp_dbf, 6, "a_tore");
3264 	debug_event(adapter->erp_dbf, 6, &erp_action->action, sizeof (int));
3265 	list_move(&erp_action->list, &erp_action->adapter->erp_ready_head);
3266 }
3267 
3268 void
3269 zfcp_erp_port_boxed(struct zfcp_port *port)
3270 {
3271 	struct zfcp_adapter *adapter = port->adapter;
3272 	unsigned long flags;
3273 
3274 	debug_text_event(adapter->erp_dbf, 3, "p_access_boxed");
3275 	debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
3276 	read_lock_irqsave(&zfcp_data.config_lock, flags);
3277 	zfcp_erp_modify_port_status(port,
3278 			ZFCP_STATUS_COMMON_ACCESS_BOXED,
3279 			ZFCP_SET);
3280 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
3281 	zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED);
3282 }
3283 
3284 void
3285 zfcp_erp_unit_boxed(struct zfcp_unit *unit)
3286 {
3287 	struct zfcp_adapter *adapter = unit->port->adapter;
3288 
3289 	debug_text_event(adapter->erp_dbf, 3, "u_access_boxed");
3290 	debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
3291 	zfcp_erp_modify_unit_status(unit,
3292 			ZFCP_STATUS_COMMON_ACCESS_BOXED,
3293 			ZFCP_SET);
3294 	zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED);
3295 }
3296 
3297 void
3298 zfcp_erp_port_access_denied(struct zfcp_port *port)
3299 {
3300 	struct zfcp_adapter *adapter = port->adapter;
3301 	unsigned long flags;
3302 
3303 	debug_text_event(adapter->erp_dbf, 3, "p_access_denied");
3304 	debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
3305 	read_lock_irqsave(&zfcp_data.config_lock, flags);
3306 	zfcp_erp_modify_port_status(port,
3307 			ZFCP_STATUS_COMMON_ERP_FAILED |
3308 			ZFCP_STATUS_COMMON_ACCESS_DENIED,
3309 			ZFCP_SET);
3310 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
3311 }
3312 
3313 void
3314 zfcp_erp_unit_access_denied(struct zfcp_unit *unit)
3315 {
3316 	struct zfcp_adapter *adapter = unit->port->adapter;
3317 
3318 	debug_text_event(adapter->erp_dbf, 3, "u_access_denied");
3319 	debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
3320 	zfcp_erp_modify_unit_status(unit,
3321 			ZFCP_STATUS_COMMON_ERP_FAILED |
3322 			ZFCP_STATUS_COMMON_ACCESS_DENIED,
3323 			ZFCP_SET);
3324 }
3325 
3326 void
3327 zfcp_erp_adapter_access_changed(struct zfcp_adapter *adapter)
3328 {
3329 	struct zfcp_port *port;
3330 	unsigned long flags;
3331 
3332 	if (adapter->connection_features & FSF_FEATURE_NPIV_MODE)
3333 		return;
3334 
3335 	debug_text_event(adapter->erp_dbf, 3, "a_access_recover");
3336 	debug_event(adapter->erp_dbf, 3, zfcp_get_busid_by_adapter(adapter), 8);
3337 
3338 	read_lock_irqsave(&zfcp_data.config_lock, flags);
3339 	if (adapter->nameserver_port)
3340 		zfcp_erp_port_access_changed(adapter->nameserver_port);
3341 	list_for_each_entry(port, &adapter->port_list_head, list)
3342 		if (port != adapter->nameserver_port)
3343 			zfcp_erp_port_access_changed(port);
3344 	read_unlock_irqrestore(&zfcp_data.config_lock, flags);
3345 }
3346 
3347 void
3348 zfcp_erp_port_access_changed(struct zfcp_port *port)
3349 {
3350 	struct zfcp_adapter *adapter = port->adapter;
3351 	struct zfcp_unit *unit;
3352 
3353 	debug_text_event(adapter->erp_dbf, 3, "p_access_recover");
3354 	debug_event(adapter->erp_dbf, 3, &port->wwpn, sizeof(wwn_t));
3355 
3356 	if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
3357 			      &port->status) &&
3358 	    !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
3359 			      &port->status)) {
3360 		if (!atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
3361 			list_for_each_entry(unit, &port->unit_list_head, list)
3362 				zfcp_erp_unit_access_changed(unit);
3363 		return;
3364 	}
3365 
3366 	ZFCP_LOG_NORMAL("reopen of port 0x%016Lx on adapter %s "
3367 			"(due to ACT update)\n",
3368 			port->wwpn, zfcp_get_busid_by_adapter(adapter));
3369 	if (zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
3370 		ZFCP_LOG_NORMAL("failed reopen of port"
3371 				"(adapter %s, wwpn=0x%016Lx)\n",
3372 				zfcp_get_busid_by_adapter(adapter), port->wwpn);
3373 }
3374 
3375 void
3376 zfcp_erp_unit_access_changed(struct zfcp_unit *unit)
3377 {
3378 	struct zfcp_adapter *adapter = unit->port->adapter;
3379 
3380 	debug_text_event(adapter->erp_dbf, 3, "u_access_recover");
3381 	debug_event(adapter->erp_dbf, 3, &unit->fcp_lun, sizeof(fcp_lun_t));
3382 
3383 	if (!atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED,
3384 			      &unit->status) &&
3385 	    !atomic_test_mask(ZFCP_STATUS_COMMON_ACCESS_BOXED,
3386 			      &unit->status))
3387 		return;
3388 
3389 	ZFCP_LOG_NORMAL("reopen of unit 0x%016Lx on port 0x%016Lx "
3390 			" on adapter %s (due to ACT update)\n",
3391 			unit->fcp_lun, unit->port->wwpn,
3392 			zfcp_get_busid_by_adapter(adapter));
3393 	if (zfcp_erp_unit_reopen(unit, ZFCP_STATUS_COMMON_ERP_FAILED) != 0)
3394 		ZFCP_LOG_NORMAL("failed reopen of unit (adapter %s, "
3395 				"wwpn=0x%016Lx, fcp_lun=0x%016Lx)\n",
3396 				zfcp_get_busid_by_adapter(adapter),
3397 				unit->port->wwpn, unit->fcp_lun);
3398 }
3399 
3400 #undef ZFCP_LOG_AREA
3401