]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.arch/s390-01-06-zfcp-cleanup-v2.patch
Imported linux-2.6.27.39 suse/xen patches.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.arch / s390-01-06-zfcp-cleanup-v2.patch
1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: FCP - code cleanup stage 2
3 References: bnc#417550
4
5 Stage 2 of the code cleanup covers functional aspects of zFCP driver
6 - state machine for adapter, port and unit
7 - layering violation issues regarding request processing
8 - modify exchange-port,
9 - config data to not use recovery semaphore
10 - kernel thread API adaption
11 - remove forced port recovery when port recovery is already running
12 - lock consolidation (config lock vs. other locks)
13
14 Acked-by: John Jolly <jjolly@suse.de>
15 ---
16 drivers/s390/scsi/zfcp_aux.c | 142 +++--------------
17 drivers/s390/scsi/zfcp_ccw.c | 33 +++-
18 drivers/s390/scsi/zfcp_dbf.c | 73 +++++++--
19 drivers/s390/scsi/zfcp_dbf.h | 1
20 drivers/s390/scsi/zfcp_def.h | 178 +++++----------------
21 drivers/s390/scsi/zfcp_erp.c | 178 ++++++---------------
22 drivers/s390/scsi/zfcp_ext.h | 27 +--
23 drivers/s390/scsi/zfcp_fc.c | 227 +++++++++++++++++++---------
24 drivers/s390/scsi/zfcp_fsf.c | 332 ++++++++++++++++++++++++++++-------------
25 drivers/s390/scsi/zfcp_fsf.h | 75 ---------
26 drivers/s390/scsi/zfcp_qdio.c | 40 ++--
27 drivers/s390/scsi/zfcp_scsi.c | 25 ---
28 drivers/s390/scsi/zfcp_sysfs.c | 47 ++---
29 13 files changed, 654 insertions(+), 724 deletions(-)
30
31 --- a/drivers/s390/scsi/zfcp_aux.c
32 +++ b/drivers/s390/scsi/zfcp_aux.c
33 @@ -90,11 +90,13 @@ static int __init zfcp_device_setup(char
34 strncpy(zfcp_data.init_busid, token, BUS_ID_SIZE);
35
36 token = strsep(&str, ",");
37 - if (!token || strict_strtoull(token, 0, &zfcp_data.init_wwpn))
38 + if (!token || strict_strtoull(token, 0,
39 + (unsigned long long *) &zfcp_data.init_wwpn))
40 goto err_out;
41
42 token = strsep(&str, ",");
43 - if (!token || strict_strtoull(token, 0, &zfcp_data.init_fcp_lun))
44 + if (!token || strict_strtoull(token, 0,
45 + (unsigned long long *) &zfcp_data.init_fcp_lun))
46 goto err_out;
47
48 kfree(str);
49 @@ -106,19 +108,6 @@ static int __init zfcp_device_setup(char
50 return 0;
51 }
52
53 -static struct zfcp_adapter *zfcp_get_adapter_by_busid(char *bus_id)
54 -{
55 - struct zfcp_adapter *adapter;
56 -
57 - list_for_each_entry(adapter, &zfcp_data.adapter_list_head, list)
58 - if ((strncmp(bus_id, adapter->ccw_device->dev.bus_id,
59 - BUS_ID_SIZE) == 0) &&
60 - !(atomic_read(&adapter->status) &
61 - ZFCP_STATUS_COMMON_REMOVE))
62 - return adapter;
63 - return NULL;
64 -}
65 -
66 static void __init zfcp_init_device_configure(void)
67 {
68 struct zfcp_adapter *adapter;
69 @@ -142,7 +131,12 @@ static void __init zfcp_init_device_conf
70 goto out_unit;
71 up(&zfcp_data.config_sema);
72 ccw_device_set_online(adapter->ccw_device);
73 +
74 zfcp_erp_wait(adapter);
75 + wait_event(adapter->erp_done_wqh,
76 + !(atomic_read(&unit->status) &
77 + ZFCP_STATUS_UNIT_SCSI_WORK_PENDING));
78 +
79 down(&zfcp_data.config_sema);
80 zfcp_unit_put(unit);
81 out_unit:
82 @@ -181,9 +175,9 @@ static int __init zfcp_module_init(void)
83 if (!zfcp_data.gid_pn_cache)
84 goto out_gid_cache;
85
86 - INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
87 - INIT_LIST_HEAD(&zfcp_data.adapter_remove_lh);
88 + zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
89
90 + INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
91 sema_init(&zfcp_data.config_sema, 1);
92 rwlock_init(&zfcp_data.config_lock);
93
94 @@ -233,8 +227,7 @@ module_init(zfcp_module_init);
95 *
96 * Returns: pointer to zfcp_unit or NULL
97 */
98 -struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *port,
99 - fcp_lun_t fcp_lun)
100 +struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *port, u64 fcp_lun)
101 {
102 struct zfcp_unit *unit;
103
104 @@ -253,7 +246,7 @@ struct zfcp_unit *zfcp_get_unit_by_lun(s
105 * Returns: pointer to zfcp_port or NULL
106 */
107 struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter,
108 - wwn_t wwpn)
109 + u64 wwpn)
110 {
111 struct zfcp_port *port;
112
113 @@ -278,7 +271,7 @@ static void zfcp_sysfs_unit_release(stru
114 *
115 * Sets up some unit internal structures and creates sysfs entry.
116 */
117 -struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
118 +struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
119 {
120 struct zfcp_unit *unit;
121
122 @@ -292,7 +285,8 @@ struct zfcp_unit *zfcp_unit_enqueue(stru
123 unit->port = port;
124 unit->fcp_lun = fcp_lun;
125
126 - snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx", fcp_lun);
127 + snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx",
128 + (unsigned long long) fcp_lun);
129 unit->sysfs_device.parent = &port->sysfs_device;
130 unit->sysfs_device.release = zfcp_sysfs_unit_release;
131 dev_set_drvdata(&unit->sysfs_device, unit);
132 @@ -325,7 +319,6 @@ struct zfcp_unit *zfcp_unit_enqueue(stru
133 }
134
135 zfcp_unit_get(unit);
136 - unit->scsi_lun = scsilun_to_int((struct scsi_lun *)&unit->fcp_lun);
137
138 write_lock_irq(&zfcp_data.config_lock);
139 list_add_tail(&unit->list, &port->unit_list_head);
140 @@ -334,7 +327,6 @@ struct zfcp_unit *zfcp_unit_enqueue(stru
141
142 write_unlock_irq(&zfcp_data.config_lock);
143
144 - port->units++;
145 zfcp_port_get(port);
146
147 return unit;
148 @@ -353,11 +345,10 @@ err_out_free:
149 */
150 void zfcp_unit_dequeue(struct zfcp_unit *unit)
151 {
152 - zfcp_unit_wait(unit);
153 + wait_event(unit->remove_wq, atomic_read(&unit->refcount) == 0);
154 write_lock_irq(&zfcp_data.config_lock);
155 list_del(&unit->list);
156 write_unlock_irq(&zfcp_data.config_lock);
157 - unit->port->units--;
158 zfcp_port_put(unit->port);
159 sysfs_remove_group(&unit->sysfs_device.kobj, &zfcp_sysfs_unit_attrs);
160 device_unregister(&unit->sysfs_device);
161 @@ -418,11 +409,6 @@ static void zfcp_free_low_mem_buffers(st
162 mempool_destroy(adapter->pool.data_gid_pn);
163 }
164
165 -static void zfcp_dummy_release(struct device *dev)
166 -{
167 - return;
168 -}
169 -
170 /**
171 * zfcp_status_read_refill - refill the long running status_read_requests
172 * @adapter: ptr to struct zfcp_adapter for which the buffers should be refilled
173 @@ -452,19 +438,6 @@ static void _zfcp_status_read_scheduler(
174 stat_work));
175 }
176
177 -static int zfcp_nameserver_enqueue(struct zfcp_adapter *adapter)
178 -{
179 - struct zfcp_port *port;
180 -
181 - port = zfcp_port_enqueue(adapter, 0, ZFCP_STATUS_PORT_WKA,
182 - ZFCP_DID_DIRECTORY_SERVICE);
183 - if (IS_ERR(port))
184 - return PTR_ERR(port);
185 - zfcp_port_put(port);
186 -
187 - return 0;
188 -}
189 -
190 /**
191 * zfcp_adapter_enqueue - enqueue a new adapter to the list
192 * @ccw_device: pointer to the struct cc_device
193 @@ -510,7 +483,6 @@ int zfcp_adapter_enqueue(struct ccw_devi
194 init_waitqueue_head(&adapter->erp_done_wqh);
195
196 INIT_LIST_HEAD(&adapter->port_list_head);
197 - INIT_LIST_HEAD(&adapter->port_remove_lh);
198 INIT_LIST_HEAD(&adapter->erp_ready_head);
199 INIT_LIST_HEAD(&adapter->erp_running_head);
200
201 @@ -520,7 +492,7 @@ int zfcp_adapter_enqueue(struct ccw_devi
202 spin_lock_init(&adapter->san_dbf_lock);
203 spin_lock_init(&adapter->scsi_dbf_lock);
204 spin_lock_init(&adapter->rec_dbf_lock);
205 - spin_lock_init(&adapter->req_q.lock);
206 + spin_lock_init(&adapter->req_q_lock);
207
208 rwlock_init(&adapter->erp_lock);
209 rwlock_init(&adapter->abort_lock);
210 @@ -539,28 +511,15 @@ int zfcp_adapter_enqueue(struct ccw_devi
211 &zfcp_sysfs_adapter_attrs))
212 goto sysfs_failed;
213
214 - adapter->generic_services.parent = &adapter->ccw_device->dev;
215 - adapter->generic_services.release = zfcp_dummy_release;
216 - snprintf(adapter->generic_services.bus_id, BUS_ID_SIZE,
217 - "generic_services");
218 -
219 - if (device_register(&adapter->generic_services))
220 - goto generic_services_failed;
221 -
222 write_lock_irq(&zfcp_data.config_lock);
223 atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
224 list_add_tail(&adapter->list, &zfcp_data.adapter_list_head);
225 write_unlock_irq(&zfcp_data.config_lock);
226
227 - zfcp_data.adapters++;
228 -
229 - zfcp_nameserver_enqueue(adapter);
230 + zfcp_fc_nameserver_init(adapter);
231
232 return 0;
233
234 -generic_services_failed:
235 - sysfs_remove_group(&ccw_device->dev.kobj,
236 - &zfcp_sysfs_adapter_attrs);
237 sysfs_failed:
238 zfcp_adapter_debug_unregister(adapter);
239 debug_register_failed:
240 @@ -587,7 +546,6 @@ void zfcp_adapter_dequeue(struct zfcp_ad
241 cancel_work_sync(&adapter->scan_work);
242 cancel_work_sync(&adapter->stat_work);
243 zfcp_adapter_scsi_unregister(adapter);
244 - device_unregister(&adapter->generic_services);
245 sysfs_remove_group(&adapter->ccw_device->dev.kobj,
246 &zfcp_sysfs_adapter_attrs);
247 dev_set_drvdata(&adapter->ccw_device->dev, NULL);
248 @@ -605,9 +563,6 @@ void zfcp_adapter_dequeue(struct zfcp_ad
249 list_del(&adapter->list);
250 write_unlock_irq(&zfcp_data.config_lock);
251
252 - /* decrease number of adapters in list */
253 - zfcp_data.adapters--;
254 -
255 zfcp_qdio_free(adapter);
256
257 zfcp_free_low_mem_buffers(adapter);
258 @@ -635,21 +590,19 @@ static void zfcp_sysfs_port_release(stru
259 * d_id is used to enqueue ports with a well known address like the Directory
260 * Service for nameserver lookup.
261 */
262 -struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn,
263 +struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
264 u32 status, u32 d_id)
265 {
266 struct zfcp_port *port;
267 int retval;
268 - char *bus_id;
269
270 port = kzalloc(sizeof(struct zfcp_port), GFP_KERNEL);
271 if (!port)
272 return ERR_PTR(-ENOMEM);
273
274 init_waitqueue_head(&port->remove_wq);
275 -
276 INIT_LIST_HEAD(&port->unit_list_head);
277 - INIT_LIST_HEAD(&port->unit_remove_lh);
278 + INIT_WORK(&port->gid_pn_work, zfcp_erp_port_strategy_open_lookup);
279
280 port->adapter = adapter;
281 port->d_id = d_id;
282 @@ -659,34 +612,9 @@ struct zfcp_port *zfcp_port_enqueue(stru
283 atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status);
284 atomic_set(&port->refcount, 0);
285
286 - if (status & ZFCP_STATUS_PORT_WKA) {
287 - switch (d_id) {
288 - case ZFCP_DID_DIRECTORY_SERVICE:
289 - bus_id = "directory";
290 - break;
291 - case ZFCP_DID_MANAGEMENT_SERVICE:
292 - bus_id = "management";
293 - break;
294 - case ZFCP_DID_KEY_DISTRIBUTION_SERVICE:
295 - bus_id = "key_distribution";
296 - break;
297 - case ZFCP_DID_ALIAS_SERVICE:
298 - bus_id = "alias";
299 - break;
300 - case ZFCP_DID_TIME_SERVICE:
301 - bus_id = "time";
302 - break;
303 - default:
304 - kfree(port);
305 - return ERR_PTR(-EINVAL);
306 - }
307 - snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE, "%s", bus_id);
308 - port->sysfs_device.parent = &adapter->generic_services;
309 - } else {
310 - snprintf(port->sysfs_device.bus_id,
311 - BUS_ID_SIZE, "0x%016llx", wwpn);
312 - port->sysfs_device.parent = &adapter->ccw_device->dev;
313 - }
314 + snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx",
315 + (unsigned long long) wwpn);
316 + port->sysfs_device.parent = &adapter->ccw_device->dev;
317
318 port->sysfs_device.release = zfcp_sysfs_port_release;
319 dev_set_drvdata(&port->sysfs_device, port);
320 @@ -702,12 +630,8 @@ struct zfcp_port *zfcp_port_enqueue(stru
321 if (device_register(&port->sysfs_device))
322 goto err_out_free;
323
324 - if (status & ZFCP_STATUS_PORT_WKA)
325 - retval = sysfs_create_group(&port->sysfs_device.kobj,
326 - &zfcp_sysfs_ns_port_attrs);
327 - else
328 - retval = sysfs_create_group(&port->sysfs_device.kobj,
329 - &zfcp_sysfs_port_attrs);
330 + retval = sysfs_create_group(&port->sysfs_device.kobj,
331 + &zfcp_sysfs_port_attrs);
332
333 if (retval) {
334 device_unregister(&port->sysfs_device);
335 @@ -720,10 +644,6 @@ struct zfcp_port *zfcp_port_enqueue(stru
336 list_add_tail(&port->list, &adapter->port_list_head);
337 atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
338 atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
339 - if (d_id == ZFCP_DID_DIRECTORY_SERVICE)
340 - if (!adapter->nameserver_port)
341 - adapter->nameserver_port = port;
342 - adapter->ports++;
343
344 write_unlock_irq(&zfcp_data.config_lock);
345
346 @@ -742,21 +662,15 @@ err_out:
347 */
348 void zfcp_port_dequeue(struct zfcp_port *port)
349 {
350 - zfcp_port_wait(port);
351 + wait_event(port->remove_wq, atomic_read(&port->refcount) == 0);
352 write_lock_irq(&zfcp_data.config_lock);
353 list_del(&port->list);
354 - port->adapter->ports--;
355 write_unlock_irq(&zfcp_data.config_lock);
356 if (port->rport)
357 fc_remote_port_delete(port->rport);
358 port->rport = NULL;
359 zfcp_adapter_put(port->adapter);
360 - if (atomic_read(&port->status) & ZFCP_STATUS_PORT_WKA)
361 - sysfs_remove_group(&port->sysfs_device.kobj,
362 - &zfcp_sysfs_ns_port_attrs);
363 - else
364 - sysfs_remove_group(&port->sysfs_device.kobj,
365 - &zfcp_sysfs_port_attrs);
366 + sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);
367 device_unregister(&port->sysfs_device);
368 }
369
370 --- a/drivers/s390/scsi/zfcp_ccw.c
371 +++ b/drivers/s390/scsi/zfcp_ccw.c
372 @@ -49,6 +49,8 @@ static void zfcp_ccw_remove(struct ccw_d
373 struct zfcp_adapter *adapter;
374 struct zfcp_port *port, *p;
375 struct zfcp_unit *unit, *u;
376 + LIST_HEAD(unit_remove_lh);
377 + LIST_HEAD(port_remove_lh);
378
379 ccw_device_set_offline(ccw_device);
380 down(&zfcp_data.config_sema);
381 @@ -57,26 +59,26 @@ static void zfcp_ccw_remove(struct ccw_d
382 write_lock_irq(&zfcp_data.config_lock);
383 list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
384 list_for_each_entry_safe(unit, u, &port->unit_list_head, list) {
385 - list_move(&unit->list, &port->unit_remove_lh);
386 + list_move(&unit->list, &unit_remove_lh);
387 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
388 &unit->status);
389 }
390 - list_move(&port->list, &adapter->port_remove_lh);
391 + list_move(&port->list, &port_remove_lh);
392 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
393 }
394 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
395 write_unlock_irq(&zfcp_data.config_lock);
396
397 - list_for_each_entry_safe(port, p, &adapter->port_remove_lh, list) {
398 - list_for_each_entry_safe(unit, u, &port->unit_remove_lh, list) {
399 - if (atomic_test_mask(ZFCP_STATUS_UNIT_REGISTERED,
400 - &unit->status))
401 + list_for_each_entry_safe(port, p, &port_remove_lh, list) {
402 + list_for_each_entry_safe(unit, u, &unit_remove_lh, list) {
403 + if (atomic_read(&unit->status) &
404 + ZFCP_STATUS_UNIT_REGISTERED)
405 scsi_remove_device(unit->device);
406 zfcp_unit_dequeue(unit);
407 }
408 zfcp_port_dequeue(port);
409 }
410 - zfcp_adapter_wait(adapter);
411 + wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
412 zfcp_adapter_dequeue(adapter);
413
414 up(&zfcp_data.config_sema);
415 @@ -226,3 +228,20 @@ int __init zfcp_ccw_register(void)
416 {
417 return ccw_driver_register(&zfcp_ccw_driver);
418 }
419 +
420 +/**
421 + * zfcp_get_adapter_by_busid - find zfcp_adapter struct
422 + * @busid: bus id string of zfcp adapter to find
423 + */
424 +struct zfcp_adapter *zfcp_get_adapter_by_busid(char *busid)
425 +{
426 + struct ccw_device *ccw_device;
427 + struct zfcp_adapter *adapter = NULL;
428 +
429 + ccw_device = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
430 + if (ccw_device) {
431 + adapter = dev_get_drvdata(&ccw_device->dev);
432 + put_device(&ccw_device->dev);
433 + }
434 + return adapter;
435 +}
436 --- a/drivers/s390/scsi/zfcp_dbf.c
437 +++ b/drivers/s390/scsi/zfcp_dbf.c
438 @@ -320,6 +320,26 @@ void zfcp_hba_dbf_event_qdio(struct zfcp
439 spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
440 }
441
442 +/**
443 + * zfcp_hba_dbf_event_berr - trace event for bit error threshold
444 + * @adapter: adapter affected by this QDIO related event
445 + * @req: fsf request
446 + */
447 +void zfcp_hba_dbf_event_berr(struct zfcp_adapter *adapter,
448 + struct zfcp_fsf_req *req)
449 +{
450 + struct zfcp_hba_dbf_record *r = &adapter->hba_dbf_buf;
451 + struct fsf_status_read_buffer *sr_buf = req->data;
452 + struct fsf_bit_error_payload *err = &sr_buf->payload.bit_error;
453 + unsigned long flags;
454 +
455 + spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
456 + memset(r, 0, sizeof(*r));
457 + strncpy(r->tag, "berr", ZFCP_DBF_TAG_SIZE);
458 + memcpy(&r->u.berr, err, sizeof(struct fsf_bit_error_payload));
459 + debug_event(adapter->hba_dbf, 0, r, sizeof(*r));
460 + spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
461 +}
462 static void zfcp_hba_dbf_view_response(char **p,
463 struct zfcp_hba_dbf_record_response *r)
464 {
465 @@ -401,6 +421,30 @@ static void zfcp_hba_dbf_view_qdio(char
466 zfcp_dbf_out(p, "sbal_count", "0x%02x", r->sbal_count);
467 }
468
469 +static void zfcp_hba_dbf_view_berr(char **p, struct fsf_bit_error_payload *r)
470 +{
471 + zfcp_dbf_out(p, "link_failures", "%d", r->link_failure_error_count);
472 + zfcp_dbf_out(p, "loss_of_sync_err", "%d", r->loss_of_sync_error_count);
473 + zfcp_dbf_out(p, "loss_of_sig_err", "%d", r->loss_of_signal_error_count);
474 + zfcp_dbf_out(p, "prim_seq_err", "%d",
475 + r->primitive_sequence_error_count);
476 + zfcp_dbf_out(p, "inval_trans_word_err", "%d",
477 + r->invalid_transmission_word_error_count);
478 + zfcp_dbf_out(p, "CRC_errors", "%d", r->crc_error_count);
479 + zfcp_dbf_out(p, "prim_seq_event_to", "%d",
480 + r->primitive_sequence_event_timeout_count);
481 + zfcp_dbf_out(p, "elast_buf_overrun_err", "%d",
482 + r->elastic_buffer_overrun_error_count);
483 + zfcp_dbf_out(p, "adv_rec_buf2buf_cred", "%d",
484 + r->advertised_receive_b2b_credit);
485 + zfcp_dbf_out(p, "curr_rec_buf2buf_cred", "%d",
486 + r->current_receive_b2b_credit);
487 + zfcp_dbf_out(p, "adv_trans_buf2buf_cred", "%d",
488 + r->advertised_transmit_b2b_credit);
489 + zfcp_dbf_out(p, "curr_trans_buf2buf_cred", "%d",
490 + r->current_transmit_b2b_credit);
491 +}
492 +
493 static int zfcp_hba_dbf_view_format(debug_info_t *id, struct debug_view *view,
494 char *out_buf, const char *in_buf)
495 {
496 @@ -420,6 +464,8 @@ static int zfcp_hba_dbf_view_format(debu
497 zfcp_hba_dbf_view_status(&p, &r->u.status);
498 else if (strncmp(r->tag, "qdio", ZFCP_DBF_TAG_SIZE) == 0)
499 zfcp_hba_dbf_view_qdio(&p, &r->u.qdio);
500 + else if (strncmp(r->tag, "berr", ZFCP_DBF_TAG_SIZE) == 0)
501 + zfcp_hba_dbf_view_berr(&p, &r->u.berr);
502
503 p += sprintf(p, "\n");
504 return p - out_buf;
505 @@ -521,14 +567,14 @@ static const char *zfcp_rec_dbf_ids[] =
506 [75] = "physical port recovery escalation after failed port "
507 "recovery",
508 [76] = "port recovery escalation after failed unit recovery",
509 - [77] = "recovery opening nameserver port",
510 + [77] = "",
511 [78] = "duplicate request id",
512 [79] = "link down",
513 [80] = "exclusive read-only unit access unsupported",
514 [81] = "shared read-write unit access unsupported",
515 [82] = "incoming rscn",
516 [83] = "incoming wwpn",
517 - [84] = "",
518 + [84] = "wka port handle not valid close port",
519 [85] = "online",
520 [86] = "offline",
521 [87] = "ccw device gone",
522 @@ -831,9 +877,9 @@ void zfcp_rec_dbf_event_action(u8 id2, s
523 void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req)
524 {
525 struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
526 - struct zfcp_port *port = ct->port;
527 - struct zfcp_adapter *adapter = port->adapter;
528 - struct ct_hdr *hdr = zfcp_sg_to_address(ct->req);
529 + struct zfcp_wka_port *wka_port = ct->wka_port;
530 + struct zfcp_adapter *adapter = wka_port->adapter;
531 + struct ct_hdr *hdr = sg_virt(ct->req);
532 struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
533 struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req;
534 unsigned long flags;
535 @@ -844,7 +890,7 @@ void zfcp_san_dbf_event_ct_request(struc
536 r->fsf_reqid = (unsigned long)fsf_req;
537 r->fsf_seqno = fsf_req->seq_no;
538 r->s_id = fc_host_port_id(adapter->scsi_host);
539 - r->d_id = port->d_id;
540 + r->d_id = wka_port->d_id;
541 oct->cmd_req_code = hdr->cmd_rsp_code;
542 oct->revision = hdr->revision;
543 oct->gs_type = hdr->gs_type;
544 @@ -865,9 +911,9 @@ void zfcp_san_dbf_event_ct_request(struc
545 void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req)
546 {
547 struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
548 - struct zfcp_port *port = ct->port;
549 - struct zfcp_adapter *adapter = port->adapter;
550 - struct ct_hdr *hdr = zfcp_sg_to_address(ct->resp);
551 + struct zfcp_wka_port *wka_port = ct->wka_port;
552 + struct zfcp_adapter *adapter = wka_port->adapter;
553 + struct ct_hdr *hdr = sg_virt(ct->resp);
554 struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
555 struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp;
556 unsigned long flags;
557 @@ -877,7 +923,7 @@ void zfcp_san_dbf_event_ct_response(stru
558 strncpy(r->tag, "rctc", ZFCP_DBF_TAG_SIZE);
559 r->fsf_reqid = (unsigned long)fsf_req;
560 r->fsf_seqno = fsf_req->seq_no;
561 - r->s_id = port->d_id;
562 + r->s_id = wka_port->d_id;
563 r->d_id = fc_host_port_id(adapter->scsi_host);
564 rct->cmd_rsp_code = hdr->cmd_rsp_code;
565 rct->revision = hdr->revision;
566 @@ -924,8 +970,8 @@ void zfcp_san_dbf_event_els_request(stru
567
568 zfcp_san_dbf_event_els("oels", 2, fsf_req,
569 fc_host_port_id(els->adapter->scsi_host),
570 - els->d_id, *(u8 *) zfcp_sg_to_address(els->req),
571 - zfcp_sg_to_address(els->req), els->req->length);
572 + els->d_id, *(u8 *) sg_virt(els->req),
573 + sg_virt(els->req), els->req->length);
574 }
575
576 /**
577 @@ -938,8 +984,7 @@ void zfcp_san_dbf_event_els_response(str
578
579 zfcp_san_dbf_event_els("rels", 2, fsf_req, els->d_id,
580 fc_host_port_id(els->adapter->scsi_host),
581 - *(u8 *)zfcp_sg_to_address(els->req),
582 - zfcp_sg_to_address(els->resp),
583 + *(u8 *)sg_virt(els->req), sg_virt(els->resp),
584 els->resp->length);
585 }
586
587 --- a/drivers/s390/scsi/zfcp_dbf.h
588 +++ b/drivers/s390/scsi/zfcp_dbf.h
589 @@ -151,6 +151,7 @@ struct zfcp_hba_dbf_record {
590 struct zfcp_hba_dbf_record_response response;
591 struct zfcp_hba_dbf_record_status status;
592 struct zfcp_hba_dbf_record_qdio qdio;
593 + struct fsf_bit_error_payload berr;
594 } u;
595 } __attribute__ ((packed));
596
597 --- a/drivers/s390/scsi/zfcp_def.h
598 +++ b/drivers/s390/scsi/zfcp_def.h
599 @@ -39,29 +39,6 @@
600
601 /********************* GENERAL DEFINES *********************************/
602
603 -/**
604 - * zfcp_sg_to_address - determine kernel address from struct scatterlist
605 - * @list: struct scatterlist
606 - * Return: kernel address
607 - */
608 -static inline void *
609 -zfcp_sg_to_address(struct scatterlist *list)
610 -{
611 - return sg_virt(list);
612 -}
613 -
614 -/**
615 - * zfcp_address_to_sg - set up struct scatterlist from kernel address
616 - * @address: kernel address
617 - * @list: struct scatterlist
618 - * @size: buffer size
619 - */
620 -static inline void
621 -zfcp_address_to_sg(void *address, struct scatterlist *list, unsigned int size)
622 -{
623 - sg_set_buf(list, address, size);
624 -}
625 -
626 #define REQUEST_LIST_SIZE 128
627
628 /********************* SCSI SPECIFIC DEFINES *********************************/
629 @@ -101,11 +78,6 @@ zfcp_address_to_sg(void *address, struct
630
631 /*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/
632
633 -typedef unsigned long long wwn_t;
634 -typedef unsigned long long fcp_lun_t;
635 -/* data length field may be at variable position in FCP-2 FCP_CMND IU */
636 -typedef unsigned int fcp_dl_t;
637 -
638 /* timeout for name-server lookup (in seconds) */
639 #define ZFCP_NS_GID_PN_TIMEOUT 10
640
641 @@ -129,7 +101,7 @@ typedef unsigned int fcp_dl_t;
642
643 /* FCP(-2) FCP_CMND IU */
644 struct fcp_cmnd_iu {
645 - fcp_lun_t fcp_lun; /* FCP logical unit number */
646 + u64 fcp_lun; /* FCP logical unit number */
647 u8 crn; /* command reference number */
648 u8 reserved0:5; /* reserved */
649 u8 task_attribute:3; /* task attribute */
650 @@ -204,7 +176,7 @@ struct fcp_rscn_element {
651 struct fcp_logo {
652 u32 command;
653 u32 nport_did;
654 - wwn_t nport_wwpn;
655 + u64 nport_wwpn;
656 } __attribute__((packed));
657
658 /*
659 @@ -218,13 +190,6 @@ struct fcp_logo {
660 #define ZFCP_LS_RSCN 0x61
661 #define ZFCP_LS_RNID 0x78
662
663 -struct zfcp_ls_rjt_par {
664 - u8 action;
665 - u8 reason_code;
666 - u8 reason_expl;
667 - u8 vendor_unique;
668 -} __attribute__ ((packed));
669 -
670 struct zfcp_ls_adisc {
671 u8 code;
672 u8 field[3];
673 @@ -234,20 +199,6 @@ struct zfcp_ls_adisc {
674 u32 nport_id;
675 } __attribute__ ((packed));
676
677 -struct zfcp_ls_adisc_acc {
678 - u8 code;
679 - u8 field[3];
680 - u32 hard_nport_id;
681 - u64 wwpn;
682 - u64 wwnn;
683 - u32 nport_id;
684 -} __attribute__ ((packed));
685 -
686 -struct zfcp_rc_entry {
687 - u8 code;
688 - const char *description;
689 -};
690 -
691 /*
692 * FC-GS-2 stuff
693 */
694 @@ -281,9 +232,7 @@ struct zfcp_rc_entry {
695 #define ZFCP_STATUS_COMMON_RUNNING 0x40000000
696 #define ZFCP_STATUS_COMMON_ERP_FAILED 0x20000000
697 #define ZFCP_STATUS_COMMON_UNBLOCKED 0x10000000
698 -#define ZFCP_STATUS_COMMON_OPENING 0x08000000
699 #define ZFCP_STATUS_COMMON_OPEN 0x04000000
700 -#define ZFCP_STATUS_COMMON_CLOSING 0x02000000
701 #define ZFCP_STATUS_COMMON_ERP_INUSE 0x01000000
702 #define ZFCP_STATUS_COMMON_ACCESS_DENIED 0x00800000
703 #define ZFCP_STATUS_COMMON_ACCESS_BOXED 0x00400000
704 @@ -291,16 +240,15 @@ struct zfcp_rc_entry {
705
706 /* adapter status */
707 #define ZFCP_STATUS_ADAPTER_QDIOUP 0x00000002
708 -#define ZFCP_STATUS_ADAPTER_REGISTERED 0x00000004
709 #define ZFCP_STATUS_ADAPTER_XCONFIG_OK 0x00000008
710 #define ZFCP_STATUS_ADAPTER_HOST_CON_INIT 0x00000010
711 #define ZFCP_STATUS_ADAPTER_ERP_THREAD_UP 0x00000020
712 #define ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL 0x00000080
713 #define ZFCP_STATUS_ADAPTER_ERP_PENDING 0x00000100
714 #define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200
715 -#define ZFCP_STATUS_ADAPTER_XPORT_OK 0x00000800
716
717 /* FC-PH/FC-GS well-known address identifiers for generic services */
718 +#define ZFCP_DID_WKA 0xFFFFF0
719 #define ZFCP_DID_MANAGEMENT_SERVICE 0xFFFFFA
720 #define ZFCP_DID_TIME_SERVICE 0xFFFFFB
721 #define ZFCP_DID_DIRECTORY_SERVICE 0xFFFFFC
722 @@ -312,29 +260,27 @@ struct zfcp_rc_entry {
723 #define ZFCP_STATUS_PORT_DID_DID 0x00000002
724 #define ZFCP_STATUS_PORT_PHYS_CLOSING 0x00000004
725 #define ZFCP_STATUS_PORT_NO_WWPN 0x00000008
726 -#define ZFCP_STATUS_PORT_NO_SCSI_ID 0x00000010
727 #define ZFCP_STATUS_PORT_INVALID_WWPN 0x00000020
728
729 -/* for ports with well known addresses */
730 -#define ZFCP_STATUS_PORT_WKA \
731 - (ZFCP_STATUS_PORT_NO_WWPN | \
732 - ZFCP_STATUS_PORT_NO_SCSI_ID)
733 +/* well known address (WKA) port status*/
734 +enum zfcp_wka_status {
735 + ZFCP_WKA_PORT_OFFLINE,
736 + ZFCP_WKA_PORT_CLOSING,
737 + ZFCP_WKA_PORT_OPENING,
738 + ZFCP_WKA_PORT_ONLINE,
739 +};
740
741 /* logical unit status */
742 -#define ZFCP_STATUS_UNIT_TEMPORARY 0x00000002
743 #define ZFCP_STATUS_UNIT_SHARED 0x00000004
744 #define ZFCP_STATUS_UNIT_READONLY 0x00000008
745 #define ZFCP_STATUS_UNIT_REGISTERED 0x00000010
746 #define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING 0x00000020
747
748 /* FSF request status (this does not have a common part) */
749 -#define ZFCP_STATUS_FSFREQ_NOT_INIT 0x00000000
750 -#define ZFCP_STATUS_FSFREQ_POOL 0x00000001
751 #define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT 0x00000002
752 #define ZFCP_STATUS_FSFREQ_COMPLETED 0x00000004
753 #define ZFCP_STATUS_FSFREQ_ERROR 0x00000008
754 #define ZFCP_STATUS_FSFREQ_CLEANUP 0x00000010
755 -#define ZFCP_STATUS_FSFREQ_ABORTING 0x00000020
756 #define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED 0x00000040
757 #define ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED 0x00000080
758 #define ZFCP_STATUS_FSFREQ_ABORTED 0x00000100
759 @@ -379,7 +325,7 @@ struct ct_hdr {
760 * a port name is required */
761 struct ct_iu_gid_pn_req {
762 struct ct_hdr header;
763 - wwn_t wwpn;
764 + u64 wwpn;
765 } __attribute__ ((packed));
766
767 /* FS_ACC IU and data unit for GID_PN nameserver request */
768 @@ -388,11 +334,9 @@ struct ct_iu_gid_pn_resp {
769 u32 d_id;
770 } __attribute__ ((packed));
771
772 -typedef void (*zfcp_send_ct_handler_t)(unsigned long);
773 -
774 /**
775 * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct
776 - * @port: port where the request is sent to
777 + * @wka_port: port where the request is sent to
778 * @req: scatter-gather list for request
779 * @resp: scatter-gather list for response
780 * @req_count: number of elements in request scatter-gather list
781 @@ -404,12 +348,12 @@ typedef void (*zfcp_send_ct_handler_t)(u
782 * @status: used to pass error status to calling function
783 */
784 struct zfcp_send_ct {
785 - struct zfcp_port *port;
786 + struct zfcp_wka_port *wka_port;
787 struct scatterlist *req;
788 struct scatterlist *resp;
789 unsigned int req_count;
790 unsigned int resp_count;
791 - zfcp_send_ct_handler_t handler;
792 + void (*handler)(unsigned long);
793 unsigned long handler_data;
794 int timeout;
795 struct completion *completion;
796 @@ -426,8 +370,6 @@ struct zfcp_gid_pn_data {
797 struct zfcp_port *port;
798 };
799
800 -typedef void (*zfcp_send_els_handler_t)(unsigned long);
801 -
802 /**
803 * struct zfcp_send_els - used to pass parameters to function zfcp_fsf_send_els
804 * @adapter: adapter where request is sent from
805 @@ -451,22 +393,28 @@ struct zfcp_send_els {
806 struct scatterlist *resp;
807 unsigned int req_count;
808 unsigned int resp_count;
809 - zfcp_send_els_handler_t handler;
810 + void (*handler)(unsigned long);
811 unsigned long handler_data;
812 struct completion *completion;
813 int ls_code;
814 int status;
815 };
816
817 +struct zfcp_wka_port {
818 + struct zfcp_adapter *adapter;
819 + wait_queue_head_t completion_wq;
820 + enum zfcp_wka_status status;
821 + atomic_t refcount;
822 + u32 d_id;
823 + u32 handle;
824 + struct mutex mutex;
825 + struct delayed_work work;
826 +};
827 +
828 struct zfcp_qdio_queue {
829 - struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q]; /* SBALs */
830 - u8 first; /* index of next free bfr
831 - in queue (free_count>0) */
832 - atomic_t count; /* number of free buffers
833 - in queue */
834 - spinlock_t lock; /* lock for operations on queue */
835 - int pci_batch; /* SBALs since PCI indication
836 - was last set */
837 + struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
838 + u8 first; /* index of next free bfr in queue */
839 + atomic_t count; /* number of free buffers in queue */
840 };
841
842 struct zfcp_erp_action {
843 @@ -475,7 +423,7 @@ struct zfcp_erp_action {
844 struct zfcp_adapter *adapter; /* device which should be recovered */
845 struct zfcp_port *port;
846 struct zfcp_unit *unit;
847 - volatile u32 status; /* recovery status */
848 + u32 status; /* recovery status */
849 u32 step; /* active step of this erp action */
850 struct zfcp_fsf_req *fsf_req; /* fsf request currently pending
851 for this action */
852 @@ -506,8 +454,8 @@ struct zfcp_adapter {
853 atomic_t refcount; /* reference count */
854 wait_queue_head_t remove_wq; /* can be used to wait for
855 refcount drop to zero */
856 - wwn_t peer_wwnn; /* P2P peer WWNN */
857 - wwn_t peer_wwpn; /* P2P peer WWPN */
858 + u64 peer_wwnn; /* P2P peer WWNN */
859 + u64 peer_wwpn; /* P2P peer WWPN */
860 u32 peer_d_id; /* P2P peer D_ID */
861 struct ccw_device *ccw_device; /* S/390 ccw device */
862 u32 hydra_version; /* Hydra version */
863 @@ -518,13 +466,13 @@ struct zfcp_adapter {
864 u16 timer_ticks; /* time int for a tick */
865 struct Scsi_Host *scsi_host; /* Pointer to mid-layer */
866 struct list_head port_list_head; /* remote port list */
867 - struct list_head port_remove_lh; /* head of ports to be
868 - removed */
869 - u32 ports; /* number of remote ports */
870 unsigned long req_no; /* unique FSF req number */
871 struct list_head *req_list; /* list of pending reqs */
872 spinlock_t req_list_lock; /* request list lock */
873 struct zfcp_qdio_queue req_q; /* request queue */
874 + spinlock_t req_q_lock; /* for operations on queue */
875 + int req_q_pci_batch; /* SBALs since PCI indication
876 + was last set */
877 u32 fsf_req_seq_no; /* FSF cmnd seq number */
878 wait_queue_head_t request_wq; /* can be used to wait for
879 more avaliable SBALs */
880 @@ -548,7 +496,7 @@ struct zfcp_adapter {
881 actions */
882 u32 erp_low_mem_count; /* nr of erp actions waiting
883 for memory */
884 - struct zfcp_port *nameserver_port; /* adapter's nameserver */
885 + struct zfcp_wka_port nsp; /* adapter's nameserver */
886 debug_info_t *rec_dbf;
887 debug_info_t *hba_dbf;
888 debug_info_t *san_dbf; /* debug feature areas */
889 @@ -563,7 +511,6 @@ struct zfcp_adapter {
890 struct zfcp_scsi_dbf_record scsi_dbf_buf;
891 struct zfcp_adapter_mempool pool; /* Adapter memory pools */
892 struct qdio_initialize qdio_init_data; /* for qdio_establish */
893 - struct device generic_services; /* directory for WKA ports */
894 struct fc_host_statistics *fc_stats;
895 struct fsf_qtcb_bottom_port *stats_reset_data;
896 unsigned long stats_reset;
897 @@ -580,18 +527,16 @@ struct zfcp_port {
898 refcount drop to zero */
899 struct zfcp_adapter *adapter; /* adapter used to access port */
900 struct list_head unit_list_head; /* head of logical unit list */
901 - struct list_head unit_remove_lh; /* head of luns to be removed
902 - list */
903 - u32 units; /* # of logical units in list */
904 atomic_t status; /* status of this remote port */
905 - wwn_t wwnn; /* WWNN if known */
906 - wwn_t wwpn; /* WWPN */
907 + u64 wwnn; /* WWNN if known */
908 + u64 wwpn; /* WWPN */
909 u32 d_id; /* D_ID */
910 u32 handle; /* handle assigned by FSF */
911 struct zfcp_erp_action erp_action; /* pending error recovery */
912 atomic_t erp_counter;
913 u32 maxframe_size;
914 u32 supported_classes;
915 + struct work_struct gid_pn_work;
916 };
917
918 struct zfcp_unit {
919 @@ -602,8 +547,7 @@ struct zfcp_unit {
920 refcount drop to zero */
921 struct zfcp_port *port; /* remote port of unit */
922 atomic_t status; /* status of this logical unit */
923 - unsigned int scsi_lun; /* own SCSI LUN */
924 - fcp_lun_t fcp_lun; /* own FCP_LUN */
925 + u64 fcp_lun; /* own FCP_LUN */
926 u32 handle; /* handle assigned by FSF */
927 struct scsi_device *device; /* scsi device struct pointer */
928 struct zfcp_erp_action erp_action; /* pending error recovery */
929 @@ -626,7 +570,7 @@ struct zfcp_fsf_req {
930 u8 sbal_response; /* SBAL used in interrupt */
931 wait_queue_head_t completion_wq; /* can be used by a routine
932 to wait for completion */
933 - volatile u32 status; /* status of this request */
934 + u32 status; /* status of this request */
935 u32 fsf_command; /* FSF Command copy */
936 struct fsf_qtcb *qtcb; /* address of associated QTCB */
937 u32 seq_no; /* Sequence number of request */
938 @@ -647,11 +591,7 @@ struct zfcp_fsf_req {
939 struct zfcp_data {
940 struct scsi_host_template scsi_host_template;
941 struct scsi_transport_template *scsi_transport_template;
942 - atomic_t status; /* Module status flags */
943 struct list_head adapter_list_head; /* head of adapter list */
944 - struct list_head adapter_remove_lh; /* head of adapters to be
945 - removed */
946 - u32 adapters; /* # of adapters in list */
947 rwlock_t config_lock; /* serialises changes
948 to adapter/port/unit
949 lists */
950 @@ -659,11 +599,12 @@ struct zfcp_data {
951 changes */
952 atomic_t loglevel; /* current loglevel */
953 char init_busid[BUS_ID_SIZE];
954 - wwn_t init_wwpn;
955 - fcp_lun_t init_fcp_lun;
956 - struct kmem_cache *fsf_req_qtcb_cache;
957 - struct kmem_cache *sr_buffer_cache;
958 - struct kmem_cache *gid_pn_cache;
959 + u64 init_wwpn;
960 + u64 init_fcp_lun;
961 + struct kmem_cache *fsf_req_qtcb_cache;
962 + struct kmem_cache *sr_buffer_cache;
963 + struct kmem_cache *gid_pn_cache;
964 + struct workqueue_struct *work_queue;
965 };
966
967 /* struct used by memory pools for fsf_requests */
968 @@ -680,14 +621,7 @@ struct zfcp_fsf_req_qtcb {
969 #define ZFCP_SET 0x00000100
970 #define ZFCP_CLEAR 0x00000200
971
972 -#ifndef atomic_test_mask
973 -#define atomic_test_mask(mask, target) \
974 - ((atomic_read(target) & mask) == mask)
975 -#endif
976 -
977 #define zfcp_get_busid_by_adapter(adapter) (adapter->ccw_device->dev.bus_id)
978 -#define zfcp_get_busid_by_port(port) (zfcp_get_busid_by_adapter(port->adapter))
979 -#define zfcp_get_busid_by_unit(unit) (zfcp_get_busid_by_port(unit->port))
980
981 /*
982 * Helper functions for request ID management.
983 @@ -748,12 +682,6 @@ zfcp_unit_put(struct zfcp_unit *unit)
984 }
985
986 static inline void
987 -zfcp_unit_wait(struct zfcp_unit *unit)
988 -{
989 - wait_event(unit->remove_wq, atomic_read(&unit->refcount) == 0);
990 -}
991 -
992 -static inline void
993 zfcp_port_get(struct zfcp_port *port)
994 {
995 atomic_inc(&port->refcount);
996 @@ -767,12 +695,6 @@ zfcp_port_put(struct zfcp_port *port)
997 }
998
999 static inline void
1000 -zfcp_port_wait(struct zfcp_port *port)
1001 -{
1002 - wait_event(port->remove_wq, atomic_read(&port->refcount) == 0);
1003 -}
1004 -
1005 -static inline void
1006 zfcp_adapter_get(struct zfcp_adapter *adapter)
1007 {
1008 atomic_inc(&adapter->refcount);
1009 @@ -785,10 +707,4 @@ zfcp_adapter_put(struct zfcp_adapter *ad
1010 wake_up(&adapter->remove_wq);
1011 }
1012
1013 -static inline void
1014 -zfcp_adapter_wait(struct zfcp_adapter *adapter)
1015 -{
1016 - wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
1017 -}
1018 -
1019 #endif /* ZFCP_DEF_H */
1020 --- a/drivers/s390/scsi/zfcp_erp.c
1021 +++ b/drivers/s390/scsi/zfcp_erp.c
1022 @@ -25,7 +25,6 @@ enum zfcp_erp_steps {
1023 ZFCP_ERP_STEP_FSF_XCONFIG = 0x0001,
1024 ZFCP_ERP_STEP_PHYS_PORT_CLOSING = 0x0010,
1025 ZFCP_ERP_STEP_PORT_CLOSING = 0x0100,
1026 - ZFCP_ERP_STEP_NAMESERVER_OPEN = 0x0200,
1027 ZFCP_ERP_STEP_NAMESERVER_LOOKUP = 0x0400,
1028 ZFCP_ERP_STEP_PORT_OPENING = 0x0800,
1029 ZFCP_ERP_STEP_UNIT_CLOSING = 0x1000,
1030 @@ -534,8 +533,7 @@ static void _zfcp_erp_port_reopen_all(st
1031 struct zfcp_port *port;
1032
1033 list_for_each_entry(port, &adapter->port_list_head, list)
1034 - if (!(atomic_read(&port->status) & ZFCP_STATUS_PORT_WKA))
1035 - _zfcp_erp_port_reopen(port, clear, id, ref);
1036 + _zfcp_erp_port_reopen(port, clear, id, ref);
1037 }
1038
1039 static void _zfcp_erp_unit_reopen_all(struct zfcp_port *port, int clear, u8 id,
1040 @@ -671,8 +669,6 @@ static int zfcp_erp_adapter_strategy_ope
1041 int ret;
1042 struct zfcp_adapter *adapter = act->adapter;
1043
1044 - atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status);
1045 -
1046 write_lock_irq(&adapter->erp_lock);
1047 zfcp_erp_action_to_running(act);
1048 write_unlock_irq(&adapter->erp_lock);
1049 @@ -743,8 +739,7 @@ static int zfcp_erp_adapter_strategy_gen
1050 ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
1051 failed_qdio:
1052 atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK |
1053 - ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
1054 - ZFCP_STATUS_ADAPTER_XPORT_OK,
1055 + ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED,
1056 &act->adapter->status);
1057 return retval;
1058 }
1059 @@ -753,15 +748,11 @@ static int zfcp_erp_adapter_strategy(str
1060 {
1061 int retval;
1062
1063 - atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, &act->adapter->status);
1064 zfcp_erp_adapter_strategy_generic(act, 1); /* close */
1065 - atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, &act->adapter->status);
1066 if (act->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
1067 return ZFCP_ERP_EXIT;
1068
1069 - atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &act->adapter->status);
1070 retval = zfcp_erp_adapter_strategy_generic(act, 0); /* open */
1071 - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, &act->adapter->status);
1072
1073 if (retval == ZFCP_ERP_FAILED)
1074 ssleep(8);
1075 @@ -785,10 +776,7 @@ static int zfcp_erp_port_forced_strategy
1076
1077 static void zfcp_erp_port_strategy_clearstati(struct zfcp_port *port)
1078 {
1079 - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING |
1080 - ZFCP_STATUS_COMMON_CLOSING |
1081 - ZFCP_STATUS_COMMON_ACCESS_DENIED |
1082 - ZFCP_STATUS_PORT_DID_DID |
1083 + atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
1084 ZFCP_STATUS_PORT_PHYS_CLOSING |
1085 ZFCP_STATUS_PORT_INVALID_WWPN,
1086 &port->status);
1087 @@ -841,62 +829,6 @@ static int zfcp_erp_port_strategy_open_p
1088 return ZFCP_ERP_CONTINUES;
1089 }
1090
1091 -static void zfcp_erp_port_strategy_open_ns_wake(struct zfcp_erp_action *ns_act)
1092 -{
1093 - unsigned long flags;
1094 - struct zfcp_adapter *adapter = ns_act->adapter;
1095 - struct zfcp_erp_action *act, *tmp;
1096 - int status;
1097 -
1098 - read_lock_irqsave(&adapter->erp_lock, flags);
1099 - list_for_each_entry_safe(act, tmp, &adapter->erp_running_head, list) {
1100 - if (act->step == ZFCP_ERP_STEP_NAMESERVER_OPEN) {
1101 - status = atomic_read(&adapter->nameserver_port->status);
1102 - if (status & ZFCP_STATUS_COMMON_ERP_FAILED)
1103 - zfcp_erp_port_failed(act->port, 27, NULL);
1104 - zfcp_erp_action_ready(act);
1105 - }
1106 - }
1107 - read_unlock_irqrestore(&adapter->erp_lock, flags);
1108 -}
1109 -
1110 -static int zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *act)
1111 -{
1112 - int retval;
1113 -
1114 - switch (act->step) {
1115 - case ZFCP_ERP_STEP_UNINITIALIZED:
1116 - case ZFCP_ERP_STEP_PHYS_PORT_CLOSING:
1117 - case ZFCP_ERP_STEP_PORT_CLOSING:
1118 - return zfcp_erp_port_strategy_open_port(act);
1119 -
1120 - case ZFCP_ERP_STEP_PORT_OPENING:
1121 - if (atomic_read(&act->port->status) & ZFCP_STATUS_COMMON_OPEN)
1122 - retval = ZFCP_ERP_SUCCEEDED;
1123 - else
1124 - retval = ZFCP_ERP_FAILED;
1125 - /* this is needed anyway */
1126 - zfcp_erp_port_strategy_open_ns_wake(act);
1127 - return retval;
1128 -
1129 - default:
1130 - return ZFCP_ERP_FAILED;
1131 - }
1132 -}
1133 -
1134 -static int zfcp_erp_port_strategy_open_lookup(struct zfcp_erp_action *act)
1135 -{
1136 - int retval;
1137 -
1138 - retval = zfcp_fc_ns_gid_pn_request(act);
1139 - if (retval == -ENOMEM)
1140 - return ZFCP_ERP_NOMEM;
1141 - act->step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
1142 - if (retval)
1143 - return ZFCP_ERP_FAILED;
1144 - return ZFCP_ERP_CONTINUES;
1145 -}
1146 -
1147 static int zfcp_erp_open_ptp_port(struct zfcp_erp_action *act)
1148 {
1149 struct zfcp_adapter *adapter = act->adapter;
1150 @@ -911,11 +843,25 @@ static int zfcp_erp_open_ptp_port(struct
1151 return zfcp_erp_port_strategy_open_port(act);
1152 }
1153
1154 +void zfcp_erp_port_strategy_open_lookup(struct work_struct *work)
1155 +{
1156 + int retval;
1157 + struct zfcp_port *port = container_of(work, struct zfcp_port,
1158 + gid_pn_work);
1159 +
1160 + retval = zfcp_fc_ns_gid_pn(&port->erp_action);
1161 + if (retval == -ENOMEM)
1162 + zfcp_erp_notify(&port->erp_action, ZFCP_ERP_NOMEM);
1163 + port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
1164 + if (retval)
1165 + zfcp_erp_notify(&port->erp_action, ZFCP_ERP_FAILED);
1166 +
1167 +}
1168 +
1169 static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
1170 {
1171 struct zfcp_adapter *adapter = act->adapter;
1172 struct zfcp_port *port = act->port;
1173 - struct zfcp_port *ns_port = adapter->nameserver_port;
1174 int p_status = atomic_read(&port->status);
1175
1176 switch (act->step) {
1177 @@ -924,28 +870,10 @@ static int zfcp_erp_port_strategy_open_c
1178 case ZFCP_ERP_STEP_PORT_CLOSING:
1179 if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
1180 return zfcp_erp_open_ptp_port(act);
1181 - if (!ns_port) {
1182 - dev_err(&adapter->ccw_device->dev,
1183 - "Nameserver port unavailable.\n");
1184 - return ZFCP_ERP_FAILED;
1185 - }
1186 - if (!(atomic_read(&ns_port->status) &
1187 - ZFCP_STATUS_COMMON_UNBLOCKED)) {
1188 - /* nameserver port may live again */
1189 - atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING,
1190 - &ns_port->status);
1191 - if (zfcp_erp_port_reopen(ns_port, 0, 77, act) >= 0) {
1192 - act->step = ZFCP_ERP_STEP_NAMESERVER_OPEN;
1193 - return ZFCP_ERP_CONTINUES;
1194 - }
1195 - return ZFCP_ERP_FAILED;
1196 + if (!(p_status & ZFCP_STATUS_PORT_DID_DID)) {
1197 + queue_work(zfcp_data.work_queue, &port->gid_pn_work);
1198 + return ZFCP_ERP_CONTINUES;
1199 }
1200 - /* else nameserver port is already open, fall through */
1201 - case ZFCP_ERP_STEP_NAMESERVER_OPEN:
1202 - if (!(atomic_read(&ns_port->status) & ZFCP_STATUS_COMMON_OPEN))
1203 - return ZFCP_ERP_FAILED;
1204 - return zfcp_erp_port_strategy_open_lookup(act);
1205 -
1206 case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
1207 if (!(p_status & ZFCP_STATUS_PORT_DID_DID)) {
1208 if (p_status & (ZFCP_STATUS_PORT_INVALID_WWPN)) {
1209 @@ -958,25 +886,26 @@ static int zfcp_erp_port_strategy_open_c
1210
1211 case ZFCP_ERP_STEP_PORT_OPENING:
1212 /* D_ID might have changed during open */
1213 - if ((p_status & ZFCP_STATUS_COMMON_OPEN) &&
1214 - (p_status & ZFCP_STATUS_PORT_DID_DID))
1215 - return ZFCP_ERP_SUCCEEDED;
1216 + if (p_status & ZFCP_STATUS_COMMON_OPEN) {
1217 + if (p_status & ZFCP_STATUS_PORT_DID_DID)
1218 + return ZFCP_ERP_SUCCEEDED;
1219 + else {
1220 + act->step = ZFCP_ERP_STEP_PORT_CLOSING;
1221 + return ZFCP_ERP_CONTINUES;
1222 + }
1223 /* fall through otherwise */
1224 + }
1225 }
1226 return ZFCP_ERP_FAILED;
1227 }
1228
1229 -static int zfcp_erp_port_strategy_open(struct zfcp_erp_action *act)
1230 -{
1231 - if (atomic_read(&act->port->status) & (ZFCP_STATUS_PORT_WKA))
1232 - return zfcp_erp_port_strategy_open_nameserver(act);
1233 - return zfcp_erp_port_strategy_open_common(act);
1234 -}
1235 -
1236 static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action)
1237 {
1238 struct zfcp_port *port = erp_action->port;
1239
1240 + if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC)
1241 + goto close_init_done;
1242 +
1243 switch (erp_action->step) {
1244 case ZFCP_ERP_STEP_UNINITIALIZED:
1245 zfcp_erp_port_strategy_clearstati(port);
1246 @@ -989,19 +918,17 @@ static int zfcp_erp_port_strategy(struct
1247 return ZFCP_ERP_FAILED;
1248 break;
1249 }
1250 +
1251 +close_init_done:
1252 if (erp_action->status & ZFCP_STATUS_ERP_CLOSE_ONLY)
1253 return ZFCP_ERP_EXIT;
1254 - else
1255 - return zfcp_erp_port_strategy_open(erp_action);
1256
1257 - return ZFCP_ERP_FAILED;
1258 + return zfcp_erp_port_strategy_open_common(erp_action);
1259 }
1260
1261 static void zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit)
1262 {
1263 - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING |
1264 - ZFCP_STATUS_COMMON_CLOSING |
1265 - ZFCP_STATUS_COMMON_ACCESS_DENIED |
1266 + atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
1267 ZFCP_STATUS_UNIT_SHARED |
1268 ZFCP_STATUS_UNIT_READONLY,
1269 &unit->status);
1270 @@ -1261,9 +1188,10 @@ static void zfcp_erp_scsi_scan(struct wo
1271 struct zfcp_unit *unit = p->unit;
1272 struct fc_rport *rport = unit->port->rport;
1273 scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
1274 - unit->scsi_lun, 0);
1275 + scsilun_to_int((struct scsi_lun *)&unit->fcp_lun), 0);
1276 atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1277 zfcp_unit_put(unit);
1278 + wake_up(&unit->port->adapter->erp_done_wqh);
1279 kfree(p);
1280 }
1281
1282 @@ -1284,7 +1212,7 @@ static void zfcp_erp_schedule_work(struc
1283 atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1284 INIT_WORK(&p->work, zfcp_erp_scsi_scan);
1285 p->unit = unit;
1286 - schedule_work(&p->work);
1287 + queue_work(zfcp_data.work_queue, &p->work);
1288 }
1289
1290 static void zfcp_erp_rport_register(struct zfcp_port *port)
1291 @@ -1310,12 +1238,12 @@ static void zfcp_erp_rport_register(stru
1292 static void zfcp_erp_rports_del(struct zfcp_adapter *adapter)
1293 {
1294 struct zfcp_port *port;
1295 - list_for_each_entry(port, &adapter->port_list_head, list)
1296 - if (port->rport && !(atomic_read(&port->status) &
1297 - ZFCP_STATUS_PORT_WKA)) {
1298 - fc_remote_port_delete(port->rport);
1299 - port->rport = NULL;
1300 - }
1301 + list_for_each_entry(port, &adapter->port_list_head, list) {
1302 + if (!port->rport)
1303 + continue;
1304 + fc_remote_port_delete(port->rport);
1305 + port->rport = NULL;
1306 + }
1307 }
1308
1309 static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
1310 @@ -1470,9 +1398,9 @@ static int zfcp_erp_thread(void *data)
1311 zfcp_erp_wakeup(adapter);
1312 }
1313
1314 - zfcp_rec_dbf_event_thread(4, adapter);
1315 + zfcp_rec_dbf_event_thread_lock(4, adapter);
1316 down_interruptible(&adapter->erp_ready_sem);
1317 - zfcp_rec_dbf_event_thread(5, adapter);
1318 + zfcp_rec_dbf_event_thread_lock(5, adapter);
1319 }
1320
1321 atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
1322 @@ -1517,7 +1445,7 @@ void zfcp_erp_thread_kill(struct zfcp_ad
1323 {
1324 atomic_set_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL, &adapter->status);
1325 up(&adapter->erp_ready_sem);
1326 - zfcp_rec_dbf_event_thread_lock(2, adapter);
1327 + zfcp_rec_dbf_event_thread_lock(3, adapter);
1328
1329 wait_event(adapter->erp_thread_wqh,
1330 !(atomic_read(&adapter->status) &
1331 @@ -1751,9 +1679,8 @@ static void zfcp_erp_port_access_changed
1332
1333 if (!(status & (ZFCP_STATUS_COMMON_ACCESS_DENIED |
1334 ZFCP_STATUS_COMMON_ACCESS_BOXED))) {
1335 - if (!(status & ZFCP_STATUS_PORT_WKA))
1336 - list_for_each_entry(unit, &port->unit_list_head, list)
1337 - zfcp_erp_unit_access_changed(unit, id, ref);
1338 + list_for_each_entry(unit, &port->unit_list_head, list)
1339 + zfcp_erp_unit_access_changed(unit, id, ref);
1340 return;
1341 }
1342
1343 @@ -1776,10 +1703,7 @@ void zfcp_erp_adapter_access_changed(str
1344 return;
1345
1346 read_lock_irqsave(&zfcp_data.config_lock, flags);
1347 - if (adapter->nameserver_port)
1348 - zfcp_erp_port_access_changed(adapter->nameserver_port, id, ref);
1349 list_for_each_entry(port, &adapter->port_list_head, list)
1350 - if (port != adapter->nameserver_port)
1351 - zfcp_erp_port_access_changed(port, id, ref);
1352 + zfcp_erp_port_access_changed(port, id, ref);
1353 read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1354 }
1355 --- a/drivers/s390/scsi/zfcp_ext.h
1356 +++ b/drivers/s390/scsi/zfcp_ext.h
1357 @@ -12,16 +12,14 @@
1358 #include "zfcp_def.h"
1359
1360 /* zfcp_aux.c */
1361 -extern struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *,
1362 - fcp_lun_t);
1363 -extern struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *,
1364 - wwn_t);
1365 +extern struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *, u64);
1366 +extern struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *, u64);
1367 extern int zfcp_adapter_enqueue(struct ccw_device *);
1368 extern void zfcp_adapter_dequeue(struct zfcp_adapter *);
1369 -extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, wwn_t, u32,
1370 +extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, u64, u32,
1371 u32);
1372 extern void zfcp_port_dequeue(struct zfcp_port *);
1373 -extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, fcp_lun_t);
1374 +extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, u64);
1375 extern void zfcp_unit_dequeue(struct zfcp_unit *);
1376 extern int zfcp_reqlist_isempty(struct zfcp_adapter *);
1377 extern void zfcp_sg_free_table(struct scatterlist *, int);
1378 @@ -29,6 +27,7 @@ extern int zfcp_sg_setup_table(struct sc
1379
1380 /* zfcp_ccw.c */
1381 extern int zfcp_ccw_register(void);
1382 +extern struct zfcp_adapter *zfcp_get_adapter_by_busid(char *);
1383
1384 /* zfcp_cfdc.c */
1385 extern struct miscdevice zfcp_cfdc_misc;
1386 @@ -50,6 +49,8 @@ extern void zfcp_hba_dbf_event_fsf_unsol
1387 struct fsf_status_read_buffer *);
1388 extern void zfcp_hba_dbf_event_qdio(struct zfcp_adapter *, unsigned int, int,
1389 int);
1390 +extern void zfcp_hba_dbf_event_berr(struct zfcp_adapter *,
1391 + struct zfcp_fsf_req *);
1392 extern void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *);
1393 extern void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *);
1394 extern void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *);
1395 @@ -91,17 +92,21 @@ extern void zfcp_erp_port_access_denied(
1396 extern void zfcp_erp_unit_access_denied(struct zfcp_unit *, u8, void *);
1397 extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *, u8, void *);
1398 extern void zfcp_erp_timeout_handler(unsigned long);
1399 +extern void zfcp_erp_port_strategy_open_lookup(struct work_struct *);
1400
1401 /* zfcp_fc.c */
1402 extern int zfcp_scan_ports(struct zfcp_adapter *);
1403 extern void _zfcp_scan_ports_later(struct work_struct *);
1404 extern void zfcp_fc_incoming_els(struct zfcp_fsf_req *);
1405 -extern int zfcp_fc_ns_gid_pn_request(struct zfcp_erp_action *);
1406 +extern int zfcp_fc_ns_gid_pn(struct zfcp_erp_action *);
1407 extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *);
1408 extern void zfcp_test_link(struct zfcp_port *);
1409 +extern void zfcp_fc_nameserver_init(struct zfcp_adapter *);
1410
1411 /* zfcp_fsf.c */
1412 extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
1413 +extern int zfcp_fsf_open_wka_port(struct zfcp_wka_port *);
1414 +extern int zfcp_fsf_close_wka_port(struct zfcp_wka_port *);
1415 extern int zfcp_fsf_close_port(struct zfcp_erp_action *);
1416 extern int zfcp_fsf_close_physical_port(struct zfcp_erp_action *);
1417 extern int zfcp_fsf_open_unit(struct zfcp_erp_action *);
1418 @@ -135,10 +140,8 @@ extern struct zfcp_fsf_req *zfcp_fsf_abo
1419 extern int zfcp_qdio_allocate(struct zfcp_adapter *);
1420 extern void zfcp_qdio_free(struct zfcp_adapter *);
1421 extern int zfcp_qdio_send(struct zfcp_fsf_req *);
1422 -extern volatile struct qdio_buffer_element *zfcp_qdio_sbale_req(
1423 - struct zfcp_fsf_req *);
1424 -extern volatile struct qdio_buffer_element *zfcp_qdio_sbale_curr(
1425 - struct zfcp_fsf_req *);
1426 +extern struct qdio_buffer_element *zfcp_qdio_sbale_req(struct zfcp_fsf_req *);
1427 +extern struct qdio_buffer_element *zfcp_qdio_sbale_curr(struct zfcp_fsf_req *);
1428 extern int zfcp_qdio_sbals_from_sg(struct zfcp_fsf_req *, unsigned long,
1429 struct scatterlist *, int);
1430 extern int zfcp_qdio_open(struct zfcp_adapter *);
1431 @@ -148,14 +151,12 @@ extern void zfcp_qdio_close(struct zfcp_
1432 extern struct zfcp_data zfcp_data;
1433 extern int zfcp_adapter_scsi_register(struct zfcp_adapter *);
1434 extern void zfcp_adapter_scsi_unregister(struct zfcp_adapter *);
1435 -extern void zfcp_set_fcp_dl(struct fcp_cmnd_iu *, fcp_dl_t);
1436 extern char *zfcp_get_fcp_sns_info_ptr(struct fcp_rsp_iu *);
1437 extern struct fc_function_template zfcp_transport_functions;
1438
1439 /* zfcp_sysfs.c */
1440 extern struct attribute_group zfcp_sysfs_unit_attrs;
1441 extern struct attribute_group zfcp_sysfs_adapter_attrs;
1442 -extern struct attribute_group zfcp_sysfs_ns_port_attrs;
1443 extern struct attribute_group zfcp_sysfs_port_attrs;
1444 extern struct device_attribute *zfcp_sysfs_sdev_attrs[];
1445 extern struct device_attribute *zfcp_sysfs_shost_attrs[];
1446 --- a/drivers/s390/scsi/zfcp_fc.c
1447 +++ b/drivers/s390/scsi/zfcp_fc.c
1448 @@ -41,6 +41,84 @@ struct zfcp_gpn_ft {
1449 struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS];
1450 };
1451
1452 +struct zfcp_fc_ns_handler_data {
1453 + struct completion done;
1454 + void (*handler)(unsigned long);
1455 + unsigned long handler_data;
1456 +};
1457 +
1458 +static int zfcp_wka_port_get(struct zfcp_wka_port *wka_port)
1459 +{
1460 + if (mutex_lock_interruptible(&wka_port->mutex))
1461 + return -ERESTARTSYS;
1462 +
1463 + if (wka_port->status != ZFCP_WKA_PORT_ONLINE) {
1464 + wka_port->status = ZFCP_WKA_PORT_OPENING;
1465 + if (zfcp_fsf_open_wka_port(wka_port))
1466 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
1467 + }
1468 +
1469 + mutex_unlock(&wka_port->mutex);
1470 +
1471 + wait_event_timeout(
1472 + wka_port->completion_wq,
1473 + wka_port->status == ZFCP_WKA_PORT_ONLINE ||
1474 + wka_port->status == ZFCP_WKA_PORT_OFFLINE,
1475 + HZ >> 1);
1476 +
1477 + if (wka_port->status == ZFCP_WKA_PORT_ONLINE) {
1478 + atomic_inc(&wka_port->refcount);
1479 + return 0;
1480 + }
1481 + return -EIO;
1482 +}
1483 +
1484 +static void zfcp_wka_port_offline(struct work_struct *work)
1485 +{
1486 + struct delayed_work *dw = container_of(work, struct delayed_work, work);
1487 + struct zfcp_wka_port *wka_port =
1488 + container_of(dw, struct zfcp_wka_port, work);
1489 +
1490 + wait_event(wka_port->completion_wq,
1491 + atomic_read(&wka_port->refcount) == 0);
1492 +
1493 + mutex_lock(&wka_port->mutex);
1494 + if ((atomic_read(&wka_port->refcount) != 0) ||
1495 + (wka_port->status != ZFCP_WKA_PORT_ONLINE))
1496 + goto out;
1497 +
1498 + wka_port->status = ZFCP_WKA_PORT_CLOSING;
1499 + if (zfcp_fsf_close_wka_port(wka_port)) {
1500 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
1501 + wake_up(&wka_port->completion_wq);
1502 + }
1503 +out:
1504 + mutex_unlock(&wka_port->mutex);
1505 +}
1506 +
1507 +static void zfcp_wka_port_put(struct zfcp_wka_port *wka_port)
1508 +{
1509 + if (atomic_dec_return(&wka_port->refcount) != 0)
1510 + return;
1511 + /* wait 10 miliseconds, other reqs might pop in */
1512 + schedule_delayed_work(&wka_port->work, HZ / 100);
1513 +}
1514 +
1515 +void zfcp_fc_nameserver_init(struct zfcp_adapter *adapter)
1516 +{
1517 + struct zfcp_wka_port *wka_port = &adapter->nsp;
1518 +
1519 + init_waitqueue_head(&wka_port->completion_wq);
1520 +
1521 + wka_port->adapter = adapter;
1522 + wka_port->d_id = ZFCP_DID_DIRECTORY_SERVICE;
1523 +
1524 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
1525 + atomic_set(&wka_port->refcount, 0);
1526 + mutex_init(&wka_port->mutex);
1527 + INIT_DELAYED_WORK(&wka_port->work, zfcp_wka_port_offline);
1528 +}
1529 +
1530 static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
1531 struct fcp_rscn_element *elem)
1532 {
1533 @@ -49,10 +127,8 @@ static void _zfcp_fc_incoming_rscn(struc
1534
1535 read_lock_irqsave(&zfcp_data.config_lock, flags);
1536 list_for_each_entry(port, &fsf_req->adapter->port_list_head, list) {
1537 - if (atomic_test_mask(ZFCP_STATUS_PORT_WKA, &port->status))
1538 - continue;
1539 /* FIXME: ZFCP_STATUS_PORT_DID_DID check is racy */
1540 - if (!atomic_test_mask(ZFCP_STATUS_PORT_DID_DID, &port->status))
1541 + if (!(atomic_read(&port->status) & ZFCP_STATUS_PORT_DID_DID))
1542 /* Try to connect to unused ports anyway. */
1543 zfcp_erp_port_reopen(port,
1544 ZFCP_STATUS_COMMON_ERP_FAILED,
1545 @@ -104,7 +180,7 @@ static void zfcp_fc_incoming_rscn(struct
1546 schedule_work(&fsf_req->adapter->scan_work);
1547 }
1548
1549 -static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, wwn_t wwpn)
1550 +static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, u64 wwpn)
1551 {
1552 struct zfcp_adapter *adapter = req->adapter;
1553 struct zfcp_port *port;
1554 @@ -159,7 +235,18 @@ void zfcp_fc_incoming_els(struct zfcp_fs
1555 zfcp_fc_incoming_rscn(fsf_req);
1556 }
1557
1558 -static void zfcp_ns_gid_pn_handler(unsigned long data)
1559 +static void zfcp_fc_ns_handler(unsigned long data)
1560 +{
1561 + struct zfcp_fc_ns_handler_data *compl_rec =
1562 + (struct zfcp_fc_ns_handler_data *) data;
1563 +
1564 + if (compl_rec->handler)
1565 + compl_rec->handler(compl_rec->handler_data);
1566 +
1567 + complete(&compl_rec->done);
1568 +}
1569 +
1570 +static void zfcp_fc_ns_gid_pn_eval(unsigned long data)
1571 {
1572 struct zfcp_gid_pn_data *gid_pn = (struct zfcp_gid_pn_data *) data;
1573 struct zfcp_send_ct *ct = &gid_pn->ct;
1574 @@ -168,43 +255,31 @@ static void zfcp_ns_gid_pn_handler(unsig
1575 struct zfcp_port *port = gid_pn->port;
1576
1577 if (ct->status)
1578 - goto out;
1579 + return;
1580 if (ct_iu_resp->header.cmd_rsp_code != ZFCP_CT_ACCEPT) {
1581 atomic_set_mask(ZFCP_STATUS_PORT_INVALID_WWPN, &port->status);
1582 - goto out;
1583 + return;
1584 }
1585 /* paranoia */
1586 if (ct_iu_req->wwpn != port->wwpn)
1587 - goto out;
1588 + return;
1589 /* looks like a valid d_id */
1590 port->d_id = ct_iu_resp->d_id & ZFCP_DID_MASK;
1591 atomic_set_mask(ZFCP_STATUS_PORT_DID_DID, &port->status);
1592 -out:
1593 - mempool_free(gid_pn, port->adapter->pool.data_gid_pn);
1594 }
1595
1596 -/**
1597 - * zfcp_fc_ns_gid_pn_request - initiate GID_PN nameserver request
1598 - * @erp_action: pointer to zfcp_erp_action where GID_PN request is needed
1599 - * return: -ENOMEM on error, 0 otherwise
1600 - */
1601 -int zfcp_fc_ns_gid_pn_request(struct zfcp_erp_action *erp_action)
1602 +int static zfcp_fc_ns_gid_pn_request(struct zfcp_erp_action *erp_action,
1603 + struct zfcp_gid_pn_data *gid_pn)
1604 {
1605 - int ret;
1606 - struct zfcp_gid_pn_data *gid_pn;
1607 struct zfcp_adapter *adapter = erp_action->adapter;
1608 -
1609 - gid_pn = mempool_alloc(adapter->pool.data_gid_pn, GFP_ATOMIC);
1610 - if (!gid_pn)
1611 - return -ENOMEM;
1612 -
1613 - memset(gid_pn, 0, sizeof(*gid_pn));
1614 + struct zfcp_fc_ns_handler_data compl_rec;
1615 + int ret;
1616
1617 /* setup parameters for send generic command */
1618 gid_pn->port = erp_action->port;
1619 - gid_pn->ct.port = adapter->nameserver_port;
1620 - gid_pn->ct.handler = zfcp_ns_gid_pn_handler;
1621 - gid_pn->ct.handler_data = (unsigned long) gid_pn;
1622 + gid_pn->ct.wka_port = &adapter->nsp;
1623 + gid_pn->ct.handler = zfcp_fc_ns_handler;
1624 + gid_pn->ct.handler_data = (unsigned long) &compl_rec;
1625 gid_pn->ct.timeout = ZFCP_NS_GID_PN_TIMEOUT;
1626 gid_pn->ct.req = &gid_pn->req;
1627 gid_pn->ct.resp = &gid_pn->resp;
1628 @@ -224,10 +299,42 @@ int zfcp_fc_ns_gid_pn_request(struct zfc
1629 gid_pn->ct_iu_req.header.max_res_size = ZFCP_CT_MAX_SIZE;
1630 gid_pn->ct_iu_req.wwpn = erp_action->port->wwpn;
1631
1632 + init_completion(&compl_rec.done);
1633 + compl_rec.handler = zfcp_fc_ns_gid_pn_eval;
1634 + compl_rec.handler_data = (unsigned long) gid_pn;
1635 ret = zfcp_fsf_send_ct(&gid_pn->ct, adapter->pool.fsf_req_erp,
1636 erp_action);
1637 + if (!ret)
1638 + wait_for_completion(&compl_rec.done);
1639 + return ret;
1640 +}
1641 +
1642 +/**
1643 + * zfcp_fc_ns_gid_pn_request - initiate GID_PN nameserver request
1644 + * @erp_action: pointer to zfcp_erp_action where GID_PN request is needed
1645 + * return: -ENOMEM on error, 0 otherwise
1646 + */
1647 +int zfcp_fc_ns_gid_pn(struct zfcp_erp_action *erp_action)
1648 +{
1649 + int ret;
1650 + struct zfcp_gid_pn_data *gid_pn;
1651 + struct zfcp_adapter *adapter = erp_action->adapter;
1652 +
1653 + gid_pn = mempool_alloc(adapter->pool.data_gid_pn, GFP_ATOMIC);
1654 + if (!gid_pn)
1655 + return -ENOMEM;
1656 +
1657 + memset(gid_pn, 0, sizeof(*gid_pn));
1658 +
1659 + ret = zfcp_wka_port_get(&adapter->nsp);
1660 if (ret)
1661 - mempool_free(gid_pn, adapter->pool.data_gid_pn);
1662 + goto out;
1663 +
1664 + ret = zfcp_fc_ns_gid_pn_request(erp_action, gid_pn);
1665 +
1666 + zfcp_wka_port_put(&adapter->nsp);
1667 +out:
1668 + mempool_free(gid_pn, adapter->pool.data_gid_pn);
1669 return ret;
1670 }
1671
1672 @@ -257,14 +364,14 @@ struct zfcp_els_adisc {
1673 struct scatterlist req;
1674 struct scatterlist resp;
1675 struct zfcp_ls_adisc ls_adisc;
1676 - struct zfcp_ls_adisc_acc ls_adisc_acc;
1677 + struct zfcp_ls_adisc ls_adisc_acc;
1678 };
1679
1680 static void zfcp_fc_adisc_handler(unsigned long data)
1681 {
1682 struct zfcp_els_adisc *adisc = (struct zfcp_els_adisc *) data;
1683 struct zfcp_port *port = adisc->els.port;
1684 - struct zfcp_ls_adisc_acc *ls_adisc = &adisc->ls_adisc_acc;
1685 + struct zfcp_ls_adisc *ls_adisc = &adisc->ls_adisc_acc;
1686
1687 if (adisc->els.status) {
1688 /* request rejected or timed out */
1689 @@ -297,7 +404,7 @@ static int zfcp_fc_adisc(struct zfcp_por
1690 sg_init_one(adisc->els.req, &adisc->ls_adisc,
1691 sizeof(struct zfcp_ls_adisc));
1692 sg_init_one(adisc->els.resp, &adisc->ls_adisc_acc,
1693 - sizeof(struct zfcp_ls_adisc_acc));
1694 + sizeof(struct zfcp_ls_adisc));
1695
1696 adisc->els.req_count = 1;
1697 adisc->els.resp_count = 1;
1698 @@ -340,30 +447,6 @@ void zfcp_test_link(struct zfcp_port *po
1699 zfcp_erp_port_forced_reopen(port, 0, 65, NULL);
1700 }
1701
1702 -static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter)
1703 -{
1704 - int ret;
1705 -
1706 - if (!adapter->nameserver_port)
1707 - return -EINTR;
1708 -
1709 - if (!atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
1710 - &adapter->nameserver_port->status)) {
1711 - ret = zfcp_erp_port_reopen(adapter->nameserver_port, 0, 148,
1712 - NULL);
1713 - if (ret)
1714 - return ret;
1715 - zfcp_erp_wait(adapter);
1716 - }
1717 - return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED,
1718 - &adapter->nameserver_port->status);
1719 -}
1720 -
1721 -static void zfcp_gpn_ft_handler(unsigned long _done)
1722 -{
1723 - complete((struct completion *)_done);
1724 -}
1725 -
1726 static void zfcp_free_sg_env(struct zfcp_gpn_ft *gpn_ft)
1727 {
1728 struct scatterlist *sg = &gpn_ft->sg_req;
1729 @@ -405,7 +488,7 @@ static int zfcp_scan_issue_gpn_ft(struct
1730 {
1731 struct zfcp_send_ct *ct = &gpn_ft->ct;
1732 struct ct_iu_gpn_ft_req *req = sg_virt(&gpn_ft->sg_req);
1733 - struct completion done;
1734 + struct zfcp_fc_ns_handler_data compl_rec;
1735 int ret;
1736
1737 /* prepare CT IU for GPN_FT */
1738 @@ -422,19 +505,20 @@ static int zfcp_scan_issue_gpn_ft(struct
1739 req->fc4_type = ZFCP_CT_SCSI_FCP;
1740
1741 /* prepare zfcp_send_ct */
1742 - ct->port = adapter->nameserver_port;
1743 - ct->handler = zfcp_gpn_ft_handler;
1744 - ct->handler_data = (unsigned long)&done;
1745 + ct->wka_port = &adapter->nsp;
1746 + ct->handler = zfcp_fc_ns_handler;
1747 + ct->handler_data = (unsigned long)&compl_rec;
1748 ct->timeout = 10;
1749 ct->req = &gpn_ft->sg_req;
1750 ct->resp = gpn_ft->sg_resp;
1751 ct->req_count = 1;
1752 ct->resp_count = ZFCP_GPN_FT_BUFFERS;
1753
1754 - init_completion(&done);
1755 + init_completion(&compl_rec.done);
1756 + compl_rec.handler = NULL;
1757 ret = zfcp_fsf_send_ct(ct, NULL, NULL);
1758 if (!ret)
1759 - wait_for_completion(&done);
1760 + wait_for_completion(&compl_rec.done);
1761 return ret;
1762 }
1763
1764 @@ -444,9 +528,8 @@ static void zfcp_validate_port(struct zf
1765
1766 atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);
1767
1768 - if (port == adapter->nameserver_port)
1769 - return;
1770 - if ((port->supported_classes != 0) || (port->units != 0)) {
1771 + if ((port->supported_classes != 0) ||
1772 + !list_empty(&port->unit_list_head)) {
1773 zfcp_port_put(port);
1774 return;
1775 }
1776 @@ -462,7 +545,7 @@ static int zfcp_scan_eval_gpn_ft(struct
1777 struct scatterlist *sg = gpn_ft->sg_resp;
1778 struct ct_hdr *hdr = sg_virt(sg);
1779 struct gpn_ft_resp_acc *acc = sg_virt(sg);
1780 - struct zfcp_adapter *adapter = ct->port->adapter;
1781 + struct zfcp_adapter *adapter = ct->wka_port->adapter;
1782 struct zfcp_port *port, *tmp;
1783 u32 d_id;
1784 int ret = 0, x, last = 0;
1785 @@ -492,6 +575,9 @@ static int zfcp_scan_eval_gpn_ft(struct
1786 d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 |
1787 acc->port_id[2];
1788
1789 + /* don't attach ports with a well known address */
1790 + if ((d_id & ZFCP_DID_WKA) == ZFCP_DID_WKA)
1791 + continue;
1792 /* skip the adapter's port and known remote ports */
1793 if (acc->wwpn == fc_host_port_name(adapter->scsi_host))
1794 continue;
1795 @@ -530,13 +616,15 @@ int zfcp_scan_ports(struct zfcp_adapter
1796 if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
1797 return 0;
1798
1799 - ret = zfcp_scan_get_nameserver(adapter);
1800 + ret = zfcp_wka_port_get(&adapter->nsp);
1801 if (ret)
1802 return ret;
1803
1804 gpn_ft = zfcp_alloc_sg_env();
1805 - if (!gpn_ft)
1806 - return -ENOMEM;
1807 + if (!gpn_ft) {
1808 + ret = -ENOMEM;
1809 + goto out;
1810 + }
1811
1812 for (i = 0; i < 3; i++) {
1813 ret = zfcp_scan_issue_gpn_ft(gpn_ft, adapter);
1814 @@ -549,7 +637,8 @@ int zfcp_scan_ports(struct zfcp_adapter
1815 }
1816 }
1817 zfcp_free_sg_env(gpn_ft);
1818 -
1819 +out:
1820 + zfcp_wka_port_put(&adapter->nsp);
1821 return ret;
1822 }
1823
1824 --- a/drivers/s390/scsi/zfcp_fsf.c
1825 +++ b/drivers/s390/scsi/zfcp_fsf.c
1826 @@ -71,7 +71,7 @@ static void zfcp_fsf_access_denied_port(
1827 struct fsf_qtcb_header *header = &req->qtcb->header;
1828 dev_warn(&req->adapter->ccw_device->dev,
1829 "Access denied to port 0x%016Lx\n",
1830 - port->wwpn);
1831 + (unsigned long long)port->wwpn);
1832 zfcp_act_eval_err(req->adapter, header->fsf_status_qual.halfword[0]);
1833 zfcp_act_eval_err(req->adapter, header->fsf_status_qual.halfword[1]);
1834 zfcp_erp_port_access_denied(port, 55, req);
1835 @@ -84,7 +84,8 @@ static void zfcp_fsf_access_denied_unit(
1836 struct fsf_qtcb_header *header = &req->qtcb->header;
1837 dev_warn(&req->adapter->ccw_device->dev,
1838 "Access denied to unit 0x%016Lx on port 0x%016Lx\n",
1839 - unit->fcp_lun, unit->port->wwpn);
1840 + (unsigned long long)unit->fcp_lun,
1841 + (unsigned long long)unit->port->wwpn);
1842 zfcp_act_eval_err(req->adapter, header->fsf_status_qual.halfword[0]);
1843 zfcp_act_eval_err(req->adapter, header->fsf_status_qual.halfword[1]);
1844 zfcp_erp_unit_access_denied(unit, 59, req);
1845 @@ -296,6 +297,7 @@ static void zfcp_fsf_status_read_handler
1846 dev_warn(&adapter->ccw_device->dev,
1847 "The error threshold for checksum statistics "
1848 "has been exceeded\n");
1849 + zfcp_hba_dbf_event_berr(adapter, req);
1850 break;
1851 case FSF_STATUS_READ_LINK_DOWN:
1852 zfcp_fsf_status_read_link_down(req);
1853 @@ -330,7 +332,7 @@ static void zfcp_fsf_status_read_handler
1854 zfcp_fsf_req_free(req);
1855
1856 atomic_inc(&adapter->stat_miss);
1857 - schedule_work(&adapter->stat_work);
1858 + queue_work(zfcp_data.work_queue, &adapter->stat_work);
1859 }
1860
1861 static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req)
1862 @@ -624,7 +626,6 @@ static void zfcp_fsf_exchange_port_evalu
1863
1864 static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
1865 {
1866 - struct zfcp_adapter *adapter = req->adapter;
1867 struct fsf_qtcb *qtcb = req->qtcb;
1868
1869 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
1870 @@ -633,23 +634,23 @@ static void zfcp_fsf_exchange_port_data_
1871 switch (qtcb->header.fsf_status) {
1872 case FSF_GOOD:
1873 zfcp_fsf_exchange_port_evaluate(req);
1874 - atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status);
1875 break;
1876 case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE:
1877 zfcp_fsf_exchange_port_evaluate(req);
1878 - atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status);
1879 zfcp_fsf_link_down_info_eval(req, 43,
1880 &qtcb->header.fsf_status_qual.link_down_info);
1881 break;
1882 }
1883 }
1884
1885 -static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
1886 +static int zfcp_fsf_sbal_check(struct zfcp_adapter *adapter)
1887 {
1888 - spin_lock_bh(&queue->lock);
1889 - if (atomic_read(&queue->count))
1890 + struct zfcp_qdio_queue *req_q = &adapter->req_q;
1891 +
1892 + spin_lock_bh(&adapter->req_q_lock);
1893 + if (atomic_read(&req_q->count))
1894 return 1;
1895 - spin_unlock_bh(&queue->lock);
1896 + spin_unlock_bh(&adapter->req_q_lock);
1897 return 0;
1898 }
1899
1900 @@ -664,17 +665,16 @@ static int zfcp_fsf_sbal_available(struc
1901 static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
1902 {
1903 long ret;
1904 - struct zfcp_qdio_queue *req_q = &adapter->req_q;
1905
1906 - spin_unlock_bh(&req_q->lock);
1907 + spin_unlock_bh(&adapter->req_q_lock);
1908 ret = wait_event_interruptible_timeout(adapter->request_wq,
1909 - zfcp_fsf_sbal_check(req_q), 5 * HZ);
1910 + zfcp_fsf_sbal_check(adapter), 5 * HZ);
1911 if (ret > 0)
1912 return 0;
1913 if (!ret)
1914 atomic_inc(&adapter->qdio_outb_full);
1915
1916 - spin_lock_bh(&req_q->lock);
1917 + spin_lock_bh(&adapter->req_q_lock);
1918 return -EIO;
1919 }
1920
1921 @@ -711,7 +711,7 @@ static struct zfcp_fsf_req *zfcp_fsf_req
1922 u32 fsf_cmd, int req_flags,
1923 mempool_t *pool)
1924 {
1925 - volatile struct qdio_buffer_element *sbale;
1926 + struct qdio_buffer_element *sbale;
1927
1928 struct zfcp_fsf_req *req;
1929 struct zfcp_qdio_queue *req_q = &adapter->req_q;
1930 @@ -814,10 +814,10 @@ int zfcp_fsf_status_read(struct zfcp_ada
1931 {
1932 struct zfcp_fsf_req *req;
1933 struct fsf_status_read_buffer *sr_buf;
1934 - volatile struct qdio_buffer_element *sbale;
1935 + struct qdio_buffer_element *sbale;
1936 int retval = -EIO;
1937
1938 - spin_lock_bh(&adapter->req_q.lock);
1939 + spin_lock_bh(&adapter->req_q_lock);
1940 if (zfcp_fsf_req_sbal_get(adapter))
1941 goto out;
1942
1943 @@ -857,7 +857,7 @@ failed_buf:
1944 zfcp_fsf_req_free(req);
1945 zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL);
1946 out:
1947 - spin_unlock_bh(&adapter->req_q.lock);
1948 + spin_unlock_bh(&adapter->req_q_lock);
1949 return retval;
1950 }
1951
1952 @@ -927,10 +927,10 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_
1953 struct zfcp_unit *unit,
1954 int req_flags)
1955 {
1956 - volatile struct qdio_buffer_element *sbale;
1957 + struct qdio_buffer_element *sbale;
1958 struct zfcp_fsf_req *req = NULL;
1959
1960 - spin_lock(&adapter->req_q.lock);
1961 + spin_lock(&adapter->req_q_lock);
1962 if (!zfcp_fsf_sbal_available(adapter))
1963 goto out;
1964 req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
1965 @@ -960,7 +960,7 @@ out_error_free:
1966 zfcp_fsf_req_free(req);
1967 req = NULL;
1968 out:
1969 - spin_unlock(&adapter->req_q.lock);
1970 + spin_unlock(&adapter->req_q_lock);
1971 return req;
1972 }
1973
1974 @@ -968,7 +968,6 @@ static void zfcp_fsf_send_ct_handler(str
1975 {
1976 struct zfcp_adapter *adapter = req->adapter;
1977 struct zfcp_send_ct *send_ct = req->data;
1978 - struct zfcp_port *port = send_ct->port;
1979 struct fsf_qtcb_header *header = &req->qtcb->header;
1980
1981 send_ct->status = -EINVAL;
1982 @@ -987,17 +986,14 @@ static void zfcp_fsf_send_ct_handler(str
1983 case FSF_ADAPTER_STATUS_AVAILABLE:
1984 switch (header->fsf_status_qual.word[0]){
1985 case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
1986 - zfcp_test_link(port);
1987 case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
1988 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
1989 break;
1990 }
1991 break;
1992 case FSF_ACCESS_DENIED:
1993 - zfcp_fsf_access_denied_port(req, port);
1994 break;
1995 case FSF_PORT_BOXED:
1996 - zfcp_erp_port_boxed(port, 49, req);
1997 req->status |= ZFCP_STATUS_FSFREQ_ERROR |
1998 ZFCP_STATUS_FSFREQ_RETRY;
1999 break;
2000 @@ -1048,12 +1044,12 @@ static int zfcp_fsf_setup_sbals(struct z
2001 int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool,
2002 struct zfcp_erp_action *erp_action)
2003 {
2004 - struct zfcp_port *port = ct->port;
2005 - struct zfcp_adapter *adapter = port->adapter;
2006 + struct zfcp_wka_port *wka_port = ct->wka_port;
2007 + struct zfcp_adapter *adapter = wka_port->adapter;
2008 struct zfcp_fsf_req *req;
2009 int ret = -EIO;
2010
2011 - spin_lock_bh(&adapter->req_q.lock);
2012 + spin_lock_bh(&adapter->req_q_lock);
2013 if (zfcp_fsf_req_sbal_get(adapter))
2014 goto out;
2015
2016 @@ -1070,7 +1066,7 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct
2017 goto failed_send;
2018
2019 req->handler = zfcp_fsf_send_ct_handler;
2020 - req->qtcb->header.port_handle = port->handle;
2021 + req->qtcb->header.port_handle = wka_port->handle;
2022 req->qtcb->bottom.support.service_class = FSF_CLASS_3;
2023 req->qtcb->bottom.support.timeout = ct->timeout;
2024 req->data = ct;
2025 @@ -1095,7 +1091,7 @@ failed_send:
2026 if (erp_action)
2027 erp_action->fsf_req = NULL;
2028 out:
2029 - spin_unlock_bh(&adapter->req_q.lock);
2030 + spin_unlock_bh(&adapter->req_q_lock);
2031 return ret;
2032 }
2033
2034 @@ -1165,7 +1161,7 @@ int zfcp_fsf_send_els(struct zfcp_send_e
2035 ZFCP_STATUS_COMMON_UNBLOCKED)))
2036 return -EBUSY;
2037
2038 - spin_lock(&adapter->req_q.lock);
2039 + spin_lock(&adapter->req_q_lock);
2040 if (!zfcp_fsf_sbal_available(adapter))
2041 goto out;
2042 req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
2043 @@ -1175,8 +1171,8 @@ int zfcp_fsf_send_els(struct zfcp_send_e
2044 goto out;
2045 }
2046
2047 - ret = zfcp_fsf_setup_sbals(req, els->req, els->resp,
2048 - FSF_MAX_SBALS_PER_ELS_REQ);
2049 + ret = zfcp_fsf_setup_sbals(req, els->req, els->resp, 2);
2050 +
2051 if (ret)
2052 goto failed_send;
2053
2054 @@ -1199,18 +1195,18 @@ int zfcp_fsf_send_els(struct zfcp_send_e
2055 failed_send:
2056 zfcp_fsf_req_free(req);
2057 out:
2058 - spin_unlock(&adapter->req_q.lock);
2059 + spin_unlock(&adapter->req_q_lock);
2060 return ret;
2061 }
2062
2063 int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
2064 {
2065 - volatile struct qdio_buffer_element *sbale;
2066 + struct qdio_buffer_element *sbale;
2067 struct zfcp_fsf_req *req;
2068 struct zfcp_adapter *adapter = erp_action->adapter;
2069 int retval = -EIO;
2070
2071 - spin_lock_bh(&adapter->req_q.lock);
2072 + spin_lock_bh(&adapter->req_q_lock);
2073 if (!zfcp_fsf_sbal_available(adapter))
2074 goto out;
2075 req = zfcp_fsf_req_create(adapter,
2076 @@ -1242,18 +1238,18 @@ int zfcp_fsf_exchange_config_data(struct
2077 erp_action->fsf_req = NULL;
2078 }
2079 out:
2080 - spin_unlock_bh(&adapter->req_q.lock);
2081 + spin_unlock_bh(&adapter->req_q_lock);
2082 return retval;
2083 }
2084
2085 int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
2086 struct fsf_qtcb_bottom_config *data)
2087 {
2088 - volatile struct qdio_buffer_element *sbale;
2089 + struct qdio_buffer_element *sbale;
2090 struct zfcp_fsf_req *req = NULL;
2091 int retval = -EIO;
2092
2093 - spin_lock_bh(&adapter->req_q.lock);
2094 + spin_lock_bh(&adapter->req_q_lock);
2095 if (zfcp_fsf_req_sbal_get(adapter))
2096 goto out;
2097
2098 @@ -1281,7 +1277,7 @@ int zfcp_fsf_exchange_config_data_sync(s
2099 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2100 retval = zfcp_fsf_req_send(req);
2101 out:
2102 - spin_unlock_bh(&adapter->req_q.lock);
2103 + spin_unlock_bh(&adapter->req_q_lock);
2104 if (!retval)
2105 wait_event(req->completion_wq,
2106 req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
2107 @@ -1298,7 +1294,7 @@ out:
2108 */
2109 int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
2110 {
2111 - volatile struct qdio_buffer_element *sbale;
2112 + struct qdio_buffer_element *sbale;
2113 struct zfcp_fsf_req *req;
2114 struct zfcp_adapter *adapter = erp_action->adapter;
2115 int retval = -EIO;
2116 @@ -1306,7 +1302,7 @@ int zfcp_fsf_exchange_port_data(struct z
2117 if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
2118 return -EOPNOTSUPP;
2119
2120 - spin_lock_bh(&adapter->req_q.lock);
2121 + spin_lock_bh(&adapter->req_q_lock);
2122 if (!zfcp_fsf_sbal_available(adapter))
2123 goto out;
2124 req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
2125 @@ -1332,7 +1328,7 @@ int zfcp_fsf_exchange_port_data(struct z
2126 erp_action->fsf_req = NULL;
2127 }
2128 out:
2129 - spin_unlock_bh(&adapter->req_q.lock);
2130 + spin_unlock_bh(&adapter->req_q_lock);
2131 return retval;
2132 }
2133
2134 @@ -1345,14 +1341,14 @@ out:
2135 int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
2136 struct fsf_qtcb_bottom_port *data)
2137 {
2138 - volatile struct qdio_buffer_element *sbale;
2139 + struct qdio_buffer_element *sbale;
2140 struct zfcp_fsf_req *req = NULL;
2141 int retval = -EIO;
2142
2143 if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
2144 return -EOPNOTSUPP;
2145
2146 - spin_lock_bh(&adapter->req_q.lock);
2147 + spin_lock_bh(&adapter->req_q_lock);
2148 if (!zfcp_fsf_sbal_available(adapter))
2149 goto out;
2150
2151 @@ -1374,7 +1370,7 @@ int zfcp_fsf_exchange_port_data_sync(str
2152 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2153 retval = zfcp_fsf_req_send(req);
2154 out:
2155 - spin_unlock_bh(&adapter->req_q.lock);
2156 + spin_unlock_bh(&adapter->req_q_lock);
2157 if (!retval)
2158 wait_event(req->completion_wq,
2159 req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
2160 @@ -1390,7 +1386,7 @@ static void zfcp_fsf_open_port_handler(s
2161 struct fsf_plogi *plogi;
2162
2163 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2164 - goto skip_fsfstatus;
2165 + return;
2166
2167 switch (header->fsf_status) {
2168 case FSF_PORT_ALREADY_OPEN:
2169 @@ -1402,7 +1398,7 @@ static void zfcp_fsf_open_port_handler(s
2170 dev_warn(&req->adapter->ccw_device->dev,
2171 "Not enough FCP adapter resources to open "
2172 "remote port 0x%016Lx\n",
2173 - port->wwpn);
2174 + (unsigned long long)port->wwpn);
2175 zfcp_erp_port_failed(port, 31, req);
2176 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2177 break;
2178 @@ -1415,7 +1411,7 @@ static void zfcp_fsf_open_port_handler(s
2179 case FSF_SQ_NO_RETRY_POSSIBLE:
2180 dev_warn(&req->adapter->ccw_device->dev,
2181 "Remote port 0x%016Lx could not be opened\n",
2182 - port->wwpn);
2183 + (unsigned long long)port->wwpn);
2184 zfcp_erp_port_failed(port, 32, req);
2185 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2186 break;
2187 @@ -1443,9 +1439,6 @@ static void zfcp_fsf_open_port_handler(s
2188 * another GID_PN straight after a port has been opened.
2189 * Alternately, an ADISC/PDISC ELS should suffice, as well.
2190 */
2191 - if (atomic_read(&port->status) & ZFCP_STATUS_PORT_NO_WWPN)
2192 - break;
2193 -
2194 plogi = (struct fsf_plogi *) req->qtcb->bottom.support.els;
2195 if (req->qtcb->bottom.support.els1_length >= sizeof(*plogi)) {
2196 if (plogi->serv_param.wwpn != port->wwpn)
2197 @@ -1461,9 +1454,6 @@ static void zfcp_fsf_open_port_handler(s
2198 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2199 break;
2200 }
2201 -
2202 -skip_fsfstatus:
2203 - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, &port->status);
2204 }
2205
2206 /**
2207 @@ -1473,12 +1463,12 @@ skip_fsfstatus:
2208 */
2209 int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
2210 {
2211 - volatile struct qdio_buffer_element *sbale;
2212 + struct qdio_buffer_element *sbale;
2213 struct zfcp_adapter *adapter = erp_action->adapter;
2214 struct zfcp_fsf_req *req;
2215 int retval = -EIO;
2216
2217 - spin_lock_bh(&adapter->req_q.lock);
2218 + spin_lock_bh(&adapter->req_q_lock);
2219 if (zfcp_fsf_req_sbal_get(adapter))
2220 goto out;
2221
2222 @@ -1500,7 +1490,6 @@ int zfcp_fsf_open_port(struct zfcp_erp_a
2223 req->data = erp_action->port;
2224 req->erp_action = erp_action;
2225 erp_action->fsf_req = req;
2226 - atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->port->status);
2227
2228 zfcp_fsf_start_erp_timer(req);
2229 retval = zfcp_fsf_req_send(req);
2230 @@ -1509,7 +1498,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_a
2231 erp_action->fsf_req = NULL;
2232 }
2233 out:
2234 - spin_unlock_bh(&adapter->req_q.lock);
2235 + spin_unlock_bh(&adapter->req_q_lock);
2236 return retval;
2237 }
2238
2239 @@ -1518,7 +1507,7 @@ static void zfcp_fsf_close_port_handler(
2240 struct zfcp_port *port = req->data;
2241
2242 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2243 - goto skip_fsfstatus;
2244 + return;
2245
2246 switch (req->qtcb->header.fsf_status) {
2247 case FSF_PORT_HANDLE_NOT_VALID:
2248 @@ -1533,9 +1522,6 @@ static void zfcp_fsf_close_port_handler(
2249 ZFCP_CLEAR);
2250 break;
2251 }
2252 -
2253 -skip_fsfstatus:
2254 - atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, &port->status);
2255 }
2256
2257 /**
2258 @@ -1545,12 +1531,12 @@ skip_fsfstatus:
2259 */
2260 int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
2261 {
2262 - volatile struct qdio_buffer_element *sbale;
2263 + struct qdio_buffer_element *sbale;
2264 struct zfcp_adapter *adapter = erp_action->adapter;
2265 struct zfcp_fsf_req *req;
2266 int retval = -EIO;
2267
2268 - spin_lock_bh(&adapter->req_q.lock);
2269 + spin_lock_bh(&adapter->req_q_lock);
2270 if (zfcp_fsf_req_sbal_get(adapter))
2271 goto out;
2272
2273 @@ -1571,7 +1557,6 @@ int zfcp_fsf_close_port(struct zfcp_erp_
2274 req->erp_action = erp_action;
2275 req->qtcb->header.port_handle = erp_action->port->handle;
2276 erp_action->fsf_req = req;
2277 - atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, &erp_action->port->status);
2278
2279 zfcp_fsf_start_erp_timer(req);
2280 retval = zfcp_fsf_req_send(req);
2281 @@ -1580,7 +1565,131 @@ int zfcp_fsf_close_port(struct zfcp_erp_
2282 erp_action->fsf_req = NULL;
2283 }
2284 out:
2285 - spin_unlock_bh(&adapter->req_q.lock);
2286 + spin_unlock_bh(&adapter->req_q_lock);
2287 + return retval;
2288 +}
2289 +
2290 +static void zfcp_fsf_open_wka_port_handler(struct zfcp_fsf_req *req)
2291 +{
2292 + struct zfcp_wka_port *wka_port = req->data;
2293 + struct fsf_qtcb_header *header = &req->qtcb->header;
2294 +
2295 + if (req->status & ZFCP_STATUS_FSFREQ_ERROR) {
2296 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
2297 + goto out;
2298 + }
2299 +
2300 + switch (header->fsf_status) {
2301 + case FSF_MAXIMUM_NUMBER_OF_PORTS_EXCEEDED:
2302 + dev_warn(&req->adapter->ccw_device->dev,
2303 + "Opening WKA port 0x%x failed\n", wka_port->d_id);
2304 + case FSF_ADAPTER_STATUS_AVAILABLE:
2305 + req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2306 + case FSF_ACCESS_DENIED:
2307 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
2308 + break;
2309 + case FSF_PORT_ALREADY_OPEN:
2310 + case FSF_GOOD:
2311 + wka_port->handle = header->port_handle;
2312 + wka_port->status = ZFCP_WKA_PORT_ONLINE;
2313 + }
2314 +out:
2315 + wake_up(&wka_port->completion_wq);
2316 +}
2317 +
2318 +/**
2319 + * zfcp_fsf_open_wka_port - create and send open wka-port request
2320 + * @wka_port: pointer to struct zfcp_wka_port
2321 + * Returns: 0 on success, error otherwise
2322 + */
2323 +int zfcp_fsf_open_wka_port(struct zfcp_wka_port *wka_port)
2324 +{
2325 + struct qdio_buffer_element *sbale;
2326 + struct zfcp_adapter *adapter = wka_port->adapter;
2327 + struct zfcp_fsf_req *req;
2328 + int retval = -EIO;
2329 +
2330 + spin_lock_bh(&adapter->req_q_lock);
2331 + if (zfcp_fsf_req_sbal_get(adapter))
2332 + goto out;
2333 +
2334 + req = zfcp_fsf_req_create(adapter,
2335 + FSF_QTCB_OPEN_PORT_WITH_DID,
2336 + ZFCP_REQ_AUTO_CLEANUP,
2337 + adapter->pool.fsf_req_erp);
2338 + if (unlikely(IS_ERR(req))) {
2339 + retval = PTR_ERR(req);
2340 + goto out;
2341 + }
2342 +
2343 + sbale = zfcp_qdio_sbale_req(req);
2344 + sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
2345 + sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
2346 +
2347 + req->handler = zfcp_fsf_open_wka_port_handler;
2348 + req->qtcb->bottom.support.d_id = wka_port->d_id;
2349 + req->data = wka_port;
2350 +
2351 + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2352 + retval = zfcp_fsf_req_send(req);
2353 + if (retval)
2354 + zfcp_fsf_req_free(req);
2355 +out:
2356 + spin_unlock_bh(&adapter->req_q_lock);
2357 + return retval;
2358 +}
2359 +
2360 +static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req)
2361 +{
2362 + struct zfcp_wka_port *wka_port = req->data;
2363 +
2364 + if (req->qtcb->header.fsf_status == FSF_PORT_HANDLE_NOT_VALID) {
2365 + req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2366 + zfcp_erp_adapter_reopen(wka_port->adapter, 0, 84, req);
2367 + }
2368 +
2369 + wka_port->status = ZFCP_WKA_PORT_OFFLINE;
2370 + wake_up(&wka_port->completion_wq);
2371 +}
2372 +
2373 +/**
2374 + * zfcp_fsf_close_wka_port - create and send close wka port request
2375 + * @erp_action: pointer to struct zfcp_erp_action
2376 + * Returns: 0 on success, error otherwise
2377 + */
2378 +int zfcp_fsf_close_wka_port(struct zfcp_wka_port *wka_port)
2379 +{
2380 + struct qdio_buffer_element *sbale;
2381 + struct zfcp_adapter *adapter = wka_port->adapter;
2382 + struct zfcp_fsf_req *req;
2383 + int retval = -EIO;
2384 +
2385 + spin_lock_bh(&adapter->req_q_lock);
2386 + if (zfcp_fsf_req_sbal_get(adapter))
2387 + goto out;
2388 +
2389 + req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PORT,
2390 + ZFCP_REQ_AUTO_CLEANUP,
2391 + adapter->pool.fsf_req_erp);
2392 + if (unlikely(IS_ERR(req))) {
2393 + retval = PTR_ERR(req);
2394 + goto out;
2395 + }
2396 +
2397 + sbale = zfcp_qdio_sbale_req(req);
2398 + sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
2399 + sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
2400 +
2401 + req->handler = zfcp_fsf_close_wka_port_handler;
2402 + req->data = wka_port;
2403 + req->qtcb->header.port_handle = wka_port->handle;
2404 +
2405 + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2406 + retval = zfcp_fsf_req_send(req);
2407 + if (retval)
2408 + zfcp_fsf_req_free(req);
2409 +out:
2410 + spin_unlock_bh(&adapter->req_q_lock);
2411 return retval;
2412 }
2413
2414 @@ -1642,12 +1751,12 @@ skip_fsfstatus:
2415 */
2416 int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
2417 {
2418 - volatile struct qdio_buffer_element *sbale;
2419 + struct qdio_buffer_element *sbale;
2420 struct zfcp_adapter *adapter = erp_action->adapter;
2421 struct zfcp_fsf_req *req;
2422 int retval = -EIO;
2423
2424 - spin_lock_bh(&adapter->req_q.lock);
2425 + spin_lock_bh(&adapter->req_q_lock);
2426 if (zfcp_fsf_req_sbal_get(adapter))
2427 goto out;
2428
2429 @@ -1678,7 +1787,7 @@ int zfcp_fsf_close_physical_port(struct
2430 erp_action->fsf_req = NULL;
2431 }
2432 out:
2433 - spin_unlock_bh(&adapter->req_q.lock);
2434 + spin_unlock_bh(&adapter->req_q_lock);
2435 return retval;
2436 }
2437
2438 @@ -1693,7 +1802,7 @@ static void zfcp_fsf_open_unit_handler(s
2439 int exclusive, readwrite;
2440
2441 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2442 - goto skip_fsfstatus;
2443 + return;
2444
2445 atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED |
2446 ZFCP_STATUS_COMMON_ACCESS_BOXED |
2447 @@ -1723,8 +1832,8 @@ static void zfcp_fsf_open_unit_handler(s
2448 dev_warn(&adapter->ccw_device->dev,
2449 "LUN 0x%Lx on port 0x%Lx is already in "
2450 "use by CSS%d, MIF Image ID %x\n",
2451 - unit->fcp_lun,
2452 - unit->port->wwpn,
2453 + (unsigned long long)unit->fcp_lun,
2454 + (unsigned long long)unit->port->wwpn,
2455 queue_designator->cssid,
2456 queue_designator->hla);
2457 else
2458 @@ -1739,7 +1848,8 @@ static void zfcp_fsf_open_unit_handler(s
2459 dev_warn(&adapter->ccw_device->dev,
2460 "No handle is available for LUN "
2461 "0x%016Lx on port 0x%016Lx\n",
2462 - unit->fcp_lun, unit->port->wwpn);
2463 + (unsigned long long)unit->fcp_lun,
2464 + (unsigned long long)unit->port->wwpn);
2465 zfcp_erp_unit_failed(unit, 34, req);
2466 /* fall through */
2467 case FSF_INVALID_COMMAND_OPTION:
2468 @@ -1778,7 +1888,8 @@ static void zfcp_fsf_open_unit_handler(s
2469 dev_info(&adapter->ccw_device->dev,
2470 "SCSI device at LUN 0x%016Lx on port "
2471 "0x%016Lx opened read-only\n",
2472 - unit->fcp_lun, unit->port->wwpn);
2473 + (unsigned long long)unit->fcp_lun,
2474 + (unsigned long long)unit->port->wwpn);
2475 }
2476
2477 if (exclusive && !readwrite) {
2478 @@ -1786,7 +1897,8 @@ static void zfcp_fsf_open_unit_handler(s
2479 "Exclusive read-only access not "
2480 "supported (unit 0x%016Lx, "
2481 "port 0x%016Lx)\n",
2482 - unit->fcp_lun, unit->port->wwpn);
2483 + (unsigned long long)unit->fcp_lun,
2484 + (unsigned long long)unit->port->wwpn);
2485 zfcp_erp_unit_failed(unit, 35, req);
2486 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2487 zfcp_erp_unit_shutdown(unit, 0, 80, req);
2488 @@ -1795,7 +1907,8 @@ static void zfcp_fsf_open_unit_handler(s
2489 "Shared read-write access not "
2490 "supported (unit 0x%016Lx, port "
2491 "0x%016Lx\n)",
2492 - unit->fcp_lun, unit->port->wwpn);
2493 + (unsigned long long)unit->fcp_lun,
2494 + (unsigned long long)unit->port->wwpn);
2495 zfcp_erp_unit_failed(unit, 36, req);
2496 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2497 zfcp_erp_unit_shutdown(unit, 0, 81, req);
2498 @@ -1803,9 +1916,6 @@ static void zfcp_fsf_open_unit_handler(s
2499 }
2500 break;
2501 }
2502 -
2503 -skip_fsfstatus:
2504 - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING, &unit->status);
2505 }
2506
2507 /**
2508 @@ -1815,12 +1925,12 @@ skip_fsfstatus:
2509 */
2510 int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
2511 {
2512 - volatile struct qdio_buffer_element *sbale;
2513 + struct qdio_buffer_element *sbale;
2514 struct zfcp_adapter *adapter = erp_action->adapter;
2515 struct zfcp_fsf_req *req;
2516 int retval = -EIO;
2517
2518 - spin_lock_bh(&adapter->req_q.lock);
2519 + spin_lock_bh(&adapter->req_q_lock);
2520 if (zfcp_fsf_req_sbal_get(adapter))
2521 goto out;
2522
2523 @@ -1846,8 +1956,6 @@ int zfcp_fsf_open_unit(struct zfcp_erp_a
2524 if (!(adapter->connection_features & FSF_FEATURE_NPIV_MODE))
2525 req->qtcb->bottom.support.option = FSF_OPEN_LUN_SUPPRESS_BOXING;
2526
2527 - atomic_set_mask(ZFCP_STATUS_COMMON_OPENING, &erp_action->unit->status);
2528 -
2529 zfcp_fsf_start_erp_timer(req);
2530 retval = zfcp_fsf_req_send(req);
2531 if (retval) {
2532 @@ -1855,7 +1963,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_a
2533 erp_action->fsf_req = NULL;
2534 }
2535 out:
2536 - spin_unlock_bh(&adapter->req_q.lock);
2537 + spin_unlock_bh(&adapter->req_q_lock);
2538 return retval;
2539 }
2540
2541 @@ -1864,7 +1972,7 @@ static void zfcp_fsf_close_unit_handler(
2542 struct zfcp_unit *unit = req->data;
2543
2544 if (req->status & ZFCP_STATUS_FSFREQ_ERROR)
2545 - goto skip_fsfstatus;
2546 + return;
2547
2548 switch (req->qtcb->header.fsf_status) {
2549 case FSF_PORT_HANDLE_NOT_VALID:
2550 @@ -1894,8 +2002,6 @@ static void zfcp_fsf_close_unit_handler(
2551 atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN, &unit->status);
2552 break;
2553 }
2554 -skip_fsfstatus:
2555 - atomic_clear_mask(ZFCP_STATUS_COMMON_CLOSING, &unit->status);
2556 }
2557
2558 /**
2559 @@ -1905,12 +2011,12 @@ skip_fsfstatus:
2560 */
2561 int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
2562 {
2563 - volatile struct qdio_buffer_element *sbale;
2564 + struct qdio_buffer_element *sbale;
2565 struct zfcp_adapter *adapter = erp_action->adapter;
2566 struct zfcp_fsf_req *req;
2567 int retval = -EIO;
2568
2569 - spin_lock_bh(&adapter->req_q.lock);
2570 + spin_lock_bh(&adapter->req_q_lock);
2571 if (zfcp_fsf_req_sbal_get(adapter))
2572 goto out;
2573 req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN,
2574 @@ -1931,7 +2037,6 @@ int zfcp_fsf_close_unit(struct zfcp_erp_
2575 req->data = erp_action->unit;
2576 req->erp_action = erp_action;
2577 erp_action->fsf_req = req;
2578 - atomic_set_mask(ZFCP_STATUS_COMMON_CLOSING, &erp_action->unit->status);
2579
2580 zfcp_fsf_start_erp_timer(req);
2581 retval = zfcp_fsf_req_send(req);
2582 @@ -1940,7 +2045,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_
2583 erp_action->fsf_req = NULL;
2584 }
2585 out:
2586 - spin_unlock_bh(&adapter->req_q.lock);
2587 + spin_unlock_bh(&adapter->req_q_lock);
2588 return retval;
2589 }
2590
2591 @@ -2136,7 +2241,8 @@ static void zfcp_fsf_send_fcp_command_ha
2592 "Incorrect direction %d, unit 0x%016Lx on port "
2593 "0x%016Lx closed\n",
2594 req->qtcb->bottom.io.data_direction,
2595 - unit->fcp_lun, unit->port->wwpn);
2596 + (unsigned long long)unit->fcp_lun,
2597 + (unsigned long long)unit->port->wwpn);
2598 zfcp_erp_adapter_shutdown(unit->port->adapter, 0, 133, req);
2599 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2600 break;
2601 @@ -2145,7 +2251,8 @@ static void zfcp_fsf_send_fcp_command_ha
2602 "Incorrect CDB length %d, unit 0x%016Lx on "
2603 "port 0x%016Lx closed\n",
2604 req->qtcb->bottom.io.fcp_cmnd_length,
2605 - unit->fcp_lun, unit->port->wwpn);
2606 + (unsigned long long)unit->fcp_lun,
2607 + (unsigned long long)unit->port->wwpn);
2608 zfcp_erp_adapter_shutdown(unit->port->adapter, 0, 134, req);
2609 req->status |= ZFCP_STATUS_FSFREQ_ERROR;
2610 break;
2611 @@ -2176,6 +2283,20 @@ skip_fsfstatus:
2612 }
2613 }
2614
2615 +static void zfcp_set_fcp_dl(struct fcp_cmnd_iu *fcp_cmd, u32 fcp_dl)
2616 +{
2617 + u32 *fcp_dl_ptr;
2618 +
2619 + /*
2620 + * fcp_dl_addr = start address of fcp_cmnd structure +
2621 + * size of fixed part + size of dynamically sized add_dcp_cdb field
2622 + * SEE FCP-2 documentation
2623 + */
2624 + fcp_dl_ptr = (u32 *) ((unsigned char *) &fcp_cmd[1] +
2625 + (fcp_cmd->add_fcp_cdb_length << 2));
2626 + *fcp_dl_ptr = fcp_dl;
2627 +}
2628 +
2629 /**
2630 * zfcp_fsf_send_fcp_command_task - initiate an FCP command (for a SCSI command)
2631 * @adapter: adapter where scsi command is issued
2632 @@ -2198,7 +2319,7 @@ int zfcp_fsf_send_fcp_command_task(struc
2633 ZFCP_STATUS_COMMON_UNBLOCKED)))
2634 return -EBUSY;
2635
2636 - spin_lock(&adapter->req_q.lock);
2637 + spin_lock(&adapter->req_q_lock);
2638 if (!zfcp_fsf_sbal_available(adapter))
2639 goto out;
2640 req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
2641 @@ -2261,7 +2382,7 @@ int zfcp_fsf_send_fcp_command_task(struc
2642 memcpy(fcp_cmnd_iu->fcp_cdb, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
2643
2644 req->qtcb->bottom.io.fcp_cmnd_length = sizeof(struct fcp_cmnd_iu) +
2645 - fcp_cmnd_iu->add_fcp_cdb_length + sizeof(fcp_dl_t);
2646 + fcp_cmnd_iu->add_fcp_cdb_length + sizeof(u32);
2647
2648 real_bytes = zfcp_qdio_sbals_from_sg(req, sbtype,
2649 scsi_sglist(scsi_cmnd),
2650 @@ -2273,7 +2394,8 @@ int zfcp_fsf_send_fcp_command_task(struc
2651 dev_err(&adapter->ccw_device->dev,
2652 "Oversize data package, unit 0x%016Lx "
2653 "on port 0x%016Lx closed\n",
2654 - unit->fcp_lun, unit->port->wwpn);
2655 + (unsigned long long)unit->fcp_lun,
2656 + (unsigned long long)unit->port->wwpn);
2657 zfcp_erp_unit_shutdown(unit, 0, 131, req);
2658 retval = -EINVAL;
2659 }
2660 @@ -2296,7 +2418,7 @@ failed_scsi_cmnd:
2661 zfcp_fsf_req_free(req);
2662 scsi_cmnd->host_scribble = NULL;
2663 out:
2664 - spin_unlock(&adapter->req_q.lock);
2665 + spin_unlock(&adapter->req_q_lock);
2666 return retval;
2667 }
2668
2669 @@ -2312,7 +2434,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_c
2670 struct zfcp_unit *unit,
2671 u8 tm_flags, int req_flags)
2672 {
2673 - volatile struct qdio_buffer_element *sbale;
2674 + struct qdio_buffer_element *sbale;
2675 struct zfcp_fsf_req *req = NULL;
2676 struct fcp_cmnd_iu *fcp_cmnd_iu;
2677
2678 @@ -2320,7 +2442,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_c
2679 ZFCP_STATUS_COMMON_UNBLOCKED)))
2680 return NULL;
2681
2682 - spin_lock(&adapter->req_q.lock);
2683 + spin_lock(&adapter->req_q_lock);
2684 if (!zfcp_fsf_sbal_available(adapter))
2685 goto out;
2686 req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
2687 @@ -2336,7 +2458,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_c
2688 req->qtcb->bottom.io.data_direction = FSF_DATADIR_CMND;
2689 req->qtcb->bottom.io.service_class = FSF_CLASS_3;
2690 req->qtcb->bottom.io.fcp_cmnd_length = sizeof(struct fcp_cmnd_iu) +
2691 - sizeof(fcp_dl_t);
2692 + sizeof(u32);
2693
2694 sbale = zfcp_qdio_sbale_req(req);
2695 sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE;
2696 @@ -2353,7 +2475,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_c
2697 zfcp_fsf_req_free(req);
2698 req = NULL;
2699 out:
2700 - spin_unlock(&adapter->req_q.lock);
2701 + spin_unlock(&adapter->req_q_lock);
2702 return req;
2703 }
2704
2705 @@ -2372,7 +2494,7 @@ static void zfcp_fsf_control_file_handle
2706 struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
2707 struct zfcp_fsf_cfdc *fsf_cfdc)
2708 {
2709 - volatile struct qdio_buffer_element *sbale;
2710 + struct qdio_buffer_element *sbale;
2711 struct zfcp_fsf_req *req = NULL;
2712 struct fsf_qtcb_bottom_support *bottom;
2713 int direction, retval = -EIO, bytes;
2714 @@ -2391,7 +2513,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_fi
2715 return ERR_PTR(-EINVAL);
2716 }
2717
2718 - spin_lock_bh(&adapter->req_q.lock);
2719 + spin_lock_bh(&adapter->req_q_lock);
2720 if (zfcp_fsf_req_sbal_get(adapter))
2721 goto out;
2722
2723 @@ -2421,7 +2543,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_fi
2724 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
2725 retval = zfcp_fsf_req_send(req);
2726 out:
2727 - spin_unlock_bh(&adapter->req_q.lock);
2728 + spin_unlock_bh(&adapter->req_q_lock);
2729
2730 if (!retval) {
2731 wait_event(req->completion_wq,
2732 --- a/drivers/s390/scsi/zfcp_fsf.h
2733 +++ b/drivers/s390/scsi/zfcp_fsf.h
2734 @@ -71,13 +71,6 @@
2735 #define FSF_MAXIMUM_NUMBER_OF_LUNS_EXCEEDED 0x00000041
2736 #define FSF_ELS_COMMAND_REJECTED 0x00000050
2737 #define FSF_GENERIC_COMMAND_REJECTED 0x00000051
2738 -#define FSF_OPERATION_PARTIALLY_SUCCESSFUL 0x00000052
2739 -#define FSF_AUTHORIZATION_FAILURE 0x00000053
2740 -#define FSF_CFDC_ERROR_DETECTED 0x00000054
2741 -#define FSF_CONTROL_FILE_UPDATE_ERROR 0x00000055
2742 -#define FSF_CONTROL_FILE_TOO_LARGE 0x00000056
2743 -#define FSF_ACCESS_CONFLICT_DETECTED 0x00000057
2744 -#define FSF_CONFLICTS_OVERRULED 0x00000058
2745 #define FSF_PORT_BOXED 0x00000059
2746 #define FSF_LUN_BOXED 0x0000005A
2747 #define FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE 0x0000005B
2748 @@ -85,9 +78,7 @@
2749 #define FSF_REQUEST_SIZE_TOO_LARGE 0x00000061
2750 #define FSF_RESPONSE_SIZE_TOO_LARGE 0x00000062
2751 #define FSF_SBAL_MISMATCH 0x00000063
2752 -#define FSF_OPEN_PORT_WITHOUT_PRLI 0x00000064
2753 #define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD
2754 -#define FSF_FCP_RSP_AVAILABLE 0x000000AF
2755 #define FSF_UNKNOWN_COMMAND 0x000000E2
2756 #define FSF_UNKNOWN_OP_SUBTYPE 0x000000E3
2757 #define FSF_INVALID_COMMAND_OPTION 0x000000E5
2758 @@ -102,20 +93,9 @@
2759 #define FSF_SQ_RETRY_IF_POSSIBLE 0x02
2760 #define FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED 0x03
2761 #define FSF_SQ_INVOKE_LINK_TEST_PROCEDURE 0x04
2762 -#define FSF_SQ_ULP_PROGRAMMING_ERROR 0x05
2763 #define FSF_SQ_COMMAND_ABORTED 0x06
2764 #define FSF_SQ_NO_RETRY_POSSIBLE 0x07
2765
2766 -/* FSF status qualifier for CFDC commands */
2767 -#define FSF_SQ_CFDC_HARDENED_ON_SE 0x00000000
2768 -#define FSF_SQ_CFDC_COULD_NOT_HARDEN_ON_SE 0x00000001
2769 -#define FSF_SQ_CFDC_COULD_NOT_HARDEN_ON_SE2 0x00000002
2770 -/* CFDC subtable codes */
2771 -#define FSF_SQ_CFDC_SUBTABLE_OS 0x0001
2772 -#define FSF_SQ_CFDC_SUBTABLE_PORT_WWPN 0x0002
2773 -#define FSF_SQ_CFDC_SUBTABLE_PORT_DID 0x0003
2774 -#define FSF_SQ_CFDC_SUBTABLE_LUN 0x0004
2775 -
2776 /* FSF status qualifier (most significant 4 bytes), local link down */
2777 #define FSF_PSQ_LINK_NO_LIGHT 0x00000004
2778 #define FSF_PSQ_LINK_WRAP_PLUG 0x00000008
2779 @@ -145,7 +125,6 @@
2780 #define FSF_STATUS_READ_LINK_UP 0x00000006
2781 #define FSF_STATUS_READ_NOTIFICATION_LOST 0x00000009
2782 #define FSF_STATUS_READ_CFDC_UPDATED 0x0000000A
2783 -#define FSF_STATUS_READ_CFDC_HARDENED 0x0000000B
2784 #define FSF_STATUS_READ_FEATURE_UPDATE_ALERT 0x0000000C
2785
2786 /* status subtypes in status read buffer */
2787 @@ -159,20 +138,9 @@
2788
2789 /* status subtypes for unsolicited status notification lost */
2790 #define FSF_STATUS_READ_SUB_INCOMING_ELS 0x00000001
2791 -#define FSF_STATUS_READ_SUB_SENSE_DATA 0x00000002
2792 -#define FSF_STATUS_READ_SUB_LINK_STATUS 0x00000004
2793 -#define FSF_STATUS_READ_SUB_PORT_CLOSED 0x00000008
2794 -#define FSF_STATUS_READ_SUB_BIT_ERROR_THRESHOLD 0x00000010
2795 #define FSF_STATUS_READ_SUB_ACT_UPDATED 0x00000020
2796 -#define FSF_STATUS_READ_SUB_ACT_HARDENED 0x00000040
2797 -#define FSF_STATUS_READ_SUB_FEATURE_UPDATE_ALERT 0x00000080
2798 -
2799 -/* status subtypes for CFDC */
2800 -#define FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE 0x00000002
2801 -#define FSF_STATUS_READ_SUB_CFDC_HARDENED_ON_SE2 0x0000000F
2802
2803 /* topologie that is detected by the adapter */
2804 -#define FSF_TOPO_ERROR 0x00000000
2805 #define FSF_TOPO_P2P 0x00000001
2806 #define FSF_TOPO_FABRIC 0x00000002
2807 #define FSF_TOPO_AL 0x00000003
2808 @@ -180,17 +148,13 @@
2809 /* data direction for FCP commands */
2810 #define FSF_DATADIR_WRITE 0x00000001
2811 #define FSF_DATADIR_READ 0x00000002
2812 -#define FSF_DATADIR_READ_WRITE 0x00000003
2813 #define FSF_DATADIR_CMND 0x00000004
2814
2815 /* fc service class */
2816 -#define FSF_CLASS_1 0x00000001
2817 -#define FSF_CLASS_2 0x00000002
2818 #define FSF_CLASS_3 0x00000003
2819
2820 /* SBAL chaining */
2821 #define FSF_MAX_SBALS_PER_REQ 36
2822 -#define FSF_MAX_SBALS_PER_ELS_REQ 2
2823
2824 /* logging space behind QTCB */
2825 #define FSF_QTCB_LOG_SIZE 1024
2826 @@ -200,50 +164,16 @@
2827 #define FSF_FEATURE_LUN_SHARING 0x00000004
2828 #define FSF_FEATURE_NOTIFICATION_LOST 0x00000008
2829 #define FSF_FEATURE_HBAAPI_MANAGEMENT 0x00000010
2830 -#define FSF_FEATURE_ELS_CT_CHAINED_SBALS 0x00000020
2831 #define FSF_FEATURE_UPDATE_ALERT 0x00000100
2832 #define FSF_FEATURE_MEASUREMENT_DATA 0x00000200
2833
2834 /* host connection features */
2835 #define FSF_FEATURE_NPIV_MODE 0x00000001
2836 -#define FSF_FEATURE_VM_ASSIGNED_WWPN 0x00000002
2837
2838 /* option */
2839 #define FSF_OPEN_LUN_SUPPRESS_BOXING 0x00000001
2840 -#define FSF_OPEN_LUN_REPLICATE_SENSE 0x00000002
2841 -
2842 -/* adapter types */
2843 -#define FSF_ADAPTER_TYPE_FICON 0x00000001
2844 -#define FSF_ADAPTER_TYPE_FICON_EXPRESS 0x00000002
2845 -
2846 -/* port types */
2847 -#define FSF_HBA_PORTTYPE_UNKNOWN 0x00000001
2848 -#define FSF_HBA_PORTTYPE_NOTPRESENT 0x00000003
2849 -#define FSF_HBA_PORTTYPE_NPORT 0x00000005
2850 -#define FSF_HBA_PORTTYPE_PTP 0x00000021
2851 -/* following are not defined and used by FSF Spec
2852 - but are additionally defined by FC-HBA */
2853 -#define FSF_HBA_PORTTYPE_OTHER 0x00000002
2854 -#define FSF_HBA_PORTTYPE_NOTPRESENT 0x00000003
2855 -#define FSF_HBA_PORTTYPE_NLPORT 0x00000006
2856 -#define FSF_HBA_PORTTYPE_FLPORT 0x00000007
2857 -#define FSF_HBA_PORTTYPE_FPORT 0x00000008
2858 -#define FSF_HBA_PORTTYPE_LPORT 0x00000020
2859 -
2860 -/* port states */
2861 -#define FSF_HBA_PORTSTATE_UNKNOWN 0x00000001
2862 -#define FSF_HBA_PORTSTATE_ONLINE 0x00000002
2863 -#define FSF_HBA_PORTSTATE_OFFLINE 0x00000003
2864 -#define FSF_HBA_PORTSTATE_LINKDOWN 0x00000006
2865 -#define FSF_HBA_PORTSTATE_ERROR 0x00000007
2866 -
2867 -/* IO states of adapter */
2868 -#define FSF_IOSTAT_NPORT_RJT 0x00000004
2869 -#define FSF_IOSTAT_FABRIC_RJT 0x00000005
2870 -#define FSF_IOSTAT_LS_RJT 0x00000009
2871
2872 /* open LUN access flags*/
2873 -#define FSF_UNIT_ACCESS_OPEN_LUN_ALLOWED 0x01000000
2874 #define FSF_UNIT_ACCESS_EXCLUSIVE 0x02000000
2875 #define FSF_UNIT_ACCESS_OUTBOUND_TRANSFER 0x10000000
2876
2877 @@ -265,11 +195,6 @@ struct fsf_queue_designator {
2878 u32 res1;
2879 } __attribute__ ((packed));
2880
2881 -struct fsf_port_closed_payload {
2882 - struct fsf_queue_designator queue_designator;
2883 - u32 port_handle;
2884 -} __attribute__ ((packed));
2885 -
2886 struct fsf_bit_error_payload {
2887 u32 res1;
2888 u32 link_failure_error_count;
2889 --- a/drivers/s390/scsi/zfcp_qdio.c
2890 +++ b/drivers/s390/scsi/zfcp_qdio.c
2891 @@ -30,7 +30,7 @@ static int zfcp_qdio_buffers_enqueue(str
2892 return 0;
2893 }
2894
2895 -static volatile struct qdio_buffer_element *
2896 +static struct qdio_buffer_element *
2897 zfcp_qdio_sbale(struct zfcp_qdio_queue *q, int sbal_idx, int sbale_idx)
2898 {
2899 return &q->sbal[sbal_idx]->element[sbale_idx];
2900 @@ -148,7 +148,7 @@ static void zfcp_qdio_int_resp(struct cc
2901 {
2902 struct zfcp_adapter *adapter = (struct zfcp_adapter *) parm;
2903 struct zfcp_qdio_queue *queue = &adapter->resp_q;
2904 - volatile struct qdio_buffer_element *sbale;
2905 + struct qdio_buffer_element *sbale;
2906 int sbal_idx, sbale_idx, sbal_no;
2907
2908 if (unlikely(qdio_err)) {
2909 @@ -193,8 +193,7 @@ static void zfcp_qdio_int_resp(struct cc
2910 * @fsf_req: pointer to struct fsf_req
2911 * Returns: pointer to qdio_buffer_element (SBALE) structure
2912 */
2913 -volatile struct qdio_buffer_element *
2914 -zfcp_qdio_sbale_req(struct zfcp_fsf_req *req)
2915 +struct qdio_buffer_element *zfcp_qdio_sbale_req(struct zfcp_fsf_req *req)
2916 {
2917 return zfcp_qdio_sbale(&req->adapter->req_q, req->sbal_last, 0);
2918 }
2919 @@ -204,8 +203,7 @@ zfcp_qdio_sbale_req(struct zfcp_fsf_req
2920 * @fsf_req: pointer to struct fsf_req
2921 * Returns: pointer to qdio_buffer_element (SBALE) structure
2922 */
2923 -volatile struct qdio_buffer_element *
2924 -zfcp_qdio_sbale_curr(struct zfcp_fsf_req *req)
2925 +struct qdio_buffer_element *zfcp_qdio_sbale_curr(struct zfcp_fsf_req *req)
2926 {
2927 return zfcp_qdio_sbale(&req->adapter->req_q, req->sbal_last,
2928 req->sbale_curr);
2929 @@ -219,10 +217,10 @@ static void zfcp_qdio_sbal_limit(struct
2930 % QDIO_MAX_BUFFERS_PER_Q;
2931 }
2932
2933 -static volatile struct qdio_buffer_element *
2934 +static struct qdio_buffer_element *
2935 zfcp_qdio_sbal_chain(struct zfcp_fsf_req *fsf_req, unsigned long sbtype)
2936 {
2937 - volatile struct qdio_buffer_element *sbale;
2938 + struct qdio_buffer_element *sbale;
2939
2940 /* set last entry flag in current SBALE of current SBAL */
2941 sbale = zfcp_qdio_sbale_curr(fsf_req);
2942 @@ -253,7 +251,7 @@ zfcp_qdio_sbal_chain(struct zfcp_fsf_req
2943 return sbale;
2944 }
2945
2946 -static volatile struct qdio_buffer_element *
2947 +static struct qdio_buffer_element *
2948 zfcp_qdio_sbale_next(struct zfcp_fsf_req *fsf_req, unsigned long sbtype)
2949 {
2950 if (fsf_req->sbale_curr == ZFCP_LAST_SBALE_PER_SBAL)
2951 @@ -276,7 +274,7 @@ static int zfcp_qdio_fill_sbals(struct z
2952 unsigned int sbtype, void *start_addr,
2953 unsigned int total_length)
2954 {
2955 - volatile struct qdio_buffer_element *sbale;
2956 + struct qdio_buffer_element *sbale;
2957 unsigned long remaining, length;
2958 void *addr;
2959
2960 @@ -311,7 +309,7 @@ static int zfcp_qdio_fill_sbals(struct z
2961 int zfcp_qdio_sbals_from_sg(struct zfcp_fsf_req *fsf_req, unsigned long sbtype,
2962 struct scatterlist *sg, int max_sbals)
2963 {
2964 - volatile struct qdio_buffer_element *sbale;
2965 + struct qdio_buffer_element *sbale;
2966 int retval, bytes = 0;
2967
2968 /* figure out last allowed SBAL */
2969 @@ -348,10 +346,10 @@ int zfcp_qdio_send(struct zfcp_fsf_req *
2970 int first = fsf_req->sbal_first;
2971 int count = fsf_req->sbal_number;
2972 int retval, pci, pci_batch;
2973 - volatile struct qdio_buffer_element *sbale;
2974 + struct qdio_buffer_element *sbale;
2975
2976 /* acknowledgements for transferred buffers */
2977 - pci_batch = req_q->pci_batch + count;
2978 + pci_batch = adapter->req_q_pci_batch + count;
2979 if (unlikely(pci_batch >= ZFCP_QDIO_PCI_INTERVAL)) {
2980 pci_batch %= ZFCP_QDIO_PCI_INTERVAL;
2981 pci = first + count - (pci_batch + 1);
2982 @@ -371,7 +369,7 @@ int zfcp_qdio_send(struct zfcp_fsf_req *
2983 atomic_sub(count, &req_q->count);
2984 req_q->first += count;
2985 req_q->first %= QDIO_MAX_BUFFERS_PER_Q;
2986 - req_q->pci_batch = pci_batch;
2987 + adapter->req_q_pci_batch = pci_batch;
2988 return 0;
2989 }
2990
2991 @@ -422,14 +420,14 @@ void zfcp_qdio_close(struct zfcp_adapter
2992 struct zfcp_qdio_queue *req_q;
2993 int first, count;
2994
2995 - if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status))
2996 + if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP))
2997 return;
2998
2999 /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
3000 req_q = &adapter->req_q;
3001 - spin_lock_bh(&req_q->lock);
3002 + spin_lock_bh(&adapter->req_q_lock);
3003 atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
3004 - spin_unlock_bh(&req_q->lock);
3005 + spin_unlock_bh(&adapter->req_q_lock);
3006
3007 qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR);
3008
3009 @@ -442,7 +440,7 @@ void zfcp_qdio_close(struct zfcp_adapter
3010 }
3011 req_q->first = 0;
3012 atomic_set(&req_q->count, 0);
3013 - req_q->pci_batch = 0;
3014 + adapter->req_q_pci_batch = 0;
3015 adapter->resp_q.first = 0;
3016 atomic_set(&adapter->resp_q.count, 0);
3017 }
3018 @@ -454,10 +452,10 @@ void zfcp_qdio_close(struct zfcp_adapter
3019 */
3020 int zfcp_qdio_open(struct zfcp_adapter *adapter)
3021 {
3022 - volatile struct qdio_buffer_element *sbale;
3023 + struct qdio_buffer_element *sbale;
3024 int cc;
3025
3026 - if (atomic_test_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status))
3027 + if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)
3028 return -EIO;
3029
3030 if (qdio_establish(&adapter->qdio_init_data))
3031 @@ -480,7 +478,7 @@ int zfcp_qdio_open(struct zfcp_adapter *
3032 /* set index of first avalable SBALS / number of available SBALS */
3033 adapter->req_q.first = 0;
3034 atomic_set(&adapter->req_q.count, QDIO_MAX_BUFFERS_PER_Q);
3035 - adapter->req_q.pci_batch = 0;
3036 + adapter->req_q_pci_batch = 0;
3037
3038 return 0;
3039
3040 --- a/drivers/s390/scsi/zfcp_scsi.c
3041 +++ b/drivers/s390/scsi/zfcp_scsi.c
3042 @@ -23,20 +23,6 @@ char *zfcp_get_fcp_sns_info_ptr(struct f
3043 return fcp_sns_info_ptr;
3044 }
3045
3046 -void zfcp_set_fcp_dl(struct fcp_cmnd_iu *fcp_cmd, fcp_dl_t fcp_dl)
3047 -{
3048 - fcp_dl_t *fcp_dl_ptr;
3049 -
3050 - /*
3051 - * fcp_dl_addr = start address of fcp_cmnd structure +
3052 - * size of fixed part + size of dynamically sized add_dcp_cdb field
3053 - * SEE FCP-2 documentation
3054 - */
3055 - fcp_dl_ptr = (fcp_dl_t *) ((unsigned char *) &fcp_cmd[1] +
3056 - (fcp_cmd->add_fcp_cdb_length << 2));
3057 - *fcp_dl_ptr = fcp_dl;
3058 -}
3059 -
3060 static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt)
3061 {
3062 struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata;
3063 @@ -121,13 +107,17 @@ static struct zfcp_unit *zfcp_unit_looku
3064 {
3065 struct zfcp_port *port;
3066 struct zfcp_unit *unit;
3067 + int scsi_lun;
3068
3069 list_for_each_entry(port, &adapter->port_list_head, list) {
3070 if (!port->rport || (id != port->rport->scsi_target_id))
3071 continue;
3072 - list_for_each_entry(unit, &port->unit_list_head, list)
3073 - if (lun == unit->scsi_lun)
3074 + list_for_each_entry(unit, &port->unit_list_head, list) {
3075 + scsi_lun = scsilun_to_int(
3076 + (struct scsi_lun *)&unit->fcp_lun);
3077 + if (lun == scsi_lun)
3078 return unit;
3079 + }
3080 }
3081
3082 return NULL;
3083 @@ -185,7 +175,6 @@ static int zfcp_scsi_eh_abort_handler(st
3084 return retval;
3085 }
3086 fsf_req->data = NULL;
3087 - fsf_req->status |= ZFCP_STATUS_FSFREQ_ABORTING;
3088
3089 /* don't access old fsf_req after releasing the abort_lock */
3090 write_unlock_irqrestore(&adapter->abort_lock, flags);
3091 @@ -315,7 +304,6 @@ int zfcp_adapter_scsi_register(struct zf
3092 scsi_host_put(adapter->scsi_host);
3093 return -EIO;
3094 }
3095 - atomic_set_mask(ZFCP_STATUS_ADAPTER_REGISTERED, &adapter->status);
3096
3097 return 0;
3098 }
3099 @@ -339,7 +327,6 @@ void zfcp_adapter_scsi_unregister(struct
3100 scsi_remove_host(shost);
3101 scsi_host_put(shost);
3102 adapter->scsi_host = NULL;
3103 - atomic_clear_mask(ZFCP_STATUS_ADAPTER_REGISTERED, &adapter->status);
3104
3105 return;
3106 }
3107 --- a/drivers/s390/scsi/zfcp_sysfs.c
3108 +++ b/drivers/s390/scsi/zfcp_sysfs.c
3109 @@ -28,9 +28,9 @@ static ZFCP_DEV_ATTR(_feat, _name, S_IRU
3110 ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, status, "0x%08x\n",
3111 atomic_read(&adapter->status));
3112 ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, peer_wwnn, "0x%016llx\n",
3113 - adapter->peer_wwnn);
3114 + (unsigned long long) adapter->peer_wwnn);
3115 ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, peer_wwpn, "0x%016llx\n",
3116 - adapter->peer_wwpn);
3117 + (unsigned long long) adapter->peer_wwpn);
3118 ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, peer_d_id, "0x%06x\n",
3119 adapter->peer_d_id);
3120 ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, card_version, "0x%04x\n",
3121 @@ -137,8 +137,9 @@ static ssize_t zfcp_sysfs_port_remove_st
3122 {
3123 struct zfcp_adapter *adapter = dev_get_drvdata(dev);
3124 struct zfcp_port *port;
3125 - wwn_t wwpn;
3126 + u64 wwpn;
3127 int retval = 0;
3128 + LIST_HEAD(port_remove_lh);
3129
3130 down(&zfcp_data.config_sema);
3131 if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
3132 @@ -146,7 +147,7 @@ static ssize_t zfcp_sysfs_port_remove_st
3133 goto out;
3134 }
3135
3136 - if (strict_strtoull(buf, 0, &wwpn)) {
3137 + if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) {
3138 retval = -EINVAL;
3139 goto out;
3140 }
3141 @@ -156,7 +157,7 @@ static ssize_t zfcp_sysfs_port_remove_st
3142 if (port && (atomic_read(&port->refcount) == 0)) {
3143 zfcp_port_get(port);
3144 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
3145 - list_move(&port->list, &adapter->port_remove_lh);
3146 + list_move(&port->list, &port_remove_lh);
3147 } else
3148 port = NULL;
3149 write_unlock_irq(&zfcp_data.config_lock);
3150 @@ -202,7 +203,7 @@ static ssize_t zfcp_sysfs_unit_add_store
3151 {
3152 struct zfcp_port *port = dev_get_drvdata(dev);
3153 struct zfcp_unit *unit;
3154 - fcp_lun_t fcp_lun;
3155 + u64 fcp_lun;
3156 int retval = -EINVAL;
3157
3158 down(&zfcp_data.config_sema);
3159 @@ -211,7 +212,7 @@ static ssize_t zfcp_sysfs_unit_add_store
3160 goto out;
3161 }
3162
3163 - if (strict_strtoull(buf, 0, &fcp_lun))
3164 + if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun))
3165 goto out;
3166
3167 unit = zfcp_unit_enqueue(port, fcp_lun);
3168 @@ -235,8 +236,9 @@ static ssize_t zfcp_sysfs_unit_remove_st
3169 {
3170 struct zfcp_port *port = dev_get_drvdata(dev);
3171 struct zfcp_unit *unit;
3172 - fcp_lun_t fcp_lun;
3173 + u64 fcp_lun;
3174 int retval = 0;
3175 + LIST_HEAD(unit_remove_lh);
3176
3177 down(&zfcp_data.config_sema);
3178 if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
3179 @@ -244,7 +246,7 @@ static ssize_t zfcp_sysfs_unit_remove_st
3180 goto out;
3181 }
3182
3183 - if (strict_strtoull(buf, 0, &fcp_lun)) {
3184 + if (strict_strtoull(buf, 0, (unsigned long long *) &fcp_lun)) {
3185 retval = -EINVAL;
3186 goto out;
3187 }
3188 @@ -254,7 +256,7 @@ static ssize_t zfcp_sysfs_unit_remove_st
3189 if (unit && (atomic_read(&unit->refcount) == 0)) {
3190 zfcp_unit_get(unit);
3191 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
3192 - list_move(&unit->list, &port->unit_remove_lh);
3193 + list_move(&unit->list, &unit_remove_lh);
3194 } else
3195 unit = NULL;
3196
3197 @@ -275,22 +277,7 @@ out:
3198 }
3199 static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store);
3200
3201 -static struct attribute *zfcp_port_ns_attrs[] = {
3202 - &dev_attr_port_failed.attr,
3203 - &dev_attr_port_in_recovery.attr,
3204 - &dev_attr_port_status.attr,
3205 - &dev_attr_port_access_denied.attr,
3206 - NULL
3207 -};
3208 -
3209 -/**
3210 - * zfcp_sysfs_ns_port_attrs - sysfs attributes for nameserver
3211 - */
3212 -struct attribute_group zfcp_sysfs_ns_port_attrs = {
3213 - .attrs = zfcp_port_ns_attrs,
3214 -};
3215 -
3216 -static struct attribute *zfcp_port_no_ns_attrs[] = {
3217 +static struct attribute *zfcp_port_attrs[] = {
3218 &dev_attr_unit_add.attr,
3219 &dev_attr_unit_remove.attr,
3220 &dev_attr_port_failed.attr,
3221 @@ -304,7 +291,7 @@ static struct attribute *zfcp_port_no_ns
3222 * zfcp_sysfs_port_attrs - sysfs attributes for all other ports
3223 */
3224 struct attribute_group zfcp_sysfs_port_attrs = {
3225 - .attrs = zfcp_port_no_ns_attrs,
3226 + .attrs = zfcp_port_attrs,
3227 };
3228
3229 static struct attribute *zfcp_unit_attrs[] = {
3230 @@ -397,8 +384,10 @@ static DEVICE_ATTR(_name, S_IRUGO, zfcp_
3231
3232 ZFCP_DEFINE_SCSI_ATTR(hba_id, "%s\n",
3233 unit->port->adapter->ccw_device->dev.bus_id);
3234 -ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n", unit->port->wwpn);
3235 -ZFCP_DEFINE_SCSI_ATTR(fcp_lun, "0x%016llx\n", unit->fcp_lun);
3236 +ZFCP_DEFINE_SCSI_ATTR(wwpn, "0x%016llx\n",
3237 + (unsigned long long) unit->port->wwpn);
3238 +ZFCP_DEFINE_SCSI_ATTR(fcp_lun, "0x%016llx\n",
3239 + (unsigned long long) unit->fcp_lun);
3240
3241 struct device_attribute *zfcp_sysfs_sdev_attrs[] = {
3242 &dev_attr_fcp_lun,