diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 13 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 8 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 46 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 140 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 38 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 293 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.h | 30 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 7 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 47 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_unit.c | 4 |
10 files changed, 364 insertions, 262 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 90aa53fc4f3e..7507067351bd 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -891,7 +891,7 @@ zfcp_unit_dequeue(struct zfcp_unit *unit) | |||
891 | /* | 891 | /* |
892 | * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI | 892 | * Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI |
893 | * commands. | 893 | * commands. |
894 | * It also genrates fcp-nameserver request/response buffer and unsolicited | 894 | * It also genrates fcp-nameserver request/response buffer and unsolicited |
895 | * status read fsf_req buffers. | 895 | * status read fsf_req buffers. |
896 | * | 896 | * |
897 | * locks: must only be called with zfcp_data.config_sema taken | 897 | * locks: must only be called with zfcp_data.config_sema taken |
@@ -982,7 +982,7 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
982 | struct zfcp_adapter *adapter; | 982 | struct zfcp_adapter *adapter; |
983 | 983 | ||
984 | /* | 984 | /* |
985 | * Note: It is safe to release the list_lock, as any list changes | 985 | * Note: It is safe to release the list_lock, as any list changes |
986 | * are protected by the config_sema, which must be held to get here | 986 | * are protected by the config_sema, which must be held to get here |
987 | */ | 987 | */ |
988 | 988 | ||
@@ -1038,6 +1038,10 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
1038 | spin_lock_init(&adapter->san_dbf_lock); | 1038 | spin_lock_init(&adapter->san_dbf_lock); |
1039 | spin_lock_init(&adapter->scsi_dbf_lock); | 1039 | spin_lock_init(&adapter->scsi_dbf_lock); |
1040 | 1040 | ||
1041 | retval = zfcp_adapter_debug_register(adapter); | ||
1042 | if (retval) | ||
1043 | goto debug_register_failed; | ||
1044 | |||
1041 | /* initialize error recovery stuff */ | 1045 | /* initialize error recovery stuff */ |
1042 | 1046 | ||
1043 | rwlock_init(&adapter->erp_lock); | 1047 | rwlock_init(&adapter->erp_lock); |
@@ -1058,7 +1062,6 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
1058 | /* mark adapter unusable as long as sysfs registration is not complete */ | 1062 | /* mark adapter unusable as long as sysfs registration is not complete */ |
1059 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); | 1063 | atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status); |
1060 | 1064 | ||
1061 | adapter->ccw_device = ccw_device; | ||
1062 | dev_set_drvdata(&ccw_device->dev, adapter); | 1065 | dev_set_drvdata(&ccw_device->dev, adapter); |
1063 | 1066 | ||
1064 | if (zfcp_sysfs_adapter_create_files(&ccw_device->dev)) | 1067 | if (zfcp_sysfs_adapter_create_files(&ccw_device->dev)) |
@@ -1085,6 +1088,8 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
1085 | generic_services_failed: | 1088 | generic_services_failed: |
1086 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); | 1089 | zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev); |
1087 | sysfs_failed: | 1090 | sysfs_failed: |
1091 | zfcp_adapter_debug_unregister(adapter); | ||
1092 | debug_register_failed: | ||
1088 | dev_set_drvdata(&ccw_device->dev, NULL); | 1093 | dev_set_drvdata(&ccw_device->dev, NULL); |
1089 | zfcp_reqlist_free(adapter); | 1094 | zfcp_reqlist_free(adapter); |
1090 | failed_low_mem_buffers: | 1095 | failed_low_mem_buffers: |
@@ -1130,6 +1135,8 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) | |||
1130 | goto out; | 1135 | goto out; |
1131 | } | 1136 | } |
1132 | 1137 | ||
1138 | zfcp_adapter_debug_unregister(adapter); | ||
1139 | |||
1133 | /* remove specified adapter data structure from list */ | 1140 | /* remove specified adapter data structure from list */ |
1134 | write_lock_irq(&zfcp_data.config_lock); | 1141 | write_lock_irq(&zfcp_data.config_lock); |
1135 | list_del(&adapter->list); | 1142 | list_del(&adapter->list); |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index c0d1c0eb3209..e01cbf152a81 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -148,15 +148,12 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
148 | down(&zfcp_data.config_sema); | 148 | down(&zfcp_data.config_sema); |
149 | adapter = dev_get_drvdata(&ccw_device->dev); | 149 | adapter = dev_get_drvdata(&ccw_device->dev); |
150 | 150 | ||
151 | retval = zfcp_adapter_debug_register(adapter); | ||
152 | if (retval) | ||
153 | goto out; | ||
154 | retval = zfcp_erp_thread_setup(adapter); | 151 | retval = zfcp_erp_thread_setup(adapter); |
155 | if (retval) { | 152 | if (retval) { |
156 | ZFCP_LOG_INFO("error: start of error recovery thread for " | 153 | ZFCP_LOG_INFO("error: start of error recovery thread for " |
157 | "adapter %s failed\n", | 154 | "adapter %s failed\n", |
158 | zfcp_get_busid_by_adapter(adapter)); | 155 | zfcp_get_busid_by_adapter(adapter)); |
159 | goto out_erp_thread; | 156 | goto out; |
160 | } | 157 | } |
161 | 158 | ||
162 | retval = zfcp_adapter_scsi_register(adapter); | 159 | retval = zfcp_adapter_scsi_register(adapter); |
@@ -175,8 +172,6 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device) | |||
175 | 172 | ||
176 | out_scsi_register: | 173 | out_scsi_register: |
177 | zfcp_erp_thread_kill(adapter); | 174 | zfcp_erp_thread_kill(adapter); |
178 | out_erp_thread: | ||
179 | zfcp_adapter_debug_unregister(adapter); | ||
180 | out: | 175 | out: |
181 | up(&zfcp_data.config_sema); | 176 | up(&zfcp_data.config_sema); |
182 | return retval; | 177 | return retval; |
@@ -199,7 +194,6 @@ zfcp_ccw_set_offline(struct ccw_device *ccw_device) | |||
199 | zfcp_erp_adapter_shutdown(adapter, 0); | 194 | zfcp_erp_adapter_shutdown(adapter, 0); |
200 | zfcp_erp_wait(adapter); | 195 | zfcp_erp_wait(adapter); |
201 | zfcp_erp_thread_kill(adapter); | 196 | zfcp_erp_thread_kill(adapter); |
202 | zfcp_adapter_debug_unregister(adapter); | ||
203 | up(&zfcp_data.config_sema); | 197 | up(&zfcp_data.config_sema); |
204 | return 0; | 198 | return 0; |
205 | } | 199 | } |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index b36dfc40d9fa..16e5563e0c65 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -1,23 +1,23 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * This file is part of the zfcp device driver for |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * FCP adapters for IBM System z9 and zSeries. |
4 | * | 4 | * |
5 | * (C) Copyright IBM Corp. 2002, 2006 | 5 | * (C) Copyright IBM Corp. 2002, 2006 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 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 | 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) | 9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. | 10 | * any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef ZFCP_DEF_H | 22 | #ifndef ZFCP_DEF_H |
23 | #define ZFCP_DEF_H | 23 | #define ZFCP_DEF_H |
@@ -90,7 +90,7 @@ zfcp_address_to_sg(void *address, struct scatterlist *list) | |||
90 | #define ZFCP_DEVICE_TYPE 0x1732 | 90 | #define ZFCP_DEVICE_TYPE 0x1732 |
91 | #define ZFCP_DEVICE_MODEL 0x03 | 91 | #define ZFCP_DEVICE_MODEL 0x03 |
92 | #define ZFCP_DEVICE_MODEL_PRIV 0x04 | 92 | #define ZFCP_DEVICE_MODEL_PRIV 0x04 |
93 | 93 | ||
94 | /* allow as many chained SBALs as are supported by hardware */ | 94 | /* allow as many chained SBALs as are supported by hardware */ |
95 | #define ZFCP_MAX_SBALS_PER_REQ FSF_MAX_SBALS_PER_REQ | 95 | #define ZFCP_MAX_SBALS_PER_REQ FSF_MAX_SBALS_PER_REQ |
96 | #define ZFCP_MAX_SBALS_PER_CT_REQ FSF_MAX_SBALS_PER_REQ | 96 | #define ZFCP_MAX_SBALS_PER_CT_REQ FSF_MAX_SBALS_PER_REQ |
@@ -508,7 +508,7 @@ struct zfcp_rc_entry { | |||
508 | 508 | ||
509 | /* | 509 | /* |
510 | * this allows removal of logging code by the preprocessor | 510 | * this allows removal of logging code by the preprocessor |
511 | * (the most detailed log level still to be compiled in is specified, | 511 | * (the most detailed log level still to be compiled in is specified, |
512 | * higher log levels are removed) | 512 | * higher log levels are removed) |
513 | */ | 513 | */ |
514 | #define ZFCP_LOG_LEVEL_LIMIT ZFCP_LOG_LEVEL_TRACE | 514 | #define ZFCP_LOG_LEVEL_LIMIT ZFCP_LOG_LEVEL_TRACE |
@@ -546,7 +546,7 @@ do { \ | |||
546 | if (ZFCP_LOG_CHECK(level)) \ | 546 | if (ZFCP_LOG_CHECK(level)) \ |
547 | _ZFCP_LOG(fmt, ##args); \ | 547 | _ZFCP_LOG(fmt, ##args); \ |
548 | } while (0) | 548 | } while (0) |
549 | 549 | ||
550 | #if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_NORMAL | 550 | #if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_NORMAL |
551 | # define ZFCP_LOG_NORMAL(fmt, args...) do { } while (0) | 551 | # define ZFCP_LOG_NORMAL(fmt, args...) do { } while (0) |
552 | #else | 552 | #else |
@@ -583,8 +583,8 @@ do { \ | |||
583 | 583 | ||
584 | /*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/ | 584 | /*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/ |
585 | 585 | ||
586 | /* | 586 | /* |
587 | * Note, the leftmost status byte is common among adapter, port | 587 | * Note, the leftmost status byte is common among adapter, port |
588 | * and unit | 588 | * and unit |
589 | */ | 589 | */ |
590 | #define ZFCP_COMMON_FLAGS 0xfff00000 | 590 | #define ZFCP_COMMON_FLAGS 0xfff00000 |
@@ -1007,8 +1007,8 @@ struct zfcp_fsf_req { | |||
1007 | u32 fsf_command; /* FSF Command copy */ | 1007 | u32 fsf_command; /* FSF Command copy */ |
1008 | struct fsf_qtcb *qtcb; /* address of associated QTCB */ | 1008 | struct fsf_qtcb *qtcb; /* address of associated QTCB */ |
1009 | u32 seq_no; /* Sequence number of request */ | 1009 | u32 seq_no; /* Sequence number of request */ |
1010 | unsigned long data; /* private data of request */ | 1010 | unsigned long data; /* private data of request */ |
1011 | struct timer_list timer; /* used for erp or scsi er */ | 1011 | struct timer_list timer; /* used for erp or scsi er */ |
1012 | struct zfcp_erp_action *erp_action; /* used if this request is | 1012 | struct zfcp_erp_action *erp_action; /* used if this request is |
1013 | issued on behalf of erp */ | 1013 | issued on behalf of erp */ |
1014 | mempool_t *pool; /* used if request was alloacted | 1014 | mempool_t *pool; /* used if request was alloacted |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 16b4418ab257..a6475a2bb8a7 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -1,22 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * This file is part of the zfcp device driver for |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * FCP adapters for IBM System z9 and zSeries. |
4 | * | 4 | * |
5 | * (C) Copyright IBM Corp. 2002, 2006 | 5 | * (C) Copyright IBM Corp. 2002, 2006 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 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 | 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) | 9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. | 10 | * any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP | 22 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_ERP |
@@ -191,7 +191,7 @@ void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, unsigned long timeout) | |||
191 | } | 191 | } |
192 | 192 | ||
193 | /* | 193 | /* |
194 | * function: | 194 | * function: |
195 | * | 195 | * |
196 | * purpose: called if an adapter failed, | 196 | * purpose: called if an adapter failed, |
197 | * initiates adapter recovery which is done | 197 | * initiates adapter recovery which is done |
@@ -228,7 +228,7 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | /* | 230 | /* |
231 | * function: | 231 | * function: |
232 | * | 232 | * |
233 | * purpose: Wrappper for zfcp_erp_adapter_reopen_internal | 233 | * purpose: Wrappper for zfcp_erp_adapter_reopen_internal |
234 | * used to ensure the correct locking | 234 | * used to ensure the correct locking |
@@ -476,7 +476,7 @@ zfcp_test_link(struct zfcp_port *port) | |||
476 | 476 | ||
477 | 477 | ||
478 | /* | 478 | /* |
479 | * function: | 479 | * function: |
480 | * | 480 | * |
481 | * purpose: called if a port failed to be opened normally | 481 | * purpose: called if a port failed to be opened normally |
482 | * initiates Forced Reopen recovery which is done | 482 | * initiates Forced Reopen recovery which is done |
@@ -517,7 +517,7 @@ zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask) | |||
517 | } | 517 | } |
518 | 518 | ||
519 | /* | 519 | /* |
520 | * function: | 520 | * function: |
521 | * | 521 | * |
522 | * purpose: Wrappper for zfcp_erp_port_forced_reopen_internal | 522 | * purpose: Wrappper for zfcp_erp_port_forced_reopen_internal |
523 | * used to ensure the correct locking | 523 | * used to ensure the correct locking |
@@ -543,7 +543,7 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask) | |||
543 | } | 543 | } |
544 | 544 | ||
545 | /* | 545 | /* |
546 | * function: | 546 | * function: |
547 | * | 547 | * |
548 | * purpose: called if a port is to be opened | 548 | * purpose: called if a port is to be opened |
549 | * initiates Reopen recovery which is done | 549 | * initiates Reopen recovery which is done |
@@ -612,7 +612,7 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask) | |||
612 | } | 612 | } |
613 | 613 | ||
614 | /* | 614 | /* |
615 | * function: | 615 | * function: |
616 | * | 616 | * |
617 | * purpose: called if a unit is to be opened | 617 | * purpose: called if a unit is to be opened |
618 | * initiates Reopen recovery which is done | 618 | * initiates Reopen recovery which is done |
@@ -704,7 +704,7 @@ static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) | |||
704 | } | 704 | } |
705 | 705 | ||
706 | /* | 706 | /* |
707 | * function: | 707 | * function: |
708 | * | 708 | * |
709 | * purpose: disable I/O, | 709 | * purpose: disable I/O, |
710 | * return any open requests and clean them up, | 710 | * return any open requests and clean them up, |
@@ -725,7 +725,7 @@ zfcp_erp_port_block(struct zfcp_port *port, int clear_mask) | |||
725 | } | 725 | } |
726 | 726 | ||
727 | /* | 727 | /* |
728 | * function: | 728 | * function: |
729 | * | 729 | * |
730 | * purpose: enable I/O | 730 | * purpose: enable I/O |
731 | * | 731 | * |
@@ -742,7 +742,7 @@ zfcp_erp_port_unblock(struct zfcp_port *port) | |||
742 | } | 742 | } |
743 | 743 | ||
744 | /* | 744 | /* |
745 | * function: | 745 | * function: |
746 | * | 746 | * |
747 | * purpose: disable I/O, | 747 | * purpose: disable I/O, |
748 | * return any open requests and clean them up, | 748 | * return any open requests and clean them up, |
@@ -763,7 +763,7 @@ zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask) | |||
763 | } | 763 | } |
764 | 764 | ||
765 | /* | 765 | /* |
766 | * function: | 766 | * function: |
767 | * | 767 | * |
768 | * purpose: enable I/O | 768 | * purpose: enable I/O |
769 | * | 769 | * |
@@ -792,7 +792,7 @@ zfcp_erp_action_ready(struct zfcp_erp_action *erp_action) | |||
792 | } | 792 | } |
793 | 793 | ||
794 | /* | 794 | /* |
795 | * function: | 795 | * function: |
796 | * | 796 | * |
797 | * purpose: | 797 | * purpose: |
798 | * | 798 | * |
@@ -967,7 +967,7 @@ static void zfcp_erp_timeout_handler(unsigned long data) | |||
967 | * zfcp_erp_action_dismiss - dismiss an erp_action | 967 | * zfcp_erp_action_dismiss - dismiss an erp_action |
968 | * | 968 | * |
969 | * adapter->erp_lock must be held | 969 | * adapter->erp_lock must be held |
970 | * | 970 | * |
971 | * Dismissal of an erp_action is usually required if an erp_action of | 971 | * Dismissal of an erp_action is usually required if an erp_action of |
972 | * higher priority is generated. | 972 | * higher priority is generated. |
973 | */ | 973 | */ |
@@ -1005,9 +1005,9 @@ zfcp_erp_thread_setup(struct zfcp_adapter *adapter) | |||
1005 | } | 1005 | } |
1006 | 1006 | ||
1007 | /* | 1007 | /* |
1008 | * function: | 1008 | * function: |
1009 | * | 1009 | * |
1010 | * purpose: | 1010 | * purpose: |
1011 | * | 1011 | * |
1012 | * returns: | 1012 | * returns: |
1013 | * | 1013 | * |
@@ -1094,7 +1094,7 @@ zfcp_erp_thread(void *data) | |||
1094 | } | 1094 | } |
1095 | 1095 | ||
1096 | /* | 1096 | /* |
1097 | * function: | 1097 | * function: |
1098 | * | 1098 | * |
1099 | * purpose: drives single error recovery action and schedules higher and | 1099 | * purpose: drives single error recovery action and schedules higher and |
1100 | * subordinate actions, if necessary | 1100 | * subordinate actions, if necessary |
@@ -1206,7 +1206,7 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) | |||
1206 | 1206 | ||
1207 | /* | 1207 | /* |
1208 | * put this target through the erp mill again if someone has | 1208 | * put this target through the erp mill again if someone has |
1209 | * requested to change the status of a target being online | 1209 | * requested to change the status of a target being online |
1210 | * to offline or the other way around | 1210 | * to offline or the other way around |
1211 | * (old retval is preserved if nothing has to be done here) | 1211 | * (old retval is preserved if nothing has to be done here) |
1212 | */ | 1212 | */ |
@@ -1228,7 +1228,7 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) | |||
1228 | unlock: | 1228 | unlock: |
1229 | write_unlock(&adapter->erp_lock); | 1229 | write_unlock(&adapter->erp_lock); |
1230 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 1230 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); |
1231 | 1231 | ||
1232 | if (retval != ZFCP_ERP_CONTINUES) | 1232 | if (retval != ZFCP_ERP_CONTINUES) |
1233 | zfcp_erp_action_cleanup(action, adapter, port, unit, retval); | 1233 | zfcp_erp_action_cleanup(action, adapter, port, unit, retval); |
1234 | 1234 | ||
@@ -1250,9 +1250,9 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) | |||
1250 | } | 1250 | } |
1251 | 1251 | ||
1252 | /* | 1252 | /* |
1253 | * function: | 1253 | * function: |
1254 | * | 1254 | * |
1255 | * purpose: | 1255 | * purpose: |
1256 | * | 1256 | * |
1257 | * returns: ZFCP_ERP_DISMISSED - if action has been dismissed | 1257 | * returns: ZFCP_ERP_DISMISSED - if action has been dismissed |
1258 | * retval - otherwise | 1258 | * retval - otherwise |
@@ -1322,7 +1322,7 @@ zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action) | |||
1322 | } | 1322 | } |
1323 | 1323 | ||
1324 | /* | 1324 | /* |
1325 | * function: | 1325 | * function: |
1326 | * | 1326 | * |
1327 | * purpose: triggers retry of this action after a certain amount of time | 1327 | * purpose: triggers retry of this action after a certain amount of time |
1328 | * by means of timer provided by erp_action | 1328 | * by means of timer provided by erp_action |
@@ -1346,7 +1346,7 @@ zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) | |||
1346 | return retval; | 1346 | return retval; |
1347 | } | 1347 | } |
1348 | 1348 | ||
1349 | /* | 1349 | /* |
1350 | * function: zfcp_erp_adapter_failed | 1350 | * function: zfcp_erp_adapter_failed |
1351 | * | 1351 | * |
1352 | * purpose: sets the adapter and all underlying devices to ERP_FAILED | 1352 | * purpose: sets the adapter and all underlying devices to ERP_FAILED |
@@ -1362,7 +1362,7 @@ zfcp_erp_adapter_failed(struct zfcp_adapter *adapter) | |||
1362 | debug_text_event(adapter->erp_dbf, 2, "a_afail"); | 1362 | debug_text_event(adapter->erp_dbf, 2, "a_afail"); |
1363 | } | 1363 | } |
1364 | 1364 | ||
1365 | /* | 1365 | /* |
1366 | * function: zfcp_erp_port_failed | 1366 | * function: zfcp_erp_port_failed |
1367 | * | 1367 | * |
1368 | * purpose: sets the port and all underlying devices to ERP_FAILED | 1368 | * purpose: sets the port and all underlying devices to ERP_FAILED |
@@ -1386,7 +1386,7 @@ zfcp_erp_port_failed(struct zfcp_port *port) | |||
1386 | debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t)); | 1386 | debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t)); |
1387 | } | 1387 | } |
1388 | 1388 | ||
1389 | /* | 1389 | /* |
1390 | * function: zfcp_erp_unit_failed | 1390 | * function: zfcp_erp_unit_failed |
1391 | * | 1391 | * |
1392 | * purpose: sets the unit to ERP_FAILED | 1392 | * purpose: sets the unit to ERP_FAILED |
@@ -1417,7 +1417,7 @@ zfcp_erp_unit_failed(struct zfcp_unit *unit) | |||
1417 | * successfully is reset. | 1417 | * successfully is reset. |
1418 | * | 1418 | * |
1419 | * returns: ZFCP_ERP_CONTINUES - action continues (not considered) | 1419 | * returns: ZFCP_ERP_CONTINUES - action continues (not considered) |
1420 | * ZFCP_ERP_SUCCEEDED - action finished successfully | 1420 | * ZFCP_ERP_SUCCEEDED - action finished successfully |
1421 | * ZFCP_ERP_EXIT - action failed and will not continue | 1421 | * ZFCP_ERP_EXIT - action failed and will not continue |
1422 | */ | 1422 | */ |
1423 | static int | 1423 | static int |
@@ -1646,7 +1646,7 @@ zfcp_erp_schedule_work(struct zfcp_unit *unit) | |||
1646 | } | 1646 | } |
1647 | 1647 | ||
1648 | /* | 1648 | /* |
1649 | * function: | 1649 | * function: |
1650 | * | 1650 | * |
1651 | * purpose: remaining things in good cases, | 1651 | * purpose: remaining things in good cases, |
1652 | * escalation in bad cases | 1652 | * escalation in bad cases |
@@ -1687,8 +1687,8 @@ zfcp_erp_strategy_followup_actions(int action, | |||
1687 | break; | 1687 | break; |
1688 | 1688 | ||
1689 | case ZFCP_ERP_ACTION_REOPEN_UNIT: | 1689 | case ZFCP_ERP_ACTION_REOPEN_UNIT: |
1690 | if (status == ZFCP_ERP_SUCCEEDED) ; /* no further action */ | 1690 | /* Nothing to do if status == ZFCP_ERP_SUCCEEDED */ |
1691 | else | 1691 | if (status != ZFCP_ERP_SUCCEEDED) |
1692 | zfcp_erp_port_reopen_internal(unit->port, 0); | 1692 | zfcp_erp_port_reopen_internal(unit->port, 0); |
1693 | break; | 1693 | break; |
1694 | } | 1694 | } |
@@ -1815,7 +1815,7 @@ zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear) | |||
1815 | } | 1815 | } |
1816 | 1816 | ||
1817 | /* | 1817 | /* |
1818 | * function: | 1818 | * function: |
1819 | * | 1819 | * |
1820 | * purpose: Wrappper for zfcp_erp_port_reopen_all_internal | 1820 | * purpose: Wrappper for zfcp_erp_port_reopen_all_internal |
1821 | * used to ensure the correct locking | 1821 | * used to ensure the correct locking |
@@ -1852,9 +1852,9 @@ zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask) | |||
1852 | } | 1852 | } |
1853 | 1853 | ||
1854 | /* | 1854 | /* |
1855 | * function: | 1855 | * function: |
1856 | * | 1856 | * |
1857 | * purpose: | 1857 | * purpose: |
1858 | * | 1858 | * |
1859 | * returns: FIXME | 1859 | * returns: FIXME |
1860 | */ | 1860 | */ |
@@ -1871,7 +1871,7 @@ zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, int clear_mask) | |||
1871 | } | 1871 | } |
1872 | 1872 | ||
1873 | /* | 1873 | /* |
1874 | * function: | 1874 | * function: |
1875 | * | 1875 | * |
1876 | * purpose: this routine executes the 'Reopen Adapter' action | 1876 | * purpose: this routine executes the 'Reopen Adapter' action |
1877 | * (the entire action is processed synchronously, since | 1877 | * (the entire action is processed synchronously, since |
@@ -1908,9 +1908,9 @@ zfcp_erp_adapter_strategy(struct zfcp_erp_action *erp_action) | |||
1908 | } | 1908 | } |
1909 | 1909 | ||
1910 | /* | 1910 | /* |
1911 | * function: | 1911 | * function: |
1912 | * | 1912 | * |
1913 | * purpose: | 1913 | * purpose: |
1914 | * | 1914 | * |
1915 | * returns: ZFCP_ERP_SUCCEEDED - action finished successfully | 1915 | * returns: ZFCP_ERP_SUCCEEDED - action finished successfully |
1916 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 1916 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -1930,9 +1930,9 @@ zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *erp_action) | |||
1930 | } | 1930 | } |
1931 | 1931 | ||
1932 | /* | 1932 | /* |
1933 | * function: | 1933 | * function: |
1934 | * | 1934 | * |
1935 | * purpose: | 1935 | * purpose: |
1936 | * | 1936 | * |
1937 | * returns: ZFCP_ERP_SUCCEEDED - action finished successfully | 1937 | * returns: ZFCP_ERP_SUCCEEDED - action finished successfully |
1938 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 1938 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -1957,7 +1957,7 @@ zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *erp_action) | |||
1957 | * purpose: allocate the irq associated with this devno and register | 1957 | * purpose: allocate the irq associated with this devno and register |
1958 | * the FSF adapter with the SCSI stack | 1958 | * the FSF adapter with the SCSI stack |
1959 | * | 1959 | * |
1960 | * returns: | 1960 | * returns: |
1961 | */ | 1961 | */ |
1962 | static int | 1962 | static int |
1963 | zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *erp_action, int close) | 1963 | zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *erp_action, int close) |
@@ -2197,7 +2197,7 @@ zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) | |||
2197 | zfcp_erp_action_to_running(erp_action); | 2197 | zfcp_erp_action_to_running(erp_action); |
2198 | write_unlock_irq(&adapter->erp_lock); | 2198 | write_unlock_irq(&adapter->erp_lock); |
2199 | 2199 | ||
2200 | ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); | 2200 | ret = zfcp_fsf_exchange_port_data(erp_action); |
2201 | if (ret == -EOPNOTSUPP) { | 2201 | if (ret == -EOPNOTSUPP) { |
2202 | debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); | 2202 | debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); |
2203 | return ZFCP_ERP_SUCCEEDED; | 2203 | return ZFCP_ERP_SUCCEEDED; |
@@ -2249,7 +2249,7 @@ zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action | |||
2249 | } | 2249 | } |
2250 | 2250 | ||
2251 | /* | 2251 | /* |
2252 | * function: | 2252 | * function: |
2253 | * | 2253 | * |
2254 | * purpose: this routine executes the 'Reopen Physical Port' action | 2254 | * purpose: this routine executes the 'Reopen Physical Port' action |
2255 | * | 2255 | * |
@@ -2308,7 +2308,7 @@ zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action) | |||
2308 | } | 2308 | } |
2309 | 2309 | ||
2310 | /* | 2310 | /* |
2311 | * function: | 2311 | * function: |
2312 | * | 2312 | * |
2313 | * purpose: this routine executes the 'Reopen Port' action | 2313 | * purpose: this routine executes the 'Reopen Port' action |
2314 | * | 2314 | * |
@@ -2530,7 +2530,7 @@ zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *erp_action) | |||
2530 | } | 2530 | } |
2531 | 2531 | ||
2532 | /* | 2532 | /* |
2533 | * function: | 2533 | * function: |
2534 | * | 2534 | * |
2535 | * purpose: makes the erp thread continue with reopen (physical) port | 2535 | * purpose: makes the erp thread continue with reopen (physical) port |
2536 | * actions which have been paused until the name server port | 2536 | * actions which have been paused until the name server port |
@@ -2570,9 +2570,9 @@ zfcp_erp_port_strategy_open_nameserver_wakeup(struct zfcp_erp_action | |||
2570 | } | 2570 | } |
2571 | 2571 | ||
2572 | /* | 2572 | /* |
2573 | * function: | 2573 | * function: |
2574 | * | 2574 | * |
2575 | * purpose: | 2575 | * purpose: |
2576 | * | 2576 | * |
2577 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2577 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2578 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2578 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2626,9 +2626,9 @@ zfcp_erp_port_strategy_clearstati(struct zfcp_port *port) | |||
2626 | } | 2626 | } |
2627 | 2627 | ||
2628 | /* | 2628 | /* |
2629 | * function: | 2629 | * function: |
2630 | * | 2630 | * |
2631 | * purpose: | 2631 | * purpose: |
2632 | * | 2632 | * |
2633 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2633 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2634 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2634 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2663,9 +2663,9 @@ zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action) | |||
2663 | } | 2663 | } |
2664 | 2664 | ||
2665 | /* | 2665 | /* |
2666 | * function: | 2666 | * function: |
2667 | * | 2667 | * |
2668 | * purpose: | 2668 | * purpose: |
2669 | * | 2669 | * |
2670 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2670 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2671 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2671 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2700,9 +2700,9 @@ zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action) | |||
2700 | } | 2700 | } |
2701 | 2701 | ||
2702 | /* | 2702 | /* |
2703 | * function: | 2703 | * function: |
2704 | * | 2704 | * |
2705 | * purpose: | 2705 | * purpose: |
2706 | * | 2706 | * |
2707 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2707 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2708 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2708 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2737,7 +2737,7 @@ zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *erp_action) | |||
2737 | } | 2737 | } |
2738 | 2738 | ||
2739 | /* | 2739 | /* |
2740 | * function: | 2740 | * function: |
2741 | * | 2741 | * |
2742 | * purpose: this routine executes the 'Reopen Unit' action | 2742 | * purpose: this routine executes the 'Reopen Unit' action |
2743 | * currently no retries | 2743 | * currently no retries |
@@ -2825,9 +2825,9 @@ zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit) | |||
2825 | } | 2825 | } |
2826 | 2826 | ||
2827 | /* | 2827 | /* |
2828 | * function: | 2828 | * function: |
2829 | * | 2829 | * |
2830 | * purpose: | 2830 | * purpose: |
2831 | * | 2831 | * |
2832 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2832 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2833 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2833 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2865,9 +2865,9 @@ zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action) | |||
2865 | } | 2865 | } |
2866 | 2866 | ||
2867 | /* | 2867 | /* |
2868 | * function: | 2868 | * function: |
2869 | * | 2869 | * |
2870 | * purpose: | 2870 | * purpose: |
2871 | * | 2871 | * |
2872 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) | 2872 | * returns: ZFCP_ERP_CONTINUES - action continues (asynchronously) |
2873 | * ZFCP_ERP_FAILED - action finished unsuccessfully | 2873 | * ZFCP_ERP_FAILED - action finished unsuccessfully |
@@ -2913,7 +2913,7 @@ void zfcp_erp_start_timer(struct zfcp_fsf_req *fsf_req) | |||
2913 | } | 2913 | } |
2914 | 2914 | ||
2915 | /* | 2915 | /* |
2916 | * function: | 2916 | * function: |
2917 | * | 2917 | * |
2918 | * purpose: enqueue the specified error recovery action, if needed | 2918 | * purpose: enqueue the specified error recovery action, if needed |
2919 | * | 2919 | * |
@@ -2992,7 +2992,7 @@ zfcp_erp_action_enqueue(int action, | |||
2992 | port->erp_action.action); | 2992 | port->erp_action.action); |
2993 | debug_text_event(adapter->erp_dbf, 4, | 2993 | debug_text_event(adapter->erp_dbf, 4, |
2994 | "pf_actenq_drp"); | 2994 | "pf_actenq_drp"); |
2995 | } else | 2995 | } else |
2996 | debug_text_event(adapter->erp_dbf, 4, | 2996 | debug_text_event(adapter->erp_dbf, 4, |
2997 | "pf_actenq_drpcp"); | 2997 | "pf_actenq_drpcp"); |
2998 | debug_event(adapter->erp_dbf, 4, &port->wwpn, | 2998 | debug_event(adapter->erp_dbf, 4, &port->wwpn, |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 991d45667a44..8534cf09546c 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -1,22 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * This file is part of the zfcp device driver for |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * FCP adapters for IBM System z9 and zSeries. |
4 | * | 4 | * |
5 | * (C) Copyright IBM Corp. 2002, 2006 | 5 | * (C) Copyright IBM Corp. 2002, 2006 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 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 | 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) | 9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. | 10 | * any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef ZFCP_EXT_H | 22 | #ifndef ZFCP_EXT_H |
@@ -82,9 +82,11 @@ extern int zfcp_fsf_open_unit(struct zfcp_erp_action *); | |||
82 | extern int zfcp_fsf_close_unit(struct zfcp_erp_action *); | 82 | extern int zfcp_fsf_close_unit(struct zfcp_erp_action *); |
83 | 83 | ||
84 | extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *); | 84 | extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *); |
85 | extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *, | 85 | extern int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *, |
86 | struct zfcp_adapter *, | 86 | struct fsf_qtcb_bottom_config *); |
87 | struct fsf_qtcb_bottom_port *); | 87 | extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *); |
88 | extern int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *, | ||
89 | struct fsf_qtcb_bottom_port *); | ||
88 | extern int zfcp_fsf_control_file(struct zfcp_adapter *, struct zfcp_fsf_req **, | 90 | extern int zfcp_fsf_control_file(struct zfcp_adapter *, struct zfcp_fsf_req **, |
89 | u32, u32, struct zfcp_sg_list *); | 91 | u32, u32, struct zfcp_sg_list *); |
90 | extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long); | 92 | extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 99299976e891..ff866ebd44ac 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -80,10 +80,10 @@ static const char zfcp_act_subtable_type[5][8] = { | |||
80 | /* | 80 | /* |
81 | * function: zfcp_fsf_req_alloc | 81 | * function: zfcp_fsf_req_alloc |
82 | * | 82 | * |
83 | * purpose: Obtains an fsf_req and potentially a qtcb (for all but | 83 | * purpose: Obtains an fsf_req and potentially a qtcb (for all but |
84 | * unsolicited requests) via helper functions | 84 | * unsolicited requests) via helper functions |
85 | * Does some initial fsf request set-up. | 85 | * Does some initial fsf request set-up. |
86 | * | 86 | * |
87 | * returns: pointer to allocated fsf_req if successfull | 87 | * returns: pointer to allocated fsf_req if successfull |
88 | * NULL otherwise | 88 | * NULL otherwise |
89 | * | 89 | * |
@@ -192,7 +192,7 @@ void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | |||
192 | * returns: 0 - success | 192 | * returns: 0 - success |
193 | * !0 - failure | 193 | * !0 - failure |
194 | * | 194 | * |
195 | * context: | 195 | * context: |
196 | */ | 196 | */ |
197 | int | 197 | int |
198 | zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) | 198 | zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) |
@@ -214,8 +214,8 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) | |||
214 | } | 214 | } |
215 | 215 | ||
216 | /* | 216 | /* |
217 | * fsf_req may be deleted due to waking up functions, so | 217 | * fsf_req may be deleted due to waking up functions, so |
218 | * cleanup is saved here and used later | 218 | * cleanup is saved here and used later |
219 | */ | 219 | */ |
220 | if (likely(fsf_req->status & ZFCP_STATUS_FSFREQ_CLEANUP)) | 220 | if (likely(fsf_req->status & ZFCP_STATUS_FSFREQ_CLEANUP)) |
221 | cleanup = 1; | 221 | cleanup = 1; |
@@ -259,9 +259,9 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) | |||
259 | * and initiates appropriate actions | 259 | * and initiates appropriate actions |
260 | * (usually calling FSF command specific handlers) | 260 | * (usually calling FSF command specific handlers) |
261 | * | 261 | * |
262 | * returns: | 262 | * returns: |
263 | * | 263 | * |
264 | * context: | 264 | * context: |
265 | * | 265 | * |
266 | * locks: | 266 | * locks: |
267 | */ | 267 | */ |
@@ -638,7 +638,7 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | |||
638 | * | 638 | * |
639 | * purpose: calls the appropriate command specific handler | 639 | * purpose: calls the appropriate command specific handler |
640 | * | 640 | * |
641 | * returns: | 641 | * returns: |
642 | */ | 642 | */ |
643 | static int | 643 | static int |
644 | zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req) | 644 | zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req) |
@@ -854,7 +854,7 @@ zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *fsf_req) | |||
854 | * | 854 | * |
855 | * purpose: is called for finished Open Port command | 855 | * purpose: is called for finished Open Port command |
856 | * | 856 | * |
857 | * returns: | 857 | * returns: |
858 | */ | 858 | */ |
859 | static int | 859 | static int |
860 | zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | 860 | zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) |
@@ -1088,7 +1088,7 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
1088 | * returns: address of initiated FSF request | 1088 | * returns: address of initiated FSF request |
1089 | * NULL - request could not be initiated | 1089 | * NULL - request could not be initiated |
1090 | * | 1090 | * |
1091 | * FIXME(design): should be watched by a timeout !!! | 1091 | * FIXME(design): should be watched by a timeout !!! |
1092 | * FIXME(design) shouldn't this be modified to return an int | 1092 | * FIXME(design) shouldn't this be modified to return an int |
1093 | * also...don't know how though | 1093 | * also...don't know how though |
1094 | */ | 1094 | */ |
@@ -1157,7 +1157,7 @@ zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
1157 | * | 1157 | * |
1158 | * purpose: is called for finished Abort FCP Command request | 1158 | * purpose: is called for finished Abort FCP Command request |
1159 | * | 1159 | * |
1160 | * returns: | 1160 | * returns: |
1161 | */ | 1161 | */ |
1162 | static int | 1162 | static int |
1163 | zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) | 1163 | zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) |
@@ -1941,25 +1941,28 @@ zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
1941 | { | 1941 | { |
1942 | volatile struct qdio_buffer_element *sbale; | 1942 | volatile struct qdio_buffer_element *sbale; |
1943 | struct zfcp_fsf_req *fsf_req; | 1943 | struct zfcp_fsf_req *fsf_req; |
1944 | struct zfcp_adapter *adapter = erp_action->adapter; | ||
1944 | unsigned long lock_flags; | 1945 | unsigned long lock_flags; |
1945 | int retval = 0; | 1946 | int retval; |
1946 | 1947 | ||
1947 | /* setup new FSF request */ | 1948 | /* setup new FSF request */ |
1948 | retval = zfcp_fsf_req_create(erp_action->adapter, | 1949 | retval = zfcp_fsf_req_create(adapter, |
1949 | FSF_QTCB_EXCHANGE_CONFIG_DATA, | 1950 | FSF_QTCB_EXCHANGE_CONFIG_DATA, |
1950 | ZFCP_REQ_AUTO_CLEANUP, | 1951 | ZFCP_REQ_AUTO_CLEANUP, |
1951 | erp_action->adapter->pool.fsf_req_erp, | 1952 | adapter->pool.fsf_req_erp, |
1952 | &lock_flags, &fsf_req); | 1953 | &lock_flags, &fsf_req); |
1953 | if (retval < 0) { | 1954 | if (retval) { |
1954 | ZFCP_LOG_INFO("error: Could not create exchange configuration " | 1955 | ZFCP_LOG_INFO("error: Could not create exchange configuration " |
1955 | "data request for adapter %s.\n", | 1956 | "data request for adapter %s.\n", |
1956 | zfcp_get_busid_by_adapter(erp_action->adapter)); | 1957 | zfcp_get_busid_by_adapter(adapter)); |
1957 | goto out; | 1958 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, |
1959 | lock_flags); | ||
1960 | return retval; | ||
1958 | } | 1961 | } |
1959 | 1962 | ||
1960 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); | 1963 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); |
1961 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | 1964 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; |
1962 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | 1965 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; |
1963 | 1966 | ||
1964 | fsf_req->qtcb->bottom.config.feature_selection = | 1967 | fsf_req->qtcb->bottom.config.feature_selection = |
1965 | FSF_FEATURE_CFDC | | 1968 | FSF_FEATURE_CFDC | |
@@ -1971,23 +1974,71 @@ zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
1971 | 1974 | ||
1972 | zfcp_erp_start_timer(fsf_req); | 1975 | zfcp_erp_start_timer(fsf_req); |
1973 | retval = zfcp_fsf_req_send(fsf_req); | 1976 | retval = zfcp_fsf_req_send(fsf_req); |
1977 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, | ||
1978 | lock_flags); | ||
1974 | if (retval) { | 1979 | if (retval) { |
1975 | ZFCP_LOG_INFO | 1980 | ZFCP_LOG_INFO("error: Could not send exchange configuration " |
1976 | ("error: Could not send exchange configuration data " | 1981 | "data command on the adapter %s\n", |
1977 | "command on the adapter %s\n", | 1982 | zfcp_get_busid_by_adapter(adapter)); |
1978 | zfcp_get_busid_by_adapter(erp_action->adapter)); | ||
1979 | zfcp_fsf_req_free(fsf_req); | 1983 | zfcp_fsf_req_free(fsf_req); |
1980 | erp_action->fsf_req = NULL; | 1984 | erp_action->fsf_req = NULL; |
1981 | goto out; | ||
1982 | } | 1985 | } |
1986 | else | ||
1987 | ZFCP_LOG_DEBUG("exchange configuration data request initiated " | ||
1988 | "(adapter %s)\n", | ||
1989 | zfcp_get_busid_by_adapter(adapter)); | ||
1983 | 1990 | ||
1984 | ZFCP_LOG_DEBUG("exchange configuration data request initiated " | 1991 | return retval; |
1985 | "(adapter %s)\n", | 1992 | } |
1986 | zfcp_get_busid_by_adapter(erp_action->adapter)); | ||
1987 | 1993 | ||
1988 | out: | 1994 | int |
1989 | write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, | 1995 | zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter, |
1996 | struct fsf_qtcb_bottom_config *data) | ||
1997 | { | ||
1998 | volatile struct qdio_buffer_element *sbale; | ||
1999 | struct zfcp_fsf_req *fsf_req; | ||
2000 | unsigned long lock_flags; | ||
2001 | int retval; | ||
2002 | |||
2003 | /* setup new FSF request */ | ||
2004 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA, | ||
2005 | 0, NULL, &lock_flags, &fsf_req); | ||
2006 | if (retval) { | ||
2007 | ZFCP_LOG_INFO("error: Could not create exchange configuration " | ||
2008 | "data request for adapter %s.\n", | ||
2009 | zfcp_get_busid_by_adapter(adapter)); | ||
2010 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, | ||
2011 | lock_flags); | ||
2012 | return retval; | ||
2013 | } | ||
2014 | |||
2015 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); | ||
2016 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
2017 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
2018 | |||
2019 | fsf_req->qtcb->bottom.config.feature_selection = | ||
2020 | FSF_FEATURE_CFDC | | ||
2021 | FSF_FEATURE_LUN_SHARING | | ||
2022 | FSF_FEATURE_NOTIFICATION_LOST | | ||
2023 | FSF_FEATURE_UPDATE_ALERT; | ||
2024 | |||
2025 | if (data) | ||
2026 | fsf_req->data = (unsigned long) data; | ||
2027 | |||
2028 | zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT); | ||
2029 | retval = zfcp_fsf_req_send(fsf_req); | ||
2030 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, | ||
1990 | lock_flags); | 2031 | lock_flags); |
2032 | if (retval) | ||
2033 | ZFCP_LOG_INFO("error: Could not send exchange configuration " | ||
2034 | "data command on the adapter %s\n", | ||
2035 | zfcp_get_busid_by_adapter(adapter)); | ||
2036 | else | ||
2037 | wait_event(fsf_req->completion_wq, | ||
2038 | fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED); | ||
2039 | |||
2040 | zfcp_fsf_req_free(fsf_req); | ||
2041 | |||
1991 | return retval; | 2042 | return retval; |
1992 | } | 2043 | } |
1993 | 2044 | ||
@@ -2016,11 +2067,17 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
2016 | adapter->peer_d_id = 0; | 2067 | adapter->peer_d_id = 0; |
2017 | 2068 | ||
2018 | if (xchg_ok) { | 2069 | if (xchg_ok) { |
2070 | |||
2071 | if (fsf_req->data) | ||
2072 | memcpy((struct fsf_qtcb_bottom_config *) fsf_req->data, | ||
2073 | bottom, sizeof (struct fsf_qtcb_bottom_config)); | ||
2074 | |||
2019 | fc_host_node_name(shost) = bottom->nport_serv_param.wwnn; | 2075 | fc_host_node_name(shost) = bottom->nport_serv_param.wwnn; |
2020 | fc_host_port_name(shost) = bottom->nport_serv_param.wwpn; | 2076 | fc_host_port_name(shost) = bottom->nport_serv_param.wwpn; |
2021 | fc_host_port_id(shost) = bottom->s_id & ZFCP_DID_MASK; | 2077 | fc_host_port_id(shost) = bottom->s_id & ZFCP_DID_MASK; |
2022 | fc_host_speed(shost) = bottom->fc_link_speed; | 2078 | fc_host_speed(shost) = bottom->fc_link_speed; |
2023 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | 2079 | fc_host_supported_classes(shost) = |
2080 | FC_COS_CLASS2 | FC_COS_CLASS3; | ||
2024 | adapter->hydra_version = bottom->adapter_type; | 2081 | adapter->hydra_version = bottom->adapter_type; |
2025 | if (fc_host_permanent_port_name(shost) == -1) | 2082 | if (fc_host_permanent_port_name(shost) == -1) |
2026 | fc_host_permanent_port_name(shost) = | 2083 | fc_host_permanent_port_name(shost) = |
@@ -2053,7 +2110,8 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
2053 | min(FC_SERIAL_NUMBER_SIZE, 17)); | 2110 | min(FC_SERIAL_NUMBER_SIZE, 17)); |
2054 | } | 2111 | } |
2055 | 2112 | ||
2056 | ZFCP_LOG_NORMAL("The adapter %s reported the following characteristics:\n" | 2113 | ZFCP_LOG_NORMAL("The adapter %s reported the following " |
2114 | "characteristics:\n" | ||
2057 | "WWNN 0x%016Lx, " | 2115 | "WWNN 0x%016Lx, " |
2058 | "WWPN 0x%016Lx, " | 2116 | "WWPN 0x%016Lx, " |
2059 | "S_ID 0x%06x,\n" | 2117 | "S_ID 0x%06x,\n" |
@@ -2090,7 +2148,7 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
2090 | return 0; | 2148 | return 0; |
2091 | } | 2149 | } |
2092 | 2150 | ||
2093 | /* | 2151 | /** |
2094 | * function: zfcp_fsf_exchange_config_data_handler | 2152 | * function: zfcp_fsf_exchange_config_data_handler |
2095 | * | 2153 | * |
2096 | * purpose: is called for finished Exchange Configuration Data command | 2154 | * purpose: is called for finished Exchange Configuration Data command |
@@ -2125,7 +2183,7 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2125 | adapter->peer_wwpn, | 2183 | adapter->peer_wwpn, |
2126 | adapter->peer_d_id); | 2184 | adapter->peer_d_id); |
2127 | debug_text_event(fsf_req->adapter->erp_dbf, 0, | 2185 | debug_text_event(fsf_req->adapter->erp_dbf, 0, |
2128 | "top-p-to-p"); | 2186 | "top-p-to-p"); |
2129 | break; | 2187 | break; |
2130 | case FC_PORTTYPE_NLPORT: | 2188 | case FC_PORTTYPE_NLPORT: |
2131 | ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel " | 2189 | ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel " |
@@ -2138,8 +2196,8 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2138 | return -EIO; | 2196 | return -EIO; |
2139 | case FC_PORTTYPE_NPORT: | 2197 | case FC_PORTTYPE_NPORT: |
2140 | ZFCP_LOG_NORMAL("Switched fabric fibrechannel " | 2198 | ZFCP_LOG_NORMAL("Switched fabric fibrechannel " |
2141 | "network detected at adapter %s.\n", | 2199 | "network detected at adapter %s.\n", |
2142 | zfcp_get_busid_by_adapter(adapter)); | 2200 | zfcp_get_busid_by_adapter(adapter)); |
2143 | break; | 2201 | break; |
2144 | default: | 2202 | default: |
2145 | ZFCP_LOG_NORMAL("bug: The fibrechannel topology " | 2203 | ZFCP_LOG_NORMAL("bug: The fibrechannel topology " |
@@ -2179,7 +2237,8 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2179 | if (zfcp_fsf_exchange_config_evaluate(fsf_req, 0)) | 2237 | if (zfcp_fsf_exchange_config_evaluate(fsf_req, 0)) |
2180 | return -EIO; | 2238 | return -EIO; |
2181 | 2239 | ||
2182 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status); | 2240 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, |
2241 | &adapter->status); | ||
2183 | 2242 | ||
2184 | zfcp_fsf_link_down_info_eval(adapter, | 2243 | zfcp_fsf_link_down_info_eval(adapter, |
2185 | &qtcb->header.fsf_status_qual.link_down_info); | 2244 | &qtcb->header.fsf_status_qual.link_down_info); |
@@ -2187,7 +2246,7 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2187 | default: | 2246 | default: |
2188 | debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng"); | 2247 | debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng"); |
2189 | debug_event(fsf_req->adapter->erp_dbf, 0, | 2248 | debug_event(fsf_req->adapter->erp_dbf, 0, |
2190 | &fsf_req->qtcb->header.fsf_status, sizeof (u32)); | 2249 | &fsf_req->qtcb->header.fsf_status, sizeof(u32)); |
2191 | zfcp_erp_adapter_shutdown(adapter, 0); | 2250 | zfcp_erp_adapter_shutdown(adapter, 0); |
2192 | return -EIO; | 2251 | return -EIO; |
2193 | } | 2252 | } |
@@ -2197,74 +2256,118 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2197 | /** | 2256 | /** |
2198 | * zfcp_fsf_exchange_port_data - request information about local port | 2257 | * zfcp_fsf_exchange_port_data - request information about local port |
2199 | * @erp_action: ERP action for the adapter for which port data is requested | 2258 | * @erp_action: ERP action for the adapter for which port data is requested |
2200 | * @adapter: for which port data is requested | ||
2201 | * @data: response to exchange port data request | ||
2202 | */ | 2259 | */ |
2203 | int | 2260 | int |
2204 | zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, | 2261 | zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) |
2205 | struct zfcp_adapter *adapter, | ||
2206 | struct fsf_qtcb_bottom_port *data) | ||
2207 | { | 2262 | { |
2208 | volatile struct qdio_buffer_element *sbale; | 2263 | volatile struct qdio_buffer_element *sbale; |
2209 | struct zfcp_fsf_req *fsf_req; | 2264 | struct zfcp_fsf_req *fsf_req; |
2265 | struct zfcp_adapter *adapter = erp_action->adapter; | ||
2210 | unsigned long lock_flags; | 2266 | unsigned long lock_flags; |
2211 | int retval = 0; | 2267 | int retval; |
2212 | 2268 | ||
2213 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) { | 2269 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) { |
2214 | ZFCP_LOG_INFO("error: exchange port data " | 2270 | ZFCP_LOG_INFO("error: exchange port data " |
2215 | "command not supported by adapter %s\n", | 2271 | "command not supported by adapter %s\n", |
2216 | zfcp_get_busid_by_adapter(adapter)); | 2272 | zfcp_get_busid_by_adapter(adapter)); |
2217 | return -EOPNOTSUPP; | 2273 | return -EOPNOTSUPP; |
2218 | } | 2274 | } |
2219 | 2275 | ||
2220 | /* setup new FSF request */ | 2276 | /* setup new FSF request */ |
2221 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, | 2277 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, |
2222 | erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0, | 2278 | ZFCP_REQ_AUTO_CLEANUP, |
2223 | NULL, &lock_flags, &fsf_req); | 2279 | adapter->pool.fsf_req_erp, |
2224 | if (retval < 0) { | 2280 | &lock_flags, &fsf_req); |
2281 | if (retval) { | ||
2225 | ZFCP_LOG_INFO("error: Out of resources. Could not create an " | 2282 | ZFCP_LOG_INFO("error: Out of resources. Could not create an " |
2226 | "exchange port data request for" | 2283 | "exchange port data request for" |
2227 | "the adapter %s.\n", | 2284 | "the adapter %s.\n", |
2228 | zfcp_get_busid_by_adapter(adapter)); | 2285 | zfcp_get_busid_by_adapter(adapter)); |
2229 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, | 2286 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, |
2230 | lock_flags); | 2287 | lock_flags); |
2231 | return retval; | 2288 | return retval; |
2232 | } | 2289 | } |
2233 | 2290 | ||
2234 | if (data) | ||
2235 | fsf_req->data = (unsigned long) data; | ||
2236 | |||
2237 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); | 2291 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); |
2238 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | 2292 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; |
2239 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | 2293 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; |
2240 | 2294 | ||
2241 | if (erp_action) { | 2295 | erp_action->fsf_req = fsf_req; |
2242 | erp_action->fsf_req = fsf_req; | 2296 | fsf_req->erp_action = erp_action; |
2243 | fsf_req->erp_action = erp_action; | 2297 | zfcp_erp_start_timer(fsf_req); |
2244 | zfcp_erp_start_timer(fsf_req); | ||
2245 | } else | ||
2246 | zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT); | ||
2247 | 2298 | ||
2248 | retval = zfcp_fsf_req_send(fsf_req); | 2299 | retval = zfcp_fsf_req_send(fsf_req); |
2300 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); | ||
2301 | |||
2249 | if (retval) { | 2302 | if (retval) { |
2250 | ZFCP_LOG_INFO("error: Could not send an exchange port data " | 2303 | ZFCP_LOG_INFO("error: Could not send an exchange port data " |
2251 | "command on the adapter %s\n", | 2304 | "command on the adapter %s\n", |
2252 | zfcp_get_busid_by_adapter(adapter)); | 2305 | zfcp_get_busid_by_adapter(adapter)); |
2253 | zfcp_fsf_req_free(fsf_req); | 2306 | zfcp_fsf_req_free(fsf_req); |
2254 | if (erp_action) | 2307 | erp_action->fsf_req = NULL; |
2255 | erp_action->fsf_req = NULL; | 2308 | } |
2309 | else | ||
2310 | ZFCP_LOG_DEBUG("exchange port data request initiated " | ||
2311 | "(adapter %s)\n", | ||
2312 | zfcp_get_busid_by_adapter(adapter)); | ||
2313 | return retval; | ||
2314 | } | ||
2315 | |||
2316 | |||
2317 | /** | ||
2318 | * zfcp_fsf_exchange_port_data_sync - request information about local port | ||
2319 | * and wait until information is ready | ||
2320 | */ | ||
2321 | int | ||
2322 | zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter, | ||
2323 | struct fsf_qtcb_bottom_port *data) | ||
2324 | { | ||
2325 | volatile struct qdio_buffer_element *sbale; | ||
2326 | struct zfcp_fsf_req *fsf_req; | ||
2327 | unsigned long lock_flags; | ||
2328 | int retval; | ||
2329 | |||
2330 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) { | ||
2331 | ZFCP_LOG_INFO("error: exchange port data " | ||
2332 | "command not supported by adapter %s\n", | ||
2333 | zfcp_get_busid_by_adapter(adapter)); | ||
2334 | return -EOPNOTSUPP; | ||
2335 | } | ||
2336 | |||
2337 | /* setup new FSF request */ | ||
2338 | retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, | ||
2339 | 0, NULL, &lock_flags, &fsf_req); | ||
2340 | if (retval) { | ||
2341 | ZFCP_LOG_INFO("error: Out of resources. Could not create an " | ||
2342 | "exchange port data request for" | ||
2343 | "the adapter %s.\n", | ||
2344 | zfcp_get_busid_by_adapter(adapter)); | ||
2256 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, | 2345 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, |
2257 | lock_flags); | 2346 | lock_flags); |
2258 | return retval; | 2347 | return retval; |
2259 | } | 2348 | } |
2260 | 2349 | ||
2350 | if (data) | ||
2351 | fsf_req->data = (unsigned long) data; | ||
2352 | |||
2353 | sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0); | ||
2354 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
2355 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
2356 | |||
2357 | zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT); | ||
2358 | retval = zfcp_fsf_req_send(fsf_req); | ||
2261 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); | 2359 | write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags); |
2262 | 2360 | ||
2263 | if (!erp_action) { | 2361 | if (retval) |
2362 | ZFCP_LOG_INFO("error: Could not send an exchange port data " | ||
2363 | "command on the adapter %s\n", | ||
2364 | zfcp_get_busid_by_adapter(adapter)); | ||
2365 | else | ||
2264 | wait_event(fsf_req->completion_wq, | 2366 | wait_event(fsf_req->completion_wq, |
2265 | fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED); | 2367 | fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED); |
2266 | zfcp_fsf_req_free(fsf_req); | 2368 | |
2267 | } | 2369 | zfcp_fsf_req_free(fsf_req); |
2370 | |||
2268 | return retval; | 2371 | return retval; |
2269 | } | 2372 | } |
2270 | 2373 | ||
@@ -2277,18 +2380,16 @@ static void | |||
2277 | zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | 2380 | zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) |
2278 | { | 2381 | { |
2279 | struct zfcp_adapter *adapter; | 2382 | struct zfcp_adapter *adapter; |
2280 | struct fsf_qtcb *qtcb; | 2383 | struct fsf_qtcb_bottom_port *bottom; |
2281 | struct fsf_qtcb_bottom_port *bottom, *data; | ||
2282 | struct Scsi_Host *shost; | 2384 | struct Scsi_Host *shost; |
2283 | 2385 | ||
2284 | adapter = fsf_req->adapter; | 2386 | adapter = fsf_req->adapter; |
2285 | qtcb = fsf_req->qtcb; | 2387 | bottom = &fsf_req->qtcb->bottom.port; |
2286 | bottom = &qtcb->bottom.port; | ||
2287 | shost = adapter->scsi_host; | 2388 | shost = adapter->scsi_host; |
2288 | 2389 | ||
2289 | data = (struct fsf_qtcb_bottom_port*) fsf_req->data; | 2390 | if (fsf_req->data) |
2290 | if (data) | 2391 | memcpy((struct fsf_qtcb_bottom_port*) fsf_req->data, bottom, |
2291 | memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port)); | 2392 | sizeof(struct fsf_qtcb_bottom_port)); |
2292 | 2393 | ||
2293 | if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) | 2394 | if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) |
2294 | fc_host_permanent_port_name(shost) = bottom->wwpn; | 2395 | fc_host_permanent_port_name(shost) = bottom->wwpn; |
@@ -2336,10 +2437,10 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) | |||
2336 | /* | 2437 | /* |
2337 | * function: zfcp_fsf_open_port | 2438 | * function: zfcp_fsf_open_port |
2338 | * | 2439 | * |
2339 | * purpose: | 2440 | * purpose: |
2340 | * | 2441 | * |
2341 | * returns: address of initiated FSF request | 2442 | * returns: address of initiated FSF request |
2342 | * NULL - request could not be initiated | 2443 | * NULL - request could not be initiated |
2343 | */ | 2444 | */ |
2344 | int | 2445 | int |
2345 | zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | 2446 | zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) |
@@ -2400,7 +2501,7 @@ zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
2400 | * | 2501 | * |
2401 | * purpose: is called for finished Open Port command | 2502 | * purpose: is called for finished Open Port command |
2402 | * | 2503 | * |
2403 | * returns: | 2504 | * returns: |
2404 | */ | 2505 | */ |
2405 | static int | 2506 | static int |
2406 | zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) | 2507 | zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) |
@@ -3002,7 +3103,7 @@ zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | |||
3002 | * | 3103 | * |
3003 | * purpose: is called for finished Open LUN command | 3104 | * purpose: is called for finished Open LUN command |
3004 | * | 3105 | * |
3005 | * returns: | 3106 | * returns: |
3006 | */ | 3107 | */ |
3007 | static int | 3108 | static int |
3008 | zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | 3109 | zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) |
@@ -3265,7 +3366,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) | |||
3265 | * purpose: | 3366 | * purpose: |
3266 | * | 3367 | * |
3267 | * returns: address of fsf_req - request successfully initiated | 3368 | * returns: address of fsf_req - request successfully initiated |
3268 | * NULL - | 3369 | * NULL - |
3269 | * | 3370 | * |
3270 | * assumptions: This routine does not check whether the associated | 3371 | * assumptions: This routine does not check whether the associated |
3271 | * remote port/lun has already been opened. This should be | 3372 | * remote port/lun has already been opened. This should be |
@@ -3586,17 +3687,17 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, | |||
3586 | ZFCP_LOG_DEBUG( | 3687 | ZFCP_LOG_DEBUG( |
3587 | "Data did not fit into available buffer(s), " | 3688 | "Data did not fit into available buffer(s), " |
3588 | "waiting for more...\n"); | 3689 | "waiting for more...\n"); |
3589 | retval = -EIO; | 3690 | retval = -EIO; |
3590 | } else { | 3691 | } else { |
3591 | ZFCP_LOG_NORMAL("error: No truncation implemented but " | 3692 | ZFCP_LOG_NORMAL("error: No truncation implemented but " |
3592 | "required. Shutting down unit " | 3693 | "required. Shutting down unit " |
3593 | "(adapter %s, port 0x%016Lx, " | 3694 | "(adapter %s, port 0x%016Lx, " |
3594 | "unit 0x%016Lx)\n", | 3695 | "unit 0x%016Lx)\n", |
3595 | zfcp_get_busid_by_unit(unit), | 3696 | zfcp_get_busid_by_unit(unit), |
3596 | unit->port->wwpn, | 3697 | unit->port->wwpn, |
3597 | unit->fcp_lun); | 3698 | unit->fcp_lun); |
3598 | zfcp_erp_unit_shutdown(unit, 0); | 3699 | zfcp_erp_unit_shutdown(unit, 0); |
3599 | retval = -EINVAL; | 3700 | retval = -EINVAL; |
3600 | } | 3701 | } |
3601 | goto no_fit; | 3702 | goto no_fit; |
3602 | } | 3703 | } |
@@ -3727,7 +3828,7 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter, | |||
3727 | * | 3828 | * |
3728 | * purpose: is called for finished Send FCP Command | 3829 | * purpose: is called for finished Send FCP Command |
3729 | * | 3830 | * |
3730 | * returns: | 3831 | * returns: |
3731 | */ | 3832 | */ |
3732 | static int | 3833 | static int |
3733 | zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) | 3834 | zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) |
@@ -3964,7 +4065,7 @@ zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) | |||
3964 | * | 4065 | * |
3965 | * purpose: evaluates FCP_RSP IU | 4066 | * purpose: evaluates FCP_RSP IU |
3966 | * | 4067 | * |
3967 | * returns: | 4068 | * returns: |
3968 | */ | 4069 | */ |
3969 | static int | 4070 | static int |
3970 | zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) | 4071 | zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) |
@@ -4192,7 +4293,7 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) | |||
4192 | * | 4293 | * |
4193 | * purpose: evaluates FCP_RSP IU | 4294 | * purpose: evaluates FCP_RSP IU |
4194 | * | 4295 | * |
4195 | * returns: | 4296 | * returns: |
4196 | */ | 4297 | */ |
4197 | static int | 4298 | static int |
4198 | zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req) | 4299 | zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req) |
@@ -4635,7 +4736,7 @@ zfcp_fsf_req_create(struct zfcp_adapter *adapter, u32 fsf_cmd, int req_flags, | |||
4635 | INIT_LIST_HEAD(&fsf_req->list); | 4736 | INIT_LIST_HEAD(&fsf_req->list); |
4636 | init_timer(&fsf_req->timer); | 4737 | init_timer(&fsf_req->timer); |
4637 | 4738 | ||
4638 | /* initialize waitqueue which may be used to wait on | 4739 | /* initialize waitqueue which may be used to wait on |
4639 | this request completion */ | 4740 | this request completion */ |
4640 | init_waitqueue_head(&fsf_req->completion_wq); | 4741 | init_waitqueue_head(&fsf_req->completion_wq); |
4641 | 4742 | ||
diff --git a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h index 71186618947c..8cce5cc11d50 100644 --- a/drivers/s390/scsi/zfcp_fsf.h +++ b/drivers/s390/scsi/zfcp_fsf.h | |||
@@ -1,22 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * This file is part of the zfcp device driver for |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * FCP adapters for IBM System z9 and zSeries. |
4 | * | 4 | * |
5 | * (C) Copyright IBM Corp. 2002, 2006 | 5 | * (C) Copyright IBM Corp. 2002, 2006 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 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 | 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) | 9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. | 10 | * any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef FSF_H | 22 | #ifndef FSF_H |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index c6899efdc8f6..3f105fdcf239 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -174,10 +174,9 @@ zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter, unsigned int status, | |||
174 | * That is why we need to clear the link-down flag | 174 | * That is why we need to clear the link-down flag |
175 | * which is set again in case we have missed by a mile. | 175 | * which is set again in case we have missed by a mile. |
176 | */ | 176 | */ |
177 | zfcp_erp_adapter_reopen( | 177 | zfcp_erp_adapter_reopen(adapter, |
178 | adapter, | 178 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | |
179 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | | 179 | ZFCP_STATUS_COMMON_ERP_FAILED); |
180 | ZFCP_STATUS_COMMON_ERP_FAILED); | ||
181 | } | 180 | } |
182 | return retval; | 181 | return retval; |
183 | } | 182 | } |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index ad7eb4a9261c..abae2027f7e5 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -1,22 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * This file is part of the zfcp device driver for |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * FCP adapters for IBM System z9 and zSeries. |
4 | * | 4 | * |
5 | * (C) Copyright IBM Corp. 2002, 2006 | 5 | * (C) Copyright IBM Corp. 2002, 2006 |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 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 | 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) | 9 | * the Free Software Foundation; either version 2, or (at your option) |
10 | * any later version. | 10 | * any later version. |
11 | * | 11 | * |
12 | * This program is distributed in the hope that it will be useful, | 12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
15 | * GNU General Public License for more details. | 15 | * GNU General Public License for more details. |
16 | * | 16 | * |
17 | * You should have received a copy of the GNU General Public License | 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 | 18 | * along with this program; if not, write to the Free Software |
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI | 22 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI |
@@ -101,7 +101,7 @@ zfcp_get_fcp_dl_ptr(struct fcp_cmnd_iu * fcp_cmd) | |||
101 | ((unsigned char *) fcp_cmd + | 101 | ((unsigned char *) fcp_cmd + |
102 | sizeof (struct fcp_cmnd_iu) + additional_length); | 102 | sizeof (struct fcp_cmnd_iu) + additional_length); |
103 | /* | 103 | /* |
104 | * fcp_dl_addr = start address of fcp_cmnd structure + | 104 | * fcp_dl_addr = start address of fcp_cmnd structure + |
105 | * size of fixed part + size of dynamically sized add_dcp_cdb field | 105 | * size of fixed part + size of dynamically sized add_dcp_cdb field |
106 | * SEE FCP-2 documentation | 106 | * SEE FCP-2 documentation |
107 | */ | 107 | */ |
@@ -189,13 +189,12 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt) | |||
189 | unit->device = NULL; | 189 | unit->device = NULL; |
190 | zfcp_erp_unit_failed(unit); | 190 | zfcp_erp_unit_failed(unit); |
191 | zfcp_unit_put(unit); | 191 | zfcp_unit_put(unit); |
192 | } else { | 192 | } else |
193 | ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " | 193 | ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at " |
194 | "address %p\n", sdpnt); | 194 | "address %p\n", sdpnt); |
195 | } | ||
196 | } | 195 | } |
197 | 196 | ||
198 | /* | 197 | /* |
199 | * called from scsi midlayer to allow finetuning of a device. | 198 | * called from scsi midlayer to allow finetuning of a device. |
200 | */ | 199 | */ |
201 | static int | 200 | static int |
@@ -361,12 +360,11 @@ zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, unsigned int id, | |||
361 | list_for_each_entry(port, &adapter->port_list_head, list) { | 360 | list_for_each_entry(port, &adapter->port_list_head, list) { |
362 | if (!port->rport || (id != port->rport->scsi_target_id)) | 361 | if (!port->rport || (id != port->rport->scsi_target_id)) |
363 | continue; | 362 | continue; |
364 | list_for_each_entry(unit, &port->unit_list_head, list) { | 363 | list_for_each_entry(unit, &port->unit_list_head, list) |
365 | if (lun == unit->scsi_lun) { | 364 | if (lun == unit->scsi_lun) { |
366 | retval = unit; | 365 | retval = unit; |
367 | goto out; | 366 | goto out; |
368 | } | 367 | } |
369 | } | ||
370 | } | 368 | } |
371 | out: | 369 | out: |
372 | return retval; | 370 | return retval; |
@@ -374,7 +372,7 @@ zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, unsigned int id, | |||
374 | 372 | ||
375 | /** | 373 | /** |
376 | * zfcp_scsi_eh_abort_handler - abort the specified SCSI command | 374 | * zfcp_scsi_eh_abort_handler - abort the specified SCSI command |
377 | * @scpnt: pointer to scsi_cmnd to be aborted | 375 | * @scpnt: pointer to scsi_cmnd to be aborted |
378 | * Return: SUCCESS - command has been aborted and cleaned up in internal | 376 | * Return: SUCCESS - command has been aborted and cleaned up in internal |
379 | * bookkeeping, SCSI stack won't be called for aborted command | 377 | * bookkeeping, SCSI stack won't be called for aborted command |
380 | * FAILED - otherwise | 378 | * FAILED - otherwise |
@@ -733,7 +731,7 @@ zfcp_get_fc_host_stats(struct Scsi_Host *shost) | |||
733 | if (!data) | 731 | if (!data) |
734 | return NULL; | 732 | return NULL; |
735 | 733 | ||
736 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); | 734 | ret = zfcp_fsf_exchange_port_data_sync(adapter, data); |
737 | if (ret) { | 735 | if (ret) { |
738 | kfree(data); | 736 | kfree(data); |
739 | return NULL; /* XXX return zeroed fc_stats? */ | 737 | return NULL; /* XXX return zeroed fc_stats? */ |
@@ -763,7 +761,7 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost) | |||
763 | if (!data) | 761 | if (!data) |
764 | return; | 762 | return; |
765 | 763 | ||
766 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); | 764 | ret = zfcp_fsf_exchange_port_data_sync(adapter, data); |
767 | if (ret) { | 765 | if (ret) { |
768 | kfree(data); | 766 | kfree(data); |
769 | } else { | 767 | } else { |
@@ -802,6 +800,7 @@ struct fc_function_template zfcp_transport_functions = { | |||
802 | .show_host_port_type = 1, | 800 | .show_host_port_type = 1, |
803 | .show_host_speed = 1, | 801 | .show_host_speed = 1, |
804 | .show_host_port_id = 1, | 802 | .show_host_port_id = 1, |
803 | .disable_target_scan = 1, | ||
805 | }; | 804 | }; |
806 | 805 | ||
807 | /** | 806 | /** |
diff --git a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index 81a484175863..63f75ee95c33 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c | |||
@@ -139,7 +139,7 @@ static struct attribute_group zfcp_unit_attr_group = { | |||
139 | .attrs = zfcp_unit_attrs, | 139 | .attrs = zfcp_unit_attrs, |
140 | }; | 140 | }; |
141 | 141 | ||
142 | /** | 142 | /** |
143 | * zfcp_sysfs_create_unit_files - create sysfs unit files | 143 | * zfcp_sysfs_create_unit_files - create sysfs unit files |
144 | * @dev: pointer to belonging device | 144 | * @dev: pointer to belonging device |
145 | * | 145 | * |
@@ -151,7 +151,7 @@ zfcp_sysfs_unit_create_files(struct device *dev) | |||
151 | return sysfs_create_group(&dev->kobj, &zfcp_unit_attr_group); | 151 | return sysfs_create_group(&dev->kobj, &zfcp_unit_attr_group); |
152 | } | 152 | } |
153 | 153 | ||
154 | /** | 154 | /** |
155 | * zfcp_sysfs_remove_unit_files - remove sysfs unit files | 155 | * zfcp_sysfs_remove_unit_files - remove sysfs unit files |
156 | * @dev: pointer to belonging device | 156 | * @dev: pointer to belonging device |
157 | * | 157 | * |