Commit feb32884 authored by Martin Schwidefsky's avatar Martin Schwidefsky Committed by Linus Torvalds

[PATCH] s390: zfcp host adapter

From: Andreas Herrmann <aherrman@de.ibm.com>

zfcp host adapter change:
 - Avoid usage of unregister debug feature.
 - Avoid race when unregistering debug feature.
 - Corrected some log messages for WKA ports.
 - Don't pass NULL pointer to debug_register_view and debug_set_level.
 - Some coding style cleanup.
 - Fix race between scsi_add_device and deregistration of the adapter.
 - Shorten & rename zfcp_els/zfcp_els_handler.
 - Remove unused code for unused ELS commands.
 - Evaluate response instead of request in adisc handler.
 - Allocate qdio queue structures below 2GB.
 - Remove ifdefs around ioctl32.h.
 - Use CONFIG_COMPAT instead of CONFIG_S390_SUPPORT.
 - Use semaphore in zfcp_ccw_shutdown.
 - Strip down debug_register/debug_unregister.
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 24553f2d
...@@ -29,8 +29,7 @@ ...@@ -29,8 +29,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* this drivers version (do not edit !!! generated and updated by cvs) */ #define ZFCP_AUX_REVISION "$Revision: 1.144 $"
#define ZFCP_AUX_REVISION "$Revision: 1.135 $"
#include "zfcp_ext.h" #include "zfcp_ext.h"
...@@ -61,7 +60,7 @@ static int zfcp_cfdc_dev_ioctl(struct inode *, struct file *, ...@@ -61,7 +60,7 @@ static int zfcp_cfdc_dev_ioctl(struct inode *, struct file *,
#define ZFCP_CFDC_IOC \ #define ZFCP_CFDC_IOC \
_IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_sense_data) _IOWR(ZFCP_CFDC_IOC_MAGIC, 0, struct zfcp_cfdc_sense_data)
#ifdef CONFIG_S390_SUPPORT #ifdef CONFIG_COMPAT
static struct ioctl_trans zfcp_ioctl_trans = {ZFCP_CFDC_IOC, (void*) sys_ioctl}; static struct ioctl_trans zfcp_ioctl_trans = {ZFCP_CFDC_IOC, (void*) sys_ioctl};
#endif #endif
...@@ -147,7 +146,7 @@ zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req, ...@@ -147,7 +146,7 @@ zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req,
int i; int i;
unsigned long flags; unsigned long flags;
write_lock_irqsave(&adapter->cmd_dbf_lock, flags); spin_lock_irqsave(&adapter->dbf_lock, flags);
if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) { if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) {
scsi_cmnd = fsf_req->data.send_fcp_command_task.scsi_cmnd; scsi_cmnd = fsf_req->data.send_fcp_command_task.scsi_cmnd;
debug_text_event(adapter->cmd_dbf, level, "fsferror"); debug_text_event(adapter->cmd_dbf, level, "fsferror");
...@@ -166,7 +165,7 @@ zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req, ...@@ -166,7 +165,7 @@ zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req,
(char *) add_data + i, (char *) add_data + i,
min(ZFCP_CMD_DBF_LENGTH, add_length - i)); min(ZFCP_CMD_DBF_LENGTH, add_length - i));
} }
write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags); spin_unlock_irqrestore(&adapter->dbf_lock, flags);
} }
/* XXX additionally log unit if available */ /* XXX additionally log unit if available */
...@@ -183,7 +182,7 @@ zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd) ...@@ -183,7 +182,7 @@ zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd)
adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0]; adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0];
req_data = (union zfcp_req_data *) scsi_cmnd->host_scribble; req_data = (union zfcp_req_data *) scsi_cmnd->host_scribble;
fsf_req = (req_data ? req_data->send_fcp_command_task.fsf_req : NULL); fsf_req = (req_data ? req_data->send_fcp_command_task.fsf_req : NULL);
write_lock_irqsave(&adapter->cmd_dbf_lock, flags); spin_lock_irqsave(&adapter->dbf_lock, flags);
debug_text_event(adapter->cmd_dbf, level, "hostbyte"); debug_text_event(adapter->cmd_dbf, level, "hostbyte");
debug_text_event(adapter->cmd_dbf, level, text); debug_text_event(adapter->cmd_dbf, level, text);
debug_event(adapter->cmd_dbf, level, &scsi_cmnd->result, sizeof (u32)); debug_event(adapter->cmd_dbf, level, &scsi_cmnd->result, sizeof (u32));
...@@ -200,7 +199,7 @@ zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd) ...@@ -200,7 +199,7 @@ zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd)
debug_text_event(adapter->cmd_dbf, level, ""); debug_text_event(adapter->cmd_dbf, level, "");
debug_text_event(adapter->cmd_dbf, level, ""); debug_text_event(adapter->cmd_dbf, level, "");
} }
write_unlock_irqrestore(&adapter->cmd_dbf_lock, flags); spin_unlock_irqrestore(&adapter->dbf_lock, flags);
} }
void void
...@@ -280,7 +279,7 @@ zfcp_init_device_configure(void) ...@@ -280,7 +279,7 @@ zfcp_init_device_configure(void)
goto out_unit; goto out_unit;
up(&zfcp_data.config_sema); up(&zfcp_data.config_sema);
ccw_device_set_online(adapter->ccw_device); ccw_device_set_online(adapter->ccw_device);
wait_event(unit->scsi_add_wq, atomic_read(&unit->scsi_add_work) == 0); zfcp_erp_wait(adapter);
down(&zfcp_data.config_sema); down(&zfcp_data.config_sema);
zfcp_unit_put(unit); zfcp_unit_put(unit);
out_unit: out_unit:
...@@ -310,14 +309,13 @@ zfcp_module_init(void) ...@@ -310,14 +309,13 @@ zfcp_module_init(void)
if (!zfcp_transport_template) if (!zfcp_transport_template)
return -ENODEV; return -ENODEV;
#ifdef CONFIG_S390_SUPPORT
retval = register_ioctl32_conversion(zfcp_ioctl_trans.cmd, retval = register_ioctl32_conversion(zfcp_ioctl_trans.cmd,
zfcp_ioctl_trans.handler); zfcp_ioctl_trans.handler);
if (retval != 0) { if (retval != 0) {
ZFCP_LOG_INFO("registration of ioctl32 conversion failed\n"); ZFCP_LOG_INFO("registration of ioctl32 conversion failed\n");
goto out_ioctl32; goto out;
} }
#endif
retval = misc_register(&zfcp_cfdc_misc); retval = misc_register(&zfcp_cfdc_misc);
if (retval != 0) { if (retval != 0) {
ZFCP_LOG_INFO("registration of misc device " ZFCP_LOG_INFO("registration of misc device "
...@@ -352,11 +350,7 @@ zfcp_module_init(void) ...@@ -352,11 +350,7 @@ zfcp_module_init(void)
out_ccw_register: out_ccw_register:
misc_deregister(&zfcp_cfdc_misc); misc_deregister(&zfcp_cfdc_misc);
out_misc_register: out_misc_register:
#ifdef CONFIG_S390_SUPPORT
unregister_ioctl32_conversion(zfcp_ioctl_trans.cmd); unregister_ioctl32_conversion(zfcp_ioctl_trans.cmd);
out_ioctl32:
#endif
out: out:
return retval; return retval;
} }
...@@ -868,7 +862,6 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun) ...@@ -868,7 +862,6 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
return NULL; return NULL;
memset(unit, 0, sizeof (struct zfcp_unit)); memset(unit, 0, sizeof (struct zfcp_unit));
init_waitqueue_head(&unit->scsi_add_wq);
/* initialise reference count stuff */ /* initialise reference count stuff */
atomic_set(&unit->refcount, 0); atomic_set(&unit->refcount, 0);
init_waitqueue_head(&unit->remove_wq); init_waitqueue_head(&unit->remove_wq);
...@@ -1042,11 +1035,11 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter) ...@@ -1042,11 +1035,11 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
char dbf_name[20]; char dbf_name[20];
/* debug feature area which records SCSI command failures (hostbyte) */ /* debug feature area which records SCSI command failures (hostbyte) */
rwlock_init(&adapter->cmd_dbf_lock); spin_lock_init(&adapter->dbf_lock);
sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s", sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s",
zfcp_get_busid_by_adapter(adapter)); zfcp_get_busid_by_adapter(adapter));
adapter->cmd_dbf = debug_register(dbf_name, adapter->cmd_dbf = debug_register(dbf_name, ZFCP_CMD_DBF_INDEX,
ZFCP_CMD_DBF_INDEX,
ZFCP_CMD_DBF_AREAS, ZFCP_CMD_DBF_AREAS,
ZFCP_CMD_DBF_LENGTH); ZFCP_CMD_DBF_LENGTH);
debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view); debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view);
...@@ -1055,40 +1048,38 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter) ...@@ -1055,40 +1048,38 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
/* debug feature area which records SCSI command aborts */ /* debug feature area which records SCSI command aborts */
sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s", sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s",
zfcp_get_busid_by_adapter(adapter)); zfcp_get_busid_by_adapter(adapter));
adapter->abort_dbf = debug_register(dbf_name, adapter->abort_dbf = debug_register(dbf_name, ZFCP_ABORT_DBF_INDEX,
ZFCP_ABORT_DBF_INDEX,
ZFCP_ABORT_DBF_AREAS, ZFCP_ABORT_DBF_AREAS,
ZFCP_ABORT_DBF_LENGTH); ZFCP_ABORT_DBF_LENGTH);
debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view); debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view);
debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL); debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL);
/* debug feature area which records SCSI command aborts */ /* debug feature area which records incoming ELS commands */
sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s", sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s",
zfcp_get_busid_by_adapter(adapter)); zfcp_get_busid_by_adapter(adapter));
adapter->in_els_dbf = debug_register(dbf_name, adapter->in_els_dbf = debug_register(dbf_name, ZFCP_IN_ELS_DBF_INDEX,
ZFCP_IN_ELS_DBF_INDEX,
ZFCP_IN_ELS_DBF_AREAS, ZFCP_IN_ELS_DBF_AREAS,
ZFCP_IN_ELS_DBF_LENGTH); ZFCP_IN_ELS_DBF_LENGTH);
debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view); debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view);
debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL); debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL);
/* debug feature area which records erp events */ /* debug feature area which records erp events */
sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s", sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s",
zfcp_get_busid_by_adapter(adapter)); zfcp_get_busid_by_adapter(adapter));
adapter->erp_dbf = debug_register(dbf_name, adapter->erp_dbf = debug_register(dbf_name, ZFCP_ERP_DBF_INDEX,
ZFCP_ERP_DBF_INDEX,
ZFCP_ERP_DBF_AREAS, ZFCP_ERP_DBF_AREAS,
ZFCP_ERP_DBF_LENGTH); ZFCP_ERP_DBF_LENGTH);
debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view); debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view);
debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL); debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL);
if (adapter->cmd_dbf && adapter->abort_dbf && if (!(adapter->cmd_dbf && adapter->abort_dbf &&
adapter->in_els_dbf && adapter->erp_dbf) adapter->in_els_dbf && adapter->erp_dbf)) {
return 0; zfcp_adapter_debug_unregister(adapter);
return -ENOMEM;
}
return 0;
zfcp_adapter_debug_unregister(adapter);
return -ENOMEM;
} }
/** /**
...@@ -1098,10 +1089,14 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter) ...@@ -1098,10 +1089,14 @@ zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
void void
zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter) zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter)
{ {
debug_unregister(adapter->erp_dbf); debug_unregister(adapter->abort_dbf);
debug_unregister(adapter->cmd_dbf); debug_unregister(adapter->cmd_dbf);
debug_unregister(adapter->abort_dbf); debug_unregister(adapter->erp_dbf);
debug_unregister(adapter->in_els_dbf); debug_unregister(adapter->in_els_dbf);
adapter->abort_dbf = NULL;
adapter->cmd_dbf = NULL;
adapter->erp_dbf = NULL;
adapter->in_els_dbf = NULL;
} }
void void
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define ZFCP_CCW_C_REVISION "$Revision: 1.57 $" #define ZFCP_CCW_C_REVISION "$Revision: 1.58 $"
#include "zfcp_ext.h" #include "zfcp_ext.h"
...@@ -302,9 +302,11 @@ zfcp_ccw_shutdown(struct device *dev) ...@@ -302,9 +302,11 @@ zfcp_ccw_shutdown(struct device *dev)
{ {
struct zfcp_adapter *adapter; struct zfcp_adapter *adapter;
down(&zfcp_data.config_sema);
adapter = dev_get_drvdata(dev); adapter = dev_get_drvdata(dev);
zfcp_erp_adapter_shutdown(adapter, 0); zfcp_erp_adapter_shutdown(adapter, 0);
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
up(&zfcp_data.config_sema);
} }
#undef ZFCP_LOG_AREA #undef ZFCP_LOG_AREA
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
#define ZFCP_DEF_H #define ZFCP_DEF_H
/* this drivers version (do not edit !!! generated and updated by cvs) */ /* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_DEF_REVISION "$Revision: 1.98 $" #define ZFCP_DEF_REVISION "$Revision: 1.107 $"
/*************************** INCLUDES *****************************************/ /*************************** INCLUDES *****************************************/
...@@ -61,9 +61,7 @@ ...@@ -61,9 +61,7 @@
#include <linux/mempool.h> #include <linux/mempool.h>
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/ioctl.h> #include <linux/ioctl.h>
#ifdef CONFIG_S390_SUPPORT
#include <linux/ioctl32.h> #include <linux/ioctl32.h>
#endif
/************************ DEBUG FLAGS *****************************************/ /************************ DEBUG FLAGS *****************************************/
...@@ -71,8 +69,7 @@ ...@@ -71,8 +69,7 @@
/********************* GENERAL DEFINES *********************************/ /********************* GENERAL DEFINES *********************************/
/* zfcp version number, it consists of major, minor, and patch-level number */ #define ZFCP_VERSION "4.2.0"
#define ZFCP_VERSION "4.1.4"
/** /**
* zfcp_sg_to_address - determine kernel address from struct scatterlist * zfcp_sg_to_address - determine kernel address from struct scatterlist
...@@ -290,11 +287,11 @@ struct fcp_logo { ...@@ -290,11 +287,11 @@ struct fcp_logo {
#define R_A_TOV 10 /* seconds */ #define R_A_TOV 10 /* seconds */
#define ZFCP_ELS_TIMEOUT (2 * R_A_TOV) #define ZFCP_ELS_TIMEOUT (2 * R_A_TOV)
#define ZFCP_LS_RTV 0x0E #define ZFCP_LS_RLS 0x0f
#define ZFCP_LS_RLS 0x0F
#define ZFCP_LS_PDISC 0x50
#define ZFCP_LS_ADISC 0x52 #define ZFCP_LS_ADISC 0x52
#define ZFCP_LS_RTV_E_D_TOV_FLAG 0x04000000 #define ZFCP_LS_RPS 0x56
#define ZFCP_LS_RSCN 0x61
#define ZFCP_LS_RNID 0x78
struct zfcp_ls_rjt_par { struct zfcp_ls_rjt_par {
u8 action; u8 action;
...@@ -303,82 +300,22 @@ struct zfcp_ls_rjt_par { ...@@ -303,82 +300,22 @@ struct zfcp_ls_rjt_par {
u8 vendor_unique; u8 vendor_unique;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_ls_rtv {
u8 code;
u8 field[3];
} __attribute__ ((packed));
struct zfcp_ls_rtv_acc {
u8 code;
u8 field[3];
u32 r_a_tov;
u32 e_d_tov;
u32 qualifier;
} __attribute__ ((packed));
struct zfcp_ls_rls {
u8 code;
u8 field[3];
fc_id_t port_id;
} __attribute__ ((packed));
struct zfcp_ls_rls_acc {
u8 code;
u8 field[3];
u32 link_failure_count;
u32 loss_of_sync_count;
u32 loss_of_signal_count;
u32 prim_seq_prot_error;
u32 invalid_transmition_word;
u32 invalid_crc_count;
} __attribute__ ((packed));
struct zfcp_ls_pdisc {
u8 code;
u8 field[3];
u8 common_svc_parm[16];
wwn_t wwpn;
wwn_t wwnn;
struct {
u8 class1[16];
u8 class2[16];
u8 class3[16];
} svc_parm;
u8 reserved[16];
u8 vendor_version[16];
} __attribute__ ((packed));
struct zfcp_ls_pdisc_acc {
u8 code;
u8 field[3];
u8 common_svc_parm[16];
wwn_t wwpn;
wwn_t wwnn;
struct {
u8 class1[16];
u8 class2[16];
u8 class3[16];
} svc_parm;
u8 reserved[16];
u8 vendor_version[16];
} __attribute__ ((packed));
struct zfcp_ls_adisc { struct zfcp_ls_adisc {
u8 code; u8 code;
u8 field[3]; u8 field[3];
fc_id_t hard_nport_id; u32 hard_nport_id;
wwn_t wwpn; u64 wwpn;
wwn_t wwnn; u64 wwnn;
fc_id_t nport_id; u32 nport_id;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_ls_adisc_acc { struct zfcp_ls_adisc_acc {
u8 code; u8 code;
u8 field[3]; u8 field[3];
fc_id_t hard_nport_id; u32 hard_nport_id;
wwn_t wwpn; u64 wwpn;
wwn_t wwnn; u64 wwnn;
fc_id_t nport_id; u32 nport_id;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_rc_entry { struct zfcp_rc_entry {
...@@ -490,7 +427,7 @@ struct zfcp_rc_entry { ...@@ -490,7 +427,7 @@ struct zfcp_rc_entry {
/* logging routine for zfcp */ /* logging routine for zfcp */
#define _ZFCP_LOG(fmt, args...) \ #define _ZFCP_LOG(fmt, args...) \
printk(KERN_ERR ZFCP_NAME": %s(%d): " fmt, __FUNCTION__, \ printk(KERN_ERR ZFCP_NAME": %s(%d): " fmt, __FUNCTION__, \
__LINE__ , ##args); __LINE__ , ##args)
#define ZFCP_LOG(level, fmt, args...) \ #define ZFCP_LOG(level, fmt, args...) \
do { \ do { \
...@@ -956,7 +893,7 @@ struct zfcp_adapter { ...@@ -956,7 +893,7 @@ struct zfcp_adapter {
debug_info_t *abort_dbf; debug_info_t *abort_dbf;
debug_info_t *in_els_dbf; debug_info_t *in_els_dbf;
debug_info_t *cmd_dbf; debug_info_t *cmd_dbf;
rwlock_t cmd_dbf_lock; spinlock_t dbf_lock;
struct zfcp_adapter_mempool pool; /* Adapter memory pools */ struct zfcp_adapter_mempool pool; /* Adapter memory pools */
struct qdio_initialize qdio_init_data; /* for qdio_establish */ struct qdio_initialize qdio_init_data; /* for qdio_establish */
struct device generic_services; /* directory for WKA ports */ struct device generic_services; /* directory for WKA ports */
...@@ -1006,8 +943,6 @@ struct zfcp_unit { ...@@ -1006,8 +943,6 @@ struct zfcp_unit {
struct scsi_device *device; /* scsi device struct pointer */ struct scsi_device *device; /* scsi device struct pointer */
struct zfcp_erp_action erp_action; /* pending error recovery */ struct zfcp_erp_action erp_action; /* pending error recovery */
atomic_t erp_counter; atomic_t erp_counter;
atomic_t scsi_add_work; /* used to synchronize */
wait_queue_head_t scsi_add_wq; /* wait for scsi_add_device */
}; };
/* FSF request */ /* FSF request */
......
This diff is collapsed.
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
*/ */
/* this drivers version (do not edit !!! generated and updated by cvs) */ /* this drivers version (do not edit !!! generated and updated by cvs) */
#define ZFCP_FSF_C_REVISION "$Revision: 1.76 $" #define ZFCP_FSF_C_REVISION "$Revision: 1.80 $"
#include "zfcp_ext.h" #include "zfcp_ext.h"
...@@ -784,12 +784,12 @@ zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req) ...@@ -784,12 +784,12 @@ zfcp_fsf_req_dispatch(struct zfcp_fsf_req *fsf_req)
zfcp_fsf_exchange_config_data_handler(fsf_req); zfcp_fsf_exchange_config_data_handler(fsf_req);
break; break;
case FSF_QTCB_EXCHANGE_PORT_DATA : case FSF_QTCB_EXCHANGE_PORT_DATA:
ZFCP_LOG_FLAGS(2, "FSF_QTCB_EXCHANGE_PORT_DATA\n"); ZFCP_LOG_FLAGS(2, "FSF_QTCB_EXCHANGE_PORT_DATA\n");
zfcp_fsf_exchange_port_data_handler(fsf_req); zfcp_fsf_exchange_port_data_handler(fsf_req);
break; break;
case FSF_QTCB_SEND_ELS : case FSF_QTCB_SEND_ELS:
ZFCP_LOG_FLAGS(2, "FSF_QTCB_SEND_ELS\n"); ZFCP_LOG_FLAGS(2, "FSF_QTCB_SEND_ELS\n");
zfcp_fsf_send_els_handler(fsf_req); zfcp_fsf_send_els_handler(fsf_req);
break; break;
...@@ -1521,20 +1521,18 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1521,20 +1521,18 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
header = &fsf_req->qtcb->header; header = &fsf_req->qtcb->header;
bottom = &fsf_req->qtcb->bottom.support; bottom = &fsf_req->qtcb->bottom.support;
if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) { if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR)
/* do not set ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED */
goto skip_fsfstatus; goto skip_fsfstatus;
}
/* evaluate FSF status in QTCB */ /* evaluate FSF status in QTCB */
switch (header->fsf_status) { switch (header->fsf_status) {
case FSF_GOOD : case FSF_GOOD:
ZFCP_LOG_FLAGS(2,"FSF_GOOD\n"); ZFCP_LOG_FLAGS(2,"FSF_GOOD\n");
retval = 0; retval = 0;
break; break;
case FSF_SERVICE_CLASS_NOT_SUPPORTED : case FSF_SERVICE_CLASS_NOT_SUPPORTED:
ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n"); ZFCP_LOG_FLAGS(2, "FSF_SERVICE_CLASS_NOT_SUPPORTED\n");
if (adapter->fc_service_class <= 3) { if (adapter->fc_service_class <= 3) {
ZFCP_LOG_INFO("error: adapter %s does not support fc " ZFCP_LOG_INFO("error: adapter %s does not support fc "
...@@ -1550,21 +1548,21 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1550,21 +1548,21 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
} }
/* stop operation for this adapter */ /* stop operation for this adapter */
debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup"); debug_text_exception(adapter->erp_dbf, 0, "fsf_s_class_nsup");
zfcp_erp_adapter_shutdown(port->adapter, 0); zfcp_erp_adapter_shutdown(adapter, 0);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
case FSF_ADAPTER_STATUS_AVAILABLE : case FSF_ADAPTER_STATUS_AVAILABLE:
ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n"); ZFCP_LOG_FLAGS(2, "FSF_ADAPTER_STATUS_AVAILABLE\n");
switch (header->fsf_status_qual.word[0]){ switch (header->fsf_status_qual.word[0]){
case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE : case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
ZFCP_LOG_FLAGS(2,"FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n"); ZFCP_LOG_FLAGS(2,"FSF_SQ_INVOKE_LINK_TEST_PROCEDURE\n");
/* reopening link to port */ /* reopening link to port */
debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest"); debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ltest");
zfcp_test_link(port); zfcp_test_link(port);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED : case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
ZFCP_LOG_FLAGS(2,"FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n"); ZFCP_LOG_FLAGS(2,"FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED\n");
/* ERP strategy will escalate */ /* ERP strategy will escalate */
debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp"); debug_text_event(adapter->erp_dbf, 1, "fsf_sq_ulp");
...@@ -1580,9 +1578,9 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1580,9 +1578,9 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
case FSF_ACCESS_DENIED: case FSF_ACCESS_DENIED:
ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n"); ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
ZFCP_LOG_NORMAL("Access denied, cannot send generic command " ZFCP_LOG_NORMAL("access denied, cannot send generic service "
"to port 0x%016Lx on adapter %s\n", port->wwpn, "command (adapter %s, port d_id=0x%08x)\n",
zfcp_get_busid_by_port(port)); zfcp_get_busid_by_port(port), port->d_id);
for (counter = 0; counter < 2; counter++) { for (counter = 0; counter < 2; counter++) {
subtable = header->fsf_status_qual.halfword[counter * 2]; subtable = header->fsf_status_qual.halfword[counter * 2];
rule = header->fsf_status_qual.halfword[counter * 2 + 1]; rule = header->fsf_status_qual.halfword[counter * 2 + 1];
...@@ -1600,11 +1598,11 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1600,11 +1598,11 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
case FSF_GENERIC_COMMAND_REJECTED : case FSF_GENERIC_COMMAND_REJECTED:
ZFCP_LOG_FLAGS(2, "FSF_GENERIC_COMMAND_REJECTED\n"); ZFCP_LOG_FLAGS(2, "FSF_GENERIC_COMMAND_REJECTED\n");
ZFCP_LOG_INFO("warning: The port 0x%016Lx on adapter %s has " ZFCP_LOG_INFO("generic service command rejected "
"rejected a generic services command.\n", "(adapter %s, port d_id=0x%08x)\n",
port->wwpn, zfcp_get_busid_by_port(port)); zfcp_get_busid_by_port(port), port->d_id);
ZFCP_LOG_INFO("status qualifier:\n"); ZFCP_LOG_INFO("status qualifier:\n");
ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO, ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_INFO,
(char *) &header->fsf_status_qual, (char *) &header->fsf_status_qual,
...@@ -1613,7 +1611,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1613,7 +1611,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
case FSF_PORT_HANDLE_NOT_VALID : case FSF_PORT_HANDLE_NOT_VALID:
ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n"); ZFCP_LOG_FLAGS(2, "FSF_PORT_HANDLE_NOT_VALID\n");
ZFCP_LOG_DEBUG("Temporary port identifier 0x%x for port " ZFCP_LOG_DEBUG("Temporary port identifier 0x%x for port "
"0x%016Lx on adapter %s invalid. This may " "0x%016Lx on adapter %s invalid. This may "
...@@ -1624,15 +1622,15 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1624,15 +1622,15 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
(char *) &header->fsf_status_qual, (char *) &header->fsf_status_qual,
sizeof (union fsf_status_qual)); sizeof (union fsf_status_qual));
debug_text_event(adapter->erp_dbf, 1, "fsf_s_phandle_nv"); debug_text_event(adapter->erp_dbf, 1, "fsf_s_phandle_nv");
zfcp_erp_adapter_reopen(port->adapter, 0); zfcp_erp_adapter_reopen(adapter, 0);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
case FSF_PORT_BOXED : case FSF_PORT_BOXED:
ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n"); ZFCP_LOG_FLAGS(2, "FSF_PORT_BOXED\n");
ZFCP_LOG_INFO("The remote port 0x%016Lx on adapter %s " ZFCP_LOG_INFO("port needs to be reopened "
"needs to be reopened\n", "(adapter %s, port d_id=0x%08x)\n",
port->wwpn, zfcp_get_busid_by_port(port)); zfcp_get_busid_by_port(port), port->d_id);
debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed"); debug_text_event(adapter->erp_dbf, 2, "fsf_s_pboxed");
zfcp_erp_port_reopen(port, 0); zfcp_erp_port_reopen(port, 0);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR
...@@ -1674,7 +1672,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1674,7 +1672,7 @@ zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *fsf_req)
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
default : default:
ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented " ZFCP_LOG_NORMAL("bug: An unknown FSF Status was presented "
"(debug info 0x%x)\n", header->fsf_status); "(debug info 0x%x)\n", header->fsf_status);
debug_text_event(adapter->erp_dbf, 0, "fsf_sq_inval:"); debug_text_event(adapter->erp_dbf, 0, "fsf_sq_inval:");
...@@ -1959,8 +1957,8 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) ...@@ -1959,8 +1957,8 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req)
case FSF_ACCESS_DENIED: case FSF_ACCESS_DENIED:
ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n"); ZFCP_LOG_FLAGS(2, "FSF_ACCESS_DENIED\n");
ZFCP_LOG_NORMAL("Access denied, cannot send ELS " ZFCP_LOG_NORMAL("access denied, cannot send ELS command "
"(adapter: %s, port d_id: 0x%08x)\n", "(adapter %s, port d_id=0x%08x)\n",
zfcp_get_busid_by_adapter(adapter), d_id); zfcp_get_busid_by_adapter(adapter), d_id);
for (counter = 0; counter < 2; counter++) { for (counter = 0; counter < 2; counter++) {
subtable = header->fsf_status_qual.halfword[counter * 2]; subtable = header->fsf_status_qual.halfword[counter * 2];
...@@ -2335,7 +2333,7 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) ...@@ -2335,7 +2333,7 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req)
return; return;
switch (fsf_req->qtcb->header.fsf_status) { switch (fsf_req->qtcb->header.fsf_status) {
case FSF_GOOD : case FSF_GOOD:
ZFCP_LOG_FLAGS(2,"FSF_GOOD\n"); ZFCP_LOG_FLAGS(2,"FSF_GOOD\n");
bottom = &fsf_req->qtcb->bottom.port; bottom = &fsf_req->qtcb->bottom.port;
memcpy(data, bottom, sizeof(*data)); memcpy(data, bottom, sizeof(*data));
...@@ -2589,7 +2587,8 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req) ...@@ -2589,7 +2587,8 @@ zfcp_fsf_open_port_handler(struct zfcp_fsf_req *fsf_req)
/* should never occure, subtype not set in zfcp_fsf_open_port */ /* should never occure, subtype not set in zfcp_fsf_open_port */
ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n"); ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n");
ZFCP_LOG_INFO("unknown operation subtype (adapter: %s, " ZFCP_LOG_INFO("unknown operation subtype (adapter: %s, "
"op_subtype=0x%x)\n", zfcp_get_busid_by_port(port), "op_subtype=0x%x)\n",
zfcp_get_busid_by_port(port),
fsf_req->qtcb->bottom.support.operation_subtype); fsf_req->qtcb->bottom.support.operation_subtype);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
break; break;
...@@ -3118,7 +3117,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req) ...@@ -3118,7 +3117,7 @@ zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *fsf_req)
ZFCP_STATUS_FSFREQ_RETRY; ZFCP_STATUS_FSFREQ_RETRY;
break; break;
case FSF_LUN_SHARING_VIOLATION : case FSF_LUN_SHARING_VIOLATION:
ZFCP_LOG_FLAGS(2, "FSF_LUN_SHARING_VIOLATION\n"); ZFCP_LOG_FLAGS(2, "FSF_LUN_SHARING_VIOLATION\n");
if (header->fsf_status_qual.word[0] != 0) { if (header->fsf_status_qual.word[0] != 0) {
ZFCP_LOG_NORMAL("FCP-LUN 0x%Lx at the remote port " ZFCP_LOG_NORMAL("FCP-LUN 0x%Lx at the remote port "
...@@ -4621,7 +4620,8 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req) ...@@ -4621,7 +4620,8 @@ zfcp_fsf_control_file_handler(struct zfcp_fsf_req *fsf_req)
case FSF_UNKNOWN_OP_SUBTYPE: case FSF_UNKNOWN_OP_SUBTYPE:
ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n"); ZFCP_LOG_FLAGS(2, "FSF_UNKNOWN_OP_SUBTYPE\n");
ZFCP_LOG_NORMAL("unknown operation subtype (adapter: %s, " ZFCP_LOG_NORMAL("unknown operation subtype (adapter: %s, "
"op_subtype=0x%x)\n", zfcp_get_busid_by_adapter(adapter), "op_subtype=0x%x)\n",
zfcp_get_busid_by_adapter(adapter),
bottom->operation_subtype); bottom->operation_subtype);
fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR;
retval = -EINVAL; retval = -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment