[S390] struct device - replace bus_id with dev_name(), dev_set_name()
[safe/jmp/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 <linux/seq_file.h>
30 #include "zfcp_ext.h"
31
32 #define ZFCP_BUS_ID_SIZE        20
33
34 static char *device;
35
36 MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com");
37 MODULE_DESCRIPTION("FCP HBA driver");
38 MODULE_LICENSE("GPL");
39
40 module_param(device, charp, 0400);
41 MODULE_PARM_DESC(device, "specify initial device");
42
43 static int zfcp_reqlist_alloc(struct zfcp_adapter *adapter)
44 {
45         int idx;
46
47         adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
48                                     GFP_KERNEL);
49         if (!adapter->req_list)
50                 return -ENOMEM;
51
52         for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
53                 INIT_LIST_HEAD(&adapter->req_list[idx]);
54         return 0;
55 }
56
57 /**
58  * zfcp_reqlist_isempty - is the request list empty
59  * @adapter: pointer to struct zfcp_adapter
60  *
61  * Returns: true if list is empty, false otherwise
62  */
63 int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
64 {
65         unsigned int idx;
66
67         for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
68                 if (!list_empty(&adapter->req_list[idx]))
69                         return 0;
70         return 1;
71 }
72
73 static int __init zfcp_device_setup(char *devstr)
74 {
75         char *token;
76         char *str;
77
78         if (!devstr)
79                 return 0;
80
81         /* duplicate devstr and keep the original for sysfs presentation*/
82         str = kmalloc(strlen(devstr) + 1, GFP_KERNEL);
83         if (!str)
84                 return 0;
85
86         strcpy(str, devstr);
87
88         token = strsep(&str, ",");
89         if (!token || strlen(token) >= ZFCP_BUS_ID_SIZE)
90                 goto err_out;
91         strncpy(zfcp_data.init_busid, token, ZFCP_BUS_ID_SIZE);
92
93         token = strsep(&str, ",");
94         if (!token || strict_strtoull(token, 0,
95                                 (unsigned long long *) &zfcp_data.init_wwpn))
96                 goto err_out;
97
98         token = strsep(&str, ",");
99         if (!token || strict_strtoull(token, 0,
100                                 (unsigned long long *) &zfcp_data.init_fcp_lun))
101                 goto err_out;
102
103         kfree(str);
104         return 1;
105
106  err_out:
107         kfree(str);
108         pr_err("zfcp: %s is not a valid SCSI device\n", devstr);
109         return 0;
110 }
111
112 static void __init zfcp_init_device_configure(void)
113 {
114         struct zfcp_adapter *adapter;
115         struct zfcp_port *port;
116         struct zfcp_unit *unit;
117
118         down(&zfcp_data.config_sema);
119         read_lock_irq(&zfcp_data.config_lock);
120         adapter = zfcp_get_adapter_by_busid(zfcp_data.init_busid);
121         if (adapter)
122                 zfcp_adapter_get(adapter);
123         read_unlock_irq(&zfcp_data.config_lock);
124
125         if (!adapter)
126                 goto out_adapter;
127         port = zfcp_port_enqueue(adapter, zfcp_data.init_wwpn, 0, 0);
128         if (IS_ERR(port))
129                 goto out_port;
130         unit = zfcp_unit_enqueue(port, zfcp_data.init_fcp_lun);
131         if (IS_ERR(unit))
132                 goto out_unit;
133         up(&zfcp_data.config_sema);
134         ccw_device_set_online(adapter->ccw_device);
135
136         zfcp_erp_wait(adapter);
137         wait_event(adapter->erp_done_wqh,
138                    !(atomic_read(&unit->status) &
139                                 ZFCP_STATUS_UNIT_SCSI_WORK_PENDING));
140
141         down(&zfcp_data.config_sema);
142         zfcp_unit_put(unit);
143 out_unit:
144         zfcp_port_put(port);
145 out_port:
146         zfcp_adapter_put(adapter);
147 out_adapter:
148         up(&zfcp_data.config_sema);
149         return;
150 }
151
152 static struct kmem_cache *zfcp_cache_create(int size, char *name)
153 {
154         int align = 1;
155         while ((size - align) > 0)
156                 align <<= 1;
157         return kmem_cache_create(name , size, align, 0, NULL);
158 }
159
160 static int __init zfcp_module_init(void)
161 {
162         int retval = -ENOMEM;
163
164         zfcp_data.fsf_req_qtcb_cache = zfcp_cache_create(
165                         sizeof(struct zfcp_fsf_req_qtcb), "zfcp_fsf");
166         if (!zfcp_data.fsf_req_qtcb_cache)
167                 goto out;
168
169         zfcp_data.sr_buffer_cache = zfcp_cache_create(
170                         sizeof(struct fsf_status_read_buffer), "zfcp_sr");
171         if (!zfcp_data.sr_buffer_cache)
172                 goto out_sr_cache;
173
174         zfcp_data.gid_pn_cache = zfcp_cache_create(
175                         sizeof(struct zfcp_gid_pn_data), "zfcp_gid");
176         if (!zfcp_data.gid_pn_cache)
177                 goto out_gid_cache;
178
179         zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
180
181         INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
182         sema_init(&zfcp_data.config_sema, 1);
183         rwlock_init(&zfcp_data.config_lock);
184
185         zfcp_data.scsi_transport_template =
186                 fc_attach_transport(&zfcp_transport_functions);
187         if (!zfcp_data.scsi_transport_template)
188                 goto out_transport;
189
190         retval = misc_register(&zfcp_cfdc_misc);
191         if (retval) {
192                 pr_err("zfcp: Registering the misc device zfcp_cfdc failed\n");
193                 goto out_misc;
194         }
195
196         retval = zfcp_ccw_register();
197         if (retval) {
198                 pr_err("zfcp: The zfcp device driver could not register with "
199                        "the common I/O layer\n");
200                 goto out_ccw_register;
201         }
202
203         if (zfcp_device_setup(device))
204                 zfcp_init_device_configure();
205
206         goto out;
207
208 out_ccw_register:
209         misc_deregister(&zfcp_cfdc_misc);
210 out_misc:
211         fc_release_transport(zfcp_data.scsi_transport_template);
212 out_transport:
213         kmem_cache_destroy(zfcp_data.gid_pn_cache);
214 out_gid_cache:
215         kmem_cache_destroy(zfcp_data.sr_buffer_cache);
216 out_sr_cache:
217         kmem_cache_destroy(zfcp_data.fsf_req_qtcb_cache);
218 out:
219         return retval;
220 }
221
222 module_init(zfcp_module_init);
223
224 /**
225  * zfcp_get_unit_by_lun - find unit in unit list of port by FCP LUN
226  * @port: pointer to port to search for unit
227  * @fcp_lun: FCP LUN to search for
228  *
229  * Returns: pointer to zfcp_unit or NULL
230  */
231 struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *port, u64 fcp_lun)
232 {
233         struct zfcp_unit *unit;
234
235         list_for_each_entry(unit, &port->unit_list_head, list)
236                 if ((unit->fcp_lun == fcp_lun) &&
237                     !(atomic_read(&unit->status) & ZFCP_STATUS_COMMON_REMOVE))
238                     return unit;
239         return NULL;
240 }
241
242 /**
243  * zfcp_get_port_by_wwpn - find port in port list of adapter by wwpn
244  * @adapter: pointer to adapter to search for port
245  * @wwpn: wwpn to search for
246  *
247  * Returns: pointer to zfcp_port or NULL
248  */
249 struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter,
250                                         u64 wwpn)
251 {
252         struct zfcp_port *port;
253
254         list_for_each_entry(port, &adapter->port_list_head, list)
255                 if ((port->wwpn == wwpn) && !(atomic_read(&port->status) &
256                       (ZFCP_STATUS_PORT_NO_WWPN | ZFCP_STATUS_COMMON_REMOVE)))
257                         return port;
258         return NULL;
259 }
260
261 static void zfcp_sysfs_unit_release(struct device *dev)
262 {
263         kfree(container_of(dev, struct zfcp_unit, sysfs_device));
264 }
265
266 /**
267  * zfcp_unit_enqueue - enqueue unit to unit list of a port.
268  * @port: pointer to port where unit is added
269  * @fcp_lun: FCP LUN of unit to be enqueued
270  * Returns: pointer to enqueued unit on success, ERR_PTR on error
271  * Locks: config_sema must be held to serialize changes to the unit list
272  *
273  * Sets up some unit internal structures and creates sysfs entry.
274  */
275 struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
276 {
277         struct zfcp_unit *unit;
278
279         unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL);
280         if (!unit)
281                 return ERR_PTR(-ENOMEM);
282
283         atomic_set(&unit->refcount, 0);
284         init_waitqueue_head(&unit->remove_wq);
285
286         unit->port = port;
287         unit->fcp_lun = fcp_lun;
288
289         dev_set_name(&unit->sysfs_device, "0x%016llx",
290                      (unsigned long long) fcp_lun);
291         unit->sysfs_device.parent = &port->sysfs_device;
292         unit->sysfs_device.release = zfcp_sysfs_unit_release;
293         dev_set_drvdata(&unit->sysfs_device, unit);
294
295         /* mark unit unusable as long as sysfs registration is not complete */
296         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
297
298         spin_lock_init(&unit->latencies.lock);
299         unit->latencies.write.channel.min = 0xFFFFFFFF;
300         unit->latencies.write.fabric.min = 0xFFFFFFFF;
301         unit->latencies.read.channel.min = 0xFFFFFFFF;
302         unit->latencies.read.fabric.min = 0xFFFFFFFF;
303         unit->latencies.cmd.channel.min = 0xFFFFFFFF;
304         unit->latencies.cmd.fabric.min = 0xFFFFFFFF;
305
306         read_lock_irq(&zfcp_data.config_lock);
307         if (zfcp_get_unit_by_lun(port, fcp_lun)) {
308                 read_unlock_irq(&zfcp_data.config_lock);
309                 goto err_out_free;
310         }
311         read_unlock_irq(&zfcp_data.config_lock);
312
313         if (device_register(&unit->sysfs_device))
314                 goto err_out_free;
315
316         if (sysfs_create_group(&unit->sysfs_device.kobj,
317                                &zfcp_sysfs_unit_attrs)) {
318                 device_unregister(&unit->sysfs_device);
319                 return ERR_PTR(-EIO);
320         }
321
322         zfcp_unit_get(unit);
323
324         write_lock_irq(&zfcp_data.config_lock);
325         list_add_tail(&unit->list, &port->unit_list_head);
326         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
327         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status);
328
329         write_unlock_irq(&zfcp_data.config_lock);
330
331         zfcp_port_get(port);
332
333         return unit;
334
335 err_out_free:
336         kfree(unit);
337         return ERR_PTR(-EINVAL);
338 }
339
340 /**
341  * zfcp_unit_dequeue - dequeue unit
342  * @unit: pointer to zfcp_unit
343  *
344  * waits until all work is done on unit and removes it then from the unit->list
345  * of the associated port.
346  */
347 void zfcp_unit_dequeue(struct zfcp_unit *unit)
348 {
349         wait_event(unit->remove_wq, atomic_read(&unit->refcount) == 0);
350         write_lock_irq(&zfcp_data.config_lock);
351         list_del(&unit->list);
352         write_unlock_irq(&zfcp_data.config_lock);
353         zfcp_port_put(unit->port);
354         sysfs_remove_group(&unit->sysfs_device.kobj, &zfcp_sysfs_unit_attrs);
355         device_unregister(&unit->sysfs_device);
356 }
357
358 static int zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter)
359 {
360         /* must only be called with zfcp_data.config_sema taken */
361         adapter->pool.fsf_req_erp =
362                 mempool_create_slab_pool(1, zfcp_data.fsf_req_qtcb_cache);
363         if (!adapter->pool.fsf_req_erp)
364                 return -ENOMEM;
365
366         adapter->pool.fsf_req_scsi =
367                 mempool_create_slab_pool(1, zfcp_data.fsf_req_qtcb_cache);
368         if (!adapter->pool.fsf_req_scsi)
369                 return -ENOMEM;
370
371         adapter->pool.fsf_req_abort =
372                 mempool_create_slab_pool(1, zfcp_data.fsf_req_qtcb_cache);
373         if (!adapter->pool.fsf_req_abort)
374                 return -ENOMEM;
375
376         adapter->pool.fsf_req_status_read =
377                 mempool_create_kmalloc_pool(FSF_STATUS_READS_RECOM,
378                                             sizeof(struct zfcp_fsf_req));
379         if (!adapter->pool.fsf_req_status_read)
380                 return -ENOMEM;
381
382         adapter->pool.data_status_read =
383                 mempool_create_slab_pool(FSF_STATUS_READS_RECOM,
384                                          zfcp_data.sr_buffer_cache);
385         if (!adapter->pool.data_status_read)
386                 return -ENOMEM;
387
388         adapter->pool.data_gid_pn =
389                 mempool_create_slab_pool(1, zfcp_data.gid_pn_cache);
390         if (!adapter->pool.data_gid_pn)
391                 return -ENOMEM;
392
393         return 0;
394 }
395
396 static void zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter)
397 {
398         /* zfcp_data.config_sema must be held */
399         if (adapter->pool.fsf_req_erp)
400                 mempool_destroy(adapter->pool.fsf_req_erp);
401         if (adapter->pool.fsf_req_scsi)
402                 mempool_destroy(adapter->pool.fsf_req_scsi);
403         if (adapter->pool.fsf_req_abort)
404                 mempool_destroy(adapter->pool.fsf_req_abort);
405         if (adapter->pool.fsf_req_status_read)
406                 mempool_destroy(adapter->pool.fsf_req_status_read);
407         if (adapter->pool.data_status_read)
408                 mempool_destroy(adapter->pool.data_status_read);
409         if (adapter->pool.data_gid_pn)
410                 mempool_destroy(adapter->pool.data_gid_pn);
411 }
412
413 /**
414  * zfcp_status_read_refill - refill the long running status_read_requests
415  * @adapter: ptr to struct zfcp_adapter for which the buffers should be refilled
416  *
417  * Returns: 0 on success, 1 otherwise
418  *
419  * if there are 16 or more status_read requests missing an adapter_reopen
420  * is triggered
421  */
422 int zfcp_status_read_refill(struct zfcp_adapter *adapter)
423 {
424         while (atomic_read(&adapter->stat_miss) > 0)
425                 if (zfcp_fsf_status_read(adapter)) {
426                         if (atomic_read(&adapter->stat_miss) >= 16) {
427                                 zfcp_erp_adapter_reopen(adapter, 0, 103, NULL);
428                                 return 1;
429                         }
430                         break;
431                 } else
432                         atomic_dec(&adapter->stat_miss);
433         return 0;
434 }
435
436 static void _zfcp_status_read_scheduler(struct work_struct *work)
437 {
438         zfcp_status_read_refill(container_of(work, struct zfcp_adapter,
439                                              stat_work));
440 }
441
442 static void zfcp_print_sl(struct seq_file *m, struct service_level *sl)
443 {
444         struct zfcp_adapter *adapter =
445                 container_of(sl, struct zfcp_adapter, service_level);
446
447         seq_printf(m, "zfcp: %s microcode level %x\n",
448                    dev_name(&adapter->ccw_device->dev),
449                    adapter->fsf_lic_version);
450 }
451
452 /**
453  * zfcp_adapter_enqueue - enqueue a new adapter to the list
454  * @ccw_device: pointer to the struct cc_device
455  *
456  * Returns:     0             if a new adapter was successfully enqueued
457  *              -ENOMEM       if alloc failed
458  * Enqueues an adapter at the end of the adapter list in the driver data.
459  * All adapter internal structures are set up.
460  * Proc-fs entries are also created.
461  * locks:       config_sema must be held to serialise changes to the adapter list
462  */
463 int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
464 {
465         struct zfcp_adapter *adapter;
466
467         /*
468          * Note: It is safe to release the list_lock, as any list changes
469          * are protected by the config_sema, which must be held to get here
470          */
471
472         adapter = kzalloc(sizeof(struct zfcp_adapter), GFP_KERNEL);
473         if (!adapter)
474                 return -ENOMEM;
475
476         ccw_device->handler = NULL;
477         adapter->ccw_device = ccw_device;
478         atomic_set(&adapter->refcount, 0);
479
480         if (zfcp_qdio_allocate(adapter))
481                 goto qdio_allocate_failed;
482
483         if (zfcp_allocate_low_mem_buffers(adapter))
484                 goto failed_low_mem_buffers;
485
486         if (zfcp_reqlist_alloc(adapter))
487                 goto failed_low_mem_buffers;
488
489         if (zfcp_adapter_debug_register(adapter))
490                 goto debug_register_failed;
491
492         init_waitqueue_head(&adapter->remove_wq);
493         init_waitqueue_head(&adapter->erp_thread_wqh);
494         init_waitqueue_head(&adapter->erp_done_wqh);
495
496         INIT_LIST_HEAD(&adapter->port_list_head);
497         INIT_LIST_HEAD(&adapter->erp_ready_head);
498         INIT_LIST_HEAD(&adapter->erp_running_head);
499
500         spin_lock_init(&adapter->req_list_lock);
501
502         spin_lock_init(&adapter->hba_dbf_lock);
503         spin_lock_init(&adapter->san_dbf_lock);
504         spin_lock_init(&adapter->scsi_dbf_lock);
505         spin_lock_init(&adapter->rec_dbf_lock);
506         spin_lock_init(&adapter->req_q_lock);
507
508         rwlock_init(&adapter->erp_lock);
509         rwlock_init(&adapter->abort_lock);
510
511         sema_init(&adapter->erp_ready_sem, 0);
512
513         INIT_WORK(&adapter->stat_work, _zfcp_status_read_scheduler);
514         INIT_WORK(&adapter->scan_work, _zfcp_scan_ports_later);
515
516         adapter->service_level.seq_print = zfcp_print_sl;
517
518         /* mark adapter unusable as long as sysfs registration is not complete */
519         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
520
521         dev_set_drvdata(&ccw_device->dev, adapter);
522
523         if (sysfs_create_group(&ccw_device->dev.kobj,
524                                &zfcp_sysfs_adapter_attrs))
525                 goto sysfs_failed;
526
527         write_lock_irq(&zfcp_data.config_lock);
528         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
529         list_add_tail(&adapter->list, &zfcp_data.adapter_list_head);
530         write_unlock_irq(&zfcp_data.config_lock);
531
532         zfcp_fc_nameserver_init(adapter);
533
534         return 0;
535
536 sysfs_failed:
537         zfcp_adapter_debug_unregister(adapter);
538 debug_register_failed:
539         dev_set_drvdata(&ccw_device->dev, NULL);
540         kfree(adapter->req_list);
541 failed_low_mem_buffers:
542         zfcp_free_low_mem_buffers(adapter);
543 qdio_allocate_failed:
544         zfcp_qdio_free(adapter);
545         kfree(adapter);
546         return -ENOMEM;
547 }
548
549 /**
550  * zfcp_adapter_dequeue - remove the adapter from the resource list
551  * @adapter: pointer to struct zfcp_adapter which should be removed
552  * locks:       adapter list write lock is assumed to be held by caller
553  */
554 void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
555 {
556         int retval = 0;
557         unsigned long flags;
558
559         cancel_work_sync(&adapter->scan_work);
560         cancel_work_sync(&adapter->stat_work);
561         zfcp_adapter_scsi_unregister(adapter);
562         sysfs_remove_group(&adapter->ccw_device->dev.kobj,
563                            &zfcp_sysfs_adapter_attrs);
564         dev_set_drvdata(&adapter->ccw_device->dev, NULL);
565         /* sanity check: no pending FSF requests */
566         spin_lock_irqsave(&adapter->req_list_lock, flags);
567         retval = zfcp_reqlist_isempty(adapter);
568         spin_unlock_irqrestore(&adapter->req_list_lock, flags);
569         if (!retval)
570                 return;
571
572         zfcp_adapter_debug_unregister(adapter);
573
574         /* remove specified adapter data structure from list */
575         write_lock_irq(&zfcp_data.config_lock);
576         list_del(&adapter->list);
577         write_unlock_irq(&zfcp_data.config_lock);
578
579         zfcp_qdio_free(adapter);
580
581         zfcp_free_low_mem_buffers(adapter);
582         kfree(adapter->req_list);
583         kfree(adapter->fc_stats);
584         kfree(adapter->stats_reset_data);
585         kfree(adapter);
586 }
587
588 static void zfcp_sysfs_port_release(struct device *dev)
589 {
590         kfree(container_of(dev, struct zfcp_port, sysfs_device));
591 }
592
593 /**
594  * zfcp_port_enqueue - enqueue port to port list of adapter
595  * @adapter: adapter where remote port is added
596  * @wwpn: WWPN of the remote port to be enqueued
597  * @status: initial status for the port
598  * @d_id: destination id of the remote port to be enqueued
599  * Returns: pointer to enqueued port on success, ERR_PTR on error
600  * Locks: config_sema must be held to serialize changes to the port list
601  *
602  * All port internal structures are set up and the sysfs entry is generated.
603  * d_id is used to enqueue ports with a well known address like the Directory
604  * Service for nameserver lookup.
605  */
606 struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
607                                      u32 status, u32 d_id)
608 {
609         struct zfcp_port *port;
610         int retval;
611
612         port = kzalloc(sizeof(struct zfcp_port), GFP_KERNEL);
613         if (!port)
614                 return ERR_PTR(-ENOMEM);
615
616         init_waitqueue_head(&port->remove_wq);
617         INIT_LIST_HEAD(&port->unit_list_head);
618         INIT_WORK(&port->gid_pn_work, zfcp_erp_port_strategy_open_lookup);
619
620         port->adapter = adapter;
621         port->d_id = d_id;
622         port->wwpn = wwpn;
623
624         /* mark port unusable as long as sysfs registration is not complete */
625         atomic_set_mask(status | ZFCP_STATUS_COMMON_REMOVE, &port->status);
626         atomic_set(&port->refcount, 0);
627
628         dev_set_name(&port->sysfs_device, "0x%016llx",
629                      (unsigned long long)wwpn);
630         port->sysfs_device.parent = &adapter->ccw_device->dev;
631
632         port->sysfs_device.release = zfcp_sysfs_port_release;
633         dev_set_drvdata(&port->sysfs_device, port);
634
635         read_lock_irq(&zfcp_data.config_lock);
636         if (!(status & ZFCP_STATUS_PORT_NO_WWPN))
637                 if (zfcp_get_port_by_wwpn(adapter, wwpn)) {
638                         read_unlock_irq(&zfcp_data.config_lock);
639                         goto err_out_free;
640                 }
641         read_unlock_irq(&zfcp_data.config_lock);
642
643         if (device_register(&port->sysfs_device))
644                 goto err_out_free;
645
646         retval = sysfs_create_group(&port->sysfs_device.kobj,
647                                     &zfcp_sysfs_port_attrs);
648
649         if (retval) {
650                 device_unregister(&port->sysfs_device);
651                 goto err_out;
652         }
653
654         zfcp_port_get(port);
655
656         write_lock_irq(&zfcp_data.config_lock);
657         list_add_tail(&port->list, &adapter->port_list_head);
658         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
659         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
660
661         write_unlock_irq(&zfcp_data.config_lock);
662
663         zfcp_adapter_get(adapter);
664         return port;
665
666 err_out_free:
667         kfree(port);
668 err_out:
669         return ERR_PTR(-EINVAL);
670 }
671
672 /**
673  * zfcp_port_dequeue - dequeues a port from the port list of the adapter
674  * @port: pointer to struct zfcp_port which should be removed
675  */
676 void zfcp_port_dequeue(struct zfcp_port *port)
677 {
678         wait_event(port->remove_wq, atomic_read(&port->refcount) == 0);
679         write_lock_irq(&zfcp_data.config_lock);
680         list_del(&port->list);
681         write_unlock_irq(&zfcp_data.config_lock);
682         if (port->rport)
683                 fc_remote_port_delete(port->rport);
684         port->rport = NULL;
685         zfcp_adapter_put(port->adapter);
686         sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);
687         device_unregister(&port->sysfs_device);
688 }
689
690 /**
691  * zfcp_sg_free_table - free memory used by scatterlists
692  * @sg: pointer to scatterlist
693  * @count: number of scatterlist which are to be free'ed
694  * the scatterlist are expected to reference pages always
695  */
696 void zfcp_sg_free_table(struct scatterlist *sg, int count)
697 {
698         int i;
699
700         for (i = 0; i < count; i++, sg++)
701                 if (sg)
702                         free_page((unsigned long) sg_virt(sg));
703                 else
704                         break;
705 }
706
707 /**
708  * zfcp_sg_setup_table - init scatterlist and allocate, assign buffers
709  * @sg: pointer to struct scatterlist
710  * @count: number of scatterlists which should be assigned with buffers
711  * of size page
712  *
713  * Returns: 0 on success, -ENOMEM otherwise
714  */
715 int zfcp_sg_setup_table(struct scatterlist *sg, int count)
716 {
717         void *addr;
718         int i;
719
720         sg_init_table(sg, count);
721         for (i = 0; i < count; i++, sg++) {
722                 addr = (void *) get_zeroed_page(GFP_KERNEL);
723                 if (!addr) {
724                         zfcp_sg_free_table(sg, i);
725                         return -ENOMEM;
726                 }
727                 sg_set_buf(sg, addr, PAGE_SIZE);
728         }
729         return 0;
730 }