[SCSI] zfcp: Adapter reopen for large number of unsolicited status
[linux-2.6] / drivers / s390 / scsi / zfcp_aux.c
1 /*
2  * zfcp device driver
3  *
4  * Module interface and handling of zfcp data structures.
5  *
6  * Copyright IBM Corporation 2002, 2008
7  */
8
9 /*
10  * Driver authors:
11  *            Martin Peschke (originator of the driver)
12  *            Raimund Schroeder
13  *            Aron Zeh
14  *            Wolfgang Taphorn
15  *            Stefan Bader
16  *            Heiko Carstens (kernel 2.6 port of the driver)
17  *            Andreas Herrmann
18  *            Maxim Shchetynin
19  *            Volker Sameske
20  *            Ralph Wuerthner
21  *            Michael Loehr
22  *            Swen Schillig
23  *            Christof Schmitt
24  *            Martin Petermann
25  *            Sven Schuetz
26  */
27
28 #include <linux/miscdevice.h>
29 #include "zfcp_ext.h"
30
31 static char *device;
32 /*********************** FUNCTION PROTOTYPES *********************************/
33
34 /* written against the module interface */
35 static int __init  zfcp_module_init(void);
36
37 /*********************** KERNEL/MODULE PARAMETERS  ***************************/
38
39 /* declare driver module init/cleanup functions */
40 module_init(zfcp_module_init);
41
42 MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com");
43 MODULE_DESCRIPTION
44     ("FCP (SCSI over Fibre Channel) HBA driver for IBM System z9 and zSeries");
45 MODULE_LICENSE("GPL");
46
47 module_param(device, charp, 0400);
48 MODULE_PARM_DESC(device, "specify initial device");
49
50 /****************************************************************/
51 /************** Functions without logging ***********************/
52 /****************************************************************/
53
54 void
55 _zfcp_hex_dump(char *addr, int count)
56 {
57         int i;
58         for (i = 0; i < count; i++) {
59                 printk("%02x", addr[i]);
60                 if ((i % 4) == 3)
61                         printk(" ");
62                 if ((i % 32) == 31)
63                         printk("\n");
64         }
65         if (((i-1) % 32) != 31)
66                 printk("\n");
67 }
68
69
70 /****************************************************************/
71 /****** Functions to handle the request ID hash table    ********/
72 /****************************************************************/
73
74 static int zfcp_reqlist_alloc(struct zfcp_adapter *adapter)
75 {
76         int idx;
77
78         adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
79                                     GFP_KERNEL);
80         if (!adapter->req_list)
81                 return -ENOMEM;
82
83         for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
84                 INIT_LIST_HEAD(&adapter->req_list[idx]);
85         return 0;
86 }
87
88 static void zfcp_reqlist_free(struct zfcp_adapter *adapter)
89 {
90         kfree(adapter->req_list);
91 }
92
93 int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
94 {
95         unsigned int idx;
96
97         for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
98                 if (!list_empty(&adapter->req_list[idx]))
99                         return 0;
100         return 1;
101 }
102
103 /****************************************************************/
104 /************** Uncategorised Functions *************************/
105 /****************************************************************/
106
107 /**
108  * zfcp_device_setup - setup function
109  * @str: pointer to parameter string
110  *
111  * Parse "device=..." parameter string.
112  */
113 static int __init
114 zfcp_device_setup(char *devstr)
115 {
116         char *tmp, *str;
117         size_t len;
118
119         if (!devstr)
120                 return 0;
121
122         len = strlen(devstr) + 1;
123         str = kmalloc(len, GFP_KERNEL);
124         if (!str) {
125                 pr_err("zfcp: Could not allocate memory for "
126                        "device parameter string, device not attached.\n");
127                 return 0;
128         }
129         memcpy(str, devstr, len);
130
131         tmp = strchr(str, ',');
132         if (!tmp)
133                 goto err_out;
134         *tmp++ = '\0';
135         strncpy(zfcp_data.init_busid, str, BUS_ID_SIZE);
136         zfcp_data.init_busid[BUS_ID_SIZE-1] = '\0';
137
138         zfcp_data.init_wwpn = simple_strtoull(tmp, &tmp, 0);
139         if (*tmp++ != ',')
140                 goto err_out;
141         if (*tmp == '\0')
142                 goto err_out;
143
144         zfcp_data.init_fcp_lun = simple_strtoull(tmp, &tmp, 0);
145         if (*tmp != '\0')
146                 goto err_out;
147         kfree(str);
148         return 1;
149
150  err_out:
151         pr_err("zfcp: Parse error for device parameter string %s, "
152                "device not attached.\n", str);
153         kfree(str);
154         return 0;
155 }
156
157 static void __init
158 zfcp_init_device_configure(void)
159 {
160         struct zfcp_adapter *adapter;
161         struct zfcp_port *port;
162         struct zfcp_unit *unit;
163
164         down(&zfcp_data.config_sema);
165         read_lock_irq(&zfcp_data.config_lock);
166         adapter = zfcp_get_adapter_by_busid(zfcp_data.init_busid);
167         if (adapter)
168                 zfcp_adapter_get(adapter);
169         read_unlock_irq(&zfcp_data.config_lock);
170
171         if (adapter == NULL)
172                 goto out_adapter;
173         port = zfcp_port_enqueue(adapter, zfcp_data.init_wwpn, 0, 0);
174         if (!port)
175                 goto out_port;
176         unit = zfcp_unit_enqueue(port, zfcp_data.init_fcp_lun);
177         if (!unit)
178                 goto out_unit;
179         up(&zfcp_data.config_sema);
180         ccw_device_set_online(adapter->ccw_device);
181         zfcp_erp_wait(adapter);
182         down(&zfcp_data.config_sema);
183         zfcp_unit_put(unit);
184  out_unit:
185         zfcp_port_put(port);
186  out_port:
187         zfcp_adapter_put(adapter);
188  out_adapter:
189         up(&zfcp_data.config_sema);
190         return;
191 }
192
193 static int calc_alignment(int size)
194 {
195         int align = 1;
196
197         if (!size)
198                 return 0;
199
200         while ((size - align) > 0)
201                 align <<= 1;
202
203         return align;
204 }
205
206 static int __init
207 zfcp_module_init(void)
208 {
209         int retval = -ENOMEM;
210         int size, align;
211
212         size = sizeof(struct zfcp_fsf_req_qtcb);
213         align = calc_alignment(size);
214         zfcp_data.fsf_req_qtcb_cache =
215                 kmem_cache_create("zfcp_fsf", size, align, 0, NULL);
216         if (!zfcp_data.fsf_req_qtcb_cache)
217                 goto out;
218
219         size = sizeof(struct fsf_status_read_buffer);
220         align = calc_alignment(size);
221         zfcp_data.sr_buffer_cache =
222                 kmem_cache_create("zfcp_sr", size, align, 0, NULL);
223         if (!zfcp_data.sr_buffer_cache)
224                 goto out_sr_cache;
225
226         size = sizeof(struct zfcp_gid_pn_data);
227         align = calc_alignment(size);
228         zfcp_data.gid_pn_cache =
229                 kmem_cache_create("zfcp_gid", size, align, 0, NULL);
230         if (!zfcp_data.gid_pn_cache)
231                 goto out_gid_cache;
232
233         /* initialize adapter list */
234         INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
235
236         /* initialize adapters to be removed list head */
237         INIT_LIST_HEAD(&zfcp_data.adapter_remove_lh);
238
239         zfcp_data.scsi_transport_template =
240                 fc_attach_transport(&zfcp_transport_functions);
241         if (!zfcp_data.scsi_transport_template)
242                 goto out_transport;
243
244         retval = misc_register(&zfcp_cfdc_misc);
245         if (retval != 0) {
246                 pr_err("zfcp: registration of misc device zfcp_cfdc failed\n");
247                 goto out_misc;
248         }
249
250         /* Initialise proc semaphores */
251         sema_init(&zfcp_data.config_sema, 1);
252
253         /* initialise configuration rw lock */
254         rwlock_init(&zfcp_data.config_lock);
255
256         /* setup dynamic I/O */
257         retval = zfcp_ccw_register();
258         if (retval) {
259                 pr_err("zfcp: Registration with common I/O layer failed.\n");
260                 goto out_ccw_register;
261         }
262
263         if (zfcp_device_setup(device))
264                 zfcp_init_device_configure();
265
266         goto out;
267
268  out_ccw_register:
269         misc_deregister(&zfcp_cfdc_misc);
270  out_misc:
271         fc_release_transport(zfcp_data.scsi_transport_template);
272  out_transport:
273         kmem_cache_destroy(zfcp_data.gid_pn_cache);
274  out_gid_cache:
275         kmem_cache_destroy(zfcp_data.sr_buffer_cache);
276  out_sr_cache:
277         kmem_cache_destroy(zfcp_data.fsf_req_qtcb_cache);
278  out:
279         return retval;
280 }
281
282 /****************************************************************/
283 /****** Functions for configuration/set-up of structures ********/
284 /****************************************************************/
285
286 /**
287  * zfcp_get_unit_by_lun - find unit in unit list of port by FCP LUN
288  * @port: pointer to port to search for unit
289  * @fcp_lun: FCP LUN to search for
290  * Traverse list of all units of a port and return pointer to a unit
291  * with the given FCP LUN.
292  */
293 struct zfcp_unit *
294 zfcp_get_unit_by_lun(struct zfcp_port *port, fcp_lun_t fcp_lun)
295 {
296         struct zfcp_unit *unit;
297         int found = 0;
298
299         list_for_each_entry(unit, &port->unit_list_head, list) {
300                 if ((unit->fcp_lun == fcp_lun) &&
301                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status))
302                 {
303                         found = 1;
304                         break;
305                 }
306         }
307         return found ? unit : NULL;
308 }
309
310 /**
311  * zfcp_get_port_by_wwpn - find port in port list of adapter by wwpn
312  * @adapter: pointer to adapter to search for port
313  * @wwpn: wwpn to search for
314  * Traverse list of all ports of an adapter and return pointer to a port
315  * with the given wwpn.
316  */
317 struct zfcp_port *
318 zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, wwn_t wwpn)
319 {
320         struct zfcp_port *port;
321         int found = 0;
322
323         list_for_each_entry(port, &adapter->port_list_head, list) {
324                 if ((port->wwpn == wwpn) &&
325                     !(atomic_read(&port->status) &
326                       (ZFCP_STATUS_PORT_NO_WWPN | ZFCP_STATUS_COMMON_REMOVE))) {
327                         found = 1;
328                         break;
329                 }
330         }
331         return found ? port : NULL;
332 }
333
334 /**
335  * zfcp_get_port_by_did - find port in port list of adapter by d_id
336  * @adapter: pointer to adapter to search for port
337  * @d_id: d_id to search for
338  * Traverse list of all ports of an adapter and return pointer to a port
339  * with the given d_id.
340  */
341 struct zfcp_port *
342 zfcp_get_port_by_did(struct zfcp_adapter *adapter, u32 d_id)
343 {
344         struct zfcp_port *port;
345         int found = 0;
346
347         list_for_each_entry(port, &adapter->port_list_head, list) {
348                 if ((port->d_id == d_id) &&
349                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status))
350                 {
351                         found = 1;
352                         break;
353                 }
354         }
355         return found ? port : NULL;
356 }
357
358 /**
359  * zfcp_get_adapter_by_busid - find adpater in adapter list by bus_id
360  * @bus_id: bus_id to search for
361  * Traverse list of all adapters and return pointer to an adapter
362  * with the given bus_id.
363  */
364 struct zfcp_adapter *
365 zfcp_get_adapter_by_busid(char *bus_id)
366 {
367         struct zfcp_adapter *adapter;
368         int found = 0;
369
370         list_for_each_entry(adapter, &zfcp_data.adapter_list_head, list) {
371                 if ((strncmp(bus_id, zfcp_get_busid_by_adapter(adapter),
372                              BUS_ID_SIZE) == 0) &&
373                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE,
374                                       &adapter->status)){
375                         found = 1;
376                         break;
377                 }
378         }
379         return found ? adapter : NULL;
380 }
381
382 /**
383  * zfcp_unit_enqueue - enqueue unit to unit list of a port.
384  * @port: pointer to port where unit is added
385  * @fcp_lun: FCP LUN of unit to be enqueued
386  * Return: pointer to enqueued unit on success, NULL on error
387  * Locks: config_sema must be held to serialize changes to the unit list
388  *
389  * Sets up some unit internal structures and creates sysfs entry.
390  */
391 struct zfcp_unit *
392 zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
393 {
394         struct zfcp_unit *unit;
395
396         /*
397          * check that there is no unit with this FCP_LUN already in list
398          * and enqueue it.
399          * Note: Unlike for the adapter and the port, this is an error
400          */
401         read_lock_irq(&zfcp_data.config_lock);
402         unit = zfcp_get_unit_by_lun(port, fcp_lun);
403         read_unlock_irq(&zfcp_data.config_lock);
404         if (unit)
405                 return NULL;
406
407         unit = kzalloc(sizeof (struct zfcp_unit), GFP_KERNEL);
408         if (!unit)
409                 return NULL;
410
411         /* initialise reference count stuff */
412         atomic_set(&unit->refcount, 0);
413         init_waitqueue_head(&unit->remove_wq);
414
415         unit->port = port;
416         unit->fcp_lun = fcp_lun;
417
418         /* setup for sysfs registration */
419         snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx", fcp_lun);
420         unit->sysfs_device.parent = &port->sysfs_device;
421         unit->sysfs_device.release = zfcp_sysfs_unit_release;
422         dev_set_drvdata(&unit->sysfs_device, unit);
423
424         /* mark unit unusable as long as sysfs registration is not complete */
425         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
426
427         spin_lock_init(&unit->latencies.lock);
428         unit->latencies.write.channel.min = 0xFFFFFFFF;
429         unit->latencies.write.fabric.min = 0xFFFFFFFF;
430         unit->latencies.read.channel.min = 0xFFFFFFFF;
431         unit->latencies.read.fabric.min = 0xFFFFFFFF;
432         unit->latencies.cmd.channel.min = 0xFFFFFFFF;
433         unit->latencies.cmd.fabric.min = 0xFFFFFFFF;
434
435         if (device_register(&unit->sysfs_device)) {
436                 kfree(unit);
437                 return NULL;
438         }
439
440         if (zfcp_sysfs_unit_create_files(&unit->sysfs_device)) {
441                 device_unregister(&unit->sysfs_device);
442                 return NULL;
443         }
444
445         zfcp_unit_get(unit);
446         unit->scsi_lun = scsilun_to_int((struct scsi_lun *)&unit->fcp_lun);
447
448         write_lock_irq(&zfcp_data.config_lock);
449         list_add_tail(&unit->list, &port->unit_list_head);
450         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
451         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status);
452         write_unlock_irq(&zfcp_data.config_lock);
453
454         port->units++;
455         zfcp_port_get(port);
456
457         return unit;
458 }
459
460 void
461 zfcp_unit_dequeue(struct zfcp_unit *unit)
462 {
463         zfcp_unit_wait(unit);
464         write_lock_irq(&zfcp_data.config_lock);
465         list_del(&unit->list);
466         write_unlock_irq(&zfcp_data.config_lock);
467         unit->port->units--;
468         zfcp_port_put(unit->port);
469         zfcp_sysfs_unit_remove_files(&unit->sysfs_device);
470         device_unregister(&unit->sysfs_device);
471 }
472
473 /*
474  * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI
475  * commands.
476  * It also genrates fcp-nameserver request/response buffer and unsolicited
477  * status read fsf_req buffers.
478  *
479  * locks:       must only be called with zfcp_data.config_sema taken
480  */
481 static int
482 zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter)
483 {
484         adapter->pool.fsf_req_erp =
485                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_ERP_NR,
486                                          zfcp_data.fsf_req_qtcb_cache);
487         if (!adapter->pool.fsf_req_erp)
488                 return -ENOMEM;
489
490         adapter->pool.fsf_req_scsi =
491                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_SCSI_NR,
492                                          zfcp_data.fsf_req_qtcb_cache);
493         if (!adapter->pool.fsf_req_scsi)
494                 return -ENOMEM;
495
496         adapter->pool.fsf_req_abort =
497                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_ABORT_NR,
498                                          zfcp_data.fsf_req_qtcb_cache);
499         if (!adapter->pool.fsf_req_abort)
500                 return -ENOMEM;
501
502         adapter->pool.fsf_req_status_read =
503                 mempool_create_kmalloc_pool(ZFCP_POOL_STATUS_READ_NR,
504                                             sizeof(struct zfcp_fsf_req));
505         if (!adapter->pool.fsf_req_status_read)
506                 return -ENOMEM;
507
508         adapter->pool.data_status_read =
509                 mempool_create_slab_pool(ZFCP_POOL_STATUS_READ_NR,
510                                          zfcp_data.sr_buffer_cache);
511         if (!adapter->pool.data_status_read)
512                 return -ENOMEM;
513
514         adapter->pool.data_gid_pn =
515                 mempool_create_slab_pool(ZFCP_POOL_DATA_GID_PN_NR,
516                                          zfcp_data.gid_pn_cache);
517         if (!adapter->pool.data_gid_pn)
518                 return -ENOMEM;
519
520         return 0;
521 }
522
523 /**
524  * zfcp_free_low_mem_buffers - free memory pools of an adapter
525  * @adapter: pointer to zfcp_adapter for which memory pools should be freed
526  * locking:  zfcp_data.config_sema must be held
527  */
528 static void
529 zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter)
530 {
531         if (adapter->pool.fsf_req_erp)
532                 mempool_destroy(adapter->pool.fsf_req_erp);
533         if (adapter->pool.fsf_req_scsi)
534                 mempool_destroy(adapter->pool.fsf_req_scsi);
535         if (adapter->pool.fsf_req_abort)
536                 mempool_destroy(adapter->pool.fsf_req_abort);
537         if (adapter->pool.fsf_req_status_read)
538                 mempool_destroy(adapter->pool.fsf_req_status_read);
539         if (adapter->pool.data_status_read)
540                 mempool_destroy(adapter->pool.data_status_read);
541         if (adapter->pool.data_gid_pn)
542                 mempool_destroy(adapter->pool.data_gid_pn);
543 }
544
545 static void zfcp_dummy_release(struct device *dev)
546 {
547         return;
548 }
549
550 int zfcp_status_read_refill(struct zfcp_adapter *adapter)
551 {
552         while (atomic_read(&adapter->stat_miss) > 0)
553                 if (zfcp_fsf_status_read(adapter, ZFCP_WAIT_FOR_SBAL)) {
554                         if (atomic_read(&adapter->stat_miss) >= 16) {
555                                 zfcp_erp_adapter_reopen(adapter, 0, 103, NULL);
556                                 return 1;
557                         }
558                         break;
559                 } else
560                         atomic_dec(&adapter->stat_miss);
561         return 0;
562 }
563
564 static void _zfcp_status_read_scheduler(struct work_struct *work)
565 {
566         zfcp_status_read_refill(container_of(work, struct zfcp_adapter,
567                                              stat_work));
568 }
569
570 static int zfcp_nameserver_enqueue(struct zfcp_adapter *adapter)
571 {
572         struct zfcp_port *port;
573
574         port = zfcp_port_enqueue(adapter, 0, ZFCP_STATUS_PORT_WKA,
575                                  ZFCP_DID_DIRECTORY_SERVICE);
576         if (!port)
577                 return -ENXIO;
578         zfcp_port_put(port);
579
580         return 0;
581 }
582
583 /*
584  * Enqueues an adapter at the end of the adapter list in the driver data.
585  * All adapter internal structures are set up.
586  * Proc-fs entries are also created.
587  *
588  * FIXME: Use -ENOMEM as return code for allocation failures
589  *
590  * returns:     0             if a new adapter was successfully enqueued
591  *              ZFCP_KNOWN    if an adapter with this devno was already present
592  *              -ENOMEM       if alloc failed
593  * locks:       config_sema must be held to serialise changes to the adapter list
594  */
595 struct zfcp_adapter *
596 zfcp_adapter_enqueue(struct ccw_device *ccw_device)
597 {
598         struct zfcp_adapter *adapter;
599
600         /*
601          * Note: It is safe to release the list_lock, as any list changes
602          * are protected by the config_sema, which must be held to get here
603          */
604
605         /* try to allocate new adapter data structure (zeroed) */
606         adapter = kzalloc(sizeof (struct zfcp_adapter), GFP_KERNEL);
607         if (!adapter)
608                 goto out;
609
610         ccw_device->handler = NULL;
611
612         /* save ccw_device pointer */
613         adapter->ccw_device = ccw_device;
614
615         if (zfcp_qdio_allocate(adapter))
616                 goto qdio_allocate_failed;
617
618         if (zfcp_allocate_low_mem_buffers(adapter))
619                 goto failed_low_mem_buffers;
620
621         /* initialise reference count stuff */
622         atomic_set(&adapter->refcount, 0);
623         init_waitqueue_head(&adapter->remove_wq);
624
625         /* initialise list of ports */
626         INIT_LIST_HEAD(&adapter->port_list_head);
627
628         /* initialise list of ports to be removed */
629         INIT_LIST_HEAD(&adapter->port_remove_lh);
630
631         /* initialize list of fsf requests */
632         spin_lock_init(&adapter->req_list_lock);
633         if (zfcp_reqlist_alloc(adapter))
634                 goto failed_low_mem_buffers;
635
636         /* initialize debug locks */
637
638         spin_lock_init(&adapter->hba_dbf_lock);
639         spin_lock_init(&adapter->san_dbf_lock);
640         spin_lock_init(&adapter->scsi_dbf_lock);
641         spin_lock_init(&adapter->rec_dbf_lock);
642
643         if (zfcp_adapter_debug_register(adapter))
644                 goto debug_register_failed;
645
646         /* initialize error recovery stuff */
647
648         rwlock_init(&adapter->erp_lock);
649         sema_init(&adapter->erp_ready_sem, 0);
650         INIT_LIST_HEAD(&adapter->erp_ready_head);
651         INIT_LIST_HEAD(&adapter->erp_running_head);
652
653         /* initialize abort lock */
654         rwlock_init(&adapter->abort_lock);
655
656         /* initialise some erp stuff */
657         init_waitqueue_head(&adapter->erp_thread_wqh);
658         init_waitqueue_head(&adapter->erp_done_wqh);
659
660         /* initialize lock of associated request queue */
661         rwlock_init(&adapter->req_q.lock);
662         INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler);
663         INIT_WORK(&adapter->scan_work, _zfcp_scan_ports_later);
664
665         /* mark adapter unusable as long as sysfs registration is not complete */
666         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
667
668         dev_set_drvdata(&ccw_device->dev, adapter);
669
670         if (zfcp_sysfs_adapter_create_files(&ccw_device->dev))
671                 goto sysfs_failed;
672
673         adapter->generic_services.parent = &adapter->ccw_device->dev;
674         adapter->generic_services.release = zfcp_dummy_release;
675         snprintf(adapter->generic_services.bus_id, BUS_ID_SIZE,
676                  "generic_services");
677
678         if (device_register(&adapter->generic_services))
679                 goto generic_services_failed;
680
681         /* put allocated adapter at list tail */
682         write_lock_irq(&zfcp_data.config_lock);
683         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
684         list_add_tail(&adapter->list, &zfcp_data.adapter_list_head);
685         write_unlock_irq(&zfcp_data.config_lock);
686
687         zfcp_data.adapters++;
688
689         zfcp_nameserver_enqueue(adapter);
690
691         goto out;
692
693  generic_services_failed:
694         zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
695  sysfs_failed:
696         zfcp_adapter_debug_unregister(adapter);
697  debug_register_failed:
698         dev_set_drvdata(&ccw_device->dev, NULL);
699         zfcp_reqlist_free(adapter);
700  failed_low_mem_buffers:
701         zfcp_free_low_mem_buffers(adapter);
702  qdio_allocate_failed:
703         zfcp_qdio_free(adapter);
704         kfree(adapter);
705         adapter = NULL;
706  out:
707         return adapter;
708 }
709
710 /*
711  * returns:     0 - struct zfcp_adapter  data structure successfully removed
712  *              !0 - struct zfcp_adapter  data structure could not be removed
713  *                      (e.g. still used)
714  * locks:       adapter list write lock is assumed to be held by caller
715  */
716 void
717 zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
718 {
719         int retval = 0;
720         unsigned long flags;
721
722         cancel_work_sync(&adapter->scan_work);
723         cancel_work_sync(&adapter->stat_work);
724         zfcp_adapter_scsi_unregister(adapter);
725         device_unregister(&adapter->generic_services);
726         zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
727         dev_set_drvdata(&adapter->ccw_device->dev, NULL);
728         /* sanity check: no pending FSF requests */
729         spin_lock_irqsave(&adapter->req_list_lock, flags);
730         retval = zfcp_reqlist_isempty(adapter);
731         spin_unlock_irqrestore(&adapter->req_list_lock, flags);
732         if (!retval) {
733                 retval = -EBUSY;
734                 goto out;
735         }
736
737         zfcp_adapter_debug_unregister(adapter);
738
739         /* remove specified adapter data structure from list */
740         write_lock_irq(&zfcp_data.config_lock);
741         list_del(&adapter->list);
742         write_unlock_irq(&zfcp_data.config_lock);
743
744         /* decrease number of adapters in list */
745         zfcp_data.adapters--;
746
747         zfcp_qdio_free(adapter);
748
749         zfcp_free_low_mem_buffers(adapter);
750         zfcp_reqlist_free(adapter);
751         kfree(adapter->fc_stats);
752         kfree(adapter->stats_reset_data);
753         kfree(adapter);
754  out:
755         return;
756 }
757
758 /**
759  * zfcp_port_enqueue - enqueue port to port list of adapter
760  * @adapter: adapter where remote port is added
761  * @wwpn: WWPN of the remote port to be enqueued
762  * @status: initial status for the port
763  * @d_id: destination id of the remote port to be enqueued
764  * Return: pointer to enqueued port on success, NULL on error
765  * Locks: config_sema must be held to serialize changes to the port list
766  *
767  * All port internal structures are set up and the sysfs entry is generated.
768  * d_id is used to enqueue ports with a well known address like the Directory
769  * Service for nameserver lookup.
770  */
771 struct zfcp_port *
772 zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status,
773                   u32 d_id)
774 {
775         struct zfcp_port *port;
776         int check_wwpn;
777
778         check_wwpn = !(status & ZFCP_STATUS_PORT_NO_WWPN);
779         /*
780          * check that there is no port with this WWPN already in list
781          */
782         if (check_wwpn) {
783                 read_lock_irq(&zfcp_data.config_lock);
784                 port = zfcp_get_port_by_wwpn(adapter, wwpn);
785                 read_unlock_irq(&zfcp_data.config_lock);
786                 if (port)
787                         return NULL;
788         }
789
790         port = kzalloc(sizeof (struct zfcp_port), GFP_KERNEL);
791         if (!port)
792                 return NULL;
793
794         /* initialise reference count stuff */
795         atomic_set(&port->refcount, 0);
796         init_waitqueue_head(&port->remove_wq);
797
798         INIT_LIST_HEAD(&port->unit_list_head);
799         INIT_LIST_HEAD(&port->unit_remove_lh);
800
801         port->adapter = adapter;
802
803         if (check_wwpn)
804                 port->wwpn = wwpn;
805
806         atomic_set_mask(status, &port->status);
807
808         /* setup for sysfs registration */
809         if (status & ZFCP_STATUS_PORT_WKA) {
810                 switch (d_id) {
811                 case ZFCP_DID_DIRECTORY_SERVICE:
812                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
813                                  "directory");
814                         break;
815                 case ZFCP_DID_MANAGEMENT_SERVICE:
816                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
817                                  "management");
818                         break;
819                 case ZFCP_DID_KEY_DISTRIBUTION_SERVICE:
820                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
821                                  "key_distribution");
822                         break;
823                 case ZFCP_DID_ALIAS_SERVICE:
824                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
825                                  "alias");
826                         break;
827                 case ZFCP_DID_TIME_SERVICE:
828                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
829                                  "time");
830                         break;
831                 default:
832                         kfree(port);
833                         return NULL;
834                 }
835                 port->sysfs_device.parent = &adapter->generic_services;
836         } else {
837                 snprintf(port->sysfs_device.bus_id,
838                          BUS_ID_SIZE, "0x%016llx", wwpn);
839                 port->sysfs_device.parent = &adapter->ccw_device->dev;
840         }
841
842         port->d_id = d_id;
843
844         port->sysfs_device.release = zfcp_sysfs_port_release;
845         dev_set_drvdata(&port->sysfs_device, port);
846
847         /* mark port unusable as long as sysfs registration is not complete */
848         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
849
850         if (device_register(&port->sysfs_device)) {
851                 kfree(port);
852                 return NULL;
853         }
854
855         if (zfcp_sysfs_port_create_files(&port->sysfs_device, status)) {
856                 device_unregister(&port->sysfs_device);
857                 return NULL;
858         }
859
860         zfcp_port_get(port);
861
862         write_lock_irq(&zfcp_data.config_lock);
863         list_add_tail(&port->list, &adapter->port_list_head);
864         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
865         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
866         if (d_id == ZFCP_DID_DIRECTORY_SERVICE)
867                 if (!adapter->nameserver_port)
868                         adapter->nameserver_port = port;
869         adapter->ports++;
870         write_unlock_irq(&zfcp_data.config_lock);
871
872         zfcp_adapter_get(adapter);
873
874         return port;
875 }
876
877 void
878 zfcp_port_dequeue(struct zfcp_port *port)
879 {
880         zfcp_port_wait(port);
881         write_lock_irq(&zfcp_data.config_lock);
882         list_del(&port->list);
883         port->adapter->ports--;
884         write_unlock_irq(&zfcp_data.config_lock);
885         if (port->rport)
886                 fc_remote_port_delete(port->rport);
887         port->rport = NULL;
888         zfcp_adapter_put(port->adapter);
889         zfcp_sysfs_port_remove_files(&port->sysfs_device,
890                                      atomic_read(&port->status));
891         device_unregister(&port->sysfs_device);
892 }
893
894 void zfcp_sg_free_table(struct scatterlist *sg, int count)
895 {
896         int i;
897
898         for (i = 0; i < count; i++, sg++)
899                 if (sg)
900                         free_page((unsigned long) sg_virt(sg));
901                 else
902                         break;
903 }
904
905 int zfcp_sg_setup_table(struct scatterlist *sg, int count)
906 {
907         void *addr;
908         int i;
909
910         sg_init_table(sg, count);
911         for (i = 0; i < count; i++, sg++) {
912                 addr = (void *) get_zeroed_page(GFP_KERNEL);
913                 if (!addr) {
914                         zfcp_sg_free_table(sg, i);
915                         return -ENOMEM;
916                 }
917                 sg_set_buf(sg, addr, PAGE_SIZE);
918         }
919         return 0;
920 }