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