[GFS2] Fix up merge of Linus' kernel into GFS2
[pandora-kernel.git] / drivers / s390 / scsi / zfcp_aux.c
1 /*
2  * This file is part of the zfcp device driver for
3  * FCP adapters for IBM System z9 and zSeries.
4  *
5  * (C) Copyright IBM Corp. 2002, 2006
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  */
21
22 /*
23  * Driver authors:
24  *            Martin Peschke (originator of the driver)
25  *            Raimund Schroeder
26  *            Aron Zeh
27  *            Wolfgang Taphorn
28  *            Stefan Bader
29  *            Heiko Carstens (kernel 2.6 port of the driver)
30  *            Andreas Herrmann
31  *            Maxim Shchetynin
32  *            Volker Sameske
33  *            Ralph Wuerthner
34  */
35
36 #include "zfcp_ext.h"
37
38 /* accumulated log level (module parameter) */
39 static u32 loglevel = ZFCP_LOG_LEVEL_DEFAULTS;
40 static char *device;
41 /*********************** FUNCTION PROTOTYPES *********************************/
42
43 /* written against the module interface */
44 static int __init  zfcp_module_init(void);
45
46 /* FCP related */
47 static void zfcp_ns_gid_pn_handler(unsigned long);
48
49 /* miscellaneous */
50 static inline int zfcp_sg_list_alloc(struct zfcp_sg_list *, size_t);
51 static inline void zfcp_sg_list_free(struct zfcp_sg_list *);
52 static inline int zfcp_sg_list_copy_from_user(struct zfcp_sg_list *,
53                                               void __user *, size_t);
54 static inline int zfcp_sg_list_copy_to_user(void __user *,
55                                             struct zfcp_sg_list *, size_t);
56
57 static long zfcp_cfdc_dev_ioctl(struct file *, unsigned int, unsigned long);
58
59 #define ZFCP_CFDC_IOC_MAGIC                     0xDD
60 #define ZFCP_CFDC_IOC \
61         _IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_sense_data)
62
63
64 static struct file_operations zfcp_cfdc_fops = {
65         .unlocked_ioctl = zfcp_cfdc_dev_ioctl,
66 #ifdef CONFIG_COMPAT
67         .compat_ioctl = zfcp_cfdc_dev_ioctl
68 #endif
69 };
70
71 static struct miscdevice zfcp_cfdc_misc = {
72         .minor = ZFCP_CFDC_DEV_MINOR,
73         .name = ZFCP_CFDC_DEV_NAME,
74         .fops = &zfcp_cfdc_fops
75 };
76
77 /*********************** KERNEL/MODULE PARAMETERS  ***************************/
78
79 /* declare driver module init/cleanup functions */
80 module_init(zfcp_module_init);
81
82 MODULE_AUTHOR("IBM Deutschland Entwicklung GmbH - linux390@de.ibm.com");
83 MODULE_DESCRIPTION
84     ("FCP (SCSI over Fibre Channel) HBA driver for IBM System z9 and zSeries");
85 MODULE_LICENSE("GPL");
86
87 module_param(device, charp, 0400);
88 MODULE_PARM_DESC(device, "specify initial device");
89
90 module_param(loglevel, uint, 0400);
91 MODULE_PARM_DESC(loglevel,
92                  "log levels, 8 nibbles: "
93                  "FC ERP QDIO CIO Config FSF SCSI Other, "
94                  "levels: 0=none 1=normal 2=devel 3=trace");
95
96 /****************************************************************/
97 /************** Functions without logging ***********************/
98 /****************************************************************/
99
100 void
101 _zfcp_hex_dump(char *addr, int count)
102 {
103         int i;
104         for (i = 0; i < count; i++) {
105                 printk("%02x", addr[i]);
106                 if ((i % 4) == 3)
107                         printk(" ");
108                 if ((i % 32) == 31)
109                         printk("\n");
110         }
111         if (((i-1) % 32) != 31)
112                 printk("\n");
113 }
114
115
116 /****************************************************************/
117 /****** Functions to handle the request ID hash table    ********/
118 /****************************************************************/
119
120 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_FSF
121
122 static int zfcp_reqlist_init(struct zfcp_adapter *adapter)
123 {
124         int i;
125
126         adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
127                                     GFP_KERNEL);
128
129         if (!adapter->req_list)
130                 return -ENOMEM;
131
132         for (i=0; i<REQUEST_LIST_SIZE; i++)
133                 INIT_LIST_HEAD(&adapter->req_list[i]);
134
135         return 0;
136 }
137
138 static void zfcp_reqlist_free(struct zfcp_adapter *adapter)
139 {
140         struct zfcp_fsf_req *request, *tmp;
141         unsigned int i;
142
143         for (i=0; i<REQUEST_LIST_SIZE; i++) {
144                 if (list_empty(&adapter->req_list[i]))
145                         continue;
146
147                 list_for_each_entry_safe(request, tmp,
148                                          &adapter->req_list[i], list)
149                         list_del(&request->list);
150         }
151
152         kfree(adapter->req_list);
153 }
154
155 void zfcp_reqlist_add(struct zfcp_adapter *adapter,
156                       struct zfcp_fsf_req *fsf_req)
157 {
158         unsigned int i;
159
160         i = fsf_req->req_id % REQUEST_LIST_SIZE;
161         list_add_tail(&fsf_req->list, &adapter->req_list[i]);
162 }
163
164 void zfcp_reqlist_remove(struct zfcp_adapter *adapter, unsigned long req_id)
165 {
166         struct zfcp_fsf_req *request, *tmp;
167         unsigned int i, counter;
168         u64 dbg_tmp[2];
169
170         i = req_id % REQUEST_LIST_SIZE;
171         BUG_ON(list_empty(&adapter->req_list[i]));
172
173         counter = 0;
174         list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list) {
175                 if (request->req_id == req_id) {
176                         dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active);
177                         dbg_tmp[1] = (u64) counter;
178                         debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16);
179                         list_del(&request->list);
180                         break;
181                 }
182                 counter++;
183         }
184 }
185
186 struct zfcp_fsf_req *zfcp_reqlist_ismember(struct zfcp_adapter *adapter,
187                                            unsigned long req_id)
188 {
189         struct zfcp_fsf_req *request, *tmp;
190         unsigned int i;
191
192         /* 0 is reserved as an invalid req_id */
193         if (req_id == 0)
194                 return NULL;
195
196         i = req_id % REQUEST_LIST_SIZE;
197
198         list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list)
199                 if (request->req_id == req_id)
200                         return request;
201
202         return NULL;
203 }
204
205 int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
206 {
207         unsigned int i;
208
209         for (i=0; i<REQUEST_LIST_SIZE; i++)
210                 if (!list_empty(&adapter->req_list[i]))
211                         return 0;
212
213         return 1;
214 }
215
216 #undef ZFCP_LOG_AREA
217
218 /****************************************************************/
219 /************** Uncategorised Functions *************************/
220 /****************************************************************/
221
222 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_OTHER
223
224 /**
225  * zfcp_device_setup - setup function
226  * @str: pointer to parameter string
227  *
228  * Parse "device=..." parameter string.
229  */
230 static int __init
231 zfcp_device_setup(char *devstr)
232 {
233         char *tmp, *str;
234         size_t len;
235
236         if (!devstr)
237                 return 0;
238
239         len = strlen(devstr) + 1;
240         str = (char *) kmalloc(len, GFP_KERNEL);
241         if (!str)
242                 goto err_out;
243         memcpy(str, devstr, len);
244
245         tmp = strchr(str, ',');
246         if (!tmp)
247                 goto err_out;
248         *tmp++ = '\0';
249         strncpy(zfcp_data.init_busid, str, BUS_ID_SIZE);
250         zfcp_data.init_busid[BUS_ID_SIZE-1] = '\0';
251
252         zfcp_data.init_wwpn = simple_strtoull(tmp, &tmp, 0);
253         if (*tmp++ != ',')
254                 goto err_out;
255         if (*tmp == '\0')
256                 goto err_out;
257
258         zfcp_data.init_fcp_lun = simple_strtoull(tmp, &tmp, 0);
259         if (*tmp != '\0')
260                 goto err_out;
261         kfree(str);
262         return 1;
263
264  err_out:
265         ZFCP_LOG_NORMAL("Parse error for device parameter string %s\n", str);
266         kfree(str);
267         return 0;
268 }
269
270 static void __init
271 zfcp_init_device_configure(void)
272 {
273         struct zfcp_adapter *adapter;
274         struct zfcp_port *port;
275         struct zfcp_unit *unit;
276
277         down(&zfcp_data.config_sema);
278         read_lock_irq(&zfcp_data.config_lock);
279         adapter = zfcp_get_adapter_by_busid(zfcp_data.init_busid);
280         if (adapter)
281                 zfcp_adapter_get(adapter);
282         read_unlock_irq(&zfcp_data.config_lock);
283
284         if (adapter == NULL)
285                 goto out_adapter;
286         port = zfcp_port_enqueue(adapter, zfcp_data.init_wwpn, 0, 0);
287         if (!port)
288                 goto out_port;
289         unit = zfcp_unit_enqueue(port, zfcp_data.init_fcp_lun);
290         if (!unit)
291                 goto out_unit;
292         up(&zfcp_data.config_sema);
293         ccw_device_set_online(adapter->ccw_device);
294         zfcp_erp_wait(adapter);
295         down(&zfcp_data.config_sema);
296         zfcp_unit_put(unit);
297  out_unit:
298         zfcp_port_put(port);
299  out_port:
300         zfcp_adapter_put(adapter);
301  out_adapter:
302         up(&zfcp_data.config_sema);
303         return;
304 }
305
306 static int calc_alignment(int size)
307 {
308         int align = 1;
309
310         if (!size)
311                 return 0;
312
313         while ((size - align) > 0)
314                 align <<= 1;
315
316         return align;
317 }
318
319 static int __init
320 zfcp_module_init(void)
321 {
322         int retval = -ENOMEM;
323         int size, align;
324
325         size = sizeof(struct zfcp_fsf_req_qtcb);
326         align = calc_alignment(size);
327         zfcp_data.fsf_req_qtcb_cache =
328                 kmem_cache_create("zfcp_fsf", size, align, 0, NULL, NULL);
329         if (!zfcp_data.fsf_req_qtcb_cache)
330                 goto out;
331
332         size = sizeof(struct fsf_status_read_buffer);
333         align = calc_alignment(size);
334         zfcp_data.sr_buffer_cache =
335                 kmem_cache_create("zfcp_sr", size, align, 0, NULL, NULL);
336         if (!zfcp_data.sr_buffer_cache)
337                 goto out_sr_cache;
338
339         size = sizeof(struct zfcp_gid_pn_data);
340         align = calc_alignment(size);
341         zfcp_data.gid_pn_cache =
342                 kmem_cache_create("zfcp_gid", size, align, 0, NULL, NULL);
343         if (!zfcp_data.gid_pn_cache)
344                 goto out_gid_cache;
345
346         atomic_set(&zfcp_data.loglevel, loglevel);
347
348         /* initialize adapter list */
349         INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
350
351         /* initialize adapters to be removed list head */
352         INIT_LIST_HEAD(&zfcp_data.adapter_remove_lh);
353
354         zfcp_data.scsi_transport_template =
355                 fc_attach_transport(&zfcp_transport_functions);
356         if (!zfcp_data.scsi_transport_template)
357                 goto out_transport;
358
359         retval = misc_register(&zfcp_cfdc_misc);
360         if (retval != 0) {
361                 ZFCP_LOG_INFO("registration of misc device "
362                               "zfcp_cfdc failed\n");
363                 goto out_misc;
364         }
365
366         ZFCP_LOG_TRACE("major/minor for zfcp_cfdc: %d/%d\n",
367                        ZFCP_CFDC_DEV_MAJOR, zfcp_cfdc_misc.minor);
368
369         /* Initialise proc semaphores */
370         sema_init(&zfcp_data.config_sema, 1);
371
372         /* initialise configuration rw lock */
373         rwlock_init(&zfcp_data.config_lock);
374
375         /* setup dynamic I/O */
376         retval = zfcp_ccw_register();
377         if (retval) {
378                 ZFCP_LOG_NORMAL("registration with common I/O layer failed\n");
379                 goto out_ccw_register;
380         }
381
382         if (zfcp_device_setup(device))
383                 zfcp_init_device_configure();
384
385         goto out;
386
387  out_ccw_register:
388         misc_deregister(&zfcp_cfdc_misc);
389  out_misc:
390         fc_release_transport(zfcp_data.scsi_transport_template);
391  out_transport:
392         kmem_cache_destroy(zfcp_data.gid_pn_cache);
393  out_gid_cache:
394         kmem_cache_destroy(zfcp_data.sr_buffer_cache);
395  out_sr_cache:
396         kmem_cache_destroy(zfcp_data.fsf_req_qtcb_cache);
397  out:
398         return retval;
399 }
400
401 /*
402  * function:    zfcp_cfdc_dev_ioctl
403  *
404  * purpose:     Handle control file upload/download transaction via IOCTL
405  *              interface
406  *
407  * returns:     0           - Operation completed successfuly
408  *              -ENOTTY     - Unknown IOCTL command
409  *              -EINVAL     - Invalid sense data record
410  *              -ENXIO      - The FCP adapter is not available
411  *              -EOPNOTSUPP - The FCP adapter does not have CFDC support
412  *              -ENOMEM     - Insufficient memory
413  *              -EFAULT     - User space memory I/O operation fault
414  *              -EPERM      - Cannot create or queue FSF request or create SBALs
415  *              -ERESTARTSYS- Received signal (is mapped to EAGAIN by VFS)
416  */
417 static long
418 zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
419                     unsigned long buffer)
420 {
421         struct zfcp_cfdc_sense_data *sense_data, __user *sense_data_user;
422         struct zfcp_adapter *adapter = NULL;
423         struct zfcp_fsf_req *fsf_req = NULL;
424         struct zfcp_sg_list *sg_list = NULL;
425         u32 fsf_command, option;
426         char *bus_id = NULL;
427         int retval = 0;
428
429         sense_data = kmalloc(sizeof(struct zfcp_cfdc_sense_data), GFP_KERNEL);
430         if (sense_data == NULL) {
431                 retval = -ENOMEM;
432                 goto out;
433         }
434
435         sg_list = kzalloc(sizeof(struct zfcp_sg_list), GFP_KERNEL);
436         if (sg_list == NULL) {
437                 retval = -ENOMEM;
438                 goto out;
439         }
440
441         if (command != ZFCP_CFDC_IOC) {
442                 ZFCP_LOG_INFO("IOC request code 0x%x invalid\n", command);
443                 retval = -ENOTTY;
444                 goto out;
445         }
446
447         if ((sense_data_user = (void __user *) buffer) == NULL) {
448                 ZFCP_LOG_INFO("sense data record is required\n");
449                 retval = -EINVAL;
450                 goto out;
451         }
452
453         retval = copy_from_user(sense_data, sense_data_user,
454                                 sizeof(struct zfcp_cfdc_sense_data));
455         if (retval) {
456                 retval = -EFAULT;
457                 goto out;
458         }
459
460         if (sense_data->signature != ZFCP_CFDC_SIGNATURE) {
461                 ZFCP_LOG_INFO("invalid sense data request signature 0x%08x\n",
462                               ZFCP_CFDC_SIGNATURE);
463                 retval = -EINVAL;
464                 goto out;
465         }
466
467         switch (sense_data->command) {
468
469         case ZFCP_CFDC_CMND_DOWNLOAD_NORMAL:
470                 fsf_command = FSF_QTCB_DOWNLOAD_CONTROL_FILE;
471                 option = FSF_CFDC_OPTION_NORMAL_MODE;
472                 break;
473
474         case ZFCP_CFDC_CMND_DOWNLOAD_FORCE:
475                 fsf_command = FSF_QTCB_DOWNLOAD_CONTROL_FILE;
476                 option = FSF_CFDC_OPTION_FORCE;
477                 break;
478
479         case ZFCP_CFDC_CMND_FULL_ACCESS:
480                 fsf_command = FSF_QTCB_DOWNLOAD_CONTROL_FILE;
481                 option = FSF_CFDC_OPTION_FULL_ACCESS;
482                 break;
483
484         case ZFCP_CFDC_CMND_RESTRICTED_ACCESS:
485                 fsf_command = FSF_QTCB_DOWNLOAD_CONTROL_FILE;
486                 option = FSF_CFDC_OPTION_RESTRICTED_ACCESS;
487                 break;
488
489         case ZFCP_CFDC_CMND_UPLOAD:
490                 fsf_command = FSF_QTCB_UPLOAD_CONTROL_FILE;
491                 option = 0;
492                 break;
493
494         default:
495                 ZFCP_LOG_INFO("invalid command code 0x%08x\n",
496                               sense_data->command);
497                 retval = -EINVAL;
498                 goto out;
499         }
500
501         bus_id = kmalloc(BUS_ID_SIZE, GFP_KERNEL);
502         if (bus_id == NULL) {
503                 retval = -ENOMEM;
504                 goto out;
505         }
506         snprintf(bus_id, BUS_ID_SIZE, "%d.%d.%04x",
507                 (sense_data->devno >> 24),
508                 (sense_data->devno >> 16) & 0xFF,
509                 (sense_data->devno & 0xFFFF));
510
511         read_lock_irq(&zfcp_data.config_lock);
512         adapter = zfcp_get_adapter_by_busid(bus_id);
513         if (adapter)
514                 zfcp_adapter_get(adapter);
515         read_unlock_irq(&zfcp_data.config_lock);
516
517         kfree(bus_id);
518
519         if (adapter == NULL) {
520                 ZFCP_LOG_INFO("invalid adapter\n");
521                 retval = -ENXIO;
522                 goto out;
523         }
524
525         if (sense_data->command & ZFCP_CFDC_WITH_CONTROL_FILE) {
526                 retval = zfcp_sg_list_alloc(sg_list,
527                                             ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
528                 if (retval) {
529                         retval = -ENOMEM;
530                         goto out;
531                 }
532         }
533
534         if ((sense_data->command & ZFCP_CFDC_DOWNLOAD) &&
535             (sense_data->command & ZFCP_CFDC_WITH_CONTROL_FILE)) {
536                 retval = zfcp_sg_list_copy_from_user(
537                         sg_list, &sense_data_user->control_file,
538                         ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
539                 if (retval) {
540                         retval = -EFAULT;
541                         goto out;
542                 }
543         }
544
545         retval = zfcp_fsf_control_file(adapter, &fsf_req, fsf_command,
546                                        option, sg_list);
547         if (retval)
548                 goto out;
549
550         if ((fsf_req->qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
551             (fsf_req->qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
552                 retval = -ENXIO;
553                 goto out;
554         }
555
556         sense_data->fsf_status = fsf_req->qtcb->header.fsf_status;
557         memcpy(&sense_data->fsf_status_qual,
558                &fsf_req->qtcb->header.fsf_status_qual,
559                sizeof(union fsf_status_qual));
560         memcpy(&sense_data->payloads, &fsf_req->qtcb->bottom.support.els, 256);
561
562         retval = copy_to_user(sense_data_user, sense_data,
563                 sizeof(struct zfcp_cfdc_sense_data));
564         if (retval) {
565                 retval = -EFAULT;
566                 goto out;
567         }
568
569         if (sense_data->command & ZFCP_CFDC_UPLOAD) {
570                 retval = zfcp_sg_list_copy_to_user(
571                         &sense_data_user->control_file, sg_list,
572                         ZFCP_CFDC_MAX_CONTROL_FILE_SIZE);
573                 if (retval) {
574                         retval = -EFAULT;
575                         goto out;
576                 }
577         }
578
579  out:
580         if (fsf_req != NULL)
581                 zfcp_fsf_req_free(fsf_req);
582
583         if ((adapter != NULL) && (retval != -ENXIO))
584                 zfcp_adapter_put(adapter);
585
586         if (sg_list != NULL) {
587                 zfcp_sg_list_free(sg_list);
588                 kfree(sg_list);
589         }
590
591         kfree(sense_data);
592
593         return retval;
594 }
595
596
597 /**
598  * zfcp_sg_list_alloc - create a scatter-gather list of the specified size
599  * @sg_list: structure describing a scatter gather list
600  * @size: size of scatter-gather list
601  * Return: 0 on success, else -ENOMEM
602  *
603  * In sg_list->sg a pointer to the created scatter-gather list is returned,
604  * or NULL if we run out of memory. sg_list->count specifies the number of
605  * elements of the scatter-gather list. The maximum size of a single element
606  * in the scatter-gather list is PAGE_SIZE.
607  */
608 static inline int
609 zfcp_sg_list_alloc(struct zfcp_sg_list *sg_list, size_t size)
610 {
611         struct scatterlist *sg;
612         unsigned int i;
613         int retval = 0;
614         void *address;
615
616         BUG_ON(sg_list == NULL);
617
618         sg_list->count = size >> PAGE_SHIFT;
619         if (size & ~PAGE_MASK)
620                 sg_list->count++;
621         sg_list->sg = kcalloc(sg_list->count, sizeof(struct scatterlist),
622                               GFP_KERNEL);
623         if (sg_list->sg == NULL) {
624                 sg_list->count = 0;
625                 retval = -ENOMEM;
626                 goto out;
627         }
628
629         for (i = 0, sg = sg_list->sg; i < sg_list->count; i++, sg++) {
630                 sg->length = min(size, PAGE_SIZE);
631                 sg->offset = 0;
632                 address = (void *) get_zeroed_page(GFP_KERNEL);
633                 if (address == NULL) {
634                         sg_list->count = i;
635                         zfcp_sg_list_free(sg_list);
636                         retval = -ENOMEM;
637                         goto out;
638                 }
639                 zfcp_address_to_sg(address, sg);
640                 size -= sg->length;
641         }
642
643  out:
644         return retval;
645 }
646
647
648 /**
649  * zfcp_sg_list_free - free memory of a scatter-gather list
650  * @sg_list: structure describing a scatter-gather list
651  *
652  * Memory for each element in the scatter-gather list is freed.
653  * Finally sg_list->sg is freed itself and sg_list->count is reset.
654  */
655 static inline void
656 zfcp_sg_list_free(struct zfcp_sg_list *sg_list)
657 {
658         struct scatterlist *sg;
659         unsigned int i;
660
661         BUG_ON(sg_list == NULL);
662
663         for (i = 0, sg = sg_list->sg; i < sg_list->count; i++, sg++)
664                 free_page((unsigned long) zfcp_sg_to_address(sg));
665
666         sg_list->count = 0;
667         kfree(sg_list->sg);
668 }
669
670 /**
671  * zfcp_sg_size - determine size of a scatter-gather list
672  * @sg: array of (struct scatterlist)
673  * @sg_count: elements in array
674  * Return: size of entire scatter-gather list
675  */
676 size_t
677 zfcp_sg_size(struct scatterlist *sg, unsigned int sg_count)
678 {
679         unsigned int i;
680         struct scatterlist *p;
681         size_t size;
682
683         size = 0;
684         for (i = 0, p = sg; i < sg_count; i++, p++) {
685                 BUG_ON(p == NULL);
686                 size += p->length;
687         }
688
689         return size;
690 }
691
692
693 /**
694  * zfcp_sg_list_copy_from_user -copy data from user space to scatter-gather list
695  * @sg_list: structure describing a scatter-gather list
696  * @user_buffer: pointer to buffer in user space
697  * @size: number of bytes to be copied
698  * Return: 0 on success, -EFAULT if copy_from_user fails.
699  */
700 static inline int
701 zfcp_sg_list_copy_from_user(struct zfcp_sg_list *sg_list,
702                             void __user *user_buffer,
703                             size_t size)
704 {
705         struct scatterlist *sg;
706         unsigned int length;
707         void *zfcp_buffer;
708         int retval = 0;
709
710         BUG_ON(sg_list == NULL);
711
712         if (zfcp_sg_size(sg_list->sg, sg_list->count) < size)
713                 return -EFAULT;
714
715         for (sg = sg_list->sg; size > 0; sg++) {
716                 length = min((unsigned int)size, sg->length);
717                 zfcp_buffer = zfcp_sg_to_address(sg);
718                 if (copy_from_user(zfcp_buffer, user_buffer, length)) {
719                         retval = -EFAULT;
720                         goto out;
721                 }
722                 user_buffer += length;
723                 size -= length;
724         }
725
726  out:
727         return retval;
728 }
729
730
731 /**
732  * zfcp_sg_list_copy_to_user - copy data from scatter-gather list to user space
733  * @user_buffer: pointer to buffer in user space
734  * @sg_list: structure describing a scatter-gather list
735  * @size: number of bytes to be copied
736  * Return: 0 on success, -EFAULT if copy_to_user fails
737  */
738 static inline int
739 zfcp_sg_list_copy_to_user(void __user  *user_buffer,
740                           struct zfcp_sg_list *sg_list,
741                           size_t size)
742 {
743         struct scatterlist *sg;
744         unsigned int length;
745         void *zfcp_buffer;
746         int retval = 0;
747
748         BUG_ON(sg_list == NULL);
749
750         if (zfcp_sg_size(sg_list->sg, sg_list->count) < size)
751                 return -EFAULT;
752
753         for (sg = sg_list->sg; size > 0; sg++) {
754                 length = min((unsigned int) size, sg->length);
755                 zfcp_buffer = zfcp_sg_to_address(sg);
756                 if (copy_to_user(user_buffer, zfcp_buffer, length)) {
757                         retval = -EFAULT;
758                         goto out;
759                 }
760                 user_buffer += length;
761                 size -= length;
762         }
763
764  out:
765         return retval;
766 }
767
768
769 #undef ZFCP_LOG_AREA
770
771 /****************************************************************/
772 /****** Functions for configuration/set-up of structures ********/
773 /****************************************************************/
774
775 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_CONFIG
776
777 /**
778  * zfcp_get_unit_by_lun - find unit in unit list of port by FCP LUN
779  * @port: pointer to port to search for unit
780  * @fcp_lun: FCP LUN to search for
781  * Traverse list of all units of a port and return pointer to a unit
782  * with the given FCP LUN.
783  */
784 struct zfcp_unit *
785 zfcp_get_unit_by_lun(struct zfcp_port *port, fcp_lun_t fcp_lun)
786 {
787         struct zfcp_unit *unit;
788         int found = 0;
789
790         list_for_each_entry(unit, &port->unit_list_head, list) {
791                 if ((unit->fcp_lun == fcp_lun) &&
792                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status))
793                 {
794                         found = 1;
795                         break;
796                 }
797         }
798         return found ? unit : NULL;
799 }
800
801 /**
802  * zfcp_get_port_by_wwpn - find port in port list of adapter by wwpn
803  * @adapter: pointer to adapter to search for port
804  * @wwpn: wwpn to search for
805  * Traverse list of all ports of an adapter and return pointer to a port
806  * with the given wwpn.
807  */
808 struct zfcp_port *
809 zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, wwn_t wwpn)
810 {
811         struct zfcp_port *port;
812         int found = 0;
813
814         list_for_each_entry(port, &adapter->port_list_head, list) {
815                 if ((port->wwpn == wwpn) &&
816                     !(atomic_read(&port->status) &
817                       (ZFCP_STATUS_PORT_NO_WWPN | ZFCP_STATUS_COMMON_REMOVE))) {
818                         found = 1;
819                         break;
820                 }
821         }
822         return found ? port : NULL;
823 }
824
825 /**
826  * zfcp_get_port_by_did - find port in port list of adapter by d_id
827  * @adapter: pointer to adapter to search for port
828  * @d_id: d_id to search for
829  * Traverse list of all ports of an adapter and return pointer to a port
830  * with the given d_id.
831  */
832 struct zfcp_port *
833 zfcp_get_port_by_did(struct zfcp_adapter *adapter, u32 d_id)
834 {
835         struct zfcp_port *port;
836         int found = 0;
837
838         list_for_each_entry(port, &adapter->port_list_head, list) {
839                 if ((port->d_id == d_id) &&
840                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status))
841                 {
842                         found = 1;
843                         break;
844                 }
845         }
846         return found ? port : NULL;
847 }
848
849 /**
850  * zfcp_get_adapter_by_busid - find adpater in adapter list by bus_id
851  * @bus_id: bus_id to search for
852  * Traverse list of all adapters and return pointer to an adapter
853  * with the given bus_id.
854  */
855 struct zfcp_adapter *
856 zfcp_get_adapter_by_busid(char *bus_id)
857 {
858         struct zfcp_adapter *adapter;
859         int found = 0;
860
861         list_for_each_entry(adapter, &zfcp_data.adapter_list_head, list) {
862                 if ((strncmp(bus_id, zfcp_get_busid_by_adapter(adapter),
863                              BUS_ID_SIZE) == 0) &&
864                     !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE,
865                                       &adapter->status)){
866                         found = 1;
867                         break;
868                 }
869         }
870         return found ? adapter : NULL;
871 }
872
873 /**
874  * zfcp_unit_enqueue - enqueue unit to unit list of a port.
875  * @port: pointer to port where unit is added
876  * @fcp_lun: FCP LUN of unit to be enqueued
877  * Return: pointer to enqueued unit on success, NULL on error
878  * Locks: config_sema must be held to serialize changes to the unit list
879  *
880  * Sets up some unit internal structures and creates sysfs entry.
881  */
882 struct zfcp_unit *
883 zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
884 {
885         struct zfcp_unit *unit, *tmp_unit;
886         unsigned int scsi_lun;
887         int found;
888
889         /*
890          * check that there is no unit with this FCP_LUN already in list
891          * and enqueue it.
892          * Note: Unlike for the adapter and the port, this is an error
893          */
894         read_lock_irq(&zfcp_data.config_lock);
895         unit = zfcp_get_unit_by_lun(port, fcp_lun);
896         read_unlock_irq(&zfcp_data.config_lock);
897         if (unit)
898                 return NULL;
899
900         unit = kzalloc(sizeof (struct zfcp_unit), GFP_KERNEL);
901         if (!unit)
902                 return NULL;
903
904         /* initialise reference count stuff */
905         atomic_set(&unit->refcount, 0);
906         init_waitqueue_head(&unit->remove_wq);
907
908         unit->port = port;
909         unit->fcp_lun = fcp_lun;
910
911         /* setup for sysfs registration */
912         snprintf(unit->sysfs_device.bus_id, BUS_ID_SIZE, "0x%016llx", fcp_lun);
913         unit->sysfs_device.parent = &port->sysfs_device;
914         unit->sysfs_device.release = zfcp_sysfs_unit_release;
915         dev_set_drvdata(&unit->sysfs_device, unit);
916
917         /* mark unit unusable as long as sysfs registration is not complete */
918         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
919
920         if (device_register(&unit->sysfs_device)) {
921                 kfree(unit);
922                 return NULL;
923         }
924
925         if (zfcp_sysfs_unit_create_files(&unit->sysfs_device)) {
926                 device_unregister(&unit->sysfs_device);
927                 return NULL;
928         }
929
930         zfcp_unit_get(unit);
931
932         scsi_lun = 0;
933         found = 0;
934         write_lock_irq(&zfcp_data.config_lock);
935         list_for_each_entry(tmp_unit, &port->unit_list_head, list) {
936                 if (tmp_unit->scsi_lun != scsi_lun) {
937                         found = 1;
938                         break;
939                 }
940                 scsi_lun++;
941         }
942         unit->scsi_lun = scsi_lun;
943         if (found)
944                 list_add_tail(&unit->list, &tmp_unit->list);
945         else
946                 list_add_tail(&unit->list, &port->unit_list_head);
947         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
948         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &unit->status);
949         write_unlock_irq(&zfcp_data.config_lock);
950
951         port->units++;
952         zfcp_port_get(port);
953
954         return unit;
955 }
956
957 void
958 zfcp_unit_dequeue(struct zfcp_unit *unit)
959 {
960         zfcp_unit_wait(unit);
961         write_lock_irq(&zfcp_data.config_lock);
962         list_del(&unit->list);
963         write_unlock_irq(&zfcp_data.config_lock);
964         unit->port->units--;
965         zfcp_port_put(unit->port);
966         zfcp_sysfs_unit_remove_files(&unit->sysfs_device);
967         device_unregister(&unit->sysfs_device);
968 }
969
970 /*
971  * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI
972  * commands.
973  * It also genrates fcp-nameserver request/response buffer and unsolicited 
974  * status read fsf_req buffers.
975  *
976  * locks:       must only be called with zfcp_data.config_sema taken
977  */
978 static int
979 zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter)
980 {
981         adapter->pool.fsf_req_erp =
982                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_ERP_NR,
983                                          zfcp_data.fsf_req_qtcb_cache);
984         if (!adapter->pool.fsf_req_erp)
985                 return -ENOMEM;
986
987         adapter->pool.fsf_req_scsi =
988                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_SCSI_NR,
989                                          zfcp_data.fsf_req_qtcb_cache);
990         if (!adapter->pool.fsf_req_scsi)
991                 return -ENOMEM;
992
993         adapter->pool.fsf_req_abort =
994                 mempool_create_slab_pool(ZFCP_POOL_FSF_REQ_ABORT_NR,
995                                          zfcp_data.fsf_req_qtcb_cache);
996         if (!adapter->pool.fsf_req_abort)
997                 return -ENOMEM;
998
999         adapter->pool.fsf_req_status_read =
1000                 mempool_create_kmalloc_pool(ZFCP_POOL_STATUS_READ_NR,
1001                                             sizeof(struct zfcp_fsf_req));
1002         if (!adapter->pool.fsf_req_status_read)
1003                 return -ENOMEM;
1004
1005         adapter->pool.data_status_read =
1006                 mempool_create_slab_pool(ZFCP_POOL_STATUS_READ_NR,
1007                                          zfcp_data.sr_buffer_cache);
1008         if (!adapter->pool.data_status_read)
1009                 return -ENOMEM;
1010
1011         adapter->pool.data_gid_pn =
1012                 mempool_create_slab_pool(ZFCP_POOL_DATA_GID_PN_NR,
1013                                          zfcp_data.gid_pn_cache);
1014         if (!adapter->pool.data_gid_pn)
1015                 return -ENOMEM;
1016
1017         return 0;
1018 }
1019
1020 /**
1021  * zfcp_free_low_mem_buffers - free memory pools of an adapter
1022  * @adapter: pointer to zfcp_adapter for which memory pools should be freed
1023  * locking:  zfcp_data.config_sema must be held
1024  */
1025 static void
1026 zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter)
1027 {
1028         if (adapter->pool.fsf_req_erp)
1029                 mempool_destroy(adapter->pool.fsf_req_erp);
1030         if (adapter->pool.fsf_req_scsi)
1031                 mempool_destroy(adapter->pool.fsf_req_scsi);
1032         if (adapter->pool.fsf_req_abort)
1033                 mempool_destroy(adapter->pool.fsf_req_abort);
1034         if (adapter->pool.fsf_req_status_read)
1035                 mempool_destroy(adapter->pool.fsf_req_status_read);
1036         if (adapter->pool.data_status_read)
1037                 mempool_destroy(adapter->pool.data_status_read);
1038         if (adapter->pool.data_gid_pn)
1039                 mempool_destroy(adapter->pool.data_gid_pn);
1040 }
1041
1042 void
1043 zfcp_dummy_release(struct device *dev)
1044 {
1045         return;
1046 }
1047
1048 /*
1049  * Enqueues an adapter at the end of the adapter list in the driver data.
1050  * All adapter internal structures are set up.
1051  * Proc-fs entries are also created.
1052  *
1053  * returns:     0             if a new adapter was successfully enqueued
1054  *              ZFCP_KNOWN    if an adapter with this devno was already present
1055  *              -ENOMEM       if alloc failed
1056  * locks:       config_sema must be held to serialise changes to the adapter list
1057  */
1058 struct zfcp_adapter *
1059 zfcp_adapter_enqueue(struct ccw_device *ccw_device)
1060 {
1061         int retval = 0;
1062         struct zfcp_adapter *adapter;
1063
1064         /*
1065          * Note: It is safe to release the list_lock, as any list changes 
1066          * are protected by the config_sema, which must be held to get here
1067          */
1068
1069         /* try to allocate new adapter data structure (zeroed) */
1070         adapter = kzalloc(sizeof (struct zfcp_adapter), GFP_KERNEL);
1071         if (!adapter) {
1072                 ZFCP_LOG_INFO("error: allocation of base adapter "
1073                               "structure failed\n");
1074                 goto out;
1075         }
1076
1077         ccw_device->handler = NULL;
1078
1079         /* save ccw_device pointer */
1080         adapter->ccw_device = ccw_device;
1081
1082         retval = zfcp_qdio_allocate_queues(adapter);
1083         if (retval)
1084                 goto queues_alloc_failed;
1085
1086         retval = zfcp_qdio_allocate(adapter);
1087         if (retval)
1088                 goto qdio_allocate_failed;
1089
1090         retval = zfcp_allocate_low_mem_buffers(adapter);
1091         if (retval) {
1092                 ZFCP_LOG_INFO("error: pool allocation failed\n");
1093                 goto failed_low_mem_buffers;
1094         }
1095
1096         /* initialise reference count stuff */
1097         atomic_set(&adapter->refcount, 0);
1098         init_waitqueue_head(&adapter->remove_wq);
1099
1100         /* initialise list of ports */
1101         INIT_LIST_HEAD(&adapter->port_list_head);
1102
1103         /* initialise list of ports to be removed */
1104         INIT_LIST_HEAD(&adapter->port_remove_lh);
1105
1106         /* initialize list of fsf requests */
1107         spin_lock_init(&adapter->req_list_lock);
1108         retval = zfcp_reqlist_init(adapter);
1109         if (retval) {
1110                 ZFCP_LOG_INFO("request list initialization failed\n");
1111                 goto failed_low_mem_buffers;
1112         }
1113
1114         /* initialize debug locks */
1115
1116         spin_lock_init(&adapter->erp_dbf_lock);
1117         spin_lock_init(&adapter->hba_dbf_lock);
1118         spin_lock_init(&adapter->san_dbf_lock);
1119         spin_lock_init(&adapter->scsi_dbf_lock);
1120
1121         /* initialize error recovery stuff */
1122
1123         rwlock_init(&adapter->erp_lock);
1124         sema_init(&adapter->erp_ready_sem, 0);
1125         INIT_LIST_HEAD(&adapter->erp_ready_head);
1126         INIT_LIST_HEAD(&adapter->erp_running_head);
1127
1128         /* initialize abort lock */
1129         rwlock_init(&adapter->abort_lock);
1130
1131         /* initialise some erp stuff */
1132         init_waitqueue_head(&adapter->erp_thread_wqh);
1133         init_waitqueue_head(&adapter->erp_done_wqh);
1134
1135         /* initialize lock of associated request queue */
1136         rwlock_init(&adapter->request_queue.queue_lock);
1137
1138         /* mark adapter unusable as long as sysfs registration is not complete */
1139         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
1140
1141         adapter->ccw_device = ccw_device;
1142         dev_set_drvdata(&ccw_device->dev, adapter);
1143
1144         if (zfcp_sysfs_adapter_create_files(&ccw_device->dev))
1145                 goto sysfs_failed;
1146
1147         adapter->generic_services.parent = &adapter->ccw_device->dev;
1148         adapter->generic_services.release = zfcp_dummy_release;
1149         snprintf(adapter->generic_services.bus_id, BUS_ID_SIZE,
1150                  "generic_services");
1151
1152         if (device_register(&adapter->generic_services))
1153                 goto generic_services_failed;
1154
1155         /* put allocated adapter at list tail */
1156         write_lock_irq(&zfcp_data.config_lock);
1157         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
1158         list_add_tail(&adapter->list, &zfcp_data.adapter_list_head);
1159         write_unlock_irq(&zfcp_data.config_lock);
1160
1161         zfcp_data.adapters++;
1162
1163         goto out;
1164
1165  generic_services_failed:
1166         zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
1167  sysfs_failed:
1168         dev_set_drvdata(&ccw_device->dev, NULL);
1169  failed_low_mem_buffers:
1170         zfcp_free_low_mem_buffers(adapter);
1171         if (qdio_free(ccw_device) != 0)
1172                 ZFCP_LOG_NORMAL("bug: qdio_free for adapter %s failed\n",
1173                                 zfcp_get_busid_by_adapter(adapter));
1174  qdio_allocate_failed:
1175         zfcp_qdio_free_queues(adapter);
1176  queues_alloc_failed:
1177         kfree(adapter);
1178         adapter = NULL;
1179  out:
1180         return adapter;
1181 }
1182
1183 /*
1184  * returns:     0 - struct zfcp_adapter  data structure successfully removed
1185  *              !0 - struct zfcp_adapter  data structure could not be removed
1186  *                      (e.g. still used)
1187  * locks:       adapter list write lock is assumed to be held by caller
1188  */
1189 void
1190 zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
1191 {
1192         int retval = 0;
1193         unsigned long flags;
1194
1195         device_unregister(&adapter->generic_services);
1196         zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
1197         dev_set_drvdata(&adapter->ccw_device->dev, NULL);
1198         /* sanity check: no pending FSF requests */
1199         spin_lock_irqsave(&adapter->req_list_lock, flags);
1200         retval = zfcp_reqlist_isempty(adapter);
1201         spin_unlock_irqrestore(&adapter->req_list_lock, flags);
1202         if (!retval) {
1203                 ZFCP_LOG_NORMAL("bug: adapter %s (%p) still in use, "
1204                                 "%i requests outstanding\n",
1205                                 zfcp_get_busid_by_adapter(adapter), adapter,
1206                                 atomic_read(&adapter->reqs_active));
1207                 retval = -EBUSY;
1208                 goto out;
1209         }
1210
1211         /* remove specified adapter data structure from list */
1212         write_lock_irq(&zfcp_data.config_lock);
1213         list_del(&adapter->list);
1214         write_unlock_irq(&zfcp_data.config_lock);
1215
1216         /* decrease number of adapters in list */
1217         zfcp_data.adapters--;
1218
1219         ZFCP_LOG_TRACE("adapter %s (%p) removed from list, "
1220                        "%i adapters still in list\n",
1221                        zfcp_get_busid_by_adapter(adapter),
1222                        adapter, zfcp_data.adapters);
1223
1224         retval = qdio_free(adapter->ccw_device);
1225         if (retval)
1226                 ZFCP_LOG_NORMAL("bug: qdio_free for adapter %s failed\n",
1227                                 zfcp_get_busid_by_adapter(adapter));
1228
1229         zfcp_free_low_mem_buffers(adapter);
1230         /* free memory of adapter data structure and queues */
1231         zfcp_qdio_free_queues(adapter);
1232         zfcp_reqlist_free(adapter);
1233         kfree(adapter->fc_stats);
1234         kfree(adapter->stats_reset_data);
1235         ZFCP_LOG_TRACE("freeing adapter structure\n");
1236         kfree(adapter);
1237  out:
1238         return;
1239 }
1240
1241 /**
1242  * zfcp_port_enqueue - enqueue port to port list of adapter
1243  * @adapter: adapter where remote port is added
1244  * @wwpn: WWPN of the remote port to be enqueued
1245  * @status: initial status for the port
1246  * @d_id: destination id of the remote port to be enqueued
1247  * Return: pointer to enqueued port on success, NULL on error
1248  * Locks: config_sema must be held to serialize changes to the port list
1249  *
1250  * All port internal structures are set up and the sysfs entry is generated.
1251  * d_id is used to enqueue ports with a well known address like the Directory
1252  * Service for nameserver lookup.
1253  */
1254 struct zfcp_port *
1255 zfcp_port_enqueue(struct zfcp_adapter *adapter, wwn_t wwpn, u32 status,
1256                   u32 d_id)
1257 {
1258         struct zfcp_port *port;
1259         int check_wwpn;
1260
1261         check_wwpn = !(status & ZFCP_STATUS_PORT_NO_WWPN);
1262         /*
1263          * check that there is no port with this WWPN already in list
1264          */
1265         if (check_wwpn) {
1266                 read_lock_irq(&zfcp_data.config_lock);
1267                 port = zfcp_get_port_by_wwpn(adapter, wwpn);
1268                 read_unlock_irq(&zfcp_data.config_lock);
1269                 if (port)
1270                         return NULL;
1271         }
1272
1273         port = kzalloc(sizeof (struct zfcp_port), GFP_KERNEL);
1274         if (!port)
1275                 return NULL;
1276
1277         /* initialise reference count stuff */
1278         atomic_set(&port->refcount, 0);
1279         init_waitqueue_head(&port->remove_wq);
1280
1281         INIT_LIST_HEAD(&port->unit_list_head);
1282         INIT_LIST_HEAD(&port->unit_remove_lh);
1283
1284         port->adapter = adapter;
1285
1286         if (check_wwpn)
1287                 port->wwpn = wwpn;
1288
1289         atomic_set_mask(status, &port->status);
1290
1291         /* setup for sysfs registration */
1292         if (status & ZFCP_STATUS_PORT_WKA) {
1293                 switch (d_id) {
1294                 case ZFCP_DID_DIRECTORY_SERVICE:
1295                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
1296                                  "directory");
1297                         break;
1298                 case ZFCP_DID_MANAGEMENT_SERVICE:
1299                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
1300                                  "management");
1301                         break;
1302                 case ZFCP_DID_KEY_DISTRIBUTION_SERVICE:
1303                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
1304                                  "key_distribution");
1305                         break;
1306                 case ZFCP_DID_ALIAS_SERVICE:
1307                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
1308                                  "alias");
1309                         break;
1310                 case ZFCP_DID_TIME_SERVICE:
1311                         snprintf(port->sysfs_device.bus_id, BUS_ID_SIZE,
1312                                  "time");
1313                         break;
1314                 default:
1315                         kfree(port);
1316                         return NULL;
1317                 }
1318                 port->d_id = d_id;
1319                 port->sysfs_device.parent = &adapter->generic_services;
1320         } else {
1321                 snprintf(port->sysfs_device.bus_id,
1322                          BUS_ID_SIZE, "0x%016llx", wwpn);
1323                 port->sysfs_device.parent = &adapter->ccw_device->dev;
1324         }
1325         port->sysfs_device.release = zfcp_sysfs_port_release;
1326         dev_set_drvdata(&port->sysfs_device, port);
1327
1328         /* mark port unusable as long as sysfs registration is not complete */
1329         atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
1330
1331         if (device_register(&port->sysfs_device)) {
1332                 kfree(port);
1333                 return NULL;
1334         }
1335
1336         if (zfcp_sysfs_port_create_files(&port->sysfs_device, status)) {
1337                 device_unregister(&port->sysfs_device);
1338                 return NULL;
1339         }
1340
1341         zfcp_port_get(port);
1342
1343         write_lock_irq(&zfcp_data.config_lock);
1344         list_add_tail(&port->list, &adapter->port_list_head);
1345         atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
1346         atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
1347         if (d_id == ZFCP_DID_DIRECTORY_SERVICE)
1348                 if (!adapter->nameserver_port)
1349                         adapter->nameserver_port = port;
1350         adapter->ports++;
1351         write_unlock_irq(&zfcp_data.config_lock);
1352
1353         zfcp_adapter_get(adapter);
1354
1355         return port;
1356 }
1357
1358 void
1359 zfcp_port_dequeue(struct zfcp_port *port)
1360 {
1361         zfcp_port_wait(port);
1362         write_lock_irq(&zfcp_data.config_lock);
1363         list_del(&port->list);
1364         port->adapter->ports--;
1365         write_unlock_irq(&zfcp_data.config_lock);
1366         if (port->rport)
1367                 fc_remote_port_delete(port->rport);
1368         port->rport = NULL;
1369         zfcp_adapter_put(port->adapter);
1370         zfcp_sysfs_port_remove_files(&port->sysfs_device,
1371                                      atomic_read(&port->status));
1372         device_unregister(&port->sysfs_device);
1373 }
1374
1375 /* Enqueues a nameserver port */
1376 int
1377 zfcp_nameserver_enqueue(struct zfcp_adapter *adapter)
1378 {
1379         struct zfcp_port *port;
1380
1381         port = zfcp_port_enqueue(adapter, 0, ZFCP_STATUS_PORT_WKA,
1382                                  ZFCP_DID_DIRECTORY_SERVICE);
1383         if (!port) {
1384                 ZFCP_LOG_INFO("error: enqueue of nameserver port for "
1385                               "adapter %s failed\n",
1386                               zfcp_get_busid_by_adapter(adapter));
1387                 return -ENXIO;
1388         }
1389         zfcp_port_put(port);
1390
1391         return 0;
1392 }
1393
1394 #undef ZFCP_LOG_AREA
1395
1396 /****************************************************************/
1397 /******* Fibre Channel Standard related Functions  **************/
1398 /****************************************************************/
1399
1400 #define ZFCP_LOG_AREA                   ZFCP_LOG_AREA_FC
1401
1402 void
1403 zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter,
1404                            struct fsf_status_read_buffer *status_buffer)
1405 {
1406         struct fcp_rscn_head *fcp_rscn_head;
1407         struct fcp_rscn_element *fcp_rscn_element;
1408         struct zfcp_port *port;
1409         u16 i;
1410         u16 no_entries;
1411         u32 range_mask;
1412         unsigned long flags;
1413
1414         fcp_rscn_head = (struct fcp_rscn_head *) status_buffer->payload;
1415         fcp_rscn_element = (struct fcp_rscn_element *) status_buffer->payload;
1416
1417         /* see FC-FS */
1418         no_entries = (fcp_rscn_head->payload_len / 4);
1419
1420         for (i = 1; i < no_entries; i++) {
1421                 /* skip head and start with 1st element */
1422                 fcp_rscn_element++;
1423                 switch (fcp_rscn_element->addr_format) {
1424                 case ZFCP_PORT_ADDRESS:
1425                         range_mask = ZFCP_PORTS_RANGE_PORT;
1426                         break;
1427                 case ZFCP_AREA_ADDRESS:
1428                         range_mask = ZFCP_PORTS_RANGE_AREA;
1429                         break;
1430                 case ZFCP_DOMAIN_ADDRESS:
1431                         range_mask = ZFCP_PORTS_RANGE_DOMAIN;
1432                         break;
1433                 case ZFCP_FABRIC_ADDRESS:
1434                         range_mask = ZFCP_PORTS_RANGE_FABRIC;
1435                         break;
1436                 default:
1437                         ZFCP_LOG_INFO("incoming RSCN with unknown "
1438                                       "address format\n");
1439                         continue;
1440                 }
1441                 read_lock_irqsave(&zfcp_data.config_lock, flags);
1442                 list_for_each_entry(port, &adapter->port_list_head, list) {
1443                         if (atomic_test_mask
1444                             (ZFCP_STATUS_PORT_WKA, &port->status))
1445                                 continue;
1446                         /* Do we know this port? If not skip it. */
1447                         if (!atomic_test_mask
1448                             (ZFCP_STATUS_PORT_DID_DID, &port->status)) {
1449                                 ZFCP_LOG_INFO("incoming RSCN, trying to open "
1450                                               "port 0x%016Lx\n", port->wwpn);
1451                                 zfcp_erp_port_reopen(port,
1452                                                      ZFCP_STATUS_COMMON_ERP_FAILED);
1453                                 continue;
1454                         }
1455
1456                         /*
1457                          * FIXME: race: d_id might being invalidated
1458                          * (...DID_DID reset)
1459                          */
1460                         if ((port->d_id & range_mask)
1461                             == (fcp_rscn_element->nport_did & range_mask)) {
1462                                 ZFCP_LOG_TRACE("reopen did 0x%08x\n",
1463                                                fcp_rscn_element->nport_did);
1464                                 /*
1465                                  * Unfortunately, an RSCN does not specify the
1466                                  * type of change a target underwent. We assume
1467                                  * that it makes sense to reopen the link.
1468                                  * FIXME: Shall we try to find out more about
1469                                  * the target and link state before closing it?
1470                                  * How to accomplish this? (nameserver?)
1471                                  * Where would such code be put in?
1472                                  * (inside or outside erp)
1473                                  */
1474                                 ZFCP_LOG_INFO("incoming RSCN, trying to open "
1475                                               "port 0x%016Lx\n", port->wwpn);
1476                                 zfcp_test_link(port);
1477                         }
1478                 }
1479                 read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1480         }
1481 }
1482
1483 static void
1484 zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter,
1485                             struct fsf_status_read_buffer *status_buffer)
1486 {
1487         struct fsf_plogi *els_plogi;
1488         struct zfcp_port *port;
1489         unsigned long flags;
1490
1491         els_plogi = (struct fsf_plogi *) status_buffer->payload;
1492         read_lock_irqsave(&zfcp_data.config_lock, flags);
1493         list_for_each_entry(port, &adapter->port_list_head, list) {
1494                 if (port->wwpn == (*(wwn_t *) &els_plogi->serv_param.wwpn))
1495                         break;
1496         }
1497         read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1498
1499         if (!port || (port->wwpn != (*(wwn_t *) &els_plogi->serv_param.wwpn))) {
1500                 ZFCP_LOG_DEBUG("ignored incoming PLOGI for nonexisting port "
1501                                "with d_id 0x%08x on adapter %s\n",
1502                                status_buffer->d_id,
1503                                zfcp_get_busid_by_adapter(adapter));
1504         } else {
1505                 zfcp_erp_port_forced_reopen(port, 0);
1506         }
1507 }
1508
1509 static void
1510 zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter,
1511                            struct fsf_status_read_buffer *status_buffer)
1512 {
1513         struct fcp_logo *els_logo = (struct fcp_logo *) status_buffer->payload;
1514         struct zfcp_port *port;
1515         unsigned long flags;
1516
1517         read_lock_irqsave(&zfcp_data.config_lock, flags);
1518         list_for_each_entry(port, &adapter->port_list_head, list) {
1519                 if (port->wwpn == els_logo->nport_wwpn)
1520                         break;
1521         }
1522         read_unlock_irqrestore(&zfcp_data.config_lock, flags);
1523
1524         if (!port || (port->wwpn != els_logo->nport_wwpn)) {
1525                 ZFCP_LOG_DEBUG("ignored incoming LOGO for nonexisting port "
1526                                "with d_id 0x%08x on adapter %s\n",
1527                                status_buffer->d_id,
1528                                zfcp_get_busid_by_adapter(adapter));
1529         } else {
1530                 zfcp_erp_port_forced_reopen(port, 0);
1531         }
1532 }
1533
1534 static void
1535 zfcp_fsf_incoming_els_unknown(struct zfcp_adapter *adapter,
1536                               struct fsf_status_read_buffer *status_buffer)
1537 {
1538         ZFCP_LOG_NORMAL("warning: unknown incoming ELS 0x%08x "
1539                         "for adapter %s\n", *(u32 *) (status_buffer->payload),
1540                         zfcp_get_busid_by_adapter(adapter));
1541
1542 }
1543
1544 void
1545 zfcp_fsf_incoming_els(struct zfcp_fsf_req *fsf_req)
1546 {
1547         struct fsf_status_read_buffer *status_buffer;
1548         u32 els_type;
1549         struct zfcp_adapter *adapter;
1550
1551         status_buffer = (struct fsf_status_read_buffer *) fsf_req->data;
1552         els_type = *(u32 *) (status_buffer->payload);
1553         adapter = fsf_req->adapter;
1554
1555         zfcp_san_dbf_event_incoming_els(fsf_req);
1556         if (els_type == LS_PLOGI)
1557                 zfcp_fsf_incoming_els_plogi(adapter, status_buffer);
1558         else if (els_type == LS_LOGO)
1559                 zfcp_fsf_incoming_els_logo(adapter, status_buffer);
1560         else if ((els_type & 0xffff0000) == LS_RSCN)
1561                 /* we are only concerned with the command, not the length */
1562                 zfcp_fsf_incoming_els_rscn(adapter, status_buffer);
1563         else
1564                 zfcp_fsf_incoming_els_unknown(adapter, status_buffer);
1565 }
1566
1567
1568 /**
1569  * zfcp_gid_pn_buffers_alloc - allocate buffers for GID_PN nameserver request
1570  * @gid_pn: pointer to return pointer to struct zfcp_gid_pn_data
1571  * @pool: pointer to mempool_t if non-null memory pool is used for allocation
1572  */
1573 static int
1574 zfcp_gid_pn_buffers_alloc(struct zfcp_gid_pn_data **gid_pn, mempool_t *pool)
1575 {
1576         struct zfcp_gid_pn_data *data;
1577
1578         if (pool != NULL) {
1579                 data = mempool_alloc(pool, GFP_ATOMIC);
1580                 if (likely(data != NULL)) {
1581                         data->ct.pool = pool;
1582                 }
1583         } else {
1584                 data = kmalloc(sizeof(struct zfcp_gid_pn_data), GFP_ATOMIC);
1585         }
1586
1587         if (NULL == data)
1588                 return -ENOMEM;
1589
1590         memset(data, 0, sizeof(*data));
1591         data->ct.req = &data->req;
1592         data->ct.resp = &data->resp;
1593         data->ct.req_count = data->ct.resp_count = 1;
1594         zfcp_address_to_sg(&data->ct_iu_req, &data->req);
1595         zfcp_address_to_sg(&data->ct_iu_resp, &data->resp);
1596         data->req.length = sizeof(struct ct_iu_gid_pn_req);
1597         data->resp.length = sizeof(struct ct_iu_gid_pn_resp);
1598
1599         *gid_pn = data;
1600         return 0;
1601 }
1602
1603 /**
1604  * zfcp_gid_pn_buffers_free - free buffers for GID_PN nameserver request
1605  * @gid_pn: pointer to struct zfcp_gid_pn_data which has to be freed
1606  */
1607 static void
1608 zfcp_gid_pn_buffers_free(struct zfcp_gid_pn_data *gid_pn)
1609 {
1610         if ((gid_pn->ct.pool != 0))
1611                 mempool_free(gid_pn, gid_pn->ct.pool);
1612         else
1613                 kfree(gid_pn);
1614
1615         return;
1616 }
1617
1618 /**
1619  * zfcp_ns_gid_pn_request - initiate GID_PN nameserver request
1620  * @erp_action: pointer to zfcp_erp_action where GID_PN request is needed
1621  */
1622 int
1623 zfcp_ns_gid_pn_request(struct zfcp_erp_action *erp_action)
1624 {
1625         int ret;
1626         struct ct_iu_gid_pn_req *ct_iu_req;
1627         struct zfcp_gid_pn_data *gid_pn;
1628         struct zfcp_adapter *adapter = erp_action->adapter;
1629
1630         ret = zfcp_gid_pn_buffers_alloc(&gid_pn, adapter->pool.data_gid_pn);
1631         if (ret < 0) {
1632                 ZFCP_LOG_INFO("error: buffer allocation for gid_pn nameserver "
1633                               "request failed for adapter %s\n",
1634                               zfcp_get_busid_by_adapter(adapter));
1635                 goto out;
1636         }
1637
1638         /* setup nameserver request */
1639         ct_iu_req = zfcp_sg_to_address(gid_pn->ct.req);
1640         ct_iu_req->header.revision = ZFCP_CT_REVISION;
1641         ct_iu_req->header.gs_type = ZFCP_CT_DIRECTORY_SERVICE;
1642         ct_iu_req->header.gs_subtype = ZFCP_CT_NAME_SERVER;
1643         ct_iu_req->header.options = ZFCP_CT_SYNCHRONOUS;
1644         ct_iu_req->header.cmd_rsp_code = ZFCP_CT_GID_PN;
1645         ct_iu_req->header.max_res_size = ZFCP_CT_MAX_SIZE;
1646         ct_iu_req->wwpn = erp_action->port->wwpn;
1647
1648         /* setup parameters for send generic command */
1649         gid_pn->ct.port = adapter->nameserver_port;
1650         gid_pn->ct.handler = zfcp_ns_gid_pn_handler;
1651         gid_pn->ct.handler_data = (unsigned long) gid_pn;
1652         gid_pn->ct.timeout = ZFCP_NS_GID_PN_TIMEOUT;
1653         gid_pn->port = erp_action->port;
1654
1655         ret = zfcp_fsf_send_ct(&gid_pn->ct, adapter->pool.fsf_req_erp,
1656                                erp_action);
1657         if (ret) {
1658                 ZFCP_LOG_INFO("error: initiation of gid_pn nameserver request "
1659                               "failed for adapter %s\n",
1660                               zfcp_get_busid_by_adapter(adapter));
1661
1662                 zfcp_gid_pn_buffers_free(gid_pn);
1663         }
1664
1665  out:
1666         return ret;
1667 }
1668
1669 /**
1670  * zfcp_ns_gid_pn_handler - handler for GID_PN nameserver request
1671  * @data: unsigned long, contains pointer to struct zfcp_gid_pn_data
1672  */
1673 static void zfcp_ns_gid_pn_handler(unsigned long data)
1674 {
1675         struct zfcp_port *port;
1676         struct zfcp_send_ct *ct;
1677         struct ct_iu_gid_pn_req *ct_iu_req;
1678         struct ct_iu_gid_pn_resp *ct_iu_resp;
1679         struct zfcp_gid_pn_data *gid_pn;
1680
1681
1682         gid_pn = (struct zfcp_gid_pn_data *) data;
1683         port = gid_pn->port;
1684         ct = &gid_pn->ct;
1685         ct_iu_req = zfcp_sg_to_address(ct->req);
1686         ct_iu_resp = zfcp_sg_to_address(ct->resp);
1687
1688         if (ct->status != 0)
1689                 goto failed;
1690
1691         if (zfcp_check_ct_response(&ct_iu_resp->header)) {
1692                 /* FIXME: do we need some specific erp entry points */
1693                 atomic_set_mask(ZFCP_STATUS_PORT_INVALID_WWPN, &port->status);
1694                 goto failed;
1695         }
1696         /* paranoia */
1697         if (ct_iu_req->wwpn != port->wwpn) {
1698                 ZFCP_LOG_NORMAL("bug: wwpn 0x%016Lx returned by nameserver "
1699                                 "lookup does not match expected wwpn 0x%016Lx "
1700                                 "for adapter %s\n", ct_iu_req->wwpn, port->wwpn,
1701                                 zfcp_get_busid_by_port(port));
1702                 goto mismatch;
1703         }
1704
1705         /* looks like a valid d_id */
1706         port->d_id = ct_iu_resp->d_id & ZFCP_DID_MASK;
1707         atomic_set_mask(ZFCP_STATUS_PORT_DID_DID, &port->status);
1708         ZFCP_LOG_DEBUG("adapter %s:  wwpn=0x%016Lx ---> d_id=0x%08x\n",
1709                        zfcp_get_busid_by_port(port), port->wwpn, port->d_id);
1710         goto out;
1711
1712  mismatch:
1713         ZFCP_LOG_DEBUG("CT IUs do not match:\n");
1714         ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) ct_iu_req,
1715                       sizeof(struct ct_iu_gid_pn_req));
1716         ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_DEBUG, (char *) ct_iu_resp,
1717                       sizeof(struct ct_iu_gid_pn_resp));
1718
1719  failed:
1720         ZFCP_LOG_NORMAL("warning: failed gid_pn nameserver request for wwpn "
1721                         "0x%016Lx for adapter %s\n",
1722                         port->wwpn, zfcp_get_busid_by_port(port));
1723  out:
1724         zfcp_gid_pn_buffers_free(gid_pn);
1725         return;
1726 }
1727
1728 /* reject CT_IU reason codes acc. to FC-GS-4 */
1729 static const struct zfcp_rc_entry zfcp_ct_rc[] = {
1730         {0x01, "invalid command code"},
1731         {0x02, "invalid version level"},
1732         {0x03, "logical error"},
1733         {0x04, "invalid CT_IU size"},
1734         {0x05, "logical busy"},
1735         {0x07, "protocol error"},
1736         {0x09, "unable to perform command request"},
1737         {0x0b, "command not supported"},
1738         {0x0d, "server not available"},
1739         {0x0e, "session could not be established"},
1740         {0xff, "vendor specific error"},
1741         {0, NULL},
1742 };
1743
1744 /* LS_RJT reason codes acc. to FC-FS */
1745 static const struct zfcp_rc_entry zfcp_ls_rjt_rc[] = {
1746         {0x01, "invalid LS_Command code"},
1747         {0x03, "logical error"},
1748         {0x05, "logical busy"},
1749         {0x07, "protocol error"},
1750         {0x09, "unable to perform command request"},
1751         {0x0b, "command not supported"},
1752         {0x0e, "command already in progress"},
1753         {0xff, "vendor specific error"},
1754         {0, NULL},
1755 };
1756
1757 /* reject reason codes according to FC-PH/FC-FS */
1758 static const struct zfcp_rc_entry zfcp_p_rjt_rc[] = {
1759         {0x01, "invalid D_ID"},
1760         {0x02, "invalid S_ID"},
1761         {0x03, "Nx_Port not available, temporary"},
1762         {0x04, "Nx_Port not available, permament"},
1763         {0x05, "class not supported"},
1764         {0x06, "delimiter usage error"},
1765         {0x07, "TYPE not supported"},
1766         {0x08, "invalid Link_Control"},
1767         {0x09, "invalid R_CTL field"},
1768         {0x0a, "invalid F_CTL field"},
1769         {0x0b, "invalid OX_ID"},
1770         {0x0c, "invalid RX_ID"},
1771         {0x0d, "invalid SEQ_ID"},
1772         {0x0e, "invalid DF_CTL"},
1773         {0x0f, "invalid SEQ_CNT"},
1774         {0x10, "invalid parameter field"},
1775         {0x11, "exchange error"},
1776         {0x12, "protocol error"},
1777         {0x13, "incorrect length"},
1778         {0x14, "unsupported ACK"},
1779         {0x15, "class of service not supported by entity at FFFFFE"},
1780         {0x16, "login required"},
1781         {0x17, "excessive sequences attempted"},
1782         {0x18, "unable to establish exchange"},
1783         {0x1a, "fabric path not available"},
1784         {0x1b, "invalid VC_ID (class 4)"},
1785         {0x1c, "invalid CS_CTL field"},
1786         {0x1d, "insufficient resources for VC (class 4)"},
1787         {0x1f, "invalid class of service"},
1788         {0x20, "preemption request rejected"},
1789         {0x21, "preemption not enabled"},
1790         {0x22, "multicast error"},
1791         {0x23, "multicast error terminate"},
1792         {0x24, "process login required"},
1793         {0xff, "vendor specific reject"},
1794         {0, NULL},
1795 };
1796
1797 /**
1798  * zfcp_rc_description - return description for given reaon code
1799  * @code: reason code
1800  * @rc_table: table of reason codes and descriptions
1801  */
1802 static inline const char *
1803 zfcp_rc_description(u8 code, const struct zfcp_rc_entry *rc_table)
1804 {
1805         const char *descr = "unknown reason code";
1806
1807         do {
1808                 if (code == rc_table->code) {
1809                         descr = rc_table->description;
1810                         break;
1811                 }
1812                 rc_table++;
1813         } while (rc_table->code && rc_table->description);
1814
1815         return descr;
1816 }
1817
1818 /**
1819  * zfcp_check_ct_response - evaluate reason code for CT_IU
1820  * @rjt: response payload to an CT_IU request
1821  * Return: 0 for accept CT_IU, 1 for reject CT_IU or invlid response code
1822  */
1823 int
1824 zfcp_check_ct_response(struct ct_hdr *rjt)
1825 {
1826         if (rjt->cmd_rsp_code == ZFCP_CT_ACCEPT)
1827                 return 0;
1828
1829         if (rjt->cmd_rsp_code != ZFCP_CT_REJECT) {
1830                 ZFCP_LOG_NORMAL("error: invalid Generic Service command/"
1831                                 "response code (0x%04hx)\n",
1832                                 rjt->cmd_rsp_code);
1833                 return 1;
1834         }
1835
1836         ZFCP_LOG_INFO("Generic Service command rejected\n");
1837         ZFCP_LOG_INFO("%s (0x%02x, 0x%02x, 0x%02x)\n",
1838                       zfcp_rc_description(rjt->reason_code, zfcp_ct_rc),
1839                       (u32) rjt->reason_code, (u32) rjt->reason_code_expl,
1840                       (u32) rjt->vendor_unique);
1841
1842         return 1;
1843 }
1844
1845 /**
1846  * zfcp_print_els_rjt - print reject parameter and description for ELS reject
1847  * @rjt_par: reject parameter acc. to FC-PH/FC-FS
1848  * @rc_table: table of reason codes and descriptions
1849  */
1850 static inline void
1851 zfcp_print_els_rjt(struct zfcp_ls_rjt_par *rjt_par,
1852                    const struct zfcp_rc_entry *rc_table)
1853 {
1854         ZFCP_LOG_INFO("%s (%02x %02x %02x %02x)\n",
1855                       zfcp_rc_description(rjt_par->reason_code, rc_table),
1856                       (u32) rjt_par->action, (u32) rjt_par->reason_code,
1857                       (u32) rjt_par->reason_expl, (u32) rjt_par->vendor_unique);
1858 }
1859
1860 /**
1861  * zfcp_fsf_handle_els_rjt - evaluate status qualifier/reason code on ELS reject
1862  * @sq: status qualifier word
1863  * @rjt_par: reject parameter as described in FC-PH and FC-FS
1864  * Return: -EROMTEIO for LS_RJT, -EREMCHG for invalid D_ID, -EIO else
1865  */
1866 int
1867 zfcp_handle_els_rjt(u32 sq, struct zfcp_ls_rjt_par *rjt_par)
1868 {
1869         int ret = -EIO;
1870
1871         if (sq == FSF_IOSTAT_NPORT_RJT) {
1872                 ZFCP_LOG_INFO("ELS rejected (P_RJT)\n");
1873                 zfcp_print_els_rjt(rjt_par, zfcp_p_rjt_rc);
1874                 /* invalid d_id */
1875                 if (rjt_par->reason_code == 0x01)
1876                         ret = -EREMCHG;
1877         } else if (sq == FSF_IOSTAT_FABRIC_RJT) {
1878                 ZFCP_LOG_INFO("ELS rejected (F_RJT)\n");
1879                 zfcp_print_els_rjt(rjt_par, zfcp_p_rjt_rc);
1880                 /* invalid d_id */
1881                 if (rjt_par->reason_code == 0x01)
1882                         ret = -EREMCHG;
1883         } else if (sq == FSF_IOSTAT_LS_RJT) {
1884                 ZFCP_LOG_INFO("ELS rejected (LS_RJT)\n");
1885                 zfcp_print_els_rjt(rjt_par, zfcp_ls_rjt_rc);
1886                 ret = -EREMOTEIO;
1887         } else
1888                 ZFCP_LOG_INFO("unexpected SQ: 0x%02x\n", sq);
1889
1890         return ret;
1891 }
1892
1893 /**
1894  * zfcp_plogi_evaluate - evaluate PLOGI playload and copy important fields
1895  * into zfcp_port structure
1896  * @port: zfcp_port structure
1897  * @plogi: plogi payload
1898  */
1899 void
1900 zfcp_plogi_evaluate(struct zfcp_port *port, struct fsf_plogi *plogi)
1901 {
1902         port->maxframe_size = plogi->serv_param.common_serv_param[7] |
1903                 ((plogi->serv_param.common_serv_param[6] & 0x0F) << 8);
1904         if (plogi->serv_param.class1_serv_param[0] & 0x80)
1905                 port->supported_classes |= FC_COS_CLASS1;
1906         if (plogi->serv_param.class2_serv_param[0] & 0x80)
1907                 port->supported_classes |= FC_COS_CLASS2;
1908         if (plogi->serv_param.class3_serv_param[0] & 0x80)
1909                 port->supported_classes |= FC_COS_CLASS3;
1910         if (plogi->serv_param.class4_serv_param[0] & 0x80)
1911                 port->supported_classes |= FC_COS_CLASS4;
1912 }
1913
1914 #undef ZFCP_LOG_AREA