Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (207 commits)
[SCSI] gdth: fix CONFIG_ISA build failure
[SCSI] esp_scsi: remove __dev{init,exit}
[SCSI] gdth: !use_sg cleanup and use of scsi accessors
[SCSI] gdth: Move members from SCp to gdth_cmndinfo, stage 2
[SCSI] gdth: Setup proper per-command private data
[SCSI] gdth: Remove gdth_ctr_tab[]
[SCSI] gdth: switch to modern scsi host registration
[SCSI] gdth: gdth_interrupt() gdth_get_status() & gdth_wait() fixes
[SCSI] gdth: clean up host private data
[SCSI] gdth: Remove virt hosts
[SCSI] gdth: Reorder scsi_host_template intitializers
[SCSI] gdth: kill gdth_{read,write}[bwl] wrappers
[SCSI] gdth: Remove 2.4.x support, in-kernel changelog
[SCSI] gdth: split out pci probing
[SCSI] gdth: split out eisa probing
[SCSI] gdth: split out isa probing
gdth: Make one abuse of scsi_cmnd less obvious
[SCSI] NCR5380: Use scsi_eh API for REQUEST_SENSE invocation
[SCSI] usb storage: use scsi_eh API in REQUEST_SENSE execution
[SCSI] scsi_error: Refactoring scsi_error to facilitate in synchronous REQUEST_SENSE
...
This commit is contained in:
@@ -891,7 +891,7 @@ zfcp_unit_dequeue(struct zfcp_unit *unit)
|
||||
/*
|
||||
* Allocates a combined QTCB/fsf_req buffer for erp actions and fcp/SCSI
|
||||
* commands.
|
||||
* It also genrates fcp-nameserver request/response buffer and unsolicited
|
||||
* It also genrates fcp-nameserver request/response buffer and unsolicited
|
||||
* status read fsf_req buffers.
|
||||
*
|
||||
* locks: must only be called with zfcp_data.config_sema taken
|
||||
@@ -982,7 +982,7 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
||||
struct zfcp_adapter *adapter;
|
||||
|
||||
/*
|
||||
* Note: It is safe to release the list_lock, as any list changes
|
||||
* Note: It is safe to release the list_lock, as any list changes
|
||||
* are protected by the config_sema, which must be held to get here
|
||||
*/
|
||||
|
||||
@@ -1038,6 +1038,10 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
||||
spin_lock_init(&adapter->san_dbf_lock);
|
||||
spin_lock_init(&adapter->scsi_dbf_lock);
|
||||
|
||||
retval = zfcp_adapter_debug_register(adapter);
|
||||
if (retval)
|
||||
goto debug_register_failed;
|
||||
|
||||
/* initialize error recovery stuff */
|
||||
|
||||
rwlock_init(&adapter->erp_lock);
|
||||
@@ -1058,7 +1062,6 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
||||
/* mark adapter unusable as long as sysfs registration is not complete */
|
||||
atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
|
||||
|
||||
adapter->ccw_device = ccw_device;
|
||||
dev_set_drvdata(&ccw_device->dev, adapter);
|
||||
|
||||
if (zfcp_sysfs_adapter_create_files(&ccw_device->dev))
|
||||
@@ -1085,6 +1088,8 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
||||
generic_services_failed:
|
||||
zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
|
||||
sysfs_failed:
|
||||
zfcp_adapter_debug_unregister(adapter);
|
||||
debug_register_failed:
|
||||
dev_set_drvdata(&ccw_device->dev, NULL);
|
||||
zfcp_reqlist_free(adapter);
|
||||
failed_low_mem_buffers:
|
||||
@@ -1130,6 +1135,8 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
|
||||
goto out;
|
||||
}
|
||||
|
||||
zfcp_adapter_debug_unregister(adapter);
|
||||
|
||||
/* remove specified adapter data structure from list */
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
list_del(&adapter->list);
|
||||
|
||||
@@ -148,15 +148,12 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device)
|
||||
down(&zfcp_data.config_sema);
|
||||
adapter = dev_get_drvdata(&ccw_device->dev);
|
||||
|
||||
retval = zfcp_adapter_debug_register(adapter);
|
||||
if (retval)
|
||||
goto out;
|
||||
retval = zfcp_erp_thread_setup(adapter);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: start of error recovery thread for "
|
||||
"adapter %s failed\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
goto out_erp_thread;
|
||||
goto out;
|
||||
}
|
||||
|
||||
retval = zfcp_adapter_scsi_register(adapter);
|
||||
@@ -175,8 +172,6 @@ zfcp_ccw_set_online(struct ccw_device *ccw_device)
|
||||
|
||||
out_scsi_register:
|
||||
zfcp_erp_thread_kill(adapter);
|
||||
out_erp_thread:
|
||||
zfcp_adapter_debug_unregister(adapter);
|
||||
out:
|
||||
up(&zfcp_data.config_sema);
|
||||
return retval;
|
||||
@@ -199,7 +194,6 @@ zfcp_ccw_set_offline(struct ccw_device *ccw_device)
|
||||
zfcp_erp_adapter_shutdown(adapter, 0);
|
||||
zfcp_erp_wait(adapter);
|
||||
zfcp_erp_thread_kill(adapter);
|
||||
zfcp_adapter_debug_unregister(adapter);
|
||||
up(&zfcp_data.config_sema);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of the zfcp device driver for
|
||||
* FCP adapters for IBM System z9 and zSeries.
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2002, 2006
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_DEF_H
|
||||
#define ZFCP_DEF_H
|
||||
@@ -90,7 +90,7 @@ zfcp_address_to_sg(void *address, struct scatterlist *list)
|
||||
#define ZFCP_DEVICE_TYPE 0x1732
|
||||
#define ZFCP_DEVICE_MODEL 0x03
|
||||
#define ZFCP_DEVICE_MODEL_PRIV 0x04
|
||||
|
||||
|
||||
/* allow as many chained SBALs as are supported by hardware */
|
||||
#define ZFCP_MAX_SBALS_PER_REQ FSF_MAX_SBALS_PER_REQ
|
||||
#define ZFCP_MAX_SBALS_PER_CT_REQ FSF_MAX_SBALS_PER_REQ
|
||||
@@ -508,7 +508,7 @@ struct zfcp_rc_entry {
|
||||
|
||||
/*
|
||||
* this allows removal of logging code by the preprocessor
|
||||
* (the most detailed log level still to be compiled in is specified,
|
||||
* (the most detailed log level still to be compiled in is specified,
|
||||
* higher log levels are removed)
|
||||
*/
|
||||
#define ZFCP_LOG_LEVEL_LIMIT ZFCP_LOG_LEVEL_TRACE
|
||||
@@ -546,7 +546,7 @@ do { \
|
||||
if (ZFCP_LOG_CHECK(level)) \
|
||||
_ZFCP_LOG(fmt, ##args); \
|
||||
} while (0)
|
||||
|
||||
|
||||
#if ZFCP_LOG_LEVEL_LIMIT < ZFCP_LOG_LEVEL_NORMAL
|
||||
# define ZFCP_LOG_NORMAL(fmt, args...) do { } while (0)
|
||||
#else
|
||||
@@ -583,8 +583,8 @@ do { \
|
||||
|
||||
/*************** ADAPTER/PORT/UNIT AND FSF_REQ STATUS FLAGS ******************/
|
||||
|
||||
/*
|
||||
* Note, the leftmost status byte is common among adapter, port
|
||||
/*
|
||||
* Note, the leftmost status byte is common among adapter, port
|
||||
* and unit
|
||||
*/
|
||||
#define ZFCP_COMMON_FLAGS 0xfff00000
|
||||
@@ -1007,8 +1007,8 @@ struct zfcp_fsf_req {
|
||||
u32 fsf_command; /* FSF Command copy */
|
||||
struct fsf_qtcb *qtcb; /* address of associated QTCB */
|
||||
u32 seq_no; /* Sequence number of request */
|
||||
unsigned long data; /* private data of request */
|
||||
struct timer_list timer; /* used for erp or scsi er */
|
||||
unsigned long data; /* private data of request */
|
||||
struct timer_list timer; /* used for erp or scsi er */
|
||||
struct zfcp_erp_action *erp_action; /* used if this request is
|
||||
issued on behalf of erp */
|
||||
mempool_t *pool; /* used if request was alloacted
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of the zfcp device driver for
|
||||
* FCP adapters for IBM System z9 and zSeries.
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2002, 2006
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#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)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: called if an adapter failed,
|
||||
* initiates adapter recovery which is done
|
||||
@@ -228,7 +228,7 @@ zfcp_erp_adapter_reopen_internal(struct zfcp_adapter *adapter, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: Wrappper for zfcp_erp_adapter_reopen_internal
|
||||
* used to ensure the correct locking
|
||||
@@ -476,7 +476,7 @@ zfcp_test_link(struct zfcp_port *port)
|
||||
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: called if a port failed to be opened normally
|
||||
* initiates Forced Reopen recovery which is done
|
||||
@@ -517,7 +517,7 @@ zfcp_erp_port_forced_reopen_internal(struct zfcp_port *port, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: Wrappper for zfcp_erp_port_forced_reopen_internal
|
||||
* used to ensure the correct locking
|
||||
@@ -543,7 +543,7 @@ zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: called if a port is to be opened
|
||||
* initiates Reopen recovery which is done
|
||||
@@ -612,7 +612,7 @@ zfcp_erp_port_reopen(struct zfcp_port *port, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: called if a unit is to be opened
|
||||
* initiates Reopen recovery which is done
|
||||
@@ -704,7 +704,7 @@ static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: disable I/O,
|
||||
* return any open requests and clean them up,
|
||||
@@ -725,7 +725,7 @@ zfcp_erp_port_block(struct zfcp_port *port, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: enable I/O
|
||||
*
|
||||
@@ -742,7 +742,7 @@ zfcp_erp_port_unblock(struct zfcp_port *port)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: disable I/O,
|
||||
* return any open requests and clean them up,
|
||||
@@ -763,7 +763,7 @@ zfcp_erp_unit_block(struct zfcp_unit *unit, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: enable I/O
|
||||
*
|
||||
@@ -792,7 +792,7 @@ zfcp_erp_action_ready(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
*
|
||||
@@ -967,7 +967,7 @@ static void zfcp_erp_timeout_handler(unsigned long data)
|
||||
* zfcp_erp_action_dismiss - dismiss an erp_action
|
||||
*
|
||||
* adapter->erp_lock must be held
|
||||
*
|
||||
*
|
||||
* Dismissal of an erp_action is usually required if an erp_action of
|
||||
* higher priority is generated.
|
||||
*/
|
||||
@@ -1005,9 +1005,9 @@ zfcp_erp_thread_setup(struct zfcp_adapter *adapter)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns:
|
||||
*
|
||||
@@ -1094,7 +1094,7 @@ zfcp_erp_thread(void *data)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: drives single error recovery action and schedules higher and
|
||||
* subordinate actions, if necessary
|
||||
@@ -1206,7 +1206,7 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
|
||||
|
||||
/*
|
||||
* put this target through the erp mill again if someone has
|
||||
* requested to change the status of a target being online
|
||||
* requested to change the status of a target being online
|
||||
* to offline or the other way around
|
||||
* (old retval is preserved if nothing has to be done here)
|
||||
*/
|
||||
@@ -1228,7 +1228,7 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
|
||||
unlock:
|
||||
write_unlock(&adapter->erp_lock);
|
||||
read_unlock_irqrestore(&zfcp_data.config_lock, flags);
|
||||
|
||||
|
||||
if (retval != ZFCP_ERP_CONTINUES)
|
||||
zfcp_erp_action_cleanup(action, adapter, port, unit, retval);
|
||||
|
||||
@@ -1250,9 +1250,9 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_DISMISSED - if action has been dismissed
|
||||
* retval - otherwise
|
||||
@@ -1322,7 +1322,7 @@ zfcp_erp_strategy_do_action(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: triggers retry of this action after a certain amount of time
|
||||
* by means of timer provided by erp_action
|
||||
@@ -1346,7 +1346,7 @@ zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action)
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* function: zfcp_erp_adapter_failed
|
||||
*
|
||||
* purpose: sets the adapter and all underlying devices to ERP_FAILED
|
||||
@@ -1362,7 +1362,7 @@ zfcp_erp_adapter_failed(struct zfcp_adapter *adapter)
|
||||
debug_text_event(adapter->erp_dbf, 2, "a_afail");
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* function: zfcp_erp_port_failed
|
||||
*
|
||||
* purpose: sets the port and all underlying devices to ERP_FAILED
|
||||
@@ -1386,7 +1386,7 @@ zfcp_erp_port_failed(struct zfcp_port *port)
|
||||
debug_event(port->adapter->erp_dbf, 2, &port->wwpn, sizeof (wwn_t));
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* function: zfcp_erp_unit_failed
|
||||
*
|
||||
* purpose: sets the unit to ERP_FAILED
|
||||
@@ -1417,7 +1417,7 @@ zfcp_erp_unit_failed(struct zfcp_unit *unit)
|
||||
* successfully is reset.
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (not considered)
|
||||
* ZFCP_ERP_SUCCEEDED - action finished successfully
|
||||
* ZFCP_ERP_SUCCEEDED - action finished successfully
|
||||
* ZFCP_ERP_EXIT - action failed and will not continue
|
||||
*/
|
||||
static int
|
||||
@@ -1646,7 +1646,7 @@ zfcp_erp_schedule_work(struct zfcp_unit *unit)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: remaining things in good cases,
|
||||
* escalation in bad cases
|
||||
@@ -1687,8 +1687,8 @@ zfcp_erp_strategy_followup_actions(int action,
|
||||
break;
|
||||
|
||||
case ZFCP_ERP_ACTION_REOPEN_UNIT:
|
||||
if (status == ZFCP_ERP_SUCCEEDED) ; /* no further action */
|
||||
else
|
||||
/* Nothing to do if status == ZFCP_ERP_SUCCEEDED */
|
||||
if (status != ZFCP_ERP_SUCCEEDED)
|
||||
zfcp_erp_port_reopen_internal(unit->port, 0);
|
||||
break;
|
||||
}
|
||||
@@ -1815,7 +1815,7 @@ zfcp_erp_modify_unit_status(struct zfcp_unit *unit, u32 mask, int set_or_clear)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: Wrappper for zfcp_erp_port_reopen_all_internal
|
||||
* used to ensure the correct locking
|
||||
@@ -1852,9 +1852,9 @@ zfcp_erp_port_reopen_all_internal(struct zfcp_adapter *adapter, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: FIXME
|
||||
*/
|
||||
@@ -1871,7 +1871,7 @@ zfcp_erp_unit_reopen_all_internal(struct zfcp_port *port, int clear_mask)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: this routine executes the 'Reopen Adapter' action
|
||||
* (the entire action is processed synchronously, since
|
||||
@@ -1908,9 +1908,9 @@ zfcp_erp_adapter_strategy(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_SUCCEEDED - action finished successfully
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -1930,9 +1930,9 @@ zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_SUCCEEDED - action finished successfully
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -1957,7 +1957,7 @@ zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *erp_action)
|
||||
* purpose: allocate the irq associated with this devno and register
|
||||
* the FSF adapter with the SCSI stack
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
zfcp_erp_action_to_running(erp_action);
|
||||
write_unlock_irq(&adapter->erp_lock);
|
||||
|
||||
ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL);
|
||||
ret = zfcp_fsf_exchange_port_data(erp_action);
|
||||
if (ret == -EOPNOTSUPP) {
|
||||
debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp");
|
||||
return ZFCP_ERP_SUCCEEDED;
|
||||
@@ -2249,7 +2249,7 @@ zfcp_erp_adapter_strategy_open_fsf_statusread(struct zfcp_erp_action
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: this routine executes the 'Reopen Physical Port' action
|
||||
*
|
||||
@@ -2308,7 +2308,7 @@ zfcp_erp_port_forced_strategy(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: this routine executes the 'Reopen Port' action
|
||||
*
|
||||
@@ -2530,7 +2530,7 @@ zfcp_erp_port_strategy_open_nameserver(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: makes the erp thread continue with reopen (physical) port
|
||||
* 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
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2626,9 +2626,9 @@ zfcp_erp_port_strategy_clearstati(struct zfcp_port *port)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2663,9 +2663,9 @@ zfcp_erp_port_strategy_close(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2700,9 +2700,9 @@ zfcp_erp_port_strategy_open_port(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2737,7 +2737,7 @@ zfcp_erp_port_strategy_open_common_lookup(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: this routine executes the 'Reopen Unit' action
|
||||
* currently no retries
|
||||
@@ -2825,9 +2825,9 @@ zfcp_erp_unit_strategy_clearstati(struct zfcp_unit *unit)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2865,9 +2865,9 @@ zfcp_erp_unit_strategy_close(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: ZFCP_ERP_CONTINUES - action continues (asynchronously)
|
||||
* ZFCP_ERP_FAILED - action finished unsuccessfully
|
||||
@@ -2913,7 +2913,7 @@ void zfcp_erp_start_timer(struct zfcp_fsf_req *fsf_req)
|
||||
}
|
||||
|
||||
/*
|
||||
* function:
|
||||
* function:
|
||||
*
|
||||
* purpose: enqueue the specified error recovery action, if needed
|
||||
*
|
||||
@@ -2992,7 +2992,7 @@ zfcp_erp_action_enqueue(int action,
|
||||
port->erp_action.action);
|
||||
debug_text_event(adapter->erp_dbf, 4,
|
||||
"pf_actenq_drp");
|
||||
} else
|
||||
} else
|
||||
debug_text_event(adapter->erp_dbf, 4,
|
||||
"pf_actenq_drpcp");
|
||||
debug_event(adapter->erp_dbf, 4, &port->wwpn,
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of the zfcp device driver for
|
||||
* FCP adapters for IBM System z9 and zSeries.
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2002, 2006
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef ZFCP_EXT_H
|
||||
@@ -82,9 +82,11 @@ extern int zfcp_fsf_open_unit(struct zfcp_erp_action *);
|
||||
extern int zfcp_fsf_close_unit(struct zfcp_erp_action *);
|
||||
|
||||
extern int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *);
|
||||
extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *,
|
||||
struct zfcp_adapter *,
|
||||
struct fsf_qtcb_bottom_port *);
|
||||
extern int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *,
|
||||
struct fsf_qtcb_bottom_config *);
|
||||
extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *);
|
||||
extern int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *,
|
||||
struct fsf_qtcb_bottom_port *);
|
||||
extern int zfcp_fsf_control_file(struct zfcp_adapter *, struct zfcp_fsf_req **,
|
||||
u32, u32, struct zfcp_sg_list *);
|
||||
extern void zfcp_fsf_start_timer(struct zfcp_fsf_req *, unsigned long);
|
||||
|
||||
@@ -80,10 +80,10 @@ static const char zfcp_act_subtable_type[5][8] = {
|
||||
/*
|
||||
* function: zfcp_fsf_req_alloc
|
||||
*
|
||||
* purpose: Obtains an fsf_req and potentially a qtcb (for all but
|
||||
* purpose: Obtains an fsf_req and potentially a qtcb (for all but
|
||||
* unsolicited requests) via helper functions
|
||||
* Does some initial fsf request set-up.
|
||||
*
|
||||
*
|
||||
* returns: pointer to allocated fsf_req if successfull
|
||||
* NULL otherwise
|
||||
*
|
||||
@@ -192,7 +192,7 @@ void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter)
|
||||
* returns: 0 - success
|
||||
* !0 - failure
|
||||
*
|
||||
* context:
|
||||
* context:
|
||||
*/
|
||||
int
|
||||
zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req)
|
||||
@@ -214,8 +214,8 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req)
|
||||
}
|
||||
|
||||
/*
|
||||
* fsf_req may be deleted due to waking up functions, so
|
||||
* cleanup is saved here and used later
|
||||
* fsf_req may be deleted due to waking up functions, so
|
||||
* cleanup is saved here and used later
|
||||
*/
|
||||
if (likely(fsf_req->status & ZFCP_STATUS_FSFREQ_CLEANUP))
|
||||
cleanup = 1;
|
||||
@@ -259,9 +259,9 @@ zfcp_fsf_req_complete(struct zfcp_fsf_req *fsf_req)
|
||||
* and initiates appropriate actions
|
||||
* (usually calling FSF command specific handlers)
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*
|
||||
* context:
|
||||
* context:
|
||||
*
|
||||
* locks:
|
||||
*/
|
||||
@@ -638,7 +638,7 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter,
|
||||
*
|
||||
* purpose: calls the appropriate command specific handler
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
*
|
||||
* purpose: is called for finished Open Port command
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
* returns: address of initiated FSF request
|
||||
* NULL - request could not be initiated
|
||||
*
|
||||
* FIXME(design): should be watched by a timeout !!!
|
||||
* FIXME(design): should be watched by a timeout !!!
|
||||
* FIXME(design) shouldn't this be modified to return an int
|
||||
* also...don't know how though
|
||||
*/
|
||||
@@ -1157,7 +1157,7 @@ zfcp_fsf_abort_fcp_command(unsigned long old_req_id,
|
||||
*
|
||||
* purpose: is called for finished Abort FCP Command request
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
{
|
||||
volatile struct qdio_buffer_element *sbale;
|
||||
struct zfcp_fsf_req *fsf_req;
|
||||
struct zfcp_adapter *adapter = erp_action->adapter;
|
||||
unsigned long lock_flags;
|
||||
int retval = 0;
|
||||
int retval;
|
||||
|
||||
/* setup new FSF request */
|
||||
retval = zfcp_fsf_req_create(erp_action->adapter,
|
||||
retval = zfcp_fsf_req_create(adapter,
|
||||
FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
ZFCP_REQ_AUTO_CLEANUP,
|
||||
erp_action->adapter->pool.fsf_req_erp,
|
||||
adapter->pool.fsf_req_erp,
|
||||
&lock_flags, &fsf_req);
|
||||
if (retval < 0) {
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Could not create exchange configuration "
|
||||
"data request for adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(erp_action->adapter));
|
||||
goto out;
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
|
||||
fsf_req->qtcb->bottom.config.feature_selection =
|
||||
FSF_FEATURE_CFDC |
|
||||
@@ -1971,23 +1974,71 @@ zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
|
||||
|
||||
zfcp_erp_start_timer(fsf_req);
|
||||
retval = zfcp_fsf_req_send(fsf_req);
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO
|
||||
("error: Could not send exchange configuration data "
|
||||
"command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(erp_action->adapter));
|
||||
ZFCP_LOG_INFO("error: Could not send exchange configuration "
|
||||
"data command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
erp_action->fsf_req = NULL;
|
||||
goto out;
|
||||
}
|
||||
else
|
||||
ZFCP_LOG_DEBUG("exchange configuration data request initiated "
|
||||
"(adapter %s)\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
int
|
||||
zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
|
||||
struct fsf_qtcb_bottom_config *data)
|
||||
{
|
||||
volatile struct qdio_buffer_element *sbale;
|
||||
struct zfcp_fsf_req *fsf_req;
|
||||
unsigned long lock_flags;
|
||||
int retval;
|
||||
|
||||
/* setup new FSF request */
|
||||
retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
0, NULL, &lock_flags, &fsf_req);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Could not create exchange configuration "
|
||||
"data request for adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
ZFCP_LOG_DEBUG("exchange configuration data request initiated "
|
||||
"(adapter %s)\n",
|
||||
zfcp_get_busid_by_adapter(erp_action->adapter));
|
||||
sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
|
||||
out:
|
||||
write_unlock_irqrestore(&erp_action->adapter->request_queue.queue_lock,
|
||||
fsf_req->qtcb->bottom.config.feature_selection =
|
||||
FSF_FEATURE_CFDC |
|
||||
FSF_FEATURE_LUN_SHARING |
|
||||
FSF_FEATURE_NOTIFICATION_LOST |
|
||||
FSF_FEATURE_UPDATE_ALERT;
|
||||
|
||||
if (data)
|
||||
fsf_req->data = (unsigned long) data;
|
||||
|
||||
zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT);
|
||||
retval = zfcp_fsf_req_send(fsf_req);
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
if (retval)
|
||||
ZFCP_LOG_INFO("error: Could not send exchange configuration "
|
||||
"data command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
else
|
||||
wait_event(fsf_req->completion_wq,
|
||||
fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
|
||||
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -2016,11 +2067,17 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok)
|
||||
adapter->peer_d_id = 0;
|
||||
|
||||
if (xchg_ok) {
|
||||
|
||||
if (fsf_req->data)
|
||||
memcpy((struct fsf_qtcb_bottom_config *) fsf_req->data,
|
||||
bottom, sizeof (struct fsf_qtcb_bottom_config));
|
||||
|
||||
fc_host_node_name(shost) = bottom->nport_serv_param.wwnn;
|
||||
fc_host_port_name(shost) = bottom->nport_serv_param.wwpn;
|
||||
fc_host_port_id(shost) = bottom->s_id & ZFCP_DID_MASK;
|
||||
fc_host_speed(shost) = bottom->fc_link_speed;
|
||||
fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3;
|
||||
fc_host_supported_classes(shost) =
|
||||
FC_COS_CLASS2 | FC_COS_CLASS3;
|
||||
adapter->hydra_version = bottom->adapter_type;
|
||||
if (fc_host_permanent_port_name(shost) == -1)
|
||||
fc_host_permanent_port_name(shost) =
|
||||
@@ -2053,7 +2110,8 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok)
|
||||
min(FC_SERIAL_NUMBER_SIZE, 17));
|
||||
}
|
||||
|
||||
ZFCP_LOG_NORMAL("The adapter %s reported the following characteristics:\n"
|
||||
ZFCP_LOG_NORMAL("The adapter %s reported the following "
|
||||
"characteristics:\n"
|
||||
"WWNN 0x%016Lx, "
|
||||
"WWPN 0x%016Lx, "
|
||||
"S_ID 0x%06x,\n"
|
||||
@@ -2090,7 +2148,7 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* function: zfcp_fsf_exchange_config_data_handler
|
||||
*
|
||||
* 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)
|
||||
adapter->peer_wwpn,
|
||||
adapter->peer_d_id);
|
||||
debug_text_event(fsf_req->adapter->erp_dbf, 0,
|
||||
"top-p-to-p");
|
||||
"top-p-to-p");
|
||||
break;
|
||||
case FC_PORTTYPE_NLPORT:
|
||||
ZFCP_LOG_NORMAL("error: Arbitrated loop fibrechannel "
|
||||
@@ -2138,8 +2196,8 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
|
||||
return -EIO;
|
||||
case FC_PORTTYPE_NPORT:
|
||||
ZFCP_LOG_NORMAL("Switched fabric fibrechannel "
|
||||
"network detected at adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
"network detected at adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
break;
|
||||
default:
|
||||
ZFCP_LOG_NORMAL("bug: The fibrechannel topology "
|
||||
@@ -2179,7 +2237,8 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
|
||||
if (zfcp_fsf_exchange_config_evaluate(fsf_req, 0))
|
||||
return -EIO;
|
||||
|
||||
atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, &adapter->status);
|
||||
atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK,
|
||||
&adapter->status);
|
||||
|
||||
zfcp_fsf_link_down_info_eval(adapter,
|
||||
&qtcb->header.fsf_status_qual.link_down_info);
|
||||
@@ -2187,7 +2246,7 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
|
||||
default:
|
||||
debug_text_event(fsf_req->adapter->erp_dbf, 0, "fsf-stat-ng");
|
||||
debug_event(fsf_req->adapter->erp_dbf, 0,
|
||||
&fsf_req->qtcb->header.fsf_status, sizeof (u32));
|
||||
&fsf_req->qtcb->header.fsf_status, sizeof(u32));
|
||||
zfcp_erp_adapter_shutdown(adapter, 0);
|
||||
return -EIO;
|
||||
}
|
||||
@@ -2197,34 +2256,91 @@ zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *fsf_req)
|
||||
/**
|
||||
* zfcp_fsf_exchange_port_data - request information about local port
|
||||
* @erp_action: ERP action for the adapter for which port data is requested
|
||||
* @adapter: for which port data is requested
|
||||
* @data: response to exchange port data request
|
||||
*/
|
||||
int
|
||||
zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action,
|
||||
struct zfcp_adapter *adapter,
|
||||
struct fsf_qtcb_bottom_port *data)
|
||||
zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
|
||||
{
|
||||
volatile struct qdio_buffer_element *sbale;
|
||||
struct zfcp_fsf_req *fsf_req;
|
||||
struct zfcp_fsf_req *fsf_req;
|
||||
struct zfcp_adapter *adapter = erp_action->adapter;
|
||||
unsigned long lock_flags;
|
||||
int retval = 0;
|
||||
int retval;
|
||||
|
||||
if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) {
|
||||
ZFCP_LOG_INFO("error: exchange port data "
|
||||
"command not supported by adapter %s\n",
|
||||
"command not supported by adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* setup new FSF request */
|
||||
retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
|
||||
erp_action ? ZFCP_REQ_AUTO_CLEANUP : 0,
|
||||
NULL, &lock_flags, &fsf_req);
|
||||
if (retval < 0) {
|
||||
ZFCP_REQ_AUTO_CLEANUP,
|
||||
adapter->pool.fsf_req_erp,
|
||||
&lock_flags, &fsf_req);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Out of resources. Could not create an "
|
||||
"exchange port data request for"
|
||||
"the adapter %s.\n",
|
||||
"exchange port data request for"
|
||||
"the adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
|
||||
erp_action->fsf_req = fsf_req;
|
||||
fsf_req->erp_action = erp_action;
|
||||
zfcp_erp_start_timer(fsf_req);
|
||||
|
||||
retval = zfcp_fsf_req_send(fsf_req);
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
|
||||
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Could not send an exchange port data "
|
||||
"command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
erp_action->fsf_req = NULL;
|
||||
}
|
||||
else
|
||||
ZFCP_LOG_DEBUG("exchange port data request initiated "
|
||||
"(adapter %s)\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* zfcp_fsf_exchange_port_data_sync - request information about local port
|
||||
* and wait until information is ready
|
||||
*/
|
||||
int
|
||||
zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
|
||||
struct fsf_qtcb_bottom_port *data)
|
||||
{
|
||||
volatile struct qdio_buffer_element *sbale;
|
||||
struct zfcp_fsf_req *fsf_req;
|
||||
unsigned long lock_flags;
|
||||
int retval;
|
||||
|
||||
if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) {
|
||||
ZFCP_LOG_INFO("error: exchange port data "
|
||||
"command not supported by adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* setup new FSF request */
|
||||
retval = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
|
||||
0, NULL, &lock_flags, &fsf_req);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Out of resources. Could not create an "
|
||||
"exchange port data request for"
|
||||
"the adapter %s.\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
@@ -2235,36 +2351,23 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action,
|
||||
fsf_req->data = (unsigned long) data;
|
||||
|
||||
sbale = zfcp_qdio_sbale_req(fsf_req, fsf_req->sbal_curr, 0);
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
|
||||
if (erp_action) {
|
||||
erp_action->fsf_req = fsf_req;
|
||||
fsf_req->erp_action = erp_action;
|
||||
zfcp_erp_start_timer(fsf_req);
|
||||
} else
|
||||
zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT);
|
||||
sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
|
||||
sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
|
||||
zfcp_fsf_start_timer(fsf_req, ZFCP_FSF_REQUEST_TIMEOUT);
|
||||
retval = zfcp_fsf_req_send(fsf_req);
|
||||
if (retval) {
|
||||
ZFCP_LOG_INFO("error: Could not send an exchange port data "
|
||||
"command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
if (erp_action)
|
||||
erp_action->fsf_req = NULL;
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock,
|
||||
lock_flags);
|
||||
return retval;
|
||||
}
|
||||
|
||||
write_unlock_irqrestore(&adapter->request_queue.queue_lock, lock_flags);
|
||||
|
||||
if (!erp_action) {
|
||||
if (retval)
|
||||
ZFCP_LOG_INFO("error: Could not send an exchange port data "
|
||||
"command on the adapter %s\n",
|
||||
zfcp_get_busid_by_adapter(adapter));
|
||||
else
|
||||
wait_event(fsf_req->completion_wq,
|
||||
fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
}
|
||||
|
||||
zfcp_fsf_req_free(fsf_req);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -2277,18 +2380,16 @@ static void
|
||||
zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok)
|
||||
{
|
||||
struct zfcp_adapter *adapter;
|
||||
struct fsf_qtcb *qtcb;
|
||||
struct fsf_qtcb_bottom_port *bottom, *data;
|
||||
struct fsf_qtcb_bottom_port *bottom;
|
||||
struct Scsi_Host *shost;
|
||||
|
||||
adapter = fsf_req->adapter;
|
||||
qtcb = fsf_req->qtcb;
|
||||
bottom = &qtcb->bottom.port;
|
||||
bottom = &fsf_req->qtcb->bottom.port;
|
||||
shost = adapter->scsi_host;
|
||||
|
||||
data = (struct fsf_qtcb_bottom_port*) fsf_req->data;
|
||||
if (data)
|
||||
memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port));
|
||||
if (fsf_req->data)
|
||||
memcpy((struct fsf_qtcb_bottom_port*) fsf_req->data, bottom,
|
||||
sizeof(struct fsf_qtcb_bottom_port));
|
||||
|
||||
if (adapter->connection_features & FSF_FEATURE_NPIV_MODE)
|
||||
fc_host_permanent_port_name(shost) = bottom->wwpn;
|
||||
@@ -2336,10 +2437,10 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req)
|
||||
/*
|
||||
* function: zfcp_fsf_open_port
|
||||
*
|
||||
* purpose:
|
||||
* purpose:
|
||||
*
|
||||
* returns: address of initiated FSF request
|
||||
* NULL - request could not be initiated
|
||||
* NULL - request could not be initiated
|
||||
*/
|
||||
int
|
||||
zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
|
||||
@@ -2400,7 +2501,7 @@ zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
|
||||
*
|
||||
* purpose: is called for finished Open Port command
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
*
|
||||
* purpose: is called for finished Open LUN command
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
* purpose:
|
||||
*
|
||||
* returns: address of fsf_req - request successfully initiated
|
||||
* NULL -
|
||||
* NULL -
|
||||
*
|
||||
* assumptions: This routine does not check whether the associated
|
||||
* remote port/lun has already been opened. This should be
|
||||
@@ -3586,17 +3687,17 @@ zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
|
||||
ZFCP_LOG_DEBUG(
|
||||
"Data did not fit into available buffer(s), "
|
||||
"waiting for more...\n");
|
||||
retval = -EIO;
|
||||
} else {
|
||||
ZFCP_LOG_NORMAL("error: No truncation implemented but "
|
||||
"required. Shutting down unit "
|
||||
"(adapter %s, port 0x%016Lx, "
|
||||
"unit 0x%016Lx)\n",
|
||||
zfcp_get_busid_by_unit(unit),
|
||||
unit->port->wwpn,
|
||||
unit->fcp_lun);
|
||||
zfcp_erp_unit_shutdown(unit, 0);
|
||||
retval = -EINVAL;
|
||||
retval = -EIO;
|
||||
} else {
|
||||
ZFCP_LOG_NORMAL("error: No truncation implemented but "
|
||||
"required. Shutting down unit "
|
||||
"(adapter %s, port 0x%016Lx, "
|
||||
"unit 0x%016Lx)\n",
|
||||
zfcp_get_busid_by_unit(unit),
|
||||
unit->port->wwpn,
|
||||
unit->fcp_lun);
|
||||
zfcp_erp_unit_shutdown(unit, 0);
|
||||
retval = -EINVAL;
|
||||
}
|
||||
goto no_fit;
|
||||
}
|
||||
@@ -3727,7 +3828,7 @@ zfcp_fsf_send_fcp_command_task_management(struct zfcp_adapter *adapter,
|
||||
*
|
||||
* purpose: is called for finished Send FCP Command
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
*
|
||||
* purpose: evaluates FCP_RSP IU
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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)
|
||||
*
|
||||
* purpose: evaluates FCP_RSP IU
|
||||
*
|
||||
* returns:
|
||||
* returns:
|
||||
*/
|
||||
static int
|
||||
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,
|
||||
INIT_LIST_HEAD(&fsf_req->list);
|
||||
init_timer(&fsf_req->timer);
|
||||
|
||||
/* initialize waitqueue which may be used to wait on
|
||||
/* initialize waitqueue which may be used to wait on
|
||||
this request completion */
|
||||
init_waitqueue_head(&fsf_req->completion_wq);
|
||||
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of the zfcp device driver for
|
||||
* FCP adapters for IBM System z9 and zSeries.
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2002, 2006
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef FSF_H
|
||||
|
||||
@@ -174,10 +174,9 @@ zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter, unsigned int status,
|
||||
* That is why we need to clear the link-down flag
|
||||
* which is set again in case we have missed by a mile.
|
||||
*/
|
||||
zfcp_erp_adapter_reopen(
|
||||
adapter,
|
||||
ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
|
||||
ZFCP_STATUS_COMMON_ERP_FAILED);
|
||||
zfcp_erp_adapter_reopen(adapter,
|
||||
ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
|
||||
ZFCP_STATUS_COMMON_ERP_FAILED);
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
/*
|
||||
/*
|
||||
* This file is part of the zfcp device driver for
|
||||
* FCP adapters for IBM System z9 and zSeries.
|
||||
*
|
||||
* (C) Copyright IBM Corp. 2002, 2006
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_SCSI
|
||||
@@ -101,7 +101,7 @@ zfcp_get_fcp_dl_ptr(struct fcp_cmnd_iu * fcp_cmd)
|
||||
((unsigned char *) fcp_cmd +
|
||||
sizeof (struct fcp_cmnd_iu) + additional_length);
|
||||
/*
|
||||
* fcp_dl_addr = start address of fcp_cmnd structure +
|
||||
* fcp_dl_addr = start address of fcp_cmnd structure +
|
||||
* size of fixed part + size of dynamically sized add_dcp_cdb field
|
||||
* SEE FCP-2 documentation
|
||||
*/
|
||||
@@ -189,13 +189,12 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt)
|
||||
unit->device = NULL;
|
||||
zfcp_erp_unit_failed(unit);
|
||||
zfcp_unit_put(unit);
|
||||
} else {
|
||||
} else
|
||||
ZFCP_LOG_NORMAL("bug: no unit associated with SCSI device at "
|
||||
"address %p\n", sdpnt);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* called from scsi midlayer to allow finetuning of a device.
|
||||
*/
|
||||
static int
|
||||
@@ -361,12 +360,11 @@ zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, unsigned int id,
|
||||
list_for_each_entry(port, &adapter->port_list_head, list) {
|
||||
if (!port->rport || (id != port->rport->scsi_target_id))
|
||||
continue;
|
||||
list_for_each_entry(unit, &port->unit_list_head, list) {
|
||||
list_for_each_entry(unit, &port->unit_list_head, list)
|
||||
if (lun == unit->scsi_lun) {
|
||||
retval = unit;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
out:
|
||||
return retval;
|
||||
@@ -374,7 +372,7 @@ zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, unsigned int id,
|
||||
|
||||
/**
|
||||
* zfcp_scsi_eh_abort_handler - abort the specified SCSI command
|
||||
* @scpnt: pointer to scsi_cmnd to be aborted
|
||||
* @scpnt: pointer to scsi_cmnd to be aborted
|
||||
* Return: SUCCESS - command has been aborted and cleaned up in internal
|
||||
* bookkeeping, SCSI stack won't be called for aborted command
|
||||
* FAILED - otherwise
|
||||
@@ -733,7 +731,7 @@ zfcp_get_fc_host_stats(struct Scsi_Host *shost)
|
||||
if (!data)
|
||||
return NULL;
|
||||
|
||||
ret = zfcp_fsf_exchange_port_data(NULL, adapter, data);
|
||||
ret = zfcp_fsf_exchange_port_data_sync(adapter, data);
|
||||
if (ret) {
|
||||
kfree(data);
|
||||
return NULL; /* XXX return zeroed fc_stats? */
|
||||
@@ -763,7 +761,7 @@ zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
ret = zfcp_fsf_exchange_port_data(NULL, adapter, data);
|
||||
ret = zfcp_fsf_exchange_port_data_sync(adapter, data);
|
||||
if (ret) {
|
||||
kfree(data);
|
||||
} else {
|
||||
@@ -802,6 +800,7 @@ struct fc_function_template zfcp_transport_functions = {
|
||||
.show_host_port_type = 1,
|
||||
.show_host_speed = 1,
|
||||
.show_host_port_id = 1,
|
||||
.disable_target_scan = 1,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -139,7 +139,7 @@ static struct attribute_group zfcp_unit_attr_group = {
|
||||
.attrs = zfcp_unit_attrs,
|
||||
};
|
||||
|
||||
/**
|
||||
/**
|
||||
* zfcp_sysfs_create_unit_files - create sysfs unit files
|
||||
* @dev: pointer to belonging device
|
||||
*
|
||||
@@ -151,7 +151,7 @@ zfcp_sysfs_unit_create_files(struct device *dev)
|
||||
return sysfs_create_group(&dev->kobj, &zfcp_unit_attr_group);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* zfcp_sysfs_remove_unit_files - remove sysfs unit files
|
||||
* @dev: pointer to belonging device
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user