Merge git://git.kernel.org/pub/scm/linux/kernel/git/bunk/trivial
[linux-2.6.git] / drivers / s390 / scsi / zfcp_erp.c
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 (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) {
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 appropriate 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