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