aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/scsi/zfcp_aux.c13
-rw-r--r--drivers/s390/scsi/zfcp_ccw.c8
-rw-r--r--drivers/s390/scsi/zfcp_def.h46
-rw-r--r--drivers/s390/scsi/zfcp_erp.c140
-rw-r--r--drivers/s390/scsi/zfcp_ext.h38
-rw-r--r--drivers/s390/scsi/zfcp_fsf.c293
-rw-r--r--drivers/s390/scsi/zfcp_fsf.h30
-rw-r--r--drivers/s390/scsi/zfcp_qdio.c7
-rw-r--r--drivers/s390/scsi/zfcp_scsi.c47
-rw-r--r--drivers/s390/scsi/zfcp_sysfs_unit.c4
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 */
1423static int 1423static 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 */
1962static int 1962static int
1963zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *erp_action, int close) 1963zfcp_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 *);
82extern int zfcp_fsf_close_unit(struct zfcp_erp_action *); 82extern int zfcp_fsf_close_unit(struct zfcp_erp_action *);
83 83
84extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *); 84extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *);
85extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *, 85extern 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 *); 87extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *);
88extern int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *,
89 struct fsf_qtcb_bottom_port *);
88extern int zfcp_fsf_control_file(struct zfcp_adapter *, struct zfcp_fsf_req **, 90extern 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 *);
90extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long); 92extern 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 */
197int 197int
198zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req) 198zfcp_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 */
643static int 643static int
644zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req) 644zfcp_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 */
859static int 859static int
860zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) 860zfcp_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 */
1162static int 1162static int
1163zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *new_fsf_req) 1163zfcp_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: 1994int
1989 write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock, 1995zfcp_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 */
2203int 2260int
2204zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, 2261zfcp_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 */
2321int
2322zfcp_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
2277zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) 2380zfcp_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 */
2344int 2445int
2345zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) 2446zfcp_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 */
2405static int 2506static int
2406zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) 2507zfcp_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 */
3007static int 3108static int
3008zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) 3109zfcp_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 */
3732static int 3833static int
3733zfcp_fsf_send_fcp_command_handler(struct zfcp_fsf_req *fsf_req) 3834zfcp_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 */
3969static int 4070static int
3970zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) 4071zfcp_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 */
4197static int 4298static int
4198zfcp_fsf_send_fcp_command_task_management_handler(struct zfcp_fsf_req *fsf_req) 4299zfcp_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 */
201static int 200static 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 *